Changeset 27484
- Timestamp:
- 12/29/22 14:51:50 (2 years ago)
- Location:
- issm/trunk-jpl/src/m/classes
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/SMBarma.py
r27483 r27484 8 8 9 9 class SMBarma(object): 10 """SMB ARMAclass definition10 """SMBarma class definition 11 11 12 12 Usage: -
issm/trunk-jpl/src/m/classes/stochasticforcing.m
r27462 r27484 111 111 end 112 112 if(strcmp(class(md.friction),'friction') || strcmp(class(md.friction),'frictionschoof') || strcmp(class(md.friction),'frictioncoulomb')) 113 114 115 113 if(md.friction.coupling~=0 && md.friction.coupling~=1 && md.friction.coupling~=2) 114 error('stochasticforcing field %s is only implemented for cases md.friction.coupling 0 or 1 or 2', char(field)); 115 end 116 116 end 117 117 if(strcmp(class(md.friction),'friction')) 118 119 120 121 end 122 118 if(any(md.friction.q==0)) 119 error('stochasticforcing field %s requires non-zero q exponent',char(field)); 120 end 121 end 122 end 123 123 %Checking for specific dimensions 124 124 if ~(strcmp(field,'SMBarma') || strcmp(field,'FrontalForcingsRignotarma') || strcmp(field,'BasalforcingsDeepwaterMeltingRatearma') || strcmp(field,'FrontalForcingsSubglacialDischargearma') || ((strcmp(field,'FrictionWaterPressure') && ispwHydroarma))) … … 173 173 174 174 %%% Check consistency between ARMA models %%% 175 if(indSMBarma~=-1 && indTFarma~=-1) %both ARMA models are used: check ARMA time step consistency 176 if(md.smb.arma_timestep~=md.frontalforcings.arma_timestep) 177 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,[]); 178 if any(crossentries~=0) 179 error('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance'); 180 end 181 end 182 end 183 if(indSMBarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency 184 if(md.smb.arma_timestep~=md.basalforcings.arma_timestep) 185 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,[]); 186 if any(crossentries~=0) 187 error('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 188 end 189 end 190 end 191 if(indTFarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency 192 if(md.frontalforcings.arma_timestep~=md.basalforcings.arma_timestep) 193 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,[]); 194 if any(crossentries~=0) 195 error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 196 end 197 end 198 end 199 if(indSMBarma~=-1 && indSdarma~=-1) %both ARMA models are used: check ARMA time step consistency 200 if(md.smb.arma_timestep~=md.frontalforcings.sd_arma_timestep) 201 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma))),1,[]); 202 if any(crossentries~=0) 203 error('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 204 end 205 end 206 end 207 if(indSMBarma~=-1 && indPwarma~=-1) %both ARMA models are used: check ARMA time step consistency 208 if(md.smb.arma_timestep~=md.hydrology.arma_timestep) 209 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 210 if any(crossentries~=0) 211 error('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 212 end 213 end 214 end 215 if(indSdarma~=-1 && indBDWarma~=-1) %both ARMA models are used: check ARMA time step consistency 216 if(md.frontalforcings.sd_arma_timestep~=md.basalforcings.arma_timestep) 217 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 218 if any(crossentries~=0) 219 error('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 220 end 221 end 222 end 223 if(indSdarma~=-1 && indTFarma~=-1) %both ARMA models are used: check ARMA time step consistency 224 if(md.frontalforcings.sd_arma_timestep~=md.frontalforcings.arma_timestep) 225 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 226 if any(crossentries~=0) 227 error('FrontalForcingsRignotarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 228 end 229 end 230 end 231 if(indTFarma~=-1 && indPwarma~=-1) %both ARMA models are used: check ARMA time step consistency 232 if(md.frontalforcings.arma_timestep~=md.hydrology.arma_timestep) 233 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 234 if any(crossentries~=0) 235 error('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 236 end 237 end 238 end 239 if(indSdarma~=-1 && indPwarma~=-1) %both ARMA models are used: check ARMA time step consistency 240 if(md.frontalforcings.sd_arma_timestep~=md.hydrology.arma_timestep) 241 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 242 if any(crossentries~=0) 243 error('FrontalForcingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 244 end 245 end 246 end 247 if(indBDWarma~=-1 && indPwarma~=-1) %both ARMA models are used: check ARMA time step consistency 248 if(md.basalforcings.arma_timestep~=md.hydrology.arma_timestep) 249 crossentries = reshape(self.covariance(1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 250 if any(crossentries~=0) 251 error('BasalforcingsDeepwaterMeltingRatearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 175 if(indBDWarma~=-1) 176 if(indPwarma~=-1) 177 if(md.basalforcings.arma_timestep~=md.hydrology.arma_timestep) 178 crossentries = reshape(self.covariance(1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 179 if any(crossentries~=0) 180 error('BasalforcingsDeepwaterMeltingRatearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 181 end 182 end 183 elseif(indSdarma~=-1) 184 if(md.frontalforcings.sd_arma_timestep~=md.basalforcings.arma_timestep) 185 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indBDWarma-1)):sum(dimensions(1:indBDWarma))),1,[]); 186 if any(crossentries~=0) 187 error('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 188 end 189 end 190 elseif(indSMBarma~=-1) 191 if(md.smb.arma_timestep~=md.basalforcings.arma_timestep) 192 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,[]); 193 if any(crossentries~=0) 194 error('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 195 end 196 end 197 elseif(indTFarma~=-1) 198 if(md.frontalforcings.arma_timestep~=md.basalforcings.arma_timestep) 199 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,[]); 200 if any(crossentries~=0) 201 error('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance'); 202 end 203 end 204 end 205 elseif(indPwarma~=-1) 206 if(indSdarma~=-1) 207 if(md.frontalforcings.sd_arma_timestep~=md.hydrology.arma_timestep) 208 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 209 if any(crossentries~=0) 210 error('FrontalForcingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 211 end 212 end 213 elseif(indSMBarma~=-1) 214 if(md.smb.arma_timestep~=md.hydrology.arma_timestep) 215 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 216 if any(crossentries~=0) 217 error('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 218 end 219 end 220 elseif(indTFarma~=-1) 221 if(md.frontalforcings.arma_timestep~=md.hydrology.arma_timestep) 222 crossentries = reshape(self.covariance(1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma)),1+sum(dimensions(1:indPwarma-1)):sum(dimensions(1:indPwarma))),1,[]); 223 if any(crossentries~=0) 224 error('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance'); 225 end 226 end 227 end 228 elseif(indSdarma~=-1) 229 if(indSMBarma~=-1) 230 if(md.smb.arma_timestep~=md.frontalforcings.sd_arma_timestep) 231 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSMBarma-1)):sum(dimensions(1:indSMBarma)),1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma))),1,[]); 232 if any(crossentries~=0) 233 error('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 234 end 235 end 236 elseif(indTFarma~=-1) 237 if(md.frontalforcings.sd_arma_timestep~=md.frontalforcings.arma_timestep) 238 crossentries = reshape(self.covariance(1+sum(dimensions(1:indSdarma-1)):sum(dimensions(1:indSdarma)),1+sum(dimensions(1:indTFarma-1)):sum(dimensions(1:indTFarma))),1,[]); 239 if any(crossentries~=0) 240 error('FrontalForcingsRignotarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance'); 241 end 242 end 243 end 244 elseif(indSMBarma~=-1) 245 if(indTFarma~=-1) 246 if(md.smb.arma_timestep~=md.frontalforcings.arma_timestep) 247 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,[]); 248 if any(crossentries~=0) 249 error('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance'); 250 end 252 251 end 253 252 end … … 321 320 end 322 321 if(strcmp(field,'FrictionWaterPressure') && ispwHydroarma) 323 324 322 dimensions(ind) = md.hydrology.num_basins; 323 end 325 324 ind = ind+1; 326 325 end -
issm/trunk-jpl/src/m/classes/stochasticforcing.py
r27462 r27484 7 7 8 8 class stochasticforcing(object): 9 """ STOCHASTICFORCINGclass definition9 """stochasticforcing class definition 10 10 11 11 Usage: … … 65 65 66 66 num_fields = len(self.fields) 67 if (self.stochastictimestep==0):67 if self.stochastictimestep == 0: 68 68 md.stochasticforcing.stochastictimestep = md.timestepping.time_step #by default: stochastictimestep set to ISSM time step 69 69 print(' stochasticforcing.stocahstictimestep not specified: set to md.timestepping.time_step') … … 79 79 structstoch = self.structstochforcing() 80 80 # Check if hydrologyarmapw is used 81 if ((type(md.hydrology).__name__ == 'hydrologyarmapw') and md.transient.hydrology==1):81 if type(md.hydrology).__name__ == 'hydrologyarmapw' and md.transient.ishydrology: 82 82 ispwHydroarma = 1 83 83 else: … … 87 87 if 'SMBarma' in field: 88 88 mdname = structstoch[field] 89 if (type(md.smb).__name__ != mdname):89 if type(md.smb).__name__ != mdname: 90 90 raise TypeError('md.smb does not agree with stochasticforcing field {}'.format(field)) 91 91 if 'SMBforcing' in field: 92 92 mdname = structstoch[field] 93 if (type(md.smb).__name__ != mdname):93 if type(md.smb).__name__ != mdname: 94 94 raise TypeError('md.smb does not agree with stochasticforcing field {}'.format(field)) 95 95 if 'FrontalForcings' in field: 96 96 mdname = structstoch[field] 97 if (type(md.frontalforcings).__name__ != mdname):97 if type(md.frontalforcings).__name__ != mdname: 98 98 raise TypeError('md.frontalforcings does not agree with stochasticforcing field {}'.format(field)) 99 99 if 'Calving' in field: 100 100 mdname = structstoch[field] 101 if (type(md.calving).__name__ != mdname):101 if type(md.calving).__name__ != mdname: 102 102 raise TypeError('md.calving does not agree with stochasticforcing field {}'.format(field)) 103 103 if 'BasalforcingsFloatingice' in field: 104 104 mdname = structstoch[field] 105 if (type(md.basalforcings).__name__ != mdname):105 if type(md.basalforcings).__name__ != mdname: 106 106 raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field)) 107 107 if 'BasalforcingsSpatialDeepwaterMeltingRate' in field: 108 108 mdname = structstoch[field] 109 if (type(md.basalforcings).__name__ != mdname):109 if type(md.basalforcings).__name__ != mdname: 110 110 raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field)) 111 111 if 'BasalforcingsDeepwaterMeltingRatearma' in field: 112 112 mdname = structstoch[field] 113 if (type(md.basalforcings).__name__ != mdname):113 if type(md.basalforcings).__name__ != mdname: 114 114 raise TypeError('md.basalforcings does not agree with stochasticforcing field {}'.format(field)) 115 115 if 'WaterPressure' in field: … … 118 118 found = 0 119 119 for ii in range(len(mdnames)): 120 if (type(md.friction).__name__ == mdnames[ii]):120 if type(md.friction).__name__ == mdnames[ii]: 121 121 found = 1 122 if (found==0):122 if not found: 123 123 raise TypeError('md.friction does not agree with stochasticforcing field {}'.format(field)) 124 124 #if (type(md.friction).__name__ != mdname): 125 125 # raise TypeError('md.friction does not agree with stochasticforcing field {}'.format(field)) 126 if (type(md.friction).__name__=='friction' or type(md.friction).__name__=='frictionschoof' or type(md.friction).__name__=='frictioncoulomb'):126 if type(md.friction).__name__ == 'friction' or type(md.friction).__name__ == 'frictionschoof' or type(md.friction).__name__=='frictioncoulomb': 127 127 if md.friction.coupling not in[0, 1, 2]: 128 128 raise TypeError('stochasticforcing field {} is only implemented for cases md.friction.coupling 0 or 1 or 2'.format(field)) 129 if (type(md.friction).__name__=='friction'):129 if type(md.friction).__name__ == 'friction': 130 130 if (np.any(md.friction.q == 0)): 131 131 raise TypeError('stochasticforcing field {} requires non-zero q exponent'.format(field)) 132 132 133 133 # Checking for specific dimensions 134 if ((field not in['SMBarma', 'FrontalForcingsRignotarma','BasalforcingsDeepwaterMeltingRatearma']) and ((field=='FrictionWaterPressure' and ispwHydroarma==True)==False)):134 if field not in ['SMBarma', 'FrontalForcingsRignotarma','BasalforcingsDeepwaterMeltingRatearma'] and not (field == 'FrictionWaterPressure' and ispwHydroarma == True): 135 135 checkdefaults = True # field with non-specific dimensionality 136 136 137 137 # Retrieve sum of all the field dimensionalities 138 dimensions = self.defaultdimension *np.ones((num_fields))138 dimensions = self.defaultdimension * np.ones((num_fields)) 139 139 indSMBarma = -1 # About to check for index of SMBarma 140 140 indTFarma = -1 # About to check for index of FrontalForcingsRignotarma … … 142 142 indBDWarma = -1 # About to check for index of BasalforcingsDeepwaterMeltingRatearma 143 143 indPwarma = -1 # About to check for index of hydrologyarmapw 144 if ('SMBarma' in self.fields):144 if 'SMBarma' in self.fields: 145 145 indSMBarma = self.fields.index('SMBarma') # Index of SMBarma, now check for consistency with other timesteps 146 146 dimensions[indSMBarma] = md.smb.num_basins 147 147 if(md.smb.arma_timestep<self.stochastictimestep): 148 148 raise TypeError('SMBarma cannot have a timestep shorter than stochastictimestep') 149 if ('FrontalForcingsRignotarma' in self.fields):149 if 'FrontalForcingsRignotarma' in self.fields: 150 150 indTFarma = self.fields.index('FrontalForcingsRignotarma') # Index of TFarma, now check for consistency with other timesteps 151 151 dimensions[indTFarma] = md.frontalforcings.num_basins 152 if (md.frontalforcings.arma_timestep<self.stochastictimestep):152 if md.frontalforcings.arma_timestep < self.stochastictimestep: 153 153 raise TypeError('FrontalForcingsRignotarma cannot have a timestep shorter than stochastictimestep') 154 if ('FrontalForcingsSubglacialDischargearma' in self.fields):154 if 'FrontalForcingsSubglacialDischargearma' in self.fields: 155 155 indSdarma = self.fields.index('FrontalForcingsSubglacialDischargearma') # Index of Sdarma, now check for consistency with other timesteps 156 156 dimensions[indSdarma] = md.frontalforcings.num_basins 157 if (md.frontalforcings.sd_arma_timestep<self.stochastictimestep):157 if md.frontalforcings.sd_arma_timestep < self.stochastictimestep: 158 158 raise TypeError('FrontalForcingsSubglacialDischargearma cannot have a timestep shorter than stochastictimestep') 159 if ('BasalforcingsDeepwaterMeltingRatearma' in self.fields):159 if 'BasalforcingsDeepwaterMeltingRatearma' in self.fields: 160 160 indBDWarma = self.fields.index('BasalforcingsDeepwaterMeltingRatearma') # Index of BDWarma, now check for consistency with other timesteps 161 161 dimensions[indTFarma] = md.basalforcings.num_basins 162 if (md.basalforcings.arma_timestep<self.stochastictimestep):162 if md.basalforcings.arma_timestep < self.stochastictimestep: 163 163 raise TypeError('BasalforcingsDeepwaterMeltingRatearma cannot have a timestep shorter than stochastictimestep') 164 if (('FrictionWaterPressure' in self.fields) and ispwHydroarma):164 if 'FrictionWaterPressure' in self.fields and ispwHydroarma: 165 165 indPwarma = self.fields.index('FrictionWaterPressure') # Index of Pwarma, now check for consistency with other timesteps 166 166 dimensions[indPwarma] = md.hydrology.num_basins 167 if (md.hydrology.arma_timestep<self.stochastictimestep):167 if md.hydrology.arma_timestep < self.stochastictimestep: 168 168 raise TypeError('hydrologyarmapw cannot have a timestep shorter than stochastictimestep') 169 169 size_tot = np.sum(dimensions) 170 170 171 if (indSMBarma != -1 and indTFarma != -1): # Both ARMA models are used: check ARMA time step consistency 172 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)] 173 if((md.smb.arma_timestep != md.frontalforcings.arma_timestep) and np.any(covsum != 0)): 174 raise IOError('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 175 if (indSMBarma != -1 and indBDWarma != -1): # Both ARMA models are used: check ARMA time step consistency 176 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)] 177 if((md.smb.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)): 178 raise IOError('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 179 if (indTFarma != -1 and indBDWarma != -1): # Both ARMA models are used: check ARMA time step consistency 180 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)] 181 if((md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)): 182 raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 183 if (indSMBarma != -1 and indSdarma != -1): # Both ARMA models are used: check ARMA time step consistency 184 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int)] 185 if((md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep) and np.any(covsum != 0)): 186 raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance') 187 if (indSdarma != -1 and indBDWarma != -1): # Both ARMA models are used: check ARMA time step consistency 188 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 189 if((md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)): 190 raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 191 if (indSdarma != -1 and indTFarma != -1): # Both ARMA models are used: check ARMA time step consistency 192 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 193 if((md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep) and np.any(covsum != 0)): 194 raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 195 if (indSMBarma != -1 and indPwarma != -1): # Both ARMA models are used: check ARMA time step consistency 196 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 197 if((md.smb.arma_timestep != md.hydrology.arma_timestep) and np.any(covsum != 0)): 198 raise IOError('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 199 if (indTFarma != -1 and indPwarma != -1): # Both ARMA models are used: check ARMA time step consistency 200 covsum = self.covariance[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 201 if((md.frontalforcings.arma_timestep != md.hydrology.arma_timestep) and np.any(covsum != 0)): 202 raise IOError('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 203 if (indSdarma != -1 and indPwarma != -1): # Both ARMA models are used: check ARMA time step consistency 204 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 205 if((md.frontalforcings.sd_arma_timestep != md.hydrology.arma_timestep) and np.any(covsum != 0)): 206 raise IOError('FrontalForingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance') 207 if (indBDWarma != -1 and indPwarma != -1): # Both ARMA models are used: check ARMA time step consistency 208 covsum = self.covariance[np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 209 if((md.smb.arma_timestep != md.hydrology.arma_timestep) and np.any(covsum != 0)): 210 raise IOError('BasalforcingsDeepwaterMeltingRatarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 211 171 if indBDWarma != -1: 172 if indPwarma != -1: 173 covsum = self.covariance[np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 174 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 175 raise IOError('BasalforcingsDeepwaterMeltingRatarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 176 elif indSdarma != -1: 177 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indBDWarma]).astype(int):np.sum(dimensions[0:indBDWarma + 1]).astype(int)] 178 if md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 179 raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 180 elif indSMBarma != -1: 181 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)] 182 if md.smb.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 183 raise IOError('SMBarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 184 elif indTFarma != -1: 185 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)] 186 if md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep and np.any(covsum != 0): 187 raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance') 188 elif indPwarma != -1: 189 if indSdarma != -1: 190 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 191 if md.frontalforcings.sd_arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 192 raise IOError('FrontalForingsSubglacialDischargearma and hydrologyarmapw have different arma_timestep and non-zero covariance') 193 elif indSMBarma != -1: 194 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 195 if md.smb.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 196 raise IOError('SMBarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 197 elif indTFarma != -1: 198 covsum = self.covariance[np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int), np.sum(dimensions[0:indPwarma]).astype(int):np.sum(dimensions[0:indPwarma + 1]).astype(int)] 199 if md.frontalforcings.arma_timestep != md.hydrology.arma_timestep and np.any(covsum != 0): 200 raise IOError('FrontalForcingsRignotarma and hydrologyarmapw have different arma_timestep and non-zero covariance') 201 elif indSdarma != -1: 202 if indSMBarma != -1: 203 covsum = self.covariance[np.sum(dimensions[0:indSMBarma]).astype(int):np.sum(dimensions[0:indSMBarma + 1]).astype(int), np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int)] 204 if md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep and np.any(covsum != 0): 205 raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance') 206 elif indTFarma != -1: 207 covsum = self.covariance[np.sum(dimensions[0:indSdarma]).astype(int):np.sum(dimensions[0:indSdarma + 1]).astype(int), np.sum(dimensions[0:indTFarma]).astype(int):np.sum(dimensions[0:indTFarma + 1]).astype(int)] 208 if md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 209 raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 210 elif indSMBarma != -1: 211 if indTFarma != -1: 212 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)] 213 if md.smb.arma_timestep != md.frontalforcings.arma_timestep and np.any(covsum != 0): 214 raise IOError('SMBarma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance') 212 215 213 216 md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1]) … … 216 219 md = checkfield(md, 'fieldname', 'stochasticforcing.stochastictimestep', 'NaN', 1,'Inf', 1, '>=', md.timestepping.time_step) 217 220 md = checkfield(md, 'fieldname', 'stochasticforcing.randomflag', 'numel', [1], 'values', [0, 1]) 218 if (checkdefaults):221 if checkdefaults: 219 222 md = checkfield(md, 'fieldname', 'stochasticforcing.defaultdimension', 'numel', 1, 'NaN', 1, 'Inf', 1, '>', 0) 220 223 md = checkfield(md, 'fieldname', 'stochasticforcing.default_id', 'Inf', 1, 'NaN', 1, '>=', 0, '<=', self.defaultdimension, 'size', [md.mesh.numberofelements]) … … 235 238 else: 236 239 num_fields = len(self.fields) 237 if (self.stochastictimestep==0):240 if self.stochastictimestep == 0: 238 241 md.stochasticforcing.stochastictimestep = md.timestepping.time_step #by default: stochastictimestep set to ISSM time step 239 242 # Check if hydroarmapw is used 240 if ((type(md.hydrology).__name__ == 'hydrologyarmapw') and md.transient.hydrology==1):243 if type(md.hydrology).__name__ == 'hydrologyarmapw' and md.transient.ishydrology: 241 244 ispwHydroarma = 1 242 245 else: … … 247 250 for ind, field in enumerate(self.fields): 248 251 # Checking for specific dimensions 249 if (field == 'SMBarma'):252 if field == 'SMBarma': 250 253 dimensions[ind] = md.smb.num_basins 251 if (field == 'FrontalForcingsRignotarma'):254 elif field == 'FrontalForcingsRignotarma': 252 255 dimensions[ind] = md.frontalforcings.num_basins 253 if (field == 'FrontalForcingsSubglacialDischargearma'):256 elif field == 'FrontalForcingsSubglacialDischargearma': 254 257 dimensions[ind] = md.frontalforcings.num_basins 255 if (field == 'BasalforcingsDeepwaterMeltingRatearma'):258 elif field == 'BasalforcingsDeepwaterMeltingRatearma': 256 259 dimensions[ind] = md.basalforcings.num_basins 257 if (field == 'FrictionWaterPressure' and ispwHydroarma):260 elif field == 'FrictionWaterPressure' and ispwHydroarma: 258 261 dimensions[ind] = md.hydrology.num_basins 259 262 260 263 # Scaling covariance matrix (scale column-by-column and row-by-row) 261 scaledfields = ['BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBarma', 'SMBforcing'] # list of fields that need scaling * 1 /yts264 scaledfields = ['BasalforcingsDeepwaterMeltingRatearma','BasalforcingsSpatialDeepwaterMeltingRate','DefaultCalving', 'FloatingMeltRate', 'SMBarma', 'SMBforcing'] # list of fields that need scaling * 1 / yts 262 265 tempcovariance = np.copy(self.covariance) 263 266 for i in range(num_fields):
Note:
See TracChangeset
for help on using the changeset viewer.