Changeset 719 for trunk/NEMO/OPA_SRC/daymod.F90
- Timestamp:
- 2007-10-16T16:59:56+02:00 (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/NEMO/OPA_SRC/daymod.F90
- Property svn:keywords changed from Id to Author Date Id Revision
r703 r719 4 4 !! Ocean : calendar 5 5 !!===================================================================== 6 !! History : ! 94-09 (M. Pontaud M. Imbard) Original code7 !! ! 97-03 (O. Marti)8 !! ! 97-05 (G. Madec)9 !! ! 97-08 (M. Imbard)10 !! 9.0 ! 03-09 (G. Madec) F90 + nyear, nmonth, nday11 !! ! 04-01 (A.M. Treguier) new calculation based on adatrj12 !! ! 06-08 (G. Madec) surface module major update13 !!----------------------------------------------------------------------14 6 15 7 !!---------------------------------------------------------------------- 16 8 !! day : calendar 17 9 !!---------------------------------------------------------------------- 10 !! * Modules used 18 11 USE dom_oce ! ocean space and time domain 19 12 USE phycst ! physical constants … … 24 17 PRIVATE 25 18 19 !! * Routine accessibility 26 20 PUBLIC day ! called by step.F90 27 21 28 INTEGER , PUBLIC :: nyear !: current year 29 INTEGER , PUBLIC :: nmonth !: current month 30 INTEGER , PUBLIC :: nday !: current day of the month 31 INTEGER , PUBLIC :: nday_year !: current day counted from jan 1st of the current year 32 REAL(wp), PUBLIC :: rsec_year !: current time step counted in second since 00h jan 1st of the current year 33 REAL(wp), PUBLIC :: rsec_month !: current time step counted in second since 00h 1st day of the current month 34 REAL(wp), PUBLIC :: rsec_day !: current time step counted in second since 00h of the current day 35 INTEGER , PUBLIC :: ndastp !: time step date in year/month/day aammjj 36 37 !!gm supprimer adatrj et adatrj0 ==> remplacer par rsecday..... 38 REAL(wp), PUBLIC :: adatrj !: number of elapsed days since the begining of the run 39 REAL(wp), PUBLIC :: adatrj0 !: value of adatrj at nit000-1 (before the present run). 40 ! ! it is the accumulated duration of previous runs 41 ! ! that may have been run with different time steps. 42 INTEGER , PUBLIC, DIMENSION(0:13) :: nmonth_len !: length of the current year 43 44 INTEGER, PUBLIC, DIMENSION(12) :: nbiss = (/ 31, 29, 31, 30, 31, 30, & !: number of days per month 45 & 31, 31, 30, 31, 30, 31 /) !: (leap-year) 46 INTEGER, PUBLIC, DIMENSION(12) :: nobis = (/ 31, 28, 31, 30, 31, 30, & !: number of days per month 47 & 31, 31, 30, 31, 30, 31 /) !: (365 days a year) 48 49 REAL(wp), PUBLIC, DIMENSION(0:14) :: rmonth_half(0:14) 50 22 !! * Shared module variables 23 INTEGER , PUBLIC :: & !: 24 nyear , & !: current year 25 nmonth , & !: current month 26 nday , & !: current day of the month 27 nday_year , & !: curent day counted from jan 1st of the current year 28 ndastp !: time step date in year/month/day aammjj 29 REAL(wp), PUBLIC :: & !: 30 adatrj , & !: number of elapsed days since the begining of the run 31 adatrj0 !: value of adatrj at nit000-1 (before the present run). 32 ! ! it is the accumulated duration of previous runs 33 ! ! that may have been run with different time steps. 51 34 !!---------------------------------------------------------------------- 52 !! OPA 9.0 , LOCEAN-IPSL (200 6)53 !! $ Id$54 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)35 !! OPA 9.0 , LOCEAN-IPSL (2005) 36 !! $Header$ 37 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt 55 38 !!---------------------------------------------------------------------- 56 39 … … 71 54 !! - ndastp : =nyear*10000+nmonth*100+nday 72 55 !! - adatrj : date in days since the beginning of the run 73 !! - rsec_year : current time of the year (in second since 00h, jan 1st) 56 !! 57 !! History : 58 !! ! 94-09 (M. Pontaud M. Imbard) Original code 59 !! ! 97-03 (O. Marti) 60 !! ! 97-05 (G. Madec) 61 !! ! 97-08 (M. Imbard) 62 !! 9.0 ! 03-09 (G. Madec) F90 + nyear, nmonth, nday 63 !! ! 04-01 (A.M. Treguier) new calculation based on adatrj 74 64 !!---------------------------------------------------------------------- 75 INTEGER, INTENT(in) :: kt ! ocean time-step indices 76 ! 77 INTEGER :: js, jm ! dummy loop indice 78 CHARACTER (len=25) :: charout 65 !! * Arguments 66 INTEGER, INTENT( in ) :: kt ! ocean time-step indices 67 68 !! * Local declarations 69 INTEGER :: js ! dummy loop indice 70 INTEGER :: iend, iday0, iday1 ! temporary integers 71 REAL(wp) :: zadatrjn, zadatrjb ! adatrj at timestep kt-1 and kt-2 72 CHARACTER (len=25) :: charout 79 73 !!---------------------------------------------------------------------- 80 74 … … 83 77 !----------------------------------------------------------------- 84 78 85 ! ! ---------------- ! 86 IF( kt == -1 ) THEN ! Initialisation ! 87 ! ! ---------------- ! 88 ! 79 IF( kt == nit000 ) THEN 80 89 81 IF( .NOT.ln_rstart ) adatrj0 = 0.e0 ! adatrj0 initialized in rst_read when restart 90 82 91 ! set the calandar from adatrj0 and ndastp (read in restart file and namelist) 92 adatrj = adatrj0 !???? bug.... toujours rest !!gm 83 adatrj = adatrj0 93 84 nyear = ndastp / 10000 94 85 nmonth = ( ndastp - (nyear * 10000) ) / 100 95 86 nday = ndastp - (nyear * 10000) - ( nmonth * 100 ) 96 87 97 ! length of the month of the current year (from nleapy, read in namelist)98 n month_len(0) = nbiss(12) ; nmonth_len(13) = nbiss(1)99 SELECT CASE( nleapy )100 CASE( 1 )101 IF( MOD( nyear, 4 ) == 0 ) THEN102 ; nmonth_len(1:12) = nbiss(:) ! 366 days per year (leap year)88 ! Calculates nday_year, day since january 1st (useful to read daily forcing fields) 89 nday_year = nday 90 ! ! accumulates days of previous months of this year 91 DO js = 1, nmonth-1 92 IF( nleapy == 1 .AND. MOD( nyear, 4 ) == 0 ) THEN 93 nday_year = nday_year + nbiss(js) 103 94 ELSE 104 ; nmonth_len(1:12) = nobis(:) ! 365 days per year95 nday_year = nday_year + nobis(js) 105 96 ENDIF 106 CASE( 0 ) ; nmonth_len(1:12) = nobis(:) ! 365 days per year107 CASE( 2: ) ; nmonth_len(1:13) = nleapy ! 12*nleapy days per year108 END SELECT109 110 ! half month in second since the bigining of the year111 rmonth_half(0) = - 0.5 * rday * REAL( nmonth_len( 0 ) )112 DO jm = 1, 12113 rmonth_half(jm) = rmonth_half(jm-1) + 0.5 * rday * REAL( nmonth_len(jm-1) + nmonth_len(jm) )114 END DO115 rmonth_half(13) = rmonth_half( 1 ) + 365. * rday116 rmonth_half(14) = rmonth_half( 2 ) + 365. * rday117 118 ! day since january 1st (useful to read daily forcing fields)119 nday_year = nday120 DO js = 1, nmonth - 1 ! accumulates days of previous months of this year121 nday_year = nday_year + nmonth_len(js)122 97 END DO 123 98 124 ! number of seconds since... 125 rsec_year = REAL( nday_year - 1 ) * rday - rdttra(1) ! 00h 1st day of the current year 126 rsec_day = REAL( nday - 1 ) * rday - rdttra(1) ! 00h 1st day of the current month 127 rsec_month = - rdttra(1) ! 00h of the current day 99 ENDIF 128 100 129 ! control print 130 IF(lwp) WRITE(numout,*)' ==============>> time-step =', kt, ' Initial DATE= ', & 131 & nyear, '/', nmonth, '/', nday, ' rsec_day:', rsec_day 101 ! I. calculates adatrj, zadatrjn, zadatrjb. 102 ! ------------------------------------------------------------------ 132 103 133 ! 134 ! ! -------------------------------- ! 135 ELSE ! Model calendar at time-step kt ! 136 ! ! -------------------------------- ! 104 adatrj = adatrj0 + ( kt - nit000 + 1 ) * rdttra(1) / rday 105 zadatrjn = adatrj0 + ( kt - nit000 ) * rdttra(1) / rday 106 zadatrjb = adatrj0 + ( kt - nit000 - 1 ) * rdttra(1) / rday 137 107 138 rsec_year = rsec_year + rdttra(1) ! New time-step139 rsec_month = rsec_month + rdttra(1) ! New time-step140 rsec_day = rsec_day + rdttra(1) ! New time-step141 108 142 adatrj = adatrj0 + ( kt - nit000 + 1 ) * rdttra(1) / rday 109 ! II. increment the date. The date corresponds to 'now' variables (kt-1), 110 ! which is the time step of forcing fields. 111 ! Do not do this at nit000 unless nrstdt= 2 112 ! In that case ndastp (read in restart) was for step nit000-2 113 ! ------------------------------------------------------------------- 143 114 144 IF( rsec_day >= rday ) THEN 145 ! 146 rsec_day = 0.e0 ! NEW day 147 nday = nday + 1 148 nday_year = nday_year + 1 149 ! 150 IF( nday == nmonth_len(nmonth) + 1 ) THEN ! NEW month 151 nday = 1 152 rsec_month = 0.e0 153 nmonth = nmonth + 1 154 IF( nmonth == 13 ) THEN ! NEW year 155 nyear = nyear + 1 156 nmonth = 1 157 nday_year = 1 158 rsec_year = 0.e0 159 ! ! update the length of the month 160 IF( nleapy == 1 ) THEN ! of the current year (if necessary) 161 IF( MOD( nyear, 4 ) == 0 ) THEN 162 nmonth_len(1:12) = nbiss(:) ! 366 days per year (leap year) 163 ELSE 164 nmonth_len(1:12) = nobis(:) ! 365 days per year 165 ENDIF 166 ! half month in second since the bigining of the year 167 rmonth_half(0) = - 0.5 * rday * REAL( nmonth_len( 0 ) ) 168 DO jm = 1, 12 169 rmonth_half(jm) = rmonth_half(jm-1) + 0.5 * rday * REAL( nmonth_len(jm-1) + nmonth_len(jm) ) 170 END DO 171 rmonth_half(13) = rmonth_half( 1 ) + 365. * rday 172 rmonth_half(14) = rmonth_half( 2 ) + 365. * rday 173 ENDIF 174 ENDIF 115 iday0 = INT( zadatrjb ) 116 iday1 = INT( zadatrjn ) 117 118 IF( iday1 - iday0 >= 1 .AND. ( kt /= nit000 .OR. nrstdt == 2 ) ) THEN 119 120 ! increase calendar 121 nyear = ndastp / 10000 122 nmonth = ( ndastp - (nyear * 10000) ) / 100 123 nday = ndastp - (nyear * 10000) - ( nmonth * 100 ) 124 nday = nday + 1 125 IF( nleapy == 1 .AND. MOD( nyear, 4 ) == 0 ) THEN 126 iend = nbiss(nmonth) 127 ELSEIF( nleapy > 1 ) THEN 128 iend = nleapy 129 ELSE 130 iend = nobis(nmonth) 131 ENDIF 132 IF( nday == iend + 1 ) THEN 133 nday = 1 134 nmonth = nmonth + 1 135 IF( nmonth == 13 ) THEN 136 nmonth = 1 137 nyear = nyear + 1 175 138 ENDIF 139 ENDIF 140 ndastp = nyear * 10000 + nmonth * 100 + nday 176 141 177 ! 178 ndastp = nyear * 10000 + nmonth * 100 + nday ! NEW date 179 ! 180 ! IF(lwp) WRITE(numout,'(a,i8,a,i4,a,i2,a,i2,a,i3)') '======>> time-step =', kt, & 181 ! & ' New day, DATE= ', nyear, '/', nmonth, '/', nday, ' nday_year = ', nday_year 182 ! IF(lwp) WRITE(numout,'(a,F9.0,a,F9.0,a,F9.0)') ' rsec_year = ', rsec_year, & 183 ! & ' rsec_month = ', rsec_month, ' rsec_day = ', rsec_day 184 ENDIF 142 ! Calculates nday_year, day since january 1st (useful to read daily forcing fields) 143 nday_year = nday 144 ! ! accumulates days of previous months of this year 145 DO js = 1, nmonth-1 146 IF( nleapy == 1 .AND. MOD( nyear, 4 ) == 0 ) THEN 147 nday_year = nday_year + nbiss(js) 148 ELSE 149 nday_year = nday_year + nobis(js) 150 ENDIF 151 END DO 185 152 186 IF(ln_ctl) THEN 187 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 188 CALL prt_ctl_info(charout) 189 ENDIF 190 ! 153 IF(lwp) WRITE(numout,*)' ==============>> time-step =', kt, ' New day, DATE= ', & 154 & nyear, '/', nmonth, '/', nday, 'nday_year:', nday_year 155 ENDIF 156 157 IF(ln_ctl) THEN 158 WRITE(charout,FMT="('kt =', I4,' d/m/y =',I2,I2,I4)") kt, nday, nmonth, nyear 159 CALL prt_ctl_info(charout, itime=kt) 191 160 ENDIF 192 161
Note: See TracChangeset
for help on using the changeset viewer.