Changeset 25564


Ignore:
Timestamp:
09/11/20 11:51:39 (5 years ago)
Author:
Mathieu Morlighem
Message:

CHG: fixing (finally) checkpointing with several steps between checkpoints

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r25560 r25564  
    276276        bool       isoceancoupling,isslr;
    277277        int        step,timestepping;
    278         int        recording_frequency,finalcheckpoint;
     278        int        recording_frequency;
    279279        DataSet*   dependent_objects=NULL;
    280280
     
    291291
    292292        std::vector<IssmDouble> time_all;
     293        std::vector<IssmDouble> dt_all;
     294        std::vector<int>        checkpoint_steps;
    293295        int                     Ysize = 0;
    294296        CountDoublesFunctor   *hdl_countdoubles = NULL;
     
    318320                femmodel->parameters->SetParam(false,SaveResultsEnum);
    319321                time_all.push_back(time);
     322                dt_all.push_back(dt);
    320323
    321324                if(VerboseSolution()){
     
    325328
    326329                /*Store Model State at the beginning of the step*/
    327                 if(step%recording_frequency==0){
     330                if(step%recording_frequency==0 || step==1){
    328331                        if(VerboseSolution()) _printf0_("   checkpointing model (step: "<<step<<")\n");
    329332                        femmodel->CheckPointAD(step);
    330                         finalcheckpoint = step;
     333                        checkpoint_steps.push_back(step);
    331334                }
    332335
     
    401404
    402405        /*reverse loop for transient step (G)*/
    403         for(int reverse_step = finalcheckpoint;reverse_step>0; reverse_step-=recording_frequency){
     406        for(vector<int>::reverse_iterator iter = checkpoint_steps.rbegin(); iter != checkpoint_steps.rend(); iter++){
    404407
    405408                /*Restore model from this step*/
     409                int reverse_step = *iter;
    406410                tape_codi.reset();
    407411                femmodel->RestartAD(reverse_step);
     
    427431                        int        thisstep = reverse_step+ii;
    428432                        IssmDouble thistime = time_all[reverse_step+ii-1];
    429                         _printf0_("step "<<thisstep<<" ("<<ii+1<<"/"<<recording_frequency<<") time [yr]: "<<std::fixed<<std::setprecision(2)<<thistime/yts<<"\n");
     433                        IssmDouble thisdt   = dt_all[reverse_step+ii-1];
     434                        femmodel->parameters->SetParam(thistime,TimeEnum);
     435                        femmodel->parameters->SetParam(thisstep,StepEnum);
     436                        femmodel->parameters->SetParam(thisdt,TimesteppingTimeStepEnum);
     437                        _printf0_("step "<<thisstep<<" ("<<ii+1<<"/"<<recording_frequency<<") time [yr]: "\
     438                                                <<std::fixed<<std::setprecision(2)<<thistime/yts<< " (time step: " << thisdt/yts << ")\n");
    430439                        transient_step(femmodel);
     440
     441                        /*First and last segment need special treatment*/
    431442                        if(thisstep==finalstep) break;
     443                        if(reverse_step==1 && ii==recording_frequency-2) break;
    432444                }
    433445
Note: See TracChangeset for help on using the changeset viewer.