# (C) Copyright 2005- ECMWF.

#  Type of first fixed surface
codetable[1] typeOfFirstFixedSurface ('4.5.table',masterDir,localDir) : dump,edition_specific,string_type;
meta unitsOfFirstFixedSurface codetable_units(typeOfFirstFixedSurface) : dump;
meta nameOfFirstFixedSurface codetable_title(typeOfFirstFixedSurface) : dump;

#  Scale factor of first fixed surface
signed[1] scaleFactorOfFirstFixedSurface = missing()  : can_be_missing,dump,edition_specific;

#  Scaled value of first fixed surface
unsigned[4] scaledValueOfFirstFixedSurface = missing()  : can_be_missing,dump,edition_specific;

#  Type of second fixed surface
codetable[1] typeOfSecondFixedSurface ('4.5.table',masterDir,localDir) = 255 : dump,edition_specific;
meta unitsOfSecondFixedSurface codetable_units(typeOfSecondFixedSurface) : dump;
meta nameOfSecondFixedSurface codetable_title(typeOfSecondFixedSurface) : dump;

#  Scale factor of second fixed surface
signed[1] scaleFactorOfSecondFixedSurface = missing() : can_be_missing,dump,edition_specific;

#  Scaled value of second fixed surface
unsigned[4] scaledValueOfSecondFixedSurface = missing() : can_be_missing,dump,edition_specific;

transient pressureUnits="hPa";

# Aenderung 2.38.0 - concept_nofail vertical.typeOfLevel (unknown,"typeOfLevelConcept.def",conceptsDir2,conceptsDir1);
concept vertical.typeOfLevel (unknown,"typeOfLevelConcept.def",conceptsDir2,conceptsDir1);

alias levelType=typeOfFirstFixedSurface;

if (typeOfSecondFixedSurface==255) {
  # Only one surface
  meta level g2level(typeOfFirstFixedSurface,
    scaleFactorOfFirstFixedSurface,
    scaledValueOfFirstFixedSurface,
    pressureUnits)  :dump;
  transient bottomLevel=level;  # Do not use alias (see GRIB-725)
  transient topLevel=level;
} else {
  # Two surfaces
  meta topLevel g2level(typeOfFirstFixedSurface,
    scaleFactorOfFirstFixedSurface,
    scaledValueOfFirstFixedSurface,
    pressureUnits)  :dump;
  meta bottomLevel g2level(typeOfSecondFixedSurface,
    scaleFactorOfSecondFixedSurface,
    scaledValueOfSecondFixedSurface,
    pressureUnits)  :dump;
    alias level=topLevel;  # (see GRIB-725)
}
alias ls.level=level;
alias vertical.level=level;
alias vertical.bottomLevel=bottomLevel;
alias vertical.topLevel=topLevel;

alias extraDim=zero;
 if (defined(extraDimensionPresent)) {
	if (extraDimensionPresent) {
		alias extraDim=one;
	}
 }
 if (extraDim) {
	alias mars.levelist = dimension;
	alias mars.levtype = dimensionType;
 } else {
# DWD - Aenderung 2.25.0 || levtype is "o2d" hinzugefuegt
# ECC-1333: levtype should be read-only in GRIB2
	concept mars.levtype (unknown,"marsLevtypeConcept.def",conceptsDir2,conceptsDir1):no_copy, read_only;
        # GRIB-372: levelist alias does not pertain to surface parameters
#        if (levtype is "sfc" || levtype is "o2d") {
	transient tempLevtype = levtype; # Faster to copy the concept so we evaluate it once
    # See GRIB-74 why we store the pressureUnits in a transient
    transient tempPressureUnits=pressureUnits;
#	if (!(typeOfLevel is "surface")) {
	if ( ! (typeOfFirstFixedSurface == 1 && typeOfSecondFixedSurface == 255 tempLevtype is "sfc" || tempLevtype is "o2d") ) {
            if (tempPressureUnits is "Pa") {
                meta marsLevel scale(level,one,hundred) : read_only;
                alias mars.levelist=marsLevel;
            } else {
                alias mars.levelist = level;
            }
	}
# DWD - Aenderung ecmwf mit 2.24.0
# 	alias mars.levtype  = typeOfFirstFixedSurface;
#	if (tempLevtype is "sfc" || tempLevtype is "o2d") {
#                unalias mars.levelist;
#        }
 }

# See ECC-854
# if(typeOfFirstFixedSurface == 151 && typeOfSecondFixedSurface == 151) {
#     alias mars.levelist = bottomLevel;
# }
# Aenderung ab 2.27.0 & 2.27.1
# See ECC-854, ECC-1435, ECC-1451, ECC-1462
if( (typeOfFirstFixedSurface == 151 && typeOfSecondFixedSurface == 151) ||
    (typeOfFirstFixedSurface == 152 && typeOfSecondFixedSurface == 152) ||
    (typeOfFirstFixedSurface == 168 && typeOfSecondFixedSurface == 168) ||
    (typeOfFirstFixedSurface == 114 && typeOfSecondFixedSurface == 114) ) {
    alias mars.levelist = bottomLevel;
    alias ls.level = bottomLevel;
    alias vertical.level = bottomLevel;
}

alias ls.typeOfLevel=typeOfLevel;

