Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import numpy as np
from autosubmit.config.log import Log
from earthdiagnostics import Diagnostic, TempFile, Utils
from models import Models
class ConvectionSites(Diagnostic):
def __init__(self, data_manager, startdate, member, chunk, nemo_version):
Diagnostic.__init__(self, data_manager)
self.startdate = startdate
self.member = member
self.chunk = chunk
self.nemo_version = nemo_version
self.required_vars = ['vsftbarot']
self.generated_vars = ['gyres']
@classmethod
def generate_jobs(cls, diags, options):
job_list = list()
for startdate in diags.startdates:
for member in diags.members:
for chunk in range(1, diags.chunks + 1):
job_list.append(ConvectionSites(diags.data_manager, startdate, member, chunk, diags.nemo_version))
return job_list
def compute(self):
"""
Compute the intensity of convection in the four main convection sites
Created in October 2013 Author : vguemas@ic3.cat
:param input_file: input oce file name containing mlotst
:param input_grid: input grid
:param output_file: output file name (=> index)
:return:
"""
if self.nemo_version in [Models.ECEARTH_2_3_O1L42, Models.ECEARTH_3_0_O1L46,
Models.NEMO_3_2_O1L42, Models.NEMO_3_3_O1L46,
Models.NEMOVAR_O1L42]:
labrador = [225, 245, 215, 255]
irminger = [245, 290, 215, 245]
gin = [260, 310, 245, 291]
wedell = [225, 280, 1, 50]
elif self.nemo_version in [Models.ECEARTH_3_0_O25L46, Models.ECEARTH_3_0_O25L75,
Models.GLORYS2_V1_O25L75]:
raise Exception("Option convection not available yet for {0}".format(self.nemo_version))
else:
raise Exception("Input grid {0} not recognized".format(self.nemo_version))
mlotst_file = self.data_manager.get_file('ocean', 'mlotst', self.startdate, self.member, self.chunk)
output = TempFile.get()
self.mlotst_handler = Utils.openCdf(mlotst_file)
handler = Utils.openCdf(output, 'w')
handler.createDimension('time')
handler.createDimension('region', 4)
Utils.copy_variable(self.mlotst_handler, handler, 'time')
var_region = handler.createVariable('region', str, 'region')
var_gyre = handler.createVariable('site', 'f', ('time', 'region'))
var_gyre.short_name = 'site'
var_gyre.long_name = 'convection sites'
var_gyre.units = 'm^3/s'
var_region[0] = 'labrador'
var_gyre[:, 0] = self._convection_site(labrador)
var_region[1] = 'irminger'
var_gyre[:, 1] = self._convection_site(irminger)
var_region[2] = 'gin'
var_gyre[:, 2] = self._convection_site(gin)
var_region[3] = 'wedell'
var_gyre[:, 3] = self._convection_site(wedell)
self.mlotst_handler.close()
handler.close()
self.data_manager.send_file(output, 'ocean', 'site', self.startdate, self.member, self.chunk)
Log.info('Finished convection sites for startdate {0}, member {1}, chunk {2}',
self.startdate, self.member, self.chunk)
def _convection_site(self, site):
return np.max(self.mlotst_handler.variables['mlotst'][:, site[2]-1:site[3]-1, site[0]-1:site[1]-1], (1, 2))