Ignore:
Timestamp:
11/04/22 04:51:01 (2 years ago)
Author:
vverjans
Message:

NEW added autoregression and stochastic capabilities for subglacial discharge

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/stochasticforcing.py

    r27251 r27354  
    3636        s += '{}\n'.format(fielddisplay(self, 'randomflag', 'whether to apply real randomness (true) or pseudo-randomness with fixed seed (false)'))
    3737        s += 'Available fields:\n'
     38        s += '   BasalforcingsDeepwaterMeltingRatearma\n'
    3839        s += '   BasalforcingsSpatialDeepwaterMeltingRate\n'
    3940        s += '   DefaultCalving\n'
    4041        s += '   FloatingMeltRate\n'
    4142        s += '   FrictionWaterPressure\n'
     43        s += '   FrictionCoulombWaterPressure\n'
     44        s += '   FrictionSchoofWaterPressure\n'
    4245        s += '   FrontalForcingsRignotarma (thermal forcing)\n'
     46        s += '   FrontalForcingsSubglacialDischargearma\n'
    4347        s += '   SMBarma\n'
    4448        s += '   SMBforcing\n'
     
    122126        indSMBarma   = -1  # About to check for index of SMBarma
    123127        indTFarma    = -1  # About to check for index of FrontalForcingsRignotarma
     128        indSdarma    = -1  # About to check for index of FrontalForcingsSubglacialDischargearma
    124129        indBDWarma   = -1  # About to check for index of BasalforcingsDeepwaterMeltingRatearma
    125130        if ('SMBarma' in self.fields):
     
    133138            if(md.frontalforcings.arma_timestep<self.stochastictimestep):
    134139                raise TypeError('FrontalForcingsRignotarma cannot have a timestep shorter than stochastictimestep')
     140        if ('FrontalForcingsSubglacialDischargearma' in self.fields):
     141            indSdarma = self.fields.index('FrontalForcingsSubglacialDischargearma')  # Index of Sdarma, now check for consistency with other timesteps
     142            dimensions[indSdarma] = md.frontalforcings.num_basins
     143            if(md.frontalforcings.sd_arma_timestep<self.stochastictimestep):
     144                raise TypeError('FrontalForcingsSubglacialDischargearma cannot have a timestep shorter than stochastictimestep')
    135145        if ('BasalforcingsDeepwaterMeltingRatearma' in self.fields):
    136146            indBDWarma = self.fields.index('BasalforcingsDeepwaterMeltingRatearma')  # Index of BDWarma, now check for consistency with other timesteps
     
    152162            if((md.frontalforcings.arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)):
    153163                raise IOError('FrontalForcingsRignotarma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance')
     164        if (indSMBarma != -1 and indSdarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     165            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)]
     166            if((md.smb.arma_timestep != md.frontalforcings.sd_arma_timestep) and np.any(covsum != 0)):
     167                raise IOError('SMBarma and FrontalForcingsSubglacialDischargearma have different arma_timestep and non-zero covariance')
     168        if (indSdarma != -1 and indBDWarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     169            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)]
     170            if((md.frontalforcings.sd_arma_timestep != md.basalforcings.arma_timestep) and np.any(covsum != 0)):
     171                raise IOError('FrontalForcingsSubglacialDischargearma and BasalforcingsDeepwaterMeltingRatearma have different arma_timestep and non-zero covariance')
     172        if (indSdarma != -1 and indTFarma != -1):  # Both ARMA models are used: check ARMA time step consistency
     173            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)]
     174            if((md.frontalforcings.sd_arma_timestep != md.frontalforcings.arma_timestep) and np.any(covsum != 0)):
     175                raise IOError('FrontalForcingsSubglacialDischargearma and FrontalForcingsRignotarma have different arma_timestep and non-zero covariance')
     176
    154177
    155178        md = checkfield(md, 'fieldname', 'stochasticforcing.isstochasticforcing', 'values', [0, 1])
     
    187210                    dimensions[ind] = md.smb.num_basins
    188211                if (field == 'FrontalForcingsRignotarma'):
     212                    dimensions[ind] = md.frontalforcings.num_basins
     213                if (field == 'FrontalForcingsSubglacialDischargearma'):
    189214                    dimensions[ind] = md.frontalforcings.num_basins
    190215                if (field == 'BasalforcingsDeepwaterMeltingRatearma'):
     
    237262                     'FrictionSchoofWaterPressure': 'frictionschoof',
    238263                     'FrontalForcingsRignotarma': 'frontalforcingsrignotarma',
     264                     'FrontalForcingsSubglacialDischargearma': 'frontalforcingsrignotarma',
    239265                     'SMBarma': 'SMBarma',
    240266                     'SMBforcing': 'SMBforcing'}
Note: See TracChangeset for help on using the changeset viewer.