- Timestamp:
- 2020-01-27T15:31:53+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/SBC/sbcdcy.F90
r12182 r12340 37 37 PUBLIC sbc_dcy_param ! routine used here and called by warm-layer parameterization (sbcblk_skin_coare*) 38 38 39 !! * Substitutions 40 # include "do_loop_substitute.h90" 39 41 !!---------------------------------------------------------------------- 40 42 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 108 110 109 111 imask_night(:,:) = 0 110 DO jj = 1, jpj 111 DO ji = 1, jpi 112 ztmpm = 0._wp 113 IF( ABS(rab(ji,jj)) < 1. ) THEN ! day duration is less than 24h 112 DO_2D_11_11 113 ztmpm = 0._wp 114 IF( ABS(rab(ji,jj)) < 1. ) THEN ! day duration is less than 24h 115 ! 116 IF( rdawn_dcy(ji,jj) < rdusk_dcy(ji,jj) ) THEN ! day time in one part 117 zlousd = MAX(zlo, rdawn_dcy(ji,jj)) 118 zlousd = MIN(zlousd, zup) 119 zupusd = MIN(zup, rdusk_dcy(ji,jj)) 120 zupusd = MAX(zupusd, zlo) 121 ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 122 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 123 ztmpm = zupusd - zlousd 124 IF( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 114 125 ! 115 IF( rdawn_dcy(ji,jj) < rdusk_dcy(ji,jj) ) THEN ! day time in one part 116 zlousd = MAX(zlo, rdawn_dcy(ji,jj)) 117 zlousd = MIN(zlousd, zup) 118 zupusd = MIN(zup, rdusk_dcy(ji,jj)) 119 zupusd = MAX(zupusd, zlo) 120 ztmp = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 121 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 122 ztmpm = zupusd - zlousd 123 IF( ztmpm .EQ. 0 ) imask_night(ji,jj) = 1 124 ! 125 ELSE ! day time in two parts 126 zlousd = MIN(zlo, rdusk_dcy(ji,jj)) 127 zupusd = MIN(zup, rdusk_dcy(ji,jj)) 128 ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 129 ztmpm1=zupusd-zlousd 130 zlousd = MAX(zlo, rdawn_dcy(ji,jj)) 131 zupusd = MAX(zup, rdawn_dcy(ji,jj)) 132 ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 133 ztmpm2 =zupusd-zlousd 134 ztmp = ztmp1 + ztmp2 135 ztmpm = ztmpm1 + ztmpm2 136 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 137 IF(ztmpm .EQ. 0.) imask_night(ji,jj) = 1 138 ENDIF 139 ELSE ! 24h light or 24h night 126 ELSE ! day time in two parts 127 zlousd = MIN(zlo, rdusk_dcy(ji,jj)) 128 zupusd = MIN(zup, rdusk_dcy(ji,jj)) 129 ztmp1 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 130 ztmpm1=zupusd-zlousd 131 zlousd = MAX(zlo, rdawn_dcy(ji,jj)) 132 zupusd = MAX(zup, rdawn_dcy(ji,jj)) 133 ztmp2 = fintegral(zlousd, zupusd, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 134 ztmpm2 =zupusd-zlousd 135 ztmp = ztmp1 + ztmp2 136 ztmpm = ztmpm1 + ztmpm2 137 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 138 IF(ztmpm .EQ. 0.) imask_night(ji,jj) = 1 139 ENDIF 140 ELSE ! 24h light or 24h night 141 ! 142 IF( raa(ji,jj) > rbb(ji,jj) ) THEN ! 24h day 143 ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 144 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 145 imask_night(ji,jj) = 0 140 146 ! 141 IF( raa(ji,jj) > rbb(ji,jj) ) THEN ! 24h day 142 ztmp = fintegral(zlo, zup, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 143 zqsrout(ji,jj) = pqsrin(ji,jj) * ztmp * rscal(ji,jj) 144 imask_night(ji,jj) = 0 145 ! 146 ELSE ! No day 147 zqsrout(ji,jj) = 0.0_wp 148 imask_night(ji,jj) = 1 149 ENDIF 150 ENDIF 151 END DO 152 END DO 147 ELSE ! No day 148 zqsrout(ji,jj) = 0.0_wp 149 imask_night(ji,jj) = 1 150 ENDIF 151 ENDIF 152 END_2D 153 153 ! 154 154 IF( PRESENT(l_mask) .AND. l_mask ) THEN … … 193 193 194 194 zsin = SIN( zdecrad ) ; zcos = COS( zdecrad ) 195 DO jj = 1, jpj 196 DO ji = 1, jpi 197 ztmp = rad * gphit(ji,jj) 198 raa(ji,jj) = SIN( ztmp ) * zsin 199 rbb(ji,jj) = COS( ztmp ) * zcos 200 END DO 201 END DO 195 DO_2D_11_11 196 ztmp = rad * gphit(ji,jj) 197 raa(ji,jj) = SIN( ztmp ) * zsin 198 rbb(ji,jj) = COS( ztmp ) * zcos 199 END_2D 202 200 ! Compute the time of dawn and dusk 203 201 204 202 ! rab to test if the day time is equal to 0, less than 24h of full day 205 203 rab(:,:) = -raa(:,:) / rbb(:,:) 206 DO jj = 1, jpj 207 DO ji = 1, jpi 208 IF( ABS(rab(ji,jj)) < 1._wp ) THEN ! day duration is less than 24h 209 ! When is it night? 210 ztx = 1._wp/(2._wp*rpi) * (ACOS(rab(ji,jj)) - rcc(ji,jj)) 211 ztest = -rbb(ji,jj) * SIN( rcc(ji,jj) + 2._wp*rpi * ztx ) 212 ! is it dawn or dusk? 213 IF( ztest > 0._wp ) THEN 214 rdawn_dcy(ji,jj) = ztx 215 rdusk_dcy(ji,jj) = rtmd(ji,jj) + ( rtmd(ji,jj) - rdawn_dcy(ji,jj) ) 216 ELSE 217 rdusk_dcy(ji,jj) = ztx 218 rdawn_dcy(ji,jj) = rtmd(ji,jj) - ( rdusk_dcy(ji,jj) - rtmd(ji,jj) ) 219 ENDIF 204 DO_2D_11_11 205 IF( ABS(rab(ji,jj)) < 1._wp ) THEN ! day duration is less than 24h 206 ! When is it night? 207 ztx = 1._wp/(2._wp*rpi) * (ACOS(rab(ji,jj)) - rcc(ji,jj)) 208 ztest = -rbb(ji,jj) * SIN( rcc(ji,jj) + 2._wp*rpi * ztx ) 209 ! is it dawn or dusk? 210 IF( ztest > 0._wp ) THEN 211 rdawn_dcy(ji,jj) = ztx 212 rdusk_dcy(ji,jj) = rtmd(ji,jj) + ( rtmd(ji,jj) - rdawn_dcy(ji,jj) ) 220 213 ELSE 221 rd awn_dcy(ji,jj) = rtmd(ji,jj) + 0.5_wp222 rd usk_dcy(ji,jj) = rdawn_dcy(ji,jj)214 rdusk_dcy(ji,jj) = ztx 215 rdawn_dcy(ji,jj) = rtmd(ji,jj) - ( rdusk_dcy(ji,jj) - rtmd(ji,jj) ) 223 216 ENDIF 224 END DO 225 END DO 217 ELSE 218 rdawn_dcy(ji,jj) = rtmd(ji,jj) + 0.5_wp 219 rdusk_dcy(ji,jj) = rdawn_dcy(ji,jj) 220 ENDIF 221 END_2D 226 222 rdawn_dcy(:,:) = MOD( (rdawn_dcy(:,:) + 1._wp), 1._wp ) 227 223 rdusk_dcy(:,:) = MOD( (rdusk_dcy(:,:) + 1._wp), 1._wp ) … … 230 226 ! Avoid possible infinite scaling factor, associated with very short daylight 231 227 ! periods, by ignoring periods less than 1/1000th of a day (ticket #1040) 232 DO jj = 1, jpj 233 DO ji = 1, jpi 234 IF( ABS(rab(ji,jj)) < 1._wp ) THEN ! day duration is less than 24h 235 rscal(ji,jj) = 0.0_wp 236 IF( rdawn_dcy(ji,jj) < rdusk_dcy(ji,jj) ) THEN ! day time in one part 237 IF( (rdusk_dcy(ji,jj) - rdawn_dcy(ji,jj) ) .ge. 0.001_wp ) THEN 238 rscal(ji,jj) = fintegral(rdawn_dcy(ji,jj), rdusk_dcy(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 239 rscal(ji,jj) = 1._wp / rscal(ji,jj) 240 ENDIF 241 ELSE ! day time in two parts 242 IF( (rdusk_dcy(ji,jj) + (1._wp - rdawn_dcy(ji,jj)) ) .ge. 0.001_wp ) THEN 243 rscal(ji,jj) = fintegral(0._wp, rdusk_dcy(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) & 244 & + fintegral(rdawn_dcy(ji,jj), 1._wp, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 245 rscal(ji,jj) = 1. / rscal(ji,jj) 246 ENDIF 228 DO_2D_11_11 229 IF( ABS(rab(ji,jj)) < 1._wp ) THEN ! day duration is less than 24h 230 rscal(ji,jj) = 0.0_wp 231 IF( rdawn_dcy(ji,jj) < rdusk_dcy(ji,jj) ) THEN ! day time in one part 232 IF( (rdusk_dcy(ji,jj) - rdawn_dcy(ji,jj) ) .ge. 0.001_wp ) THEN 233 rscal(ji,jj) = fintegral(rdawn_dcy(ji,jj), rdusk_dcy(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 234 rscal(ji,jj) = 1._wp / rscal(ji,jj) 247 235 ENDIF 248 ELSE 249 IF( raa(ji,jj) > rbb(ji,jj) ) THEN ! 24h day 250 rscal(ji,jj) = fintegral(0._wp, 1._wp, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 251 rscal(ji,jj) = 1._wp / rscal(ji,jj) 252 ELSE ! No day 253 rscal(ji,jj) = 0.0_wp 236 ELSE ! day time in two parts 237 IF( (rdusk_dcy(ji,jj) + (1._wp - rdawn_dcy(ji,jj)) ) .ge. 0.001_wp ) THEN 238 rscal(ji,jj) = fintegral(0._wp, rdusk_dcy(ji,jj), raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) & 239 & + fintegral(rdawn_dcy(ji,jj), 1._wp, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 240 rscal(ji,jj) = 1. / rscal(ji,jj) 254 241 ENDIF 255 242 ENDIF 256 END DO 257 END DO 243 ELSE 244 IF( raa(ji,jj) > rbb(ji,jj) ) THEN ! 24h day 245 rscal(ji,jj) = fintegral(0._wp, 1._wp, raa(ji,jj), rbb(ji,jj), rcc(ji,jj)) 246 rscal(ji,jj) = 1._wp / rscal(ji,jj) 247 ELSE ! No day 248 rscal(ji,jj) = 0.0_wp 249 ENDIF 250 ENDIF 251 END_2D 258 252 ! 259 253 ztmp = rday / ( rdt * REAL(nn_fsbc, wp) )
Note: See TracChangeset
for help on using the changeset viewer.