ice.py 2.42 KB
Newer Older
from earthdiagnostics import Utils, cdftools, cdo, TempFile
from earthdiagnostics.basins import Basins
from autosubmit.config.log import Log
import shutil


class Ice(object):

    @staticmethod
    def siasiesiv(thickness_file, fraction_file, output_file, basin):
        """
        Compute the sea ice extent (1000km2), area (1000km2), volume (km3)
        and mean thickness (m) in both hemispheres or a specified region.

        Created in April 2012         Author : vguemas@ic3.cat
        Modified in June 2014         Author : neven.fuckar@ic3.cat

        Computation of the properties in various selected regions according to
        mask.regions.${NEMOVERSION}.nc (mask_regions.nc) is based on modification
        of mask.regions.ORCA1.noverticalinfo.Matt.nc from Matthieu Chevallier.
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        :param fraction_file:
        :param thickness_file:
        :param output_file: output file name
        :param basin: region of interest
        :return:
        """
        nco = Utils.nco
        input_scratch = TempFile.get()
        shutil.copy(thickness_file, input_scratch)
        nco.ncks(input=fraction_file, output=input_scratch, options='-A -v sic')
        ntime = int(cdo.ntime(input=input_scratch)[0])
        files = list()

        basin = Basins.parse(basin)
        if basin != Basins.Global:
            shutil.move('mask.nc', 'original_mask.nc')
            shutil.move('mask_regions.nc', 'mask.nc')
            Utils.rename_variable('mask.nc', basin.fullname, 'tmask')
        error = None
        try:
            for time in range(ntime):
                Log.info('Running time {0}', time)
                temp = TempFile.get()
                nco.ncks(input=input_scratch, output=temp, options='-O -d time,{0}'.format(time))
                cdftools.run('cdficediags', input=temp)
                Utils.move_file('icediags.nc', temp)
                files.append(temp)
        except Exception as ex:
            error = ex.message
        finally:
            if basin != Basins.Global:
                Utils.rename_variable('mask.nc', 'tmask', basin.fullname)
                shutil.move('mask.nc', 'mask_regions.nc')
                shutil.move('original_mask.nc', 'mask.nc')
            if error:
                raise Exception(error)

        temp = TempFile.get()
        cdo.cat(input=' '.join(files), output=temp,)
        nco.ncks(input=input_scratch, output=temp, options='-A -v time')
        Utils.move_file(temp, output_file)