Changeset 27251
- Timestamp:
- 08/31/22 06:32:32 (3 years ago)
- Location:
- issm/trunk-jpl/src/m/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/stochasticforcing.m
r27165 r27251 52 52 for field=self.fields 53 53 %Checking agreement of classes 54 if(contains(field,'SMBa utoregression'))54 if(contains(field,'SMBarma')) 55 55 mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field)))); 56 56 if~(isequal(class(md.smb),char(mdname))) … … 88 88 end 89 89 end 90 if(contains(field,'BasalforcingsDeepwaterMeltingRate Autoregression'))90 if(contains(field,'BasalforcingsDeepwaterMeltingRatearma')) 91 91 mdname = structstoch.mdnames(find(strcmp(structstoch.fields,char(field)))); 92 92 if~(isequal(class(md.basalforcings),char(mdname))) … … 111 111 end 112 112 %Checking for specific dimensions 113 if ~(strcmp(field,'SMBa utoregression') || strcmp(field,'FrontalForcingsRignotAutoregression') || strcmp(field,'BasalforcingsDeepwaterMeltingRateAutoregression'))113 if ~(strcmp(field,'SMBarma') || strcmp(field,'FrontalForcingsRignotarma') || strcmp(field,'BasalforcingsDeepwaterMeltingRatearma')) 114 114 checkdefaults = true; %field with non-specific dimensionality 115 115 end … … 118 118 %Retrieve all the field dimensionalities 119 119 dimensions = self.defaultdimension*ones(1,num_fields); 120 indSMBar = -1; %about to check for index of SMBautoregression121 indTFar = -1; %about to check for index of FrontalForcingsRignotAutoregression122 indBDWar = -1; %about to check for index of BasalforcingsDeepwaterMeltingRateAutoregression123 if any(contains(self.fields,'SMBa utoregression'))124 indSMBar = find(contains(self.fields,'SMBautoregression')); %index of SMBar, now check for consistency with other artimesteps125 dimensions(indSMBar ) = md.smb.num_basins;126 if(md.smb.ar _timestep<self.stochastictimestep)127 error('SMBa utoregressioncannot have a timestep shorter than stochastictimestep');128 end 129 end 130 if any(contains(self.fields,'FrontalForcingsRignot Autoregression'))131 indTFar = find(contains(self.fields,'FrontalForcingsRignotAutoregression')); %index of TFar, now check for consistency with other artimesteps132 dimensions(indTFar ) = md.frontalforcings.num_basins;133 if(md.frontalforcings.ar _timestep<self.stochastictimestep)134 error('FrontalForcingsRignot Autoregressioncannot have a timestep shorter than stochastictimestep');135 end 136 end 137 if any(contains(self.fields,'BasalforcingsDeepwaterMeltingRate Autoregression'))138 indBDWar = find(contains(self.fields,'BasalforcingsDeepwaterMeltingRateAutoregression')); %index of BDWar, now check for consistency with other artimesteps139 dimensions(indBDWar ) = md.basalforcings.num_basins;140 if(md.basalforcings.ar _timestep<self.stochastictimestep)141 error('BasalforcingsDeepwaterMeltingRate Autoregressioncannot have a timestep shorter than stochastictimestep');120 indSMBarma = -1; %about to check for index of SMBarma 121 indTFarma = -1; %about to check for index of FrontalForcingsRignotarma 122 indBDWarma = -1; %about to check for index of BasalforcingsDeepwaterMeltingRatearma 123 if any(contains(self.fields,'SMBarma')) 124 indSMBarma = find(contains(self.fields,'SMBarma')); %index of SMBarma, now check for consistency with other arma timesteps 125 dimensions(indSMBarma) = md.smb.num_basins; 126 if(md.smb.arma_timestep<self.stochastictimestep) 127 error('SMBarma cannot have a timestep shorter than stochastictimestep'); 128 end 129 end 130 if any(contains(self.fields,'FrontalForcingsRignotarma')) 131 indTFarma = find(contains(self.fields,'FrontalForcingsRignotarma')); %index of TFarma, now check for consistency with other arma timesteps 132 dimensions(indTFarma) = md.frontalforcings.num_basins; 133 if(md.frontalforcings.arma_timestep<self.stochastictimestep) 134 error('FrontalForcingsRignotarma cannot have a timestep shorter than stochastictimestep'); 135 end 136 end 137 if any(contains(self.fields,'BasalforcingsDeepwaterMeltingRatearma')) 138 indBDWarma = find(contains(self.fields,'BasalforcingsDeepwaterMeltingRatearma')); %index of BDWarma, now check for consistency with other arma timesteps 139 dimensions(indBDWarma) = md.basalforcings.num_basins; 140 if(md.basalforcings.arma_timestep<self.stochastictimestep) 141 error('BasalforcingsDeepwaterMeltingRatearma cannot have a timestep shorter than stochastictimestep'); 142 142 end 143 143 end 144 144 size_tot = sum(dimensions); 145 145 146 if(indSMBar ~=-1 && indTFar~=-1) %both autoregressive models are used: check autoregressivetime step consistency147 if(md.smb.ar _timestep~=md.frontalforcings.ar_timestep)148 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBar -1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indTFar-1)):sum(dimensions(1:indTFar))),1,[]);146 if(indSMBarma~=-1 && indTFarma~=-1) %both ARMA models are used: check ARMA time step consistency 147 if(md.smb.arma_timestep~=md.frontalforcings.arma_timestep) 148 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 149 149 if any(crossentries~=0) 150 error('SMBa utoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance');151 end 152 end 153 end 154 if(indSMBar ~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressivetime step consistency155 if(md.smb.ar _timestep~=md.basalforcings.ar_timestep)156 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBar -1)):sum(dimensions(1:indSMBar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),1,[]);150 error('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance'); 151 end 152 end 153 end 154 if(indSMBarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency 155 if(md.smb.arma_timestep~=md.basalforcings.arma_timestep) 156 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 157 157 if any(crossentries~=0) 158 error('SMBa utoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');159 end 160 end 161 end 162 if(indTFar ~=-1 && indBDWar~=-1) %both autoregressive models are used: check autoregressivetime step consistency163 if(md.frontalforcings.ar _timestep~=md.basalforcings.ar_timestep)164 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFar -1)):sum(dimensions(1:indTFar)),1+sum(dimensions(1:indBDWar-1)):sum(dimensions(1:indBDWar))),1,[]);158 error('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 159 end 160 end 161 end 162 if(indTFarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency 163 if(md.frontalforcings.arma_timestep~=md.basalforcings.arma_timestep) 164 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 165 165 if any(crossentries~=0) 166 error('FrontalForcingsRignot Autoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance');166 error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 167 167 end 168 168 end … … 181 181 disp(sprintf(' stochasticforcing parameters:')); 182 182 fielddisplay(self,'isstochasticforcing','is stochasticity activated?'); 183 fielddisplay(self,'fields','fields with stochasticity applied, ex: [{''SMBa utoregression''}], or [{''SMBforcing''},{''DefaultCalving''}]');183 fielddisplay(self,'fields','fields with stochasticity applied, ex: [{''SMBarma''}], or [{''SMBforcing''},{''DefaultCalving''}]'); 184 184 fielddisplay(self,'defaultdimension','dimensionality of the noise terms (does not apply to fields with their specific dimension)'); 185 185 fielddisplay(self,'default_id','id of each element for partitioning of the noise terms (does not apply to fields with their specific partition)'); … … 212 212 for field=self.fields 213 213 %Checking for specific dimensions 214 if(strcmp(field,'SMBa utoregression'))214 if(strcmp(field,'SMBarma')) 215 215 dimensions(ind) = md.smb.num_basins; 216 216 end 217 if(strcmp(field,'FrontalForcingsRignot Autoregression'))217 if(strcmp(field,'FrontalForcingsRignotarma')) 218 218 dimensions(ind) = md.frontalforcings.num_basins; 219 219 end 220 if(strcmp(field,'BasalforcingsDeepwaterMeltingRate Autoregression'))220 if(strcmp(field,'BasalforcingsDeepwaterMeltingRatearma')) 221 221 dimensions(ind) = md.basalforcings.num_basins; 222 222 end … … 225 225 226 226 %Scaling covariance matrix (scale column-by-column and row-by-row) 227 scaledfields = {'BasalforcingsDeepwaterMeltingRate Autoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBautoregression','SMBforcing'}; %list of fields that need scaling *1/yts227 scaledfields = {'BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving','FloatingMeltRate','SMBarma','SMBforcing'}; %list of fields that need scaling *1/yts 228 228 tempcovariance = self.covariance; %copy of covariance to avoid writing back in member variable 229 229 for i=1:num_fields … … 266 266 % supported and corresponding md names 267 267 structure.fields = {... 268 'BasalforcingsDeepwaterMeltingRate Autoregression',...268 'BasalforcingsDeepwaterMeltingRatearma',... 269 269 'BasalforcingsSpatialDeepwaterMeltingRate',... 270 270 'DefaultCalving',... … … 273 273 'FrictionCoulombWaterPressure',... 274 274 'FrictionSchoofWaterPressure',... 275 'FrontalForcingsRignot Autoregression',...276 'SMBa utoregression',...275 'FrontalForcingsRignotarma',... 276 'SMBarma',... 277 277 'SMBforcing' 278 278 }; 279 279 structure.mdnames = {... 280 ' autoregressionlinearbasalforcings',...280 'linearbasalforcingsarma',... 281 281 'spatiallinearbasalforcings',... 282 282 'calving',... … … 285 285 'frictioncoulomb',... 286 286 'frictionschoof',... 287 'frontalforcingsrignota utoregression',...288 'SMBa utoregression',...287 'frontalforcingsrignotarma',... 288 'SMBarma',... 289 289 'SMBforcing' 290 290 }; -
issm/trunk-jpl/src/m/classes/stochasticforcing.py
r27165 r27251 40 40 s += ' FloatingMeltRate\n' 41 41 s += ' FrictionWaterPressure\n' 42 s += ' FrontalForcingsRignot Autoregression(thermal forcing)\n'43 s += ' SMBa utoregression\n'42 s += ' FrontalForcingsRignotarma (thermal forcing)\n' 43 s += ' SMBarma\n' 44 44 s += ' SMBforcing\n' 45 45 return s … … 75 75 for field in self.fields: 76 76 # Checking agreement of classes 77 if 'SMBa utoregression' in field:77 if 'SMBarma' in field: 78 78 mdname = structstoch[field] 79 79 if (type(md.smb).__name__ != mdname): … … 99 99 if (type(md.basalforcings).__name__ != mdname): 100 100 raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field)) 101 if 'BasalforcingsDeepwaterMeltingRate Autoregression' in field:101 if 'BasalforcingsDeepwaterMeltingRatearma' in field: 102 102 mdname = structstoch[field] 103 103 if (type(md.basalforcings).__name__ != mdname): … … 115 115 116 116 # Checking for specific dimensions 117 if field not in['SMBa utoregression', 'FrontalForcingsRignotAutoregression','BasalforcingsDeepwaterMeltingRateAutoregression']:117 if field not in['SMBarma', 'FrontalForcingsRignotarma','BasalforcingsDeepwaterMeltingRatearma']: 118 118 checkdefaults = True # field with non-specific dimensionality 119 119 120 120 # Retrieve sum of all the field dimensionalities 121 121 dimensions = self.defaultdimension*np.ones((num_fields)) 122 indSMBar = -1 # About to check for index of SMBautoregression123 indTFar = -1 # About to check for index of FrontalForcingsRignotAutoregression124 indBDWar = -1 # About to check for index of BasalforcingsDeepwaterMeltingRateAutoregression125 if ('SMBa utoregression' in self.fields):126 indSMBar = self.fields.index('SMBautoregression') # Index of SMBar, now check for consistency with other timesteps127 dimensions[indSMBar ] = md.smb.num_basins128 if(md.smb.ar _timestep<self.stochastictimestep):129 raise TypeError('SMBa utoregressioncannot have a timestep shorter than stochastictimestep')130 if ('FrontalForcingsRignot Autoregression' in self.fields):131 indTFar = self.fields.index('FrontalForcingsRignotAutoregression') # Index of TFar, now check for consistency with other timesteps132 dimensions[indTFar ] = md.frontalforcings.num_basins133 if(md.frontalforcings.ar _timestep<self.stochastictimestep):134 raise TypeError('FrontalForcingsRignot Autoregressioncannot have a timestep shorter than stochastictimestep')135 if ('BasalforcingsDeepwaterMeltingRate Autoregression' in self.fields):136 indBDWar = self.fields.index('BasalforcingsDeepwaterMeltingRateAutoregression') # Index of BDWar, now check for consistency with other timesteps137 dimensions[indTFar ] = md.basalforcings.num_basins138 if(md.basalforcings.ar _timestep<self.stochastictimestep):139 raise TypeError('BasalforcingsDeepwaterMeltingRate Autoregressioncannot have a timestep shorter than stochastictimestep')122 indSMBarma = -1 # About to check for index of SMBarma 123 indTFarma = -1 # About to check for index of FrontalForcingsRignotarma 124 indBDWarma = -1 # About to check for index of BasalforcingsDeepwaterMeltingRatearma 125 if ('SMBarma' in self.fields): 126 indSMBarma = self.fields.index('SMBarma') # Index of SMBarma, now check for consistency with other timesteps 127 dimensions[indSMBarma] = md.smb.num_basins 128 if(md.smb.arma_timestep<self.stochastictimestep): 129 raise TypeError('SMBarma cannot have a timestep shorter than stochastictimestep') 130 if ('FrontalForcingsRignotarma' in self.fields): 131 indTFarma = self.fields.index('FrontalForcingsRignotarma') # Index of TFarma, now check for consistency with other timesteps 132 dimensions[indTFarma] = md.frontalforcings.num_basins 133 if(md.frontalforcings.arma_timestep<self.stochastictimestep): 134 raise TypeError('FrontalForcingsRignotarma cannot have a timestep shorter than stochastictimestep') 135 if ('BasalforcingsDeepwaterMeltingRatearma' in self.fields): 136 indBDWarma = self.fields.index('BasalforcingsDeepwaterMeltingRatearma') # Index of BDWarma, now check for consistency with other timesteps 137 dimensions[indTFarma] = md.basalforcings.num_basins 138 if(md.basalforcings.arma_timestep<self.stochastictimestep): 139 raise TypeError('BasalforcingsDeepwaterMeltingRatearma cannot have a timestep shorter than stochastictimestep') 140 140 size_tot = np.sum(dimensions) 141 141 142 if (indSMBar != -1 and indTFar != -1): # Both autoregressive models are used: check autoregressivetime step consistency143 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)]144 if((md.smb.ar _timestep != md.frontalforcings.ar_timestep) and np.any(covsum != 0)):145 raise IOError('SMBa utoregression and FrontalForcingsRignotAutoregression have different ar_timestep and non-zero covariance')146 if (indSMBar != -1 and indBDWar != -1): # Both autoregressive models are used: check autoregressivetime step consistency147 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)]148 if((md.smb.ar _timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):149 raise IOError('SMBa utoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')150 if (indTFar != -1 and indBDWar != -1): # Both autoregressive models are used: check autoregressivetime step consistency151 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)]152 if((md.frontalforcings.ar _timestep != md.basalforcings.ar_timestep) and np.any(covsum != 0)):153 raise IOError('FrontalForcingsRignot Autoregression and BasalforcingsDeepwaterMeltingRateAutoregression have different ar_timestep and non-zero covariance')142 if (indSMBarma != -1 and indTFarma != -1): # Both ARMA models are used: check ARMA time step consistency 143 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 144 if((md.smb.arma_timestep != md.frontalforcings.arma_timestep) and np.any(covsum != 0)): 145 raise IOError('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 146 if (indSMBarma != -1 and indBDWarma != -1): # Both ARMA models are used: check ARMA time step consistency 147 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 148 if((md.smb.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)): 149 raise IOError('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 150 if (indTFarma != -1 and indBDWarma != -1): # Both ARMA models are used: check ARMA time step consistency 151 covsum = self.covariance[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 152 if((md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)): 153 raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 154 154 155 155 md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1]) … … 184 184 for ind, field in enumerate(self.fields): 185 185 # Checking for specific dimensions 186 if (field == 'SMBa utoregression'):186 if (field == 'SMBarma'): 187 187 dimensions[ind] = md.smb.num_basins 188 if (field == 'FrontalForcingsRignot Autoregression'):188 if (field == 'FrontalForcingsRignotarma'): 189 189 dimensions[ind] = md.frontalforcings.num_basins 190 if (field == 'BasalforcingsDeepwaterMeltingRate Autoregression'):190 if (field == 'BasalforcingsDeepwaterMeltingRatearma'): 191 191 dimensions[ind] = md.basalforcings.num_basins 192 192 193 193 # Scaling covariance matrix (scale column-by-column and row-by-row) 194 scaledfields = ['BasalforcingsDeepwaterMeltingRate Autoregression','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBautoregression', 'SMBforcing'] # list of fields that need scaling * 1/yts194 scaledfields = ['BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBarma', 'SMBforcing'] # list of fields that need scaling * 1/yts 195 195 tempcovariance = np.copy(self.covariance) 196 196 for i in range(num_fields): … … 229 229 supported and corresponding md names 230 230 """ 231 structure = {'BasalforcingsDeepwaterMeltingRate Autoregression': 'autoregressionlinearbasalforcings',231 structure = {'BasalforcingsDeepwaterMeltingRatearma': 'linearbasalforcingsarma', 232 232 'BasalforcingsSpatialDeepwaterMeltingRate': 'spatiallinearbasalforcings', 233 233 'DefaultCalving': 'calving', … … 236 236 'FrictionCoulombWaterPressure': 'frictioncoulomb', 237 237 'FrictionSchoofWaterPressure': 'frictionschoof', 238 'FrontalForcingsRignot Autoregression': 'frontalforcingsrignotautoregression',239 'SMBa utoregression': 'SMBautoregression',238 'FrontalForcingsRignotarma': 'frontalforcingsrignotarma', 239 'SMBarma': 'SMBarma', 240 240 'SMBforcing': 'SMBforcing'} 241 241 return structure
Note:
See TracChangeset
for help on using the changeset viewer.