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

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

partial updates for AerChemMIP, SIMIP

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        print ( 'INFO.xxx.00005: %s: %s, %s' % ( var, c[21], c[2] ) )
42        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, 'true'] )
43    label = uid
44    desc = 'Variable(s) only required for models with Boussinesq oceans.'
45    title = 'Option set for %s' % cfgid
46    thisClass = 'ConfigurationOptionSet'
47    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':string.join(boussinesqOnly,','), 'optionList':'', 'description':desc }
48    self.choices[uid] = this
49
50## masscello
51    var = 'masscello'
52    vids = set( self.main.vars1[var] )
53    cm = [i for i in self.main.cmv if i[5] in vids]
54    uid='boussinesq-%s' % var
55    cfgid = 'BoussinesqOceanConstantTh'
56    for c in cm:
57        print ( 'INFO.xxx.00005: %s: %s' % ( var, c[21] ) )
58        cfg = string.lower( str(c[21] == 'fx') )
59        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, c[21] ), '%s [%s]' % ( var, c[21] ), c[0], uid, cfgid, cfg] )
60    label = '%s' % var
61    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.'
62    title = 'Option set for %s' % cfgid
63    thisClass = 'ConfigurationOptionSet'
64    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':var, 'optionList':'', 'description':desc }
65    self.choices[uid] = this
66
67## ficeberg
68    var = 'ficeberg'
69    vids = set( self.main.vars1[var] )
70    cm = [i for i in self.main.cmv if i[5] in vids]
71    uid='iceberg-%s' % var
72    cfgid = 'DepthResolvedIcebergMelt'
73    for c in cm:
74        print ( 'INFO.xxx.00005: %s: %s, %s' % ( var, c[21], c[2] ) )
75        cmv = str( c[2] )
76        cfg = string.lower( str(c[2] == 'ficeberg') )
77        self.varChoiceLnkCfg.append( [str(uuid.uuid1()),'%s-%s' % ( var, cmv ), '%s [%s]' % ( var, cmv ), c[0], uid, cfgid, cfg] )
78    label = '%s' % var
79    desc = 'The freshwater flux from melting icebergs should be provided as a depth dependent field if possible, otherwise as a depth integrated flux.'
80    title = 'Option set for %s' % cfgid
81    thisClass = 'ConfigurationOptionSet'
82    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':var, 'optionList':'', 'description':desc }
83    self.choices[uid] = this
84
85## meridional averaged ocean diagnostics
86    vars = ['msftmyz', 'msftmrho', 'msftmzmpa', 'msftmrhompa', 'msftmzsmpa']
87    uid='meridionalOverturning-%s' % var
88    cfgid = 'CartesianOceanGrid'
89    cfg = 'false'
90    for var in vars:
91      vids = set( self.main.vars1[var] )
92      cm = [i for i in self.main.cmv if i[5] in vids]
93      for c in cm:
94        print ( 'INFO.xxx.00005: %s: %s, %s' % ( var, c[21], c[2] ) )
95        self.varChoiceLnkCfg.append( [str(uuid.uuid1()), var, var, c[0], uid, cfgid, cfg] )
96    label = '%s' % var
97    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'
98    title = 'Option set for %s' % cfgid
99    thisClass = 'ConfigurationOptionSet'
100    this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':var, 'optionList':'', 'description':desc }
101    self.choices[uid] = this
102
103## advection terms can be optional
104## opottemp*, ocontemp* and osalt*
105## Xrmadvect, Xpadvect, Xpsmadvect
106##  opottemppadvect
107
108  def highResMip(self):
109
110    desc = 'The 3hrPlev and 6hrPlev_extr fields overlap'
111
112    self.choices = {}
113    self.varChoiceLnk = []
114    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
115
116    ##for var in ['ta','ua','va','wap','hus']:
117    for var in ['ta','ua','va','hus']:
118      vids = set( self.main.vars1[var] )
119      cm = [i for i in self.main.cmv if i[5] in vids]
120      for c in cm:
121        print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
122      cc = ''
123      opts = ''
124##
125## note that uid is intended for use as part of a URL .... need to be careful with character choice
126##
127      uid='choices_HighResMIP.overlap.%s' % var
128      label = 'overlap-%s' % var
129      title = 'Redundancy Set for HighResMIP pressure level %s' % var
130      thisClass = 'RedundancySet'
131##
132## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev: 6hr, 3lev
133##
134      ol = [2,2,1]
135      ix = 0
136##HighResMIP [3hrPlev]
137      ok = []
138      grps = {'ta':['3hrPlev','6hrPlev_extr','6hrPlev'], 'wap':['3hrPlev','6hrPlev_extr_dr','6hrPlev'],
139              'hus':['3hrPlev','6hrPlev_extr'] }
140      ranks = {'3hrPlev':3,'6hrPlev_extr':2,'6hrPlev_extr_dr':1, '6hrPlev':0}
141     
142##
143## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
144##
145## need to add some 27 level fields, but 1st clarify requirements
146##
147      s1 = {c[19] for c in cm}
148      ##
149      ##
150      for grp in grps.get( var, ['3hrPlev','6hrPlev_extr','6hrPlev']):
151        c0 = [c for c in cm if c[19].find( '[%s]' % grp) != -1]
152        thisl = labify( '%s-%s' % (var, grp) )
153        title = '%s [%s]' % (var, grp)
154        ok.append( len(c0)  == 1 )
155        cc += '%s:%s; ' % (grp,var)
156        opts += '%s; ' % ol[ix]
157        ix += 1
158        if len(c0 ) == 1:
159          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c0[0][0], uid, str(ranks[grp]) ] )
160        else:
161          print 'Group %s not found' % grp
162          print s1, var
163
164      if not all(ok):
165        print 'ERROR.070.020001: not all groups found for %s [%s]' % (var,str(ok))
166      else:
167        print 'INFO.070.020001: all groups found for %s [%s]' % (var,str(ok))
168
169      this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
170      self.choices[uid] = this
171
172  def DynVar(self):
173
174    desc = 'Pressure level fields overlap ... priority 1: 10 levels, 2: 17 levels, 3: 23 levels'
175
176    self.varChoiceLnkInfo = [ 'uid', 'label', 'title', 'vid', 'cid', 'rank']
177
178    for var in ['ta','ua','va','wap','hus','zg']:
179      vids = set( self.main.vars1[var] )
180      cm = [i for i in self.main.cmv if i[5] in vids]
181      for c in cm:
182        print ( 'INFO.xxx.00001: %s: %s' % ( var, str(c) ) )
183      cc = ''
184      opts = ''
185##
186## note that uid is intended for use as part of a URL .... need to be careful with character choice
187##
188      uid='choices_DynVar.overlap.%s' % var
189      label = 'overlap-%s' % var
190      title = 'Redundancy Set for DynVar pressure level %s' % var
191      thisClass = 'RedundancySet'
192##
193## in order, 3hr, 4lev: 6hr, 7lev: 6hr, 4lev
194##
195      ol = [2,2,1]
196      ix = 0
197##HighResMIP [3hrPlev]
198      ok = []
199      grps = {'ta':['3hrPlev','6hrPlev_extr'], 'wap':['3hrPlev','6hrPlev_extr_dr'] }
200      ranks = {'23':3,'17':2,'10':1}
201     
202##
203## initial inclusion of 6hrPlev_extr_dr was an error ... these are time mean fields.
204##
205## need to add some 27 level fields, but 1st clarify requirements
206##
207      for grp in ['DYVR_daily',]:
208        c0 = [c for c in cm if c[19] == 'DynVar [%s]' % grp]
209        for c in c0:
210          lab = c[2]
211          thisl = labify( '%s-%s' % (lab, grp) )
212          title = '%s [%s]' % (lab, grp)
213          cc += '%s:%s; ' % (grp,var)
214          rk = lab[-2:]
215          assert rk in ranks, 'Could not identify rank for: %s' % str(c)
216          opts += '%s; ' % ol[ix]
217          ix += 1
218          self.varChoiceLnk.append( [str(uuid.uuid1()), thisl, title,  c[0], uid, str(ranks[rk]) ] )
219      this = {'uid':uid, 'label':label, 'title':title, 'class':thisClass, 'varList':cc, 'optionList':opts, 'description':desc }
220      self.choices[uid] = this
221
Note: See TracBrowser for help on using the repository browser.