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