Changeset 15079
- Timestamp:
- 05/22/13 10:22:19 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/steadystate_core.cpp
r15055 r15079 16 16 17 17 /*Local prototypes*/ 18 bool steadystateconvergence( FemModel* femmodel);18 bool steadystateconvergence(Vector<IssmDouble>* tg,Vector<IssmDouble>* tg_old,Vector<IssmDouble>* ug,Vector<IssmDouble>* ug_old,IssmDouble reltol); 19 19 20 20 void steadystate_core(FemModel* femmodel){ … … 22 22 /*intermediary: */ 23 23 int step; 24 Vector<IssmDouble>* ug = NULL; 25 Vector<IssmDouble>* ug_old = NULL; 26 Vector<IssmDouble>* tg = NULL; 27 Vector<IssmDouble>* tg_old = NULL; 24 28 25 29 /*parameters: */ 26 bool save_results,isenthalpy; 27 int maxiter; 28 int numoutputs = 0; 29 int *requested_outputs = NULL; 30 bool save_results,isenthalpy; 31 int maxiter; 32 IssmDouble reltol; 33 int numoutputs = 0; 34 int *requested_outputs = NULL; 30 35 31 36 /* recover parameters:*/ … … 34 39 femmodel->parameters->FindParam(&numoutputs,SteadystateNumRequestedOutputsEnum); 35 40 femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum); 41 femmodel->parameters->FindParam(&reltol,SteadystateReltolEnum); 36 42 femmodel->parameters->SetParam(false,SaveResultsEnum); 37 43 if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,SteadystateRequestedOutputsEnum); … … 46 52 if(isenthalpy==0){ 47 53 thermal_core(femmodel); 54 femmodel->SetCurrentConfiguration(ThermalAnalysisEnum); 55 GetSolutionFromInputsx(&tg,femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 48 56 } 49 57 else{ 50 58 enthalpy_core(femmodel); 59 GetSolutionFromInputsx(&tg,femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 51 60 } 52 61 #else … … 56 65 if(VerboseSolution()) _pprintLine_(" computing new velocity"); 57 66 diagnostic_core(femmodel); 67 GetSolutionFromInputsx(&ug,femmodel->elements, femmodel->nodes, femmodel->vertices,femmodel->loads, femmodel->materials, femmodel->parameters); 58 68 59 if 60 if(VerboseSolution()) _pprintLine_(" checking velocity, temperature and pressure convergence");61 if(steadystateconvergence( femmodel)) break;69 if(step>1){ 70 if(VerboseSolution()) _pprintLine_(" checking steadystate convergence"); 71 if(steadystateconvergence(tg,tg_old,ug,ug_old,reltol)) break; 62 72 } 63 73 if(step>maxiter){ … … 66 76 } 67 77 68 if(VerboseSolution()) _pprintLine_(" saving velocity, temperature and pressure to check for convergence at next step"); 69 InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,VxEnum,VxPicardEnum); 70 InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,VyEnum,VyPicardEnum); 71 InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,VzEnum,VzPicardEnum); 72 InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,PressureEnum,PressurePicardEnum); 73 InputDuplicatex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,TemperatureEnum,TemperatureOldEnum); 74 75 //increase counter 78 /*update results and increase counter*/ 79 delete tg_old;tg_old=tg; 80 delete ug_old;ug_old=ug; 76 81 step++; 77 82 } … … 92 97 93 98 /*Free ressources:*/ 99 delete tg; 100 delete ug; 94 101 xDelete<int>(requested_outputs); 95 102 } 96 bool steadystateconvergence( FemModel* femmodel){103 bool steadystateconvergence(Vector<IssmDouble>* tg,Vector<IssmDouble>* tg_old,Vector<IssmDouble>* ug,Vector<IssmDouble>* ug_old,IssmDouble reltol){ 97 104 98 /*output: */ 99 bool converged=false; 100 bool velocity_converged=false; 101 bool temperature_converged=false; 105 /*Output*/ 106 bool converged = true; 102 107 103 /* intermediary:*/104 int velocityenums[8]={VxEnum,VxPicardEnum,VyEnum,VyPicardEnum,VzEnum,VzPicardEnum,PressureEnum,PressurePicardEnum}; //pairs of enums (new and old) on which to carry out the converence tests105 int temperatureenums[2]={TemperatureEnum,TemperatureOldEnum};106 int convergencecriterion[1]={RelativeEnum}; //criterions for convergence, RelativeEnum or AbsoluteEnum107 IssmDouble convergencecriterionvalue[1]; //value of criterion to be respected108 /*Intermediary*/ 109 Vector<IssmDouble>* dug = NULL; 110 Vector<IssmDouble>* dtg = NULL; 111 IssmDouble ndt,nt; 112 IssmDouble ndu,nu; 108 113 109 /*retrieve parameters: */ 110 femmodel->parameters->FindParam(&convergencecriterionvalue[0],SteadystateReltolEnum); 114 /*compute norm(du)/norm(u)*/ 115 dug=ug_old->Duplicate(); ug_old->Copy(dug); dug->AYPX(ug,-1.0); 116 ndu=dug->Norm(NORM_TWO); nu=ug_old->Norm(NORM_TWO); 117 if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!"); 118 if((ndu/nu)<reltol){ 119 if(VerboseConvergence()) _pprintLine_("\n"<<setw(50)<<left<<" Velocity convergence: norm(du)/norm(u)"<<ndu/nu*100<<" < "<<reltol*100<<" %"); 120 } 121 else{ 122 if(VerboseConvergence()) _pprintLine_("\n"<<setw(50)<<left<<" Velocity convergence: norm(du)/norm(u)"<<ndu/nu*100<<" > "<<reltol*100<<" %"); 123 converged=false; 124 } 111 125 112 /*figure out convergence at the input level, because we don't have the solution vectors!: */ 113 velocity_converged=InputConvergencex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,&velocityenums[0],8,&convergencecriterion[0],&convergencecriterionvalue[0],1); 114 temperature_converged=InputConvergencex(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,&temperatureenums[0],2,&convergencecriterion[0],&convergencecriterionvalue[0],1); 126 /*compute norm(dt)/norm(t)*/ 127 dtg=tg_old->Duplicate(); tg_old->Copy(dtg); dtg->AYPX(tg,-1.0); 128 ndt=dtg->Norm(NORM_TWO); nt=tg_old->Norm(NORM_TWO); 129 if (xIsNan<IssmDouble>(ndt) || xIsNan<IssmDouble>(nt)) _error_("convergence criterion is NaN!"); 130 if((ndt/nt)<reltol){ 131 if(VerboseConvergence()) _pprintLine_(setw(50)<<left<<" Temperature convergence: norm(dt)/norm(t)"<<ndt/nt*100<<" < "<<reltol*100<<" %"); 132 } 133 else{ 134 if(VerboseConvergence()) _pprintLine_(setw(50)<<left<<" Temperature convergence: norm(dt)/norm(t)"<<ndt/nt*100<<" > "<<reltol*100<<" %"); 135 converged=false; 136 } 115 137 116 if(velocity_converged && temperature_converged) converged=true;117 118 /*return: */138 /*clean up and return*/ 139 delete dtg; 140 delete dug; 119 141 return converged; 120 142 }
Note:
See TracChangeset
for help on using the changeset viewer.