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

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

CHG: moved convergence stuff to solutionsequences (solutionsequences should not include analyses.h)

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