source: issm/oecreview/Archive/11319-11340/ISSM-11335-11336.diff

Last change on this file was 11515, checked in by Eric.Larour, 13 years ago

Oecreview up to 11509

File size: 3.3 KB
  • proj/ice/larour/issm-uci-clean/trunk-jpl/src/m/solvers/solver_newton.m

     
     1function femmodel=solver_newton(femmodel)
     2%SOLVER_NEWTON - core solver of diagnostic run
     3%
     4%   Usage:
     5%      [femmodel]=solver_newton(femmodel)
     6
     7        %Branch on partitioning schema requested
     8        maxiter=femmodel.parameters.DiagnosticMaxiter;
     9        configuration_type=femmodel.parameters.ConfigurationType;
     10        [femmodel.nodes]=UpdateConstraints(femmodel.nodes,femmodel.constraints,femmodel.parameters);
     11
     12        %initialize solution vector
     13        converged=0; count=1;
     14
     15        %Start non-linear iteration using input velocity:
     16        ug=GetSolutionFromInputs(femmodel.elements, femmodel.nodes, femmodel.vertices, femmodel.loads, femmodel.materials, femmodel.parameters);
     17        uf=Reducevectorgtof( ug, femmodel.nodes,femmodel.parameters);
     18
     19        %Update the solution to make sure that vx and vxold are similar
     20        [femmodel.elements femmodel.loads]=InputUpdateFromConstant(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,double(converged),ConvergedEnum);
     21        [femmodel.elements,femmodel.materials]=InputUpdateFromSolution(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,ug);
     22
     23        while(~converged),
     24
     25                %save pointer to old velocity
     26                old_ug=ug;
     27                old_uf=uf;
     28
     29                %Solver forward model
     30                [K_ff,K_fs,p_f,df,kmax]=SystemMatrices(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters);
     31                ys=CreateNodalConstraints(femmodel.nodes,configuration_type);
     32                p_f=Reduceload( p_f, K_fs, ys);
     33                issmprintf(VerboseSolver(),'%s%g','      condition number of stiffness matrix: ',condest(K_ff));
     34                uf=Solver(K_ff,p_f,old_uf,df,femmodel.parameters);
     35                ug=Mergesolutionfromftog( uf, ys, femmodel.nodes,femmodel.parameters);
     36                [femmodel.elements,femmodel.materials]=InputUpdateFromSolution(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,ug);
     37
     38                %Check convergence
     39                converged=convergence(K_ff,p_f,uf,old_uf,femmodel.parameters);
     40                if(converged==1) break; end
     41                if(count>maxiter),
     42                        issmprintf(true,'%s%i%s','      maximum number of iterations ',maxiter,' exceeded');
     43                        break;
     44                end
     45
     46                %Prepare next iteration using Newton's method
     47                [K_ff,K_fs,p_f,df,kmax]=SystemMatrices(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters);
     48                ys=CreateNodalConstraints(femmodel.nodes,configuration_type);
     49                p_f=Reduceload( p_f, K_fs, ys);
     50                pJf=p_f-K_ff*uf;
     51                Jff=CreateJacobianMatrix(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,kmax);
     52                duf=Solver(Jff,pJf,[],[],femmodel.parameters);
     53                ys=0*ys;
     54                uf=uf+duf;
     55                ug=Mergesolutionfromftog(uf,ys,femmodel.nodes,femmodel.parameters);
     56                [femmodel.elements,femmodel.materials]=InputUpdateFromSolution(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,ug);
     57
     58                %increase count
     59                count=count+1;
     60
     61        end
     62end
Note: See TracBrowser for help on using the repository browser.