module module_SMOOTH_TERRAIN 1
#if (NMM_NEST == 1)
contains
subroutine smooth_terrain(grid,lines,nsmud, & 1,3
IDS,IDE,JDS,JDE,KDS,KDE, &
IMS,IME,JMS,JME,KMS,KME, &
IPS,IPE,JPS,JPE,KPS,KPE)
! Parallelized smoothing routine for NMM domain terrain heights.
! Also supports serial setups.
!
! Author: Sam Trahan, September 2011
! This is a replacement for, and based on, SMDHLD, which can be
! found lower down in this module. This smooths boundaries of the
! grid%HRES_AVC.
! Two grid%variables are used: HRES_LND (land mask) and HRES_AVC.
! Those are initialized in NEST_TERRAIN and module_TERRAIN's
! terrain_for. This routine is not sensitive to the units of
! HRES_AVC, so it could potentially be called on HRES_FIS instead.
USE MODULE_DOMAIN
, ONLY : DOMAIN, GET_IJK_FROM_GRID
#ifdef DM_PARALLEL
USE MODULE_COMM_DM
, ONLY: HALO_NMM_TERRAIN_SMOOTH_sub
USE MODULE_DM
, ONLY: ntasks_x, ntasks_y, mytask, ntasks, local_communicator
#endif
implicit none
INTEGER :: IDS,IDE,JDS,JDE,KDS,KDE
INTEGER :: IMS,IME,JMS,JME,KMS,KME
INTEGER :: IPS,IPE,JPS,JPE,KPS,KPE
integer, intent(in) :: lines,nsmud
character(len=256) :: message
type(domain) :: grid
integer :: i,j,k,jmelin,ibas,buf
integer :: im,jm
integer :: ihl,ihh,ks,m2l,imid,jmid,itgt,jtgt
real :: hbms(ips:ipe,jps:jpe)
integer :: ihw((jps-2):(jpe+2)),ihe((jps-2):(jpe+2))
real :: hse((ips-1):(ipe+1),(jps-1):(jpe+1))
real :: hne((ips-1):(ipe+1),(jps-1):(jpe+1))
!-----------------------------------------------------------------------
im=ide-1
jm=jde-1
imid=(ips+ipe)/2
jmid=(jps+jpe)/2
itgt=1
jtgt=143
buf=1
!-----------------------------------------------------------------------
do j=max(1,jps-2),min(jm,jpe+2)
ihw(j)=-mod(j,2)
ihe(j)=ihw(j)+1
enddo
!-----------------------------------------------------------------------
do j=jps,jpe
do i=ips,ipe
hbms(i,j)=grid%hres_lnd(i,j)
enddo
enddo
!
jmelin=jm-lines+1
ibas=lines/2
m2l=mod(lines,2)
!
do j=max(jps,lines),min(jpe,jmelin)
ihl=ibas+mod(j,2)+m2l*mod(j+1,2)
ihh=im-ibas-m2l*mod(j+1,2)
!
do i=max(ihl,ips),min(ihh,ipe)
hbms(i,j)=0.
enddo
enddo
!-----------------------------------------------------------------------
smooth_loop: do ks=1,nsmud
#ifdef DM_PARALLEL
# include "HALO_NMM_TERRAIN_SMOOTH.inc"
#endif
do j=max(jps-1,1),min(jpe+1,jm-1)
do i=max(ips-1,1),min(ipe+1,im-1)
hne(i,j)=grid%hres_avc(i+ihe(j),j+1)-grid%hres_avc(i,j)
enddo
enddo
do j=max(jps-1,2),min(jpe+1,jm)
do i=max(ips-1,1),min(ipe+1,im-1)
hse(i,j)=grid%hres_avc(i+ihe(j),j-1)-grid%hres_avc(i,j)
enddo
enddo
!
do j=max(jps,2),min(jpe,jm-1)
do i=max(ips,1+mod(j,2)),min(ipe,im-1)
grid%hres_avc(i,j)=(hne(i,j)-hne(i+ihw(j),j-1) &
& +hse(i,j)-hse(i+ihw(j),j+1))*hbms(i,j)*0.125+grid%hres_avc(i,j)
enddo
enddo
!--------------------------------------------------------------------
! smooth around boundary somehow?
! special treatment for four corners
wbound: if(1>=ips .and. 1<=ipe) then
if(1>=jps .and. 1<=jpe) then
if (hbms(1,1) .eq. 1) then
grid%hres_avc(1,1)=0.75*grid%hres_avc(1,1)+0.125*grid%hres_avc(1+ihe(1),2)+ &
0.0625*(grid%hres_avc(2,1)+grid%hres_avc(1,3))
endif
endif
if(jm>=jps .and. jm<=jpe) then
if (hbms(1,jm) .eq. 1) then
grid%hres_avc(1,jm)=0.75*grid%hres_avc(1,jm)+0.125*grid%hres_avc(1+ihe(jm),jm-1)+ &
0.0625*(grid%hres_avc(2,jm)+grid%hres_avc(1,jm-2))
endif
endif
endif wbound
ebound: if(im>=ips .and. im<=ipe) then
if(1>=jps .and. 1<=jpe) then
if (hbms(im,1) .eq. 1) then
grid%hres_avc(im,1)=0.75*grid%hres_avc(im,1)+0.125*grid%hres_avc(im+ihw(1),2)+ &
0.0625*(grid%hres_avc(im-1,1)+grid%hres_avc(im,3))
endif
endif
if(jm>=jps .and. jm<=jpe) then
if (hbms(im,jm) .eq. 1) then
grid%hres_avc(im,jm)=0.75*grid%hres_avc(im,jm)+0.125*grid%hres_avc(im+ihw(jm),jm-1)+ &
0.0625*(grid%hres_avc(im-1,jm)+grid%hres_avc(im,jm-2))
endif
endif
endif ebound
#ifdef DM_PARALLEL
# include "HALO_NMM_TERRAIN_SMOOTH.inc"
#endif
! S bound
if(1>=jps .and. 1<=jpe) then
J=1
do I=max(ips,2),min(ipe,im-1)
if (hbms(I,J) .eq. 1) then
hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J+1)+grid%hres_avc(I+ihe(J),J+1))
endif
enddo
do I=max(ips,2),min(ipe,im-1)
if (hbms(I,J) .eq. 1) then
grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j)
endif
enddo
endif
! N bound
if(jm>=jps .and. jm<=jpe) then
J=JM
do I=max(ips,2),min(ipe,im-1)
if (hbms(I,J) .eq. 1) then
grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+0.125*(grid%hres_avc(I+ihw(J),J-1)+grid%hres_avc(I+ihe(J),J-1))
endif
enddo
do I=max(ips,2),min(ipe,im-1)
if (hbms(I,J) .eq. 1) then
hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J-1)+grid%hres_avc(I+ihe(J),J-1))
endif
enddo
endif
! W bound
if(1>=ips .and. 1<=ipe) then
I=1
do J=max(jps,3),min(jpe,jm-2)
if (hbms(I,J) .eq. 1) then
hne(i,j)=0.125*(grid%hres_avc(I+ihe(J),J+1)+grid%hres_avc(I+ihe(J),J-1))
endif
enddo
do J=max(jps,3),min(jpe,jm-2)
if (hbms(I,J) .eq. 1) then
grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j)
endif
enddo
endif
! E bound
if(im>=ips .and. im<=ipe) then
I=IM
do J=max(jps,3),min(jpe,jm-2)
if (hbms(I,J) .eq. 1) then
hne(i,j)=0.125*(grid%hres_avc(I+ihw(J),J+1)+grid%hres_avc(I+ihw(J),J-1))
endif
enddo
do J=max(jps,3),min(jpe,jm-2)
if (hbms(I,J) .eq. 1) then
grid%hres_avc(I,J)=0.75*grid%hres_avc(I,J)+hne(i,j)
endif
enddo
endif
enddo smooth_loop
#ifdef DM_PARALLEL
# include "HALO_NMM_TERRAIN_SMOOTH.inc"
#endif
!-------------4-point averaging of mountains along inner boundary-------
if(2>=jps .and. 2<=jpe) then
do i=max(ips,1),min(ipe,im-1)
grid%hres_avc(i,2)=0.25*(grid%hres_avc(i,1)+grid%hres_avc(i+1,1)+ &
& grid%hres_avc(i,3)+grid%hres_avc(i+1,3))
enddo
endif
if(jm-1>=jps .and. jm-1<=jpe) then
do i=max(ips,1),min(ipe,im-1)
grid%hres_avc(i,jm-1)=0.25*(grid%hres_avc(i,jm-2)+grid%hres_avc(i+1,jm-2)+ &
& grid%hres_avc(i,jm)+grid%hres_avc(i+1,jm))
enddo
endif
#ifdef DM_PARALLEL
# include "HALO_NMM_TERRAIN_SMOOTH.inc"
#endif
if(2>=ips .and. 2<=ipe) then
do j=4,jm-3,2
if(j>=jps .and. j<=jpe) then
grid%hres_avc(1,j)=0.25*(grid%hres_avc(1,j-1)+ &
grid%hres_avc(2,j-1)+grid%hres_avc(1,j+1)+ &
grid%hres_avc(2,j+1))
endif
enddo
endif
if(im-1>=ips .and. im-1<=ipe) then
do j=4,jm-3,2
if(j>=jps .and. j<=jpe) then
grid%hres_avc(im-1,j)=0.25*(grid%hres_avc(im-1,j-1)+ &
grid%hres_avc(im,j-1)+grid%hres_avc(im-1,j+1)+ &
grid%hres_avc(im,j+1))
endif
enddo
endif
end subroutine smooth_terrain
! ---------------------------------------------------------------------
! ---------------------------------------------------------------------
subroutine smdhld(ids,ide,jds,jde,h,s1,lines,nsmud) 1
! This is the old serial smoothing routine from NMM_NEST_UTILS1.F
character(len=255) :: message
dimension ihw(jde-1),ihe(jde-1)
dimension h(ids:ide,jds:jde),s1(ids:ide,jds:jde) &
& ,hbms(ide-1,jde-1),hne(ide-1,jde-1),hse(ide-1,jde-1)
jm=jde-1
im=ide-1
!-----------------------------------------------------------------------
do j=1,jm
ihw(j)=-mod(j,2)
ihe(j)=ihw(j)+1
enddo
!-----------------------------------------------------------------------
do j=1,jm
do i=1,im
hbms(i,j)=s1(i,j)
enddo
enddo
!
jmelin=jm-lines+1
ibas=lines/2
m2l=mod(lines,2)
!
do j=lines,jmelin
ihl=ibas+mod(j,2)+m2l*mod(j+1,2)
ihh=im-ibas-m2l*mod(j+1,2)
!
do i=ihl,ihh
hbms(i,j)=0.
enddo
enddo
!-----------------------------------------------------------------------
ks_loop: do ks=1,nsmud
!-----------------------------------------------------------------------
do j=1,jm-1
do i=1,im-1
hne(i,j)=h(i+ihe(j),j+1)-h(i,j)
enddo
enddo
do j=2,jm
do i=1,im-1
hse(i,j)=h(i+ihe(j),j-1)-h(i,j)
enddo
enddo
!
do j=2,jm-1
do i=1+mod(j,2),im-1
h(i,j)=(hne(i,j)-hne(i+ihw(j),j-1) &
& +hse(i,j)-hse(i+ihw(j),j+1))*hbms(i,j)*0.125+h(i,j)
enddo
enddo
!-----------------------------------------------------------------------
! smooth around boundary somehow?
! special treatment for four corners
if (hbms(1,1) .eq. 1) then
h(1,1)=0.75*h(1,1)+0.125*h(1+ihe(1),2)+ &
& 0.0625*(h(2,1)+h(1,3))
endif
if (hbms(im,1) .eq. 1) then
h(im,1)=0.75*h(im,1)+0.125*h(im+ihw(1),2)+ &
& 0.0625*(h(im-1,1)+h(im,3))
endif
if (hbms(1,jm) .eq. 1) then
h(1,jm)=0.75*h(1,jm)+0.125*h(1+ihe(jm),jm-1)+ &
& 0.0625*(h(2,jm)+h(1,jm-2))
endif
if (hbms(im,jm) .eq. 1) then
h(im,jm)=0.75*h(im,jm)+0.125*h(im+ihw(jm),jm-1)+ &
& 0.0625*(h(im-1,jm)+h(im,jm-2))
endif
! S bound
J=1
do I=2,im-1
if (hbms(I,J) .eq. 1) then
h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihe(J),J+1))
endif
enddo
! N bound
J=JM
do I=2,im-1
if (hbms(I,J) .eq. 1) then
h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J-1)+h(I+ihe(J),J-1))
endif
enddo
! W bound
I=1
do J=3,jm-2
if (hbms(I,J) .eq. 1) then
h(I,J)=0.75*h(I,J)+0.125*(h(I+ihe(J),J+1)+h(I+ihe(J),J-1))
endif
enddo
! E bound
I=IM
do J=3,jm-2
if (hbms(I,J) .eq. 1) then
h(I,J)=0.75*h(I,J)+0.125*(h(I+ihw(J),J+1)+h(I+ihw(J),J-1))
endif
enddo
enddo ks_loop
!-------------4-point averaging of mountains along inner boundary-------
do i=1,im-1
h(i,2)=0.25*(h(i,1)+h(i+1,1)+h(i,3)+h(i+1,3))
enddo
do i=1,im-1
h(i,jm-1)=0.25*(h(i,jm-2)+h(i+1,jm-2)+h(i,jm)+h(i+1,jm))
enddo
do j=4,jm-3,2
h(1,j)=0.25*(h(1,j-1)+h(2,j-1)+h(1,j+1)+h(2,j+1))
enddo
do j=4,jm-3,2
h(im-1,j)=0.25*(h(im-1,j-1)+h(im,j-1)+h(im-1,j+1)+h(im,j+1))
enddo
!-----------------------------------------------------------------------
return
end subroutine smdhld
#endif
end module module_SMOOTH_TERRAIN