- Timestamp:
- 2012-11-16T18:42:50+01:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2012/dev_MERCATOR_2012_rev3555/NEMOGCM/NEMO/OPA_SRC/SBC/sbcdcy.F90
r3294 r3586 49 49 50 50 51 FUNCTION sbc_dcy( pqsrin ) RESULT( zqsrout )51 FUNCTION sbc_dcy( pqsrin, l_mask ) RESULT( zqsrout ) 52 52 !!---------------------------------------------------------------------- 53 53 !! *** ROUTINE sbc_dcy *** … … 63 63 !! Part 1: a diurnally forced OGCM. Climate Dynamics 29:6, 575-590. 64 64 !!---------------------------------------------------------------------- 65 LOGICAL, OPTIONAL, INTENT(in) :: l_mask ! use the routine for night mask computation 65 66 REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pqsrin ! input daily QSR flux 66 67 !! 67 68 INTEGER :: ji, jj ! dummy loop indices 69 INTEGER, DIMENSION(jpi,jpj) :: imask_night ! night mask 68 70 REAL(wp) :: ztwopi, zinvtwopi, zconvrad 69 71 REAL(wp) :: zlo, zup, zlousd, zupusd 70 72 REAL(wp) :: zdsws, zdecrad, ztx, zsin, zcos 71 73 REAL(wp) :: ztmp, ztmp1, ztmp2, ztest 74 REAL(wp) :: ztmpm, ztmpm1, ztmpm2 72 75 REAL(wp), DIMENSION(jpi,jpj) :: zqsrout ! output QSR flux with diurnal cycle 73 76 !---------------------------statement functions------------------------ … … 90 93 zup = zlo + ( REAL(nn_fsbc, wp) * rdttra(1) ) / rday 91 94 ! 92 IF( nday_qsr == -1 ) THEN ! first time step only 95 IF( nday_qsr == -1 ) THEN ! first time step only 93 96 IF(lwp) THEN 94 97 WRITE(numout,*) … … 120 123 zdecrad = (-23.5 * zconvrad) * COS( zdsws * ztwopi / REAL(nyear_len(1),wp) ) 121 124 ! Compute A and B needed to compute the time integral of the diurnal cycle 122 125 123 126 zsin = SIN( zdecrad ) ; zcos = COS( zdecrad ) 124 127 DO jj = 1, jpj … … 129 132 END DO 130 133 END DO 131 132 134 ! Compute the time of dawn and dusk 133 135 … … 156 158 rdawn(:,:) = MOD( (rdawn(:,:) + 1._wp), 1._wp ) 157 159 rdusk(:,:) = MOD( (rdusk(:,:) + 1._wp), 1._wp ) 158 159 160 ! 2.2 Compute the scalling function: 160 161 ! S* = the inverse of the time integral of the diurnal cycle from dawm to dusk … … 185 186 ! 186 187 ENDIF 187 188 188 ! 3. update qsr with the diurnal cycle 189 189 ! ------------------------------------ 190 190 191 imask_night(:,:) = 0 191 192 DO jj = 1, jpj 192 193 DO ji = 1, jpi 194 ztmpm = 0.0 193 195 IF( ABS(rab(ji,jj)) < 1 ) THEN ! day duration is less than 24h 194 196 ! … … 200 202 ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 201 203 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 204 ztmpm = zupusd - zlousd 205 IF ( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 202 206 ! 203 207 ELSE ! day time in two parts … … 205 209 zupusd = MIN(zup, rdusk(ji,jj)) 206 210 ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 211 ztmpm1=zupusd-zlousd 207 212 zlousd = MAX(zlo, rdawn(ji,jj)) 208 213 zupusd = MAX(zup, rdawn(ji,jj)) 209 214 ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 215 ztmpm2 =zupusd-zlousd 210 216 ztmp = ztmp1 + ztmp2 217 ztmpm = ztmpm1 + ztmpm2 211 218 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 219 IF (ztmpm .EQ. 0.) imask_night(ji,jj) = 1 212 220 ENDIF 213 221 ELSE ! 24h light or 24h night … … 216 224 ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 217 225 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 226 imask_night(ji,jj) = 0 218 227 ! 219 228 ELSE ! No day 220 229 zqsrout(ji,jj) = 0.e0 230 imask_night(ji,jj) = 1 221 231 ENDIF 222 232 ENDIF 223 233 END DO 224 234 END DO 235 ! 236 IF ( PRESENT(l_mask) .AND. l_mask ) THEN 237 zqsrout(:,:) = float(imask_night(:,:)) 238 ENDIF 225 239 ! 226 240 IF( nn_timing == 1 ) CALL timing_stop('sbc_dcy')
Note: See TracChangeset
for help on using the changeset viewer.