Changeset 22409


Ignore:
Timestamp:
02/08/18 09:07:18 (7 years ago)
Author:
erobo
Message:

CHG: Added outputdenfition compatability with Numberedcostfunction

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp

    r22385 r22409  
    276276                                /*Deal with regional output: {{{*/
    277277
    278                                 /*masscon variables: */
     278                                /*regional output variables: */
    279279                                int          numout;
    280280                                char**       reg_name_s               = NULL;
     
    292292                                for(j=0;j<numout;j++){
    293293
    294                                         /*Create a masscon object: */
     294                                        /*Create a regional output object: */
    295295                                        output_definitions->AddObject(new Regionaloutput(reg_name_s[j],StringToEnumx(reg_definitionstring_s[j]),reg_outputnamestring_s[j],reg_mask_s[j],reg_mask_M_s[j]));
    296296
     
    313313                                xDelete<char*>(reg_outputnamestring_s);
    314314                                xDelete<char*>(reg_definitionstring_s);
    315                         }
    316315                        /*}}}*/
    317                         else _error_("output definition enum " << output_definition_enums[i] << " not supported yet!");
     316                        }
     317                        else if (output_definition_enums[i]==NumberedcostfunctionEnum){
     318                                /*Deal with numbered cost function: {{{*/
     319
     320                                /*Intermediary*/
     321                                int    numout;
     322                                char **ncf_name_s             = NULL;
     323                                char **ncf_definitionstring_s = NULL;
     324                                int    cost_function ,domaintype;
     325                                int    num_cost_functions;
     326                                char **cost_functions         = NULL;
     327                                int    num_costfunc;
     328                                char **cm_responses           = NULL;
     329
     330                                /*Process cost functions and convert from string to enums*/
     331                                iomodel->FindConstant(&num_cost_functions,"md.numberedcostfunction.num_cost_functions");
     332                                iomodel->FindConstant(&cost_functions,&num_cost_functions,"md.numberedcostfunction.cost_functions");
     333                                if(num_cost_functions<1) _error_("No cost functions found");
     334                                int* cost_function_enums=xNew<int>(num_cost_functions);
     335                                for(int i=0;i<num_cost_functions;++i){
     336                                        cost_function_enums[i]=StringToEnumx(cost_functions[i]);
     337                                }
     338
     339                                iomodel->FetchData(1,"md.numberedcostfunction.cost_functions_coefficients");
     340
     341                                iomodel->FetchMultipleData(&ncf_name_s,&numout,"md.numberedcostfunction.name");
     342                                iomodel->FetchMultipleData(&ncf_definitionstring_s,&numout,"md.numberedcostfunction.definitionstring");
     343                                if(numout>1) _error_("not implemented yet, check code here");
     344
     345                                /*Fetch Observations */
     346                                iomodel->FindConstant(&domaintype,"md.mesh.domain_type");
     347                                for(int i=0;i<num_cost_functions;i++){
     348                                        cost_function=cost_function_enums[i];
     349                                        if(     cost_function==ThicknessAbsMisfitEnum) iomodel->FetchDataToInput(elements,"md.numberedcostfunction.thickness_obs",InversionThicknessObsEnum);
     350                                        else if(cost_function==SurfaceAbsMisfitEnum)   iomodel->FetchDataToInput(elements,"md.numberedcostfunction.surface_obs",InversionSurfaceObsEnum);
     351                                        else if(cost_function==SurfaceAbsVelMisfitEnum
     352                                                        || cost_function==SurfaceRelVelMisfitEnum
     353                                                        || cost_function==SurfaceLogVelMisfitEnum
     354                                                        || cost_function==SurfaceLogVxVyMisfitEnum
     355                                                        || cost_function==SurfaceAverageVelMisfitEnum){
     356                                                iomodel->FetchDataToInput(elements,"md.numberedcostfunction.vx_obs",InversionVxObsEnum);
     357                                                if(domaintype!=Domain2DverticalEnum) iomodel->FetchDataToInput(elements,"md.numberedcostfunction.vy_obs",InversionVyObsEnum);
     358                                        }
     359
     360                                }
     361
     362                                for(j=0;j<numout;j++){
     363
     364                                        output_definitions->AddObject(new Numberedcostfunction(ncf_name_s[j],StringToEnumx(ncf_definitionstring_s[j]),num_costfunc,cost_function_enums));
     365
     366                                }
     367
     368                                parameters->AddObject(iomodel->CopyConstantObject("md.inversion.num_cost_functions",InversionNumCostFunctionsEnum));
     369                               
     370                                iomodel->FindConstant(&cm_responses,&num_costfunc,"md.inversion.cost_functions");
     371                                //if(num_costfunc<1) error ("no cost functions found");
     372                                int* costfunc_enums=xNew<int>(num_costfunc);
     373                                for(int i=0;i<num_costfunc;i++){
     374                                                costfunc_enums[i]=StringToEnumx(cm_responses[i]);
     375                                                xDelete<char>(cm_responses[i]);
     376                                        }
     377                                xDelete<char*>(cm_responses);
     378                               
     379                                parameters->AddObject(new IntVecParam(InversionCostFunctionsEnum,costfunc_enums,num_costfunc));
     380                                xDelete<int>(costfunc_enums);
     381
     382                                /*Free data: */
     383                                iomodel->DeleteData(1,"md.inversion.cost_functions_coefficients");
     384                                xDelete<int>(cost_function_enums);
     385                                for(int i=0;i<num_cost_functions;i++) xDelete<char>(cost_functions[i]);
     386                                xDelete<char*>(cost_functions);
     387                        }
     388                        /*}}}*/
     389                else _error_("output definition enum " << EnumToStringx(output_definition_enums[i]) << " not supported yet!");
    318390                }
    319391        }
     
    323395        delete output_definitions;
    324396        xDelete<int>(output_definition_enums);
     397
    325398}
Note: See TracChangeset for help on using the changeset viewer.