source: issm/trunk-jpl/src/c/solutionsequences/solutionsequence_nonlinear.cpp@ 15104

Last change on this file since 15104 was 15104, checked in by Mathieu Morlighem, 12 years ago

CHG: simplifying prints

File size: 4.5 KB
Line 
1/*!\file: solutionsequence_nonlinear.cpp
2 * \brief: core of a non-linear solution, using fixed-point method
3 */
4
5#include "./solutionsequences.h"
6#include "../toolkits/toolkits.h"
7#include "../classes/classes.h"
8#include "../shared/shared.h"
9#include "../modules/modules.h"
10
11void solutionsequence_nonlinear(FemModel* femmodel,bool conserve_loads){
12
13 /*intermediary: */
14 Matrix<IssmDouble>* Kff = NULL;
15 Matrix<IssmDouble>* Kfs = NULL;
16 Vector<IssmDouble>* ug = NULL;
17 Vector<IssmDouble>* uf = NULL;
18 Vector<IssmDouble>* old_uf = NULL;
19 Vector<IssmDouble>* pf = NULL;
20 Vector<IssmDouble>* df = NULL;
21 Vector<IssmDouble>* ys = NULL;
22
23 Loads* savedloads=NULL;
24 bool converged;
25 int constraints_converged;
26 int num_unstable_constraints;
27 int count;
28
29 /*parameters:*/
30 int min_mechanical_constraints;
31 int max_nonlinear_iterations;
32 int configuration_type;
33
34 /*Recover parameters: */
35 femmodel->parameters->FindParam(&min_mechanical_constraints,DiagnosticRiftPenaltyThresholdEnum);
36 femmodel->parameters->FindParam(&max_nonlinear_iterations,DiagnosticMaxiterEnum);
37 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
38 femmodel->UpdateConstraintsx();
39
40 /*Were loads requested as output? : */
41 if(conserve_loads){
42 savedloads = static_cast<Loads*>(femmodel->loads->Copy());
43 }
44
45 count=1;
46 converged=false;
47
48 /*Start non-linear iteration using input velocity: */
49 GetSolutionFromInputsx(&ug, femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters);
50 Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
51
52 //Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
53 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,converged,ConvergedEnum);
54 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
55
56 for(;;){
57
58 //save pointer to old velocity
59 delete old_uf;old_uf=uf;
60
61 femmodel->SystemMatricesx(&Kff, &Kfs, &pf, &df, NULL);
62 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
63 Reduceloadx(pf, Kfs, ys); delete Kfs;
64 Solverx(&uf, Kff, pf, old_uf, df, femmodel->parameters);
65 Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
66
67 convergence(&converged,Kff,pf,uf,old_uf,femmodel->parameters); delete Kff; delete pf; delete df;
68 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,converged,ConvergedEnum);
69 InputUpdateFromSolutionx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
70
71 ConstraintsStatex(&constraints_converged, &num_unstable_constraints, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
72 if(VerboseConvergence()) _printf0_(" number of unstable constraints: " << num_unstable_constraints << "\n");
73
74 //rift convergence
75 if (!constraints_converged) {
76 if (converged){
77 if (num_unstable_constraints <= min_mechanical_constraints) converged=true;
78 else converged=false;
79 }
80 }
81
82 /*Increase count: */
83 count++;
84 if(converged==true){
85 bool max_iteration_state=false;
86 int tempStep=1;
87 IssmDouble tempTime=1.0;
88 femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
89 break;
90 }
91 if(count>=max_nonlinear_iterations){
92 _printf0_(" maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
93 converged=true;
94 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,converged,ConvergedEnum);
95 InputUpdateFromSolutionx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,ug);
96 bool max_iteration_state=true;
97 int tempStep=1;
98 IssmDouble tempTime=1.0;
99 femmodel->results->AddObject(new GenericExternalResult<bool>(femmodel->results->Size()+1, MaxIterationConvergenceFlagEnum, max_iteration_state, tempStep, tempTime));
100 break;
101 }
102 }
103
104 if(VerboseConvergence()) _printf0_("\n total number of iterations: " << count-1 << "\n");
105
106 /*clean-up*/
107 if(conserve_loads){
108 delete femmodel->loads;
109 femmodel->loads=savedloads;
110 }
111 delete uf;
112 delete ug;
113 delete old_uf;
114}
Note: See TracBrowser for help on using the repository browser.