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

Last change on this file since 25183 was 25183, checked in by jdquinn, 5 years ago

BUG: Corrected remaining tests (Love number retrieval)

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