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

Last change on this file since 19150 was 19150, checked in by Mathieu Morlighem, 10 years ago

CHG: removed MaxIterationConvergenceFlagEnum from results to avoid having a results for each step even though output_frequency is not 1

File size: 3.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
36 /*Recover parameters: */
37 femmodel->parameters->FindParam(&min_mechanical_constraints,StressbalanceRiftPenaltyThresholdEnum);
38 femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
39 femmodel->parameters->FindParam(&eps_res,StressbalanceRestolEnum);
40 femmodel->parameters->FindParam(&eps_rel,StressbalanceReltolEnum);
41 femmodel->parameters->FindParam(&eps_abs,StressbalanceAbstolEnum);
42 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
43 femmodel->UpdateConstraintsx();
44
45 /*Were loads requested as output? : */
46 if(conserve_loads){
47 savedloads = static_cast<Loads*>(femmodel->loads->Copy());
48 }
49
50 count=1;
51 converged=false;
52
53 /*Start non-linear iteration using input velocity: */
54 GetSolutionFromInputsx(&ug,femmodel);
55 Reducevectorgtofx(&uf, ug, femmodel->nodes,femmodel->parameters);
56
57 //Update once again the solution to make sure that vx and vxold are similar (for next step in transient or steadystate)
58 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
59 InputUpdateFromSolutionx(femmodel,ug);
60
61 for(;;){
62
63 //save pointer to old velocity
64 delete old_uf;old_uf=uf;
65 delete ug;
66
67 SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
68 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
69 Reduceloadx(pf, Kfs, ys); delete Kfs;
70 Solverx(&uf, Kff, pf, old_uf, df, femmodel->parameters);
71 Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
72
73 convergence(&converged,Kff,pf,uf,old_uf,eps_res,eps_rel,eps_abs); delete Kff; delete pf; delete df;
74 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
75 InputUpdateFromSolutionx(femmodel,ug);
76
77 ConstraintsStatex(&constraints_converged,&num_unstable_constraints,femmodel);
78 if(VerboseConvergence()) _printf0_(" number of unstable constraints: " << num_unstable_constraints << "\n");
79
80 //rift convergence
81 if (!constraints_converged) {
82 if (converged){
83 if (num_unstable_constraints <= min_mechanical_constraints) converged=true;
84 else converged=false;
85 }
86 }
87
88 /*Increase count: */
89 count++;
90 if(converged==true){
91 break;
92 }
93 if(count>=max_nonlinear_iterations){
94 _printf0_(" maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
95 converged=true;
96 InputUpdateFromConstantx(femmodel,converged,ConvergedEnum);
97 InputUpdateFromSolutionx(femmodel,ug);
98 break;
99 }
100 }
101
102 if(VerboseConvergence()) _printf0_("\n total number of iterations: " << count-1 << "\n");
103
104 /*clean-up*/
105 if(conserve_loads){
106 delete femmodel->loads;
107 femmodel->loads=savedloads;
108 }
109 delete uf;
110 delete ug;
111 delete old_uf;
112}
Note: See TracBrowser for help on using the repository browser.