! MODULE module_intermediate_nmm
! This module contains routines that feed parent grid variables to the
! intermediate grid when doing up-interpolation. This is needed by
! the new NMM interpolation routines, which require certain variables
! on the target domain in order to do log(P)-space vertical
! interpolation.
!
! This module is also used during forcing (parent->nest boundary) to
! copy variables to the intermediate domain that may not otherwise be
! copied by the forcing routines.
!
! Author: Samuel Trahan
!
! History:
! Aug 2012 - written by Sam Trahan for up-interpolation
! Sep 2012 - updated to also work with forcing (parent->nest bdy)
module module_intermediate_nmm 2
#if (NMM_CORE == 1 && NMM_NEST==1)
contains
SUBROUTINE parent_to_inter_part1 ( grid, intermediate_grid, ngrid, config_flags ) 1,10
USE module_state_description
USE module_domain
, ONLY : domain, get_ijk_from_grid
USE module_configure
, ONLY : grid_config_rec_type
USE module_dm
, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, &
ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width
USE module_timing
IMPLICIT NONE
TYPE(domain), POINTER :: grid
TYPE(domain), POINTER :: intermediate_grid
TYPE(domain), POINTER :: ngrid
INTEGER nlev, msize
INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k
INTEGER iparstrt,jparstrt,sw
TYPE (grid_config_rec_type) :: config_flags
REAL xv(500)
INTEGER :: cids, cide, cjds, cjde, ckds, ckde, &
cims, cime, cjms, cjme, ckms, ckme, &
cips, cipe, cjps, cjpe, ckps, ckpe
INTEGER :: iids, iide, ijds, ijde, ikds, ikde, &
iims, iime, ijms, ijme, ikms, ikme, &
iips, iipe, ijps, ijpe, ikps, ikpe
INTEGER :: nids, nide, njds, njde, nkds, nkde, &
nims, nime, njms, njme, nkms, nkme, &
nips, nipe, njps, njpe, nkps, nkpe
INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7
INTEGER icoord, jcoord, idim_cd, jdim_cd, pgr
INTEGER local_comm, myproc, nproc
INTEGER thisdomain_max_halo_width
CALL wrf_get_dm_communicator
( local_comm )
CALL wrf_get_myproc
( myproc )
CALL wrf_get_nproc
( nproc )
CALL get_ijk_from_grid
( grid , &
cids, cide, cjds, cjde, ckds, ckde, &
cims, cime, cjms, cjme, ckms, ckme, &
cips, cipe, cjps, cjpe, ckps, ckpe )
CALL get_ijk_from_grid
( intermediate_grid , &
iids, iide, ijds, ijde, ikds, ikde, &
iims, iime, ijms, ijme, ikms, ikme, &
iips, iipe, ijps, ijpe, ikps, ikpe )
CALL get_ijk_from_grid
( ngrid , &
nids, nide, njds, njde, nkds, nkde, &
nims, nime, njms, njme, nkms, nkme, &
nips, nipe, njps, njpe, nkps, nkpe )
CALL nl_get_parent_grid_ratio ( ngrid%id, pgr )
CALL nl_get_i_parent_start ( intermediate_grid%id, iparstrt )
CALL nl_get_j_parent_start ( intermediate_grid%id, jparstrt )
CALL nl_get_shw ( intermediate_grid%id, sw )
icoord = iparstrt - sw
jcoord = jparstrt - sw
idim_cd = iide - iids + 1
jdim_cd = ijde - ijds + 1
nlev = ckde - ckds + 1
CALL get_dm_max_halo_width ( ngrid%id , thisdomain_max_halo_width )
msize = 5
CALL rsl_lite_to_child_info( local_communicator, msize*4 &
,cips,cipe,cjps,cjpe &
,iids,iide,ijds,ijde &
,nids,nide,njds,njde &
,pgr , sw &
,ntasks_x,ntasks_y &
,thisdomain_max_halo_width &
,icoord,jcoord &
,idim_cd,jdim_cd &
,pig,pjg,retval )
DO while ( retval .eq. 1 )
IF ( SIZE(grid%hres_fis) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
xv(1)=grid%hres_fis(pig,pjg)
CALL rsl_lite_to_child_msg(4,xv)
ENDIF
IF ( SIZE(grid%sm) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
xv(1)=grid%sm(pig,pjg)
CALL rsl_lite_to_child_msg(4,xv)
ENDIF
IF ( SIZE(grid%pd) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
xv(1)=grid%pd(pig,pjg)
CALL rsl_lite_to_child_msg(4,xv)
ENDIF
IF ( SIZE(grid%fis) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
xv(1)=grid%fis(pig,pjg)
CALL rsl_lite_to_child_msg(4,xv)
ENDIF
CALL rsl_lite_to_child_info( local_communicator, msize*4 &
,cips,cipe,cjps,cjpe &
,iids,iide,ijds,ijde &
,nids,nide,njds,njde &
,pgr , sw &
,ntasks_x,ntasks_y &
,thisdomain_max_halo_width &
,icoord,jcoord &
,idim_cd,jdim_cd &
,pig,pjg,retval )
ENDDO
CALL rsl_lite_bcast_msgs( myproc, nproc, local_comm )
RETURN
END SUBROUTINE parent_to_inter_part1
SUBROUTINE parent_to_inter_part2 ( grid, config_flags ) 1,6
USE module_state_description
USE module_domain
, ONLY : domain, get_ijk_from_grid
USE module_configure
, ONLY : grid_config_rec_type
USE module_dm
, ONLY : ntasks, ntasks_x, ntasks_y, itrace, local_communicator, mytask, &
ipe_save, jpe_save, ips_save, jps_save, get_dm_max_halo_width
USE module_comm_dm
, ONLY : HALO_NMM_INT_UP_sub
IMPLICIT NONE
TYPE(domain), POINTER :: grid
TYPE(domain), POINTER :: cgrid
TYPE(domain), POINTER :: ngrid
INTEGER nlev, msize
INTEGER i,j,pig,pjg,cm,cn,nig,njg,retval,k
TYPE (grid_config_rec_type) :: config_flags
REAL xv(500)
INTEGER :: cids, cide, cjds, cjde, ckds, ckde, &
cims, cime, cjms, cjme, ckms, ckme, &
cips, cipe, cjps, cjpe, ckps, ckpe
INTEGER :: nids, nide, njds, njde, nkds, nkde, &
nims, nime, njms, njme, nkms, nkme, &
nips, nipe, njps, njpe, nkps, nkpe
INTEGER :: ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe
INTEGER idim1,idim2,idim3,idim4,idim5,idim6,idim7
REAL dummy_xs, dummy_xe, dummy_ys, dummy_ye
integer myproc
CALL get_ijk_from_grid
( grid , &
cids, cide, cjds, cjde, ckds, ckde, &
cims, cime, cjms, cjme, ckms, ckme, &
cips, cipe, cjps, cjpe, ckps, ckpe )
cgrid=>grid
nlev = ckde - ckds + 1
!write(0,*) 'IN parent_to_inter_part2'
CALL rsl_lite_from_parent_info(pig,pjg,retval)
DO while ( retval .eq. 1 )
!write(0,*) 'top of loop'
IF ( SIZE(grid%hres_fis) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
CALL rsl_lite_from_parent_msg(4,xv)
grid%hres_fis(pig,pjg) = xv(1)
ENDIF
!write(0,*)'do sm'
IF ( SIZE(grid%sm) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
CALL rsl_lite_from_parent_msg(4,xv)
grid%sm(pig,pjg) = xv(1)
ENDIF
!write(0,*)'do pd'
IF ( SIZE(grid%pd) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
CALL rsl_lite_from_parent_msg(4,xv)
grid%pd(pig,pjg) = xv(1)
ENDIF
!write(0,*)'do fis'
IF ( SIZE(grid%fis) .GT. 1 ) THEN ! okay for intermediate_grid too. see comment in gen_comms.c
CALL rsl_lite_from_parent_msg(4,xv)
grid%fis(pig,pjg) = xv(1)
ENDIF
!write(0,*) 'call rsl_lite_from_parent_info'
CALL rsl_lite_from_parent_info(pig,pjg,retval)
!write(0,*) 'back with retval=',retval
ENDDO
!write(0,*) 'out of loop'
CALL get_ijk_from_grid
( grid , &
ids, ide, jds, jde, kds, kde, &
ims, ime, jms, jme, kms, kme, &
ips, ipe, jps, jpe, kps, kpe )
!write(0,*) 'call HALO_NMM_INT_UP.inc'
#include "HALO_NMM_INT_UP.inc"
!write(0,*) 'back from HALO_NMM_INT_UP.inc'
RETURN
END SUBROUTINE parent_to_inter_part2
#endif
end module module_intermediate_nmm