File indexing completed on 2019-07-16 05:10:23 UTC
view on githubraw file Latest commit 892dca4b on 2019-06-28 22:32:02 UTC
b2ea1d2979 Jean*0001 module dargan_bettsmiller_mod
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021 use simple_sat_vapor_pres_mod, only: escomp, descomp
0022 use gcm_params_mod, only: gcm_LEN_MBUF, gcm_SQZ_R, gcm_stdMsgUnit
0023 use constants_mod, only: HLv,HLs,Cp_air,Grav,rdgas,rvgas, &
0024 kappa
0025
0026 implicit none
0027 private
0028
0029
0030
0031 public dargan_bettsmiller, dargan_bettsmiller_init
0032
0033
0034
0035
15388b052e Jean*0036 character(len=128) :: version = '$Id: dargan_bettsmiller_mod.F90,v 1.3 2017/08/11 20:48:50 jmc Exp $'
b2ea1d2979 Jean*0037 character(len=128) :: tag = '$Name: $'
0038
0039
0040
0041
0042 logical :: do_init=.true.
0043
0044
0045
0046
0047 real :: tau_bm=7200.
0048 real :: rhbm = .8
0049 logical :: do_virtual = .false.
0050 logical :: do_shallower = .false.
0051 logical :: do_changeqref = .false.
0052 logical :: do_envsat = .false.
0053 logical :: do_taucape = .false.
0054 logical :: do_bm_shift = .false.
0055 real :: capetaubm = 900.
0056 real :: tau_min = 2400.
0057
0058 namelist /dargan_bettsmiller_nml/ tau_bm, rhbm, &
0059 do_shallower, do_changeqref, &
0060 do_envsat, do_taucape, capetaubm, tau_min, &
0061 do_virtual, do_bm_shift
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 subroutine dargan_bettsmiller (dt, tin, qin, pfull, phalf, coldT, &
0096 rain, snow, tdel, qdel, q_ref, bmflag, &
0097 klzbs, cape, cin, t_ref,invtau_bm_t,invtau_bm_q, &
0098 capeflag, bi,bj,myIter, myThid, mask, conv)
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
599643daec Jean*0125
b2ea1d2979 Jean*0126
0127
0128
0129
0130
0131
0132
0133
0134
0135
0136 real , intent(in) , dimension(:,:,:) :: tin, qin, pfull, phalf
0137 real , intent(in) :: dt
0138 logical , intent(in) , dimension(:,:):: coldT
0139 real , intent(out), dimension(:,:) :: rain,snow, bmflag, klzbs, cape, &
0140 cin, invtau_bm_t, invtau_bm_q, capeflag
0141 real , intent(out), dimension(:,:,:) :: tdel, qdel, q_ref, t_ref
0142 integer, intent(in) :: bi,bj, myIter
0143 integer, intent(in) :: myThid
0144 real , intent(in) , dimension(:,:,:), optional :: mask
0145 logical, intent(in) , dimension(:,:,:), optional :: conv
0146
0147
0148
599643daec Jean*0149
0150 real,dimension(size(tin,1),size(tin,2),size(tin,3)) :: rin
0151 real,dimension(size(tin,1),size(tin,2)) :: precip, precip_t
0152 real,dimension(size(tin,3)) :: eref, rpc, tpc
b2ea1d2979 Jean*0153
0154 real :: &
0155 cape1, cin1, tot, deltak, deltaq, qrefint, deltaqfrac, deltaqfrac2, &
599643daec Jean*0156 ptopfrac, es, capeflag1, small
0157 integer i, j, k, ix, jx, kx, klzb, ktop
b2ea1d2979 Jean*0158
0159
0160
0161 capeflag1 = 0.
0162
0163
0164
0165
0166 ix=size(tin,1)
0167 jx=size(tin,2)
0168 kx=size(tin,3)
0169 small = 1.e-10
0170
599643daec Jean*0171
0172 precip = 0.
0173 tdel = 0.
0174 qdel = 0.
0175 t_ref = tin
0176 q_ref = qin
0177 bmflag = 0.
0178 klzbs = 0.
0179 cape = 0.
0180 cin = 0.
0181 invtau_bm_t = 0.
0182 invtau_bm_q = 0.
0183 precip_t = 0.
0184
b2ea1d2979 Jean*0185
0186 rin = qin/(1.0 - qin)
0187
599643daec Jean*0188 do j=1,jx
0189 do i=1,ix
b2ea1d2979 Jean*0190 cape1 = 0.
0191 cin1 = 0.
0192 tot = 0.
0193 klzb=0
0194
0195
0196
0197
0198 bmflag(i,j) = 0.
0199 tpc = tin(i,j,:)
0200 rpc = rin(i,j,:)
0201
0202
0203 call capecalcnew( kx, pfull(i,j,:), phalf(i,j,:),&
0204 cp_air, rdgas, rvgas, hlv, kappa, tin(i,j,:), &
0205 rin(i,j,:), cape1, cin1, tpc, &
0206 rpc, klzb, i,j,bi,bj,myIter,myThid)
0207
0208
0209 capeflag(i,j) = capeflag1
0210 cape(i,j) = cape1
0211 cin(i,j) = cin1
0212 klzbs(i,j) = klzb
0213 if(cape1.gt.0.) then
0214
0215 bmflag(i,j) = 1.
0216
599643daec Jean*0217
0218 t_ref(i,j,klzb:kx) = tpc(klzb:kx)
b2ea1d2979 Jean*0219 do k=klzb,kx
0220
0221
0222 if(do_envsat) then
0223 call escomp(tin(i,j,k),es)
0224 es = es*rhbm
0225 rpc(k) = mixing_ratio(es, pfull(i,j,k))
0226 q_ref(i,j,k) = rpc(k)/(1 + rpc(k))
0227 else
0228 eref(k) = rhbm*pfull(i,j,k)*rpc(k)/(rdgas/rvgas + rpc(k))
0229 rpc(k) = mixing_ratio(eref(k),pfull(i,j,k))
0230 q_ref(i,j,k) = rpc(k)/(1 + rpc(k))
0231 endif
0232 end do
0233
0234
0235
0236
599643daec Jean*0237
0238
0239
0240
0241
0242
b2ea1d2979 Jean*0243
0244 precip(i,j) = 0.
0245 precip_t(i,j) = 0.
0246
0247
0248 if(do_taucape) then
0249 tau_bm = sqrt(capetaubm)*tau_bm/sqrt(cape1)
0250 if(tau_bm.lt.tau_min) tau_bm = tau_min
0251 endif
0252 do k=klzb, kx
0253
0254 tdel(i,j,k) = - (tin(i,j,k) - t_ref(i,j,k))/tau_bm*dt
0255 qdel(i,j,k) = - (qin(i,j,k) - q_ref(i,j,k))/tau_bm*dt
0256
0257
599643daec Jean*0258 precip(i,j) = precip(i,j) - qdel(i,j,k) &
0259 *(phalf(i,j,k+1)- phalf(i,j,k))/grav
0260 precip_t(i,j)= precip_t(i,j) + cp_air/(hlv+small)*tdel(i,j,k) &
0261 *(phalf(i,j,k+1)-phalf(i,j,k))/grav
b2ea1d2979 Jean*0262 end do
0263 if ((precip(i,j).gt.0.).and.(precip_t(i,j).gt.0.)) then
0264
0265 bmflag(i,j) = 2.
0266
0267
0268
0269 if(precip(i,j).gt.precip_t(i,j) .and. (.not. do_bm_shift)) then
0270
0271
0272 invtau_bm_q(i,j) = precip_t(i,j)/precip(i,j)/tau_bm
0273 qdel(i,j,klzb:kx) = tau_bm*invtau_bm_q(i,j)* &
0274 qdel(i,j,klzb:kx)
0275 precip(i,j) = precip_t(i,j)
0276 invtau_bm_t(i,j) = 1./tau_bm
0277 else
0278
0279 deltak = 0.
0280 do k=klzb, kx
0281
0282 deltak = deltak - (tdel(i,j,k) + hlv/cp_air*&
0283 qdel(i,j,k))* &
0284 (phalf(i,j,k+1) - phalf(i,j,k))
0285 end do
0286
0287 deltak = deltak/(phalf(i,j,kx+1) - phalf(i,j,klzb))
0288
0289
0290 t_ref(i,j,klzb:kx) = t_ref(i,j,klzb:kx)+ &
0291 deltak*tau_bm/dt
0292 tdel(i,j,klzb:kx) = tdel(i,j,klzb:kx) + deltak
0293 endif
0294 else if(precip_t(i,j).gt.0.) then
0295
0296
0297
0298
0299
0300 if (do_shallower) then
0301
0302 ktop = klzb
0303
0304 do while ((precip(i,j).lt.0.).and.(ktop.le.kx))
0305 precip(i,j) = precip(i,j) - qdel(i,j,ktop)* &
0306 (phalf(i,j,ktop) - phalf(i,j,ktop+1))/grav
0307 ktop = ktop + 1
0308 end do
0309
0310
0311
0312 ktop = ktop - 1
599643daec Jean*0313 klzbs(i,j) = klzbs(i,j) + float(ktop)/( kx + 1.d0 )
b2ea1d2979 Jean*0314
0315
0316 if (ktop.gt.klzb) then
0317 qdel(i,j,klzb:ktop-1) = 0.
599643daec Jean*0318
b2ea1d2979 Jean*0319 tdel(i,j,klzb:ktop-1) = 0.
599643daec Jean*0320
b2ea1d2979 Jean*0321 end if
0322
0323
0324
0325
0326 if (precip(i,j).gt.0.) then
0327 ptopfrac = precip(i,j)/(qdel(i,j,ktop)* &
0328 (phalf(i,j,ktop+1) - phalf(i,j,ktop)))*grav
0329
0330 qdel(i,j,ktop) = ptopfrac*qdel(i,j,ktop)
0331
0332 precip(i,j) = 0.
0333
0334
0335
0336
0337
0338 tdel(i,j,ktop) = ptopfrac*tdel(i,j,ktop)
0339
0340
0341 deltak = 0.
0342 if (ktop.lt.kx) then
0343
0344
0345
0346
0347
0348 do k=ktop,kx
0349 deltak = deltak + tdel(i,j,k)* &
0350 (phalf(i,j,k) - phalf(i,j,k+1))
0351 end do
0352
0353
0354 deltak = deltak/(phalf(i,j,kx+1) - phalf(i,j,ktop))
0355
0356
0357
0358
0359
0360 do k=ktop,kx
0361 tdel(i,j,k) = tdel(i,j,k) + deltak
0362 t_ref(i,j,k) = t_ref(i,j,k) + deltak*tau_bm/dt
0363 end do
0364 end if
0365 else
0366 precip(i,j) = 0.
0367 qdel(i,j,kx) = 0.
599643daec Jean*0368
b2ea1d2979 Jean*0369 tdel(i,j,kx) = 0.
599643daec Jean*0370
0371
0372
b2ea1d2979 Jean*0373 end if
0374 else if(do_changeqref) then
0375
0376
0377
0378
0379
0380
0381
0382
0383 deltak = 0.
0384 deltaq = 0.
0385 qrefint = 0.
0386 do k=klzb,kx
0387
0388
0389
0390 deltaq = deltaq - qdel(i,j,k)*tau_bm/dt* &
0391 (phalf(i,j,k) - phalf(i,j,k+1))
0392
0393 deltak = deltak + tdel(i,j,k)* &
0394 (phalf(i,j,k) - phalf(i,j,k+1))
0395
0396 qrefint = qrefint - q_ref(i,j,k)* &
0397 (phalf(i,j,k) - phalf(i,j,k+1))
0398 end do
0399
0400 deltak = deltak /(phalf(i,j,kx+1) - phalf(i,j,klzb))
0401
0402 deltaqfrac = 1. - deltaq/qrefint
0403
0404 deltaqfrac2 = - deltaq/qrefint*dt/tau_bm
0405 precip(i,j) = 0.0
0406 do k=klzb,kx
0407 qdel(i,j,k) = qdel(i,j,k) + deltaqfrac2*q_ref(i,j,k)
0408 q_ref(i,j,k) = deltaqfrac*q_ref(i,j,k)
0409 tdel(i,j,k) = tdel(i,j,k) + deltak
0410 t_ref(i,j,k) = t_ref(i,j,k) + deltak*tau_bm/dt
0411 end do
0412 else
0413 precip(i,j) = 0.
0414 tdel(i,j,:) = 0.
0415 qdel(i,j,:) = 0.
599643daec Jean*0416
0417
b2ea1d2979 Jean*0418 end if
0419
0420
0421
0422 else
0423 tdel(i,j,:) = 0.0
0424 qdel(i,j,:) = 0.0
0425 precip(i,j) = 0.0
599643daec Jean*0426
0427
0428
0429
b2ea1d2979 Jean*0430 end if
0431
599643daec Jean*0432
0433
0434
0435
0436
0437
0438
0439
b2ea1d2979 Jean*0440 end if
0441 end do
0442 end do
0443
0444 rain = precip
0445 snow = 0.
599643daec Jean*0446
b2ea1d2979 Jean*0447
0448 end subroutine dargan_bettsmiller
0449
0450
0451
0452
0453
0454 subroutine capecalcnew(kx,p,phalf,cp_air,rdgas,rvgas,hlv,kappa,tin,rin,&
0455 cape,cin,tp,rp,klzb, i,j,bi,bj,myIter,myThid)
0456
0457
0458
0459
0460
0461
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488 implicit none
0489 integer, intent(in) :: kx
0490 real, intent(in), dimension(:) :: p, phalf, tin, rin
0491 real, intent(in) :: rdgas, rvgas, hlv, kappa, cp_air
0492 integer, intent(out) :: klzb
0493 real, intent(out), dimension(:) :: tp, rp
0494 real, intent(out) :: cape, cin
0495 integer, intent(in) :: i,j,bi,bj,myIter
0496 integer, intent(in) :: myThid
599643daec Jean*0497 integer :: k, klcl, klfc
b2ea1d2979 Jean*0498 logical :: nocape
599643daec Jean*0499 real, dimension(kx) :: tin_virtual
b2ea1d2979 Jean*0500 real :: t0, r0, es, rs, theta0, pstar, value, tlcl, &
599643daec Jean*0501 a, b, dtdlnp, &
0502 plcl, plzb, small
b2ea1d2979 Jean*0503
0504 pstar = 1.e5
0505
0506 small = 1.e-10
0507
0508 nocape = .true.
0509 cape = 0.
0510 cin = 0.
0511 plcl = 0.
0512 plzb = 0.
0513 klfc = 0
0514 klcl = 0
0515 klzb = 0
0516 tp(1:kx) = tin(1:kx)
0517 rp(1:kx) = rin(1:kx)
0518
0519
0520 do k=1,kx
0521 tin_virtual(k) = virtual_temp(tin(k), rin(k))
0522 enddo
0523
0524
0525 t0 = tin(kx)
0526 r0 = rin(kx)
0527
0528
0529 call escomp(t0,es)
0530 rs = mixing_ratio(es, p(kx))
0531 if (r0.ge.rs) then
0532
0533 plcl = p(kx)
0534
0535 klcl = kx
0536
0537
0538
0539
0540
0541 tp(kx) = t0 + (r0 - rs)/(cp_air/(hlv+small) + hlv*rs/rvgas/t0**2.)
0542 call escomp(tp(kx),es)
0543 rp(kx) = mixing_ratio(es, p(kx))
0544 else
0545
0546
0547 theta0 = tin(kx)*(pstar/p(kx))**kappa
0548
0549
0550
0551
0552 if (r0.gt.0.) then
0553 value = log(theta0**(-1/kappa)*pstar*r0/(rdgas/rvgas+r0))
0554
0555 call lcltabl(value,tlcl,i,j,bi,bj,myIter,myThid)
0556 plcl = pstar*(tlcl/theta0)**(1/kappa)
0557
0558 if (plcl.lt.p(1)) then
0559 plcl = p(1)
0560 tlcl = theta0*(plcl/pstar)**kappa
0561 write (*,*) 'hi lcl'
0562 end if
0563 k = kx
0564 else
0565
0566 plcl = p(1)
0567 tlcl = theta0*(plcl/pstar)**kappa
0568
0569 go to 11
0570 end if
0571
0572
0573 do while (p(k).gt.plcl)
0574 tp(k) = theta0*(p(k)/pstar)**kappa
0575 call escomp(tp(k),es)
0576
0577
0578 rp(k) = mixing_ratio(es,p(k))
0579
0580
0581 cin = cin + rdgas*(tin_virtual(k)-virtual_temp(tp(k),r0))*log(phalf(k+1)/phalf(k))
0582 k = k-1
0583 end do
0584
0585 klcl = k
0586
0587
0588
0589
0590
0591
0592 a = kappa*tlcl + hlv/cp_air*r0
0593 b = hlv**2.*r0/cp_air/rvgas/tlcl**2.
0594 dtdlnp = a/(1. + b)
0595
0596
0597
0598
0599 tp(klcl) = tlcl + dtdlnp*log(p(klcl)/plcl)/2.
0600 if ((tp(klcl).lt.173.16).and.nocape) go to 11
0601 call escomp(tp(klcl),es)
0602 rp(klcl) = mixing_ratio(es,(p(klcl) + plcl)/2)
0603 a = kappa*tp(klcl) + hlv/cp_air*rp(klcl)
0604 b = hlv**2./cp_air/rvgas*rp(klcl)/tp(klcl)**2.
0605 dtdlnp = a/(1. + b)
0606
0607 tp(klcl) = tlcl + dtdlnp*log(p(klcl)/plcl)
0608 if ((tp(klcl).lt.173.16).and.nocape) go to 11
0609 call escomp(tp(klcl),es)
0610 rp(klcl) = mixing_ratio(es,p(klcl))
0611
0612
0613 if ((virtual_temp(tp(klcl),rp(klcl)).lt.tin_virtual(klcl)).and.nocape) then
0614
0615 cin = cin + rdgas*(tin_virtual(klcl) - &
0616 virtual_temp(tp(klcl),rp(klcl)))*log(phalf(klcl+1)/phalf(klcl))
0617 else
0618
0619 cape = cape + rdgas*(virtual_temp(tp(klcl),rp(klcl)) - &
0620 tin_virtual(klcl))*log(phalf(klcl+1)/phalf(klcl))
0621
0622 if (nocape) then
0623 nocape = .false.
0624 klfc = klcl
0625 endif
0626 end if
0627 end if
0628
0629
0630
0631
0632
0633
0634 do k=klcl-1,1,-1
0635
0636
0637 a = kappa*tp(k+1) + hlv/cp_air*rp(k+1)
0638 b = hlv**2./cp_air/rvgas*rp(k+1)/tp(k+1)**2.
0639 dtdlnp = a/(1. + b)
0640
0641
0642
0643
0644 tp(k) = tp(k+1) + dtdlnp*log(p(k)/p(k+1))/2.
0645 if ((tp(k).lt.173.16).and.nocape) go to 11
0646 call escomp(tp(k),es)
0647 rp(k) = mixing_ratio(es,(p(k) + p(k+1))/2)
0648 a = kappa*tp(k) + hlv/cp_air*rp(k)
0649 b = hlv**2./cp_air/rvgas*rp(k)/tp(k)**2.
0650 dtdlnp = a/(1. + b)
0651
0652 tp(k) = tp(k+1) + dtdlnp*log(p(k)/p(k+1))
0653
0654
0655 if ((tp(k).lt.173.16).and.nocape) go to 11
0656 call escomp(tp(k),es)
0657 rp(k) = mixing_ratio(es,p(k))
0658 if ((virtual_temp(tp(k),rp(k)).lt.tin_virtual(k)).and.nocape) then
0659
0660 cin = cin + rdgas*(tin_virtual(k)-virtual_temp(tp(k),rp(k)))*log(phalf(k+1)/phalf(k))
0661 elseif((virtual_temp(tp(k),rp(k)).lt.tin_virtual(k)).and.(.not.nocape)) then
0662
0663
0664 klzb = k+1
0665 go to 11
0666 else
0667
0668 cape = cape + rdgas*(virtual_temp(tp(k),rp(k))-tin_virtual(k))*log(phalf(k+1)/phalf(k))
0669
0670 if (nocape) then
0671 nocape = .false.
0672 klfc = k
0673 endif
0674 end if
0675 end do
0676 11 if(nocape) then
0677
0678
0679 plzb = p(1)
0680 klzb = 0
0681 klfc = 0
0682 cin = 0.
0683 tp(1:kx) = tin(1:kx)
0684 rp(1:kx) = rin(1:kx)
0685 end if
0686
0687
0688
0689
0690
0691 end subroutine capecalcnew
0692
0693
0694
0695 subroutine lcltabl(value,tlcl,i,j,bi,bj,myIter,myThid)
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707 implicit none
0708 real, intent(in) :: value
0709 real, intent(out) :: tlcl
0710 integer, intent(in) :: i,j,bi,bj,myIter
0711 integer, intent(in) :: myThid
0712
0713 integer :: ival
0714 real, dimension(127) :: lcltable
0715 real :: v1, v2
0716
0717 integer :: errorMessageUnit
0718 DATA errorMessageUnit / 15 /
0719
0720 data lcltable/ 1.7364512e+02, 1.7427449e+02, 1.7490874e+02, &
0721 1.7554791e+02, 1.7619208e+02, 1.7684130e+02, 1.7749563e+02, &
0722 1.7815514e+02, 1.7881989e+02, 1.7948995e+02, 1.8016539e+02, &
0723 1.8084626e+02, 1.8153265e+02, 1.8222461e+02, 1.8292223e+02, &
0724 1.8362557e+02, 1.8433471e+02, 1.8504972e+02, 1.8577068e+02, &
0725 1.8649767e+02, 1.8723077e+02, 1.8797006e+02, 1.8871561e+02, &
0726 1.8946752e+02, 1.9022587e+02, 1.9099074e+02, 1.9176222e+02, &
0727 1.9254042e+02, 1.9332540e+02, 1.9411728e+02, 1.9491614e+02, &
0728 1.9572209e+02, 1.9653521e+02, 1.9735562e+02, 1.9818341e+02, &
0729 1.9901870e+02, 1.9986158e+02, 2.0071216e+02, 2.0157057e+02, &
0730 2.0243690e+02, 2.0331128e+02, 2.0419383e+02, 2.0508466e+02, &
0731 2.0598391e+02, 2.0689168e+02, 2.0780812e+02, 2.0873335e+02, &
0732 2.0966751e+02, 2.1061074e+02, 2.1156316e+02, 2.1252493e+02, &
0733 2.1349619e+02, 2.1447709e+02, 2.1546778e+02, 2.1646842e+02, &
0734 2.1747916e+02, 2.1850016e+02, 2.1953160e+02, 2.2057364e+02, &
0735 2.2162645e+02, 2.2269022e+02, 2.2376511e+02, 2.2485133e+02, &
0736 2.2594905e+02, 2.2705847e+02, 2.2817979e+02, 2.2931322e+02, &
0737 2.3045895e+02, 2.3161721e+02, 2.3278821e+02, 2.3397218e+02, &
0738 2.3516935e+02, 2.3637994e+02, 2.3760420e+02, 2.3884238e+02, &
0739 2.4009473e+02, 2.4136150e+02, 2.4264297e+02, 2.4393941e+02, &
0740 2.4525110e+02, 2.4657831e+02, 2.4792136e+02, 2.4928053e+02, &
0741 2.5065615e+02, 2.5204853e+02, 2.5345799e+02, 2.5488487e+02, &
0742 2.5632953e+02, 2.5779231e+02, 2.5927358e+02, 2.6077372e+02, &
0743 2.6229310e+02, 2.6383214e+02, 2.6539124e+02, 2.6697081e+02, &
0744 2.6857130e+02, 2.7019315e+02, 2.7183682e+02, 2.7350278e+02, &
0745 2.7519152e+02, 2.7690354e+02, 2.7863937e+02, 2.8039954e+02, &
0746 2.8218459e+02, 2.8399511e+02, 2.8583167e+02, 2.8769489e+02, &
0747 2.8958539e+02, 2.9150383e+02, 2.9345086e+02, 2.9542719e+02, &
0748 2.9743353e+02, 2.9947061e+02, 3.0153922e+02, 3.0364014e+02, &
0749 3.0577420e+02, 3.0794224e+02, 3.1014515e+02, 3.1238386e+02, &
0750 3.1465930e+02, 3.1697246e+02, 3.1932437e+02, 3.2171609e+02, &
0751 3.2414873e+02, 3.2662343e+02, 3.2914139e+02, 3.3170385e+02 /
0752
0753
0754 v1 = MIN( MAX( value, -23.d0 ), -10.4d0 )
0755
0756
0757
0758
0759
0760 if (value.lt.-23.0) then
0761 CALL PRINT_ERROR( 'In: dargan_bettsmiller '// &
0762 'lcltable: value too low', myThid)
892dca4bcd Jean*0763 WRITE(errorMessageUnit,'(A,4I4,I6,1PE14.6)') &
0764 'i,j,bi,bj,myIter,value=',i,j,bi,bj,myIter,value
b2ea1d2979 Jean*0765
0766 endif
0767 if (value.gt.-10.4) then
0768 CALL PRINT_ERROR( 'In: dargan_bettsmiller '// &
0769 'lcltable: value too high', myThid)
892dca4bcd Jean*0770 WRITE(errorMessageUnit,'(A,4I4,I6,1PE14.6)') &
0771 'i,j,bi,bj,myIter,value=',i,j,bi,bj,myIter,value
b2ea1d2979 Jean*0772
0773 endif
0774 ival = floor(10.*(v1 + 23.0))
0775 v2 = -230. + ival
0776 v1 = 10.*v1
0777 tlcl = (v2 + 1.0 - v1)*lcltable(ival+1) + (v1 - v2)*lcltable(ival+2)
0778
0779 end subroutine lcltabl
0780
0781
0782
0783 subroutine dargan_bettsmiller_init (myThid)
0784
0785
0786
0787
0788
0789
0790
599643daec Jean*0791
b2ea1d2979 Jean*0792 integer, intent(in) ::myThid
0793
599643daec Jean*0794
b2ea1d2979 Jean*0795
0796 integer :: iUnit
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
0822
0823
0824 CALL BARRIER(myThid)
0825 IF ( myThid.EQ.1 ) THEN
0826
0827 WRITE(msgBuf,'(A)') 'DARGAN_BETTSMILLER_init: opening data.atm_gray'
0828 CALL PRINT_MESSAGE( msgBuf, gcm_stdMsgUnit, gcm_SQZ_R, myThid )
0829 CALL OPEN_COPY_DATA_FILE( &
0830 'data.atm_gray', 'DARGAN_BETTSMILLER_init', &
0831 iUnit, &
0832 myThid )
0833
0834 READ(UNIT=iUnit,NML=dargan_bettsmiller_nml)
0835 WRITE(msgBuf,'(A)') &
0836 'DARGAB_BETTSMILLER_INIT: finished reading data.atm_gray'
0837 CALL PRINT_MESSAGE( msgBuf, gcm_stdMsgUnit, gcm_SQZ_R, myThid )
0838
15388b052e Jean*0839 #ifdef SINGLE_DISK_IO
b2ea1d2979 Jean*0840 CLOSE(iUnit)
15388b052e Jean*0841 #else
0842 CLOSE(iUnit,STATUS='DELETE')
0843 #endif /* SINGLE_DISK_IO */
b2ea1d2979 Jean*0844
0845 ENDIF
0846 CALL BARRIER(myThid)
0847
0848 return
0849 end subroutine dargan_bettsmiller_init
0850
0851
0852
0853 real function mixing_ratio(vapor_pressure, pressure)
0854
0855
0856
0857 implicit none
0858 real, intent(in) :: vapor_pressure, pressure
0859
0860 mixing_ratio = rdgas*vapor_pressure/rvgas/(pressure-vapor_pressure)
0861
0862 end function mixing_ratio
0863
0864
0865
0866 real function virtual_temp(temp, r)
0867
0868
0869
0870
0871 implicit none
0872 real, intent(in) :: temp
0873 real, intent(in) :: r
0874
0875 real :: q
0876
0877 if (do_virtual) then
0878 q = r/(1.0+r)
0879 virtual_temp = temp*(1.0+q*(rvgas/rdgas-1.0))
0880 else
0881 virtual_temp = temp
0882 endif
0883
0884 end function virtual_temp
0885
0886
0887
0888 end module dargan_bettsmiller_mod
0889