Changeset 25550


Ignore:
Timestamp:
09/09/20 20:01:09 (5 years ago)
Author:
Mathieu Morlighem
Message:

CHG: fixing AD checkpointing

File:
1 edited

Legend:

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

    r25536 r25550  
    44
    55#ifdef HAVE_CONFIG_H
    6         #include <config.h>
     6#include <config.h>
    77#else
    88#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
     
    289289
    290290        std::vector<IssmDouble> time_all;
    291    int                     Ysize = 0;
     291        int                     Ysize = 0;
    292292        CountDoublesFunctor   *hdl_countdoubles = NULL;
    293293        RegisterInputFunctor  *hdl_regin        = NULL;
     
    314314                hdl_countdoubles = new CountDoublesFunctor();
    315315                femmodel->Marshall(hdl_countdoubles);
    316       if(hdl_countdoubles->DoubleCount()>Ysize) Ysize= hdl_countdoubles->DoubleCount();
     316                if(hdl_countdoubles->DoubleCount()>Ysize) Ysize= hdl_countdoubles->DoubleCount();
    317317                delete hdl_countdoubles;
    318318
     
    336336        GetVectorFromControlInputsx(&X,&Xsize,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
    337337
    338    /*Initialize model state adjoint (Yb)*/
    339    double *Yb  = xNewZeroInit<double>(Ysize);
    340    int    *Yin = xNewZeroInit<int>(Ysize);
    341 
     338        /*Initialize model state adjoint (Yb)*/
     339        double *Yb  = xNewZeroInit<double>(Ysize);
     340        int    *Yin = xNewZeroInit<int>(Ysize);
     341
     342        /*Get final Ysize*/
     343        hdl_countdoubles = new CountDoublesFunctor();
     344        femmodel->Marshall(hdl_countdoubles);
     345        int Ysize_i= hdl_countdoubles->DoubleCount();
     346        delete hdl_countdoubles;
    342347
    343348        /*Start tracing*/
     
    346351
    347352        /*Reverse dependent (f)*/
    348    hdl_regin = new RegisterInputFunctor(Yin,Ysize);
    349    femmodel->Marshall(hdl_regin);
    350    delete hdl_regin;
     353        hdl_regin = new RegisterInputFunctor(Yin,Ysize);
     354        femmodel->Marshall(hdl_regin);
     355        delete hdl_regin;
    351356        for(int i=0; i < Xsize; i++) tape_codi.registerInput(X[i]);
    352357
    353358        SetControlInputsFromVectorx(femmodel,X);
    354    IssmDouble J = 0.;
    355         for(int i=0;i<dependent_objects->Size();i++){
    356                 DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
    357                 J += dep->GetValue();
     359        IssmDouble J = 0.;
     360        if(0){
     361                for(int i=0;i<dependent_objects->Size();i++){
     362                        DependentObject* dep=(DependentObject*)dependent_objects->GetObjectByOffset(i);
     363                        J += dep->GetValue();
     364                }
     365        }
     366        else{
     367                femmodel->IceVolumex(&J,false);
    358368        }
    359369        if(IssmComm::GetRank()==0) tape_codi.registerOutput(J);
     
    363373        tape_codi.evaluate();
    364374
    365    /*Initialize Xb and Yb*/
    366    double *Xb  = xNewZeroInit<double>(Xsize);
    367         for(int i=0;i<Xsize;i++) Xb[i] += X[i].gradient();
    368 
    369    hdl_setadjoint = new SetAdjointFunctor(Yb,Ysize);
    370    femmodel->Marshall(hdl_setadjoint);
    371    delete hdl_setadjoint;
     375        /*Initialize Xb and Yb*/
     376        double *Xb  = xNewZeroInit<double>(Xsize);
     377        for(int i=0;i<Xsize  ;i++) Xb[i] += X[i].gradient();
     378        for(int i=0;i<Ysize_i;i++) Yb[i]  = tape_codi.gradient(Yin[i]);
    372379
    373380        /*reverse loop for transient step (G)*/
    374         for(int reverse_step = step;reverse_step>=0; reverse_step--){
     381        for(int reverse_step = step;reverse_step>0; reverse_step--){
    375382
    376383                /*Restore model from this step*/
     
    378385                femmodel->RestartAD(reverse_step);
    379386                tape_codi.setActive();
     387
     388                /*Get new Ysize*/
     389                hdl_countdoubles = new CountDoublesFunctor();
     390                femmodel->Marshall(hdl_countdoubles);
     391                int Ysize_i= hdl_countdoubles->DoubleCount();
     392                delete hdl_countdoubles;
    380393
    381394                /*We need to store the CoDiPack identifier here, since y is overwritten.*/
     
    408421
    409422                /* here we access the gradient data via the stored identifiers.*/
    410                 for(int i=0; i<Ysize; i++) Yb[i]  = tape_codi.gradient(Yin[i]);
    411                 for(int i=0; i<Xsize; i++) Xb[i] += X[i].gradient();
     423                //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]);
     424                for(int i=0; i<Ysize_i; i++) Yb[i]  = tape_codi.gradient(Yin[i]);
     425                for(int i=0; i<Xsize;   i++) Xb[i] += X[i].gradient();
    412426        }
    413427
Note: See TracChangeset for help on using the changeset viewer.