# coding=utf-8 from earthdiagnostics.diagnostic import Diagnostic, DiagnosticOption, DiagnosticDomainOption, \ DiagnosticVariableListOption, DiagnosticIntOption from earthdiagnostics.modelingrealm import ModelingRealm from earthdiagnostics.utils import Utils, TempFile from earthdiagnostics.box import Box class SelectLevels(Diagnostic): """ Convert i j files to lon lat when there is no interpolation required, i.e. lon is constant over i and lat is constat over j :original author: Javier Vegas-Regidor :created: April 2017 :param data_manager: data management object :type data_manager: DataManager :param startdate: startdate :type startdate: str :param member: member number :type member: int :param chunk: chunk's number :type chunk: int :param variable: variable's name :type variable: str :param domain: variable's domain :type domain: ModelingRealm """ alias = 'selev' "Diagnostic alias for the configuration file" def __init__(self, data_manager, startdate, member, chunk, domain, variable, grid, first_level, last_level): Diagnostic.__init__(self, data_manager) self.startdate = startdate self.member = member self.chunk = chunk self.variable = variable self.domain = domain self.grid = grid self.box = Box(False) self.box.min_depth = first_level self.box.max_depth = last_level def __str__(self): return 'Select levels Startdate: {0} Member: {1} Chunk: {2} ' \ 'Variable: {3}:{4} Levels: {6}-{7} Grid: {5}'.format(self.startdate, self.member, self.chunk, self.domain, self.variable, self.grid, self.box.min_depth, self.box.max_depth) def __eq__(self, other): return self.startdate == other.startdate and self.member == other.member and self.chunk == other.chunk and \ self.domain == other.domain and self.variable == other.variable and self.grid == self.grid @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: domain,variables,grid :type options: list[str] :return: """ options_available = (DiagnosticDomainOption('domain'), DiagnosticVariableListOption('variables'), DiagnosticIntOption('first_level'), DiagnosticIntOption('last_level'), DiagnosticOption('grid', '')) options = cls.process_options(options, options_available) job_list = list() variables = options['variables'] for var in variables: for startdate, member, chunk in diags.config.experiment.get_chunk_list(): job_list.append(SelectLevels(diags.data_manager, startdate, member, chunk, options['domain'], var, options['grid'], options['first_level'],options['last_level'])) return job_list def compute(self): """ Runs the diagnostic """ variable_file = self.data_manager.get_file(self.domain, self.variable, self.startdate, self.member, self.chunk, grid=self.grid) Utils.nco.ncks(input=variable_file, output=variable_file, options='-O -d lev,{0.min_depth},{0.max_depth}'.format(self.box)) self.send_file(variable_file, self.domain, self.variable, self.startdate, self.member, self.chunk, grid=self.grid) def _create_var(self, var_name, var_values, source, destiny): old_var = source.variables[var_name] new_var = destiny.createVariable(var_name, old_var.dtype, dimensions=(var_name, )) new_var[:] = var_values Utils.copy_attributes(new_var, old_var) vertices_name = '{0}_vertices'.format(var_name) if vertices_name in source.variables: var_vertices = source.variables[vertices_name] if var_name == 'lon': vertices_values = var_vertices[0:1, ...] else: vertices_values = var_vertices[:, 0:1, :] new_lat_vertices = destiny.createVariable(vertices_name, var_vertices.dtype, dimensions=(var_name, 'vertices')) new_lat_vertices[:] = vertices_values Utils.copy_attributes(new_lat_vertices, var_vertices)