Changeset 25560


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

CHG: almost done with checkpointing AD

File:
1 edited

Legend:

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

    r25554 r25560  
    276276        bool       isoceancoupling,isslr;
    277277        int        step,timestepping;
     278        int        recording_frequency,finalcheckpoint;
    278279        DataSet*   dependent_objects=NULL;
    279280
     
    286287        femmodel->parameters->FindParam(&isslr,TransientIsslrEnum);
    287288        femmodel->parameters->FindParam(&dependent_objects,AutodiffDependentObjectsEnum);
     289        femmodel->parameters->FindParam(&recording_frequency,SettingsRecordingFrequencyEnum); _assert_(recording_frequency>0);
    288290        if(isslr) sealevelrise_core_geometry(femmodel);
    289291
     
    298300
    299301                /*Time Increment*/
    300                 if(timestepping!=FixedTimesteppingEnum) _error_("not supported yet, but easy to handle...");
    301                 femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     302                switch(timestepping){
     303                        case AdaptiveTimesteppingEnum:
     304                                femmodel->TimeAdaptx(&dt);
     305                                if(time+dt>finaltime) dt=finaltime-time;
     306                                femmodel->parameters->SetParam(dt,TimesteppingTimeStepEnum);
     307                                break;
     308                        case FixedTimesteppingEnum:
     309                                femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     310                                break;
     311                        default:
     312                                _error_("Time stepping \""<<EnumToStringx(timestepping)<<"\" not supported yet");
     313                }
    302314                step+=1;
    303315                time+=dt;
     
    307319                time_all.push_back(time);
    308320
     321                if(VerboseSolution()){
     322                        _printf0_("iteration " << step << "/" << ceil((finaltime-time)/dt)+step << \
     323                                                "  time [yr]: " <<std::fixed<<setprecision(2)<< time/yts << " (time step: " << dt/yts << ")\n");
     324                }
     325
    309326                /*Store Model State at the beginning of the step*/
    310                 if(VerboseSolution()) _printf0_("   checkpointing model \n");
    311                 femmodel->CheckPointAD(step);
     327                if(step%recording_frequency==0){
     328                        if(VerboseSolution()) _printf0_("   checkpointing model (step: "<<step<<")\n");
     329                        femmodel->CheckPointAD(step);
     330                        finalcheckpoint = step;
     331                }
    312332
    313333                if(VerboseSolution()) _printf0_("   counting number of active variables\n");
     
    328348        }
    329349
     350        int finalstep = step;
    330351        if(VerboseSolution()) _printf0_("   done with initial complete transient\n");
    331352
     
    366387        }
    367388        else{
    368                 femmodel->IceVolumex(&J,false);
     389                femmodel->IceVolumeAboveFloatationx(&J,false);
    369390        }
    370391        if(IssmComm::GetRank()==0) tape_codi.registerOutput(J);
     
    380401
    381402        /*reverse loop for transient step (G)*/
    382         for(int reverse_step = step;reverse_step>0; reverse_step--){
     403        for(int reverse_step = finalcheckpoint;reverse_step>0; reverse_step-=recording_frequency){
    383404
    384405                /*Restore model from this step*/
     
    403424
    404425                /*Get New state*/
    405                 transient_step(femmodel);
     426                for(int ii=0;ii<recording_frequency;ii++){
     427                        int        thisstep = reverse_step+ii;
     428                        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");
     430                        transient_step(femmodel);
     431                        if(thisstep==finalstep) break;
     432                }
    406433
    407434                /*Register output*/
     
    422449
    423450                /* here we access the gradient data via the stored identifiers.*/
    424                 //for(int i=0; i<Ysize_i; i++) if(tape_codi.gradient(Yin[i])!=0.) printf(" %g (%i)",tape_codi.gradient(Yin[i]),Yin[i]);
    425451                for(int i=0; i<Ysize_i; i++) Yb[i]  = tape_codi.gradient(Yin[i]);
    426452                for(int i=0; i<Xsize;   i++) Xb[i] += X[i].gradient();
Note: See TracChangeset for help on using the changeset viewer.