constant P_INST = 0;
constant P_TAVG = 1;
constant P_TACC = 3;

constant TYPE_AN = 2;
constant TYPE_FC = 9;
constant TYPE_CF = 10;
constant TYPE_PF = 11;
constant TYPE_FF = 25;
constant TYPE_OF = 26;
constant TYPE_OR = 70;
constant TYPE_FX = 71;

constant coordAveraging0 = "inst";
constant coordAveraging1 = "tavg";
constant coordAveraging2 = 2;
constant coordAveraging3 = "tacc";
constant coordAveragingTims = "tims";

constant isectionNumber2 = "h";
constant isectionNumber3 = "m";
constant isectionNumber4 = "z";

constant tsectionNumber3 = "v";
constant tsectionNumber4 = "z";
constant tsectionNumber5 = "m";

constant GRIB_DEPTH      = 2;
constant GRIB_LONGITUDE  = 3;
constant GRIB_LATITUDE   = 4;

meta verificationDate   g1verificationdate(dataDate, dataTime, endStep) : read_only;

if (horizontalCoordinateDefinition == 0) {
    if (coordinate1Flag == 1 ) {
        # range
        if (averaging1Flag == P_TAVG ) {
            if (marsType == TYPE_OR
            || marsType == TYPE_FC
            || marsType == TYPE_FF
            || marsType == TYPE_FX)
            {
                meta marsRange evaluate((coordinate1End - coordinate1Start)/3600);
                alias mars.range = marsRange;
            }
        }
        # section
        if (coordinate2Flag == 2) { alias mars.section = isectionNumber2; }
        if (coordinate2Flag == 3) { alias mars.section = isectionNumber3; }
        if (coordinate2Flag == 4) { alias mars.section = isectionNumber4; }

        # levelist  latitude longitude
        if (coordinate2Flag == GRIB_DEPTH) {
            meta marsLevelist         divdouble( coordinate2Start,1000 );
            meta roundedMarsLevelist  round( marsLevelist ,1000);
            alias mars.levelist = roundedMarsLevelist ;
        }
        if (coordinate2Flag == GRIB_LONGITUDE) {
            meta marsLongitude divdouble( coordinate2Start,1000000 );
            meta roundedMarsLongitude round( marsLongitude ,1000);
            alias mars.longitude = roundedMarsLongitude ;
        }

        if (coordinate2Flag == GRIB_LATITUDE) {
            meta marsLatitude divdouble( coordinate2Start,1000000 );
            meta roundedMarsLatitude  round( marsLatitude ,1000);
            alias mars.latitude = roundedMarsLatitude ;
        }

        #product
        if (averaging1Flag == 0) { alias mars.product = coordAveraging0;}
        if (averaging1Flag == 1) { alias mars.product = coordAveraging1;}
        if (averaging1Flag == 2) { alias mars.product = coordAveraging2;}
        if (averaging1Flag == 3) { alias mars.product = coordAveraging3;}

        # date
        if (  (marsType == TYPE_OR && averaging1Flag == P_TAVG)
           || (marsType == TYPE_OR && averaging1Flag == P_TACC)
           || (marsType == TYPE_FX && averaging1Flag == P_TAVG))
           {
               #remove mars.date;
               alias mars.date = verificationDate;
               #remove mars.step;
               constant stepZero = 0;
               alias mars.step = stepZero;
           }
    }
    else
    {
        meta coordinateIndexNumber evaluate(coordinate4Flag+coordinate3Flag);

# levelist  latitude longitude
        if (coordinateIndexNumber== 3) {
            meta marsLatitude  divdouble( coordinate1Start,1000000);
            meta marsLongitude divdouble( coordinate2Start,1000000);

            meta roundedMarsLatitude round(  marsLatitude ,1000);
            meta roundedMarsLongitude round( marsLongitude ,1000);

            alias mars.latitude = roundedMarsLatitude ;
            alias mars.longitude = roundedMarsLongitude ;
        }

        if (coordinateIndexNumber == 4) {
            meta marsLevelist  divdouble( coordinate1Start,1000);
            meta marsLatitude  divdouble( coordinate2Start,1000000);

            meta roundedMarsLevelist round(  marsLevelist ,1000);
            meta roundedMarsLatitude round(  marsLatitude ,1000);

            alias mars.levelist = roundedMarsLevelist ;
            alias mars.latitude = roundedMarsLatitude ;
        }

        if (coordinateIndexNumber == 5) {
            meta marsLevelist  divdouble( coordinate1Start,1000);
            meta marsLongitude divdouble( coordinate2Start,1000000);

            meta roundedMarsLevelist round(  marsLevelist ,1000);
            meta roundedMarsLongitude round( marsLongitude ,1000);

            alias mars.levelist = roundedMarsLevelist ;
            alias mars.longitude = roundedMarsLongitude ;
        }

        # section
        if (coordinateIndexNumber == 3) { alias mars.section = tsectionNumber3; }
        if (coordinateIndexNumber == 4) { alias mars.section = tsectionNumber4; }
        if (coordinateIndexNumber == 5) { alias mars.section = tsectionNumber5; }

        # range
        if (averaging1Flag == P_INST) {
              if ((marsType == TYPE_OR)
               ||(marsType == TYPE_FC)
               ||(marsType == TYPE_CF)
               ||(marsType == TYPE_PF)
               ||(marsType == TYPE_FF)
               ||(marsType == TYPE_OF))
               {
                  if (coordinate4Flag == 1){
                    meta marsRange evaluate((coordinate4OfLastGridPoint - coordinate4OfFirstGridPoint)/3600);
                  } else {
                     meta marsRange evaluate((coordinate3OfLastGridPoint - coordinate3OfFirstGridPoint)/3600);
                  }
                  alias mars.range = marsRange;
               }
           }
# product
           alias mars.product = coordAveragingTims;
# date
           if (marsType == TYPE_OR  && averaging1Flag == P_INST) {
               #remove mars.date;
               alias mars.date = verificationDate;
               #remove mars.step;
               constant stepZero = 0;
               alias mars.step =stepZero;
           }
    }
}
