source: issm/trunk-jpl/src/m/classes/lovenumbers.py@ 26317

Last change on this file since 26317 was 26317, checked in by kakajanto, 4 years ago

BUG: Name change issues, SealevelRISE to SealevelCHANGE, and other python fixes

File size: 6.4 KB
RevLine 
[26317]1import numpy as np
[25154]2from checkfield import checkfield
3from fielddisplay import fielddisplay
[25158]4from getlovenumbers import getlovenumbers
5from pairoptions import pairoptions
[25156]6from WriteData import WriteData
[25154]7
8
[26178]9class lovenumbers(object): #{{{
[25688]10 """LOVENUMBERS class definition
[25154]11
[25688]12 Usage:
[26301]13 lovenumbers = lovenumbers()
14 lovenumbers = lovenumbers('maxdeg', 10000, 'referenceframe', 'CF');
15
16 Choose numbers of degrees required (1000 by default) and reference frame
17 (between CF and CM; CM by default)
[25688]18 """
[25154]19
[26178]20 def __init__(self, *args): #{{{
[25688]21 # Regular love numbers
[26178]22 self.h = [] # Provided by PREM model
23 self.k = [] # idem
24 self.l = [] # idem
[25154]25
[25688]26 # Tidal love numbers for computing rotational feedback
[25154]27 self.th = []
28 self.tk = []
29 self.tl = []
[26178]30 self.tk2secular = 0 # deg 2 secular number
[25158]31
[26301]32 # Time/frequency for visco-elastic love numbers
33 self.timefreq = []
34 self.istime = 1
35
[25158]36 options = pairoptions(*args)
37 maxdeg = options.getfieldvalue('maxdeg', 1000)
38 referenceframe = options.getfieldvalue('referenceframe', 'CM')
39 self.setdefaultparameters(maxdeg, referenceframe)
[25157]40 #}}}
[25154]41
[26301]42 def __repr__(self): #{{{
43 s = ' lovenumbers parameters:\n'
44 s += '{}\n'.format(fielddisplay(self, 'h', 'load Love number for radial displacement'))
45 s += '{}\n'.format(fielddisplay(self, 'k', 'load Love number for gravitational potential perturbation'))
46 s += '{}\n'.format(fielddisplay(self, 'l', 'load Love number for horizontal displacements'))
47 s += '{}\n'.format(fielddisplay(self, 'th', 'tidal load Love number (deg 2)'))
48 s += '{}\n'.format(fielddisplay(self, 'tk', 'tidal load Love number (deg 2)'))
49 s += '{}\n'.format(fielddisplay(self, 'tl', 'tidal load Love number (deg 2)'))
50 s += '{}\n'.format(fielddisplay(self, 'tk2secular', 'secular fluid Love number'))
51 s += '{}\n'.format(fielddisplay(self, 'istime', 'time (default: 1) or frequency love numbers (0)'))
52 s += '{}\n'.format(fielddisplay(self, 'timefreq', 'time/frequency vector (yr or 1/yr)'))
53 return s
54 #}}}
55
[26178]56 def setdefaultparameters(self, maxdeg, referenceframe): #{{{
[25688]57 # Initialize love numbers
[26317]58 self.h = getlovenumbers('type', 'loadingverticaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
59 self.k = getlovenumbers('type', 'loadinggravitationalpotential', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
60 self.l = getlovenumbers('type', 'loadinghorizontaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
61 self.th = getlovenumbers('type', 'tidalverticaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
62 self.tk = getlovenumbers('type', 'tidalgravitationalpotential', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
63 self.tl = getlovenumbers('type', 'tidalhorizontaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg).reshape(-1,1)
[25154]64
[25688]65 # Secular fluid love number
[25154]66 self.tk2secular = 0.942
[26301]67
68 # Time
69 self.istime = 1 # Temporal love numbers by default
[26317]70 self.timefreq = np.zeros(1) # Elastic case by default
[25688]71 return self
[25157]72 #}}}
[25154]73
[26178]74 def checkconsistency(self, md, solution, analyses): #{{{
[26301]75 if ('SealevelchangeAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc):
[25154]76 return
77 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.h', 'NaN', 1, 'Inf', 1)
78 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.k', 'NaN', 1, 'Inf', 1)
79 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.l', 'NaN', 1, 'Inf', 1)
80
81 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.th', 'NaN', 1, 'Inf', 1)
82 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk', 'NaN', 1, 'Inf', 1)
83 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk2secular', 'NaN', 1, 'Inf', 1)
[26301]84 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.timefreq', 'NaN', 1, 'Inf', 1)
85 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.istime', 'NaN', 1, 'Inf', 1, 'values', [0, 1])
86
[25688]87 # Check that love numbers are provided at the same level of accuracy
[25166]88 if (self.h.shape[0] != self.k.shape[0]) or (self.h.shape[0] != self.l.shape[0]):
[25154]89 raise ValueError('lovenumbers error message: love numbers should be provided at the same level of accuracy')
[26301]90
91 ntf = len(self.timefreq)
[26317]92 if (np.shape(self.h)[1] != ntf or np.shape(self.k)[1] != ntf or np.shape(self.l)[1] != ntf or np.shape(self.th)[1] != ntf or np.shape(self.tk)[1] != ntf or np.shape(self.tl)[1] != ntf):
[26301]93 raise ValueError('lovenumbers error message: love numbers should have as many time/frequency steps as the time/frequency vector')
94
[25688]95 return md
[25157]96 #}}}
[25154]97
[26178]98 def defaultoutputs(self, md): #{{{
[25154]99 return[]
[25157]100 #}}}
[25154]101
[26178]102 def marshall(self, prefix, md, fid): #{{{
[25154]103 WriteData(fid, prefix, 'object', self, 'fieldname', 'h', 'name', 'md.solidearth.lovenumbers.h', 'format', 'DoubleMat', 'mattype', 1)
104 WriteData(fid, prefix, 'object', self, 'fieldname', 'k', 'name', 'md.solidearth.lovenumbers.k', 'format', 'DoubleMat', 'mattype', 1)
105 WriteData(fid, prefix, 'object', self, 'fieldname', 'l', 'name', 'md.solidearth.lovenumbers.l', 'format', 'DoubleMat', 'mattype', 1)
106
107 WriteData(fid, prefix, 'object', self, 'fieldname', 'th', 'name', 'md.solidearth.lovenumbers.th', 'format', 'DoubleMat', 'mattype', 1)
108 WriteData(fid, prefix, 'object', self, 'fieldname', 'tk', 'name', 'md.solidearth.lovenumbers.tk', 'format', 'DoubleMat', 'mattype', 1)
109 WriteData(fid, prefix, 'object', self, 'fieldname', 'tl', 'name', 'md.solidearth.lovenumbers.tl', 'format', 'DoubleMat', 'mattype', 1)
110 WriteData(fid, prefix, 'object', self, 'data', self.tk2secular, 'fieldname', 'lovenumbers.tk2secular', 'format', 'Double')
[26301]111
112 if (self.istime):
113 scale = md.constants.yts
114 else:
115 scale = 1.0 / md.constants.yts
116 WriteData(fid, prefix, 'object', self, 'fieldname', 'istime', 'name', 'md.solidearth.lovenumbers.istime', 'format', 'Boolean')
117 WriteData(fid, prefix, 'object', self, 'fieldname', 'timefreq', 'name', 'md.solidearth.lovenumbers.timefreq', 'format', 'DoubleMat', 'mattype', 1, 'scale', scale);
[25157]118 #}}}
[25154]119
[26178]120 def extrude(self, md): #{{{
[25154]121 return
[25157]122#}}}
Note: See TracBrowser for help on using the repository browser.