data_convention.py 31.8 KB
Newer Older
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        if count >= self.config.cmor.min_cmorized_vars:
            return True
        return False

class CMIP6Convention(Cmor3Convention):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    """Class managing CMIP6 file conventions"""
class PrimaveraConvention(Cmor3Convention):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    """Class managing Primavera file conventions"""
class MeteoFranceConvention(DataConvention):
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    """Class managing MeteoFrance file conventions"""
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def get_file_name(
        self,
        startdate,
        member,
        domain,
        var,
        cmor_var,
        frequency,
        chunk,
        year,
        date_str,
        grid,
    ):
        """
        Get filename for a given configuration

        Parameters
        ----------
        startdate: str
        member: int
        domain: ModelingRealm
        var: str
        cmor_var: Variable
        frequency: Frequency
        chunk: int or None
        year: int or None
        date_str: str or None
        grid: str or None

        Returns
        -------
        str

        """
        if year is not None:
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            raise ValueError("Year not supported with MeteoFrance convention")
        if date_str is not None:
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            raise ValueError(
                "Date_str not supported with MeteoFrance convention"
            )
        if chunk is None:
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
            raise ValueError(
                "Chunk must be provided in MeteoFrance convention"
            )
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        time_bound = self._get_chunk_time_bounds(startdate, chunk, frequency)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        file_name = "{0}_{1}_{2}_{3}.nc".format(
            var, frequency, time_bound, self.get_member_str(member)
        )
        return file_name

Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def get_cmor_folder_path(
        self, startdate, member, domain, var, frequency, grid, cmor_var
    ):
        folder_path = os.path.join(
            self.config.data_dir,
            self.experiment_name(startdate),
            "H{0}".format(chr(64 + int(startdate[4:6]))),
            startdate[0:4],
        )
        return folder_path

    def get_member_str(self, member):
        """
        Transalate member number to member string

        Parameters
        ----------
        member: int

        Returns
        -------
        str

        """
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        return "{0:02d}".format(member)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def _get_chunk_time_bounds(self, startdate, chunk, frequency):
        start = parse_date(startdate)
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
        chunk_start = chunk_start_date(
            start,
            chunk,
            self.config.experiment.chunk_size,
            "month",
            self.config.experiment.calendar,
        )
        time_bound = "{0:04}{1:02}".format(chunk_start.year, chunk_start.month)
        return time_bound
Javier Vegas-Regidor's avatar
Javier Vegas-Regidor committed
    def create_link(
        self, domain, filepath, frequency, var, grid, move_old, vartype
    ):
        """
        Create file link

        In this convention, it does nothing

        Parameters
        ----------
        domain: ModelingRealm
        filepath: str
        frequency: Frequency
        var: str
        grid: str
        move_old: bool
        vartype: VariableType

        """
        pass

    def create_links(self, startdate, member=None):
        """
        Create links for a given startdate or member

        In this convention, it does nothing

        Parameters
        ----------
        startdate: str
        member: int or None

        """
        pass

    def is_cmorized(self, startdate, member, chunk, domain):
        """
        Check if a given chunk is cmorized for a given domain

        Parameters
        ----------
        startdate: str
        member: str
        chunk: int
        domain: ModelingRealm

        Returns
        -------
        bool

        Raises
        ------
        NotImplementedError:
            If not implemented by the derived classes

        """
        return True