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

Last change on this file since 26358 was 26358, checked in by jdquinn, 4 years ago

CHG: Completed MATLAB -> Python updates for SE; archive updates now that GMSH can be used on macOS and Linux; various minor bug fixes; formatting; cleanup

File size: 6.5 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)
[26358]83 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tl', 'NaN', 1, 'Inf', 1)
[25154]84 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk2secular', 'NaN', 1, 'Inf', 1)
[26301]85 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.timefreq', 'NaN', 1, 'Inf', 1)
86 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.istime', 'NaN', 1, 'Inf', 1, 'values', [0, 1])
87
[25688]88 # Check that love numbers are provided at the same level of accuracy
[25166]89 if (self.h.shape[0] != self.k.shape[0]) or (self.h.shape[0] != self.l.shape[0]):
[25154]90 raise ValueError('lovenumbers error message: love numbers should be provided at the same level of accuracy')
[26301]91
92 ntf = len(self.timefreq)
[26317]93 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]94 raise ValueError('lovenumbers error message: love numbers should have as many time/frequency steps as the time/frequency vector')
95
[25688]96 return md
[25157]97 #}}}
[25154]98
[26178]99 def defaultoutputs(self, md): #{{{
[25154]100 return[]
[25157]101 #}}}
[25154]102
[26178]103 def marshall(self, prefix, md, fid): #{{{
[25154]104 WriteData(fid, prefix, 'object', self, 'fieldname', 'h', 'name', 'md.solidearth.lovenumbers.h', 'format', 'DoubleMat', 'mattype', 1)
105 WriteData(fid, prefix, 'object', self, 'fieldname', 'k', 'name', 'md.solidearth.lovenumbers.k', 'format', 'DoubleMat', 'mattype', 1)
106 WriteData(fid, prefix, 'object', self, 'fieldname', 'l', 'name', 'md.solidearth.lovenumbers.l', 'format', 'DoubleMat', 'mattype', 1)
107
108 WriteData(fid, prefix, 'object', self, 'fieldname', 'th', 'name', 'md.solidearth.lovenumbers.th', 'format', 'DoubleMat', 'mattype', 1)
109 WriteData(fid, prefix, 'object', self, 'fieldname', 'tk', 'name', 'md.solidearth.lovenumbers.tk', 'format', 'DoubleMat', 'mattype', 1)
110 WriteData(fid, prefix, 'object', self, 'fieldname', 'tl', 'name', 'md.solidearth.lovenumbers.tl', 'format', 'DoubleMat', 'mattype', 1)
111 WriteData(fid, prefix, 'object', self, 'data', self.tk2secular, 'fieldname', 'lovenumbers.tk2secular', 'format', 'Double')
[26301]112
113 if (self.istime):
114 scale = md.constants.yts
115 else:
116 scale = 1.0 / md.constants.yts
117 WriteData(fid, prefix, 'object', self, 'fieldname', 'istime', 'name', 'md.solidearth.lovenumbers.istime', 'format', 'Boolean')
118 WriteData(fid, prefix, 'object', self, 'fieldname', 'timefreq', 'name', 'md.solidearth.lovenumbers.timefreq', 'format', 'DoubleMat', 'mattype', 1, 'scale', scale);
[25157]119 #}}}
[25154]120
[26178]121 def extrude(self, md): #{{{
[25154]122 return
[25157]123#}}}
Note: See TracBrowser for help on using the repository browser.