source: issm/trunk-jpl/src/c/solvers/solver_thermal_nonlinear.cpp@ 14891

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

CHG: replacing xdelete with delete. Gradual change. Nightlys seem to accomodate this change

File size: 3.1 KB
Line 
1/*!\file: solver_thermal_nonlinear.cpp
2 * \brief: core of the thermal solution
3 */
4
5#include "./solvers.h"
6#include "../toolkits/toolkits.h"
7#include "../classes/objects/objects.h"
8#include "../io/io.h"
9#include "../EnumDefinitions/EnumDefinitions.h"
10#include "../modules/modules.h"
11
12void solver_thermal_nonlinear(FemModel* femmodel){
13
14 /*solution : */
15 Vector<IssmDouble>* tg=NULL;
16 Vector<IssmDouble>* tf=NULL;
17 Vector<IssmDouble>* tf_old=NULL;
18 Vector<IssmDouble>* ys=NULL;
19 IssmDouble melting_offset;
20
21 /*intermediary: */
22 Matrix<IssmDouble>* Kff=NULL;
23 Matrix<IssmDouble>* Kfs=NULL;
24 Vector<IssmDouble>* pf=NULL;
25 Vector<IssmDouble>* df=NULL;
26
27 bool converged;
28 int constraints_converged;
29 int num_unstable_constraints;
30 int count;
31 int thermal_penalty_threshold;
32 int thermal_maxiter;
33
34 /*parameters:*/
35 int configuration_type;
36
37 /*Recover parameters: */
38 femmodel->parameters->FindParam(&thermal_penalty_threshold,ThermalPenaltyThresholdEnum);
39 femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
40 femmodel->parameters->FindParam(&thermal_maxiter,ThermalMaxiterEnum);
41
42 count=1;
43 converged=false;
44
45 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,true,ResetPenaltiesEnum);
46 InputUpdateFromConstantx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,false,ConvergedEnum);
47 femmodel->UpdateConstraintsx();
48
49 for(;;){
50
51 femmodel->SystemMatricesx(&Kff, &Kfs, &pf,&df, &melting_offset);
52 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
53 Reduceloadx(pf, Kfs, ys); delete Kfs; delete tf;
54 Solverx(&tf, Kff, pf,tf_old, df, femmodel->parameters);
55 delete tf_old; tf_old=tf->Duplicate();
56 delete Kff;delete pf;delete tg; delete df;
57 Mergesolutionfromftogx(&tg, tf,ys,femmodel->nodes,femmodel->parameters); delete ys;
58 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,tg);
59
60 ConstraintsStatex(&constraints_converged, &num_unstable_constraints, femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
61
62 if (!converged){
63 if(VerboseConvergence()) _pprintLine_(" #unstable constraints = " << num_unstable_constraints);
64 if (num_unstable_constraints <= thermal_penalty_threshold)converged=true;
65 if (count>=thermal_maxiter){
66 converged=true;
67 _pprintLine_(" maximum number of iterations (" << thermal_maxiter << ") exceeded");
68 }
69 }
70 count++;
71
72 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,converged,ConvergedEnum);
73
74 if(converged)break;
75 }
76
77 InputUpdateFromSolutionx(femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,tg);
78 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,melting_offset,MeltingOffsetEnum);
79
80 /*Free ressources: */
81 delete tg;
82 delete tf;
83 delete tf_old;
84}
Note: See TracBrowser for help on using the repository browser.