298 subroutine qr_acr_qg(NRHGtable)
301 INTEGER,
INTENT(IN) ::NRHGtable
304 INTEGER:: i, j, k, m, n, n2, n3, idx_bg
305 INTEGER:: km, km_s, km_e
306 DOUBLE PRECISION,
DIMENSION(nbg):: N_g
307 DOUBLE PRECISION,
DIMENSION(nbg,NRHGtable):: vg
308 DOUBLE PRECISION,
DIMENSION(nbr):: vr, N_r
309 DOUBLE PRECISION:: N0_r, N0_g, lam_exp, lamg, lamr
310 DOUBLE PRECISION:: massg, massr, dvg, dvr, t1, t2, z1, z2, y1, y2
316 vr(n2) = -0.1021 + 4.932e3*dr(n2) - 0.9551e6*dr(n2)*dr(n2) &
317 + 0.07934e9*dr(n2)*dr(n2)*dr(n2) &
318 - 0.002362e12*dr(n2)*dr(n2)*dr(n2)*dr(n2)
323 if (nrhgtable == nrhg) idx_bg = n3
324 if (nrhgtable == nrhg1) idx_bg = idx_bg1
325 vg(n,n3) = av_g(idx_bg)*dg(n)**bv_g(idx_bg)
330 km_e = ntb_r*ntb_r1 - 1
334 k = mod( km , ntb_r1 ) + 1
336 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
337 lamr = lam_exp * (crg(3)*org2*org1)**obmr
338 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
340 n_r(n2) = n0_r*dr(n2)**mu_r *dexp(-lamr*dr(n2))*dtr(n2)
344 if (nrhgtable == nrhg) idx_bg = n3
345 if (nrhgtable == nrhg1) idx_bg = idx_bg1
349 lam_exp = (n0g_exp(i)*am_g(idx_bg)*cgg(1,1)/r_g(j))**oge1
350 lamg = lam_exp * (cgg(3,1)*ogg2*ogg1)**obmg
351 n0_g = n0g_exp(i)/(cgg(2,1)*lam_exp) * lamg**cge(2,1)
353 n_g(n) = n0_g*dg(n)**mu_g * dexp(-lamg*dg(n))*dtg(n)
363 massr = am_r * dr(n2)**bm_r
365 massg = am_g(idx_bg) * dg(n)**bm_g
367 dvg = 0.5d0*((vr(n2) - vg(n,n3)) + dabs(vr(n2)-vg(n,n3)))
368 dvr = 0.5d0*((vg(n,n3) - vr(n2)) + dabs(vg(n,n3)-vr(n2)))
370 t1 = t1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
371 *dvg*massg * n_g(n)* n_r(n2)
372 z1 = z1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
373 *dvg*massr * n_g(n)* n_r(n2)
374 y1 = y1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
375 *dvg * n_g(n)* n_r(n2)
377 t2 = t2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
378 *dvr*massr * n_g(n)* n_r(n2)
379 y2 = y2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
380 *dvr * n_g(n)* n_r(n2)
381 z2 = z2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
382 *dvr*massg * n_g(n)* n_r(n2)
386 tcg_racg(i,j,n3,k,m) = t1
387 tmr_racg(i,j,n3,k,m) = dmin1(z1, r_r(m)*1.0d0)
388 tcr_gacr(i,j,n3,k,m) = t2
389 tnr_racg(i,j,n3,k,m) = y1
390 tnr_gacr(i,j,n3,k,m) = y2
406 INTEGER:: i, j, k, m, n, n2
407 INTEGER:: km, km_s, km_e
408 DOUBLE PRECISION,
DIMENSION(nbr):: vr, D1, N_r
409 DOUBLE PRECISION,
DIMENSION(nbs):: vs, N_s
410 DOUBLE PRECISION:: loga_, a_, b_, second, M0, M2, M3, Mrat, oM3
411 DOUBLE PRECISION:: N0_r, lam_exp, lamr, slam1, slam2
412 DOUBLE PRECISION:: dvs, dvr, masss, massr
413 DOUBLE PRECISION:: t1, t2, t3, t4, z1, z2, z3, z4
414 DOUBLE PRECISION:: y1, y2, y3, y4
420 vr(n2) = -0.1021 + 4.932e3*dr(n2) - 0.9551e6*dr(n2)*dr(n2) &
421 + 0.07934e9*dr(n2)*dr(n2)*dr(n2) &
422 - 0.002362e12*dr(n2)*dr(n2)*dr(n2)*dr(n2)
423 d1(n2) = (vr(n2)/av_s)**(1./bv_s)
426 vs(n) = 1.5*av_s*ds(n)**bv_s * dexp(-fv_s*ds(n))
430 km_e = ntb_r*ntb_r1 - 1
434 k = mod( km , ntb_r1 ) + 1
436 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
437 lamr = lam_exp * (crg(3)*org2*org1)**obmr
438 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
440 n_r(n2) = n0_r*dr(n2)**mu_r * dexp(-lamr*dr(n2))*dtr(n2)
450 m2 = r_s(i)*oams *1.0d0
451 if (bm_s.gt.2.0-1.e-3 .and. bm_s.lt.2.0+1.e-3)
then
452 loga_ = sa(1) + sa(2)*tc(j) + sa(3)*bm_s &
453 + sa(4)*tc(j)*bm_s + sa(5)*tc(j)*tc(j) &
454 + sa(6)*bm_s*bm_s + sa(7)*tc(j)*tc(j)*bm_s &
455 + sa(8)*tc(j)*bm_s*bm_s + sa(9)*tc(j)*tc(j)*tc(j) &
456 + sa(10)*bm_s*bm_s*bm_s
458 b_ = sb(1) + sb(2)*tc(j) + sb(3)*bm_s &
459 + sb(4)*tc(j)*bm_s + sb(5)*tc(j)*tc(j) &
460 + sb(6)*bm_s*bm_s + sb(7)*tc(j)*tc(j)*bm_s &
461 + sb(8)*tc(j)*bm_s*bm_s + sb(9)*tc(j)*tc(j)*tc(j) &
462 + sb(10)*bm_s*bm_s*bm_s
463 second = (m2/a_)**(1./b_)
468 loga_ = sa(1) + sa(2)*tc(j) + sa(3)*cse(1) &
469 + sa(4)*tc(j)*cse(1) + sa(5)*tc(j)*tc(j) &
470 + sa(6)*cse(1)*cse(1) + sa(7)*tc(j)*tc(j)*cse(1) &
471 + sa(8)*tc(j)*cse(1)*cse(1) + sa(9)*tc(j)*tc(j)*tc(j) &
472 + sa(10)*cse(1)*cse(1)*cse(1)
474 b_ = sb(1)+sb(2)*tc(j)+sb(3)*cse(1) + sb(4)*tc(j)*cse(1) &
475 + sb(5)*tc(j)*tc(j) + sb(6)*cse(1)*cse(1) &
476 + sb(7)*tc(j)*tc(j)*cse(1) + sb(8)*tc(j)*cse(1)*cse(1) &
477 + sb(9)*tc(j)*tc(j)*tc(j)+sb(10)*cse(1)*cse(1)*cse(1)
481 mrat = m2*(m2*om3)*(m2*om3)*(m2*om3)
483 slam1 = m2 * om3 * lam0
484 slam2 = m2 * om3 * lam1
487 n_s(n) = mrat*(kap0*dexp(-slam1*ds(n)) &
488 + kap1*m0*ds(n)**mu_s * dexp(-slam2*ds(n)))*dts(n)
504 massr = am_r * dr(n2)**bm_r
506 masss = am_s * ds(n)**bm_s
508 dvs = 0.5d0*((vr(n2) - vs(n)) + dabs(vr(n2)-vs(n)))
509 dvr = 0.5d0*((vs(n) - vr(n2)) + dabs(vs(n)-vr(n2)))
510 if (massr .gt. 1.5*masss)
then
511 t1 = t1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
512 *dvs*masss * n_s(n)* n_r(n2)
513 z1 = z1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
514 *dvs*massr * n_s(n)* n_r(n2)
515 y1 = y1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
516 *dvs * n_s(n)* n_r(n2)
518 t3 = t3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
519 *dvs*masss * n_s(n)* n_r(n2)
520 z3 = z3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
521 *dvs*massr * n_s(n)* n_r(n2)
522 y3 = y3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
523 *dvs * n_s(n)* n_r(n2)
526 if (massr .gt. 1.5*masss)
then
527 t2 = t2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
528 *dvr*massr * n_s(n)* n_r(n2)
529 y2 = y2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
530 *dvr * n_s(n)* n_r(n2)
531 z2 = z2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
532 *dvr*masss * n_s(n)* n_r(n2)
534 t4 = t4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
535 *dvr*massr * n_s(n)* n_r(n2)
536 y4 = y4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
537 *dvr * n_s(n)* n_r(n2)
538 z4 = z4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
539 *dvr*masss * n_s(n)* n_r(n2)
544 tcs_racs1(i,j,k,m) = t1
545 tmr_racs1(i,j,k,m) = dmin1(z1, r_r(m)*1.0d0)
546 tcs_racs2(i,j,k,m) = t3
547 tmr_racs2(i,j,k,m) = z3
548 tcr_sacr1(i,j,k,m) = t2
549 tms_sacr1(i,j,k,m) = z2
550 tcr_sacr2(i,j,k,m) = t4
551 tms_sacr2(i,j,k,m) = z4
552 tnr_racs1(i,j,k,m) = y1
553 tnr_racs2(i,j,k,m) = y3
554 tnr_sacr1(i,j,k,m) = y2
555 tnr_sacr2(i,j,k,m) = y4
571 INTEGER:: i, j, k, m, n, n2
572 DOUBLE PRECISION :: N_r, N_c
573 DOUBLE PRECISION,
DIMENSION(nbr):: massr
574 DOUBLE PRECISION,
DIMENSION(nbc):: massc
575 DOUBLE PRECISION:: sum1, sum2, sumn1, sumn2, &
576 prob, vol, Texp, orho_w, &
577 lam_exp, lamr, N0_r, lamc, N0_c, y
584 massr(n2) = am_r*dr(n2)**bm_r
587 massc(n) = am_r*dc(n)**bm_r
592 t_adjust = max(-3.0, min(3.0 - alog10(nt_in(m)), 3.0))
595 texp = dexp( real(k,kind=dp) - t_adjust*1.0d0 ) - 1.0d0
598 lam_exp = (n0r_exp(j)*am_r*crg(1)/r_r(i))**ore1
599 lamr = lam_exp * (crg(3)*org2*org1)**obmr
600 n0_r = n0r_exp(j)/(crg(2)*lam_exp) * lamr**cre(2)
606 n_r = n0_r*dr(n2)**mu_r*dexp(-lamr*dr(n2))*dtr(n2)
607 vol = massr(n2)*orho_w
608 prob = max(0.0d0, 1.0d0 - dexp(-120.0d0*vol*5.2d-4 * texp))
609 if (massr(n2) .lt. xm0g)
then
610 sumn1 = sumn1 + prob*n_r
611 sum1 = sum1 + prob*n_r*massr(n2)
613 sumn2 = sumn2 + prob*n_r
614 sum2 = sum2 + prob*n_r*massr(n2)
616 if ((sum1+sum2).ge.r_r(i))
EXIT
618 tpi_qrfz(i,j,k,m) = sum1
619 tni_qrfz(i,j,k,m) = sumn1
620 tpg_qrfz(i,j,k,m) = sum2
621 tnr_qrfz(i,j,k,m) = sumn2
626 nu_c = min(15, nint(1000.e6/t_nc(j)) + 2)
628 lamc = (t_nc(j)*am_r* ccg(2,nu_c) * ocg1(nu_c) / r_c(i))**obmr
629 n0_c = t_nc(j)*ocg1(nu_c) * lamc**cce(1,nu_c)
633 vol = massc(n)*orho_w
634 prob = max(0.0d0, 1.0d0 - dexp(-120.0d0*vol*5.2d-4 * texp))
635 n_c = n0_c*dc(n)**nu_c*exp(-lamc*dc(n))*dtc(n)
636 sumn2 = min(t_nc(j), sumn2 + prob*n_c)
637 sum1 = sum1 + prob*n_c*massc(n)
638 if (sum1 .ge. r_c(i))
EXIT
640 tpi_qcfz(i,j,k,m) = sum1
641 tni_qcfz(i,j,k,m) = sumn2
764 subroutine qr_acr_qg_par(NRHGtable, qrqg_file)
768 INTEGER,
INTENT(IN) ::NRHGtable
771 INTEGER:: i, j, k, m, n, n2, n3, idx_bg
772 INTEGER:: km, km_s, km_e
773 DOUBLE PRECISION,
DIMENSION(nbg):: N_g
774 DOUBLE PRECISION,
DIMENSION(nbg,NRHGtable):: vg
775 DOUBLE PRECISION,
DIMENSION(nbr):: vr, N_r
776 DOUBLE PRECISION:: N0_r, N0_g, lam_exp, lamg, lamr
777 DOUBLE PRECISION:: massg, massr, dvg, dvr, t1, t2, z1, z2, y1, y2
778 LOGICAL force_read_thompson, write_thompson_tables
781 character(len=*),
intent(in) :: qrqg_file
783 force_read_thompson = .false.
784 write_thompson_tables = .false.
788 INQUIRE(file=qrqg_file, exist=lexist)
790 call mpi_barrier(mpi_communicator,ierr)
793 OPEN(63,file=qrqg_file,form=
"unformatted",err=1234)
795 READ(63,err=1234) tcg_racg
796 READ(63,err=1234) tmr_racg
797 READ(63,err=1234) tcr_gacr
799 READ(63,err=1234) tnr_racg
800 READ(63,err=1234) tnr_gacr
804 IF ( good .NE. 1 )
THEN
805 INQUIRE(63,opened=lopen)
807 IF( force_read_thompson )
THEN
808 write(0,*)
"Error reading "//qrqg_file//
" Aborting because force_read_thompson is .true."
813 IF( force_read_thompson )
THEN
814 write(0,*)
"Error opening "//qrqg_file//
" Aborting because force_read_thompson is .true."
819 INQUIRE(63,opened=lopen)
825 IF( force_read_thompson )
THEN
826 write(0,*)
"Non-existent "//qrqg_file//
" Aborting because force_read_thompson is .true."
831 IF (.NOT. good .EQ. 1 )
THEN
832 if (thompson_table_writer)
then
833 write_thompson_tables = .true.
834 write(0,*)
"ThompMP: computing qr_acr_qg"
838 vr(n2) = -0.1021 + 4.932e3*dr(n2) - 0.9551e6*dr(n2)*dr(n2) &
839 + 0.07934e9*dr(n2)*dr(n2)*dr(n2) &
840 - 0.002362e12*dr(n2)*dr(n2)*dr(n2)*dr(n2)
848 if (nrhgtable == nrhg) idx_bg = n3
849 if (nrhgtable == nrhg1) idx_bg = idx_bg1
850 vg(n,n3) = av_g(idx_bg)*dg(n)**bv_g(idx_bg)
857#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
858 CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
861 km_e = ntb_r*ntb_r1 - 1
866 k = mod( km , ntb_r1 ) + 1
868 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
869 lamr = lam_exp * (crg(3)*org2*org1)**obmr
870 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
872 n_r(n2) = n0_r*dr(n2)**mu_r *dexp(-lamr*dr(n2))*dtr(n2)
876 if (nrhgtable == nrhg) idx_bg = n3
877 if (nrhgtable == nrhg1) idx_bg = idx_bg1
881 lam_exp = (n0g_exp(i)*am_g(idx_bg)*cgg(1,1)/r_g(j))**oge1
882 lamg = lam_exp * (cgg(3,1)*ogg2*ogg1)**obmg
883 n0_g = n0g_exp(i)/(cgg(2,1)*lam_exp) * lamg**cge(2,1)
885 n_g(n) = n0_g*dg(n)**mu_g * dexp(-lamg*dg(n))*dtg(n)
895 massr = am_r * dr(n2)**bm_r
897 massg = am_g(idx_bg) * dg(n)**bm_g
899 dvg = 0.5d0*((vr(n2) - vg(n,n3)) + dabs(vr(n2)-vg(n,n3)))
900 dvr = 0.5d0*((vg(n,n3) - vr(n2)) + dabs(vg(n,n3)-vr(n2)))
902 t1 = t1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
903 *dvg*massg * n_g(n)* n_r(n2)
904 z1 = z1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
905 *dvg*massr * n_g(n)* n_r(n2)
906 y1 = y1+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
907 *dvg * n_g(n)* n_r(n2)
909 t2 = t2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
910 *dvr*massr * n_g(n)* n_r(n2)
911 y2 = y2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
912 *dvr * n_g(n)* n_r(n2)
913 z2 = z2+ pi*.25*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
914 *dvr*massg * n_g(n)* n_r(n2)
918 tcg_racg(i,j,n3,k,m) = t1
919 tmr_racg(i,j,n3,k,m) = dmin1(z1, r_r(m)*1.0d0)
920 tcr_gacr(i,j,n3,k,m) = t2
922 tnr_racg(i,j,n3,k,m) = y1
923 tnr_gacr(i,j,n3,k,m) = y2
928 IF ( write_thompson_tables )
THEN
929 write(0,*)
"Writing "//qrqg_file//
" in Tempo MP init"
930 OPEN(63,file=qrqg_file,form=
"unformatted",err=9234)
931 WRITE(63,err=9234) tcg_racg
932 WRITE(63,err=9234) tmr_racg
933 WRITE(63,err=9234) tcr_gacr
934 WRITE(63,err=9234) tnr_racg
935 WRITE(63,err=9234) tnr_gacr
939 write(0,*)
"Error writing "//qrqg_file
949 subroutine qr_acr_qs_par
954 INTEGER:: i, j, k, m, n, n2
955 INTEGER:: km, km_s, km_e
956 DOUBLE PRECISION,
DIMENSION(nbr):: vr, D1, N_r
957 DOUBLE PRECISION,
DIMENSION(nbs):: vs, N_s
958 DOUBLE PRECISION:: loga_, a_, b_, second, M0, M2, M3, Mrat, oM3
959 DOUBLE PRECISION:: N0_r, lam_exp, lamr, slam1, slam2
960 DOUBLE PRECISION:: dvs, dvr, masss, massr
961 DOUBLE PRECISION:: t1, t2, t3, t4, z1, z2, z3, z4
962 DOUBLE PRECISION:: y1, y2, y3, y4
963 LOGICAL force_read_thompson, write_thompson_tables
969 force_read_thompson = .false.
970 write_thompson_tables = .false.
973 INQUIRE(file=qr_acr_qs_file, exist=lexist)
975 call mpi_barrier(mpi_communicator,ierr)
979 OPEN(63,file=qr_acr_qs_file,form=
"unformatted",err=1234)
981 READ(63,err=1234)tcs_racs1
982 READ(63,err=1234)tmr_racs1
983 READ(63,err=1234)tcs_racs2
984 READ(63,err=1234)tmr_racs2
985 READ(63,err=1234)tcr_sacr1
986 READ(63,err=1234)tms_sacr1
987 READ(63,err=1234)tcr_sacr2
988 READ(63,err=1234)tms_sacr2
989 READ(63,err=1234)tnr_racs1
990 READ(63,err=1234)tnr_racs2
991 READ(63,err=1234)tnr_sacr1
992 READ(63,err=1234)tnr_sacr2
996 IF ( good .NE. 1 )
THEN
997 INQUIRE(63,opened=lopen)
999 IF( force_read_thompson )
THEN
1000 write(0,*)
"Error reading "//qr_acr_qs_file//
" Aborting because force_read_thompson is .true."
1005 IF( force_read_thompson )
THEN
1006 write(0,*)
"Error opening "//qr_acr_qs_file//
" Aborting because force_read_thompson is .true."
1011 INQUIRE(63,opened=lopen)
1017 IF( force_read_thompson )
THEN
1018 write(0,*)
"Non-existent "//qr_acr_qs_file//
" Aborting because force_read_thompson is .true."
1023 IF (.NOT. good .EQ. 1 )
THEN
1024 if (thompson_table_writer)
then
1025 write_thompson_tables = .true.
1026 write(0,*)
"ThompMP: computing qr_acr_qs"
1030 vr(n2) = -0.1021 + 4.932e3*dr(n2) - 0.9551e6*dr(n2)*dr(n2) &
1031 + 0.07934e9*dr(n2)*dr(n2)*dr(n2) &
1032 - 0.002362e12*dr(n2)*dr(n2)*dr(n2)*dr(n2)
1033 d1(n2) = (vr(n2)/av_s)**(1./bv_s)
1036 vs(n) = 1.5*av_s*ds(n)**bv_s * dexp(-fv_s*ds(n))
1042#if ( defined( DM_PARALLEL ) && ( ! defined( STUBMPI ) ) )
1043 CALL wrf_dm_decomp1d ( ntb_r*ntb_r1, km_s, km_e )
1046 km_e = ntb_r*ntb_r1 - 1
1051 k = mod( km , ntb_r1 ) + 1
1053 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
1054 lamr = lam_exp * (crg(3)*org2*org1)**obmr
1055 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
1057 n_r(n2) = n0_r*dr(n2)**mu_r * dexp(-lamr*dr(n2))*dtr(n2)
1067 m2 = r_s(i)*oams *1.0d0
1068 if (bm_s.gt.2.0-1.e-3 .and. bm_s.lt.2.0+1.e-3)
then
1069 loga_ = sa(1) + sa(2)*tc(j) + sa(3)*bm_s &
1070 + sa(4)*tc(j)*bm_s + sa(5)*tc(j)*tc(j) &
1071 + sa(6)*bm_s*bm_s + sa(7)*tc(j)*tc(j)*bm_s &
1072 + sa(8)*tc(j)*bm_s*bm_s + sa(9)*tc(j)*tc(j)*tc(j) &
1073 + sa(10)*bm_s*bm_s*bm_s
1075 b_ = sb(1) + sb(2)*tc(j) + sb(3)*bm_s &
1076 + sb(4)*tc(j)*bm_s + sb(5)*tc(j)*tc(j) &
1077 + sb(6)*bm_s*bm_s + sb(7)*tc(j)*tc(j)*bm_s &
1078 + sb(8)*tc(j)*bm_s*bm_s + sb(9)*tc(j)*tc(j)*tc(j) &
1079 + sb(10)*bm_s*bm_s*bm_s
1080 second = (m2/a_)**(1./b_)
1085 loga_ = sa(1) + sa(2)*tc(j) + sa(3)*cse(1) &
1086 + sa(4)*tc(j)*cse(1) + sa(5)*tc(j)*tc(j) &
1087 + sa(6)*cse(1)*cse(1) + sa(7)*tc(j)*tc(j)*cse(1) &
1088 + sa(8)*tc(j)*cse(1)*cse(1) + sa(9)*tc(j)*tc(j)*tc(j) &
1089 + sa(10)*cse(1)*cse(1)*cse(1)
1091 b_ = sb(1)+sb(2)*tc(j)+sb(3)*cse(1) + sb(4)*tc(j)*cse(1) &
1092 + sb(5)*tc(j)*tc(j) + sb(6)*cse(1)*cse(1) &
1093 + sb(7)*tc(j)*tc(j)*cse(1) + sb(8)*tc(j)*cse(1)*cse(1) &
1094 + sb(9)*tc(j)*tc(j)*tc(j)+sb(10)*cse(1)*cse(1)*cse(1)
1095 m3 = a_ * second**b_
1098 mrat = m2*(m2*om3)*(m2*om3)*(m2*om3)
1100 slam1 = m2 * om3 * lam0
1101 slam2 = m2 * om3 * lam1
1104 n_s(n) = mrat*(kap0*dexp(-slam1*ds(n)) &
1105 + kap1*m0*ds(n)**mu_s * dexp(-slam2*ds(n)))*dts(n)
1121 massr = am_r * dr(n2)**bm_r
1123 masss = am_s * ds(n)**bm_s
1125 dvs = 0.5d0*((vr(n2) - vs(n)) + dabs(vr(n2)-vs(n)))
1126 dvr = 0.5d0*((vs(n) - vr(n2)) + dabs(vs(n)-vr(n2)))
1128 if (massr .gt. 1.5*masss)
then
1129 t1 = t1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1130 *dvs*masss * n_s(n)* n_r(n2)
1131 z1 = z1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1132 *dvs*massr * n_s(n)* n_r(n2)
1133 y1 = y1+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1134 *dvs * n_s(n)* n_r(n2)
1136 t3 = t3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1137 *dvs*masss * n_s(n)* n_r(n2)
1138 z3 = z3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1139 *dvs*massr * n_s(n)* n_r(n2)
1140 y3 = y3+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1141 *dvs * n_s(n)* n_r(n2)
1144 if (massr .gt. 1.5*masss)
then
1145 t2 = t2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1146 *dvr*massr * n_s(n)* n_r(n2)
1147 y2 = y2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1148 *dvr * n_s(n)* n_r(n2)
1149 z2 = z2+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1150 *dvr*masss * n_s(n)* n_r(n2)
1152 t4 = t4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1153 *dvr*massr * n_s(n)* n_r(n2)
1154 y4 = y4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1155 *dvr * n_s(n)* n_r(n2)
1156 z4 = z4+ pi*.25*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
1157 *dvr*masss * n_s(n)* n_r(n2)
1162 tcs_racs1(i,j,k,m) = t1
1163 tmr_racs1(i,j,k,m) = dmin1(z1, r_r(m)*1.0d0)
1164 tcs_racs2(i,j,k,m) = t3
1165 tmr_racs2(i,j,k,m) = z3
1166 tcr_sacr1(i,j,k,m) = t2
1167 tms_sacr1(i,j,k,m) = z2
1168 tcr_sacr2(i,j,k,m) = t4
1169 tms_sacr2(i,j,k,m) = z4
1170 tnr_racs1(i,j,k,m) = y1
1171 tnr_racs2(i,j,k,m) = y3
1172 tnr_sacr1(i,j,k,m) = y2
1173 tnr_sacr2(i,j,k,m) = y4
1178 IF ( write_thompson_tables )
THEN
1179 write(0,*)
"Writing "//qr_acr_qs_file//
" in Tempo MP init"
1180 OPEN(63,file=qr_acr_qs_file,form=
"unformatted",err=9234)
1181 WRITE(63,err=9234)tcs_racs1
1182 WRITE(63,err=9234)tmr_racs1
1183 WRITE(63,err=9234)tcs_racs2
1184 WRITE(63,err=9234)tmr_racs2
1185 WRITE(63,err=9234)tcr_sacr1
1186 WRITE(63,err=9234)tms_sacr1
1187 WRITE(63,err=9234)tcr_sacr2
1188 WRITE(63,err=9234)tms_sacr2
1189 WRITE(63,err=9234)tnr_racs1
1190 WRITE(63,err=9234)tnr_racs2
1191 WRITE(63,err=9234)tnr_sacr1
1192 WRITE(63,err=9234)tnr_sacr2
1196 write(0,*)
"Error writing "//qr_acr_qs_file
1207 subroutine freezeh2o_par(threads)
1212 INTEGER,
INTENT(IN):: threads
1215 INTEGER:: i, j, k, m, n, n2
1216 DOUBLE PRECISION:: N_r, N_c
1217 DOUBLE PRECISION,
DIMENSION(nbr):: massr
1218 DOUBLE PRECISION,
DIMENSION(nbc):: massc
1219 DOUBLE PRECISION:: sum1, sum2, sumn1, sumn2, &
1220 prob, vol, Texp, orho_w, &
1221 lam_exp, lamr, N0_r, lamc, N0_c, y
1224 LOGICAL force_read_thompson, write_thompson_tables
1225 LOGICAL lexist,lopen
1229 force_read_thompson = .false.
1230 write_thompson_tables = .false.
1233 INQUIRE(file=freeze_h2o_file,exist=lexist)
1235 call mpi_barrier(mpi_communicator,ierr)
1239 OPEN(63,file=freeze_h2o_file,form=
"unformatted",err=1234)
1241 READ(63,err=1234)tpi_qrfz
1242 READ(63,err=1234)tni_qrfz
1243 READ(63,err=1234)tpg_qrfz
1244 READ(63,err=1234)tnr_qrfz
1245 READ(63,err=1234)tpi_qcfz
1246 READ(63,err=1234)tni_qcfz
1250 IF ( good .NE. 1 )
THEN
1251 INQUIRE(63,opened=lopen)
1253 IF( force_read_thompson )
THEN
1254 write(0,*)
"Error reading "//freeze_h2o_file//
" Aborting because force_read_thompson is .true."
1259 IF( force_read_thompson )
THEN
1260 write(0,*)
"Error opening "//freeze_h2o_file//
" Aborting because force_read_thompson is .true."
1265 INQUIRE(63,opened=lopen)
1271 IF( force_read_thompson )
THEN
1272 write(0,*)
"Non-existent "//freeze_h2o_file//
" Aborting because force_read_thompson is .true."
1277 IF (.NOT. good .EQ. 1 )
THEN
1278 if (thompson_table_writer)
then
1279 write_thompson_tables = .true.
1280 write(0,*)
"ThompMP: computing freezeH2O"
1286 massr(n2) = am_r*dr(n2)**bm_r
1289 massc(n) = am_r*dc(n)**bm_r
1294 t_adjust = max(-3.0, min(3.0 - alog10(nt_in(m)), 3.0))
1297 texp = dexp( dfloat(k) - t_adjust*1.0d0 ) - 1.0d0
1302 lam_exp = (n0r_exp(j)*am_r*crg(1)/r_r(i))**ore1
1303 lamr = lam_exp * (crg(3)*org2*org1)**obmr
1304 n0_r = n0r_exp(j)/(crg(2)*lam_exp) * lamr**cre(2)
1310 n_r = n0_r*dr(n2)**mu_r*dexp(-lamr*dr(n2))*dtr(n2)
1311 vol = massr(n2)*orho_w
1312 prob = max(0.0d0, 1.0d0 - dexp(-120.0d0*vol*5.2d-4 * texp))
1313 if (massr(n2) .lt. xm0g)
then
1314 sumn1 = sumn1 + prob*n_r
1315 sum1 = sum1 + prob*n_r*massr(n2)
1317 sumn2 = sumn2 + prob*n_r
1318 sum2 = sum2 + prob*n_r*massr(n2)
1320 if ((sum1+sum2).ge.r_r(i))
EXIT
1322 tpi_qrfz(i,j,k,m) = sum1
1323 tni_qrfz(i,j,k,m) = sumn1
1324 tpg_qrfz(i,j,k,m) = sum2
1325 tnr_qrfz(i,j,k,m) = sumn2
1333 nu_c = min(15, nint(1000.e6/t_nc(j)) + 2)
1335 lamc = (t_nc(j)*am_r* ccg(2,nu_c) * ocg1(nu_c) / r_c(i))**obmr
1336 n0_c = t_nc(j)*ocg1(nu_c) * lamc**cce(1,nu_c)
1340 vol = massc(n)*orho_w
1341 prob = max(0.0d0, 1.0d0 - dexp(-120.0d0*vol*5.2d-4 * texp))
1342 n_c = n0_c*dc(n)**nu_c*exp(-lamc*dc(n))*dtc(n)
1343 sumn2 = min(t_nc(j), sumn2 + prob*n_c)
1344 sum1 = sum1 + prob*n_c*massc(n)
1345 if (sum1 .ge. r_c(i))
EXIT
1347 tpi_qcfz(i,j,k,m) = sum1
1348 tni_qcfz(i,j,k,m) = sumn2
1355 IF ( write_thompson_tables )
THEN
1356 write(0,*)
"Writing "//freeze_h2o_file//
" in Tempo MP init"
1357 OPEN(63,file=freeze_h2o_file,form=
"unformatted",err=9234)
1358 WRITE(63,err=9234)tpi_qrfz
1359 WRITE(63,err=9234)tni_qrfz
1360 WRITE(63,err=9234)tpg_qrfz
1361 WRITE(63,err=9234)tnr_qrfz
1362 WRITE(63,err=9234)tpi_qcfz
1363 WRITE(63,err=9234)tni_qcfz
1367 write(0,*)
"Error writing "//freeze_h2o_file
1384 subroutine calc_effectrad (t1d, p1d, qv1d, qc1d, nc1d, qi1d, ni1d, qs1d, &
1385 & re_qc1d, re_qi1d, re_qs1d, kts, kte, lsml, configs)
1390 INTEGER,
INTENT(IN):: kts, kte
1391 REAL,
DIMENSION(kts:kte),
INTENT(IN):: &
1392 & t1d, p1d, qv1d, qc1d, nc1d, qi1d, ni1d, qs1d
1393 REAL,
DIMENSION(kts:kte),
INTENT(INOUT):: re_qc1d, re_qi1d, re_qs1d
1394 type(ty_tempo_cfg),
intent(in) :: configs
1395 integer,
intent(in),
optional :: lsml
1399 REAL,
DIMENSION(kts:kte):: rho, rc, nc, ri, ni, rs
1400 REAL:: smo2, smob, smoc
1401 REAL:: tc0, loga_, a_, b_
1402 DOUBLE PRECISION:: lamc, lami
1403 LOGICAL:: has_qc, has_qi, has_qs
1405 real,
dimension(15),
parameter:: g_ratio = (/24,60,120,210,336, &
1406 & 504,720,990,1320,1716,2184,2730,3360,4080,4896/)
1417 rho(k) = 0.622*p1d(k)/(r*t1d(k)*(qv1d(k)+0.622))
1418 rc(k) = max(r1, qc1d(k)*rho(k))
1419 nc(k) = max(2., min(nc1d(k)*rho(k), nt_c_max))
1420 if (.not. (configs%aerosol_aware .or. merra2_aerosol_aware))
then
1422 if (
present(lsml))
then
1430 if (rc(k).gt.r1 .and. nc(k).gt.r2) has_qc = .true.
1431 ri(k) = max(r1, qi1d(k)*rho(k))
1432 ni(k) = max(r2, ni1d(k)*rho(k))
1433 if (ri(k).gt.r1 .and. ni(k).gt.r2) has_qi = .true.
1434 rs(k) = max(r1, qs1d(k)*rho(k))
1435 if (rs(k).gt.r1) has_qs = .true.
1440 if (rc(k).le.r1 .or. nc(k).le.r2) cycle
1441 if (nc(k).lt.100)
then
1443 elseif (nc(k).gt.1.e10)
then
1446 inu_c = min(15, nint(1000.e6/nc(k)) + 2)
1448 lamc = (nc(k)*am_r*g_ratio(inu_c)/rc(k))**obmr
1449 re_qc1d(k) = max(2.51e-6, min(sngl(0.5d0 * dble(3.+inu_c)/lamc), 50.e-6))
1455 if (ri(k).le.r1 .or. ni(k).le.r2) cycle
1456 lami = (am_i*cig(2)*oig1*ni(k)/ri(k))**obmi
1457 re_qi1d(k) = max(2.51e-6, min(sngl(0.5d0 * dble(3.+mu_i)/lami), 125.e-6))
1463 if (rs(k).le.r1) cycle
1464 tc0 = min(-0.1, t1d(k)-273.15)
1469 if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3))
then
1472 loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
1473 & + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
1474 & + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
1475 & + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
1476 & + sa(10)*bm_s*bm_s*bm_s
1478 b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
1479 & + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
1480 & + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
1481 & + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
1482 & + sb(10)*bm_s*bm_s*bm_s
1483 smo2 = (smob/a_)**(1./b_)
1486 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
1487 & + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
1488 & + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
1489 & + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
1490 & + sa(10)*cse(1)*cse(1)*cse(1)
1492 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
1493 & + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
1494 & + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
1495 & + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
1496 smoc = a_ * smo2**b_
1497 re_qs1d(k) = max(5.01e-6, min(0.5*(smoc/smob), 999.e-6))
1511 subroutine calc_refl10cm (qv1d, qc1d, qr1d, nr1d, qs1d, qg1d, ng1d, qb1d, &
1512 t1d, p1d, dBZ, kts, kte, ii, jj, configs, rand1, melti, &
1513 vt_dBZ, first_time_step)
1518 INTEGER,
INTENT(IN):: kts, kte, ii, jj
1519 REAL,
OPTIONAL,
INTENT(IN):: rand1
1520 REAL,
DIMENSION(kts:kte),
INTENT(IN):: &
1521 qv1d, qc1d, qr1d, nr1d, qs1d, qg1d, ng1d, qb1d, t1d, p1d
1522 REAL,
DIMENSION(kts:kte),
INTENT(INOUT):: dBZ
1523 REAL,
DIMENSION(kts:kte),
OPTIONAL,
INTENT(INOUT):: vt_dBZ
1524 LOGICAL,
OPTIONAL,
INTENT(IN) :: first_time_step
1526 type(ty_tempo_cfg),
intent(in) :: configs
1529 LOGICAL :: do_vt_dBZ
1530 LOGICAL :: allow_wet_graupel
1531 LOGICAL :: allow_wet_snow
1532 REAL,
DIMENSION(kts:kte):: temp, pres, qv, rho, rhof
1533 REAL,
DIMENSION(kts:kte):: rc, rr, nr, rs, rg, ng, rb
1534 INTEGER,
DIMENSION(kts:kte):: idx_bg
1536 DOUBLE PRECISION,
DIMENSION(kts:kte):: ilamr, ilamg, N0_r, N0_g
1537 REAL,
DIMENSION(kts:kte):: mvd_r
1538 REAL,
DIMENSION(kts:kte):: smob, smo2, smoc, smoz
1539 REAL:: oM3, M0, Mrat, slam1, slam2, xDs
1540 REAL:: ils1, ils2, t1_vts, t2_vts, t3_vts, t4_vts
1541 REAL:: vtr_dbz_wt, vts_dbz_wt, vtg_dbz_wt
1543 REAL,
DIMENSION(kts:kte):: ze_rain, ze_snow, ze_graupel
1545 DOUBLE PRECISION:: N0_exp, N0_min, lam_exp, lamr, lamg
1546 REAL:: a_, b_, loga_, tc0, SR
1547 DOUBLE PRECISION:: fmelt_s, fmelt_g
1549 INTEGER:: i, k, k_0, kbot, n
1550 LOGICAL,
OPTIONAL,
INTENT(IN):: melti
1551 LOGICAL,
DIMENSION(kts:kte):: L_qr, L_qs, L_qg
1553 DOUBLE PRECISION:: cback, x, eta, f_d
1554 REAL:: xslw1, ygra1, zans1
1557 if (
present(vt_dbz) .and.
present(first_time_step))
then
1559 if (first_time_step)
then
1561 allow_wet_snow = .false.
1563 allow_wet_snow = .true.
1565 allow_wet_graupel = .false.
1568 allow_wet_snow = .true.
1569 allow_wet_graupel = .false.
1581 qv(k) = max(1.e-10, qv1d(k))
1583 rho(k) = 0.622*pres(k)/(r*temp(k)*(qv(k)+0.622))
1584 rhof(k) = sqrt(rho_not/rho(k))
1585 rc(k) = max(r1, qc1d(k)*rho(k))
1586 if (qr1d(k) .gt. r1)
then
1587 rr(k) = qr1d(k)*rho(k)
1588 nr(k) = max(r2, nr1d(k)*rho(k))
1589 lamr = (am_r*crg(3)*org2*nr(k)/rr(k))**obmr
1591 n0_r(k) = nr(k)*org2*lamr**cre(2)
1592 mvd_r(k) = (3.0 + mu_r + 0.672) * ilamr(k)
1600 if (qs1d(k) .gt. r2)
then
1601 rs(k) = qs1d(k)*rho(k)
1607 if (qg1d(k) .gt. r2)
then
1608 rg(k) = qg1d(k)*rho(k)
1609 ng(k) = max(r2, ng1d(k)*rho(k))
1610 rb(k) = max(qg1d(k)/rho_g(nrhg), qb1d(k))
1611 rb(k) = min(qg1d(k)/rho_g(1), rb(k))
1612 idx_bg(k) = max(1,min(nint(qg1d(k)/rb(k) *0.01)+1,nrhg))
1613 if (.not. configs%hail_aware) idx_bg(k) = idx_bg1
1632 if (any(l_qs .eqv. .true.))
then
1634 if (.not. l_qs(k)) cycle
1635 tc0 = min(-0.1, temp(k)-273.15)
1636 smob(k) = rs(k)*oams
1640 if (bm_s.gt.(2.0-1.e-3) .and. bm_s.lt.(2.0+1.e-3))
then
1643 loga_ = sa(1) + sa(2)*tc0 + sa(3)*bm_s &
1644 & + sa(4)*tc0*bm_s + sa(5)*tc0*tc0 &
1645 & + sa(6)*bm_s*bm_s + sa(7)*tc0*tc0*bm_s &
1646 & + sa(8)*tc0*bm_s*bm_s + sa(9)*tc0*tc0*tc0 &
1647 & + sa(10)*bm_s*bm_s*bm_s
1649 b_ = sb(1) + sb(2)*tc0 + sb(3)*bm_s &
1650 & + sb(4)*tc0*bm_s + sb(5)*tc0*tc0 &
1651 & + sb(6)*bm_s*bm_s + sb(7)*tc0*tc0*bm_s &
1652 & + sb(8)*tc0*bm_s*bm_s + sb(9)*tc0*tc0*tc0 &
1653 & + sb(10)*bm_s*bm_s*bm_s
1654 smo2(k) = (smob(k)/a_)**(1./b_)
1658 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(1) &
1659 & + sa(4)*tc0*cse(1) + sa(5)*tc0*tc0 &
1660 & + sa(6)*cse(1)*cse(1) + sa(7)*tc0*tc0*cse(1) &
1661 & + sa(8)*tc0*cse(1)*cse(1) + sa(9)*tc0*tc0*tc0 &
1662 & + sa(10)*cse(1)*cse(1)*cse(1)
1664 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(1) + sb(4)*tc0*cse(1) &
1665 & + sb(5)*tc0*tc0 + sb(6)*cse(1)*cse(1) &
1666 & + sb(7)*tc0*tc0*cse(1) + sb(8)*tc0*cse(1)*cse(1) &
1667 & + sb(9)*tc0*tc0*tc0 + sb(10)*cse(1)*cse(1)*cse(1)
1668 smoc(k) = a_ * smo2(k)**b_
1671 loga_ = sa(1) + sa(2)*tc0 + sa(3)*cse(3) &
1672 & + sa(4)*tc0*cse(3) + sa(5)*tc0*tc0 &
1673 & + sa(6)*cse(3)*cse(3) + sa(7)*tc0*tc0*cse(3) &
1674 & + sa(8)*tc0*cse(3)*cse(3) + sa(9)*tc0*tc0*tc0 &
1675 & + sa(10)*cse(3)*cse(3)*cse(3)
1677 b_ = sb(1)+ sb(2)*tc0 + sb(3)*cse(3) + sb(4)*tc0*cse(3) &
1678 & + sb(5)*tc0*tc0 + sb(6)*cse(3)*cse(3) &
1679 & + sb(7)*tc0*tc0*cse(3) + sb(8)*tc0*cse(3)*cse(3) &
1680 & + sb(9)*tc0*tc0*tc0 + sb(10)*cse(3)*cse(3)*cse(3)
1681 smoz(k) = a_ * smo2(k)**b_
1688 if (any(l_qg .eqv. .true.))
then
1690 lamg = (am_g(idx_bg(k))*cgg(3,1)*ogg2*ng(k)/rg(k))**obmg
1692 n0_g(k) = ng(k)*ogg2*lamg**cge(2,1)
1703 if (
present(melti))
then
1705 k_loop:
do k = kte-1, kts, -1
1706 if ((temp(k).gt.273.15) .and. l_qr(k) &
1707 & .and. (l_qs(k+1).or.l_qg(k+1)) )
then
1723 ze_graupel(k) = 1.e-22
1724 if (l_qr(k)) ze_rain(k) = n0_r(k)*crg(4)*ilamr(k)**cre(4)
1725 if (l_qs(k)) ze_snow(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
1726 & * (am_s/900.0)*(am_s/900.0)*smoz(k)
1727 if (l_qg(k)) ze_graupel(k) = (0.176/0.93) * (6.0/pi)*(6.0/pi) &
1728 & * (am_g(idx_bg(k))/900.0)*(am_g(idx_bg(k))/900.0) &
1729 & * n0_g(k)*cgg(4,1)*ilamg(k)**cge(4,1)
1739 if (
present(melti))
then
1740 if (.not. iiwarm .and. melti .and. k_0.ge.2)
then
1741 do k = k_0-1, kts, -1
1744 if (allow_wet_snow .and. l_qs(k) .and. l_qs(k_0) )
then
1745 sr = max(0.01, min(1.0 - rs(k)/(rs(k) + rr(k)), 0.99))
1746 fmelt_s = dble(sr*sr)
1750 mrat = smob(k)*m0*m0*m0
1754 x = am_s * xxds(n)**bm_s
1755 call rayleigh_soak_wetgraupel (x, dble(ocms), dble(obms), &
1756 & fmelt_s, melt_outside_s, m_w_0, m_i_0, lamda_radar, &
1757 & cback, mixingrulestring_s, matrixstring_s, &
1758 & inclusionstring_s, hoststring_s, &
1759 & hostmatrixstring_s, hostinclusionstring_s)
1760 f_d = mrat*(kap0*dexp(-slam1*xxds(n)) &
1761 & + kap1*(m0*xxds(n))**mu_s * dexp(-slam2*xxds(n)))
1762 eta = eta + f_d * cback * simpson(n) * xdts(n)
1764 ze_snow(k) = sngl(lamda4 / (pi5 * k_w) * eta)
1768 if (allow_wet_graupel .and. l_qg(k) .and. l_qg(k_0) )
then
1769 sr = max(0.01, min(1.0 - rg(k)/(rg(k) + rr(k)), 0.99))
1770 fmelt_g = dble(sr*sr)
1774 x = am_g(idx_bg(k)) * xxdg(n)**bm_g
1775 call rayleigh_soak_wetgraupel (x, dble(ocmg(idx_bg(k))), dble(obmg), &
1776 & fmelt_g, melt_outside_g, m_w_0, m_i_0, lamda_radar, &
1777 & cback, mixingrulestring_g, matrixstring_g, &
1778 & inclusionstring_g, hoststring_g, &
1779 & hostmatrixstring_g, hostinclusionstring_g)
1780 f_d = n0_g(k)*xxdg(n)**mu_g * dexp(-lamg*xxdg(n))
1781 eta = eta + f_d * cback * simpson(n) * xdtg(n)
1783 ze_graupel(k) = sngl(lamda4 / (pi5 * k_w) * eta)
1791 dbz(k) = 10.*log10((ze_rain(k)+ze_snow(k)+ze_graupel(k))*1.d18)
1798 if (rs(k).gt.r2)
then
1799 mrat = smob(k) / smoc(k)
1800 ils1 = 1./(mrat*lam0 + fv_s)
1801 ils2 = 1./(mrat*lam1 + fv_s)
1802 t1_vts = kap0*csg(5)*ils1**cse(5)
1803 t2_vts = kap1*mrat**mu_s*csg(11)*ils2**cse(11)
1804 ils1 = 1./(mrat*lam0)
1805 ils2 = 1./(mrat*lam1)
1806 t3_vts = kap0*csg(6)*ils1**cse(6)
1807 t4_vts = kap1*mrat**mu_s*csg(12)*ils2**cse(12)
1808 vts_dbz_wt = rhof(k)*av_s * (t1_vts+t2_vts)/(t3_vts+t4_vts)
1809 if (temp(k).ge.273.15 .and. temp(k).lt.275.15)
then
1810 vts_dbz_wt = vts_dbz_wt*1.5
1811 elseif (temp(k).ge.275.15)
then
1812 vts_dbz_wt = vts_dbz_wt*2.0
1818 if (rr(k).gt.r1)
then
1820 vtr_dbz_wt = rhof(k)*av_r*crg(13)*(lamr+fv_r)**(-cre(13)) &
1821 / (crg(4)*lamr**(-cre(4)))
1826 if (rg(k).gt.r2)
then
1828 vtg_dbz_wt = rhof(k)*av_g(idx_bg(k))*cgg(5,idx_bg(k))*lamg**(-cge(5,idx_bg(k))) &
1829 & / (cgg(4,1)*lamg**(-cge(4,1)))
1842 vt_dbz(k) = (vts_dbz_wt*ze_snow(k) + vtr_dbz_wt*ze_rain(k) &
1843 + vtg_dbz_wt*ze_graupel(k)) &
1844 / (ze_rain(k)+ze_snow(k)+ze_graupel(k))
1853 subroutine hail_size_diagnostics(kts, kte, qg1d, ng1d, qb1d, t1d, p1d, qv1d, qg_max_diam1d, configs)
1857 integer,
intent(in) :: kts, kte
1858 real(wp),
dimension(kts:kte),
intent(in) :: qg1d, ng1d, qb1d, t1d, p1d, qv1d
1859 real(wp),
dimension(kts:kte),
intent(out) :: qg_max_diam1d
1860 type(ty_tempo_cfg),
intent(in) :: configs
1863 real(wp),
dimension(kts:kte) :: rho, rg, ng, rb
1864 integer,
dimension(kts:kte) :: idx_bg
1865 real(dp) :: lamg, N0_g, f_d, sum_nh, sum_t, hail_max
1867 integer,
parameter :: nhbins = 50
1868 real(dp),
dimension(nhbins):: hbins, dhbins
1869 real(dp),
parameter :: lowbin = 500.e-6
1870 real(dp),
parameter :: highbin = 0.075
1871 real(dp),
parameter :: threshold_conc = 0.0005
1891 call create_bins(numbins=nhbins, lowbin=lowbin, highbin=highbin, bins=hbins, deltabins=dhbins)
1894 qg_max_diam1d(k) = 0.
1895 if(qg1d(k) >= 1.e-6)
then
1896 rho(k) = 0.622*p1d(k)/(r*t1d(k)*(qv1d(k)+0.622))
1897 rg(k) = qg1d(k)*rho(k)
1898 ng(k) = max(r2, ng1d(k)*rho(k))
1899 rb(k) = max(qg1d(k)/rho_g(nrhg), qb1d(k))
1900 rb(k) = min(qg1d(k)/rho_g(1), rb(k))
1901 idx_bg(k) = max(1,min(nint(qg1d(k)/rb(k) *0.01)+1,nrhg))
1902 if (.not. configs%hail_aware) idx_bg(k) = idx_bg1
1903 if (rho_g(idx_bg(k)) < 350.) cycle
1905 lamg = (am_g(idx_bg(k))*cgg(3,1)*ogg2*ng(k)/rg(k))**obmg
1906 n0_g = ng(k)*ogg2*lamg**cge(2,1)
1910 do n = nhbins, 1, -1
1911 f_d = n0_g*hbins(n)**mu_g * exp(-lamg*hbins(n)) * dhbins(n)
1912 sum_nh = sum_nh + f_d
1913 if (sum_nh > threshold_conc)
exit
1917 if (n >= nhbins)
then
1918 hail_max = hbins(nhbins)
1919 elseif (hbins(n+1) .gt. 1.e-3)
then
1920 hail_max = hbins(n) - (sum_nh-threshold_conc)/(sum_nh-sum_t) * (hbins(n)-hbins(n+1))
1924 qg_max_diam1d(k) = 1000. * hail_max
1950 REAL,
PARAMETER:: ice_density = 890.0
1951 REAL,
PARAMETER:: pi = 3.1415926536
1952 real,
intent(in):: q_ice, temp
1954 real corr, reice, deice
1955 double precision lambda
1982 real,
dimension(95),
parameter:: retab = (/ &
1983 5.92779, 6.26422, 6.61973, 6.99539, 7.39234, &
1984 7.81177, 8.25496, 8.72323, 9.21800, 9.74075, 10.2930, &
1985 10.8765, 11.4929, 12.1440, 12.8317, 13.5581, 14.2319, &
1986 15.0351, 15.8799, 16.7674, 17.6986, 18.6744, 19.6955, &
1987 20.7623, 21.8757, 23.0364, 24.2452, 25.5034, 26.8125, &
1988 27.7895, 28.6450, 29.4167, 30.1088, 30.7306, 31.2943, &
1989 31.8151, 32.3077, 32.7870, 33.2657, 33.7540, 34.2601, &
1990 34.7892, 35.3442, 35.9255, 36.5316, 37.1602, 37.8078, &
1991 38.4720, 39.1508, 39.8442, 40.5552, 41.2912, 42.0635, &
1992 42.8876, 43.7863, 44.7853, 45.9170, 47.2165, 48.7221, &
1993 50.4710, 52.4980, 54.8315, 57.4898, 60.4785, 63.7898, &
1994 65.5604, 71.2885, 75.4113, 79.7368, 84.2351, 88.8833, &
1995 93.6658, 98.5739, 103.603, 108.752, 114.025, 119.424, &
1996 124.954, 130.630, 136.457, 142.446, 148.608, 154.956, &
1997 161.503, 168.262, 175.248, 182.473, 189.952, 197.699, &
1998 205.728, 214.055, 222.694, 231.661, 240.971, 250.639 /)
2000 if (q_ice == 0)
then
2011 idx_rei = int(temp-179.)
2012 idx_rei = min(max(idx_rei,1),94)
2013 corr = temp - int(temp)
2014 reice = retab(idx_rei)*(1.-corr) + retab(idx_rei+1)*corr
2015 deice = 2.*reice * 1.e-6
2027 lambda = 3.0 / deice