source: issm/trunk/src/m/classes/lovenumbers.py@ 25836

Last change on this file since 25836 was 25836, checked in by Mathieu Morlighem, 4 years ago

merged trunk-jpl and trunk for revision 25834

File size: 4.8 KB
Line 
1import numpy as np
2
3from checkfield import checkfield
4from fielddisplay import fielddisplay
5from getlovenumbers import getlovenumbers
6from pairoptions import pairoptions
7from WriteData import WriteData
8
9
10class lovenumbers(object): #{{{
11 """LOVENUMBERS class definition
12
13 Usage:
14 lovenumbers = lovenumbers() #will setup love numbers deg 1001 by default
15 lovenumbers = lovenumbers('maxdeg', 10001); #supply numbers of degrees required (here, 10001)
16 """
17
18 def __init__(self, *args): #{{{
19 # Regular love numbers
20 self.h = [] # Provided by PREM model
21 self.k = [] # idem
22 self.l = [] # idem
23
24 # Tidal love numbers for computing rotational feedback
25 self.th = []
26 self.tk = []
27 self.tl = []
28 self.tk2secular = 0 # deg 2 secular number
29
30 options = pairoptions(*args)
31 maxdeg = options.getfieldvalue('maxdeg', 1000)
32 referenceframe = options.getfieldvalue('referenceframe', 'CM')
33 self.setdefaultparameters(maxdeg, referenceframe)
34 #}}}
35
36 def setdefaultparameters(self, maxdeg, referenceframe): #{{{
37 # Initialize love numbers
38 self.h = getlovenumbers('type', 'loadingverticaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
39 self.k = getlovenumbers('type', 'loadinggravitationalpotential', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
40 self.l = getlovenumbers('type', 'loadinghorizontaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
41 self.th = getlovenumbers('type', 'tidalverticaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
42 self.tk = getlovenumbers('type', 'tidalgravitationalpotential', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
43 self.tl = getlovenumbers('type', 'tidalhorizontaldisplacement', 'referenceframe', referenceframe, 'maxdeg', maxdeg)
44
45 # Secular fluid love number
46 self.tk2secular = 0.942
47 return self
48 #}}}
49
50 def checkconsistency(self, md, solution, analyses): #{{{
51 if ('SealevelriseAnalysis' not in analyses) or (solution == 'TransientSolution' and not md.transient.isslr):
52 return
53 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.h', 'NaN', 1, 'Inf', 1)
54 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.k', 'NaN', 1, 'Inf', 1)
55 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.l', 'NaN', 1, 'Inf', 1)
56
57 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.th', 'NaN', 1, 'Inf', 1)
58 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk', 'NaN', 1, 'Inf', 1)
59 md = checkfield(md, 'fieldname', 'solidearth.lovenumbers.tk2secular', 'NaN', 1, 'Inf', 1)
60 # Check that love numbers are provided at the same level of accuracy
61 if (self.h.shape[0] != self.k.shape[0]) or (self.h.shape[0] != self.l.shape[0]):
62 raise ValueError('lovenumbers error message: love numbers should be provided at the same level of accuracy')
63 return md
64 #}}}
65
66 def defaultoutputs(self, md): #{{{
67 return[]
68 #}}}
69
70 def __repr__(self): #{{{
71 s = ' lovenumbers parameters:\n'
72 s += '{}\n'.format(fielddisplay(self, 'h', 'load Love number for radial displacement'))
73 s += '{}\n'.format(fielddisplay(self, 'k', 'load Love number for gravitational potential perturbation'))
74 s += '{}\n'.format(fielddisplay(self, 'l', 'load Love number for horizontal displacements'))
75 s += '{}\n'.format(fielddisplay(self, 'th', 'tidal load Love number (deg 2)'))
76 s += '{}\n'.format(fielddisplay(self, 'tk', 'tidal load Love number (deg 2)'))
77 s += '{}\n'.format(fielddisplay(self, 'tk2secular', 'secular fluid Love number'))
78 return s
79 #}}}
80
81 def marshall(self, prefix, md, fid): #{{{
82 WriteData(fid, prefix, 'object', self, 'fieldname', 'h', 'name', 'md.solidearth.lovenumbers.h', 'format', 'DoubleMat', 'mattype', 1)
83 WriteData(fid, prefix, 'object', self, 'fieldname', 'k', 'name', 'md.solidearth.lovenumbers.k', 'format', 'DoubleMat', 'mattype', 1)
84 WriteData(fid, prefix, 'object', self, 'fieldname', 'l', 'name', 'md.solidearth.lovenumbers.l', 'format', 'DoubleMat', 'mattype', 1)
85
86 WriteData(fid, prefix, 'object', self, 'fieldname', 'th', 'name', 'md.solidearth.lovenumbers.th', 'format', 'DoubleMat', 'mattype', 1)
87 WriteData(fid, prefix, 'object', self, 'fieldname', 'tk', 'name', 'md.solidearth.lovenumbers.tk', 'format', 'DoubleMat', 'mattype', 1)
88 WriteData(fid, prefix, 'object', self, 'fieldname', 'tl', 'name', 'md.solidearth.lovenumbers.tl', 'format', 'DoubleMat', 'mattype', 1)
89 WriteData(fid, prefix, 'object', self, 'data', self.tk2secular, 'fieldname', 'lovenumbers.tk2secular', 'format', 'Double')
90 #}}}
91
92 def extrude(self, md): #{{{
93 return
94#}}}
Note: See TracBrowser for help on using the repository browser.