Changeset 25476


Ignore:
Timestamp:
08/25/20 21:01:51 (5 years ago)
Author:
Mathieu Morlighem
Message:

NEW: working on check pointing, not working just yet...

Location:
issm/trunk-jpl/src/c
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/FemModel.cpp

    r25469 r25476  
    277277}
    278278/*}}}*/
     279void 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}/*}}}*/
    279300void FemModel::CleanUp(void){/*{{{*/
    280301
     
    600621        xDelete<char>(restartfilename);
    601622        xDelete<char>(femmodel_buffer);
     623}/*}}}*/
     624void 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);
    602643}/*}}}*/
    603644void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){/*{{{*/
  • issm/trunk-jpl/src/c/classes/FemModel.h

    r25454 r25476  
    7474                int  AnalysisIndex(int);
    7575                void CheckPoint(void);
     76                void CheckPointAD(int step);
    7677                void CleanUp(void);
    7778                FemModel* copy();
     
    8283                void Marshall(char** pmarshalled_data, int* pmarshalled_data_size, int marshall_direction);
    8384                void Restart(void);
     85                void RestartAD(int step);
    8486                void SetCurrentConfiguration(int configuration_type);
    8587                void SetCurrentConfiguration(int configuration_type,int analysis_type);
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r25473 r25476  
    272272
    273273        /*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;
    288279
    289280        /*then recover parameters common to all solutions*/
     
    292283        femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
    293284        femmodel->parameters->FindParam(&yts,ConstantsYtsEnum);
    294         femmodel->parameters->FindParam(&output_frequency,SettingsOutputFrequencyEnum);
    295285        femmodel->parameters->FindParam(&timestepping,TimesteppingTypeEnum);
    296286        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);
    306288        if(isslr) sealevelrise_core_geometry(femmodel);
    307289
     
    309291
    310292                /*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);
    323295                step+=1;
    324296                time+=dt;
     
    327299                femmodel->parameters->SetParam(false,SaveResultsEnum);
    328300
     301                /*Store Model State at the beginning of the step*/
     302                if(VerboseSolution()) _printf0_("   checkpointing model \n");
     303                femmodel->CheckPointAD(step);
     304
    329305                /*Run transient step!*/
    330306                transient_step(femmodel);
    331 
    332                 if(recording_frequency && (step%recording_frequency==0)){
    333                         if(VerboseSolution()) _printf0_("   checkpointing model \n");
    334                         femmodel->CheckPoint();
    335                 }
    336307
    337308                /*Go through our dependent variables, and compute the response:*/
    338309                for(int i=0;i<dependent_objects->Size();i++){
    339310                        DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
    340                         IssmDouble  output_value;
    341311                        dep->Responsex(&output_value,femmodel);
    342312                        dep->AddValue(output_value);
     
    344314        }
    345315
    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);
    348403}/*}}}*/
    349404#endif
Note: See TracChangeset for help on using the changeset viewer.