@@ -54,9 +54,11 @@ module nh_utils_mod
54
54
#else
55
55
use constants_mod, only: rdgas, cp_air, grav
56
56
#endif
57
+ use constants_mod, only: pi_8
57
58
use tp_core_mod, only: fv_tp_2d
58
59
use sw_core_mod, only: fill_4corners, del6_vt_flux
59
60
use fv_arrays_mod, only: fv_grid_bounds_type, fv_grid_type,fv_nest_BC_type_3d
61
+ use mpp_mod, only: mpp_pe
60
62
#ifdef MULTI_GASES
61
63
use multi_gases_mod, only: vicpqd, vicvqd
62
64
#endif
@@ -71,6 +73,10 @@ module nh_utils_mod
71
73
72
74
real , parameter :: r3 = 1 ./ 3 .
73
75
76
+ real , allocatable :: rff(:)
77
+ logical :: RFw_initialized = .false.
78
+ integer :: k_rf = 0
79
+
74
80
CONTAINS
75
81
76
82
subroutine update_dz_c (is , ie , js , je , km , ng , dt , dp0 , zs , area , ut , vt , gz , ws , &
@@ -346,11 +352,12 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
346
352
kapad , &
347
353
#endif
348
354
ptop , hs , w3 , pt , q_con , &
349
- delp , gz , pef , ws , p_fac , a_imp , scale_m )
355
+ delp , gz , pef , ws , p_fac , a_imp , scale_m , &
356
+ pfull , fast_tau_w_sec , rf_cutoff )
350
357
351
358
integer , intent (in ):: is, ie, js, je, ng, km
352
359
integer , intent (in ):: ms
353
- real , intent (in ):: dt, akap, cp, ptop, p_fac, a_imp, scale_m
360
+ real , intent (in ):: dt, akap, cp, ptop, p_fac, a_imp, scale_m, fast_tau_w_sec, rf_cutoff
354
361
real , intent (in ):: ws(is- ng:ie+ ng,js- ng:je+ ng)
355
362
real , intent (in ), dimension (is- ng:ie+ ng,js- ng:je+ ng,km):: pt, delp
356
363
real , intent (in ), dimension (is- ng:,js- ng:,1 :):: q_con, cappa
@@ -359,6 +366,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
359
366
#endif
360
367
real , intent (in ):: hs(is- ng:ie+ ng,js- ng:je+ ng)
361
368
real , intent (in ), dimension (is- ng:ie+ ng,js- ng:je+ ng,km):: w3
369
+ real , intent (in ) :: pfull(km)
362
370
! OUTPUT PARAMETERS
363
371
real , intent (inout ), dimension (is- ng:ie+ ng,js- ng:je+ ng,km+1 ):: gz
364
372
real , intent ( out ), dimension (is- ng:ie+ ng,js- ng:je+ ng,km+1 ):: pef
@@ -369,6 +377,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
369
377
real , dimension (is-1 :ie+1 ,km ):: kapad2
370
378
#endif
371
379
real gama, rgrav
380
+ real (kind= 8 ) :: rff_temp
372
381
integer i, j, k
373
382
integer is1, ie1
374
383
@@ -378,12 +387,26 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
378
387
is1 = is - 1
379
388
ie1 = ie + 1
380
389
390
+ ! Set up rayleigh damping
391
+ if (fast_tau_w_sec > 1.e-5 .and. .not. RFw_initialized) then
392
+ allocate (rff(km))
393
+ RFw_initialized = .true.
394
+ do k= 1 ,km
395
+ if (pfull(k) > rf_cutoff) exit
396
+ k_rf = k
397
+ rff_temp = real (dt/ fast_tau_w_sec,kind= 8 ) &
398
+ * sin (0.5d0 * pi_8* log (real (rf_cutoff/ pfull(k),kind= 8 ))/ log (real (rf_cutoff/ ptop, kind= 8 )))** 2
399
+ rff(k) = 1.0d0 / ( 1.0d0 + rff_temp )
400
+ enddo
401
+ endif
402
+
403
+
381
404
! $OMP parallel do default(none) shared(js,je,is1,ie1,km,delp,pef,ptop,gz,rgrav,w3,pt, &
382
405
#ifdef MULTI_GASES
383
- ! $OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,kapad) &
406
+ ! $OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,kapad,fast_tau_w_sec ) &
384
407
! $OMP private(cp2,gm2, dm, dz2, w2, pm2, pe2, pem, peg, kapad2)
385
408
#else
386
- ! $OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa) &
409
+ ! $OMP a_imp,dt,gama,akap,ws,p_fac,scale_m,ms,hs,q_con,cappa,fast_tau_w_sec ) &
387
410
! $OMP private(cp2,gm2, dm, dz2, w2, pm2, pe2, pem, peg)
388
411
#endif
389
412
do 2000 j= js-1 , je+1
@@ -455,7 +478,7 @@ subroutine Riem_Solver_c(ms, dt, is, ie, js, je, km, ng, &
455
478
kapad2, &
456
479
#endif
457
480
pe2, &
458
- dm, pm2, pem, w2, dz2, pt(is1:ie1,j,1 :km), ws(is1,j), p_fac)
481
+ dm, pm2, pem, w2, dz2, pt(is1:ie1,j,1 :km), ws(is1,j), p_fac, fast_tau_w_sec )
459
482
endif
460
483
461
484
do k= 2 ,km+1
@@ -622,15 +645,15 @@ subroutine Riem_Solver3test(ms, dt, is, ie, js, je, km, ng, &
622
645
kapad2, &
623
646
#endif
624
647
pe2, dm, &
625
- pm2, pem, w2, dz2, pt(is:ie,j,1 :km), ws(is,j), p_fac)
648
+ pm2, pem, w2, dz2, pt(is:ie,j,1 :km), ws(is,j), p_fac, - 1 . )
626
649
else
627
650
call SIM_solver(dt, is, ie, km, rdgas, gama, gm2, cp2, akap, &
628
651
#ifdef MULTI_GASES
629
652
kapad2, &
630
653
#endif
631
654
pe2, dm, &
632
655
pm2, pem, w2, dz2, pt(is:ie,j,1 :km), ws(is,j), &
633
- a_imp, p_fac, scale_m)
656
+ a_imp, p_fac, scale_m, - 1 . )
634
657
endif
635
658
636
659
do k= 1 , km
@@ -1385,9 +1408,9 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1385
1408
kapad2 , &
1386
1409
#endif
1387
1410
pe , dm2 , &
1388
- pm2 , pem , w2 , dz2 , pt2 , ws , p_fac )
1411
+ pm2 , pem , w2 , dz2 , pt2 , ws , p_fac , fast_tau_w_sec )
1389
1412
integer , intent (in ):: is, ie, km
1390
- real , intent (in ):: dt, rgas, gama, kappa, p_fac
1413
+ real , intent (in ):: dt, rgas, gama, kappa, p_fac, fast_tau_w_sec
1391
1414
real , intent (in ), dimension (is:ie,km):: dm2, pt2, pm2, gm2, cp2
1392
1415
real , intent (in ):: ws(is:ie)
1393
1416
real , intent (in ), dimension (is:ie,km+1 ):: pem
@@ -1464,14 +1487,14 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1464
1487
do k= 2 , km
1465
1488
do i= is, ie
1466
1489
#ifdef MOIST_CAPPA
1467
- aa(i,k) = t1g* 0.5 * (gm2(i,k-1 )+ gm2(i,k))/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k)+ pp(i,k) )
1490
+ aa(i,k) = t1g* 0.5 * (gm2(i,k-1 )+ gm2(i,k))/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k))
1468
1491
#else
1469
1492
#ifdef MULTI_GASES
1470
1493
gamax = 1 ./ (1 .- kapad2(i,k))
1471
1494
t1gx = gamax * 2 .* dt* dt
1472
- aa(i,k) = t1gx/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k)+ pp(i,k) )
1495
+ aa(i,k) = t1gx/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k))
1473
1496
#else
1474
- aa(i,k) = t1g/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k)+ pp(i,k) )
1497
+ aa(i,k) = t1g/ (dz2(i,k-1 )+ dz2(i,k)) * (pem(i,k))
1475
1498
#endif
1476
1499
#endif
1477
1500
enddo
@@ -1489,14 +1512,14 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1489
1512
enddo
1490
1513
do i= is, ie
1491
1514
#ifdef MOIST_CAPPA
1492
- p1(i) = t1g* gm2(i,km)/ dz2(i,km)* (pem(i,km +1 ) + pp (i,km+1 ))
1515
+ p1(i) = t1g* gm2(i,km)/ dz2(i,km)* (pem(i,km+1 ))
1493
1516
#else
1494
1517
#ifdef MULTI_GASES
1495
1518
gamax = 1 ./ (1 .- kapad2(i,km))
1496
1519
t1gx = gamax * 2 .* dt* dt
1497
- p1(i) = t1gx/ dz2(i,km)* (pem(i,km+1 )+ pp(i,km +1 ) )
1520
+ p1(i) = t1gx/ dz2(i,km)* (pem(i,km+1 ))
1498
1521
#else
1499
- p1(i) = t1g/ dz2(i,km)* (pem(i,km+1 )+ pp(i,km +1 ) )
1522
+ p1(i) = t1g/ dz2(i,km)* (pem(i,km+1 ))
1500
1523
#endif
1501
1524
#endif
1502
1525
gam(i,km) = aa(i,km) / bet(i)
@@ -1509,6 +1532,16 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1509
1532
enddo
1510
1533
enddo
1511
1534
1535
+ ! !! Try Rayleigh damping of w
1536
+ if (fast_tau_w_sec > 1.e-5 ) then
1537
+ ! currently not damping to heat
1538
+ do k= 1 ,k_rf
1539
+ do i= is,ie
1540
+ w2(i,k) = w2(i,k)* rff(k)
1541
+ enddo
1542
+ enddo
1543
+ endif
1544
+
1512
1545
do i= is, ie
1513
1546
pe(i,1 ) = 0 .
1514
1547
enddo
@@ -1549,16 +1582,16 @@ subroutine SIM1_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1549
1582
enddo
1550
1583
enddo
1551
1584
1552
- end subroutine SIM1_solver
1585
+ end subroutine SIM1_solver
1553
1586
1554
1587
subroutine SIM_solver (dt , is , ie , km , rgas , gama , gm2 , cp2 , kappa , &
1555
1588
#ifdef MULTI_GASES
1556
1589
kapad2 , &
1557
1590
#endif
1558
1591
pe2 , dm2 , &
1559
- pm2 , pem , w2 , dz2 , pt2 , ws , alpha , p_fac , scale_m )
1592
+ pm2 , pem , w2 , dz2 , pt2 , ws , alpha , p_fac , scale_m , fast_tau_w_sec )
1560
1593
integer , intent (in ):: is, ie, km
1561
- real , intent (in ):: dt, rgas, gama, kappa, p_fac, alpha, scale_m
1594
+ real , intent (in ):: dt, rgas, gama, kappa, p_fac, alpha, scale_m, fast_tau_w_sec
1562
1595
real , intent (in ), dimension (is:ie,km):: dm2, pt2, pm2, gm2, cp2
1563
1596
real , intent (in ):: ws(is:ie)
1564
1597
real , intent (in ), dimension (is:ie,km+1 ):: pem
@@ -1637,8 +1670,7 @@ subroutine SIM_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1637
1670
1638
1671
do k= 1 , km+1
1639
1672
do i= is, ie
1640
- ! pe2 is Full p
1641
- pe2(i,k) = pem(i,k) + pp(i,k)
1673
+ pe2(i,k) = pem(i,k)
1642
1674
enddo
1643
1675
enddo
1644
1676
@@ -1697,6 +1729,16 @@ subroutine SIM_solver(dt, is, ie, km, rgas, gama, gm2, cp2, kappa, &
1697
1729
enddo
1698
1730
enddo
1699
1731
1732
+ ! !! Try Rayleigh damping of w
1733
+ if (fast_tau_w_sec > 1.e-5 ) then
1734
+ ! currently not damping to heat
1735
+ do k= 1 ,k_rf
1736
+ do i= is,ie
1737
+ w2(i,k) = w2(i,k)* rff(k)
1738
+ enddo
1739
+ enddo
1740
+ endif
1741
+
1700
1742
do i= is, ie
1701
1743
pe2(i,1 ) = 0 .
1702
1744
enddo
0 commit comments