Changeset 26178
- Timestamp:
- 04/08/21 03:45:11 (4 years ago)
- Location:
- issm/trunk-jpl/src/m
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/m/classes/dslmme.py
r26059 r26178 1 import numpy as np2 3 1 from checkfield import checkfield 4 2 from fielddisplay import fielddisplay … … 14 12 """ 15 13 16 def __init__(self, *args): #{{{17 self.modelid = 0# Index into the multi-model ensemble18 self.global_average_thermosteric_sea_level = [] # Corresponds to zostoga field in CMIP5 archives. Specified as a temporally variable quantity (in m) for each ensemble.19 self.sea_surface_height_above_geoid = []# Corresponds to zos field in CMIP5 archives. Spatial average is 0. Specified as a spatio-temporally variable quantity (in m) for each ensemble.20 self.sea_water_pressure_at_sea_floor = []#Corresponds to bpo field in CMIP5 archives. Specified as a spatio-temporally variable quantity (in m equivalent, not in Pa!) for each ensemble.14 def __init__(self, *args): #{{{ 15 self.modelid = 0 # Index into the multi-model ensemble 16 self.global_average_thermosteric_sea_level = [] # Corresponds to zostoga field in CMIP5 archives. Specified as a temporally variable quantity (in m) for each ensemble. 17 self.sea_surface_height_above_geoid = [] # Corresponds to zos field in CMIP5 archives. Spatial average is 0. Specified as a spatio-temporally variable quantity (in m) for each ensemble. 18 self.sea_water_pressure_at_sea_floor = [] #Corresponds to bpo field in CMIP5 archives. Specified as a spatio-temporally variable quantity (in m equivalent, not in Pa!) for each ensemble. 21 19 22 20 nargs = len(args) … … 28 26 #}}} 29 27 30 def __repr__(self): # {{{28 def __repr__(self): # {{{ 31 29 s = ' dsl mme parameters:\n' 32 30 s += '{}\n'.format(fielddisplay(self, 'modelid', 'index into the multi-model ensemble, determines which field will be used.')) … … 37 35 #}}} 38 36 39 def setdefaultparameters(self): #{{{37 def setdefaultparameters(self): #{{{ 40 38 return self 41 39 #}}} 42 40 43 def checkconsistency(self, md, solution, analyses): # {{{41 def checkconsistency(self, md, solution, analyses): # {{{ 44 42 # Early return 45 43 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc): … … 50 48 md = checkfield(md, 'field', self.sea_surface_height_above_geoid[i], 'NaN', 1, 'Inf', 1, 'timeseries', 1) 51 49 md = checkfield(md, 'field', self.sea_water_pressure_at_sea_floor[i], 'NaN', 1, 'Inf', 1, 'timeseries', 1) 52 md = checkfield(md, 'field', self.modelid, 'NaN', 1, 'Inf', 1, '>=', 1, '<=', len(self.global_average_thermosteric_sea_level))50 md = checkfield(md, 'field', self.modelid, 'NaN', 1, 'Inf', 1, '>=', 1, '<=', len(self.global_average_thermosteric_sea_level)) 53 51 54 52 if self.solidearth.settings.compute_bp_grd: … … 58 56 #}}} 59 57 60 def marshall(self, prefix, md, fid): #{{{58 def marshall(self, prefix, md, fid): #{{{ 61 59 WriteData(fid, prefix, 'name', 'md.dsl.model', 'data', 2, 'format', 'Integer') 62 60 WriteData(fid, prefix, 'object', self, 'fieldname', 'modelid', 'format', 'Double') … … 67 65 #}}} 68 66 69 def extrude(self, md): #{{{67 def extrude(self, md): #{{{ 70 68 for i in range(len(self.global_average_thermosteric_sea_level)): 71 69 self.sea_surface_height_above_geoid[i] = project3d(md, 'vector', self.self.sea_surface_height_above_geoid[i], 'type', 'node', 'layer', 1) -
issm/trunk-jpl/src/m/classes/lovenumbers.py
r25688 r26178 1 import numpy as np2 3 1 from checkfield import checkfield 4 2 from fielddisplay import fielddisplay … … 8 6 9 7 10 class lovenumbers(object): #{{{8 class lovenumbers(object): #{{{ 11 9 """LOVENUMBERS class definition 12 10 13 11 Usage: 14 lovenumbers = lovenumbers() #will setup love numbers deg 1001 by default15 lovenumbers = lovenumbers('maxdeg', 10001); #supply numbers of degrees required (here, 10001)12 lovenumbers = lovenumbers() #will setup love numbers deg 1001 by default 13 lovenumbers = lovenumbers('maxdeg', 10001); #supply numbers of degrees required (here, 10001) 16 14 """ 17 15 18 def __init__(self, *args): #{{{16 def __init__(self, *args): #{{{ 19 17 # Regular love numbers 20 self.h = [] # Provided by PREM model21 self.k = [] # idem22 self.l = [] # idem18 self.h = [] # Provided by PREM model 19 self.k = [] # idem 20 self.l = [] # idem 23 21 24 22 # Tidal love numbers for computing rotational feedback … … 26 24 self.tk = [] 27 25 self.tl = [] 28 self.tk2secular = 0 # deg 2 secular number26 self.tk2secular = 0 # deg 2 secular number 29 27 30 28 options = pairoptions(*args) … … 34 32 #}}} 35 33 36 def setdefaultparameters(self, maxdeg, referenceframe): #{{{34 def setdefaultparameters(self, maxdeg, referenceframe): #{{{ 37 35 # Initialize love numbers 38 36 self.h = getlovenumbers('type', 'loadingverticaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg) … … 48 46 #}}} 49 47 50 def checkconsistency(self, md, solution, analyses): #{{{51 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.issl r):48 def checkconsistency(self, md, solution, analyses): #{{{ 49 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc): 52 50 return 53 51 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.h', 'NaN', 1, 'Inf', 1) … … 64 62 #}}} 65 63 66 def defaultoutputs(self, md): #{{{64 def defaultoutputs(self, md): #{{{ 67 65 return[] 68 66 #}}} 69 67 70 def __repr__(self): #{{{68 def __repr__(self): #{{{ 71 69 s = ' lovenumbers parameters:\n' 72 70 s += '{}\n'.format(fielddisplay(self, 'h', 'load Love number for radial displacement')) … … 79 77 #}}} 80 78 81 def marshall(self, prefix, md, fid): #{{{79 def marshall(self, prefix, md, fid): #{{{ 82 80 WriteData(fid, prefix, 'object', self, 'fieldname', 'h', 'name', 'md.solidearth.lovenumbers.h', 'format', 'DoubleMat', 'mattype', 1) 83 81 WriteData(fid, prefix, 'object', self, 'fieldname', 'k', 'name', 'md.solidearth.lovenumbers.k', 'format', 'DoubleMat', 'mattype', 1) … … 90 88 #}}} 91 89 92 def extrude(self, md): #{{{90 def extrude(self, md): #{{{ 93 91 return 94 92 #}}} -
issm/trunk-jpl/src/m/classes/nodalvalue.py
r25688 r26178 1 1 import numpy as np 2 3 2 from checkfield import checkfield 4 3 from fielddisplay import fielddisplay … … 20 19 """ 21 20 22 def __init__(self, *args): #{{{23 self.name 24 self.definitionstring = ''# string that identifies this output definition uniquely, from 'Outputdefinition[1-10]'25 self.model_string = ''# string for field that is being retrieved26 self.node = np.nan#for which node are we retrieving the value?27 21 def __init__(self, *args): #{{{ 22 self.name = '' 23 self.definitionstring = '' # string that identifies this output definition uniquely, from 'Outputdefinition[1-10]' 24 self.model_string = '' # string for field that is being retrieved 25 self.node = np.nan #for which node are we retrieving the value? 26 28 27 #use provided options to change fields 29 28 options = pairoptions(*args) 30 29 31 30 # Get name 32 self.name 33 self.definitionstring 34 self.model_string 35 self.node 31 self.name = options.getfieldvalue('name', '') 32 self.definitionstring = options.getfieldvalue('definitionstring', '') 33 self.model_string = options.getfieldvalue('model_string', '') 34 self.node = options.getfieldvalue('node', '') 36 35 #}}} 37 36 38 def __repr__(self): # {{{37 def __repr__(self): # {{{ 39 38 s = ' Nodalvalue:\n' 40 39 s += '{}\n'.format(fielddisplay(self, 'name', 'identifier for this nodalvalue response')) … … 45 44 #}}} 46 45 47 def setdefaultparameters(self): # {{{46 def setdefaultparameters(self): # {{{ 48 47 return self 49 48 #}}} 50 49 51 def checkconsistency(self, md, solution, analyses): # {{{52 if not isinstance(self.name, basestring):50 def checkconsistency(self, md, solution, analyses): # {{{ 51 if not isinstance(self.name, str): 53 52 raise Exception('nodalvalue error message: \'name\' field should be a string!') 54 53 OutputdefinitionStringArray = [] … … 60 59 #}}} 61 60 62 def marshall(self, prefix, md, fid): #{{{61 def marshall(self, prefix, md, fid): #{{{ 63 62 WriteData(fid, prefix, 'data', self.name, 'name', 'md.nodalvalue.name', 'format', 'String') 64 63 WriteData(fid, prefix, 'data', self.definitionstring, 'name', 'md.nodalvalue.definitionenum', 'format', 'String') -
issm/trunk-jpl/src/m/classes/rotational.py
r25688 r26178 1 import numpy as np2 3 1 from checkfield import checkfield 4 2 from fielddisplay import fielddisplay … … 13 11 """ 14 12 15 def __init__(self, *args): #{{{16 self.equatorialmoi 17 self.polarmoi 18 self.langularvelocity 13 def __init__(self, *args): #{{{ 14 self.equatorialmoi = 0 15 self.polarmoi = 0 16 self.langularvelocity = 0 19 17 20 18 nargin = len(args) … … 25 23 #}}} 26 24 27 def __repr__(self): # {{{25 def __repr__(self): # {{{ 28 26 s = ' rotational parameters:\n' 29 27 s += '{}\n'.format(fielddisplay(self, 'equatorialmoi', 'mean equatorial moment of inertia [kg m^2]')) … … 33 31 #}}} 34 32 35 def setdefaultparameters(self): # {{{33 def setdefaultparameters(self): # {{{ 36 34 # Moment of inertia 37 self.equatorialmoi = 8.0077e37# [kg m^2]38 self.polarmoi = 8.0345e37# [kg m^2]35 self.equatorialmoi = 8.0077e37 # [kg m^2] 36 self.polarmoi = 8.0345e37 # [kg m^2] 39 37 40 38 # Mean rotational velocity of earth 41 self.angularvelocity = 7.2921e-5 # [s^-1]39 self.angularvelocity = 7.2921e-5 # [s^-1] 42 40 return self 43 41 #}}} 44 42 45 def checkconsistency(self, md, solution, analyses): # {{{46 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.issl r):43 def checkconsistency(self, md, solution, analyses): # {{{ 44 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc): 47 45 return md 48 46 md = checkfield(md, 'fieldname', 'solidearth.rotational.equatorialmoi', 'NaN', 1, 'Inf', 1) … … 52 50 #}}} 53 51 54 def defaultoutputs(self, md): #{{{52 def defaultoutputs(self, md): #{{{ 55 53 return [] 56 54 #}}} 57 55 58 def marshall(self, prefix, md, fid): #{{{56 def marshall(self, prefix, md, fid): #{{{ 59 57 WriteData(fid, prefix, 'object', self, 'fieldname', 'equatorialmoi', 'name', 'md.solidearth.rotational.equatorialmoi', 'format', 'Double') 60 58 WriteData(fid, prefix, 'object', self, 'fieldname', 'polarmoi', 'name', 'md.solidearth.rotational.polarmoi', 'format', 'Double') … … 62 60 #}}} 63 61 64 def extrude(self, md): #{{{62 def extrude(self, md): #{{{ 65 63 return self 66 64 #}}} -
issm/trunk-jpl/src/m/classes/solidearthsettings.py
r26060 r26178 39 39 #}}} 40 40 41 def __repr__(self): # {{{41 def __repr__(self): # {{{ 42 42 s = ' solidearth settings:\n' 43 43 s += '{}\n'.format(fielddisplay(self, 'reltol', 'sea level rise relative convergence criterion, (default, NaN: not applied)')) … … 58 58 #}}} 59 59 60 def setdefaultparameters(self): # {{{60 def setdefaultparameters(self): # {{{ 61 61 # Convergence criterion: absolute, relative, and residual 62 self.reltol = 0.01 # 1 percent63 self.abstol = np.nan # default62 self.reltol = 0.01 # 1 percent 63 self.abstol = np.nan # default 64 64 65 65 # Maximum of non-linear iterations … … 94 94 #}}} 95 95 96 def checkconsistency(self, md, solution, analyses): # {{{97 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.issl r):96 def checkconsistency(self, md, solution, analyses): # {{{ 97 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc): 98 98 return md 99 99 md = checkfield(md, 'fieldname', 'solidearth.settings.reltol', 'size', [1]) … … 126 126 #}}} 127 127 128 def marshall(self, prefix, md, fid): #{{{128 def marshall(self, prefix, md, fid): #{{{ 129 129 WriteData(fid, prefix, 'object', self, 'fieldname', 'reltol', 'name', 'md.solidearth.settings.reltol', 'format', 'Double') 130 130 WriteData(fid, prefix, 'object', self, 'fieldname', 'abstol', 'name', 'md.solidearth.settings.abstol', 'format', 'Double') … … 145 145 #}}} 146 146 147 def extrude(self, md): #{{{147 def extrude(self, md): #{{{ 148 148 return self 149 149 #}}} -
issm/trunk-jpl/src/m/classes/surfaceload.py
r25688 r26178 13 13 """ 14 14 15 def __init__(self, *args): #{{{16 self.icethicknesschange = []17 self.waterheightchange = []18 self.other = []19 15 def __init__(self, *args): #{{{ 16 self.icethicknesschange = np.nan 17 self.waterheightchange = np.nan 18 self.other = np.nan 19 20 20 nargin = len(args) 21 21 … … 26 26 #}}} 27 27 28 def __repr__(self): #{{{28 def __repr__(self): #{{{ 29 29 s = ' surfaceload:\n' 30 30 s += '{}\n'.format(fielddisplay(self, 'icethicknesschange', 'thickness change: ice height equivalent [mIce/yr]')) … … 34 34 #}}} 35 35 36 def setdefaultparameters(self): # {{{36 def setdefaultparameters(self): # {{{ 37 37 return self 38 38 #}}} 39 39 40 def checkconsistency(self, md, solution, analyses): # {{{41 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.issl r):40 def checkconsistency(self, md, solution, analyses): # {{{ 41 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc): 42 42 return md 43 if len(self.icethicknesschange):44 md = checkfield(md,'fieldname', 'solidearth.surfaceload.icethicknesschange', 'timeseries', 1, 'NaN', 1, 'Inf', 1)45 if len(self.waterheightchange):46 md = checkfield(md,'fieldname', 'solidearth.surfaceload.waterheightchange', 'timeseries', 1, 'NaN', 1, 'Inf', 1)47 if len(self.other):48 md = checkfield(md,'fieldname', 'solidearth.surfaceload.other', 'timeseries', 1, 'NaN', 1, 'Inf', 1)43 if type(self.icethicknesschange) == np.ndarray: 44 md = checkfield(md, 'fieldname', 'solidearth.surfaceload.icethicknesschange', 'timeseries', 1, 'NaN', 1, 'Inf', 1) 45 if type(self.waterheightchange) == np.ndarray: 46 md = checkfield(md, 'fieldname', 'solidearth.surfaceload.waterheightchange', 'timeseries', 1, 'NaN', 1, 'Inf', 1) 47 if type(self.other) == np.ndarray: 48 md = checkfield(md, 'fieldname', 'solidearth.surfaceload.other', 'timeseries', 1, 'NaN', 1, 'Inf', 1) 49 49 return md 50 50 #}}} 51 51 52 def marshall(self, prefix, md, fid): #{{{53 if len(self.icethicknesschange) == 0:54 self.icethicknesschange = np.zeros((md.mesh.numberofelements + 1 ,))55 if len(self.waterheightchange) == 0:56 self.waterheightchange = np.zeros((md.mesh.numberofelements + 1 ,))57 if len(self.other) == 0:58 self.other = np.zeros((md.mesh.numberofelements + 1 ,))52 def marshall(self, prefix, md, fid): #{{{ 53 if np.isnan(self.icethicknesschange).all(): 54 self.icethicknesschange = np.zeros((md.mesh.numberofelements + 1)) 55 if np.isnan(self.waterheightchange).all(): 56 self.waterheightchange = np.zeros((md.mesh.numberofelements + 1)) 57 if np.isnan(self.other).all(): 58 self.other = np.zeros((md.mesh.numberofelements + 1)) 59 59 WriteData(fid, prefix, 'object', self, 'fieldname', 'icethicknesschange', 'name', 'md.solidearth.surfaceload.icethicknesschange', 'format', 'DoubleMat', 'mattype', 2, 'timeserieslength', md.mesh.numberofelements + 1, 'yts', md.constants.yts) 60 60 WriteData(fid, prefix, 'object', self, 'fieldname', 'waterheightchange', 'name', 'md.solidearth.surfaceload.waterheightchange', 'format', 'DoubleMat', 'mattype', 2, 'timeserieslength', md.mesh.numberofelements + 1, 'yts', md.constants.yts) … … 62 62 #}}} 63 63 64 def extrude(self, md): #{{{64 def extrude(self, md): #{{{ 65 65 return self 66 66 #}}} -
issm/trunk-jpl/src/m/consistency/checkfield.py
r25499 r26178 11 11 12 12 Used to check model consistency 13 14 13 Requires: 15 'field' or 'fieldname' option. If 'fieldname' is provided, it will 14 'field' or 'fieldname' option. If 'fieldname' is provided, it will 16 15 retrieve it from the model md. (md.(fieldname)) 17 If 'field' is provided, it will assume the argument following 'field' 16 If 'field' is provided, it will assume the argument following 'field' 18 17 is a numeric array. 19 18 20 19 Available options: 21 20 - NaN: 1 if check that there is no NaN 22 - size: [lines cols], NaN for non checked dimensions, or 'universal' 21 - size: [lines cols], NaN for non checked dimensions, or 'universal' 23 22 for any input type (nodal, element, time series, etc) 24 23 - > : greater than provided value … … 72 71 fieldsize = options.getfieldvalue('size') 73 72 if type(fieldsize) == str: 74 if m.strcmp(fieldsize, 'universal'): 75 73 if fieldsize == 'universal': 76 74 #Check that vector size will not be confusing for ModelProcessorx 77 75 if (md.mesh.numberofvertices == md.mesh.numberofelements): -
issm/trunk-jpl/src/m/consistency/ismodelselfconsistent.py
r26059 r26178 81 81 analyses = ['DamageEvolutionAnalysis'] 82 82 elif 'SamplingSolution': 83 analyses=['SamplingAnalysis']83 analyses = ['SamplingAnalysis'] 84 84 else: 85 85 raise TypeError('solution type: {} not supported yet!'.format(solutiontype)) -
issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py
r26063 r26178 66 66 DimDict[len(NewDim)] = dimnames[i] 67 67 68 typelist = [bool, str, str,int, float, complex,68 typelist = [bool, str, int, float, complex, 69 69 collections.OrderedDict, 70 70 np.int64, np.ndarray, np.float64] -
issm/trunk-jpl/src/m/solve/loadresultsfromcluster.py
r25817 r26178 1 1 import os 2 2 import socket 3 4 3 from helpers import * 5 4 from loadresultsfromdisk import loadresultsfromdisk … … 8 7 9 8 10 def remove(filename): 9 def remove(filename): #{{{ 11 10 try: 12 11 os.remove(filename) 13 12 except OSError: 14 13 print(('WARNING: ' + filename + ' does not exist')) 14 # }}} 15 15 16 16 17 def loadresultsfromcluster(md, *args): 17 def loadresultsfromcluster(md, *args): #{{{ 18 18 """LOADRESULTSFROMCLUSTER - load results of solution sequence from cluster 19 19 … … 75 75 76 76 return md 77 # }}}
Note:
See TracChangeset
for help on using the changeset viewer.