Changeset 26837


Ignore:
Timestamp:
Jan 29, 2022, 12:15:51 PM (5 years ago)
Author:
vverjans
Message:

NEW: added stochasticforcing for autoregressionlinearbasalforcings

Location:
issm/trunk-jpl
Files:
2 added
8 edited

Legend:

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

    r26836 r26837  
    221221                case AutoregressionLinearFloatingMeltRateEnum:
    222222                        iomodel->FetchDataToInput(inputs,elements,"md.basalforcings.basin_id",BasalforcingsLinearBasinIdEnum);
     223                        if(isstochastic) iomodel->FetchDataToInput(inputs,elements,"md.stochasticforcing.default_id",StochasticForcingDefaultIdEnum);
    223224                        break;
    224225                default:
  • issm/trunk-jpl/src/c/modules/StochasticForcingx/StochasticForcingx.cpp

    r26825 r26837  
    1111void StochasticForcingx(FemModel* femmodel){/*{{{*/
    1212
    13 
    14         //VV testing (12Nov)
    15         /*
    16         IssmDouble timeVV,dtVV,starttimeVV;
    17         femmodel->parameters->FindParam(&timeVV,TimeEnum);
    18    femmodel->parameters->FindParam(&dtVV,TimesteppingTimeStepEnum);
    19    femmodel->parameters->FindParam(&starttimeVV,TimesteppingStartTimeEnum);
    20         IssmDouble valMean = 0;
    21         IssmDouble valSdev = 0.5;
    22         int seed;
    23         //seed = reCast<int,IssmDouble>((timeVV-starttimeVV)/dtVV);
    24         seed = -1;
    25         IssmDouble rdmVV;
    26         univariateNormal_test0(&rdmVV,valMean,valSdev,seed);
    27         _printf_("VV rdmVV: "<<rdmVV<<'\n');
    28         */
    2913
    3014   /*Retrieve parameters*/
    … …  
    7357
    7458                /*Deal with the autoregressive models*/
    75                 if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum){
     59                if(fields[j]==SMBautoregressionEnum || fields[j]==FrontalForcingsRignotAutoregressionEnum || fields[j]==BasalforcingsDeepwaterMeltingRateAutoregressionEnum){
    7660                        switch(fields[j]){
    7761                                case SMBautoregressionEnum:
    … …  
    8266                                        dimenum_type   = FrontalForcingsBasinIdEnum;
    8367                                        noiseenum_type = ThermalforcingAutoregressionNoiseEnum;
     68                                        break;
     69                                case BasalforcingsDeepwaterMeltingRateAutoregressionEnum:
     70                                        dimenum_type   = BasalforcingsLinearBasinIdEnum;
     71                                        noiseenum_type = BasalforcingsDeepwaterMeltingRateNoiseEnum;
    8472                                        break;
    8573                        }
    … …  
    9886                                case SMBautoregressionEnum:
    9987                                case FrontalForcingsRignotAutoregressionEnum:
     88                                case BasalforcingsDeepwaterMeltingRateAutoregressionEnum:
    10089                                        /*Already done above*/
    10190                                        break;
    … …  
    185174                                        }
    186175                                        break;
    187                                 //VV working(29Nov2021)
    188176                                case FrictionWaterPressureEnum:
    189177                                        /*Specify that WaterPressure is stochastic*/
    … …  
    208196                                        }
    209197                                        break;
    210 
    211                                 /*
    212                                 case FrictionEffectivePressureEnum:
    213                                         femmodel->parameters->SetParam(true,StochasticForcingIsEffectivePressureEnum);
    214                                         for(Object* &object:femmodel->elements->objects){
    215                   Element* element = xDynamicCast<Element*>(object);
    216                   int numvertices  = element->GetNumberOfVertices();
    217                   IssmDouble Neff[numvertices];
    218                                                 element->GetInputValue(&dimensionid,StochasticForcingDefaultIdEnum);
    219                                                 Gauss* gauss=element->NewGauss();
    220                                                 Friction* friction = new Friction(element);
    221                                                 for(int i=0;i<numvertices;i++){
    222                                                         gauss->GaussVertex(i);
    223                                                         Neff[i] = friction->EffectivePressure(gauss);
    224                                                         Neff[i] = Neff[i]+noisefield[dimensionid];
    225                                                 }
    226                                                 element->AddInput(FrictionEffectivePressureEnum,Neff,P1DGEnum);
    227                                                 delete gauss;
    228                                                 delete friction;
    229                                         }
    230                                         break;
    231                                 */
    232 
    233198                                default:
    234199                                        _error_("Field "<<EnumToStringx(fields[j])<<" does not support stochasticity yet.");
  • issm/trunk-jpl/src/c/shared/Enum/Enum.vim

    r26836 r26837  
    7373syn keyword cConstant BasalforcingsDeepwaterElevationEnum
    7474syn keyword cConstant BasalforcingsDeepwaterMeltingRateEnum
    75 syn keyword cConstant BasalforcingsDeepwaterMeltingRateNoiseEnum
    7675syn keyword cConstant BasalforcingsDtbgEnum
    7776syn keyword cConstant BasalforcingsEnum
    … …  
    603602syn keyword cConstant BasalCrevasseEnum
    604603syn keyword cConstant BasalforcingsDeepwaterMeltingRateAutoregressionEnum
     604syn keyword cConstant BasalforcingsDeepwaterMeltingRateNoiseEnum
    605605syn keyword cConstant BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum
    606606syn keyword cConstant BasalforcingsFloatingiceMeltingRateEnum
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r26836 r26837  
    6767        BasalforcingsDeepwaterElevationEnum,
    6868        BasalforcingsDeepwaterMeltingRateEnum,
    69         BasalforcingsDeepwaterMeltingRateNoiseEnum,
    7069        BasalforcingsDtbgEnum,
    7170        BasalforcingsEnum,
    … …  
    599598        BasalCrevasseEnum,
    600599        BasalforcingsDeepwaterMeltingRateAutoregressionEnum,
     600        BasalforcingsDeepwaterMeltingRateNoiseEnum,
    601601        BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum,
    602602        BasalforcingsFloatingiceMeltingRateEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r26836 r26837  
    7575                case BasalforcingsDeepwaterElevationEnum : return "BasalforcingsDeepwaterElevation";
    7676                case BasalforcingsDeepwaterMeltingRateEnum : return "BasalforcingsDeepwaterMeltingRate";
    77                 case BasalforcingsDeepwaterMeltingRateNoiseEnum : return "BasalforcingsDeepwaterMeltingRateNoise";
    7877                case BasalforcingsDtbgEnum : return "BasalforcingsDtbg";
    7978                case BasalforcingsEnum : return "Basalforcings";
    … …  
    605604                case BasalCrevasseEnum : return "BasalCrevasse";
    606605                case BasalforcingsDeepwaterMeltingRateAutoregressionEnum : return "BasalforcingsDeepwaterMeltingRateAutoregression";
     606                case BasalforcingsDeepwaterMeltingRateNoiseEnum : return "BasalforcingsDeepwaterMeltingRateNoise";
    607607                case BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum : return "BasalforcingsDeepwaterMeltingRateValuesAutoregression";
    608608                case BasalforcingsFloatingiceMeltingRateEnum : return "BasalforcingsFloatingiceMeltingRate";
  • issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim

    r26836 r26837  
    6666syn keyword juliaConstC BasalforcingsDeepwaterElevationEnum
    6767syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateEnum
    68 syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateNoiseEnum
    6968syn keyword juliaConstC BasalforcingsDtbgEnum
    7069syn keyword juliaConstC BasalforcingsEnum
    … …  
    596595syn keyword juliaConstC BasalCrevasseEnum
    597596syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateAutoregressionEnum
     597syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateNoiseEnum
    598598syn keyword juliaConstC BasalforcingsDeepwaterMeltingRateValuesAutoregressionEnum
    599599syn keyword juliaConstC BasalforcingsFloatingiceMeltingRateEnum
  • issm/trunk-jpl/src/m/classes/stochasticforcing.m

    r26825 r26837  
    8484                                        end
    8585                                end
     86                                if(contains(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
     87                                        mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
     88                                        if~(isequal(class(md.basalforcings),char(mdname)))
     89                                                error('md.basalforcings does not agree with stochasticforcing field %s', char(field));
     90                                        end
     91                                end
    8692                                if(contains(field,'WaterPressure'))
    8793               mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field))));
    … …  
    97103            end
    98104                                %Checking for specific dimensions
    99                                 if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression'))
     105                                if ~(strcmp(field,'SMBautoregression') || strcmp(field,'FrontalForcingsRignotAutoregression') || strcmp(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
    100106                                        checkdefaults = true; %field with non-specific dimensionality
    101107                                end
    102108                        end
    103109
    104                         %Retrieve sum of all the field dimensionalities
    105                         size_tot        = self.defaultdimension*num_fields;
    106                         indSMBar        = -1; %about to check for index of SMBautoregression
    107                         indTFar = -1; %about to check for index of FrontalForcingsRignotAutoregression
     110                        %Retrieve all the field dimensionalities
     111                        dimensions = self.defaultdimension*ones(1,num_fields);
     112                        indSMBar   = -1; %about to check for index of SMBautoregression
     113                        indTFar   = -1; %about to check for index of FrontalForcingsRignotAutoregression
     114                        indBDWar          = -1; %about to check for index of BasalforcingsDeepwaterMeltingRateAutoregression
    108115                        if any(contains(self.fields,'SMBautoregression'))
    109                                 size_tot = size_tot-self.defaultdimension+md.smb.num_basins;
    110                                 indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with TFar timestep (08Nov2021)
     116                                indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with other ar timesteps
     117                                dimensions(indSMBar) = md.smb.num_basins;
    111118                        end
    112119                        if any(contains(self.fields,'FrontalForcingsRignotAutoregression'))
    113                                 size_tot        = size_tot-self.defaultdimension+md.frontalforcings.num_basins;
    114                                 indTFar = find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with SMBar timestep (08Nov2021)
    115                         end
     120                                indTFar = find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with other ar timesteps
     121                                dimensions(indTFar) = md.frontalforcings.num_basins;
     122                        end
     123                        if any(contains(self.fields,'BasalforcingsDeepwaterMeltingRateAutoregression'))
     124                                indBDWar        = find(contains(self.fields,'BasalforcingsDeepwaterMeltingRateAutoregression')); %index of BDWar, now check for consistency with other ar timesteps
     125                                dimensions(indBDWar) = md.basalforcings.num_basins;
     126                        end
     127                        size_tot = sum(dimensions);
    116128
    117129                        if(indSMBar~=-1 && indTFar~=-1) %both autoregressive models are used: check autoregressive time step consistency
    118                                 if((md.smb.ar_timestep~=md.frontalforcings.ar_timestep) && any(self.covariance(1+sum(self.dimensions(1:indSMBar-1)):sum(self.dimensions(1:indSMBar)),1+sum(self.dimensions(1:indTFar-1)):sum(self.dimensions(1:indTFar))))~=0)
     130                                if((md.smb.ar_timestep~=md.frontalforcings.ar_timestep) && any(self.covariance(1+sum(dimensions(1:indSMBar-1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indTFar-1)):sum(dimensions(1:indTFar))),'all')~=0)
    119131                                        error('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance');
    120132                                end
    121133                        end
    122 
     134                        if(indSMBar~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressive time step consistency
     135                                if((md.smb.ar_timestep~=md.basalforcings.ar_timestep) && any(self.covariance(1+sum(dimensions(1:indSMBar-1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),'all')~=0)
     136                                        error('SMBautoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');
     137                                end
     138                        end
     139                        if(indTFar~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressive time step consistency
     140                                if((md.frontalforcings.ar_timestep~=md.basalforcings.ar_timestep) && any(self.covariance(1+sum(dimensions(1:indTFar-1)):sum(dimensions(1:indTFar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),'all')~=0)
     141                                        error('FrontalForcingsRignotAutoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');
     142                                end
     143                        end
    123144                        md = checkfield(md,'fieldname','stochasticforcing.isstochasticforcing','values',[0 1]);
    124145                        md = checkfield(md,'fieldname','stochasticforcing.fields','numel',num_fields,'cell',1,'values',supportedstochforcings());
    … …  
    164185                                                dimensions(ind) = md.frontalforcings.num_basins;
    165186                                        end
     187                                        if(strcmp(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))
     188                                                dimensions(ind) = md.basalforcings.num_basins;
     189                                        end
    166190                                        ind = ind+1;
    167191                                end
    168192
    169193                                %Scaling covariance matrix (scale column-by-column and row-by-row)
    170                                 scaledfields = {'BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBautoregression','SMBforcing'}; %list of fields that need scaling *1/yts
     194                                scaledfields = {'BasalforcingsDeepwaterMeltingRateAutoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBautoregression','SMBforcing'}; %list of fields that need scaling *1/yts
    171195                                tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable
    172196                                for i=1:num_fields
    … …  
    185209                                        self.default_id = zeros(md.mesh.numberofelements,1);
    186210                                end
     211
    187212                                WriteData(fid,prefix,'data',num_fields,'name','md.stochasticforcing.num_fields','format','Integer');
    188213                                WriteData(fid,prefix,'object',self,'fieldname','fields','format','StringArray');
    … …  
    207232        % supported and corresponding md names
    208233        structure.fields = {...
     234                'BasalforcingsDeepwaterMeltingRateAutoregression',...
    209235                'BasalforcingsSpatialDeepwaterMeltingRate',...
    210236                'DefaultCalving',...
    … …  
    216242                };
    217243        structure.mdnames = {...
     244                'autoregressionlinearbasalforcings',...
    218245                'spatiallinearbasalforcings',...
    219246                'calving',...
  • issm/trunk-jpl/src/m/classes/stochasticforcing.py

    r26825 r26837  
    9090                if (type(md.basalforcings).__name__ != mdname):
    9191                    raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field))
    92             if 'BasalforcingsDpatialDeepwaterMeltingRate' in field:
     92            if 'BasalforcingsSpatialDeepwaterMeltingRate' in field:
     93                mdname = structstoch[field]
     94                if (type(md.basalforcings).__name__ != mdname):
     95                    raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field))
     96            if 'BasalforcingsDeepwaterMeltingRateAutoregression' in field:
    9397                mdname = structstoch[field]
    9498                if (type(md.basalforcings).__name__ != mdname):
    … …  
    104108
    105109            # Checking for specific dimensions
    106             if field not in['SMBautoregression', 'FrontalForcingsRignotAutoregression']:
     110            if field not in['SMBautoregression', 'FrontalForcingsRignotAutoregression','BasalforcingsDeepwaterMeltingRateAutoregression']:
    107111                checkdefaults = True  # field with non-specific dimensionality
    108112
    109113        # Retrieve sum of all the field dimensionalities
    110         size_tot = self.defaultdimension * num_fields
    111         indSMBar = -1  # About to check for index of SMBautoregression
    112         indTFar = -1  # About to check for index of FrontalForcingsRignotAutoregression
     114        dimensions = self.defaultdimension*np.ones((num_fields))
     115        indSMBar   = -1  # About to check for index of SMBautoregression
     116        indTFar    = -1  # About to check for index of FrontalForcingsRignotAutoregression
     117        indBDWar   = -1  # About to check for index of BasalforcingsDeepwaterMeltingRateAutoregression
    113118        if ('SMBautoregression' in self.fields):
    114             size_tot = size_tot - self.defaultdimension + md.smb.num_basins
    115             indSMBar = self.fields.index('SMBautoregression')  # Index of SMBar, now check for consistency with TFar timestep (08Nov2021)
     119            indSMBar = self.fields.index('SMBautoregression')  # Index of SMBar, now check for consistency with other timesteps
     120            dimensions[indSMBar] = md.smb.num_basins
    116121        if ('FrontalForcingsRignotAutoregression' in self.fields):
    117             size_tot = size_tot - self.defaultdimension + md.frontalforcings.num_basins
    118             indTFar = self.fields.index('FrontalForcingsRignotAutoregression')  # Index of TFar, now check for consistency with SMBar timestep (08Nov2021)
     122            indTFar = self.fields.index('FrontalForcingsRignotAutoregression')  # Index of TFar, now check for consistency with other timesteps
     123            dimensions[indTFar] = md.frontalforcings.num_basins
     124        if ('BasalforcingsDeepwaterMeltingRateAutoregression' in self.fields):
     125            indBDWar = self.fields.index('BasalforcingsDeepwaterMeltingRateAutoregression')  # Index of BDWar, now check for consistency with other timesteps
     126            dimensions[indTFar] = md.basalforcings.num_basins
     127        size_tot = np.sum(dimensions)
     128
    119129        if (indSMBar != -1 and indTFar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
    120             covsum = self.covariance[np.sum(self.defaultdimensions[0:indSMBar]).astype(int):np.sum(self.defaultdimensions[0:indSMBar + 1]).astype(int), np.sum(self.defaultdimensions[0:indTFar]).astype(int):np.sum(self.defaultdimensions[0:indTFar + 1]).astype(int)]
     130            covsum = self.covariance[np.sum(dimensions[0:indSMBar]).astype(int):np.sum(dimensions[0:indSMBar + 1]).astype(int), np.sum(dimensions[0:indTFar]).astype(int):np.sum(dimensions[0:indTFar + 1]).astype(int)]
    121131            if((md.smb.ar_timestep != md.frontalforcings.ar_timestep) and np.any(covsum != 0)):
    122132                raise IOError('SMBautoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance')
     133        if (indSMBar != -1 and indBDWar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
     134            covsum = self.covariance[np.sum(dimensions[0:indSMBar]).astype(int):np.sum(dimensions[0:indSMBar + 1]).astype(int), np.sum(dimensions[0:indBDWar]).astype(int):np.sum(dimensions[0:indBDWar + 1]).astype(int)]
     135            if((md.smb.ar_timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):
     136                raise IOError('SMBautoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')
     137        if (indTFar != -1 and indBDWar != -1):  # Both autoregressive models are used: check autoregressive time step consistency
     138            covsum = self.covariance[np.sum(dimensions[0:indTFar]).astype(int):np.sum(dimensions[0:indTFar + 1]).astype(int), np.sum(dimensions[0:indBDWar]).astype(int):np.sum(dimensions[0:indBDWar + 1]).astype(int)]
     139            if((md.frontalforcings.ar_timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):
     140                raise IOError('FrontalForcingsRignotAutoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')
    123141
    124142        md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1])
    … …  
    153171                if (field == 'FrontalForcingsRignotAutoregression'):
    154172                    dimensions[ind] = md.frontalforcings.num_basins
     173                if (field == 'BasalforcingsDeepwaterMeltingRateAutoregression'):
     174                    dimensions[ind] = md.basalforcings.num_basins
    155175
    156176            # Scaling covariance matrix (scale column-by-column and row-by-row)
    157             scaledfields = ['BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBautoregression', 'SMBforcing']  # list of fields that need scaling * 1/yts
     177            scaledfields = ['BasalforcingsDeepwaterMeltingRateAutoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBautoregression', 'SMBforcing']  # list of fields that need scaling * 1/yts
    158178            tempcovariance = np.copy(self.covariance)
    159179            for i in range(num_fields):
    … …  
    191211           supported and corresponding md names
    192212        """
    193         structure = {'BasalforcingsSpatialDeepwaterMeltingRate': 'spatiallinearbasalforcings',
     213        structure = {'BasalforcingsDeepwaterMeltingRateAutoregression': 'autoregressionlinearbasalforcings',
     214                     'BasalforcingsSpatialDeepwaterMeltingRate': 'spatiallinearbasalforcings',
    194215                     'DefaultCalving': 'calving',
    195216                     'FloatingMeltRate': 'basalforcings',
Note: See TracChangeset for help on using the changeset viewer.