Skip to content

Commit f884681

Browse files
authored
Ideal tropical cyclone fix (#2295)
TYPE: bug fix KEYWORDS: em_tropical_cyclone, halo depth SOURCE: Wen-Pu Ho (National Central University, Taiwan) DESCRIPTION OF CHANGES: Problem: Some loops were hardcoded to start from index 1. This fails to properly account for the ghost cells required in decomposed sub-domains, leading to segmentation fault when running ideal.exe for the em_tropical_cyclone case in MPI (parallel) environment. Solution: Fix hardcoded loop indices for proper handling in MPI-decomposed domains, and broadcast base state variables with MPI function. ISSUE: Fixes #2294 LIST OF MODIFIED FILES: dyn_em/module_initialize_tropical_cyclone.F TESTS CONDUCTED: Tested with idealized TC initialization using MPI processes. RELEASE NOTE: This PR fixed an issue with not being able to execute idealized initialization program of tropical cyclone case with MPI.
1 parent 91b64fd commit f884681

File tree

1 file changed

+54
-25
lines changed

1 file changed

+54
-25
lines changed

dyn_em/module_initialize_tropical_cyclone.F

Lines changed: 54 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,14 @@ SUBROUTINE init_domain_rk ( grid &
484484
grid%phb(i,k,j) = grid%phb(i,k-1,j) - grid%dnw(k-1)*(grid%c1h(k-1)*grid%mub(i,j)+grid%c2h(k-1))*grid%alb(i,k-1,j)
485485
ENDDO
486486

487+
if ((i.eq.1).and.(j.eq.1)) then
488+
write(6,*) ' ptop is ',grid%p_top
489+
write(6,*) ' base state grid%mub(1,1), p_surf is ',grid%mub(1,1),grid%mub(1,1)+grid%p_top
490+
endif
491+
487492
ENDDO
488493
ENDDO
489494

490-
write(6,*) ' ptop is ',grid%p_top
491-
write(6,*) ' base state grid%mub(1,1), p_surf is ',grid%mub(1,1),grid%mub(1,1)+grid%p_top
492-
493495
! calculate full state for each column - this includes moisture.
494496

495497
write(6,*) ' getting moist sounding for full state '
@@ -586,8 +588,8 @@ SUBROUTINE init_domain_rk ( grid &
586588
nref = 1 + int( float(ide-ids+1)/2.0 )
587589
kref = kte-1
588590

589-
print *,' ids,ide,kds,kds = ',ids,ide,kds,kde
590-
print *,' its,ite,kts,kts = ',its,ite,kts,kte
591+
print *,' ids,ide,kds,kde = ',ids,ide,kds,kde
592+
print *,' its,ite,kts,kte = ',its,ite,kts,kte
591593
print *,' nref,fcor = ',nref,fcor
592594
print *,' r0,rmax,vmax,zdd = ',r0,rmax,vmax,zdd
593595

@@ -607,22 +609,39 @@ SUBROUTINE init_domain_rk ( grid &
607609
allocate( qvref(nref,0:kref+1))
608610

609611
! get base state:
610-
print *,' zref,th0,qv0,thv0:'
612+
if ((its.eq.1).and.(jts.eq.1)) then
611613
do k=1,kref
612-
th0(k) = t0+grid%t_1(1,k,1)
613-
qv0(k) = moist(1,k,1,P_QV)
614+
th0(k) = t0+grid%t_1(its,k,jts)
615+
qv0(k) = moist(its,k,jts,P_QV)
614616
thv0(k) = th0(k)*(1.0+(r_v/r_d)*qv0(k))/(1.0+qv0(k))
615-
zref(k) = 0.5*(grid%phb(1,k,1)+grid%phb(1,k+1,1)+grid%ph_1(1,k,1)+grid%ph_1(1,k+1,1))/g
616-
print *,k,zref(k),th0(k),qv0(k),thv0(k)
617+
zref(k) = 0.5*(grid%phb(its,k,jts)+grid%phb(its,k+1,jts)+grid%ph_1(its,k,jts)+grid%ph_1(its,k+1,jts))/g
617618
enddo
618-
619-
print *,' prs0,pi0,rh0:'
620619
do k=1,kref
621-
prs0(k) = grid%p(1,k,1)+grid%pb(1,k,1)
620+
prs0(k) = grid%p(its,k,jts)+grid%pb(its,k,jts)
622621
pi0(k) = (prs0(k)/p0)**(r_d/cp)
623622
E1=1000.0*SVP1*EXP(SVP2*(th0(k)*pi0(k)-SVPT0)/(th0(k)*pi0(k)-SVP3))
624623
qvs = EP_2*E1/(prs0(k)-E1)
625624
rh0(k) = qv0(k)/qvs
625+
enddo
626+
endif
627+
628+
#ifdef DM_PARALLEL
629+
CALL wrf_dm_bcast_real( th0 , kref+2 )
630+
CALL wrf_dm_bcast_real( qv0 , kref+2 )
631+
CALL wrf_dm_bcast_real( thv0 , kref+2 )
632+
CALL wrf_dm_bcast_real( zref , kref+2 )
633+
CALL wrf_dm_bcast_real( prs0 , kref+2 )
634+
CALL wrf_dm_bcast_real( pi0 , kref+2 )
635+
CALL wrf_dm_bcast_real( rh0 , kref+2 )
636+
#endif
637+
638+
print *,' zref,th0,qv0,thv0:'
639+
do k=1,kref
640+
print *,k,zref(k),th0(k),qv0(k),thv0(k)
641+
enddo
642+
643+
print *,' prs0,pi0,rh0:'
644+
do k=1,kref
626645
print *,k,prs0(k),pi0(k),rh0(k)
627646
enddo
628647

@@ -1016,21 +1035,22 @@ SUBROUTINE init_domain_rk ( grid &
10161035
endif
10171036
!#endif
10181037

1019-
write(6,*) ' grid%mu_1 from comp ', grid%mu_1(1,1)
1038+
write(6,*) ' grid%mu_1 from comp ', grid%mu_1(its,jts)
10201039
write(6,*) ' full state sounding from comp, ph, grid%p, grid%al, grid%t_1, qv '
10211040
do k=1,kde-1
1022-
write(6,'(i3,1x,5(1x,1pe10.3))') k, grid%ph_1(1,k,1)+grid%phb(1,k,1), &
1023-
grid%p(1,k,1)+grid%pb(1,k,1), grid%alt(1,k,1), &
1024-
grid%t_1(1,k,1)+t0, moist(1,k,1,P_QV)
1041+
write(6,'(i3,1x,5(1x,1pe10.3))') k, grid%ph_1(its,k,jts)+grid%phb(its,k,jts), &
1042+
grid%p(its,k,jts)+grid%pb(its,k,jts), grid%alt(its,k,jts), &
1043+
grid%t_1(its,k,jts)+t0, moist(its,k,jts,P_QV)
10251044
enddo
10261045

10271046
write(6,*) ' pert state sounding from comp, grid%ph_1, pp, alp, grid%t_1, qv '
10281047
do k=1,kde-1
1029-
write(6,'(i3,1x,5(1x,1pe10.3))') k, grid%ph_1(1,k,1), &
1030-
grid%p(1,k,1), grid%al(1,k,1), &
1031-
grid%t_1(1,k,1), moist(1,k,1,P_QV)
1048+
write(6,'(i3,1x,5(1x,1pe10.3))') k, grid%ph_1(its,k,jts), &
1049+
grid%p(its,k,jts), grid%al(its,k,jts), &
1050+
grid%t_1(its,k,jts), moist(its,k,jts,P_QV)
10321051
enddo
10331052

1053+
10341054
!! interp v
10351055
!
10361056
! DO J = jts, jte
@@ -1100,13 +1120,22 @@ SUBROUTINE init_domain_rk ( grid &
11001120
ENDDO
11011121
ENDDO
11021122

1123+
if ((its.eq.1).and.(jts.eq.1)) then
11031124
DO k=1,kte-1
1104-
grid%t_base(k) = grid%t_1(1,k,1)
1105-
grid%qv_base(k) = moist(1,k,1,P_QV)
1106-
grid%u_base(k) = grid%u_1(1,k,1)
1107-
grid%v_base(k) = grid%v_1(1,k,1)
1108-
grid%z_base(k) = 0.5*(grid%phb(1,k,1)+grid%phb(1,k+1,1)+grid%ph_1(1,k,1)+grid%ph_1(1,k+1,1))/g
1125+
grid%t_base(k) = grid%t_1(its,k,jts)
1126+
grid%qv_base(k) = moist(its,k,jts,P_QV)
1127+
grid%u_base(k) = grid%u_1(its,k,jts)
1128+
grid%v_base(k) = grid%v_1(its,k,jts)
1129+
grid%z_base(k) = 0.5*(grid%phb(its,k,jts)+grid%phb(its,k+1,jts)+grid%ph_1(its,k,jts)+grid%ph_1(its,k+1,jts))/g
11091130
ENDDO
1131+
endif
1132+
#ifdef DM_PARALLEL
1133+
CALL wrf_dm_bcast_real( grid%t_base , kte )
1134+
CALL wrf_dm_bcast_real( grid%qv_base , kte )
1135+
CALL wrf_dm_bcast_real( grid%u_base , kte )
1136+
CALL wrf_dm_bcast_real( grid%v_base , kte )
1137+
CALL wrf_dm_bcast_real( grid%z_base , kte )
1138+
#endif
11101139

11111140
DO J = jts, min(jde-1,jte)
11121141
DO I = its, min(ide-1,ite)

0 commit comments

Comments
 (0)