Changeset 25464
- Timestamp:
- 08/25/20 10:59:33 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/cores/transient_core.cpp
r25340 r25464 17 17 #include "../solutionsequences/solutionsequences.h" 18 18 19 void transient_core(FemModel* femmodel){ 19 /*Prototypes*/ 20 void transient_step(FemModel* femmodel); 21 22 void transient_core(FemModel* femmodel){/*{{{*/ 20 23 21 24 /*parameters: */ 22 25 IssmDouble finaltime,dt,yts,starttime; 23 bool is stressbalance,ismasstransport,issmb,isFS,isthermal,isgroundingline,isgia,isesa,isslr,iscoupler,ismovingfront,isdamageevolution,ishydrology,isoceancoupling,iscontrol,isautodiff;26 bool isoceancoupling,iscontrol,isautodiff,isgroundingline,isslr; 24 27 bool save_results,dakota_analysis; 25 28 int timestepping; … … 27 30 int sb_coupling_frequency; 28 31 int recording_frequency; 29 int domaintype,groundingline_migration,smb_model,amr_frequency,amr_restart;32 int groundingline_migration,smb_model,amr_frequency,amr_restart; 30 33 int numoutputs; 31 Analysis *analysis = NULL;32 34 char **requested_outputs = NULL; 33 35 … … 41 43 42 44 /*then recover parameters common to all solutions*/ 43 femmodel->parameters->FindParam(&domaintype,DomainTypeEnum);44 45 femmodel->parameters->FindParam(&step,StepEnum); 45 46 femmodel->parameters->FindParam(&time,TimeEnum); … … 51 52 femmodel->parameters->FindParam(&sb_coupling_frequency,SettingsSbCouplingFrequencyEnum); 52 53 femmodel->parameters->FindParam(×tepping,TimesteppingTypeEnum); 53 femmodel->parameters->FindParam(&isstressbalance,TransientIsstressbalanceEnum);54 femmodel->parameters->FindParam(&ismasstransport,TransientIsmasstransportEnum);55 femmodel->parameters->FindParam(&issmb,TransientIssmbEnum);56 femmodel->parameters->FindParam(&isthermal,TransientIsthermalEnum);57 femmodel->parameters->FindParam(&isgia,TransientIsgiaEnum);58 femmodel->parameters->FindParam(&isesa,TransientIsesaEnum);59 54 femmodel->parameters->FindParam(&isslr,TransientIsslrEnum); 60 femmodel->parameters->FindParam(&iscoupler,TransientIscouplerEnum);61 55 femmodel->parameters->FindParam(&isgroundingline,TransientIsgroundinglineEnum); 62 femmodel->parameters->FindParam(&ismovingfront,TransientIsmovingfrontEnum);63 56 femmodel->parameters->FindParam(&isoceancoupling,TransientIsoceancouplingEnum); 64 femmodel->parameters->FindParam(&isdamageevolution,TransientIsdamageevolutionEnum);65 femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum);66 57 femmodel->parameters->FindParam(&amr_frequency,TransientAmrFrequencyEnum); 67 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);68 58 femmodel->parameters->FindParam(&iscontrol,InversionIscontrolEnum); 69 59 femmodel->parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); … … 128 118 femmodel->parameters->SetParam(save_results,SaveResultsEnum); 129 119 130 #if defined(_HAVE_OCEAN_ ) 131 if(isoceancoupling) OceanExchangeDatax(femmodel,false); 132 #endif 133 134 if(isthermal && domaintype==Domain3DEnum){ 135 if(issmb){ 136 bool isenthalpy; 137 femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum); 138 femmodel->parameters->FindParam(&smb_model,SmbEnum); 139 if(isenthalpy){ 140 if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){ 141 femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum); 142 ResetBoundaryConditions(femmodel,EnthalpyAnalysisEnum); 143 } 144 } 145 else{ 146 if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){ 147 femmodel->SetCurrentConfiguration(ThermalAnalysisEnum); 148 ResetBoundaryConditions(femmodel,ThermalAnalysisEnum); 149 } 150 } 151 } 152 thermal_core(femmodel); 153 } 154 /* Using Hydrology dc coupled we need to compute smb in the hydrology inner time loop*/ 155 if(issmb) { 156 if(VerboseSolution()) _printf0_(" computing smb\n"); 157 smb_core(femmodel); 158 } 159 160 if(ishydrology){ 161 if(VerboseSolution()) _printf0_(" computing hydrology\n"); 162 int hydrology_model; 163 hydrology_core(femmodel); 164 femmodel->parameters->FindParam(&hydrology_model,HydrologyModelEnum); 165 if(hydrology_model!=HydrologydcEnum && issmb)smb_core(femmodel); 166 } 167 168 if(isstressbalance && (step%sb_coupling_frequency==0 || step==1) ) { 169 if(VerboseSolution()) _printf0_(" computing stress balance\n"); 170 stressbalance_core(femmodel); 171 } 172 173 if(isdamageevolution) { 174 if(VerboseSolution()) _printf0_(" computing damage\n"); 175 damage_core(femmodel); 176 } 177 178 if(ismovingfront) { 179 if(VerboseSolution()) _printf0_(" computing moving front\n"); 180 movingfront_core(femmodel); 181 } 182 183 /* from here on, prepare geometry for next time step*/ 184 //if(issmb) smb_core(femmodel); 185 186 if(ismasstransport){ 187 if(VerboseSolution()) _printf0_(" computing mass transport\n"); 188 bmb_core(femmodel); 189 masstransport_core(femmodel); 190 femmodel->UpdateVertexPositionsx(); 191 } 192 193 if(isgroundingline){ 194 195 /*Start profiler*/ 196 femmodel->profiler->Start(GROUNDINGLINECORE); 197 198 if(VerboseSolution()) _printf0_(" computing new grounding line position\n"); 199 GroundinglineMigrationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 200 201 femmodel->parameters->SetParam(MaskOceanLevelsetEnum,InputToExtrudeEnum); 202 extrudefrombase_core(femmodel); 203 femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum); 204 extrudefrombase_core(femmodel); 205 femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum); 206 extrudefrombase_core(femmodel); 207 208 /*Stop profiler*/ 209 femmodel->profiler->Stop(GROUNDINGLINECORE); 210 211 if(save_results){ 212 int outputs[3] = {SurfaceEnum,BaseEnum,MaskOceanLevelsetEnum}; 213 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3); 214 } 215 } 216 217 if(isgia){ 218 if(VerboseSolution()) _printf0_(" computing glacial isostatic adjustment\n"); 219 #ifdef _HAVE_GIA_ 220 gia_core(femmodel); 221 #else 222 _error_("ISSM was not compiled with gia capabilities. Exiting"); 223 #endif 224 } 225 226 /*esa: */ 227 if(isesa) esa_core(femmodel); 228 229 /*Sea level rise: */ 230 if(isslr) sealevelchange_core(femmodel); 120 /*Run transient step!*/ 121 transient_step(femmodel); 231 122 232 123 /*unload results*/ … … 263 154 } 264 155 265 if (iscontrol && isautodiff){156 if(iscontrol && isautodiff){ 266 157 /*Go through our dependent variables, and compute the response:*/ 267 158 for(int i=0;i<dependent_objects->Size();i++){ … … 278 169 /*Free ressources:*/ 279 170 if(numoutputs){for(int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);} 280 } 171 172 }/*}}}*/ 173 void transient_step(FemModel* femmodel){/*{{{*/ 174 175 /*parameters: */ 176 bool isstressbalance,ismasstransport,issmb,isthermal,isgroundingline,isgia,isesa; 177 bool isslr,ismovingfront,isdamageevolution,ishydrology,isoceancoupling; 178 bool save_results; 179 int step,sb_coupling_frequency; 180 int domaintype,smb_model; 181 182 /*then recover parameters common to all solutions*/ 183 femmodel->parameters->FindParam(&domaintype,DomainTypeEnum); 184 femmodel->parameters->FindParam(&step,StepEnum); 185 femmodel->parameters->FindParam(&sb_coupling_frequency,SettingsSbCouplingFrequencyEnum); 186 femmodel->parameters->FindParam(&isstressbalance,TransientIsstressbalanceEnum); 187 femmodel->parameters->FindParam(&ismasstransport,TransientIsmasstransportEnum); 188 femmodel->parameters->FindParam(&issmb,TransientIssmbEnum); 189 femmodel->parameters->FindParam(&isthermal,TransientIsthermalEnum); 190 femmodel->parameters->FindParam(&isgia,TransientIsgiaEnum); 191 femmodel->parameters->FindParam(&isesa,TransientIsesaEnum); 192 femmodel->parameters->FindParam(&isslr,TransientIsslrEnum); 193 femmodel->parameters->FindParam(&isgroundingline,TransientIsgroundinglineEnum); 194 femmodel->parameters->FindParam(&ismovingfront,TransientIsmovingfrontEnum); 195 femmodel->parameters->FindParam(&isoceancoupling,TransientIsoceancouplingEnum); 196 femmodel->parameters->FindParam(&isdamageevolution,TransientIsdamageevolutionEnum); 197 femmodel->parameters->FindParam(&ishydrology,TransientIshydrologyEnum); 198 199 #if defined(_HAVE_OCEAN_ ) 200 if(isoceancoupling) OceanExchangeDatax(femmodel,false); 201 #endif 202 203 if(isthermal && domaintype==Domain3DEnum){ 204 if(issmb){ 205 bool isenthalpy; 206 femmodel->parameters->FindParam(&isenthalpy,ThermalIsenthalpyEnum); 207 femmodel->parameters->FindParam(&smb_model,SmbEnum); 208 if(isenthalpy){ 209 if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){ 210 femmodel->SetCurrentConfiguration(EnthalpyAnalysisEnum); 211 ResetBoundaryConditions(femmodel,EnthalpyAnalysisEnum); 212 } 213 } 214 else{ 215 if(smb_model==SMBpddEnum || smb_model==SMBd18opddEnum || smb_model==SMBpddSicopolisEnum){ 216 femmodel->SetCurrentConfiguration(ThermalAnalysisEnum); 217 ResetBoundaryConditions(femmodel,ThermalAnalysisEnum); 218 } 219 } 220 } 221 thermal_core(femmodel); 222 } 223 /* Using Hydrology dc coupled we need to compute smb in the hydrology inner time loop*/ 224 if(issmb) { 225 if(VerboseSolution()) _printf0_(" computing smb\n"); 226 smb_core(femmodel); 227 } 228 229 if(ishydrology){ 230 if(VerboseSolution()) _printf0_(" computing hydrology\n"); 231 int hydrology_model; 232 hydrology_core(femmodel); 233 femmodel->parameters->FindParam(&hydrology_model,HydrologyModelEnum); 234 if(hydrology_model!=HydrologydcEnum && issmb)smb_core(femmodel); 235 } 236 237 if(isstressbalance && (step%sb_coupling_frequency==0 || step==1) ) { 238 if(VerboseSolution()) _printf0_(" computing stress balance\n"); 239 stressbalance_core(femmodel); 240 } 241 242 if(isdamageevolution) { 243 if(VerboseSolution()) _printf0_(" computing damage\n"); 244 damage_core(femmodel); 245 } 246 247 if(ismovingfront) { 248 if(VerboseSolution()) _printf0_(" computing moving front\n"); 249 movingfront_core(femmodel); 250 } 251 252 /* from here on, prepare geometry for next time step*/ 253 254 if(ismasstransport){ 255 if(VerboseSolution()) _printf0_(" computing mass transport\n"); 256 bmb_core(femmodel); 257 masstransport_core(femmodel); 258 femmodel->UpdateVertexPositionsx(); 259 } 260 261 if(isgroundingline){ 262 263 /*Start profiler*/ 264 femmodel->profiler->Start(GROUNDINGLINECORE); 265 266 if(VerboseSolution()) _printf0_(" computing new grounding line position\n"); 267 GroundinglineMigrationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters); 268 269 femmodel->parameters->SetParam(MaskOceanLevelsetEnum,InputToExtrudeEnum); 270 extrudefrombase_core(femmodel); 271 femmodel->parameters->SetParam(BaseEnum,InputToExtrudeEnum); 272 extrudefrombase_core(femmodel); 273 femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum); 274 extrudefrombase_core(femmodel); 275 276 /*Stop profiler*/ 277 femmodel->profiler->Stop(GROUNDINGLINECORE); 278 279 if(save_results){ 280 int outputs[3] = {SurfaceEnum,BaseEnum,MaskOceanLevelsetEnum}; 281 femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],3); 282 } 283 } 284 285 if(isgia){ 286 if(VerboseSolution()) _printf0_(" computing glacial isostatic adjustment\n"); 287 #ifdef _HAVE_GIA_ 288 gia_core(femmodel); 289 #else 290 _error_("ISSM was not compiled with gia capabilities. Exiting"); 291 #endif 292 } 293 294 /*esa: */ 295 if(isesa) esa_core(femmodel); 296 297 /*Sea level rise: */ 298 if(isslr) sealevelchange_core(femmodel); 299 300 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.