Changeset 27719 for issm/trunk-jpl/src


Ignore:
Timestamp:
05/03/23 12:01:31 (23 months ago)
Author:
Mathieu Morlighem
Message:

CHG: partially allowing control inputs+params

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

Legend:

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

    r27696 r27719  
    166166}
    167167/*}}}*/
     168void  ControlParam::GetParameterValue(IssmDouble* poutput, IssmDouble time){/*{{{*/
     169
     170        _assert_(M==1);
     171        *poutput = value[0];
     172
     173}
     174/*}}}*/
    168175void  ControlParam::GetParameterValue(IssmDouble** poutput, int* pM){/*{{{*/
    169176
     
    203210}
    204211/*}}}*/
     212void  ControlParam::GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset){/*{{{*/
     213
     214        /*Get list of ids for this element and this control*/
     215        _assert_(N==this->M); //FIXME
     216        int*        idlist = xNew<int>(this->M);
     217        IssmDouble* values = xNew<IssmDouble>(this->M);
     218
     219        for(int i=0;i<this->M;i++){
     220                idlist[i] = offset+i;
     221                values[i] = this->value[i];
     222        }
     223
     224        vector->SetValues(this->M,idlist,values,INS_VAL);
     225
     226        /*Clean up*/
     227        xDelete<int>(idlist);
     228        xDelete<IssmDouble>(values);
     229
     230}/*}}}*/
  • issm/trunk-jpl/src/c/classes/Params/ControlParam.h

    r27696 r27719  
    11/*! \file ControlParam.h
    2  *  \brief: header file for triavertexinput object
     2 *  \brief: header file for ControlParam object
    33 */
    44
     
    2121
    2222        private:
    23                 /*just hold 3 values for 3 vertices: */
    2423                IssmDouble* value;
    2524                IssmDouble* minvalue;
     
    2726                IssmDouble* savedvalue;
    2827                IssmDouble* gradient;
    29                 int        enum_type;
    30                 int        M;
     28                int         enum_type;
     29                int         M;
    3130
    3231        public:
     
    5150                void  GetParameterValue(int** pintarray,int* pM,int* pN){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a matrix");}
    5251                void  GetParameterValue(IssmDouble* pIssmDouble);
    53                 void  GetParameterValue(IssmDouble* pdouble,IssmDouble time){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a IssmDouble for a given time");}
     52                void  GetParameterValue(IssmDouble* pdouble,IssmDouble time);
    5453                void  GetParameterValue(char** pstring){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a string");}
    5554                void  GetParameterValue(char*** pstringarray,int* pM){_error_("Param "<< EnumToStringx(enum_type) << " cannot return a string array");}
     
    8079                void  SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array){_error_("Param "<< EnumToStringx(enum_type) << " cannot hold an array of matrices");}
    8180                void  SetGradient(IssmDouble* poutput, int M);
     81                void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset);
    8282                /*}}}*/
    8383};
  • issm/trunk-jpl/src/c/classes/Params/Param.h

    r27696 r27719  
    6666                virtual void  SetValue(IssmDouble** array, int M, int* mdim_array, int* ndim_array)=0;
    6767                virtual void  SetGradient(IssmDouble* poutput, int M)=0;
     68                virtual void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_index,int N,const char* data,int offset){_error_("not implemented yet");};
    6869};
    6970#endif
  • issm/trunk-jpl/src/c/classes/Params/Parameters.cpp

    r27696 r27719  
    673673/*}}}*/
    674674
     675void  Parameters::GetVectorFromControl(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset){/*{{{*/
     676
     677        /*first, figure out if the param has already been created: */
     678        Param* param=xDynamicCast<Param*>(this->FindParamObject(control_enum));
     679        if(!param) _error_("Parameter not found");
     680
     681        param->GetVectorFromControl(vector, control_index, N, data, offset);
     682}/*}}}*/
     683
    675684Param* Parameters::FindParamObject(int param_enum){/*{{{*/
    676685
  • issm/trunk-jpl/src/c/classes/Params/Parameters.h

    r27696 r27719  
    7676                void  SetControlParam(IssmDouble* IssmDoublearray,int M, int enum_type);
    7777                void  ControlParamSetGradient(IssmDouble* IssmDoublearray, int M, int enum_type);
     78                void  GetVectorFromControl(Vector<IssmDouble>* vector,int control_enum,int control_index,int N,const char* data,int offset);
    7879                Param* FindParamObject(int enum_type);
    7980
  • issm/trunk-jpl/src/c/cores/controladm1qn3_core.cpp

    r27696 r27719  
    598598
    599599        /*Get initial guess*/
    600         if(IsParamEnum(control_enum[0])){
    601                 femmodel->parameters->FindControlParamAndMakePassive(&X,NULL,control_enum[0],"value");
    602                 intn=M[0];
    603         }
    604         else{
    605                 GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
    606         }
     600        GetPassiveVectorFromControlInputsx(&X,&intn,femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,"value");
    607601
    608602        /*Get problem dimension and initialize gradient and initial guess*/
  • issm/trunk-jpl/src/c/modules/GetVectorFromControlInputsx/GetVectorFromControlInputsx.cpp

    r25539 r27719  
    3030        int offset = 0;
    3131        for(int i=0;i<num_controls;i++){
    32                 for(Object* & object : elements->objects){
    33                         Element* element=xDynamicCast<Element*>(object);
    34                         element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset);
     32
     33                /*Is the control a Param?*/
     34                if(IsParamEnum(control_type[i])){
     35                        parameters->GetVectorFromControl(vector,control_type[i],i,N[i],data,offset);
     36                }
     37                else if(IsInputEnum(control_type[i])){
     38                        for(Object* & object : elements->objects){
     39                                Element* element=xDynamicCast<Element*>(object);
     40                                element->GetVectorFromControlInputs(vector,control_type[i],i,N[i],data,offset);
     41                        }
     42                }
     43                else{
     44                        _error_("not supported yet");
    3545                }
    3646                offset += M[i]*N[i];
Note: See TracChangeset for help on using the changeset viewer.