*IF DEF,CONTROL,OR,DEF,RECON,OR,DEF,UTILS,OR,DEF,SCMA GKR1F405.26 C ******************************COPYRIGHT****************************** GTS2F400.8425 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8426 C GTS2F400.8427 C Use, duplication or disclosure of this code is subject to the GTS2F400.8428 C restrictions as set forth in the contract. GTS2F400.8429 C GTS2F400.8430 C Meteorological Office GTS2F400.8431 C London Road GTS2F400.8432 C BRACKNELL GTS2F400.8433 C Berkshire UK GTS2F400.8434 C RG12 2SZ GTS2F400.8435 C GTS2F400.8436 C If no contract has been raised with this copy of the code, the use, GTS2F400.8437 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8438 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8439 C Modelling at the above address. GTS2F400.8440 C ******************************COPYRIGHT****************************** GTS2F400.8441 C GTS2F400.8442 CLL Routine: SEC2TIM0 ------------------------------------------------- SEC2TIM1.3 CLL SEC2TIM1.4 CLL Purpose: Converts from an integer number of elapsed seconds since SEC2TIM1.5 CLL the model basis time to a calendar date/time, using the SEC2TIM1.6 CLL absolute calendar zero point as a reference. 30-day SEC2TIM1.7 CLL month or standard calendar may be used. SEC2TIM1.8 CLL NB: BASIS_TIME_SECS is the number of seconds from the SEC2TIM1.9 CLL calendar zero point to the basis time for the run, and SEC2TIM1.10 CLL is calculated in INITTIME. SEC2TIM1.11 CLL SEC2TIM1.12 CLL Tested under compiler: cft77 SEC2TIM1.13 CLL Tested under OS version: UNICOS 5.1 SEC2TIM1.14 CLL SEC2TIM1.15 CLL Author: T.C.Johns SEC2TIM1.16 CLL SEC2TIM1.17 CLL Model Modification history from model version 3.0: SEC2TIM1.18 CLL version date SEC2TIM1.19 CLL 3.1 12/01/93 Correct error on day 366 in leap year (-CAL360). TJ120193.1 CLL 3.3 01/02/94 Modify calling arguments and internal calculations TJ080294.29 CLL to split days/seconds, for 32-bit portability. TCJ TJ080294.30 CLL 3.4 17/06/94 DEF CAL360 replaced by LOGICAL LCAL360 GSS1F304.648 CLL S.J.Swarbrick GSS1F304.649 CLL 4.5 10/07/98 Correct possible out of range error in array GKW0F405.1 CLL DAYS_IN_MONTHS for leap years. JC Thil GKW0F405.2 CLL 4.5 28/10/98 Changed def line to use superdef UTILS instead of GKR1F405.23 CLL DEF,UTILHIST,OR,DEF,FLDIO,OR,DEF,UTILIO which GKR1F405.24 CLL allowed addition of SCMA def. K Rogers GKR1F405.25 CLL SEC2TIM1.21 CLL Programming standard: UM Doc Paper 3, version 1 (15/1/90) SEC2TIM1.22 CLL SEC2TIM1.23 CLL Logical components covered: S62 SEC2TIM1.24 CLL SEC2TIM1.25 CLL Project task: S62 SEC2TIM1.26 CLL SEC2TIM1.27 CLL External documentation: On-line UM document C0 - The top-level SEC2TIM1.28 CLL control system SEC2TIM1.29 CLL SEC2TIM1.30 CLL ------------------------------------------------------------------- SEC2TIM1.31 C*L Interface and arguments: ------------------------------------------ SEC2TIM1.32 C SEC2TIM1.33SUBROUTINE SEC2TIME(ELAPSED_DAYS,ELAPSED_SECS 26TJ080294.31 &, BASIS_TIME_DAYS,BASIS_TIME_SECS TJ080294.32 &, I_YEAR,I_MONTH,I_DAY,I_HOUR,I_MINUTE,I_SECOND SEC2TIM1.35 &, I_DAY_NUMBER,LCAL360) GSS1F304.650 C SEC2TIM1.37 IMPLICIT NONE SEC2TIM1.38 LOGICAL LCAL360 GSS1F304.651 C SEC2TIM1.39 INTEGER SEC2TIM1.40 & ELAPSED_DAYS, ! IN - elapsed days since basis time TJ080294.33 1 ELAPSED_SECS, ! IN - elapsed secs in part of day TJ080294.34 & BASIS_TIME_DAYS, ! IN - whole days to basis time TJ080294.35 2 BASIS_TIME_SECS, ! IN - secs in day at basis time TJ080294.36 C ! relative to calendar zero TJ080294.37 2 I_SECOND, ! OUT - model time (seconds) SEC2TIM1.43 3 I_MINUTE, ! OUT - model time (minutes) SEC2TIM1.44 4 I_HOUR, ! OUT - model time (hours) SEC2TIM1.45 5 I_DAY, ! OUT - model time (days) SEC2TIM1.46 6 I_MONTH, ! OUT - model time (months) SEC2TIM1.47 7 I_YEAR, ! OUT - model time (years) SEC2TIM1.48 8 I_DAY_NUMBER ! OUT - model time (day number) SEC2TIM1.49 SEC2TIM1.50 C SEC2TIM1.51 C*---------------------------------------------------------------------- SEC2TIM1.52 C SEC2TIM1.54 C Common blocks SEC2TIM1.55 C SEC2TIM1.56 *CALL CDAYDATA
SEC2TIM1.57 C SEC2TIM1.59 C Local variables SEC2TIM1.60 C SEC2TIM1.61 INTEGER SEC2TIM1.62 & SECOND ! number of seconds since calendar zero SEC2TIM1.63 C SEC2TIM1.64 CL---------------------------------------------------------------------- SEC2TIM1.65 CL 1. Add elapsed time to basis time in days/seconds to get elapsed TJ080294.38 CL since calendar zero, and convert to hours, minutes, seconds and SEC2TIM1.67 CL total days since calendar zero SEC2TIM1.68 CL SEC2TIM1.69 SECOND = BASIS_TIME_SECS+ELAPSED_SECS SEC2TIM1.70 I_DAY = BASIS_TIME_DAYS+ELAPSED_DAYS+SECOND/86400 TJ080294.39 SECOND = MOD(SECOND,86400) TJ080294.40 I_HOUR = MOD(SECOND/3600,24) SEC2TIM1.71 I_MINUTE = MOD(SECOND/60 ,60) SEC2TIM1.72 I_SECOND = MOD(SECOND,60) SEC2TIM1.73 CL---------------------------------------------------------------------- SEC2TIM1.75 CL 2. Convert day number to date SEC2TIM1.76 CL SEC2TIM1.77 IF (LCAL360) THEN GSS1F304.652 CL SEC2TIM1.79 CL 2.1 30-day month (360 day year) calendar SEC2TIM1.80 CL SEC2TIM1.81 I_YEAR = I_DAY/360 SEC2TIM1.82 I_MONTH = MOD(I_DAY/30,12)+1 SEC2TIM1.83 I_DAY = MOD(I_DAY,30)+1 SEC2TIM1.84 I_DAY_NUMBER = I_DAY+30*(I_MONTH-1) SEC2TIM1.85 GSS1F304.653 ELSE GSS1F304.654 CL SEC2TIM1.87 CL 2.2 Gregorian calendar SEC2TIM1.88 CL SEC2TIM1.89 I_YEAR = (I_DAY/DAYS_PER_4C)*400 SEC2TIM1.90 I_DAY = I_DAY-(I_DAY/DAYS_PER_4C)*DAYS_PER_4C SEC2TIM1.91 CL Catch special case 31 Dec in leap years TJ120193.2 IF (I_DAY.EQ.4*DAYS_PER_C) THEN TJ120193.3 I_YEAR = I_YEAR+400 TJ120193.4 I_DAY = DAYS_PER_Y+1 TJ120193.5 ELSE TJ120193.6 I_YEAR = I_YEAR+(I_DAY/DAYS_PER_C)*100 TJ120193.7 I_DAY = I_DAY-(I_DAY/DAYS_PER_C)*DAYS_PER_C TJ120193.8 I_YEAR = I_YEAR+(I_DAY/DAYS_PER_4Y)*4 TJ120193.9 I_DAY = I_DAY-(I_DAY/DAYS_PER_4Y)*DAYS_PER_4Y TJ120193.10 IF (I_DAY.EQ.4*DAYS_PER_Y) THEN TJ120193.11 I_YEAR = I_YEAR+4 TJ120193.12 I_DAY = DAYS_PER_Y+1 TJ120193.13 ELSE TJ120193.14 I_YEAR = I_YEAR+(I_DAY/DAYS_PER_Y) + 1 TJ120193.15 I_DAY = I_DAY-(I_DAY/DAYS_PER_Y)*DAYS_PER_Y + 1 TJ120193.16 ENDIF TJ120193.17 ENDIF TJ120193.18 I_DAY_NUMBER = I_DAY SEC2TIM1.98 CL Find month/day from day no in year SEC2TIM1.99 I_MONTH = 1 SEC2TIM1.100 DO WHILE ((I_MONTH .le. 12) .and. GKW0F405.3 & (I_DAY .gt. DAYS_IN_MONTH(I_MONTH))) GKW0F405.4 I_DAY = I_DAY-DAYS_IN_MONTH(I_MONTH) SEC2TIM1.103 I_MONTH = I_MONTH+1 SEC2TIM1.104 ENDDO GKW0F405.5 CL Adjust if leap year and after February SEC2TIM1.107 IF (I_MONTH.GT.2 .AND. MOD(I_YEAR,4).EQ.0 .AND. SEC2TIM1.108 & (MOD(I_YEAR,400).EQ.0 .OR. MOD(I_YEAR,100).NE.0)) THEN SEC2TIM1.109 I_DAY = I_DAY-1 SEC2TIM1.110 IF (I_DAY.EQ.0) THEN SEC2TIM1.111 I_MONTH = I_MONTH-1 SEC2TIM1.112 I_DAY = DAYS_IN_MONTH(I_MONTH) SEC2TIM1.113 IF (I_MONTH.EQ.2) I_DAY=29 SEC2TIM1.114 ENDIF SEC2TIM1.115 ENDIF SEC2TIM1.116 END IF ! LCAL360 GSS1F304.655 CL---------------------------------------------------------------------- SEC2TIM1.118 RETURN TJ080294.41 END SEC2TIM1.119 C SEC2TIM1.120 *ENDIF SEC2TIM1.121