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
Line 
1import numpy as np
2from checkfield import checkfield
3from fielddisplay import fielddisplay
4from getlovenumbers import getlovenumbers
5from pairoptions import pairoptions
6from WriteData import WriteData
7
8
9class lovenumbers(object): #{{{
10 """LOVENUMBERS class definition
11
12 Usage:
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)
18 """
19
20 def __init__(self, *args): #{{{
21 # Regular love numbers
22 self.h = [] # Provided by PREM model
23 self.k = [] # idem
24 self.l = [] # idem
25
26 # Tidal love numbers for computing rotational feedback
27 self.th = []
28 self.tk = []
29 self.tl = []
30 self.tk2secular = 0 # deg 2 secular number
31
32 # Time/frequency for visco-elastic love numbers
33 self.timefreq = []
34 self.istime = 1
35
36 options = pairoptions(*args)
37 maxdeg = options.getfieldvalue('maxdeg', 1000)
38 referenceframe = options.getfieldvalue('referenceframe', 'CM')
39 self.setdefaultparameters(maxdeg, referenceframe)
40 #}}}
41
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
56 def setdefaultparameters(self, maxdeg, referenceframe): #{{{
57 # Initialize love numbers
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)
64
65 # Secular fluid love number
66 self.tk2secular = 0.942
67
68 # Time
69 self.istime = 1 # Temporal love numbers by default
70 self.timefreq = np.zeros(1) # Elastic case by default
71 return self
72 #}}}
73
74 def checkconsistency(self, md, solution, analyses): #{{{
75 if ('SealevelchangeAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslc):
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.tl', 'NaN', 1, 'Inf', 1)
84 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk2secular', 'NaN', 1, 'Inf', 1)
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
88 # Check that love numbers are provided at the same level of accuracy
89 if (self.h.shape[0] != self.k.shape[0]) or (self.h.shape[0] != self.l.shape[0]):
90 raise ValueError('lovenumbers error message: love numbers should be provided at the same level of accuracy')
91
92 ntf = len(self.timefreq)
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):
94 raise ValueError('lovenumbers error message: love numbers should have as many time/frequency steps as the time/frequency vector')
95
96 return md
97 #}}}
98
99 def defaultoutputs(self, md): #{{{
100 return[]
101 #}}}
102
103 def marshall(self, prefix, md, fid): #{{{
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')
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);
119 #}}}
120
121 def extrude(self, md): #{{{
122 return
123#}}}
Note: See TracBrowser for help on using the repository browser.