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

Last change on this file since 24681 was 24681, checked in by Mathieu Morlighem, 5 years ago

BUG: fixing memory leak

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 IssmDouble eps_res,eps_rel,eps_abs;
34
35 /*Recover parameters: */
36 femmodel->parameters->FindParam(&min_mechanical_constraints,StressbalanceRiftPenaltyThresholdEnum);
37 femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
38 femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
39 femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
40 femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
41 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
42 femmodel->UpdateConstraintsx();
43
44 /*Were loads requested as output? : */
45 if(conserve_loads){
46 savedloads = static_cast<Loads*>(femmodel->loads->Copy());
47 }
48
49 count=0;
50 converged=false;
51
52 /*Start non-linear iteration using input velocity: */
53 GetSolutionFromInputsx(&ug,femmodel);
54 Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
55
56 /*Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)*/
57 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
58 InputUpdateFromSolutionx(femmodel,ug);
59
60 /*allocate the matrices once and reuse them per iteration*/
61 if(femmodel->loads->numrifts == 0){
62 AllocateSystemMatricesx(&Kff,&Kfs,&df,&pf,femmodel);
63 }
64
65 for(;;){
66
67 //save pointer to old velocity
68 delete old_uf;old_uf=uf;
69 delete ug;
70
71 if(femmodel->loads->numrifts){
72 AllocateSystemMatricesx(&Kff,&Kfs,&df,&pf,femmodel);
73 }
74 SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel, true);
75 CreateNodalConstraintsx(&ys,femmodel->nodes);
76 Reduceloadx(pf, Kfs, ys);
77 femmodel->profiler->Start(SOLVER);
78 Solverx(&uf, Kff, pf, old_uf, df, femmodel->parameters);
79 femmodel->profiler->Stop(SOLVER);
80
81 Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
82
83 convergence(&converged,Kff,pf,uf,old_uf,eps_res,eps_rel,eps_abs);
84 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
85 InputUpdateFromSolutionx(femmodel,ug);
86
87 /*Clean up if rifts*/
88 if(femmodel->loads->numrifts){
89 delete Kfs; delete Kff; delete pf; delete df;
90 }
91
92 ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
93 if(VerboseConvergence()) _printf0_(" number of unstable constraints: " << num_unstable_constraints << "\n");
94
95 //rift convergence
96 if (!constraints_converged) {
97 if (converged){
98 if (num_unstable_constraints <= min_mechanical_constraints) converged=true;
99 else converged=false;
100 }
101 }
102
103 /*Increase count: */
104 count++;
105 if(converged==true){
106 femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,StressbalanceConvergenceNumStepsEnum,count));
107 break;
108 }
109 if(count>=max_nonlinear_iterations){
110 _printf0_(" maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
111 converged=true;
112 femmodel->results->AddResult(new GenericExternalResult<IssmDouble>(femmodel->results->Size()+1,StressbalanceConvergenceNumStepsEnum,max_nonlinear_iterations));
113 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
114 InputUpdateFromSolutionx(femmodel,ug);
115 break;
116 }
117
118 /*Set the matrix entries to zero if we do an other iteration*/
119 if(femmodel->loads->numrifts==0){
120 Kff->SetZero();
121 Kfs->SetZero();
122 df->Set(0);
123 pf->Set(0);
124 }
125 }
126
127 /*delete matrices after the iteration loop*/
128 if(femmodel->loads->numrifts==0){
129 delete Kff; delete pf; delete df; delete Kfs;
130 }
131
132 if(VerboseConvergence()) _printf0_("\n total number of iterations: " << count << "\n");
133
134 /*clean-up*/
135 if(conserve_loads){
136 delete femmodel->loads;
137 int index=femmodel->AnalysisIndex(configuration_type);
138 femmodel->loads_list[index]=savedloads;
139 femmodel->loads=savedloads;
140 }
141 delete uf;
142 delete ug;
143 delete old_uf;
144}
Note: See TracBrowser for help on using the repository browser.