Changeset 703 for trunk/NEMO/OPA_SRC/daymod.F90
 Timestamp:
 20071010T10:14:32+02:00 (12 years ago)
 File:

 1 edited
Legend:
 Unmodified
 Added
 Removed

trunk/NEMO/OPA_SRC/daymod.F90
r699 r703 4 4 !! Ocean : calendar 5 5 !!===================================================================== 6 !! History : ! 9409 (M. Pontaud M. Imbard) Original code 7 !! ! 9703 (O. Marti) 8 !! ! 9705 (G. Madec) 9 !! ! 9708 (M. Imbard) 10 !! 9.0 ! 0309 (G. Madec) F90 + nyear, nmonth, nday 11 !! ! 0401 (A.M. Treguier) new calculation based on adatrj 12 !! ! 0608 (G. Madec) surface module major update 13 !! 6 14 7 15 !! 8 16 !! day : calendar 9 17 !! 10 !! * Modules used11 18 USE dom_oce ! ocean space and time domain 12 19 USE phycst ! physical constants … … 17 24 PRIVATE 18 25 19 !! * Routine accessibility20 26 PUBLIC day ! called by step.F90 21 27 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 nit0001 (before the present run). 32 ! ! it is the accumulated duration of previous runs 33 ! ! that may have been run with different time steps. 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 nit0001 (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 /) !: (leapyear) 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 34 51 !! 35 !! OPA 9.0 , LOCEANIPSL (200 5)52 !! OPA 9.0 , LOCEANIPSL (2006) 36 53 !! $Id$ 37 !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt54 !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 38 55 !! 39 56 … … 54 71 !!  ndastp : =nyear*10000+nmonth*100+nday 55 72 !!  adatrj : date in days since the beginning of the run 56 !! 57 !! History : 58 !! ! 9409 (M. Pontaud M. Imbard) Original code 59 !! ! 9703 (O. Marti) 60 !! ! 9705 (G. Madec) 61 !! ! 9708 (M. Imbard) 62 !! 9.0 ! 0309 (G. Madec) F90 + nyear, nmonth, nday 63 !! ! 0401 (A.M. Treguier) new calculation based on adatrj 73 !!  rsec_year : current time of the year (in second since 00h, jan 1st) 64 74 !! 65 !! * Arguments 66 INTEGER, INTENT( in ) :: kt ! ocean timestep 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 kt1 and kt2 72 CHARACTER (len=25) :: charout 75 INTEGER, INTENT(in) :: kt ! ocean timestep indices 76 ! 77 INTEGER :: js, jm ! dummy loop indice 78 CHARACTER (len=25) :: charout 73 79 !! 74 80 … … 77 83 ! 78 84 79 IF( kt == nit000 ) THEN 80 85 ! !  ! 86 IF( kt == 1 ) THEN ! Initialisation ! 87 ! !  ! 88 ! 81 89 IF( .NOT.ln_rstart ) adatrj0 = 0.e0 ! adatrj0 initialized in rst_read when restart 82 90 83 adatrj = adatrj0 91 ! set the calandar from adatrj0 and ndastp (read in restart file and namelist) 92 adatrj = adatrj0 !???? bug.... toujours rest !!gm 84 93 nyear = ndastp / 10000 85 94 nmonth = ( ndastp  (nyear * 10000) ) / 100 86 95 nday = ndastp  (nyear * 10000)  ( nmonth * 100 ) 87 96 88 ! Calculates nday_year, day since january 1st (useful to read daily forcing fields) 97 ! length of the month of the current year (from nleapy, read in namelist) 98 nmonth_len(0) = nbiss(12) ; nmonth_len(13) = nbiss(1) 99 SELECT CASE( nleapy ) 100 CASE( 1 ) 101 IF( MOD( nyear, 4 ) == 0 ) THEN 102 ; nmonth_len(1:12) = nbiss(:) ! 366 days per year (leap year) 103 ELSE 104 ; nmonth_len(1:12) = nobis(:) ! 365 days per year 105 ENDIF 106 CASE( 0 ) ; nmonth_len(1:12) = nobis(:) ! 365 days per year 107 CASE( 2: ) ; nmonth_len(1:13) = nleapy ! 12*nleapy days per year 108 END SELECT 109 110 ! half month in second since the bigining of the year 111 rmonth_half(0) =  0.5 * rday * REAL( nmonth_len( 0 ) ) 112 DO jm = 1, 12 113 rmonth_half(jm) = rmonth_half(jm1) + 0.5 * rday * REAL( nmonth_len(jm1) + nmonth_len(jm) ) 114 END DO 115 rmonth_half(13) = rmonth_half( 1 ) + 365. * rday 116 rmonth_half(14) = rmonth_half( 2 ) + 365. * rday 117 118 ! day since january 1st (useful to read daily forcing fields) 89 119 nday_year = nday 90 ! ! accumulates days of previous months of this year 91 DO js = 1, nmonth1 92 IF( nleapy == 1 .AND. MOD( nyear, 4 ) == 0 ) THEN 93 nday_year = nday_year + nbiss(js) 94 ELSE 95 nday_year = nday_year + nobis(js) 96 ENDIF 120 DO js = 1, nmonth  1 ! accumulates days of previous months of this year 121 nday_year = nday_year + nmonth_len(js) 97 122 END DO 98 123 99 ENDIF 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 100 128 101 ! I. calculates adatrj, zadatrjn, zadatrjb. 102 !  129 ! control print 130 IF(lwp) WRITE(numout,*)' ==============>> timestep =', kt, ' Initial DATE= ', & 131 & nyear, '/', nmonth, '/', nday, ' rsec_day:', rsec_day 103 132 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 133 ! 134 ! !  ! 135 ELSE ! Model calendar at timestep kt ! 136 ! !  ! 107 137 138 rsec_year = rsec_year + rdttra(1) ! New timestep 139 rsec_month = rsec_month + rdttra(1) ! New timestep 140 rsec_day = rsec_day + rdttra(1) ! New timestep 108 141 109 ! II. increment the date. The date corresponds to 'now' variables (kt1), 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 nit0002 113 !  142 adatrj = adatrj0 + ( kt  nit000 + 1 ) * rdttra(1) / rday 114 143 115 iday0 = INT( zadatrjb ) 116 iday1 = INT( zadatrjn ) 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(jm1) + 0.5 * rday * REAL( nmonth_len(jm1) + 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 175 ENDIF 117 176 118 IF( iday1  iday0 >= 1 .AND. ( kt /= nit000 .OR. nrstdt == 2 ) ) THEN 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)') '======>> timestep =', 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 119 185 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) 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) 131 189 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 138 ENDIF 139 ENDIF 140 ndastp = nyear * 10000 + nmonth * 100 + nday 141 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, nmonth1 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 152 153 IF(lwp) WRITE(numout,*)' ==============>> timestep =', 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) 190 ! 160 191 ENDIF 161 192
Note: See TracChangeset
for help on using the changeset viewer.