Changeset 26252


Ignore:
Timestamp:
05/10/21 05:41:58 (4 years ago)
Author:
Cheng Gong
Message:

NEW: add an output definition for computing the misfit between two levelset functions

Location:
issm/trunk-jpl/src
Files:
3 added
6 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/Makefile.am

    r26227 r26252  
    9191        ./classes/Cfdragcoeffabsgrad.cpp \
    9292        ./classes/Cfsurfacelogvel.cpp \
     93        ./classes/Cflevelsetmisfit.cpp \
    9394        ./classes/Regionaloutput.cpp \
    9495        ./classes/Nodalvalue.cpp \
  • issm/trunk-jpl/src/c/classes/classes.h

    r26227 r26252  
    2626#include "./Cfdragcoeffabsgrad.h"
    2727#include "./Cfsurfacelogvel.h"
     28#include "./Cflevelsetmisfit.h"
    2829#include "./Masscon.h"
    2930#include "./Massconaxpby.h"
  • issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp

    r25539 r26252  
    170170                                int*         cfsurfacesquare_weights_N_s                                = NULL;
    171171                                char**       cfsurfacesquare_weights_string_s           = NULL;
    172                                 int*     cfsurfacesquare_datatime_s                             = NULL;
     172                                IssmDouble*      cfsurfacesquare_datatime_s                             = NULL;
    173173
    174174                                /*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfsurfacesquare.m): */
     
    241241                                xDelete<int>(cfsurfacesquare_weights_N_s);
    242242                                xDelete<char*>(cfsurfacesquare_weights_string_s);
    243                                 xDelete<int>(cfsurfacesquare_datatime_s);
     243                                xDelete<IssmDouble>(cfsurfacesquare_datatime_s);
    244244                                /*}}}*/
    245245                        }
     
    323323                                int*         cfsurfacelogvel_weights_N                          = NULL;
    324324                                char**       cfsurfacelogvel_weightstring               = NULL;
    325                                 int*                            cfsurfacelogvel_datatime                                = NULL;
     325                                IssmDouble*  cfsurfacelogvel_datatime                           = NULL;
    326326
    327327                                /*Fetch name, modeltring, observation, observationtring, etc ... (see src/m/classes/cfsurfacelogvel.m): */
     
    399399                                xDelete<int>(cfsurfacelogvel_weights_N);
    400400                                xDelete<char*>(cfsurfacelogvel_weightstring);
    401                                 xDelete<int>(cfsurfacelogvel_datatime);
     401                                xDelete<IssmDouble>(cfsurfacelogvel_datatime);
     402                                /*}}}*/
     403                        }
     404                        else if (output_definition_enums[i]==CflevelsetmisfitEnum){
     405                                /*Deal with cflevelsetmisfit: {{{*/
     406
     407                                /*cflevelsetmisfit variables: */
     408                                int          num_cflevelsetmisfits;
     409                                char**       cflevelsetmisfit_name_s                                            = NULL;   
     410                                char**           cflevelsetmisfit_definitionstring_s            = NULL;   
     411                                char**       cflevelsetmisfit_model_string_s                    = NULL;
     412                                IssmDouble** cflevelsetmisfit_observation_s                     = NULL;
     413                                char**           cflevelsetmisfit_observation_string_s  = NULL;
     414                                int*         cflevelsetmisfit_observation_M_s                   = NULL;
     415                                int*         cflevelsetmisfit_observation_N_s                   = NULL;
     416                                IssmDouble** cflevelsetmisfit_weights_s                                 = NULL;
     417                                int*         cflevelsetmisfit_weights_M_s                               = NULL;
     418                                int*         cflevelsetmisfit_weights_N_s                               = NULL;
     419                                char**       cflevelsetmisfit_weights_string_s          = NULL;
     420                                IssmDouble*      cflevelsetmisfit_datatime_s                            = NULL;
     421
     422                                /*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cflevelsetmisfit.m): */
     423                                iomodel->FetchMultipleData(&cflevelsetmisfit_name_s,&num_cflevelsetmisfits,                                                        "md.cflevelsetmisfit.name");
     424                                iomodel->FetchMultipleData(&cflevelsetmisfit_definitionstring_s,&num_cflevelsetmisfits,                                            "md.cflevelsetmisfit.definitionstring");
     425                                iomodel->FetchMultipleData(&cflevelsetmisfit_model_string_s,&num_cflevelsetmisfits,                                                "md.cflevelsetmisfit.model_string");
     426                                iomodel->FetchMultipleData(&cflevelsetmisfit_observation_s,&cflevelsetmisfit_observation_M_s,&cflevelsetmisfit_observation_N_s,&num_cflevelsetmisfits, "md.cflevelsetmisfit.observation");
     427                                iomodel->FetchMultipleData(&cflevelsetmisfit_observation_string_s,&num_cflevelsetmisfits,                                          "md.cflevelsetmisfit.observation_string");
     428                                iomodel->FetchMultipleData(&cflevelsetmisfit_weights_s,&cflevelsetmisfit_weights_M_s,&cflevelsetmisfit_weights_N_s,&num_cflevelsetmisfits,             "md.cflevelsetmisfit.weights");
     429                                iomodel->FetchMultipleData(&cflevelsetmisfit_weights_string_s,&num_cflevelsetmisfits,                                              "md.cflevelsetmisfit.weights_string");
     430                                iomodel->FetchMultipleData(&cflevelsetmisfit_datatime_s,&num_cflevelsetmisfits,                                                                                                                                  "md.cflevelsetmisfit.datatime");
     431
     432                                for(j=0;j<num_cflevelsetmisfits;j++){
     433                                        int obs_vector_type=0;
     434                                        if ((cflevelsetmisfit_observation_M_s[j]==iomodel->numberofvertices) || (cflevelsetmisfit_observation_M_s[j]==iomodel->numberofvertices+1)){
     435                                                obs_vector_type=1;
     436                                        }
     437                                        else if ((cflevelsetmisfit_observation_M_s[j]==iomodel->numberofelements) || (cflevelsetmisfit_observation_M_s[j]==iomodel->numberofelements+1)){
     438                                                obs_vector_type=2;
     439                                        }
     440                                        else
     441                                         _error_("cflevelsetmisfit observation size not supported yet");
     442
     443                                        int weight_vector_type=0;
     444                                        if ((cflevelsetmisfit_weights_M_s[j]==iomodel->numberofvertices) || (cflevelsetmisfit_weights_M_s[j]==iomodel->numberofvertices+1)){
     445                                                weight_vector_type=1;
     446                                        }
     447                                        else if ((cflevelsetmisfit_weights_M_s[j]==iomodel->numberofelements) || (cflevelsetmisfit_weights_M_s[j]==iomodel->numberofelements+1)){
     448                                                weight_vector_type=2;
     449                                        }
     450                                        else
     451                                         _error_("cflevelsetmisfit weight size not supported yet");
     452
     453                                        /*First create a cflevelsetmisfit object for that specific string (cflevelsetmisfit_model_string_s[j]):*/
     454                                        output_definitions->AddObject(new Cflevelsetmisfit(cflevelsetmisfit_name_s[j],StringToEnumx(cflevelsetmisfit_definitionstring_s[j]),StringToEnumx(cflevelsetmisfit_model_string_s[j]),StringToEnumx(cflevelsetmisfit_observation_string_s[j]),StringToEnumx(cflevelsetmisfit_weights_string_s[j]),cflevelsetmisfit_datatime_s[j],false));
     455
     456                                        /*Now, for this particular cflevelsetmisfit object, make sure we plug into the elements: the observation, and the weights.*/
     457                                        for(Object* & object : elements->objects){
     458                                                Element* element=xDynamicCast<Element*>(object);
     459                                                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);
     460                                                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);
     461                                        }
     462                                }
     463
     464                                  /*Free ressources:*/
     465                                for(j=0;j<num_cflevelsetmisfits;j++){
     466                                        char* string=NULL;
     467                                        IssmDouble* matrix = NULL;
     468
     469                                        string = cflevelsetmisfit_definitionstring_s[j];                xDelete<char>(string);
     470                                        string = cflevelsetmisfit_observation_string_s[j];      xDelete<char>(string);
     471                                        string = cflevelsetmisfit_model_string_s[j];                    xDelete<char>(string);
     472                                        string = cflevelsetmisfit_weights_string_s[j];          xDelete<char>(string);
     473                                        string = cflevelsetmisfit_name_s[j];    xDelete<char>(string);
     474                                        matrix = cflevelsetmisfit_observation_s[j]; xDelete<IssmDouble>(matrix);
     475                                        matrix = cflevelsetmisfit_weights_s[j]; xDelete<IssmDouble>(matrix);
     476                                }
     477                                xDelete<char*>(cflevelsetmisfit_name_s);
     478                                xDelete<char*>(cflevelsetmisfit_model_string_s);
     479                                xDelete<char*>(cflevelsetmisfit_definitionstring_s);
     480                                xDelete<IssmDouble*>(cflevelsetmisfit_observation_s);
     481                                xDelete<char*>(cflevelsetmisfit_observation_string_s);
     482                                xDelete<int>(cflevelsetmisfit_observation_M_s);
     483                                xDelete<int>(cflevelsetmisfit_observation_N_s);
     484                                xDelete<IssmDouble*>(cflevelsetmisfit_weights_s);
     485                                xDelete<int>(cflevelsetmisfit_weights_M_s);
     486                                xDelete<int>(cflevelsetmisfit_weights_N_s);
     487                                xDelete<char*>(cflevelsetmisfit_weights_string_s);
     488                                xDelete<IssmDouble>(cflevelsetmisfit_datatime_s);
    402489                                /*}}}*/
    403490                        }
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26242 r26252  
    707707        LevelsetfunctionSlopeXEnum,
    708708        LevelsetfunctionSlopeYEnum,
     709        LevelsetObservationEnum,
    709710        LoadingforceXEnum,
    710711        LoadingforceYEnum,
     
    712713        MaskOceanLevelsetEnum,
    713714        MaskIceLevelsetEnum,
     715        MaskIceRefLevelsetEnum,
    714716        MasstransportSpcthicknessEnum,
    715717        MaterialsRheologyBEnum,
     
    10121014        WaterfractionEnum,
    10131015        WaterheightEnum,
     1016        WeightsLevelsetObservationEnum,
    10141017        WeightsSurfaceObservationEnum,
    10151018        OldAccumulatedDeltaBottomPressureEnum,
     
    11571160        CfsurfacelogvelEnum,
    11581161        CfsurfacesquareEnum,
     1162        CflevelsetmisfitEnum,
    11591163        ChannelEnum,
    11601164        ChannelAreaEnum,
  • issm/trunk-jpl/src/m/classes/cfsurfacelogvel.m

    r25405 r26252  
    101101                WriteData(fid,prefix,'data',self.weights,'name','md.cfsurfacelogvel.weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
    102102                WriteData(fid,prefix,'data',self.weights_string,'name','md.cfsurfacelogvel.weights_string','format','String');
    103                 WriteData(fid,prefix,'data',round(self.datatime*md.constants.yts),'name','md.cfsurfacelogvel.datatime','format','Integer');
     103                WriteData(fid,prefix,'data',round(self.datatime*md.constants.yts),'name','md.cfsurfacelogvel.datatime','format','Double');
    104104                end % }}}
    105105        end
  • issm/trunk-jpl/src/m/classes/cfsurfacesquare.m

    r22508 r26252  
    9898                WriteData(fid,prefix,'data',self.weights,'name','md.cfsurfacesquare.weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
    9999                WriteData(fid,prefix,'data',self.weights_string,'name','md.cfsurfacesquare.weights_string','format','String');
    100                 WriteData(fid,prefix,'data',round(self.datatime*md.constants.yts),'name','md.cfsurfacesquare.datatime','format','Integer');
     100                WriteData(fid,prefix,'data',round(self.datatime*md.constants.yts),'name','md.cfsurfacesquare.datatime','format','Double');
    101101                end % }}}
    102102        end
Note: See TracChangeset for help on using the changeset viewer.