Changeset 27724


Ignore:
Timestamp:
05/04/23 11:29:48 (23 months ago)
Author:
Mathieu Morlighem
Message:

CHG: making gradient of param output

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

Legend:

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

    r27650 r27724  
    34983498                if(!IsOnBase()) return;
    34993499        }
    3500 
    3501         /*Get out if this is not an element input*/
    3502         if(!IsInputEnum(control_enum)) return;
    35033500
    35043501        /*Prepare index list*/
  • issm/trunk-jpl/src/c/classes/Elements/Tria.cpp

    r27689 r27724  
    50325032                }
    50335033        }
    5034 
    5035         /*Get out if this is not an element input*/
    5036         if(!IsInputEnum(control_enum)) return;
    50375034
    50385035        /*Get list of ids for this element and this control*/
  • issm/trunk-jpl/src/c/classes/Params/ControlParam.cpp

    r27722 r27724  
    6262       
    6363                savedvalue=NULL;
    64                 gradient=NULL;
     64                gradient=xNewZeroInit<IssmDouble>(M);
    6565        }
    6666        else{
     
    7878        xDelete<IssmDouble>(minvalue);
    7979        xDelete<IssmDouble>(maxvalue);
     80        xDelete<IssmDouble>(gradient);
     81        xDelete<IssmDouble>(savedvalue);
    8082        return;
    8183}
     
    201203void  ControlParam::SetGradient(IssmDouble* poutput, int in_M){/*{{{*/
    202204
     205        _assert_(in_M==this->M);
     206
    203207        /*avoid leak: */
    204208        xDelete<IssmDouble>(this->gradient);
  • issm/trunk-jpl/src/c/classes/Params/Parameters.cpp

    r27719 r27724  
    649649}
    650650/*}}}*/
    651 void   Parameters::SetControlParam(IssmDouble* IssmDoublearray,int M, int enum_type){/*{{{*/
    652 
    653         Param* param=NULL;
    654 
    655         /*first, figure out if the param has already been created: */
    656         param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
    657 
    658         if(param) param->SetValue(IssmDoublearray,M); //already exists, just set it.
     651void   Parameters::SetControlFromVector(IssmDouble* vector, int enum_type, int M, int N, int offset){/*{{{*/
     652
     653        /*first, figure out if the param has already been created: */
     654        Param* param=NULL;
     655        param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
     656
     657        if(param) param->SetValue(&vector[offset], M);
     658        else _error_("Param "<< EnumToStringx(enum_type) << " cannot setValue");
     659}
     660/*}}}*/
     661void   Parameters::SetGradientFromVector(IssmDouble* vector, int enum_type, int M, int N, int offset){/*{{{*/
     662
     663        /*first, figure out if the param has already been created: */
     664        Param* param=NULL;
     665        param=xDynamicCast<Param*>(this->FindParamObject(enum_type));
     666
     667        if(param) param->SetGradient(&vector[offset], M);
    659668        else _error_("Param "<< EnumToStringx(enum_type) << " cannot setValue");
    660669}
  • issm/trunk-jpl/src/c/classes/Params/Parameters.h

    r27719 r27724  
    7474                void  SetParam(FILE* fid,int enum_type);
    7575                void  SetParam(DataSet* dataset,int enum_type);
    76                 void  SetControlParam(IssmDouble* IssmDoublearray,int M, int enum_type);
     76                void  SetControlFromVector(IssmDouble* array, int enum_type, int M, int N, int offset);
     77                void  SetGradientFromVector(IssmDouble* array, int enum_type, int M, int N, int offset);
    7778                void  ControlParamSetGradient(IssmDouble* IssmDoublearray, int M, int enum_type);
    7879                void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset);
  • issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp

    r27722 r27724  
    251251        #ifdef _HAVE_CODIPACK_
    252252        if(checkpoint_frequency && solution_type == TransientSolutionEnum){
    253                 if(IsParamEnum(control_enum[0])){
    254 #ifdef _HAVE_AD_
    255                         IssmDouble* aX=xNew<IssmDouble>(intn,"t");
    256 #else
    257                         IssmDouble* aX=xNew<IssmDouble>(intn);
    258 #endif
    259                         for(int i=0;i<intn;i++) {
    260                                 aX[i]=X[i];
    261                         }
    262                         femmodel->parameters->SetControlParam(aX,M[0],control_enum[0]);
    263                 }
    264                 else{
    265                         SetControlInputsFromVectorx(femmodel,X);
    266                 }
     253                SetControlInputsFromVectorx(femmodel,X);
    267254                *pf = transient_ad(femmodel, G, &Jlist[(*Jlisti)*JlistN]);
    268255        }
     
    317304
    318305                ISSM_MPI_Bcast(aX,intn,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
    319                 if(IsParamEnum(control_enum[0])){
    320                         femmodel->parameters->SetControlParam(aX,M[0],control_enum[0]);
    321                 }
    322                 else{
    323                         SetControlInputsFromVectorx(femmodel,aX);
    324                 }
     306                SetControlInputsFromVectorx(femmodel,aX);
    325307                xDelete<IssmDouble>(aX);
    326308
     
    673655        }
    674656       
    675         if(IsParamEnum(control_enum[0])){
    676                 //femmodel->parameters->ControlParamSetGradient(aG,M[0],control_enum[0]);
    677                 femmodel->parameters->SetControlParam(aX,M[0],control_enum[0]);
    678         }
    679         else{
    680                 ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
    681                 SetControlInputsFromVectorx(femmodel,aX);
    682         }
     657        ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
     658        SetControlInputsFromVectorx(femmodel,aX);
    683659        xDelete(aX);
    684660
  • issm/trunk-jpl/src/c/cores/transient_core.cpp

    r27696 r27724  
    392392        delete hdl_regin;
    393393        if(my_rank==0) for(int i=0; i < Xsize; i++) tape_codi.registerInput(X[i]);
    394        
    395         if(IsParamEnum(control_enum[0])){
    396                 femmodel->parameters->SetControlParam(X,M[0],control_enum[0]);
    397         }
    398         else{
    399                 SetControlInputsFromVectorx(femmodel,X);
    400         }
     394        SetControlInputsFromVectorx(femmodel,X);
    401395       
    402396        IssmDouble J     = 0.;
     
    461455                /*Tell codipack that X is the independent*/
    462456                for(int i=0; i<Xsize; i++) tape_codi.registerInput(X[i]);
    463                
    464                 if(IsParamEnum(control_enum[0])){
    465                         femmodel->parameters->SetControlParam(X,M[0],control_enum[0]);
    466                 }
    467                 else{
    468                         SetControlInputsFromVectorx(femmodel,X);
    469                 }
     457                SetControlInputsFromVectorx(femmodel,X);
    470458
    471459                /*Get New state*/
  • issm/trunk-jpl/src/c/modules/ControlInputSetGradientx/ControlInputSetGradientx.cpp

    r25539 r27724  
    2525        int offset = 0;
    2626        for(int i=0;i<num_controls;i++){
    27                 for(Object* & object : elements->objects){
    28                         Element* element=xDynamicCast<Element*>(object);
    29                         element->ControlInputSetGradient(gradient,control_type[i],i,offset,M_all[i],N_all[i],interp_all[i]);
     27                /*Is the control a Param?*/
     28                if(IsParamEnum(control_type[i])){
     29                        parameters->SetGradientFromVector(gradient, control_type[i], M_all[i], N_all[i], offset);
     30                }
     31                else if(IsInputEnum(control_type[i])){
     32                        for(Object* & object : elements->objects){
     33                                Element* element=xDynamicCast<Element*>(object);
     34                                element->ControlInputSetGradient(gradient,control_type[i],i,offset,M_all[i],N_all[i],interp_all[i]);
     35                        }
     36                }
     37                else{
     38                        _error_("not supported yet");
    3039                }
    3140                offset+=M_all[i]*N_all[i];
  • issm/trunk-jpl/src/c/modules/SetControlInputsFromVectorx/SetControlInputsFromVectorx.cpp

    r26893 r27724  
    2222        int offset = 0;
    2323        for(int i=0;i<num_controls;i++){
    24                 for(Object* & object : femmodel->elements->objects){
    25                         Element* element=xDynamicCast<Element*>(object);
    26                         element->SetControlInputsFromVector(vector,control_type[i],i,offset,M[i],N[i]);
     24                /*Is the control a Param?*/
     25                if(IsParamEnum(control_type[i])){
     26                        femmodel->parameters->SetControlFromVector(vector,control_type[i],M[i],N[i],offset);
     27                }
     28                else if(IsInputEnum(control_type[i])){
     29                        for(Object* & object : femmodel->elements->objects){
     30                                Element* element=xDynamicCast<Element*>(object);
     31                                element->SetControlInputsFromVector(vector,control_type[i],i,offset,M[i],N[i]);
     32                        }
     33                }
     34                else{
     35                        _error_("not supported yet");
    2736                }
    2837                offset += M[i]*N[i];
Note: See TracChangeset for help on using the changeset viewer.