C $Header: /u/gcmpack/MITgcm/pkg/exf/exf_getffield_start.F,v 1.2 2017/02/10 01:27:39 jmc Exp $ C $Name: $ #include "EXF_OPTIONS.h" C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| CBOP C !ROUTINE: EXF_GETFFIELD_START C !INTERFACE: SUBROUTINE EXF_GETFFIELD_START( I useYearlyFields, pkg_name, fld_name, I fld_period, fld_startdate1, fld_startdate2, U fld_start_time, errCount, I myThid ) C !DESCRIPTION: \bv C *==========================================================* C | SUBROUTINE EXF_GETFFIELD_START C | o get forcing-field starting-time (in secs); C | distinguish between using Yearly-Fields or not. C *==========================================================* C \ev C !USES: IMPLICIT NONE C === Global variables === #include "SIZE.h" #include "EEPARAMS.h" c#include "cal.h" #include "PARAMS.h" C !INPUT/OUTPUT PARAMETERS: C useYearlyFields :: select if using EXF Yearly-fields or not C pkg_name :: package name from which this S/R is called C fld_name :: field short name (to print mesg) C fld_period :: time period (in sec) between 2 reccords C fld_startdate1 :: field starting date (YYYYMMDD) C fld_startdate2 :: field starting date (HHMMSS) C fld_start_time :: corresponding starting time (in sec) for this field C errCount :: error counter C myThid :: My Thread Id number LOGICAL useYearlyFields CHARACTER*(*) pkg_name CHARACTER*(*) fld_name _RL fld_period INTEGER fld_startdate1, fld_startdate2 _RL fld_start_time INTEGER errCount INTEGER myThid C !FUNCTIONS: C !LOCAL VARIABLES: C msgBuf :: Informational/error message buffer CHARACTER*(MAX_LEN_MBUF) msgBuf #ifdef ALLOW_CAL INTEGER date_array(4), difftime(4), yearStartDate(4) INTEGER gcm_startdate(4) #endif /* ALLOW_CAL */ CEOP C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----| C-- Set default start_time (in case not using Calendar) IF ( fld_start_time.EQ.UNSET_RL ) THEN fld_start_time = 0. ELSEIF ( useCAL ) THEN C- Report inconsistent setting: WRITE(msgBuf,'(8A)') 'S/R EXF_GETFFIELD_START: ', & 'start-time for ', pkg_name, '-field "', fld_name, & '" = ', fld_name, 'StartTime' CALL PRINT_ERROR( msgBuf, myThid ) c WRITE(msgBuf,'(5A)') 'S/R EXF_GETFFIELD_START: ', WRITE(msgBuf,'(5A)') ' ', & 'is computed (useCAL) from startdate1 & date2', & ' and cannot be set (in data.', pkg_name, ')' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF C-- Convert start-date to start_time (case using Calendar) IF ( useCAL .AND. fld_period.GT.0. ) THEN #ifdef ALLOW_CAL CALL CAL_FULLDATE( fld_startdate1, fld_startdate2, & date_array, myThid ) IF ( useYearlyFields ) THEN yearStartDate(1) = INT(date_array(1)/10000.) * 10000 + 101 yearStartDate(2) = 0 yearStartDate(3) = date_array(3) yearStartDate(4) = date_array(4) CALL CAL_TIMEPASSED( yearStartDate, date_array, difftime, I myThid ) CALL CAL_TOSECONDS ( difftime, fld_start_time, myThid ) ELSE C-- with "cal.h" header file: c CALL cal_TimePassed(modelstartdate,date_array,difftime,myThid) c CALL cal_ToSeconds ( difftime, fld_start_time, myThid ) c fld_start_time = modelstart + fld_start_time C-- with "PARAMS.h" header file: CALL CAL_GETDATE( nIter0, startTime, gcm_startdate, myThid ) CALL CAL_TIMEPASSED( gcm_startdate, date_array, difftime, I myThid ) CALL CAL_TOSECONDS ( difftime, fld_start_time, myThid ) fld_start_time = startTime + fld_start_time ENDIF #endif /* ALLOW_CAL */ ELSEIF ( .NOT.useCAL ) THEN IF ( ( fld_startdate1.NE.0 .OR. fld_startdate2.NE.0 ) & .AND. fld_period.GT.0. ) THEN C- Report inconsistent setting: IF ( fld_startdate1.NE.0 ) THEN WRITE(msgBuf,'(8A)') 'S/R EXF_GETFFIELD_START: ', & 'start-date for ', pkg_name, '-field "', fld_name, & '" = ', fld_name, 'startdate1' CALL PRINT_ERROR( msgBuf, myThid ) ENDIF IF ( fld_startdate2.NE.0 ) THEN WRITE(msgBuf,'(8A)') 'S/R EXF_GETFFIELD_START: ', & 'start-date for ', pkg_name, '-field "', fld_name, & '" = ', fld_name, 'startdate2' CALL PRINT_ERROR( msgBuf, myThid ) ENDIF c WRITE(msgBuf,'(5A)') 'S/R EXF_GETFFIELD_START: ', WRITE(msgBuf,'(5A)') ' ', & 'is not allowed (in data.', pkg_name, ')', & ' when pkg/cal is not used (useCAL=F)' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF IF ( fld_period.LT.0. ) THEN WRITE(msgBuf,'(6A)') 'S/R EXF_GETFFIELD_START: ', & 'Invalid record period for ', pkg_name, '-field "', & fld_name, '":' CALL PRINT_ERROR( msgBuf, myThid ) c WRITE(msgBuf,'(3A,F14.2,A)') 'S/R EXF_GETFFIELD_START: ', WRITE(msgBuf,'(3A,F14.2,A)') ' ', & fld_name, 'period =', fld_period, & ' but should be >= 0 when useCAL=F' CALL PRINT_ERROR( msgBuf, myThid ) errCount = errCount + 1 ENDIF C- end if fld_period > 0 ENDIF RETURN END