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

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

Oecreview up to 11509

File size: 3.3 KB
RevLine 
[11515]1Index: /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
Note: See TracBrowser for help on using the repository browser.