0001 function [u,res,iter,Gu,Glam]=nlooppde(p,u1,lam1)
0002
0003
0004 almin=0.01;
0005 u=u1; lam=lam1; alpha=1; iter=0;
0006 r=resi(p,u,lam);res0=norm(r,p.normsw);
0007 Gu=getGu(p,u,lam,r);
0008 if(res0<p.tol);
0009 Glam=getGlam(p,u,lam,r); res=res0; return;
0010 end;
0011
0012
0013 stepok=1;
0014 while(abs(res0)>p.tol && iter<p.imax && stepok)
0015 upd=p.lss(Gu,r,p,lam); stepok=0;
0016 while(stepok==0 && alpha>almin)
0017 u1=u-alpha*upd;
0018 r=resi(p,u1,lam); res=norm(r,p.normsw);
0019 if(res<res0);
0020 if(res<res0/4 && alpha<1)
0021 alpha=2*alpha;
0022 end
0023 stepok=1; u=u1; res0=res;
0024 if(p.nsw==0)
0025 Gu=getGu(p,u,lam,r);
0026 end
0027 else alpha=alpha/2;
0028 end
0029 end
0030 iter=iter+1; alpha=1;
0031 end
0032
0033
0034 if(p.nsw==0); Glam=getGlam(p,u,lam,r);
0035 else [Gu,Glam]=getder(p,u,lam,r); end
0036 if(p.vsw>1); if(alpha<1);
0037 fprintf('nlooppde: damp alpha=%g, res=%g\n', alpha,res0); end; end;
0038 res=res0;