Newer
Older
import numpy as np
from autosubmit.config.log import Log
from earthdiagnostics import cdftools
from earthdiagnostics.basins import Basins
from earthdiagnostics.diagnostic import Diagnostic
from earthdiagnostics.utils import Utils, TempFile
class Moc(Diagnostic):
"""
Compute the MOC for oceanic basins
:original author: Virginie Guemas <virginie.guemas@bsc.es>
:contributor: Javier Vegas-Regidor<javier.vegas@bsc.es>
:created: March 2012
:last modified: June 2016
"""
def __init__(self, data_manager, startdate, member, chunk):
Diagnostic.__init__(self, data_manager)
self.startdate = startdate
self.member = member
self.chunk = chunk
self.required_vars = ['vo']
self.generated_vars = ['vsftmyz']
def __str__(self):
return 'MOC Startdate: {0} Member: {1} Chunk: {2}'.format(self.startdate, self.member, self.chunk)
@classmethod
def generate_jobs(cls, diags, options):
"""
Creates a job for each chunk to compute the diagnostic
:param diags: Diagnostics manager class
:type diags: Diags
:param options: None
:return:
"""
if len(options) > 1:
raise Exception('The MOC diagnostic has no options')
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
88
89
90
91
92
93
job_list = list()
for startdate in diags.startdates:
for member in diags.members:
for chunk in range(1, diags.chunks + 1):
job_list.append(Moc(diags.data_manager, startdate, member, chunk))
return job_list
def compute(self):
temp = TempFile.get()
input_file = self.data_manager.get_file('ocean', 'vo', self.startdate, self.member, self.chunk)
Log.debug('Computing MOC')
cdftools.run('cdfmoc', input=input_file, output=temp)
Utils.nco.ncks(input=input_file, output=temp, options='-A -v lev')
Utils.convert2netcdf4(temp)
Log.debug('Reformatting variables')
handler = Utils.openCdf(temp)
handler.createDimension('basin', 5)
handler.createVariable('basin', str, 'basin')
handler.variables['basin'][:] = np.array([Basins.Global.fullname, Basins.Atlantic.fullname,
Basins.Pacific.fullname, Basins.IndoPacific.fullname,
Basins.Indian.fullname], dtype=object)
example = handler.variables['zomsfglo']
# noinspection PyProtectedMember
moc = handler.createVariable('vsftmyz', example.datatype,
('time', 'lev', 'i', 'j', 'basin'),
fill_value=example._FillValue)
moc.units = example.units
moc.add_offset = example.add_offset
moc.scale_factor = example.scale_factor
moc[:, :, :, :, 0] = handler.variables['zomsfglo'][:]
moc[:, :, :, :, 1] = handler.variables['zomsfatl'][:]
moc[:, :, :, :, 2] = handler.variables['zomsfpac'][:]
moc[:, :, :, :, 3] = handler.variables['zomsfinp'][:]
moc[:, :, :, :, 4] = handler.variables['zomsfind'][:]
handler.close()
Utils.nco.ncks(input=temp, output=temp,
options='-O -x -v zomsfglo,zomsfatl,zomsfpac,zomsfinp,zomsfind,zomsfinp0')
Utils.setminmax(temp, 'vsftmyz')
self.data_manager.send_file(temp, 'ocean', 'vsftmyz', self.startdate, self.member, self.chunk)