Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F121331392
chronos.F
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Thu, Jul 10, 02:38
Size
29 KB
Mime Type
text/x-c
Expires
Sat, Jul 12, 02:38 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
27285159
Attached To
R2795 mitgcm_lac_leman_abirani
chronos.F
View Options
C $Header: /u/gcmpack/MITgcm/pkg/chronos/chronos.F,v 1.1 2004/07/28 01:26:03 molod Exp $
C $Name: $
#include "PACKAGES_CONFIG.h"
#include "CPP_OPTIONS.h"
subroutine set_alarm (tag,date,time,freq)
C***********************************************************************
C Purpose
C -------
C Utility to Set Internal Alarms
C
C Argument Description
C --------------------
C tag ....... Character String Tagging Alarm Process
C date ...... Begining Date for Alarm
C time ...... Begining Time for Alarm
C freq ...... Repeating Frequency Interval for Alarm
C
C***********************************************************************
implicit none
character*(*) tag
integer freq,date,time
#ifdef ALLOW_USE_MPI
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
#endif
#include "chronos.h"
#ifdef ALLOW_USE_MPI
c MPI Utilities
c -------------
#include "mpif.h"
integer mpi_comm_model,ierror
#endif
integer myid
logical first,set
data first /.true./
integer n
#ifdef ALLOW_USE_MPI
call mpi_comm_rank ( mpi_comm_model,myid,ierror )
#else
myid = 1
#endif
if(first) then
ntags = 1
tags(1) = tag
freqs(1) = freq
dates(1) = date
times(1) = time
if( myid.eq.1 ) write(6,100) date,time,freq,tags(1)
else
set = .false.
do n=1,ntags
if(tag.eq.tags(n)) then
if( myid.eq.1 ) then
print *, 'Warning! Alarm has already been set for Tag: ',tag
print *, 'Changing Alarm Information:'
print *, 'Frequency: ',freqs(n),' (Old) ',freq,' (New)'
print *, ' Date0: ',dates(n),' (Old) ',date,' (New)'
print *, ' Time0: ',times(n),' (Old) ',time,' (New)'
endif
freqs(n) = freq
dates(n) = date
times(n) = time
set = .true.
endif
enddo
if(.not.set) then
ntags = ntags+1
if(ntags.gt.maxtag ) then
if( myid.eq.1 ) then
print *, 'Too many Alarms are Set!!'
print *, 'Maximum Number of Alarms = ',maxtag
endif
call my_finalize
call my_exit (101)
endif
tags(ntags) = tag
freqs(ntags) = freq
dates(ntags) = date
times(ntags) = time
if( myid.eq.1 ) write(6,100) date,time,freq,tags(ntags)
endif
endif
first = .false.
100 format(1x,'Setting Alarm for: ',i8,2x,i6.6,', with frequency: ',
. i8,', and Tag: ',a80)
return
end
subroutine get_alarm (tag,date,time,freq,tleft)
C***********************************************************************
C Purpose
C -------
C Utility to Get Internal Alarm Information
C
C Input
C -----
C tag ....... Character String Tagging Alarm Process
C
C Output
C ------
C date ...... Begining Date for Alarm
C time ...... Begining Time for Alarm
C freq ...... Frequency Interval for Alarm
C tleft ..... Time Remaining (seconds) before Alarm is TRUE
C
C***********************************************************************
implicit none
character*(*) tag
integer freq,date,time,tleft
#ifdef ALLOW_USE_MPI
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
#endif
#include "chronos.h"
#ifdef ALLOW_USE_MPI
c MPI Utilities
c -------------
#include "mpif.h"
integer mpi_comm_model,ierror
#endif
logical set,alarm
external alarm
integer myid,n,nalarm,nsecf
#ifdef ALLOW_USE_MPI
call mpi_comm_rank ( mpi_comm_model,myid,ierror )
#else
myid = 1
#endif
set = .false.
do n=1,ntags
if(tag.eq.tags(n)) then
freq = freqs(n)
date = dates(n)
time = times(n)
if( alarm(tag) ) then
tleft = 0
else
call get_time (nymd,nhms)
tleft = nsecf(freq) - nalarm(freq,nymd,nhms,date,time )
endif
set = .true.
endif
enddo
if(.not.set) then
if( myid.eq.1 ) print *, 'Alarm has not been set for Tag: ',tag
freq = 0
date = 0
time = 0
tleft = 0
endif
return
end
function alarm (tag)
implicit none
character*(*) tag
integer date,time
logical alarm
#include "chronos.h"
integer n,modalarm,nalarm,freq,date0,time0
modalarm(freq,date0,time0) = nalarm (freq,date,time,date0,time0 )
call get_time (date,time)
alarm = .false.
do n=1,ntags
if( tags(n).eq.tag ) then
if( freqs(n).eq.0 ) then
alarm = (dates(n).eq.date) .and. (times(n).eq.time)
else
alarm = ( date.gt.dates(n) .or.
. (date.eq.dates(n) .and. time.ge.times(n)) ) .and.
. modalarm( freqs(n),dates(n),times(n) ).eq.0
endif
endif
enddo
return
end
subroutine set_time (date,time)
implicit none
integer date,time
#ifdef ALLOW_USE_MPI
#include "SIZE.h"
#include "EEPARAMS.h"
#include "EESUPPORT.h"
#endif
#include "chronos.h"
#ifdef ALLOW_USE_MPI
c MPI Utilities
c -------------
#include "mpif.h"
integer mpi_comm_model,ierror
#endif
integer myid
#ifdef ALLOW_USE_MPI
call mpi_comm_rank ( mpi_comm_model,myid,ierror )
#else
myid = 1
#endif
if( myid.eq.1 ) then
print *, 'Setting Clock'
print *, 'Date: ',date
print *, 'Time: ',time
endif
nymd = date
nhms = time
return
end
subroutine get_time (date,time)
implicit none
integer date,time
#include "chronos.h"
date = nymd
time = nhms
return
end
function nsecf (nhms)
C***********************************************************************
C Purpose
C Converts NHMS format to Total Seconds
C
C***********************************************************************
implicit none
integer nhms, nsecf
nsecf = nhms/10000*3600 + mod(nhms,10000)/100*60 + mod(nhms,100)
return
end
function nhmsf (nsec)
C***********************************************************************
C Purpose
C Converts Total Seconds to NHMS format
C
C***********************************************************************
implicit none
integer nhmsf, nsec
nhmsf = nsec/3600*10000 + mod(nsec,3600)/60*100 + mod(nsec,60)
return
end
function nsecf2 (nhhmmss,nmmdd,nymd)
C***********************************************************************
C Purpose
C Computes the Total Number of seconds from NYMD using NHHMMSS & NMMDD
C
C Arguments Description
C NHHMMSS IntervaL Frequency (HHMMSS)
C NMMDD Interval Frequency (MMDD)
C NYMD Current Date (YYMMDD)
C
C NOTE:
C IF (NMMDD.ne.0), THEN HOUR FREQUENCY HH MUST BE < 24
C
C***********************************************************************
implicit none
integer nsecf2,nhhmmss,nmmdd,nymd
INTEGER NSDAY, NCYCLE
PARAMETER ( NSDAY = 86400 )
PARAMETER ( NCYCLE = 1461*24*3600 )
INTEGER YEAR, MONTH, DAY
INTEGER MNDY(12,4)
DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
. 397,34*0 /
integer nsecf,i,nsegm,nsegd,iday,iday2,nday
C***********************************************************************
C* COMPUTE # OF SECONDS FROM NHHMMSS *
C***********************************************************************
nsecf2 = nsecf( nhhmmss )
if( nmmdd.eq.0 ) return
C***********************************************************************
C* COMPUTE # OF DAYS IN A 4-YEAR CYCLE *
C***********************************************************************
DO I=15,48
MNDY(I,1) = MNDY(I-12,1) + 365
ENDDO
C***********************************************************************
C* COMPUTE # OF SECONDS FROM NMMDD *
C***********************************************************************
nsegm = nmmdd/100
nsegd = mod(nmmdd,100)
YEAR = NYMD / 10000
MONTH = MOD(NYMD,10000) / 100
DAY = MOD(NYMD,100)
IDAY = MNDY( MONTH ,MOD(YEAR ,4)+1 )
month = month + nsegm
If( month.gt.12 ) then
month = month - 12
year = year + 1
endif
IDAY2 = MNDY( MONTH ,MOD(YEAR ,4)+1 )
nday = iday2-iday
if(nday.lt.0) nday = nday + 1461
nday = nday + nsegd
nsecf2 = nsecf2 + nday*nsday
return
end
subroutine fixdate (nymd)
implicit none
integer nymd
c Modify 6-digit YYMMDD for dates between 1950-2050
c -------------------------------------------------
if (nymd .lt. 500101) then
nymd = 20000000 + nymd
else if (nymd .le. 991231) then
nymd = 19000000 + nymd
endif
return
end
subroutine interp_time ( nymd ,nhms ,
. nymd1,nhms1, nymd2,nhms2, fac1,fac2 )
C***********************************************************************
C
C PURPOSE:
C ========
C Compute interpolation factors, fac1 & fac2, to be used in the
C calculation of the instantanious boundary conditions, ie:
C
C q(i,j) = fac1*q1(i,j) + fac2*q2(i,j)
C where:
C q(i,j) => Boundary Data valid at (nymd , nhms )
C q1(i,j) => Boundary Data centered at (nymd1 , nhms1)
C q2(i,j) => Boundary Data centered at (nymd2 , nhms2)
C
C INPUT:
C ======
C nymd : Date (yymmdd) of Current Timestep
C nhms : Time (hhmmss) of Current Timestep
C nymd1 : Date (yymmdd) of Boundary Data 1
C nhms1 : Time (hhmmss) of Boundary Data 1
C nymd2 : Date (yymmdd) of Boundary Data 2
C nhms2 : Time (hhmmss) of Boundary Data 2
C
C OUTPUT:
C =======
C fac1 : Interpolation factor for Boundary Data 1
C fac2 : Interpolation factor for Boundary Data 2
C
C
C***********************************************************************
implicit none
integer nhms,nymd,nhms1,nymd1,nhms2,nymd2
_RL fac1,fac2
INTEGER YEAR , MONTH , DAY , SEC
INTEGER YEAR1, MONTH1, DAY1, SEC1
INTEGER YEAR2, MONTH2, DAY2, SEC2
_RL time, time1, time2
INTEGER DAYSCY
PARAMETER (DAYSCY = 365*4+1)
INTEGER MNDY(12,4)
LOGICAL FIRST
DATA FIRST/.TRUE./
DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
. 397,34*0 /
integer i,nsecf
C***********************************************************************
C* SET TIME BOUNDARIES *
C***********************************************************************
YEAR = NYMD / 10000
MONTH = MOD(NYMD,10000) / 100
DAY = MOD(NYMD,100)
SEC = NSECF(NHMS)
YEAR1 = NYMD1 / 10000
MONTH1 = MOD(NYMD1,10000) / 100
DAY1 = MOD(NYMD1,100)
SEC1 = NSECF(NHMS1)
YEAR2 = NYMD2 / 10000
MONTH2 = MOD(NYMD2,10000) / 100
DAY2 = MOD(NYMD2,100)
SEC2 = NSECF(NHMS2)
C***********************************************************************
C* COMPUTE DAYS IN 4-YEAR CYCLE *
C***********************************************************************
IF(FIRST) THEN
DO I=15,48
MNDY(I,1) = MNDY(I-12,1) + 365
ENDDO
FIRST=.FALSE.
ENDIF
C***********************************************************************
C* COMPUTE INTERPOLATION FACTORS *
C***********************************************************************
time = DAY + MNDY(MONTH ,MOD(YEAR ,4)+1) + float(sec )/86400.
time1 = DAY1 + MNDY(MONTH1,MOD(YEAR1,4)+1) + float(sec1)/86400.
time2 = DAY2 + MNDY(MONTH2,MOD(YEAR2,4)+1) + float(sec2)/86400.
if( time .lt.time1 ) time = time + dayscy
if( time2.lt.time1 ) time2 = time2 + dayscy
fac1 = (time2-time)/(time2-time1)
fac2 = (time-time1)/(time2-time1)
RETURN
END
subroutine tick (nymd,nhms,ndt)
C***********************************************************************
C Purpose
C Tick the Date (nymd) and Time (nhms) by NDT (seconds)
C
C***********************************************************************
implicit none
integer nymd,nhms,ndt
integer nsec,nsecf,incymd,nhmsf
IF(NDT.NE.0) THEN
NSEC = NSECF(NHMS) + NDT
IF (NSEC.GT.86400) THEN
DO WHILE (NSEC.GT.86400)
NSEC = NSEC - 86400
NYMD = INCYMD (NYMD,1)
ENDDO
ENDIF
IF (NSEC.EQ.86400) THEN
NSEC = 0
NYMD = INCYMD (NYMD,1)
ENDIF
IF (NSEC.LT.00000) THEN
DO WHILE (NSEC.LT.0)
NSEC = 86400 + NSEC
NYMD = INCYMD (NYMD,-1)
ENDDO
ENDIF
NHMS = NHMSF (NSEC)
ENDIF
RETURN
END
subroutine tic_time (mymd,mhms,ndt)
C***********************************************************************
C PURPOSE
C Tick the Clock by NDT (seconds)
C
C***********************************************************************
implicit none
#include "chronos.h"
integer mymd,mhms,ndt
integer nsec,nsecf,incymd,nhmsf
IF(NDT.NE.0) THEN
NSEC = NSECF(NHMS) + NDT
IF (NSEC.GT.86400) THEN
DO WHILE (NSEC.GT.86400)
NSEC = NSEC - 86400
NYMD = INCYMD (NYMD,1)
ENDDO
ENDIF
IF (NSEC.EQ.86400) THEN
NSEC = 0
NYMD = INCYMD (NYMD,1)
ENDIF
IF (NSEC.LT.00000) THEN
DO WHILE (NSEC.LT.0)
NSEC = 86400 + NSEC
NYMD = INCYMD (NYMD,-1)
ENDDO
ENDIF
NHMS = NHMSF (NSEC)
ENDIF
c Pass Back Current Updated Time
c ------------------------------
mymd = nymd
mhms = nhms
RETURN
END
FUNCTION NALARM (MHMS,NYMD,NHMS,NYMD0,NHMS0)
C***********************************************************************
C PURPOSE
C COMPUTES MODULO-FRACTION BETWEEN MHHS AND TOTAL TIME
C USAGE
C ARGUMENTS DESCRIPTION
C MHMS INTERVAL FREQUENCY (HHMMSS)
C NYMD CURRENT YYMMDD
C NHMS CURRENT HHMMSS
C NYMD0 BEGINNING YYMMDD
C NHMS0 BEGINNING HHMMSS
C
C***********************************************************************
implicit none
integer nalarm,MHMS,NYMD,NHMS,NYMD0,NHMS0
integer nsday, ncycle
PARAMETER ( NSDAY = 86400 )
PARAMETER ( NCYCLE = 1461*24*3600 )
INTEGER YEAR, MONTH, DAY, SEC, YEAR0, MONTH0, DAY0, SEC0
integer MNDY(12,4)
DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
. 397,34*0 /
integer i,nsecf,iday,iday0,nsec,nsec0,ntime
C***********************************************************************
C* COMPUTE # OF DAYS IN A 4-YEAR CYCLE *
C***********************************************************************
DO I=15,48
MNDY(I,1) = MNDY(I-12,1) + 365
ENDDO
C***********************************************************************
C* SET CURRENT AND BEGINNING TIMES *
C***********************************************************************
YEAR = NYMD / 10000
MONTH = MOD(NYMD,10000) / 100
DAY = MOD(NYMD,100)
SEC = NSECF(NHMS)
YEAR0 = NYMD0 / 10000
MONTH0 = MOD(NYMD0,10000) / 100
DAY0 = MOD(NYMD0,100)
SEC0 = NSECF(NHMS0)
C***********************************************************************
C* COMPUTE POSITIONS IN CYCLE FOR CURRENT AND BEGINNING TIMES *
C***********************************************************************
IDAY = (DAY -1) + MNDY( MONTH ,MOD(YEAR ,4)+1 )
IDAY0 = (DAY0-1) + MNDY( MONTH0,MOD(YEAR0,4)+1 )
NSEC = IDAY *NSDAY + SEC
NSEC0 = IDAY0*NSDAY + SEC0
NTIME = NSEC-NSEC0
IF (NTIME.LT.0 ) NTIME = NTIME + NCYCLE
NALARM = NTIME
IF ( MHMS.NE.0 ) NALARM = MOD( NALARM,NSECF(MHMS) )
RETURN
END
FUNCTION INCYMD (NYMD,M)
C***********************************************************************
C PURPOSE
C INCYMD: NYMD CHANGED BY ONE DAY
C MODYMD: NYMD CONVERTED TO JULIAN DATE
C DESCRIPTION OF PARAMETERS
C NYMD CURRENT DATE IN YYMMDD FORMAT
C M +/- 1 (DAY ADJUSTMENT)
C
C***********************************************************************
implicit none
integer incymd,nymd,m
integer ny,nm,nd,ny00,modymd
INTEGER NDPM(12)
DATA NDPM /31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31/
LOGICAL LEAP
DATA NY00 /1900 /
LEAP(NY) = MOD(NY,4).EQ.0 .AND. (NY.NE.0 .OR. MOD(NY00,400).EQ.0)
C***********************************************************************
C
NY = NYMD / 10000
NM = MOD(NYMD,10000) / 100
ND = MOD(NYMD,100) + M
IF (ND.EQ.0) THEN
NM = NM - 1
IF (NM.EQ.0) THEN
NM = 12
NY = NY - 1
ENDIF
ND = NDPM(NM)
IF (NM.EQ.2 .AND. LEAP(NY)) ND = 29
ENDIF
IF (ND.EQ.29 .AND. NM.EQ.2 .AND. LEAP(NY)) GO TO 20
IF (ND.GT.NDPM(NM)) THEN
ND = 1
NM = NM + 1
IF (NM.GT.12) THEN
NM = 1
NY = NY + 1
ENDIF
ENDIF
20 CONTINUE
INCYMD = NY*10000 + NM*100 + ND
RETURN
C***********************************************************************
C E N T R Y M O D Y M D
C***********************************************************************
ENTRY MODYMD (NYMD)
NY = NYMD / 10000
NM = MOD(NYMD,10000) / 100
ND = MOD(NYMD,100)
40 CONTINUE
IF (NM.LE.1) GO TO 60
NM = NM - 1
ND = ND + NDPM(NM)
IF (NM.EQ.2 .AND. LEAP(NY)) ND = ND + 1
GO TO 40
60 CONTINUE
MODYMD = ND
RETURN
END
SUBROUTINE ASTRO ( NYMD,NHMS,ALAT,ALON,IRUN,COSZ,RA )
C***********************************************************************
C
C INPUT:
C ======
C NYMD : CURRENT YYMMDD
C NHMS : CURRENT HHMMSS
C ALAT(IRUN):LATITUDES IN DEGREES.
C ALON(IRUN):LONGITUDES IN DEGREES. (0 = GREENWICH, + = EAST).
C IRUN : # OF POINTS TO CALCULATE
C
C OUTPUT:
C =======
C COSZ(IRUN) : COSINE OF ZENITH ANGLE.
C RA : EARTH-SUN DISTANCE IN UNITS OF
C THE ORBITS SEMI-MAJOR AXIS.
C
C NOTE:
C =====
C THE INSOLATION AT THE TOP OF THE ATMOSPHERE IS:
C
C S(I) = (SOLAR CONSTANT)*(1/RA**2)*COSZ(I),
C
C WHERE:
C RA AND COSZ(I) ARE THE TWO OUTPUTS OF THIS SUBROUTINE.
C
C***********************************************************************
implicit none
c Input Variables
c ---------------
integer nymd, nhms, irun
_RL cosz(irun), alat(irun), alon(irun), ra
c Local Variables
c ---------------
integer year, day, sec, month, iday, idayp1
integer dayscy
integer i,nsecf,k,km,kp
_RL hc
_RL pi, zero, one, two, six, dg2rd, yrlen, eqnx, ob, ecc, per
_RL daylen, fac, thm, thp, thnow, zs, zc, sj, cj
parameter ( pi = 3.1415926535898)
parameter ( zero = 0.0 )
parameter ( one = 1.0 )
parameter ( two = 2.0 )
parameter ( six = 6.0 )
parameter ( dg2rd = pi/180. )
parameter ( yrlen = 365.25 )
parameter ( dayscy = 365*4+1 )
parameter ( eqnx = 80.9028)
parameter ( ob = 23.45*dg2rd )
parameter ( ecc = 0.0167 )
parameter ( per = 102.0*dg2rd)
parameter ( daylen = 86400.)
_RL TH(DAYSCY),T0,T1,T2,T3,T4,FUN,Y,MNDY(12,4)
LOGICAL FIRST
DATA FIRST/.TRUE./
SAVE
DATA MNDY /0,31,60,91,121,152,182,213,244,274,305,335,366,
. 397,34*0 /
FUN(Y) = (TWO*PI/((ONE-ECC**2)**1.5))*(ONE/YRLEN)
. * (ONE - ECC*COS(Y-PER)) ** 2
C***********************************************************************
C* SET CURRENT TIME *
C***********************************************************************
YEAR = NYMD / 10000
MONTH = MOD(NYMD,10000) / 100
DAY = MOD(NYMD,100)
SEC = NSECF(NHMS)
C***********************************************************************
C* COMPUTE DAY-ANGLES FOR 4-YEAR CYCLE *
C***********************************************************************
IF(FIRST) THEN
DO 100 I=15,48
MNDY(I,1) = MNDY(I-12,1) + 365
100 CONTINUE
KM = INT(EQNX) + 1
FAC = KM-EQNX
T0 = ZERO
T1 = FUN(T0 )*FAC
T2 = FUN(ZERO+T1/TWO)*FAC
T3 = FUN(ZERO+T2/TWO)*FAC
T4 = FUN(ZERO+T3 )*FAC
TH(KM) = (T1 + TWO*(T2 + T3) + T4) / SIX
DO 200 K=2,DAYSCY
T1 = FUN(TH(KM) )
T2 = FUN(TH(KM)+T1/TWO)
T3 = FUN(TH(KM)+T2/TWO)
T4 = FUN(TH(KM)+T3 )
KP = MOD(KM,DAYSCY) + 1
TH(KP) = TH(KM) + (T1 + TWO*(T2 + T3) + T4) / SIX
KM = KP
200 CONTINUE
FIRST=.FALSE.
ENDIF
C***********************************************************************
C* COMPUTE EARTH-SUN DISTANCE TO CURRENT SECOND *
C***********************************************************************
IDAY = DAY + MNDY(MONTH,MOD(YEAR,4)+1)
IDAYP1 = MOD( IDAY,DAYSCY) + 1
THM = MOD( TH(IDAY) ,TWO*PI)
THP = MOD( TH(IDAYP1),TWO*PI)
IF(THP.LT.THM) THP = THP + TWO*PI
FAC = FLOAT(SEC)/DAYLEN
THNOW = THM*(ONE-FAC) + THP*FAC
ZS = SIN(THNOW) * SIN(OB)
ZC = SQRT(ONE-ZS*ZS)
RA = (1.-ECC*ECC) / ( ONE-ECC*COS(THNOW-PER) )
C***********************************************************************
C* COMPUTE COSINE OF THE ZENITH ANGLE *
C***********************************************************************
FAC = FAC*TWO*PI + PI
DO I = 1,IRUN
HC = COS( FAC+ALON(I)*DG2RD )
SJ = SIN(ALAT(I)*DG2RD)
CJ = SQRT(ONE-SJ*SJ)
COSZ(I) = SJ*ZS + CJ*ZC*HC
IF( COSZ(I).LT.ZERO ) COSZ(I) = ZERO
ENDDO
RETURN
END
subroutine time_bound(nymd,nhms,nymd1,nhms1,nymd2,nhms2,imnm,imnp)
C***********************************************************************
C PURPOSE
C Compute Date and Time boundaries.
C
C ARGUMENTS DESCRIPTION
C nymd .... Current Date
C nhms .... Current Time
C nymd1 ... Previous Date Boundary
C nhms1 ... Previous Time Boundary
C nymd2 ... Subsequent Date Boundary
C nhms2 ... Subsequent Time Boundary
C
C imnm .... Previous Time Index for Interpolation
C imnp .... Subsequent Time Index for Interpolation
C
C***********************************************************************
implicit none
integer nymd,nhms, nymd1,nhms1, nymd2,nhms2
c Local Variables
c ---------------
integer month,day,nyear,midmon1,midmon,midmon2
integer imnm,imnp
INTEGER DAYS(14), daysm, days0, daysp
DATA DAYS /31,31,28,31,30,31,30,31,31,30,31,30,31,31/
integer nmonf,ndayf,n
NMONF(N) = MOD(N,10000)/100
NDAYF(N) = MOD(N,100)
C*********************************************************************
C**** Find Proper Month and Time Boundaries for Climatological Data **
C*********************************************************************
MONTH = NMONF(NYMD)
DAY = NDAYF(NYMD)
daysm = days(month )
days0 = days(month+1)
daysp = days(month+2)
c Check for Leap Year
c -------------------
nyear = nymd/10000
if( 4*(nyear/4).eq.nyear ) then
if( month.eq.3 ) daysm = daysm+1
if( month.eq.2 ) days0 = days0+1
if( month.eq.1 ) daysp = daysp+1
endif
MIDMON1 = daysm/2 + 1
MIDMON = days0/2 + 1
MIDMON2 = daysp/2 + 1
IF(DAY.LT.MIDMON) THEN
imnm = month
imnp = month + 1
nymd2 = (nymd/10000)*10000 + month*100 + midmon
nhms2 = 000000
nymd1 = nymd2
nhms1 = nhms2
call tick ( nymd1,nhms1, -midmon *86400 )
call tick ( nymd1,nhms1,-(daysm-midmon1)*86400 )
ELSE
IMNM = MONTH + 1
IMNP = MONTH + 2
nymd1 = (nymd/10000)*10000 + month*100 + midmon
nhms1 = 000000
nymd2 = nymd1
nhms2 = nhms1
call tick ( nymd2,nhms2,(days0-midmon)*86400 )
call tick ( nymd2,nhms2, midmon2*86400 )
ENDIF
c -------------------------------------------------------------
c Note: At this point, imnm & imnp range between 01-14, where
c 01 -> Previous years December
c 02-13 -> Current years January-December
c 14 -> Next years January
c -------------------------------------------------------------
imnm = imnm-1
imnp = imnp-1
if( imnm.eq.0 ) imnm = 12
if( imnp.eq.0 ) imnp = 12
if( imnm.eq.13 ) imnm = 1
if( imnp.eq.13 ) imnp = 1
return
end
Event Timeline
Log In to Comment