Changeset 27717


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

CHG: working on implementing transient surface square

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

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

    r27579 r27717  
    209209                                if(iomodel->domaintype!=Domain2DhorizontalEnum && !element->IsOnBase()) continue;
    210210                                for(int kk=0;kk<K;kk++){
    211                                         element->DatasetInputAdd(BasalforcingsIsmip6TfEnum,array3d[kk],inputs,iomodel,Ms[kk],Ns[kk],1,BasalforcingsIsmip6TfEnum,7,kk);
     211                                        element->DatasetInputAdd(BasalforcingsIsmip6TfEnum,array3d[kk],inputs,iomodel,Ms[kk],Ns[kk],1,BasalforcingsIsmip6TfEnum,kk);
    212212                                }
    213213                        }
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r27688 r27717  
    21472147        else _error_("not currently supported type of M and N attempted");
    21482148}/*}}}*/
    2149 void       Element::DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int input_enum,int code,int input_id){/*{{{*/
     2149void       Element::DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int input_enum,int input_id){/*{{{*/
    21502150        /*enum_type: the name of the DatasetInput (eg Outputdefinition1)
    21512151         * vector: information being stored (eg observations)
    21522152         * vector_type: is if by element or by vertex
    21532153         * input_enum: is the name of the vector being stored
    2154          * code: what type of data is in the vector (booleans, ints, doubles)
    21552154         */
    21562155
     
    22112210                /*Are we in transient or static? */
    22122211                if(M==iomodel->numberofelements){
    2213                         if (code==5){ //boolean
    2214                                 _error_("not implemented");
    2215                                 //datasetinput->AddInput(new BoolInput(input_enum,reCast<bool>(vector[this->Sid()])),input_id);
    2216                         }
    2217                         else if (code==6){ //integer
    2218                                 _error_("not implemented");
    2219                                 //datasetinput->AddInput(new IntInput(input_enum,reCast<int>(vector[this->Sid()])),input_id);
    2220                         }
    2221                         else if (code==7){ //IssmDouble
    2222                                 _error_("not implemented");
    2223                                 //datasetinput->AddInput(new DoubleInput(input_enum,vector[this->Sid()]),input_id);
    2224                         }
    2225                         else _error_("could not recognize nature of vector from code " << code);
     2212                        _error_("not implemented");
    22262213                }
    22272214                else if(M==iomodel->numberofelements+1){
    22282215                        _error_("not supported");
    2229                         ///*create transient input: */
    2230                         //IssmDouble* times = xNew<IssmDouble>(N);
    2231                         //for(t=0;t<N;t++) times[t] = vector[(M-1)*N+t];
    2232                         //TransientInput* transientinput=new TransientInput(input_enum,times,N);
    2233                         //TriaInput* bof=NULL;
    2234                         //for(t=0;t<N;t++){
    2235                         //      value=vector[N*this->Sid()+t];
    2236                         //      switch(this->ObjectEnum()){
    2237                         //              case TriaEnum:  transientinput->AddTimeInput(new TriaInput( input_enum,&value,P0Enum)); break;
    2238                         //              case PentaEnum: transientinput->AddTimeInput(new PentaInput(input_enum,&value,P0Enum)); break;
    2239                         //              case TetraEnum: transientinput->AddTimeInput(new TetraInput(input_enum,&value,P0Enum)); break;
    2240                         //              default: _error_("Not implemented yet");
    2241                         //      }
    2242                         //}
    2243                         //xDelete<IssmDouble>(times);
    22442216                }
    22452217                else _error_("element vector is either numberofelements or numberofelements+1 long. Field provided (" << EnumToStringx(input_enum) << ") is " << M << " long");
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r27688 r27717  
    140140                void               InputCreateP1FromConstant(Inputs* inputs,IoModel* iomodel,IssmDouble value,int vector_enum);
    141141                void               ControlInputCreate(IssmDouble* doublearray,IssmDouble* independents_min,IssmDouble* independents_max,Inputs*inputs,IoModel* iomodel,int M,int N,IssmDouble scale,int input_enum,int id);
    142                 void                                     DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int code,int input_enum);
     142                void                                     DatasetInputAdd(int enum_type,IssmDouble* vector,Inputs* inputs,IoModel* iomodel,int M,int N,int vector_type,int vector_enum,int input_enum);
    143143                void               InputUpdateFromConstant(IssmDouble constant, int name);
    144144                void               InputUpdateFromConstant(int constant, int name);
  • issm/trunk-jpl/src/c/classes/IoModel.cpp

    r27709 r27717  
    25922592                xDelete<int>(ndims);
    25932593        }
    2594         *pnumrecords=num_instances;
     2594        if(pnumrecords){
     2595                *pnumrecords=num_instances;
     2596        }
    25952597}
    25962598/*}}}*/
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/Control/UpdateElementsAndMaterialsControl.cpp

    r27696 r27717  
    8585                for(Object* & object : elements->objects){
    8686                        Element* element=xDynamicCast<Element*>(object);
    87                         element->DatasetInputAdd(InversionCostFunctionsCoefficientsEnum,&weights[i*iomodel->numberofvertices],inputs,iomodel,M,1,1,cost_function,7,cost_function);
     87                        element->DatasetInputAdd(InversionCostFunctionsCoefficientsEnum,&weights[i*iomodel->numberofvertices],inputs,iomodel,M,1,1,cost_function,cost_function);
    8888                }
    8989        }
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp

    r27709 r27717  
    210210                                        for(Object* & object : elements->objects){
    211211                                                Element* element=xDynamicCast<Element*>(object);
    212                                                 element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_observation_s[j],inputs,iomodel,cfsurfacesquare_observation_M_s[j],cfsurfacesquare_observation_N_s[j],obs_vector_type,StringToEnumx(cfsurfacesquare_observation_string_s[j]),7,SurfaceObservationEnum);
    213                                                 element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_weights_s[j],inputs,iomodel,cfsurfacesquare_weights_M_s[j],cfsurfacesquare_weights_N_s[j],weight_vector_type,StringToEnumx(cfsurfacesquare_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
     212                                                element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_observation_s[j],inputs,iomodel,cfsurfacesquare_observation_M_s[j],cfsurfacesquare_observation_N_s[j],obs_vector_type,StringToEnumx(cfsurfacesquare_observation_string_s[j]),SurfaceObservationEnum);
     213                                                element->DatasetInputAdd(StringToEnumx(cfsurfacesquare_definitionstring_s[j]),cfsurfacesquare_weights_s[j],inputs,iomodel,cfsurfacesquare_weights_M_s[j],cfsurfacesquare_weights_N_s[j],weight_vector_type,StringToEnumx(cfsurfacesquare_weights_string_s[j]),WeightsSurfaceObservationEnum);
    214214
    215215                                        }
     
    260260                                int         *cfssqt_weights_N_s           = NULL;
    261261                                char       **cfssqt_weights_string_s      = NULL;
    262                                 IssmDouble **cfssqt_datatimes_s           = NULL;
    263             int         *cfssqt_datatimes_M_s         = NULL;
    264             int         *cfssqt_datatimes_N_s         = NULL;
    265262
    266263                                /*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfsurfacesquaretransient.m): */
     
    268265                                iomodel->FetchMultipleData(&cfssqt_definitionstring_s,&test,"md.cfsurfacesquaretransient.definitionstring"); _assert_(test==num_cfsurfacesquaretransients);
    269266                                iomodel->FetchMultipleData(&cfssqt_model_string_s,&test,"md.cfsurfacesquaretransient.model_string"); _assert_(test==num_cfsurfacesquaretransients);
    270                                 iomodel->FetchMultipleData(&cfssqt_observations_s,&cfssqt_observations_M_s,&cfssqt_observations_N_s,NULL, "md.cfsurfacesquaretransient.observations");
    271                                 iomodel->FetchMultipleData(&cfssqt_observations_string_s, NULL,"md.cfsurfacesquaretransient.observation_string");
    272                                 iomodel->FetchMultipleData(&cfssqt_weights_s,&cfssqt_weights_M_s,&cfssqt_weights_N_s,NULL,"md.cfsurfacesquaretransient.weights");
    273                                 iomodel->FetchMultipleData(&cfssqt_weights_string_s,NULL,"md.cfsurfacesquaretransient.weights_string");
    274                                 iomodel->FetchMultipleData(&cfssqt_datatimes_s,&cfssqt_datatimes_M_s,&cfssqt_datatimes_N_s,NULL,"md.cfsurfacesquaretransient.datatimes");
     267                                iomodel->FetchMultipleData(&cfssqt_observations_s,&cfssqt_observations_M_s,&cfssqt_observations_N_s,&test, "md.cfsurfacesquaretransient.observations"); _assert_(test==num_cfsurfacesquaretransients);
     268                                iomodel->FetchMultipleData(&cfssqt_observations_string_s, &test,"md.cfsurfacesquaretransient.observations_string"); _assert_(test==num_cfsurfacesquaretransients);
     269                                iomodel->FetchMultipleData(&cfssqt_weights_s,&cfssqt_weights_M_s,&cfssqt_weights_N_s, &test,"md.cfsurfacesquaretransient.weights"); _assert_(test==num_cfsurfacesquaretransients);
     270                                iomodel->FetchMultipleData(&cfssqt_weights_string_s,&test,"md.cfsurfacesquaretransient.weights_string"); _assert_(test==num_cfsurfacesquaretransients);
    275271
    276272                                for(j=0;j<num_cfsurfacesquaretransients;j++){
    277273
    278274               /*Check that we can use P1 inputs*/
    279                                         if (cfssqt_observations_M_s[j]==iomodel->numberofvertices) _error_("only P1 fields are allowed for now");
    280                if (cfssqt_observations_M_s[j]==cfssqt_weights_M_s[j]) _error_("observations and weights do not have the same number of rows");
    281                if (cfssqt_observations_N_s[j]==cfssqt_weights_N_s[j]) _error_("observations and weights do not have the same number of columns");
    282                if (cfssqt_datatimes_M_s[j]==1) _error_("datatime should have only one row");
    283                if (cfssqt_datatimes_N_s[j]==cfssqt_weights_N_s[j]) _error_("datatime should have the same number of columns as the observations");
     275                                        if (cfssqt_observations_M_s[j]!=(iomodel->numberofvertices+1)) _error_("observations should be a P1 time series");
     276               if (cfssqt_weights_M_s[j]!=iomodel->numberofvertices+1)        _error_("weights should be a P1 time series");
     277                                        _assert_(cfssqt_observations_N_s[j]>0);
     278
     279                                        /*extract data times from last row of observations*/
     280                                        IssmDouble *datatimes = xNew<IssmDouble>(cfssqt_observations_N_s[j]);
     281                                        for(int k=0;k<cfssqt_observations_N_s[j];k++) datatimes[k] = (cfssqt_observations_s[j])[cfssqt_observations_N_s[j]*(cfssqt_weights_M_s[j]-1)+k];
    284282
    285283                                        /*First create a cfsurfacesquaretransient object for that specific string (cfssqt_model_string_s[j]):*/
    286                                         output_definitions->AddObject(new Cfsurfacesquaretransient(cfssqt_name_s[j], StringToEnumx(cfssqt_definitionstring_s[j]), StringToEnumx(cfssqt_model_string_s[j]), cfssqt_datatimes_N_s[j], cfssqt_datatimes_s[j]));
     284                                        output_definitions->AddObject(new Cfsurfacesquaretransient(cfssqt_name_s[j], StringToEnumx(cfssqt_definitionstring_s[j]), StringToEnumx(cfssqt_model_string_s[j]), cfssqt_observations_N_s[j],datatimes ));
     285                                        xDelete<IssmDouble>(datatimes);
    287286
    288287                                        /*Now, for this particular cfsurfacesquaretransient object, make sure we plug into the elements: the observation, and the weights.*/
    289288                                        for(Object* & object : elements->objects){
    290289                                                Element* element=xDynamicCast<Element*>(object);
    291                                                 _error_("need to implement transient inputs?");
    292                                                 //element->DatasetInputAdd(StringToEnumx(cfssqt_definitionstring_s[j]),cfssqt_observations_s[j],inputs,iomodel,cfssqt_observations_M_s[j],cfssqt_observations_N_s[j],obs_vector_type,StringToEnumx(cfssqt_observations_string_s[j]),7,SurfaceObservationEnum);
    293                                                 //element->DatasetInputAdd(StringToEnumx(cfssqt_definitionstring_s[j]),cfssqt_weights_s[j],inputs,iomodel,cfssqt_weights_M_s[j],cfssqt_weights_N_s[j],weight_vector_type,StringToEnumx(cfssqt_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
     290                                                element->DatasetInputAdd(StringToEnumx(cfssqt_definitionstring_s[j]),cfssqt_observations_s[j],inputs,iomodel,cfssqt_observations_M_s[j],cfssqt_observations_N_s[j],1,StringToEnumx(cfssqt_observations_string_s[j]),SurfaceObservationEnum);
     291                                                element->DatasetInputAdd(StringToEnumx(cfssqt_definitionstring_s[j]),cfssqt_weights_s[j],inputs,iomodel,cfssqt_weights_M_s[j],cfssqt_weights_N_s[j],1,StringToEnumx(cfssqt_weights_string_s[j]),WeightsSurfaceObservationEnum);
    294292
    295293                                        }
     
    320318                                xDelete<int>(cfssqt_weights_N_s);
    321319                                xDelete<char*>(cfssqt_weights_string_s);
    322                                 xDelete<IssmDouble>(cfssqt_datatimes_s);
    323320                                /*}}}*/
    324321                        }
     
    361358                                                Element* element=xDynamicCast<Element*>(object);
    362359
    363                                                 element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j],inputs,iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
     360                                                element->DatasetInputAdd(StringToEnumx(cfdragcoeffabsgrad_definitionstring_s[j]),cfdragcoeffabsgrad_weights_s[j],inputs,iomodel,cfdragcoeffabsgrad_weights_M_s[j],cfdragcoeffabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfdragcoeffabsgrad_weights_string_s[j]),WeightsSurfaceObservationEnum);
    364361
    365362                                        }
     
    423420                                                Element* element=xDynamicCast<Element*>(object);
    424421
    425                                                 element->DatasetInputAdd(StringToEnumx(cfrheologybbarabsgrad_definitionstring_s[j]),cfrheologybbarabsgrad_weights_s[j],inputs,iomodel,cfrheologybbarabsgrad_weights_M_s[j],cfrheologybbarabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfrheologybbarabsgrad_weights_string_s[j]),7,WeightsSurfaceObservationEnum);
     422                                                element->DatasetInputAdd(StringToEnumx(cfrheologybbarabsgrad_definitionstring_s[j]),cfrheologybbarabsgrad_weights_s[j],inputs,iomodel,cfrheologybbarabsgrad_weights_M_s[j],cfrheologybbarabsgrad_weights_N_s[j],weight_vector_type,StringToEnumx(cfrheologybbarabsgrad_weights_string_s[j]),WeightsSurfaceObservationEnum);
    426423
    427424                                        }
     
    506503                                                Element* element=xDynamicCast<Element*>(object);
    507504
    508                                                 element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vxobs[j],inputs,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vxobs_string[j]),7,VxObsEnum);
    509                                                         element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vyobs[j],inputs,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vyobs_string[j]),7,VyObsEnum);
    510                                                 element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_weights[j],inputs,iomodel,cfsurfacelogvel_weights_M[j],cfsurfacelogvel_weights_N[j],weight_vector_type,StringToEnumx(cfsurfacelogvel_weightstring[j]),7,WeightsSurfaceObservationEnum);
     505                                                element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vxobs[j],inputs,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vxobs_string[j]),VxObsEnum);
     506                                                        element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_vyobs[j],inputs,iomodel,cfsurfacelogvel_observation_M[j],cfsurfacelogvel_observation_N[j],obs_vector_type,StringToEnumx(cfsurfacelogvel_vyobs_string[j]),VyObsEnum);
     507                                                element->DatasetInputAdd(StringToEnumx(cfsurfacelogvel_definitionstring[j]),cfsurfacelogvel_weights[j],inputs,iomodel,cfsurfacelogvel_weights_M[j],cfsurfacelogvel_weights_N[j],weight_vector_type,StringToEnumx(cfsurfacelogvel_weightstring[j]),WeightsSurfaceObservationEnum);
    511508
    512509                                        }
     
    598595                                        for(Object* & object : elements->objects){
    599596                                                Element* element=xDynamicCast<Element*>(object);
    600                                                 element->DatasetInputAdd(StringToEnumx(cflevelsetmisfit_definitionstring_s[j]),cflevelsetmisfit_observation_s[j],inputs,iomodel,cflevelsetmisfit_observation_M_s[j],cflevelsetmisfit_observation_N_s[j],obs_vector_type,StringToEnumx(cflevelsetmisfit_observation_string_s[j]),7,LevelsetObservationEnum);
    601                                                 element->DatasetInputAdd(StringToEnumx(cflevelsetmisfit_definitionstring_s[j]),cflevelsetmisfit_weights_s[j],inputs,iomodel,cflevelsetmisfit_weights_M_s[j],cflevelsetmisfit_weights_N_s[j],weight_vector_type,StringToEnumx(cflevelsetmisfit_weights_string_s[j]),7,WeightsLevelsetObservationEnum);
     597                                                element->DatasetInputAdd(StringToEnumx(cflevelsetmisfit_definitionstring_s[j]),cflevelsetmisfit_observation_s[j],inputs,iomodel,cflevelsetmisfit_observation_M_s[j],cflevelsetmisfit_observation_N_s[j],obs_vector_type,StringToEnumx(cflevelsetmisfit_observation_string_s[j]),LevelsetObservationEnum);
     598                                                element->DatasetInputAdd(StringToEnumx(cflevelsetmisfit_definitionstring_s[j]),cflevelsetmisfit_weights_s[j],inputs,iomodel,cflevelsetmisfit_weights_M_s[j],cflevelsetmisfit_weights_N_s[j],weight_vector_type,StringToEnumx(cflevelsetmisfit_weights_string_s[j]),WeightsLevelsetObservationEnum);
    602599                                        }
    603600                                }
Note: See TracChangeset for help on using the changeset viewer.