132 subroutine build_table_qr_acr_qs(rank, num_proc)
135 tcs_racs1, tmr_racs1, tcs_racs2, tmr_racs2, tcr_sacr1, tms_sacr1, &
136 tcr_sacr2, tms_sacr2, tnr_racs1, tnr_racs2, tnr_sacr1, tnr_sacr2, &
137 ntb_s, ntb_t, ntb_r1, ntb_r
139 integer,
intent(in) :: rank, num_proc
140#ifdef build_tables_with_mpi
144 real(wp) :: timing_start, timing_end
145 integer :: start_idx, end_idx, local_dim_size, local_flat_size
146 integer,
allocatable,
dimension(:) :: sendcounts, displacements
147 real(table_dp),
allocatable,
dimension(:) :: tcs_racs1_flat, tmr_racs1_flat, &
148 tcs_racs2_flat, tmr_racs2_flat, tcr_sacr1_flat, tms_sacr1_flat, &
149 tcr_sacr2_flat, tms_sacr2_flat, tnr_racs1_flat, tnr_racs2_flat, &
150 tnr_sacr1_flat, tnr_sacr2_flat
151 real(table_dp),
allocatable,
dimension(:,:,:,:) :: tcs_racs1_, tmr_racs1_, &
152 tcs_racs2_, tmr_racs2_, tcr_sacr1_, tms_sacr1_, tcr_sacr2_, &
153 tms_sacr2_, tnr_racs1_, tnr_racs2_, tnr_sacr1_, tnr_sacr2_
157 call initialize_arrays_qr_acr_qs()
158 allocate(tcs_racs1_flat(
size(tcs_racs1)))
159 allocate(tmr_racs1_flat(
size(tmr_racs1)))
160 allocate(tcs_racs2_flat(
size(tcs_racs2)))
161 allocate(tmr_racs2_flat(
size(tmr_racs2)))
162 allocate(tcr_sacr1_flat(
size(tcr_sacr1)))
163 allocate(tms_sacr1_flat(
size(tms_sacr1)))
164 allocate(tcr_sacr2_flat(
size(tcr_sacr2)))
165 allocate(tms_sacr2_flat(
size(tms_sacr2)))
166 allocate(tnr_racs1_flat(
size(tnr_racs1)))
167 allocate(tnr_racs2_flat(
size(tnr_racs2)))
168 allocate(tnr_sacr1_flat(
size(tnr_sacr1)))
169 allocate(tnr_sacr2_flat(
size(tnr_sacr2)))
173 call get_index_for_rank(ntb_r, rank, num_proc, start_idx, end_idx)
174 local_dim_size = end_idx - start_idx + 1
175 local_flat_size = local_dim_size * ntb_s*ntb_t*ntb_r1
178 allocate(tcs_racs1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
179 allocate(tmr_racs1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
180 allocate(tcs_racs2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
181 allocate(tmr_racs2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
182 allocate(tcr_sacr1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
183 allocate(tms_sacr1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
184 allocate(tcr_sacr2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
185 allocate(tms_sacr2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
186 allocate(tnr_racs1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
187 allocate(tnr_racs2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
188 allocate(tnr_sacr1_(ntb_s,ntb_t,ntb_r1,local_dim_size))
189 allocate(tnr_sacr2_(ntb_s,ntb_t,ntb_r1,local_dim_size))
191 allocate(sendcounts(num_proc), displacements(num_proc))
192 if (num_proc == 1)
then
193 sendcounts(1) = local_flat_size
197#ifdef build_tables_with_mpi
198 call mpi_allgather(local_flat_size, 1, mpi_integer, sendcounts, 1, mpi_integer, mpi_comm_world, ierror)
200 call mpi_allgather((start_idx-1)*ntb_s*ntb_t*ntb_r1, 1, mpi_integer, displacements, 1, mpi_integer, mpi_comm_world, ierror)
203#ifdef build_tables_with_mpi
204 timing_start = mpi_wtime()
206 call cpu_time(timing_start)
209 call qr_acr_qs(start_idx, end_idx, &
210 tcs_racs1_, tmr_racs1_, tcs_racs2_, tmr_racs2_, &
211 tcr_sacr1_, tms_sacr1_, tcr_sacr2_, tms_sacr2_, &
212 tnr_racs1_, tnr_racs2_, tnr_sacr1_, tnr_sacr2_)
214#ifdef build_tables_with_mpi
215 timing_end = mpi_wtime()
217 call cpu_time(timing_end)
221#ifdef build_tables_with_mpi
222 call mpi_barrier(mpi_comm_world, ierror)
223 call gather(reshape(tcs_racs1_, (/local_flat_size/)), tcs_racs1_flat, sendcounts, displacements, ierror)
224 call gather(reshape(tmr_racs1_, (/local_flat_size/)), tmr_racs1_flat, sendcounts, displacements, ierror)
225 call gather(reshape(tcs_racs2_, (/local_flat_size/)), tcs_racs2_flat, sendcounts, displacements, ierror)
226 call gather(reshape(tmr_racs2_, (/local_flat_size/)), tmr_racs2_flat, sendcounts, displacements, ierror)
227 call gather(reshape(tcr_sacr1_, (/local_flat_size/)), tcr_sacr1_flat, sendcounts, displacements, ierror)
228 call gather(reshape(tms_sacr1_, (/local_flat_size/)), tms_sacr1_flat, sendcounts, displacements, ierror)
229 call gather(reshape(tcr_sacr2_, (/local_flat_size/)), tcr_sacr2_flat, sendcounts, displacements, ierror)
230 call gather(reshape(tms_sacr2_, (/local_flat_size/)), tms_sacr2_flat, sendcounts, displacements, ierror)
231 call gather(reshape(tnr_racs1_, (/local_flat_size/)), tnr_racs1_flat, sendcounts, displacements, ierror)
232 call gather(reshape(tnr_racs2_, (/local_flat_size/)), tnr_racs2_flat, sendcounts, displacements, ierror)
233 call gather(reshape(tnr_sacr1_, (/local_flat_size/)), tnr_sacr1_flat, sendcounts, displacements, ierror)
234 call gather(reshape(tnr_sacr2_, (/local_flat_size/)), tnr_sacr2_flat, sendcounts, displacements, ierror)
237 tcs_racs1 = reshape(tcs_racs1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
238 tmr_racs1 = reshape(tmr_racs1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
239 tcs_racs2 = reshape(tcs_racs2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
240 tmr_racs2 = reshape(tmr_racs2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
241 tcr_sacr1 = reshape(tcr_sacr1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
242 tms_sacr1 = reshape(tms_sacr1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
243 tcr_sacr2 = reshape(tcr_sacr2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
244 tms_sacr2 = reshape(tms_sacr2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
245 tnr_racs1 = reshape(tnr_racs1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
246 tnr_racs2 = reshape(tnr_racs2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
247 tnr_sacr1 = reshape(tnr_sacr1_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
248 tnr_sacr2 = reshape(tnr_sacr2_flat, (/ntb_s,ntb_t,ntb_r1,ntb_r/))
251 tcs_racs1 = tcs_racs1_
252 tmr_racs1 = tmr_racs1_
253 tcs_racs2 = tcs_racs2_
254 tmr_racs2 = tmr_racs2_
255 tcr_sacr1 = tcr_sacr1_
256 tms_sacr1 = tms_sacr1_
257 tcr_sacr2 = tcr_sacr2_
258 tms_sacr2 = tms_sacr2_
259 tnr_racs1 = tnr_racs1_
260 tnr_racs2 = tnr_racs2_
261 tnr_sacr1 = tnr_sacr1_
262 tnr_sacr2 = tnr_sacr2_
265#if build_tables_with_mpi
266 call mpi_barrier(mpi_comm_world, ierror)
314 subroutine build_table_qr_acr_qg(rank, num_proc)
317 tcg_racg, tmr_racg, tcr_gacr, tnr_racg, tnr_gacr, &
318 ntb_g1, ntb_g, nrhg, ntb_r1, ntb_r
320 integer,
intent(in) :: rank, num_proc
321#ifdef build_tables_with_mpi
325 real(wp) :: timing_start, timing_end
326 integer :: start_idx, end_idx, local_dim_size, local_flat_size
327 integer,
allocatable,
dimension(:) :: sendcounts, displacements
328 real(table_dp),
allocatable,
dimension(:) :: tcg_racg_flat, tmr_racg_flat, &
329 tcr_gacr_flat, tnr_racg_flat, tnr_gacr_flat
330 real(table_dp),
allocatable,
dimension(:,:,:,:,:) :: tcg_racg_, &
331 tmr_racg_, tcr_gacr_, tnr_racg_, tnr_gacr_
335 call initialize_arrays_qr_acr_qg()
336 allocate(tcg_racg_flat(
size(tcg_racg)))
337 allocate(tmr_racg_flat(
size(tmr_racg)))
338 allocate(tcr_gacr_flat(
size(tcr_gacr)))
339 allocate(tnr_racg_flat(
size(tnr_racg)))
340 allocate(tnr_gacr_flat(
size(tnr_gacr)))
344 call get_index_for_rank(ntb_r, rank, num_proc, start_idx, end_idx)
345 local_dim_size = end_idx - start_idx + 1
346 local_flat_size = local_dim_size * ntb_g1*ntb_g*nrhg*ntb_r1
349 allocate(tcg_racg_(ntb_g1,ntb_g,nrhg,ntb_r1,local_dim_size))
350 allocate(tmr_racg_(ntb_g1,ntb_g,nrhg,ntb_r1,local_dim_size))
351 allocate(tcr_gacr_(ntb_g1,ntb_g,nrhg,ntb_r1,local_dim_size))
352 allocate(tnr_racg_(ntb_g1,ntb_g,nrhg,ntb_r1,local_dim_size))
353 allocate(tnr_gacr_(ntb_g1,ntb_g,nrhg,ntb_r1,local_dim_size))
355 allocate(sendcounts(num_proc), displacements(num_proc))
356 if (num_proc == 1)
then
357 sendcounts(1) = local_flat_size
361#ifdef build_tables_with_mpi
362 call mpi_allgather(local_flat_size, 1, mpi_integer, sendcounts, 1, mpi_integer, mpi_comm_world, ierror)
364 call mpi_allgather((start_idx-1)*ntb_g1*ntb_g*nrhg*ntb_r1, 1, mpi_integer, displacements, 1, mpi_integer, mpi_comm_world, ierror)
367#ifdef build_tables_with_mpi
368 timing_start = mpi_wtime()
370 call cpu_time(timing_start)
373 call qr_acr_qg(start_idx, end_idx, &
374 tcg_racg_, tmr_racg_, tcr_gacr_, tnr_racg_, tnr_gacr_)
376#ifdef build_tables_with_mpi
377 timing_end = mpi_wtime()
379 call cpu_time(timing_end)
383#ifdef build_tables_with_mpi
384 call mpi_barrier(mpi_comm_world, ierror)
385 call gather(reshape(tcg_racg_, (/local_flat_size/)), tcg_racg_flat, sendcounts, displacements, ierror)
386 call gather(reshape(tmr_racg_, (/local_flat_size/)), tmr_racg_flat, sendcounts, displacements, ierror)
387 call gather(reshape(tcr_gacr_, (/local_flat_size/)), tcr_gacr_flat, sendcounts, displacements, ierror)
388 call gather(reshape(tnr_racg_, (/local_flat_size/)), tnr_racg_flat, sendcounts, displacements, ierror)
389 call gather(reshape(tnr_gacr_, (/local_flat_size/)), tnr_gacr_flat, sendcounts, displacements, ierror)
392 tcg_racg = reshape(tcg_racg_flat, (/ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r/))
393 tmr_racg = reshape(tmr_racg_flat, (/ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r/))
394 tcr_gacr = reshape(tcr_gacr_flat, (/ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r/))
395 tnr_racg = reshape(tnr_racg_flat, (/ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r/))
396 tnr_gacr = reshape(tnr_gacr_flat, (/ntb_g1,ntb_g,nrhg,ntb_r1,ntb_r/))
406#if build_tables_with_mpi
407 call mpi_barrier(mpi_comm_world, ierror)
493 subroutine qr_acr_qs(local_start, local_end, &
494 ltcs_racs1, ltmr_racs1, ltcs_racs2, ltmr_racs2, ltcr_sacr1, ltms_sacr1, &
495 ltcr_sacr2, ltms_sacr2, ltnr_racs1, ltnr_racs2, ltnr_sacr1, ltnr_sacr2)
498 nbr, nbs, dr, av_s, bv_s, ds, fv_s, &
499 ntb_r, ntb_r1, n0r_exp, am_r, cre, crg, ore1, r_r, &
500 org1, org2, obmr, mu_r, dtr, ntb_t, ntb_s, r_s, &
501 sa, sb, tc, bm_s, mu_s, lam0, lam1, kap0, kap1, dts, &
502 bm_r, am_s, pi, ef_rs, table_dp
504 integer,
intent(in) :: local_start, local_end
505 real(table_dp),
intent(out),
dimension(:,:,:,:) :: &
506 ltcs_racs1, ltmr_racs1, ltcs_racs2, ltmr_racs2, &
507 ltcr_sacr1, ltms_sacr1, ltcr_sacr2, ltms_sacr2, &
508 ltnr_racs1, ltnr_racs2, ltnr_sacr1, ltnr_sacr2
510 integer :: i, j, k, m, n, n2
511 real(dp),
dimension(nbr) :: vr, d1, n_r
512 real(dp),
dimension(nbs) :: vs, n_s
513 real(dp) :: m0, m2, m3, mrat, om3
514 real(dp) :: n0_r, lam_exp, lamr, slam1, slam2
515 real(dp) :: dvs, dvr, masss, massr
516 real(dp) :: t1, t2, t3, t4, z1, z2, z3, z4
517 real(dp) :: y1, y2, y3, y4
520 vr(n2) = -0.1021_dp + 4.932e3_dp*dr(n2) - 0.9551e6_dp*dr(n2)*dr(n2) &
521 + 0.07934e9_dp*dr(n2)*dr(n2)*dr(n2) &
522 - 0.002362e12_dp*dr(n2)*dr(n2)*dr(n2)*dr(n2)
523 d1(n2) = (vr(n2)/av_s)**(1._dp/bv_s)
526 vs(n) = 1.5_dp*av_s*ds(n)**bv_s * exp(real(-fv_s*ds(n), kind=dp))
529 do m = local_start, local_end
531 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
532 lamr = lam_exp * (crg(3)*org2*org1)**obmr
533 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
535 n_r(n2) = n0_r*dr(n2)**mu_r * exp(-lamr*dr(n2))*dtr(n2)
540 call snow_moments(rs=r_s(i), tc=tc(j), smob=m2, smoc=m3)
543 mrat = m2*(m2*om3)*(m2*om3)*(m2*om3)
545 slam1 = m2 * om3 * lam0
546 slam2 = m2 * om3 * lam1
549 n_s(n) = mrat*(kap0*exp(-slam1*ds(n)) &
550 + kap1*m0*ds(n)**mu_s * exp(-slam2*ds(n)))*dts(n)
566 massr = am_r * dr(n2)**bm_r
568 masss = am_s * ds(n)**bm_s
570 dvs = 0.5_dp*((vr(n2) - vs(n)) + abs(vr(n2)-vs(n)))
571 dvr = 0.5_dp*((vs(n) - vr(n2)) + abs(vs(n)-vr(n2)))
572 if (massr > 1.5*masss)
then
573 t1 = t1+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
574 *dvs*masss * n_s(n)* n_r(n2)
575 z1 = z1+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
576 *dvs*massr * n_s(n)* n_r(n2)
577 y1 = y1+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
578 *dvs * n_s(n)* n_r(n2)
580 t3 = t3+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
581 *dvs*masss * n_s(n)* n_r(n2)
582 z3 = z3+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
583 *dvs*massr * n_s(n)* n_r(n2)
584 y3 = y3+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
585 *dvs * n_s(n)* n_r(n2)
588 if (massr > 1.5_dp*masss)
then
589 t2 = t2+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
590 *dvr*massr * n_s(n)* n_r(n2)
591 y2 = y2+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
592 *dvr * n_s(n)* n_r(n2)
593 z2 = z2+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
594 *dvr*masss * n_s(n)* n_r(n2)
596 t4 = t4+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
597 *dvr*massr * n_s(n)* n_r(n2)
598 y4 = y4+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
599 *dvr * n_s(n)* n_r(n2)
600 z4 = z4+ pi*.25_dp*ef_rs*(ds(n)+dr(n2))*(ds(n)+dr(n2)) &
601 *dvr*masss * n_s(n)* n_r(n2)
605 ltcs_racs1(i,j,k,m-local_start+1) = t1
606 ltmr_racs1(i,j,k,m-local_start+1) = min(z1, real(r_r(m), kind=dp))
607 ltcs_racs2(i,j,k,m-local_start+1) = t3
608 ltmr_racs2(i,j,k,m-local_start+1) = z3
609 ltcr_sacr1(i,j,k,m-local_start+1) = t2
610 ltms_sacr1(i,j,k,m-local_start+1) = z2
611 ltcr_sacr2(i,j,k,m-local_start+1) = t4
612 ltms_sacr2(i,j,k,m-local_start+1) = z4
613 ltnr_racs1(i,j,k,m-local_start+1) = y1
614 ltnr_racs2(i,j,k,m-local_start+1) = y3
615 ltnr_sacr1(i,j,k,m-local_start+1) = y2
616 ltnr_sacr2(i,j,k,m-local_start+1) = y4
624 subroutine qr_acr_qg(local_start, local_end, &
625 ltcg_racg, ltmr_racg, ltcr_gacr, ltnr_racg, ltnr_gacr)
628 av_g, dg, bv_g, ntb_r, ntb_r1, &
629 n0r_exp, am_r, cre, crg, r_r, ore1, org1, org2, &
630 obmr, mu_r, dtr, ntb_g, ntb_g1, n0g_exp, am_g, cge, cgg, &
631 r_g, oge1, ogg1, ogg2, obmg, mu_g, dtg, bm_r, bm_g, pi, ef_rg
633 integer,
intent(in) :: local_start, local_end
634 real(table_dp),
intent(out),
dimension(:,:,:,:,:) :: &
635 ltcg_racg, ltmr_racg, ltcr_gacr, ltnr_racg, ltnr_gacr
637 integer :: i, j, k, m, n, n2, n3
638 real(dp),
dimension(nbg) :: n_g
639 real(dp),
dimension(nbg, nrhg) :: vg
640 real(dp),
dimension(nbr):: vr, n_r
641 real(dp) :: n0_r, n0_g, lam_exp, lamg, lamr
642 real(dp) :: massg, massr, dvg, dvr, t1, t2, z1, z2, y1, y2
645 vr(n2) = -0.1021_dp + 4.932e3_dp*dr(n2) - 0.9551e6_dp*dr(n2)*dr(n2) &
646 + 0.07934e9_dp*dr(n2)*dr(n2)*dr(n2) &
647 - 0.002362e12_dp*dr(n2)*dr(n2)*dr(n2)*dr(n2)
651 vg(n,n3) = av_g(n3)*dg(n)**bv_g(n3)
655 do m = local_start, local_end
658 lam_exp = (n0r_exp(k)*am_r*crg(1)/r_r(m))**ore1
659 lamr = lam_exp * (crg(3)*org2*org1)**obmr
660 n0_r = n0r_exp(k)/(crg(2)*lam_exp) * lamr**cre(2)
662 n_r(n2) = n0_r*dr(n2)**mu_r *exp(-lamr*dr(n2))*dtr(n2)
668 lam_exp = (n0g_exp(i)*am_g(n3)*cgg(1,1)/r_g(j))**oge1
669 lamg = lam_exp * (cgg(3,1)*ogg2*ogg1)**obmg
670 n0_g = n0g_exp(i)/(cgg(2,1)*lam_exp) * lamg**cge(2,1)
672 n_g(n) = n0_g*dg(n)**mu_g * exp(-lamg*dg(n))*dtg(n)
682 massr = am_r * dr(n2)**bm_r
684 massg = am_g(n3) * dg(n)**bm_g
686 dvg = 0.5_dp*((vr(n2) - vg(n,n3)) + abs(vr(n2)-vg(n,n3)))
687 dvr = 0.5_dp*((vg(n,n3) - vr(n2)) + abs(vg(n,n3)-vr(n2)))
689 t1 = t1+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
690 *dvg*massg * n_g(n)* n_r(n2)
691 z1 = z1+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
692 *dvg*massr * n_g(n)* n_r(n2)
693 y1 = y1+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
694 *dvg * n_g(n)* n_r(n2)
696 t2 = t2+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
697 *dvr*massr * n_g(n)* n_r(n2)
698 y2 = y2+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
699 *dvr * n_g(n)* n_r(n2)
700 z2 = z2+ pi*.25_wp*ef_rg*(dg(n)+dr(n2))*(dg(n)+dr(n2)) &
701 *dvr*massg * n_g(n)* n_r(n2)
704 ltcg_racg(i,j,n3,k,m-local_start+1) = t1
705 ltmr_racg(i,j,n3,k,m-local_start+1) = min(z1, real(r_r(m), kind=dp))
706 ltcr_gacr(i,j,n3,k,m-local_start+1) = t2
707 ltnr_racg(i,j,n3,k,m-local_start+1) = y1
708 ltnr_gacr(i,j,n3,k,m-local_start+1) = y2
717 subroutine freezewater()
722 am_r, dr, dtr, bm_r, dc, dtc, ntb_in, ntb_r1, ntb_r, nt_in, &
723 n0r_exp, cre, crg, r_r, ore1, org2, org1, obmr, mu_r, &
724 nu_c_scale, xm0g, t_nc, cce, ccg, ocg1, r_c, ntb_c, &
725 tpi_qrfz, tni_qrfz, tpg_qrfz, tnr_qrfz, tpi_qcfz, tni_qcfz
727 integer :: i, j, k, m, n, n2
729 real(dp),
dimension(nbr):: massr
730 real(dp),
dimension(nbc):: massc
731 real(dp) :: sum1, sum2, sumn1, sumn2, &
732 prob, vol, texp, orho_w, &
733 lam_exp, lamr, n0_r, lamc, n0_c
740 massr(n2) = am_r*dr(n2)**bm_r
743 massc(n) = am_r*dc(n)**bm_r
748 t_adjust = max(-3.0_wp, min(3.0_wp - log10(nt_in(m)), 3.0_wp))
750 texp = exp(real(k, kind=dp) - real(t_adjust, kind=dp)) - 1.0_dp
753 lam_exp = (n0r_exp(j)*am_r*crg(1)/r_r(i))**ore1
754 lamr = lam_exp * (crg(3)*org2*org1)**obmr
755 n0_r = n0r_exp(j)/(crg(2)*lam_exp) * lamr**cre(2)
761 n_r = n0_r*dr(n2)**mu_r*exp(-lamr*dr(n2))*dtr(n2)
762 vol = massr(n2)*orho_w
763 prob = max(0.0_dp, 1.0_dp - exp(-120.0_dp*vol*5.2d-4 * texp))
768 if (massr(n2) < xm0g)
then
769 sumn1 = sumn1 + prob*n_r
770 sum1 = sum1 + prob*n_r*massr(n2)
772 sumn2 = sumn2 + prob*n_r
773 sum2 = sum2 + prob*n_r*massr(n2)
775 if ((sum1+sum2) >= r_r(i))
exit
777 tpi_qrfz(i,j,k,m) = sum1
778 tni_qrfz(i,j,k,m) = sumn1
779 tpg_qrfz(i,j,k,m) = sum2
780 tnr_qrfz(i,j,k,m) = sumn2
785 nu_c = min(15, nint(nu_c_scale/t_nc(j)) + 2)
787 lamc = (t_nc(j)*am_r* ccg(2,nu_c) * ocg1(nu_c) / r_c(i))**obmr
788 n0_c = t_nc(j)*ocg1(nu_c) * lamc**cce(1,nu_c)
792 vol = massc(n)*orho_w
793 prob = max(0.0_dp, 1.0_dp - exp(-120.0_dp*vol*5.2e-4_dp * texp))
794 n_c = n0_c*dc(n)**nu_c*exp(-lamc*dc(n))*dtc(n)
795 sumn2 = min(t_nc(j), sumn2 + prob*n_c)
796 sum1 = sum1 + prob*n_c*massc(n)
797 if (sum1 >= r_c(i))
exit
799 tpi_qcfz(i,j,k,m) = sum1
800 tni_qcfz(i,j,k,m) = sumn2