Changeset 25476
- Timestamp:
- 08/25/20 21:01:51 (5 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/FemModel.cpp
r25469 r25476 277 277 } 278 278 /*}}}*/ 279 void FemModel::CheckPointAD(int step){/*{{{*/ 280 281 /*Get rank*/ 282 int my_rank = IssmComm::GetRank(); 283 284 /*Get string sizes*/ 285 int rank_length = (my_rank == 0 ? 1 : int(log10(static_cast<double>(my_rank))+1)); 286 int step_length = (step == 0 ? 1 : int(log10(static_cast<double>(step)) +1)); 287 288 /*Create restart file*/ 289 char* restartfilename = xNew<char>(strlen("AD_step_")+step_length+strlen("_rank_")+rank_length+strlen(".ckpt")+1); 290 sprintf(restartfilename,"%s%i%s%i%s","AD_step_",step,"_rank_",my_rank,".ckpt"); 291 this->parameters->AddObject(new StringParam(RestartFileNameEnum,restartfilename)); 292 293 /*Write files*/ 294 this->CheckPoint(); 295 296 /*Clean up and return*/ 297 xDelete<char>(restartfilename); 298 299 }/*}}}*/ 279 300 void FemModel::CleanUp(void){/*{{{*/ 280 301 … … 600 621 xDelete<char>(restartfilename); 601 622 xDelete<char>(femmodel_buffer); 623 }/*}}}*/ 624 void FemModel::RestartAD(int step){ /*{{{*/ 625 626 /*Get rank*/ 627 int my_rank = IssmComm::GetRank(); 628 629 /*Get string sizes*/ 630 int rank_length = (my_rank == 0 ? 1 : int(log10(static_cast<double>(my_rank))+1)); 631 int step_length = (step == 0 ? 1 : int(log10(static_cast<double>(step)) +1)); 632 633 /*Create restart file*/ 634 char* restartfilename = xNew<char>(strlen("AD_step_")+step_length+strlen("_rank_")+rank_length+strlen(".ckpt")+1); 635 sprintf(restartfilename,"%s%i%s%i%s","AD_step_",step,"_rank_",my_rank,".ckpt"); 636 this->parameters->AddObject(new StringParam(RestartFileNameEnum,restartfilename)); 637 638 /*Read files*/ 639 this->Restart(); 640 641 /*Clean up and return*/ 642 xDelete<char>(restartfilename); 602 643 }/*}}}*/ 603 644 void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){/*{{{*/ -
issm/trunk-jpl/src/c/classes/FemModel.h
r25454 r25476 74 74 int AnalysisIndex(int); 75 75 void CheckPoint(void); 76 void CheckPointAD(int step); 76 77 void CleanUp(void); 77 78 FemModel* copy(); … … 82 83 void Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction); 83 84 void Restart(void); 85 void RestartAD(int step); 84 86 void SetCurrentConfiguration(int configuration_type); 85 87 void SetCurrentConfiguration(int configuration_type,int analysis_type); -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r25473 r25476 272 272 273 273 /*parameters: */ 274 IssmDouble finaltime,dt,yts; 275 bool isoceancoupling,iscontrol,isautodiff,isslr; 276 int timestepping; 277 int output_frequency; 278 int recording_frequency; 279 int amr_frequency,amr_restart; 280 281 /*intermediary: */ 282 int step; 283 IssmDouble time; 284 285 /*first, figure out if there was a check point, if so, do a reset of the FemModel* femmodel structure. */ 286 femmodel->parameters->FindParam(&recording_frequency,SettingsRecordingFrequencyEnum); 287 if(recording_frequency) femmodel->Restart(); 274 IssmDouble output_value; 275 IssmDouble finaltime,dt,yts,time; 276 bool isoceancoupling,isslr; 277 int step,timestepping; 278 DataSet* dependent_objects=NULL; 288 279 289 280 /*then recover parameters common to all solutions*/ … … 292 283 femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum); 293 284 femmodel->parameters->FindParam(&yts,ConstantsYtsEnum); 294 femmodel->parameters->FindParam(&output_frequency,SettingsOutputFrequencyEnum);295 285 femmodel->parameters->FindParam(×tepping,TimesteppingTypeEnum); 296 286 femmodel->parameters->FindParam(&isslr,TransientIsslrEnum); 297 femmodel->parameters->FindParam(&amr_frequency,TransientAmrFrequencyEnum); 298 femmodel->parameters->FindParam(&iscontrol,InversionIscontrolEnum); 299 femmodel->parameters->FindParam(&isautodiff,AutodiffIsautodiffEnum); 300 301 DataSet* dependent_objects=NULL; 302 if(iscontrol){ 303 femmodel->parameters->FindParam(&dependent_objects,AutodiffDependentObjectsEnum); 304 } 305 287 femmodel->parameters->FindParam(&dependent_objects,AutodiffDependentObjectsEnum); 306 288 if(isslr) sealevelrise_core_geometry(femmodel); 307 289 … … 309 291 310 292 /*Time Increment*/ 311 switch(timestepping){ 312 case AdaptiveTimesteppingEnum: 313 femmodel->TimeAdaptx(&dt); 314 if(time+dt>finaltime) dt=finaltime-time; 315 femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum); 316 break; 317 case FixedTimesteppingEnum: 318 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 319 break; 320 default: 321 _error_("Time stepping \""<<EnumToStringx(timestepping)<<"\" not supported yet"); 322 } 293 if(timestepping!=FixedTimesteppingEnum) _error_("not supported yet, but easy to handle..."); 294 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum); 323 295 step+=1; 324 296 time+=dt; … … 327 299 femmodel->parameters->SetParam(false,SaveResultsEnum); 328 300 301 /*Store Model State at the beginning of the step*/ 302 if(VerboseSolution()) _printf0_(" checkpointing model \n"); 303 femmodel->CheckPointAD(step); 304 329 305 /*Run transient step!*/ 330 306 transient_step(femmodel); 331 332 if(recording_frequency && (step%recording_frequency==0)){333 if(VerboseSolution()) _printf0_(" checkpointing model \n");334 femmodel->CheckPoint();335 }336 307 337 308 /*Go through our dependent variables, and compute the response:*/ 338 309 for(int i=0;i<dependent_objects->Size();i++){ 339 310 DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i); 340 IssmDouble output_value;341 311 dep->Responsex(&output_value,femmodel); 342 312 dep->AddValue(output_value); … … 344 314 } 345 315 346 if(!iscontrol) femmodel->RequestedDependentsx(); 347 if(iscontrol) femmodel->parameters->SetParam(dependent_objects,AutodiffDependentObjectsEnum); 316 /*__________________________________________________________________________________*/ 317 318 /*Get X (control) and Y (model state)*/ 319 IssmDouble *X = NULL; int Xsize; 320 GetVectorFromControlInputsx(&X,&Xsize,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value"); 321 IssmDouble *Y = NULL; int Ysize; 322 _error_("don't know how to get Y and Ysize here..."); 323 324 /*Initialize Xb, Yb and Yin*/ 325 double *Xb = xNewZeroInit<double>(Xsize); 326 double *Yb = xNewZeroInit<double>(Ysize); 327 double *Yin = xNewZeroInit<double>(Ysize); 328 329 /*Start tracing*/ 330 auto& tape_codi = IssmDouble::getGlobalTape(); 331 tape_codi.setActive(); 332 333 /*Reverse dependent (f)*/ 334 for(int i=0; i < Ysize; i++) tape_codi.registerInput(Y[i]); 335 for(int i=0; i < Xsize; i++) tape_codi.registerInput(X[i]); 336 SetControlInputsFromVectorx(femmodel,X); 337 338 IssmDouble J = 0.; 339 for(int i=0;i<dependent_objects->Size();i++){ 340 DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i); 341 J += dep->GetValue(); 342 } 343 344 if(IssmComm::GetRank()==0) { 345 tape_codi.registerOutput(J); 346 } 347 tape_codi.setPassive(); 348 349 J.gradient() = 1.0; 350 tape_codi.evaluate(); 351 352 for(int i=0;i<Xsize;i++) Xb[i] += X[i].gradient(); 353 for(int i=0;i<Ysize;i++) Yb[i] = Y[i].gradient(); 354 355 /*reverse loop for transient step (G)*/ 356 for(int reverse_step = step;reverse_step>=0; reverse_step--){ 357 358 /*Restore model from this step*/ 359 tape_codi.reset(); 360 femmodel->RestartAD(reverse_step); 361 tape_codi.setActive(); 362 363 /*We need to store the CoDiPack identifier here, since y is overwritten.*/ 364 for(int i=0; i<Ysize; i++) { 365 tape_codi.registerInput(Y[i]); 366 Yin[i] = Y[i].getGradientData(); 367 } 368 369 /*Tell codipack that X is the independent*/ 370 for(int i=0; i<Xsize; i++) tape_codi.registerInput(X[i]); 371 SetControlInputsFromVectorx(femmodel,X); 372 373 /*Get New state*/ 374 transient_step(femmodel); 375 _error_("don't know how to get new Y again here..."); 376 for(int i=0; i<Ysize; i++) tape_codi.registerOutput(Y[i]); 377 378 /*stop tracing*/ 379 tape_codi.setPassive(); 380 381 /*Reverse transient step (G)*/ 382 /* Using y_b here to seed the next reverse iteration there y_b is always overwritten*/ 383 for(int i=0; i<Ysize; i++) Y[i].gradient() = Yb[i]; 384 tape_codi.evaluate(); 385 /* here we access the gradient data via the stored identifiers.*/ 386 for(int i=0; i<Ysize; i++) Xb[i] = tape_codi.gradient(Yin[i]); 387 for(int i=0; i<Xsize; i++) Yb[i] += X[i].gradient(); 388 } 389 390 /*Now set final gradient*/ 391 IssmDouble* aG=xNew<IssmDouble>(Xsize); 392 for(int i=0;i<Xsize;i++){ 393 aG[i] = reCast<IssmDouble>(Xb[i]); 394 } 395 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG); 396 xDelete<IssmDouble>(aG); 397 398 xDelete<IssmDouble>(X); 399 xDelete<double>(Xb); 400 xDelete<IssmDouble>(Y); 401 xDelete<double>(Yb); 402 xDelete<double>(Yin); 348 403 }/*}}}*/ 349 404 #endif
Note:
See TracChangeset
for help on using the changeset viewer.