File indexing completed on 2019-01-25 06:10:05 UTC
view on githubraw file Latest commit 88391fb6 on 2019-01-24 19:38:27 UTC
b2ea1d2979 Jean*0001 module radiation_mod
0002
0003
0004
0005
0006
0007
0008
0009 use gcm_params_mod, only: gcm_LEN_MBUF, gcm_SQZ_R, gcm_stdMsgUnit
0010 use constants_mod, only: stefan, cp_air, grav, pstd_mks
0011
0012
0013
0014
0015
0016
0017
0018 implicit none
0019 private
0020
0021
0022
0023
15388b052e Jean*0024
b2ea1d2979 Jean*0025
0026
0027
0028
0029
0030
0031 public :: radiation_init, radiation_down, radiation_up, radiation_end
0032
0033
0034
9f7d507fb9 Jean*0035
0036
88391fb671 jm-c 0037
0038
0039
9f7d507fb9 Jean*0040
0041
0042
b2ea1d2979 Jean*0043 logical :: initialized =.false.
9f7d507fb9 Jean*0044 integer :: select_incSW = 0
88391fb671 jm-c 0045
0046 integer :: ozone_in_SW = 0
0047 integer :: two_stream_SW = 0
b2ea1d2979 Jean*0048
0049 real :: solar_constant = 1360.0
0050 real :: del_sol = 1.4
0051
0052 real :: del_sw = 0.0
9f7d507fb9 Jean*0053 real :: yearLength = 86400.*360.
0054 real :: yearPhase = 10./365.
0055 real :: obliquity = 23.45
b2ea1d2979 Jean*0056 real :: atm_abs = 0.0
0057 real :: sw_diff = 0.0
0058 real :: albedo_value = 0.06
0059 real :: solar_exponent = 4.0
cf7369fae0 Jean*0060 real :: sw_co2 = 0.0596
0061 real :: wv_exponent = 4.0
0062
0063 real :: ir_tau_eq = 6.0
0064 real :: ir_tau_pole = 1.5
0065 real :: linear_tau = 0.1
0066
0067 real :: ir_tau_co2_win = 0.2150
0068 real :: ir_tau_wv_win1 = 147.11
0069 real :: ir_tau_wv_win2 = 1.0814e4
0070
0071 real :: ir_tau_co2 = -999.
0072 real :: ir_tau_wv = -999.
fcc5c8b844 jm-c 0073 real :: ir_tau_wv2 = -999.
cf7369fae0 Jean*0074 real :: window = -999.
e148c170bb Jean*0075
0076 real :: carbon_conc = 360.0
b2ea1d2979 Jean*0077
0078 real, save :: pi, deg_to_rad , rad_to_deg
0079
9f7d507fb9 Jean*0080 namelist/radiation_nml/ select_incSW, solar_constant, del_sol, &
b2ea1d2979 Jean*0081 ir_tau_eq, ir_tau_pole, linear_tau, ir_tau_co2, ir_tau_wv, &
fcc5c8b844 jm-c 0082 ir_tau_wv2, atm_abs, sw_diff, del_sw, albedo_value, window, &
0083 wv_exponent, solar_exponent, yearLength, yearPhase, obliquity, &
88391fb671 jm-c 0084 sw_co2, ir_tau_co2_win, ir_tau_wv_win1, ir_tau_wv_win2, &
0085 carbon_conc, ozone_in_SW, two_stream_SW
b2ea1d2979 Jean*0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 real :: missing_value = -999.
0096
0097
0098
0099
0100
0101
0102
c9694dc201 Jean*0103 subroutine radiation_init( is, ie, js, je, num_levels, nSx,nSy, axes, &
0104 Time, cst_albedo, myThid )
b2ea1d2979 Jean*0105
0106
c9694dc201 Jean*0107 integer, intent(in) :: is, ie, js, je, num_levels
0108 integer, intent(in) :: nSx, nSy
b2ea1d2979 Jean*0109 integer, intent(in), dimension(4) :: axes
0110
0111 real, intent(in) :: Time
c9694dc201 Jean*0112 real, intent(out) :: cst_albedo
b2ea1d2979 Jean*0113 integer, intent(in) :: myThid
0114
31f8711b60 Jean*0115
b2ea1d2979 Jean*0116
0117 integer :: iUnit
0118
0119
0120
0121
0122
0123
0124 CALL BARRIER(myThid)
0125 IF ( myThid.EQ.1 ) THEN
0126
0127 WRITE(msgBuf,'(A)') 'RADIATION_INIT: opening data.atm_gray'
0128 CALL PRINT_MESSAGE( msgBuf, gcm_stdMsgUnit, gcm_SQZ_R, myThid )
0129 CALL OPEN_COPY_DATA_FILE( &
0130 'data.atm_gray', 'RADIATION_INIT', &
0131 iUnit, &
0132 myThid )
0133
0134 READ(UNIT=iUnit,NML=radiation_nml)
0135 WRITE(msgBuf,'(A)') &
0136 'RADIATION_INIT: finished reading data.atm_gray'
0137 CALL PRINT_MESSAGE( msgBuf, gcm_stdMsgUnit, gcm_SQZ_R, myThid )
0138
15388b052e Jean*0139 #ifdef SINGLE_DISK_IO
b2ea1d2979 Jean*0140 CLOSE(iUnit)
15388b052e Jean*0141 #else
0142 CLOSE(iUnit,STATUS='DELETE')
0143 #endif /* SINGLE_DISK_IO */
b2ea1d2979 Jean*0144
0145 pi = 4.0*atan(1.)
0146 deg_to_rad = 2.*pi/360.
0147 rad_to_deg = 360.0/2./pi
0148
cf7369fae0 Jean*0149 if ( wv_exponent .eq. -1. ) then
0150
fcc5c8b844 jm-c 0151 if ( ir_tau_co2.eq. -999. ) ir_tau_co2 = 3.14
0152 if ( ir_tau_wv .eq. -999. ) ir_tau_wv = 199.25
0153 if ( ir_tau_wv2.eq. -999. ) ir_tau_wv2 = 14.78
cf7369fae0 Jean*0154 if ( window .eq. -999. ) window = 0.3732
0155 else
0156
0157 if ( ir_tau_co2.eq. -999. ) ir_tau_co2 = 0.8678
0158 if ( ir_tau_wv .eq. -999. ) ir_tau_wv = 1.9979e+3
0159 if ( window .eq. -999. ) window = 0.0
0160 endif
0161
b2ea1d2979 Jean*0162 initialized = .true.
0163
0164 ENDIF
0165 CALL BARRIER(myThid)
c9694dc201 Jean*0166 cst_albedo = albedo_value
b2ea1d2979 Jean*0167
0168
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216 return
0217 end subroutine radiation_init
0218
0219
0220
0221 subroutine radiation_down (is, js, Time_diag, lat, p_half, t, q, &
88391fb671 jm-c 0222 albedo, o3conc, ozone_column, &
0223 net_surf_sw_down, surf_lw_down, &
c9694dc201 Jean*0224 dtrans, dtrans_win, b, b_win, &
cf7369fae0 Jean*0225 down, solar_down, &
b2ea1d2979 Jean*0226 myThid )
0227
0228
0229
0230
0231 integer, intent(in) :: is, js
0232
0233 real, intent(in) :: Time_diag
0234 real, intent(in) , dimension(:,:) :: lat
cf7369fae0 Jean*0235 real, intent(out), dimension(:,:) :: net_surf_sw_down
0236 real, intent(out), dimension(:,:) :: surf_lw_down
b2ea1d2979 Jean*0237 real, intent(in) , dimension(:,:,:) :: t, q, p_half
c9694dc201 Jean*0238 real, intent(in) , dimension(:,:) :: albedo
88391fb671 jm-c 0239 real, intent(in) , dimension(:,:,:) :: o3conc
0240 real, intent(out), dimension(:,:,:) :: ozone_column
b2ea1d2979 Jean*0241 real, intent(out), dimension(:,:,:) :: dtrans
cf7369fae0 Jean*0242 real, intent(out), dimension(:,:,:) :: dtrans_win
b2ea1d2979 Jean*0243 real, intent(out), dimension(:,:,:) :: b
cf7369fae0 Jean*0244 real, intent(out), dimension(:,:,:) :: b_win
b2ea1d2979 Jean*0245 real, intent(out), dimension(:,:,:) :: down
0246 real, intent(out), dimension(:,:,:) :: solar_down
0247 integer, intent(in) :: myThid
0248
31f8711b60 Jean*0249
0250 integer :: k, n
b2ea1d2979 Jean*0251 integer :: im, jm
9f7d507fb9 Jean*0252
0253 real :: tYear, largeTan, cDecl, sDecl, tanDecl
e148c170bb Jean*0254 real :: lgCO2conc
b2ea1d2979 Jean*0255
31f8711b60 Jean*0256
b2ea1d2979 Jean*0257
0258
0259
9f7d507fb9 Jean*0260 real, allocatable, dimension(:,:) :: ss, solar, solar_tau_0, p2
cf7369fae0 Jean*0261 real, allocatable, dimension(:,:) :: solar_tau_k, sw_wv, del_sol_tau, mag_fac
0262 real, allocatable, dimension(:,:,:) :: solar_tau, dtrans_sol, down_win
0263 real, allocatable, dimension(:,:) :: del_tau, tau_0, tau_km, tau_kp, del_tau_win
88391fb671 jm-c 0264
0265 real, allocatable, dimension(:,:,:) :: ozone_mag, ozone_dF0_down
0266 real, allocatable, dimension(:,:) :: abs_uv_LH, abs_uv_LH_FS
0267 real, allocatable, dimension(:,:) :: abs_vis_LH, abs_vis_LH_FS
9f7d507fb9 Jean*0268
0269 real, allocatable, dimension(:,:) :: cLat, sLat, cos_H, HourAng
b2ea1d2979 Jean*0270
0271
0272 n = size(t,3)
0273 im = size(t,1)
0274 jm = size(t,2)
0275
0276
0277
0278 allocate (ss (im, jm))
0279 allocate (solar (im, jm))
9f7d507fb9 Jean*0280 if ( select_incSW .eq. 0 ) then
0281 allocate (p2 (im, jm))
88391fb671 jm-c 0282 else
9f7d507fb9 Jean*0283
0284 allocate (cLat (im, jm))
0285 allocate (sLat (im, jm))
0286 allocate (cos_H (im, jm))
0287 allocate (HourAng (im, jm))
0288 endif
88391fb671 jm-c 0289 if ( ozone_in_SW .eq. 1 ) then
0290 allocate (ozone_mag (im, jm, n+1))
0291 allocate (ozone_dF0_down (im, jm, n+1))
0292 allocate (abs_uv_LH (im, jm))
0293 allocate (abs_vis_LH (im, jm))
0294 allocate (abs_uv_LH_FS (im, jm))
0295 allocate (abs_vis_LH_FS (im, jm))
0296 endif
cf7369fae0 Jean*0297 if ( solar_exponent .eq. 0. ) then
0298 allocate (solar_tau_k (im, jm))
0299 allocate (sw_wv (im, jm))
0300 allocate (del_sol_tau (im, jm))
0301 allocate (mag_fac (im, jm))
0302 allocate (dtrans_sol (im, jm, n))
0303 else
0304 allocate (solar_tau_0 (im, jm))
0305 allocate (solar_tau (im, jm, n+1))
0306 endif
0307 if ( wv_exponent .eq. -1. ) then
0308 allocate (del_tau (im, jm))
0309 allocate (del_tau_win (im, jm))
0310 allocate (down_win (im, jm, n+1))
0311 elseif ( wv_exponent .eq. 0. ) then
9f7d507fb9 Jean*0312 allocate (del_tau (im, jm))
b2ea1d2979 Jean*0313 else
9f7d507fb9 Jean*0314 allocate (tau_0 (im, jm))
0315 allocate (tau_km (im, jm))
0316 allocate (tau_kp (im, jm))
b2ea1d2979 Jean*0317 endif
0318
0319
0320 ss = sin(lat)
0321
88391fb671 jm-c 0322 if ( select_incSW .eq. 1 .or. ozone_in_SW .eq. 1 ) then
fcc5c8b844 jm-c 0323
9f7d507fb9 Jean*0324
0325
0326
0327 tYear = MOD( Time_diag/yearLength + yearPhase , 1.0 )
0328
0329
0330
0331
88391fb671 jm-c 0332
fcc5c8b844 jm-c 0333
88391fb671 jm-c 0334 sDecl = -sin( obliquity*deg_to_rad ) * cos(2.*pi*tYear)
9f7d507fb9 Jean*0335 cDecl = cos( asin( sDecl ) )
88391fb671 jm-c 0336 endif
0337
0338 if ( select_incSW .eq. 0 ) then
0339
0340 p2 = (1. - 3.*ss*ss)/4.
0341 solar = 0.25*solar_constant*(1.0 + del_sol*p2 + del_sw * ss)
0342
0343 elseif ( select_incSW .eq. 1 ) then
0344
0345 largeTan = 1.e+16
9f7d507fb9 Jean*0346 if ( cDecl.EQ.0. ) then
0347 tanDecl = sign( largeTan, sDecl )
0348 else
0349 tanDecl = sDecl / cDecl
0350 endif
0351
0352
0353 cLat = cos(lat)
0354
0355 sLat = ss
0356 cos_H = sign( largeTan, sLat )
0357 where ( cLat .ne. 0. )
0358 cos_H = sLat/cLat
0359 endwhere
0360 cos_H = max( min( - cos_H * tanDecl, 1. ) , -1. )
0361 HourAng = acos( cos_H )
0362 solar = (solar_constant/pi) &
0363 *( HourAng*sLat*sDecl + cLat*cDecl*sin(HourAng) )
0364 else
0365 stop 'invalid select_incSW'
0366 endif
b2ea1d2979 Jean*0367
e148c170bb Jean*0368
0369 lgCO2conc = log(carbon_conc/360.)
0370
b2ea1d2979 Jean*0371
c9694dc201 Jean*0372
b2ea1d2979 Jean*0373
cf7369fae0 Jean*0374 if ( solar_exponent .eq. 0. ) then
0375
0376
e148c170bb Jean*0377
cf7369fae0 Jean*0378 solar_tau_k = 0.
0379 mag_fac(:,:) = 1.
0380
0381 do k = 1, n
0382
0383
0384 sw_wv = solar_tau_k + 0.5194
0385 sw_wv = exp( 0.01887 / (solar_tau_k + 0.009522) &
0386 + 1.603 / ( sw_wv*sw_wv ) )
e148c170bb Jean*0387 del_sol_tau(:,:) = ( sw_co2 + 0.0029 * lgCO2conc &
0388 + sw_wv(:,:) * q(:,:,k) ) * mag_fac(:,:) &
cf7369fae0 Jean*0389 * ( p_half(:,:,k+1) - p_half(:,:,k) ) / p_half(:,:,n+1)
0390 dtrans_sol(:,:,k) = exp( - del_sol_tau(:,:) )
0391 solar_tau_k = solar_tau_k + del_sol_tau(:,:)
0392 end do
0393
0394 solar_down(:,:,1) = solar(:,:)
0395 do k = 1,n
0396 solar_down(:,:,k+1) = solar_down(:,:,k)*dtrans_sol(:,:,k)
0397 end do
0398
0399 else
0400
0401
0402 solar_tau_0 = (1.0 - sw_diff*ss*ss)*atm_abs
0403
0404 do k = 1, n+1
0405 solar_tau(:,:,k) = solar_tau_0(:,:) &
0406 *(p_half(:,:,k)/p_half(:,:,n+1))**solar_exponent
0407 end do
0408
0409 do k = 1,n+1
0410 solar_down(:,:,k) = solar(:,:)*exp(-solar_tau(:,:,k))
0411 end do
0412
0413 endif
0414
88391fb671 jm-c 0415 if ( ozone_in_SW .eq. 1 ) then
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431 ozone_column(:,:,1) = 0.
0432 do k = 1, n
0433 ozone_column(:,:,k+1) = ozone_column(:,:,k) + ( &
0434 ( 287.1 / (1.38065e-23 * grav) ) &
0435 * ( p_half(:,:,k+1) - p_half(:,:,k) ) &
0436 * o3conc(:,:,k) / 2.687e+23 &
0437 )
0438 end do
0439
0440
0441 ozone_mag(:,:,:) = ozone_column(:,:,:) * 35. &
0442 / sqrt( 1224.*cDecl*cDecl + 1. )
0443
0444
0445 do k = 1, n+1
0446
0447 abs_vis_LH(:,:) = ( 0.02118 * ozone_mag(:,:,k) ) / ( &
0448 1. + 0.042 * ozone_mag(:,:,k) &
0449 + 0.000323*ozone_mag(:,:,k)*ozone_mag(:,:,k) &
0450 )
0451
0452 abs_vis_LH_FS(:,:) = ( -0.002894 * ozone_mag(:,:,k) + 1.0663 ) &
0453 * abs_vis_LH(:,:)
0454
0455 abs_uv_LH(:,:) = ( 1.082 * ozone_mag(:,:,k) ) / ( &
0456 ( 1. + 138.6 * ozone_mag(:,:,k) )**0.805 &
0457 ) &
0458 + ( 0.0658 * ozone_mag(:,:,k) ) / ( &
0459 1. + ( 103.6 * ozone_mag(:,:,k) )**3 &
0460 )
0461
0462 abs_uv_LH_FS(:,:) = ( -0.01632 * ozone_mag(:,:,k) + 1.08964 ) &
0463 * abs_uv_LH(:,:)
0464
0465
0466
0467 ozone_dF0_down(:,:,k) = solar(:,:) * ( abs_vis_LH_FS(:,:) &
0468 + abs_uv_LH_FS(:,:) &
0469 )
0470
0471
0472 solar_down(:,:,k) = solar_down(:,:,k) - ozone_dF0_down(:,:,k)
0473
0474 end do
0475
0476 endif
0477
cf7369fae0 Jean*0478 if ( wv_exponent .eq. -1. ) then
0479
0480
e148c170bb Jean*0481
cf7369fae0 Jean*0482 do k = 1, n
e148c170bb Jean*0483 del_tau = ( ir_tau_co2 + 0.2023 * lgCO2conc &
fcc5c8b844 jm-c 0484 + ir_tau_wv*log(ir_tau_wv2*q(:,:,k) + 1) ) &
cf7369fae0 Jean*0485 * ( p_half(:,:,k+1)-p_half(:,:,k) ) / p_half(:,:,n+1)
0486 dtrans(:,:,k) = exp( - del_tau )
e148c170bb Jean*0487 del_tau_win = ( ir_tau_co2_win + 0.0954 * lgCO2conc &
0488 + ir_tau_wv_win1*q(:,:,k) &
cf7369fae0 Jean*0489 + ir_tau_wv_win2*q(:,:,k)*q(:,:,k) ) &
0490 * ( p_half(:,:,k+1)-p_half(:,:,k) ) / p_half(:,:,n+1)
0491 dtrans_win(:,:,k) = exp( - del_tau_win )
0492 end do
b2ea1d2979 Jean*0493
cf7369fae0 Jean*0494 elseif ( wv_exponent .eq. 0. ) then
0495 dtrans_win = 1.
b2ea1d2979 Jean*0496
0497 do k = 1, n
0498 del_tau = ( ir_tau_co2 + ir_tau_wv * q(:,:,k) ) &
0499 * ( p_half(:,:,k+1)-p_half(:,:,k) ) / p_half(:,:,n+1)
0500 dtrans(:,:,k) = exp( - del_tau )
0501 end do
0502
0503 else
cf7369fae0 Jean*0504 dtrans_win = 1.
b2ea1d2979 Jean*0505
9f7d507fb9 Jean*0506 tau_0 = ir_tau_eq + (ir_tau_pole - ir_tau_eq)*ss*ss
0507
b2ea1d2979 Jean*0508 k = 1
0509 tau_kp = tau_0(:,:) * ( &
0510 linear_tau * p_half(:,:,k)/p_half(:,:,n+1) &
0511 + (1.0 - linear_tau)*(p_half(:,:,k)/p_half(:,:,n+1))**wv_exponent &
0512 )
0513 do k = 1, n
0514 tau_km = tau_kp
0515 tau_kp = tau_0(:,:) * ( &
0516 linear_tau * p_half(:,:,k+1)/p_half(:,:,n+1) &
0517 + (1.0 - linear_tau)*(p_half(:,:,k+1)/p_half(:,:,n+1))**wv_exponent &
0518 )
0519 dtrans(:,:,k) = exp( -(tau_kp - tau_km) )
0520 end do
0521
0522 endif
0523
0524
cf7369fae0 Jean*0525 b = stefan*t*t*t*t
0526 b_win = window*b
0527 b = (1.0-window)*b
b2ea1d2979 Jean*0528
0529 down(:,:,1) = 0.0
0530 do k = 1,n
cf7369fae0 Jean*0531 down(:,:,k+1) = down(:,:,k)*dtrans(:,:,k) &
0532 + b(:,:,k)*(1.0 - dtrans(:,:,k))
b2ea1d2979 Jean*0533 end do
0534
cf7369fae0 Jean*0535 if ( wv_exponent .eq. -1. ) then
0536 down_win(:,:,1) = 0.0
0537 do k = 1,n
0538 down_win(:,:,k+1) = down_win(:,:,k)*dtrans_win(:,:,k) &
0539 + b_win(:,:,k)*(1.0 - dtrans_win(:,:,k))
0540 end do
0541 down = down + down_win
0542 endif
b2ea1d2979 Jean*0543
0544 surf_lw_down = down(:,:,n+1)
0545 net_surf_sw_down = solar_down(:,:,n+1)*(1. - albedo(:,:))
0546
0547
0548
0549
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
cf7369fae0 Jean*0563 deallocate (ss, solar)
9f7d507fb9 Jean*0564 if ( select_incSW .eq. 0 ) then
0565 deallocate (p2)
88391fb671 jm-c 0566 else
9f7d507fb9 Jean*0567
88391fb671 jm-c 0568 deallocate (cLat, sLat)
0569 deallocate (cos_H, HourAng)
9f7d507fb9 Jean*0570 endif
cf7369fae0 Jean*0571 if ( solar_exponent .eq. 0. ) then
0572 deallocate (solar_tau_k, sw_wv, del_sol_tau, mag_fac, dtrans_sol)
0573 else
0574 deallocate (solar_tau_0, solar_tau)
0575 endif
88391fb671 jm-c 0576 if ( ozone_in_SW .eq. 1 ) then
0577 deallocate (ozone_mag, ozone_dF0_down)
0578 deallocate (abs_uv_LH, abs_vis_LH, abs_uv_LH_FS, abs_vis_LH_FS)
0579 endif
cf7369fae0 Jean*0580 if ( wv_exponent .eq. -1. ) then
0581 deallocate (del_tau, del_tau_win, down_win)
0582 elseif ( wv_exponent .eq. 0. ) then
b2ea1d2979 Jean*0583 deallocate (del_tau)
0584 else
9f7d507fb9 Jean*0585 deallocate (tau_0, tau_km, tau_kp)
b2ea1d2979 Jean*0586 endif
0587
0588
0589 return
0590 end subroutine radiation_down
0591
0592
0593
0594
88391fb671 jm-c 0595 subroutine radiation_up ( is, js, Time_diag, lat, p_half, t_surf, t, tdt, &
0596 flux_lw, flux_sw, albedo, ozone_column, &
0597 dtrans, dtrans_win, b, b_win, down, solar_down, &
cf7369fae0 Jean*0598 myThid )
b2ea1d2979 Jean*0599
0600
0601
0602 integer, intent(in) :: is, js
0603
0604 real, intent(in) :: Time_diag
0605 real, intent(in) , dimension(:,:) :: lat
0606 real, intent(in) , dimension(:,:) :: t_surf
0607 real, intent(in) , dimension(:,:,:) :: t, p_half
0608 real, intent(inout), dimension(:,:,:) :: tdt
88391fb671 jm-c 0609 real, intent(out), dimension(:,:,:) :: flux_lw
cf7369fae0 Jean*0610 real, intent(out), dimension(:,:,:) :: flux_sw
b2ea1d2979 Jean*0611 real, intent(in), dimension(:,:) :: albedo
88391fb671 jm-c 0612 real, intent(in) , dimension(:,:,:) :: ozone_column
b2ea1d2979 Jean*0613 real, intent(in), dimension(:,:,:) :: dtrans
cf7369fae0 Jean*0614 real, intent(in), dimension(:,:,:) :: dtrans_win
b2ea1d2979 Jean*0615 real, intent(in), dimension(:,:,:) :: b
cf7369fae0 Jean*0616 real, intent(in), dimension(:,:,:) :: b_win
b2ea1d2979 Jean*0617 real, intent(in), dimension(:,:,:) :: down
0618 real, intent(in), dimension(:,:,:) :: solar_down
0619 integer, intent(in) :: myThid
0620
31f8711b60 Jean*0621
0622 integer :: k, n
b2ea1d2979 Jean*0623 integer :: im, jm
88391fb671 jm-c 0624
0625 real :: tYear, cDecl, sDecl
b2ea1d2979 Jean*0626
31f8711b60 Jean*0627
b2ea1d2979 Jean*0628
0629
88391fb671 jm-c 0630 real, allocatable, dimension(:,:) :: solar, b_surf
0631 real, allocatable, dimension(:,:,:) :: tdt_rad, up, up_win, solar_up
0632
0633
0634 real, allocatable, dimension(:,:,:) :: ozone_mag_up, ozone_dF0_up
0635 real, allocatable, dimension(:,:) :: abs_uv_LH_up, abs_uv_LH_FS_up
0636 real, allocatable, dimension(:,:) :: abs_vis_LH_up, abs_vis_LH_FS_up
0637 real, allocatable, dimension(:,:) :: r_bar
b2ea1d2979 Jean*0638
0639
0640 n = size(t,3)
0641 im = size(t,1)
0642 jm = size(t,2)
0643
0644
88391fb671 jm-c 0645 if( two_stream_SW .eq. 1 ) then
0646 allocate (solar (im, jm))
0647 if ( ozone_in_SW .eq. 1 ) then
0648 allocate (ozone_mag_up (im, jm, n+1))
0649 allocate (ozone_dF0_up (im, jm, n+1))
0650 allocate (abs_uv_LH_up (im, jm))
0651 allocate (abs_vis_LH_up (im, jm))
0652 allocate (abs_uv_LH_FS_up (im, jm))
0653 allocate (abs_vis_LH_FS_up(im, jm))
0654 allocate (r_bar (im, jm))
0655 endif
0656 endif
b2ea1d2979 Jean*0657 allocate (tdt_rad (im, jm, n))
0658 allocate (up (im, jm, n+1))
cf7369fae0 Jean*0659 allocate (up_win (im, jm, n+1))
88391fb671 jm-c 0660 allocate (solar_up (im, jm, n+1))
0661
0662
b2ea1d2979 Jean*0663 allocate (b_surf (im, jm))
0664
0665
88391fb671 jm-c 0666
0667 do k = 1,n+1
0668 solar_up(:,:,k) = albedo(:,:) * solar_down(:,:,n+1)
0669 end do
0670
0671 if ( two_stream_SW .eq. 1 ) then
0672
0673
0674
0675 solar = solar_down(:,:,1)
0676
0677 if ( ozone_in_SW .eq. 1 ) then
0678
0679 tYear = MOD( Time_diag/yearLength + yearPhase , 1.0 )
0680
0681
0682
0683
0684
0685
0686 sDecl = -sin( obliquity*deg_to_rad ) * cos(2.*pi*tYear)
0687 cDecl = cos( asin( sDecl ) )
0688
0689
0690
0691
0692 do k = n+1,1,-1
0693 ozone_mag_up(:,:,k) = ozone_column(:,:,n+1) * 35. / &
0694 sqrt( 1224.*cDecl*cDecl + 1. ) &
0695 + 1.9 * ( ozone_column(:,:,n+1) &
0696 - ozone_column(:,:,k) &
0697 )
0698 end do
0699
0700 r_bar(:,:) = ( 0.291 / ( 1. + 0.816*cDecl ) ) + ( &
0701 ( 1. - ( 0.291 / ( 1. + 0.816*cDecl ) ) ) &
0702 * 0.856 * albedo(:,:) / ( 1. - 0.144*albedo(:,:) ) &
0703 )
0704
0705
0706 do k = n+1,1,-1
0707
0708 abs_vis_LH_up(:,:) = r_bar(:,:) * (0.02118 * ozone_mag_up(:,:,k)) / ( &
0709 1. + 0.042 * ozone_mag_up(:,:,k) &
0710 + 0.000323*ozone_mag_up(:,:,k)*ozone_mag_up(:,:,k) &
0711 )
0712
0713 abs_vis_LH_FS_up(:,:) = ( -0.002894 * ozone_mag_up(:,:,k) + 1.0663 ) &
0714 * abs_vis_LH_up(:,:)
0715
0716 abs_uv_LH_up(:,:) = r_bar(:,:) * (1.082 * ozone_mag_up(:,:,k)) / ( &
0717 ( 1. + 138.6 * ozone_mag_up(:,:,k) )**0.805 &
0718 ) &
0719 + ( 0.0658 * ozone_mag_up(:,:,k) ) / ( &
0720 1. + ( 103.6 * ozone_mag_up(:,:,k) )**3 &
0721 )
0722
0723 abs_uv_LH_FS_up(:,:) = ( -0.01632 * ozone_mag_up(:,:,k) + 1.08964 ) &
0724 * abs_uv_LH_up(:,:)
0725
0726
0727
0728 ozone_dF0_up(:,:,k) = solar(:,:) * ( abs_vis_LH_FS_up(:,:) &
0729 + abs_uv_LH_FS_up(:,:) &
0730 )
0731
0732 end do
0733
0734 do k = n,1,-1
0735
0736 solar_up(:,:,k) = solar_up(:,:,k) &
0737 - ( ozone_dF0_up(:,:,k) - ozone_dF0_up(:,:,n+1) )
0738 end do
0739
0740 endif
0741
0742 endif
0743
b2ea1d2979 Jean*0744
0745 b_surf = stefan*t_surf*t_surf*t_surf*t_surf
0746
0747
0748 up(:,:,n+1) = b_surf*(1.0-window)
cf7369fae0 Jean*0749 up_win(:,:,n+1) = b_surf*window
b2ea1d2979 Jean*0750 do k = n,1,-1
0751 up(:,:,k) = up(:,:,k+1)*dtrans(:,:,k) + b(:,:,k)*(1.0 - dtrans(:,:,k))
cf7369fae0 Jean*0752 up_win(:,:,k) = up_win(:,:,k+1)*dtrans_win(:,:,k) &
0753 + b_win(:,:,k)*(1.0 - dtrans_win(:,:,k))
b2ea1d2979 Jean*0754 end do
0755
0756
cf7369fae0 Jean*0757 up = up + up_win
b2ea1d2979 Jean*0758
88391fb671 jm-c 0759
b2ea1d2979 Jean*0760 do k = 1,n+1
88391fb671 jm-c 0761 flux_lw(:,:,k) = up(:,:,k)-down(:,:,k)
0762 flux_sw(:,:,k) = solar_down(:,:,k) - solar_up(:,:,k)
0763
b2ea1d2979 Jean*0764 end do
0765
88391fb671 jm-c 0766 if ( two_stream_SW .eq. 1 ) then
0767 do k = 1,n
0768 tdt_rad(:,:,k) = ( flux_lw(:,:,k+1) - flux_lw(:,:,k) &
0769 - flux_sw(:,:,k+1) + flux_sw(:,:,k) &
0770 ) &
0771 * grav / ( cp_air*( p_half(:,:,k+1)-p_half(:,:,k) ) )
0772 end do
0773 else
0774 do k = 1,n
0775 tdt_rad(:,:,k) = ( flux_lw(:,:,k+1) - flux_lw(:,:,k) &
0776 - solar_down(:,:,k+1) + solar_down(:,:,k) ) &
0777 * grav / ( cp_air*( p_half(:,:,k+1)-p_half(:,:,k) ) )
0778 end do
0779 endif
0780
b2ea1d2979 Jean*0781 do k = 1,n
88391fb671 jm-c 0782
0783
0784
b2ea1d2979 Jean*0785 tdt(:,:,k) = tdt(:,:,k) + tdt_rad(:,:,k)
0786 end do
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
88391fb671 jm-c 0822 if ( two_stream_SW .eq. 1 ) then
0823 deallocate (solar)
0824 if ( ozone_in_SW .eq. 1 ) then
0825 deallocate (ozone_mag_up, ozone_dF0_up)
0826 deallocate (abs_uv_LH_up, abs_vis_LH_up)
0827 deallocate (abs_uv_LH_FS_up, abs_vis_LH_FS_up, r_bar)
0828 endif
0829 endif
0830 deallocate (tdt_rad, up, up_win, solar_up)
0831
b2ea1d2979 Jean*0832 deallocate (b_surf)
0833
0834
0835 return
0836 end subroutine radiation_up
0837
0838
0839
0840 subroutine radiation_end
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850 end subroutine radiation_end
0851
0852
0853
0854 end module radiation_mod