39 integer(c_int),
value,
intent(in) :: ims, ime, jms, jme, kms, kme
40 integer(c_int),
value,
intent(in) :: its, ite, jts, jte, kts, kte
41 integer(c_int),
value,
intent(in) :: microphysics_debug
42 integer(c_int),
value,
intent(in) :: diag_i_dbg, diag_j_dbg
43 real(c_double),
intent(inout),
dimension(ims:ime, jms:jme, kms:kme) :: t, qv, qc, qi, qr, qs, qg
44 real(c_double),
intent(in),
dimension(ims:ime, jms:jme, kms:kme) :: den, p, delz
45 real(c_double),
value,
intent(in) :: delt, g, cpd, cpv, rd, rv, t0c, ep1, ep2, qmin, xls
46 real(c_double),
value,
intent(in) :: xlv0, xlf0, den0, denr, cliq, cice, psat
47 real(c_double),
intent(inout),
dimension(ims:ime, jms:jme) :: rain, rainncv, sr
48 real(c_double),
intent(inout),
dimension(ims:ime, jms:jme) :: snow, snowncv, graupel, graupelncv
50 integer :: i, j, k, kk, kdim, debug_local, i_dbg_local, j_dbg_target
51 logical :: i_dbg_in_tile
53 character(len=256) :: errmsg
54 real(c_double) :: xlv1_bridge
56 real(c_double),
allocatable :: t_col(:,:), q_col(:,:), qc_col(:,:), qi_col(:,:), qr_col(:,:), qs_col(:,:), qg_col(:,:)
57 real(c_double),
allocatable :: den_col(:,:), p_col(:,:), delz_col(:,:)
58 real(c_double),
allocatable :: rain_col(:), rainncv_col(:), sr_col(:)
59 real(c_double),
allocatable :: snow_col(:), snowncv_col(:), graupel_col(:), graupelncv_col(:)
61 if (its < ims .or. ite > ime .or. jts < jms .or. jte > jme .or. kts < kms .or. kte > kme)
then
62 write(*,
'(A)')
'mp_wsm6_run_c bounds error: run-window outside storage bounds'
63 write(*,
'(A,6(1X,I0))')
' storage ims ime jms jme kms kme =', ims, ime, jms, jme, kms, kme
64 write(*,
'(A,6(1X,I0))')
' active its ite jts jte kts kte =', its, ite, jts, jte, kts, kte
67 if (its > ite .or. jts > jte .or. kts > kte)
then
68 write(*,
'(A)')
'mp_wsm6_run_c bounds error: invalid active index ordering'
69 write(*,
'(A,6(1X,I0))')
' active its ite jts jte kts kte =', its, ite, jts, jte, kts, kte
73 i_dbg_local = diag_i_dbg
74 i_dbg_in_tile = (i_dbg_local >= its .and. i_dbg_local <= ite)
75 if (.not. i_dbg_in_tile) i_dbg_local = its
76 j_dbg_target = diag_j_dbg
77 if (j_dbg_target < jts .or. j_dbg_target > jte) j_dbg_target = jts - 1
80 xlv1_bridge = cliq - cpv
85 allocate(t_col(its:ite,1:kdim), q_col(its:ite,1:kdim), qc_col(its:ite,1:kdim), qi_col(its:ite,1:kdim))
86 allocate(qr_col(its:ite,1:kdim), qs_col(its:ite,1:kdim), qg_col(its:ite,1:kdim))
87 allocate(den_col(its:ite,1:kdim), p_col(its:ite,1:kdim), delz_col(its:ite,1:kdim))
88 allocate(rain_col(its:ite), rainncv_col(its:ite), sr_col(its:ite))
89 allocate(snow_col(its:ite), snowncv_col(its:ite), graupel_col(its:ite), graupelncv_col(its:ite))
95 t_col(i,kk) = t(i,j,k)
96 q_col(i,kk) = qv(i,j,k)
97 qc_col(i,kk) = qc(i,j,k)
98 qi_col(i,kk) = qi(i,j,k)
99 qr_col(i,kk) = qr(i,j,k)
100 qs_col(i,kk) = qs(i,j,k)
101 qg_col(i,kk) = qg(i,j,k)
102 den_col(i,kk) = den(i,j,k)
103 p_col(i,kk) = p(i,j,k)
104 delz_col(i,kk) = delz(i,j,k)
109 rain_col(i) = rain(i,j)
110 rainncv_col(i) = rainncv(i,j)
112 snow_col(i) = snow(i,j)
113 snowncv_col(i) = snowncv(i,j)
114 graupel_col(i) = graupel(i,j)
115 graupelncv_col(i)= graupelncv(i,j)
118 debug_local = int(microphysics_debug, kind(0))
119 if (microphysics_debug >= 1_c_int .and. (j /= j_dbg_target .or. .not. i_dbg_in_tile)) debug_local = 0
121 call mp_wsm6_run(t_col, q_col, qc_col, qi_col, qr_col, qs_col, qg_col, den_col, p_col, delz_col, &
122 delt, g, cpd, cpv, rd, rv, t0c, ep1, ep2, qmin, xls, xlv0, xlf0, den0, denr, &
123 cliq, cice, psat, rain_col, rainncv_col, sr_col, snow_col, snowncv_col, &
124 graupel_col, graupelncv_col, its=its, ite=ite, kts=1, kte=kdim, &
125 microphysics_debug=debug_local, diag_i_dbg=i_dbg_local, diag_j_dbg=j, diag_k_raw_base=kts, &
126 errmsg=errmsg, errflg=errflg)
128 if (errflg /= 0)
then
129 write(*,
'(A,1X,I0,2A)')
'mp_wsm6_run_c error at j=', j,
': ', trim(errmsg)
130 write(*,
'(A,6(1X,I0))')
' storage ims ime jms jme kms kme =', ims, ime, jms, jme, kms, kme
131 write(*,
'(A,6(1X,I0))')
' active its ite jts jte kts kte =', its, ite, jts, jte, kts, kte
138 t(i,j,k) = t_col(i,kk)
139 qv(i,j,k) = q_col(i,kk)
140 qc(i,j,k) = qc_col(i,kk)
141 qi(i,j,k) = qi_col(i,kk)
142 qr(i,j,k) = qr_col(i,kk)
143 qs(i,j,k) = qs_col(i,kk)
144 qg(i,j,k) = qg_col(i,kk)
149 rain(i,j) = rain_col(i)
150 rainncv(i,j) = rainncv_col(i)
152 snow(i,j) = snow_col(i)
153 snowncv(i,j) = snowncv_col(i)
154 graupel(i,j) = graupel_col(i)
155 graupelncv(i,j) = graupelncv_col(i)
159 deallocate(t_col, q_col, qc_col, qi_col, qr_col, qs_col, qg_col)
160 deallocate(den_col, p_col, delz_col)
161 deallocate(rain_col, rainncv_col, sr_col, snow_col, snowncv_col, graupel_col, graupelncv_col)