Changeset 22617


Ignore:
Timestamp:
03/23/18 10:27:34 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: variable descriptors should not be in params (it's really messed up because we have two objects with the same enum in params and inputs, which is totally confusing), created a special param to hold all of the variables

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

Legend:

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

    r22551 r22617  
    4545        }
    4646        /*}}}*/
    47                         int IssmParallelDirectApplicInterface::derived_map_ac(const Dakota::String& ac_name){/*{{{*/
     47        int IssmParallelDirectApplicInterface::derived_map_ac(const Dakota::String& ac_name){/*{{{*/
    4848
    49                                 FemModel* femmodel;
    50                                
    51                                 char     **responses_descriptors    = NULL;      //these are ours! there are only numresponsedescriptors of them, not d_numresponses!!!
    52                                 char      *response_descriptor      = NULL;
    53                                 int        numresponsedescriptors;
    54                                 int        solution_type;
    55                                 bool       control_analysis         = false;
    56                                 void     (*solutioncore)(FemModel*) = NULL;
    57                                 bool       nodakotacore             = true;
     49                FemModel* femmodel;
    5850
    59                                 int world_rank;
    60                                 ISSM_MPI_Comm_rank(ISSM_MPI_COMM_WORLD,&world_rank);
     51                char     **responses_descriptors    = NULL;      //these are ours! there are only numresponsedescriptors of them, not d_numresponses!!!
     52                char      *response_descriptor      = NULL;
     53                int        numresponsedescriptors;
     54                int        solution_type;
     55                bool       control_analysis         = false;
     56                void     (*solutioncore)(FemModel*) = NULL;
     57                bool       nodakotacore             = true;
    6158
    62                                 /*Only have slaves work!:*/
    63                                 if(world_rank==0)return 0;
     59                int world_rank;
     60                ISSM_MPI_Comm_rank(ISSM_MPI_COMM_WORLD,&world_rank);
    6461
    65                                 #ifdef MPI_DEBUG
    66                                 Cout << "eval server id" << evalServerId << " invoking " << ac_name << " within SIM::IssmParallelDirectApplicInterface." << std::endl;
    67                                 #endif // MPI_DEBUG
     62                /*Only have slaves work!:*/
     63                if(world_rank==0)return 0;
    6864
    69                                 int i;
    70                                 IssmDouble* variables=NULL;
    71                                 char** variable_descriptors=NULL;
    72                                 char*  variable_descriptor=NULL;
    73                                 IssmDouble* responses=NULL;
     65                #ifdef MPI_DEBUG
     66                Cout << "eval server id" << evalServerId << " invoking " << ac_name << " within SIM::IssmParallelDirectApplicInterface." << std::endl;
     67                #endif // MPI_DEBUG
    7468
    75                                 /*Before launching evaluation, we need to transfer the dakota inputs into Issm readable variables: */
     69                int i;
     70                IssmDouble  *variables            = NULL;
     71                char       **variable_descriptors = NULL;
     72                char        *variable_descriptor  = NULL;
     73                IssmDouble  *responses            = NULL;
    7674
    77                                 /*First, the variables: */
    78                                 variables=xNew<IssmDouble>(numACV);
    79                                 for(i=0;i<numACV;i++){
    80                                         variables[i]=xC[i];
    81                                 }
    82                                 /*The descriptors: */
    83                                 variable_descriptors=xNew<char*>(numACV);
    84                                 for(i=0;i<numACV;i++){
    85                                         std::string label=xCLabels[i];
    86                                         variable_descriptor=xNew<char>(strlen(label.c_str())+1);
    87                                         memcpy(variable_descriptor,label.c_str(),(strlen(label.c_str())+1)*sizeof(char));
     75                /*Before launching evaluation, we need to transfer the dakota inputs into Issm readable variables: */
    8876
    89                                         variable_descriptors[i]=variable_descriptor;
    90                                 }
     77                /*First, the variables: */
     78                variables=xNew<IssmDouble>(numACV);
     79                for(i=0;i<numACV;i++){
     80                        variables[i]=xC[i];
     81                }
     82                /*The descriptors: */
     83                variable_descriptors=xNew<char*>(numACV);
     84                for(i=0;i<numACV;i++){
     85                        std::string label=xCLabels[i];
     86                        variable_descriptor=xNew<char>(strlen(label.c_str())+1);
     87                        memcpy(variable_descriptor,label.c_str(),(strlen(label.c_str())+1)*sizeof(char));
    9188
    92                                 /*Initialize responses: */
    93                                 responses=xNewZeroInit<IssmDouble>(numFns);
     89                        variable_descriptors[i]=variable_descriptor;
     90                }
    9491
    95                                 /*Make a copy of femmodel, so we start this new evaluation run for this specific sample with a brand
    96                                  * new copy of the model, which has not been tempered with by previous evaluation runs: */
     92                /*Initialize responses: */
     93                responses=xNewZeroInit<IssmDouble>(numFns);
    9794
    98                                 femmodel=femmodel_init->copy();
     95                /*Make a copy of femmodel, so we start this new evaluation run for this specific sample with a brand
     96                 * new copy of the model, which has not been tempered with by previous evaluation runs: */
     97                femmodel=femmodel_init->copy();
    9998
    100                                 /*retrieve parameters: */
    101                                 femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,QmuResponsedescriptorsEnum);
    102                                 femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
    103                                 femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
     99                /*retrieve parameters: */
     100                femmodel->parameters->FindParam(&responses_descriptors,&numresponsedescriptors,QmuResponsedescriptorsEnum);
     101                femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
     102                femmodel->parameters->FindParam(&control_analysis,InversionIscontrolEnum);
    104103
    105                                 /*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
    106                                 InputUpdateFromDakotax(femmodel,variables,variable_descriptors,numACV);
     104                /*Modify core inputs in objects contained in femmodel, to reflect the dakota variables inputs: */
     105                InputUpdateFromDakotax(femmodel,variables,variable_descriptors,numACV);
    107106
    108                                 /*Determine solution sequence: */
    109                                 if(VerboseQmu()) _printf0_("Starting " << EnumToStringx(solution_type) << " core:\n");
    110                                 WrapperCorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type,nodakotacore);
     107                /*Determine solution sequence: */
     108                if(VerboseQmu()) _printf0_("Starting " << EnumToStringx(solution_type) << " core:\n");
     109                WrapperCorePointerFromSolutionEnum(&solutioncore,femmodel->parameters,solution_type,nodakotacore);
    111110
    112                                 /*Run the core solution sequence: */
    113                                 solutioncore(femmodel);
     111                /*Run the core solution sequence: */
     112                solutioncore(femmodel);
    114113
    115                                 /*compute responses: */
    116                                 if(VerboseQmu()) _printf0_("compute dakota responses:\n");
    117                                 femmodel->DakotaResponsesx(responses,responses_descriptors,numresponsedescriptors,numFns);
     114                /*compute responses: */
     115                if(VerboseQmu()) _printf0_("compute dakota responses:\n");
     116                femmodel->DakotaResponsesx(responses,responses_descriptors,numresponsedescriptors,numFns);
    118117
    119                                 /*populate responses: */
    120                                 for(i=0;i<numFns;i++){
    121                                         fnVals[i]=responses[i];
    122                                 }
     118                /*populate responses: */
     119                for(i=0;i<numFns;i++){
     120                        fnVals[i]=responses[i];
     121                }
    123122
    124                                 /*Free ressources:*/
    125                                 xDelete<IssmDouble>(variables);
    126                                 for(i=0;i<numACV;i++){
    127                                         variable_descriptor=variable_descriptors[i];
    128                                         xDelete<char>(variable_descriptor);
    129                                 }
    130                                 xDelete<char*>(variable_descriptors);
    131                                 for(i=0;i<numresponsedescriptors;i++){
    132                                         response_descriptor=responses_descriptors[i];
    133                                         xDelete<char>(response_descriptor);
    134                                 }
    135                                 if(responses_descriptors) xDelete<char*>(responses_descriptors);
    136                                 xDelete<IssmDouble>(responses);
    137                                 delete femmodel;
     123                /*Free ressources:*/
     124                xDelete<IssmDouble>(variables);
     125                for(i=0;i<numACV;i++){
     126                        variable_descriptor=variable_descriptors[i];
     127                        xDelete<char>(variable_descriptor);
     128                }
     129                xDelete<char*>(variable_descriptors);
     130                for(i=0;i<numresponsedescriptors;i++){
     131                        response_descriptor=responses_descriptors[i];
     132                        xDelete<char>(response_descriptor);
     133                }
     134                if(responses_descriptors) xDelete<char*>(responses_descriptors);
     135                xDelete<IssmDouble>(responses);
     136                delete femmodel;
    138137
    139                                 return 0;
    140                         }/*}}}*/
     138                return 0;
     139        }/*}}}*/
    141140}
    142141#endif
  • issm/trunk-jpl/src/c/classes/Params/Param.h

    r22588 r22617  
    1919/*}}}*/
    2020
    21 class Param{
     21class Param: public Object{
    2222
    2323        public:
  • issm/trunk-jpl/src/c/classes/Params/Parameters.cpp

    r22588 r22617  
    6464        /*Get index in array*/
    6565        #ifdef _ISSM_DEBUG_
    66         if(param_enum<=ParametersSTARTEnum) _error_("Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
    67         if(param_enum>=ParametersENDEnum)   _error_("Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
     66        if(param_enum<=ParametersSTARTEnum) _error_("Cannot add param: Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
     67        if(param_enum>=ParametersENDEnum)   _error_("Cannot add param: Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
    6868        #endif
    6969        int index = param_enum - ParametersSTARTEnum -1;
     
    414414}
    415415/*}}}*/
     416void Parameters::FindParamInDataset(IssmDouble** pIssmDoublearray,int* pM,int* pN,int dataset_type,int enum_type){/*{{{*/
     417        _assert_(this);
     418
     419        _assert_(dataset_type>ParametersSTARTEnum);
     420        _assert_(dataset_type<ParametersENDEnum);
     421
     422        int index = dataset_type - ParametersSTARTEnum -1;
     423        if(!this->params[index]) _error_("Parameter " << EnumToStringx(dataset_type) <<" not set");
     424        if(this->params[index]->ObjectEnum()!=DataSetParamEnum) _error_("Parameter " << EnumToStringx(dataset_type) <<" is not a DataSetParam!");
     425
     426        DataSetParam* dataset_param = xDynamicCast<DataSetParam*>(this->params[index]);
     427        for( vector<Object*>::iterator object=dataset_param->value->objects.begin() ; object < dataset_param->value->objects.end(); object++ ){
     428                Param* param = xDynamicCast<Param*>(*object);
     429                if(param->InstanceEnum()==enum_type){
     430                        param->GetParameterValue(pIssmDoublearray,pM,pN);
     431                        return;
     432                }
     433        }
     434
     435        /*Error out if we reached this point*/
     436        _error_("Could not find Enum "<<EnumToStringx(enum_type)<<" in dataset param "<<EnumToStringx(dataset_type));
     437}
     438/*}}}*/
    416439
    417440void   Parameters::SetParam(bool boolean,int enum_type){/*{{{*/
     
    566589
    567590        #ifdef _ISSM_DEBUG_
    568         if(param_enum<=ParametersSTARTEnum) _error_("Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
    569         if(param_enum>=ParametersENDEnum)   _error_("Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
     591        if(param_enum<=ParametersSTARTEnum) _error_("Cannot find param: Enum "<<EnumToStringx(param_enum)<<" should appear after ParametersSTARTEnum");
     592        if(param_enum>=ParametersENDEnum)   _error_("Cannot find param: Enum "<<EnumToStringx(param_enum)<<" should appear before ParametersENDEnum");
    570593        #endif
    571594
  • issm/trunk-jpl/src/c/classes/Params/Parameters.h

    r22559 r22617  
    5151                void  FindParam(FILE** pfid,int enum_type);
    5252                void  FindParam(DataSet** pdataset, int enum_type);
     53                void  FindParamInDataset(IssmDouble** pIssmDoublearray,int* pM,int* pN,int dataset_type,int enum_type);
    5354
    5455                void  SetParam(bool boolean,int enum_type);
  • issm/trunk-jpl/src/c/modules/InputUpdateFromDakotax/InputUpdateFromDakotax.cpp

    r15849 r22617  
    5454
    5555                        /*Now, pick up the parameter corresponding to root: */
    56                         femmodel->parameters->FindParam(&parameter,&nrows,&ncols,StringToEnumx(root));
     56                        femmodel->parameters->FindParamInDataset(&parameter,&nrows,&ncols,QmuVariableDescriptorsEnum,StringToEnumx(root));
    5757
    5858                        /*We've got the parameter, we need to update it using qmu_part (a partitioning vector),
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Dakota/CreateParametersDakota.cpp

    r22611 r22617  
    7979
    8080                /*Deal with data needed because of qmu variables*/
     81                DataSet* dataset_variable_descriptors = new DataSet(QmuVariableDescriptorsEnum);
    8182                for(i=0;i<numvariabledescriptors;i++){
    8283                        if (strncmp(variabledescriptors[i],"scaled_",7)==0){
     
    9293                                iomodel->FetchData(&dakota_parameter,&nrows,&ncols,fieldname);
    9394                                if(nrows==iomodel->numberofvertices){
    94                                         parameters->AddObject(new DoubleMatParam(param_enum,dakota_parameter,nrows,ncols));
     95                                        dataset_variable_descriptors->AddObject(new DoubleMatParam(param_enum,dakota_parameter,nrows,ncols));
    9596                                }
    9697                                else{
    97                                         parameters->AddObject(new DoubleTransientMatParam(param_enum,dakota_parameter,nrows,ncols));
     98                                        dataset_variable_descriptors->AddObject(new DoubleTransientMatParam(param_enum,dakota_parameter,nrows,ncols));
    9899                                }
    99100                                xDelete<double>(dakota_parameter);
     
    101102                        }
    102103                }
     104                parameters->AddObject(new DataSetParam(QmuVariableDescriptorsEnum,dataset_variable_descriptors));
     105                delete dataset_variable_descriptors;
    103106
    104107                /*clean-up*/
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r22612 r22617  
    214214        QmuPartitionEnum,
    215215        QmuResponsedescriptorsEnum,
     216        QmuVariableDescriptorsEnum,
    216217        RestartFileNameEnum,
    217218        ResultsEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r22612 r22617  
    222222                case QmuPartitionEnum : return "QmuPartition";
    223223                case QmuResponsedescriptorsEnum : return "QmuResponsedescriptors";
     224                case QmuVariableDescriptorsEnum : return "QmuVariableDescriptors";
    224225                case RestartFileNameEnum : return "RestartFileName";
    225226                case ResultsEnum : return "Results";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r22612 r22617  
    225225              else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
    226226              else if (strcmp(name,"QmuResponsedescriptors")==0) return QmuResponsedescriptorsEnum;
     227              else if (strcmp(name,"QmuVariableDescriptors")==0) return QmuVariableDescriptorsEnum;
    227228              else if (strcmp(name,"RestartFileName")==0) return RestartFileNameEnum;
    228229              else if (strcmp(name,"Results")==0) return ResultsEnum;
     
    259260              else if (strcmp(name,"SmbCldFrac")==0) return SmbCldFracEnum;
    260261              else if (strcmp(name,"SmbDelta18o")==0) return SmbDelta18oEnum;
    261               else if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
     265              if (strcmp(name,"SmbDelta18oSurface")==0) return SmbDelta18oSurfaceEnum;
     266              else if (strcmp(name,"SmbDenIdx")==0) return SmbDenIdxEnum;
    266267              else if (strcmp(name,"SmbDt")==0) return SmbDtEnum;
    267268              else if (strcmp(name,"Smb")==0) return SmbEnum;
     
    382383              else if (strcmp(name,"CalvingrateyAverage")==0) return CalvingrateyAverageEnum;
    383384              else if (strcmp(name,"Calvingratey")==0) return CalvingrateyEnum;
    384               else if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
     388              if (strcmp(name,"CalvingStressThresholdFloatingice")==0) return CalvingStressThresholdFloatingiceEnum;
     389              else if (strcmp(name,"CalvingStressThresholdGroundedice")==0) return CalvingStressThresholdGroundediceEnum;
    389390              else if (strcmp(name,"Converged")==0) return ConvergedEnum;
    390391              else if (strcmp(name,"CrevasseDepth")==0) return CrevasseDepthEnum;
     
    505506              else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
    506507              else if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
    507               else if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"SmbDz")==0) return SmbDzEnum;
     511              if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
     512              else if (strcmp(name,"SmbDz")==0) return SmbDzEnum;
    512513              else if (strcmp(name,"SmbDzini")==0) return SmbDziniEnum;
    513514              else if (strcmp(name,"SmbDzMin")==0) return SmbDzMinEnum;
     
    628629              else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum;
    629630              else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
    630               else if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
     634              if (strcmp(name,"Balancethickness2Solution")==0) return Balancethickness2SolutionEnum;
     635              else if (strcmp(name,"BalancethicknessAnalysis")==0) return BalancethicknessAnalysisEnum;
    635636              else if (strcmp(name,"BalancethicknessApparentMassbalance")==0) return BalancethicknessApparentMassbalanceEnum;
    636637              else if (strcmp(name,"BalancethicknessSoftAnalysis")==0) return BalancethicknessSoftAnalysisEnum;
     
    751752              else if (strcmp(name,"HydrologyBasalFlux")==0) return HydrologyBasalFluxEnum;
    752753              else if (strcmp(name,"HydrologyDCEfficientAnalysis")==0) return HydrologyDCEfficientAnalysisEnum;
    753               else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
     757              if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
     758              else if (strcmp(name,"HydrologydcEplColapseThickness")==0) return HydrologydcEplColapseThicknessEnum;
    758759              else if (strcmp(name,"HydrologydcEplCompressibility")==0) return HydrologydcEplCompressibilityEnum;
    759760              else if (strcmp(name,"HydrologydcEplConductivity")==0) return HydrologydcEplConductivityEnum;
     
    874875              else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
    875876              else if (strcmp(name,"Mumps")==0) return MumpsEnum;
    876               else if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"Nodal")==0) return NodalEnum;
     880              if (strcmp(name,"NewDamage")==0) return NewDamageEnum;
     881              else if (strcmp(name,"Nodal")==0) return NodalEnum;
    881882              else if (strcmp(name,"Nodalvalue")==0) return NodalvalueEnum;
    882883              else if (strcmp(name,"NodeSId")==0) return NodeSIdEnum;
     
    997998              else if (strcmp(name,"TotalSmb")==0) return TotalSmbEnum;
    998999              else if (strcmp(name,"TotalSmbScaled")==0) return TotalSmbScaledEnum;
    999               else if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
     1003              if (strcmp(name,"TransientArrayParam")==0) return TransientArrayParamEnum;
     1004              else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
    10041005              else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
    10051006              else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
     
    11201121              else if (strcmp(name,"Outputdefinition95")==0) return Outputdefinition95Enum;
    11211122              else if (strcmp(name,"Outputdefinition96")==0) return Outputdefinition96Enum;
    1122               else if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
     1126              if (strcmp(name,"Outputdefinition97")==0) return Outputdefinition97Enum;
     1127              else if (strcmp(name,"Outputdefinition98")==0) return Outputdefinition98Enum;
    11271128              else if (strcmp(name,"Outputdefinition99")==0) return Outputdefinition99Enum;
    11281129              else if (strcmp(name,"Outputdefinition9")==0) return Outputdefinition9Enum;
Note: See TracChangeset for help on using the changeset viewer.