source: CMIP6dreqbuild/trunk/src/workbook/choiceCfg.py @ 904

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/choiceCfg.py
Revision 904, 10.1 KB checked in by mjuckes, 4 years ago (diff)

clearing old aerchemmip code

Line 
1import uuid, string
2
3#('uid','stid','label','title','description','vid', \
4#                   'deflate_level', 'shuffle', 'ok_max_mean_abs', 'flag_meanings', 'type', 'ok_min_mean_abs',  \
5#                   'deflate', 'valid_min', 'flag_values', 'modeling_realm', 'valid_max', 'positive', 'mipTable', \
6#                   'prov', 'provNote', 'frequency', 'rowIndex', 'coordinates')
7
8def labify( thisl ):
9              if string.find( thisl, '_' ) != -1:
10                thisl = string.replace( thisl, '_', '-' )
11              if string.find( thisl, '*' ) != -1:
12                thisl = string.replace( thisl, '*', '-' )
13              if string.find( thisl, '!' ) != -1:
14                thisl = string.replace( thisl, '!', '-' )
15              if string.find( thisl, ' ' ) != -1:
16                thisl = string.replace( thisl, ' ', '-' )
17              if string.find( thisl, ':' ) != -1:
18                thisl = string.replace( thisl, ':', '-' )
19              return thisl
20
21class choices(object):
22  def __init__(self, main):
23    self.main = main
24    self.highResMip()
25    self.DynVar()
26    self.configOptions()
27    classes = {'RedundancySet':['Redundancy Set', 'Set with an integer set to each element, such that higher value elements render lower values redundant. Where values are the same there is overlap but no complete redundancy'], \
28           'ConfigDependency':['Model Configuration Dependency', 'One or more variables which may be required only for specific model configurations']}
29
30  def configOptions(self):
31    self.varChoiceLnkCfg = []
32    self.varChoiceLnkCfgInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'cfgid', 'cfg']
33
34    boussinesqOnly = ['rhozero']
35    cfgid = 'BoussinesqOcean'
36    uid  = 'BoussinesqOceanOptionSet'
37    for var in boussinesqOnly:
38      vids = set( self.main.vars1[var] )
39      cm = [i for i in self.main.cmv if i[5] in vids]
40      for c in cm:
41        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, 'true'] )
42    label = uid
43    desc = 'Variable(s) only required for models with Boussinesq oceans.'
44    title = 'Option set for %s' % cfgid
45    thisClass = 'ConfigurationOptionSet'
46    this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':string.join(boussinesqOnly,','), 'optionList':'', 'description':desc }
47    self.choices[uid] = this
48
49## masscello
50    var = 'masscello'
51    vids = set( self.main.vars1[var] )
52    cm = [i for i in self.main.cmv if i[5] in vids]
53    uid='boussinesq-%s' % var
54    cfgid = 'BoussinesqOceanConstantTh'
55    for c in cm:
56        cfg = string.lower( str(c[21] == 'fx') )
57        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, cfg] )
58    label = '%s' % var
59    desc = 'The ocean grid cell mass (masscello) can be supplied as a fixed field for Boussinesq models if the grid cell thickness is constant in time. Otherwise, this variable is required at monthly frequency.'
60    title = 'Option set for %s' % cfgid
61    thisClass = 'ConfigurationOptionSet'
62    this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':var, 'optionList':'', 'description':desc }
63    self.choices[uid] = this
64
65## ficeberg
66    var = 'ficeberg'
67    vids = set( self.main.vars1[var] )
68    cm = [i for i in self.main.cmv if i[5] in vids]
69    uid='iceberg-%s' % var
70    cfgid = 'DepthResolvedIcebergMelt'
71    for c in cm:
72        cmv = str( c[2] )
73        cfg = string.lower( str(c[2] == 'ficeberg') )
74        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, cmv ), '%s [%s]' % ( var, cmv ), c[0], uid, cfgid, cfg] )
75    label = '%s' % var
76    desc = 'The freshwater flux from melting icebergs should be provided as a depth dependent field if possible, otherwise as a depth integrated flux.'
77    title = 'Option set for %s' % cfgid
78    thisClass = 'ConfigurationOptionSet'
79    this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':var, 'optionList':'', 'description':desc }
80    self.choices[uid] = this
81
82## meridional averaged ocean diagnostics
83    vars = ['msftmyz', 'msftmrho', 'msftmzmpa', 'msftmrhompa', 'msftmzsmpa']
84    uid='meridionalOverturning-%s' % var
85    cfgid = 'CartesianOceanGrid'
86    cfg = 'false'
87    for var in vars:
88      vids = set( self.main.vars1[var] )
89      cm = [i for i in self.main.cmv if i[5] in vids]
90      for c in cm:
91        self.varChoiceLnkCfg.append( [str(uuid.uuid1()), var, var, c[0], uid, cfgid, cfg] )
92    label = '%s' % var
93    desc = 'For models which do not have a Cartesian ocean grid (with grid lines of constant latitude) the meridional overturning fluxes should be provided both relative to the grid and as an approximated zonal mean using a zig-zag path'
94    title = 'Option set for %s' % cfgid
95    thisClass = 'ConfigurationOptionSet'
96    this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':var, 'optionList':'', 'description':desc }
97    self.choices[uid] = this
98
99## sometimes fixed, sometimes not ....
100    vars = ['lithk', 'topg']
101    cfgid = 'BoussinesqOceanConstantTh'
102    for v in vars:
103      uid='whenFixed-%s' % var
104      cfgid = 'SometimesFixed-%s' % var
105      vids = set( self.main.vars1[var] )
106      cm = [i for i in self.main.cmv if i[5] in vids]
107      for c in cm:
108        print ( 'INFO.whenFx.00001: %s: %s' % ( var, c[21] ) )
109        cfg = string.lower( str(c[21] == 'fx') )
110        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, cfg] )
111      label = '%s' % var
112      desc = 'Variables which may be fixed in some models and tme varying in others have two CMOR table entries: one fixed and one with appropriate temporal variation'
113      title = 'Option set for %s' % cfgid
114      thisClass = 'ConfigurationOptionSet'
115      this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':var, 'optionList':'', 'description':desc }
116      self.choices[uid] = this
117
118## advection terms can be optional
119## opottemp*, ocontemp* and osalt*
120## Xrmadvect, Xpadvect, Xpsmadvect
121##  opottemppadvect
122
123  def highResMip(self):
124
125    desc = 'The 3hrPlev and 6hrPlev_extr fields overlap'
126
127    self.choices = {}
128    self.varChoiceLnk = []
129    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
130
131    ##for var in ['ta','ua','va','wap','hus']:
132    for var in ['ta','ua','va','hus']:
133      vids = set( self.main.vars1[var] )
134      cm = [i for i in self.main.cmv if i[5] in vids]
135      ##for c in cm:
136        ##print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
137      cc = ''
138      opts = ''
139##
140## note that uid is intended for use as part of a URL .... need to be careful with character choice
141##
142      uid='choices_HighResMIP.overlap.%s' % var
143      label = 'overlap-%s' % var
144      title = 'Redundancy Set for HighResMIP pressure level %s' % var
145      thisClass = 'RedundancySet'
146##
147## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev: 6hr, 3lev
148##
149      ol = [2,2,1]
150      ix = 0
151##HighResMIP [3hrPlev]
152      ok = []
153      grps = {'ta':['3hrPlev','6hrPlev_extr','6hrPlev'], 'wap':['3hrPlev','6hrPlev_extr_dr','6hrPlev'],
154              'hus':['3hrPlev','6hrPlev_extr'] }
155      ranks = {'3hrPlev':3,'6hrPlev_extr':2,'6hrPlev_extr_dr':1, '6hrPlev':0}
156     
157##
158## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
159##
160## need to add some 27 level fields, but 1st clarify requirements
161##
162      s1 = {c[19] for c in cm}
163      ##
164      ##
165      for grp in grps.get( var, ['3hrPlev','6hrPlev_extr','6hrPlev']):
166        c0 = [c for c in cm if c[19].find( '[%s]' % grp) != -1]
167        thisl = labify( '%s-%s' % (var, grp) )
168        title = '%s [%s]' % (var, grp)
169        ok.append( len(c0)  == 1 )
170        cc += '%s:%s; ' % (grp,var)
171        opts += '%s; ' % ol[ix]
172        ix += 1
173        if len(c0 ) == 1:
174          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c0[0][0], uid, str(ranks[grp]) ] )
175        else:
176          print 'ERROR.ivg001.0001: Group %s not found' % grp
177          print 'ERROR.ivg001.0002:',s1, var
178
179      if not all(ok):
180        print 'ERROR.070.020001: not all groups found for %s [%s]' % (var,str(ok))
181      else:
182        print 'INFO.070.020001: all groups found for %s [%s]' % (var,str(ok))
183
184      this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
185      self.choices[uid] = this
186
187  def DynVar(self):
188
189    desc = 'Pressure level fields overlap ... priority 1: 10 levels, 2: 17 levels, 3: 23 levels'
190
191    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
192
193    for var in ['ta','ua','va','wap','hus','zg']:
194      vids = set( self.main.vars1[var] )
195      cm = [i for i in self.main.cmv if i[5] in vids]
196      ##for c in cm:
197        ##print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
198      cc = ''
199      opts = ''
200##
201## note that uid is intended for use as part of a URL .... need to be careful with character choice
202##
203      uid='choices_DynVar.overlap.%s' % var
204      label = 'overlap-%s' % var
205      title = 'Redundancy Set for DynVar pressure level %s' % var
206      thisClass = 'RedundancySet'
207##
208## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev
209##
210      ol = [2,2,1]
211      ix = 0
212##HighResMIP [3hrPlev]
213      ok = []
214      grps = {'ta':['3hrPlev','6hrPlev_extr'], 'wap':['3hrPlev','6hrPlev_extr_dr'] }
215      ranks = {'23':3,'17':2,'10':1}
216     
217##
218## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
219##
220## need to add some 27 level fields, but 1st clarify requirements
221##
222      for grp in ['DYVR_daily',]:
223        c0 = [c for c in cm if c[19] == 'DynVar [%s]' % grp]
224        for c in c0:
225          lab = c[2]
226          thisl = labify( '%s-%s' % (lab, grp) )
227          title = '%s [%s]' % (lab, grp)
228          cc += '%s:%s; ' % (grp,var)
229          rk = lab[-2:]
230          assert rk in ranks, 'Could not identify rank for: %s' % str(c)
231          opts += '%s; ' % ol[ix]
232          ix += 1
233          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c[0], uid, str(ranks[rk]) ] )
234      this = {'uid':uid, 'label':label, 'title':title, 'choiceClass':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
235      self.choices[uid] = this
236
Note: See TracBrowser for help on using the repository browser.