!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!                  W A R N I N G
!!
!!  This is a temporary version of module_dm.F
!!  It has been compied from somewhere else
!!  (If not DM_PARALLEL then this is module_dm_stubs.F;
!!  otherwise, it is from one of the external package
!!  directories.)
!!
!!                B E   A D V I S E D
!!
!!  Changes to this file are liable to be LOST.
!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!WRF:PACKAGE:RSL 
!

MODULE module_dm 45

   USE module_machine
   USE module_state_description
   USE module_wrf_error

#include <rsl.inc>

   INTEGER msg_z, msg_x, msg_y
   INTEGER msg,messages(168)
   INTEGER invalid_message_value
   INTEGER x_period_flag, y_period_flag
   INTEGER msg_msg
   INTEGER &
      n5w5 ,n5w4 ,n5w3 ,n5w2 ,n5w ,n5 ,n5e ,n5e2 ,n5e3 ,n5e4 ,n5e5  &
     ,n4w5 ,n4w4 ,n4w3 ,n4w2 ,n4w ,n4 ,n4e ,n4e2 ,n4e3 ,n4e4 ,n4e5  &
     ,n3w5 ,n3w4 ,n3w3 ,n3w2 ,n3w ,n3 ,n3e ,n3e2 ,n3e3 ,n3e4 ,n3e5  &
     ,n2w5 ,n2w4 ,n2w3 ,n2w2 ,n2w ,n2 ,n2e ,n2e2 ,n2e3 ,n2e4 ,n2e5  &
     ,nw5  ,nw4  ,nw3  ,nw2  ,nw  ,n1 ,ne  ,ne2  ,ne3  ,ne4  ,ne5   &
     ,w5   ,w4   ,w3   ,w2   ,w1      ,e1  ,e2   ,e3   ,e4   ,e5    &
     ,sw5  ,sw4  ,sw3  ,sw2  ,sw  ,s1 ,se  ,se2  ,se3  ,se4  ,se5   &
     ,s2w5 ,s2w4 ,s2w3 ,s2w2 ,s2w ,s2 ,s2e ,s2e2 ,s2e3 ,s2e4 ,s2e5  &
     ,s3w5 ,s3w4 ,s3w3 ,s3w2 ,s3w ,s3 ,s3e ,s3e2 ,s3e3 ,s3e4 ,s3e5  &
     ,s4w5 ,s4w4 ,s4w3 ,s4w2 ,s4w ,s4 ,s4e ,s4e2 ,s4e3 ,s4e4 ,s4e5  &
     ,s5w5 ,s5w4 ,s5w3 ,s5w2 ,s5w ,s5 ,s5e ,s5e2 ,s5e3 ,s5e4 ,s5e5
   INTEGER glen(3), llen(3), decomp(3), decompx(3), decompy(3), decompxy(3)
   INTEGER glen2d(2), llen2d(2), decomp2d(2), decompx2d(2), decompy2d(2), decompxy2d(2)
   INTEGER glenx(3), gleny(3), glenxy(3)
   INTEGER llenx(3), lleny(3), llenxy(3)
   INTEGER glenx2d(2), gleny2d(2), glenxy2d(2)
   INTEGER llenx2d(2), lleny2d(2), llenxy2d(2)
   INTEGER llen_tx(3)
   INTEGER llen_ty(3)
   INTEGER ips_save, jps_save
   INTEGER ipe_save, jpe_save

#if ( RWORDSIZE != DWORDSIZE )

   INTERFACE add_msg_xpose
     MODULE PROCEDURE add_msg_xpose_real, add_msg_xpose_integer, add_msg_xpose_doubleprecision
   END INTERFACE

   INTERFACE add_msg_4pt 3
     MODULE PROCEDURE add_msg_4pt_real, add_msg_4pt_integer, add_msg_4pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_8pt 6
     MODULE PROCEDURE add_msg_8pt_real, add_msg_8pt_integer, add_msg_8pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_12pt
     MODULE PROCEDURE add_msg_12pt_real, add_msg_12pt_integer, add_msg_12pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_24pt 3
     MODULE PROCEDURE add_msg_24pt_real, add_msg_24pt_integer, add_msg_24pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_48pt
     MODULE PROCEDURE add_msg_48pt_real, add_msg_48pt_integer, add_msg_48pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_80pt 3
     MODULE PROCEDURE add_msg_80pt_real, add_msg_80pt_integer, add_msg_80pt_doubleprecision
   END INTERFACE

   INTERFACE add_msg_120pt
     MODULE PROCEDURE add_msg_120pt_real, add_msg_120pt_integer, add_msg_120pt_doubleprecision
   END INTERFACE
#else

   INTERFACE add_msg_xpose
     MODULE PROCEDURE add_msg_xpose_real, add_msg_xpose_integer
   END INTERFACE

   INTERFACE add_msg_4pt 3
     MODULE PROCEDURE add_msg_4pt_real, add_msg_4pt_integer
   END INTERFACE

   INTERFACE add_msg_8pt 6
     MODULE PROCEDURE add_msg_8pt_real, add_msg_8pt_integer
   END INTERFACE

   INTERFACE add_msg_12pt
     MODULE PROCEDURE add_msg_12pt_real, add_msg_12pt_integer
   END INTERFACE

   INTERFACE add_msg_24pt 3
     MODULE PROCEDURE add_msg_24pt_real, add_msg_24pt_integer
   END INTERFACE

   INTERFACE add_msg_48pt
     MODULE PROCEDURE add_msg_48pt_real, add_msg_48pt_integer
   END INTERFACE

   INTERFACE add_msg_80pt 3
     MODULE PROCEDURE add_msg_80pt_real, add_msg_80pt_integer
   END INTERFACE

   INTERFACE add_msg_120pt
     MODULE PROCEDURE add_msg_120pt_real, add_msg_120pt_integer
   END INTERFACE
#endif

#ifdef D3VAR_KLUDGE
#define TRUE_RSL_REAL     RSL_DOUBLE
#define TRUE_RSL_REAL_F90 RSL_DOUBLE_F90
#else
#define TRUE_RSL_REAL     RSL_REAL
#define TRUE_RSL_REAL_F90 RSL_REAL_F90
#endif

CONTAINS


   SUBROUTINE MPASPECT( P, MINM, MINN, PROCMIN_M, PROCMIN_N ) 1,7
      INTEGER P, M, N, MINI, MINM, MINN, PROCMIN_M, PROCMIN_N
      MINI = 2*P
      MINM = 1
      MINN = P
      DO M = 1, P
        IF ( MOD( P, M ) .EQ. 0 ) THEN
          N = P / M
          IF ( ABS(M-N) .LT. MINI                &
               .AND. M .GE. PROCMIN_M            &
               .AND. N .GE. PROCMIN_N            &
             ) THEN
            MINI = ABS(M-N)
            MINM = M
            MINN = N
          ENDIF
        ENDIF
      ENDDO
      IF ( MINM .LT. PROCMIN_M .OR. MINN .LT. PROCMIN_N ) THEN
        WRITE( wrf_err_message , * )'MPASPECT: UNABLE TO GENERATE PROCESSOR MESH.  STOPPING.'
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        WRITE(0,*)' PROCMIN_M ', PROCMIN_M
        WRITE( wrf_err_message , * )' PROCMIN_M ', PROCMIN_M
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        WRITE( wrf_err_message , * )' PROCMIN_N ', PROCMIN_N
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        WRITE( wrf_err_message , * )' P         ', P
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        WRITE( wrf_err_message , * )' MINM      ', MINM
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        WRITE( wrf_err_message , * )' MINN      ', MINN
        CALL wrf_message ( TRIM ( wrf_err_message ) )
        CALL wrf_error_fatal ( 'module_dm: mpaspect' )
      ENDIF
   RETURN
   END SUBROUTINE MPASPECT



   SUBROUTINE wrf_dm_initialize 8,1
      integer nproc_lt, nproc_ln
      CALL RSL_SET_REGULAR_DECOMP
      CALL mpaspect( rsl_nproc , nproc_lt , nproc_ln , 1 , 1 )
      CALL RSL_MESH( nproc_lt, nproc_ln )
#ifdef NMM_CORE
      CALL rsl_set_padarea ( 6 )
#endif
      invalid_message_value = RSL_INVALID
      x_period_flag         = RSL_M
      y_period_flag         = RSL_N
      RETURN
   END SUBROUTINE wrf_dm_initialize

! xpose additions, 20000302


   SUBROUTINE reset_msgs_xpose
      IMPLICIT NONE
      CALL rsl_create_message ( msg_z )
      CALL rsl_create_message ( msg_x )
      CALL rsl_create_message ( msg_y )
   END SUBROUTINE reset_msgs_xpose


   SUBROUTINE add_msg_xpose_real( fld_z, fld_x, fld_y, dim ) 2
      IMPLICIT NONE
      real fld_z(*), fld_x(*), fld_y(*)
      integer dim
      if (      dim == 3 ) then
        CALL rsl_build_message(msg_z,TRUE_RSL_REAL_F90,fld_z,dim,decomp(1),glen(1),llen(1))
#ifdef D3VAR_IRY_KLUDGE
!
! The transpose utility was developed in RSL originally with MM5 3DVAR in mind, and the way
! the implementers worked around the I->Y issue was by calling I->X in the Registry but then
! calling the other (Z2Y) transpose throughout the code to effect the correct orientation.
! The result is that although it's basically wrong here for codes that actually are I->X,
! we cannot fix it without breaking 3DVAR. Hence the KLUDGE to keep it the old wrong way
! for 3DVAR and fix it for everyone else. There was already a D3VAR_KLUDGE needed in the
! registry anyway, to make sure the WRF I/O API gets called properly -- again, to manage
! this MM5 assumption that was hidden in the 3DVAR code -- so we can make use of that here.
! This needs to be revisited once the I->Y assumption is purged from 3DVAR. JM 20020910
!
        CALL rsl_build_message(msg_x,TRUE_RSL_REAL_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))
        CALL rsl_build_message(msg_y,TRUE_RSL_REAL_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))
#else
        CALL rsl_build_message(msg_y,TRUE_RSL_REAL_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))  ! msg_y->msg_x 20020908
        CALL rsl_build_message(msg_x,TRUE_RSL_REAL_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))  ! msg_x->msg_y 20020908
#endif
      endif
   END SUBROUTINE add_msg_xpose_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_xpose_doubleprecision( fld_z, fld_x, fld_y, dim ) 1
      IMPLICIT NONE
      doubleprecision fld_z(*), fld_x(*), fld_y(*)
      integer dim
      if (      dim == 3 ) then
        CALL rsl_build_message(msg_z,RSL_DOUBLE_F90,fld_z,dim,decomp(1),glen(1),llen(1))
#ifdef D3VAR_IRY_KLUDGE
        CALL rsl_build_message(msg_x,RSL_DOUBLE_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))
        CALL rsl_build_message(msg_y,RSL_DOUBLE_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))
#else
        CALL rsl_build_message(msg_y,RSL_DOUBLE_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))  ! msg_y->msg_x 20020908
        CALL rsl_build_message(msg_x,RSL_DOUBLE_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))  ! msg_x->msg_y 20020908
#endif
      endif
   END SUBROUTINE add_msg_xpose_doubleprecision
#endif



   SUBROUTINE add_msg_xpose_integer ( fld_z, fld_x, fld_y, dim ) 2
      IMPLICIT NONE
      integer fld_z(*), fld_x(*), fld_y(*)
      integer dim
      if (      dim == 3 ) then
        CALL rsl_build_message(msg_z,TRUE_RSL_REAL_F90,fld_z,dim,decomp(1),glen(1),llen(1))
#ifdef D3VAR_IRY_KLUDGE
        CALL rsl_build_message(msg_x,RSL_INTEGER_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))
        CALL rsl_build_message(msg_y,RSL_INTEGER_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))
#else
        CALL rsl_build_message(msg_y,RSL_INTEGER_F90,fld_x,dim,decomp(1),glen(1),llen_tx(1))  ! msg_y->msg_x 20020908
        CALL rsl_build_message(msg_x,RSL_INTEGER_F90,fld_y,dim,decomp(1),glen(1),llen_ty(1))  ! msg_x->msg_y 20020908
#endif
      endif
   END SUBROUTINE add_msg_xpose_integer


   SUBROUTINE define_xpose ( did, xp )
      IMPLICIT NONE
      INTEGER did , xp
      CALL rsl_create_xpose ( xp )
      CALL rsl_describe_xpose ( did , xp , msg_z , msg_x , msg_y )
   END SUBROUTINE define_xpose

! end xpose additions, 20000302

!      n5w5 ,n5w4 ,n5w3 ,n5w2 ,n5w ,n5 ,n5e ,n5e2 ,n5e3 ,n5e4 ,n5e5  &
!     ,n4w5 ,n4w4 ,n4w3 ,n4w2 ,n4w ,n4 ,n4e ,n4e2 ,n4e3 ,n4e4 ,n4e5  &
!     ,n3w5 ,n3w4 ,n3w3 ,n3w2 ,n3w ,n3 ,n3e ,n3e2 ,n3e3 ,n3e4 ,n3e5  &
!     ,n2w5 ,n2w4 ,n2w3 ,n2w2 ,n2w ,n2 ,n2e ,n2e2 ,n2e3 ,n2e4 ,n2e5  &
!     ,nw5  ,nw4  ,nw3  ,nw2  ,nw  ,n1 ,ne  ,ne2  ,ne3  ,ne4  ,ne5   &
!     ,w5   ,w4   ,w3   ,w2   ,w1      ,e1  ,e2   ,e3   ,e4   ,e5    &
!     ,sw5  ,sw4  ,sw3  ,sw2  ,sw  ,s1 ,se  ,se2  ,se3  ,se4  ,se5   &
!     ,s2w5 ,s2w4 ,s2w3 ,s2w2 ,s2w ,s2 ,s2e ,s2e2 ,s2e3 ,s2e4 ,s2e5  &
!     ,s3w5 ,s3w4 ,s3w3 ,s3w2 ,s3w ,s3 ,s3e ,s3e2 ,s3e3 ,s3e4 ,s3e5  &
!     ,s4w5 ,s4w4 ,s4w3 ,s4w2 ,s4w ,s4 ,s4e ,s4e2 ,s4e3 ,s4e4 ,s4e5  &
!     ,s5w5 ,s5w4 ,s5w3 ,s5w2 ,s5w ,s5 ,s5e ,s5e2 ,s5e3 ,s5e4 ,s5e5


   SUBROUTINE reset_msgs_120pt,1
      CALL reset_msgs_80pt
#if 0
      CALL rsl_create_message(n5w5)
      CALL rsl_create_message(n5w4)
      CALL rsl_create_message(n5w3)
      CALL rsl_create_message(n5w2)
      CALL rsl_create_message(n5w )
      CALL rsl_create_message(n5)
      CALL rsl_create_message(n5e )
      CALL rsl_create_message(n5e2)
      CALL rsl_create_message(n5e3)
      CALL rsl_create_message(n5e4)
      CALL rsl_create_message(n5e5)
      CALL rsl_create_message(n4w5)
      CALL rsl_create_message(n3w5)
      CALL rsl_create_message(n2w5)
      CALL rsl_create_message(nw5)
      CALL rsl_create_message(w5)
      CALL rsl_create_message(sw5)
      CALL rsl_create_message(s2w5)
      CALL rsl_create_message(s3w5)
      CALL rsl_create_message(s4w5)
      CALL rsl_create_message(n4e5)
      CALL rsl_create_message(n3e5)
      CALL rsl_create_message(n2e5)
      CALL rsl_create_message(ne5)
      CALL rsl_create_message(e5)
      CALL rsl_create_message(se5)
      CALL rsl_create_message(s2e5)
      CALL rsl_create_message(s3e5)
      CALL rsl_create_message(s4e5)
      CALL rsl_create_message(s5w5)
      CALL rsl_create_message(s5w4)
      CALL rsl_create_message(s5w3)
      CALL rsl_create_message(s5w2)
      CALL rsl_create_message(s5w )
      CALL rsl_create_message(s5)
      CALL rsl_create_message(s5e )
      CALL rsl_create_message(s5e2)
      CALL rsl_create_message(s5e3)
      CALL rsl_create_message(s5e4)
      CALL rsl_create_message(s5e5)
#endif
   END SUBROUTINE reset_msgs_120pt


   SUBROUTINE reset_msgs_80pt 1,1
#if 1
      CALL rsl_create_message(msg_msg)
#else
      CALL reset_msgs_48pt
      CALL rsl_create_message(n4w4)
      CALL rsl_create_message(n4w3)
      CALL rsl_create_message(n4w2)
      CALL rsl_create_message(n4w )
      CALL rsl_create_message(n4)
      CALL rsl_create_message(n4e )
      CALL rsl_create_message(n4e2)
      CALL rsl_create_message(n4e3)
      CALL rsl_create_message(n4e4)
      CALL rsl_create_message(n3w4)
      CALL rsl_create_message(n2w4)
      CALL rsl_create_message(nw4)
      CALL rsl_create_message(w4)
      CALL rsl_create_message(sw4)
      CALL rsl_create_message(s2w4)
      CALL rsl_create_message(s3w4)
      CALL rsl_create_message(n3e4)
      CALL rsl_create_message(n2e4)
      CALL rsl_create_message(ne4)
      CALL rsl_create_message(e4)
      CALL rsl_create_message(se4)
      CALL rsl_create_message(s2e4)
      CALL rsl_create_message(s3e4)
      CALL rsl_create_message(s4w4)
      CALL rsl_create_message(s4w3)
      CALL rsl_create_message(s4w2)
      CALL rsl_create_message(s4w )
      CALL rsl_create_message(s4)
      CALL rsl_create_message(s4e )
      CALL rsl_create_message(s4e2)
      CALL rsl_create_message(s4e3)
      CALL rsl_create_message(s4e4)
#endif
   END SUBROUTINE reset_msgs_80pt


   SUBROUTINE reset_msgs_48pt 12,1
      CALL reset_msgs_24pt
      CALL rsl_create_message(n3w3)
      CALL rsl_create_message(n3w2)
      CALL rsl_create_message(n3w )
      CALL rsl_create_message(n3)
      CALL rsl_create_message(n3e )
      CALL rsl_create_message(n3e2)
      CALL rsl_create_message(n3e3)
      CALL rsl_create_message(n2w3)
      CALL rsl_create_message(n2e3)
      CALL rsl_create_message(nw3)
      CALL rsl_create_message(ne3)
      CALL rsl_create_message(w3)
      CALL rsl_create_message(e3)
      CALL rsl_create_message(sw3)
      CALL rsl_create_message(se3)
      CALL rsl_create_message(s2w3)
      CALL rsl_create_message(s2e3)
      CALL rsl_create_message(s3w3)
      CALL rsl_create_message(s3w2)
      CALL rsl_create_message(s3w )
      CALL rsl_create_message(s3)
      CALL rsl_create_message(s3e )
      CALL rsl_create_message(s3e2)
      CALL rsl_create_message(s3e3)
      RETURN
   END SUBROUTINE reset_msgs_48pt


   SUBROUTINE reset_msgs_24pt 8,1
      CALL reset_msgs_12pt
      CALL rsl_create_message(n2w2)
      CALL rsl_create_message(n2w)
      CALL rsl_create_message(n2e)
      CALL rsl_create_message(n2e2)
      CALL rsl_create_message(nw2)
      CALL rsl_create_message(ne2)
      CALL rsl_create_message(sw2)
      CALL rsl_create_message(se2)
      CALL rsl_create_message(s2w2)
      CALL rsl_create_message(s2w)
      CALL rsl_create_message(s2e)
      CALL rsl_create_message(s2e2)
      RETURN
   END SUBROUTINE reset_msgs_24pt


   SUBROUTINE reset_msgs_12pt 1,1
      CALL reset_msgs_8pt
      call rsl_create_message(n2)
      call rsl_create_message(w2)
      call rsl_create_message(e2)
      call rsl_create_message(s2)
      RETURN
   END SUBROUTINE reset_msgs_12pt


   SUBROUTINE reset_msgs_8pt 5,1
      call reset_msgs_4pt
      call rsl_create_message(ne)
      call rsl_create_message(nw)
      call rsl_create_message(se)
      call rsl_create_message(sw)
      RETURN
   END SUBROUTINE reset_msgs_8pt


   SUBROUTINE reset_msgs_4pt 12
      call rsl_create_message(n1)
      call rsl_create_message(w1)
      call rsl_create_message(e1)
      call rsl_create_message(s1)
      RETURN
   END SUBROUTINE reset_msgs_4pt


   SUBROUTINE reset_msgs_y_shift 1
      call rsl_create_message(s5)
      call rsl_create_message(s4)
      call rsl_create_message(s3)
      call rsl_create_message(s2)
      call rsl_create_message(s1)
      call rsl_create_message(n1)
      call rsl_create_message(n2)
      call rsl_create_message(n3)
      call rsl_create_message(n4)
      call rsl_create_message(n5)
      RETURN
   END SUBROUTINE reset_msgs_y_shift


   SUBROUTINE reset_msgs_x_shift 1
      call rsl_create_message(w5)
      call rsl_create_message(w4)
      call rsl_create_message(w3)
      call rsl_create_message(w2)
      call rsl_create_message(w1)
      call rsl_create_message(e1)
      call rsl_create_message(e2)
      call rsl_create_message(e3)
      call rsl_create_message(e4)
      call rsl_create_message(e5)
      RETURN
   END SUBROUTINE reset_msgs_x_shift


   SUBROUTINE add_msg_x_shift_real ( fld, kdim ) 223
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w5,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w4,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e4,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e5,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w5,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w4,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e4,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e5,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_x_shift_real

   SUBROUTINE add_msg_y_shift_real ( fld, kdim ) 223
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(s5,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s4,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n4,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n5,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(s5,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s4,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n4,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n5,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_y_shift_real


   SUBROUTINE add_msg_x_shift_integer ( fld, kdim ) 7
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w5,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w4,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e4,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e5,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w5,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w4,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e4,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e5,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_x_shift_integer

   SUBROUTINE add_msg_y_shift_integer ( fld, kdim ) 7
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(s5,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s4,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n4,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n5,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(s5,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s4,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n4,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n5,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_y_shift_integer


   SUBROUTINE add_msg_x_shift_doubleprecision ( fld, kdim )
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w5,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w4,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e4,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e5,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w5,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w4,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e4,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e5,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_x_shift_doubleprecision

   SUBROUTINE add_msg_y_shift_doubleprecision ( fld, kdim )
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(s5,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s4,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n4,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n5,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(s5,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s4,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n4,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n5,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_y_shift_doubleprecision


   SUBROUTINE add_msg_4pt_real ( fld , kdim ) 63
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim   
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_4pt_real

#if (  RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_4pt_doubleprecision ( fld , kdim ) 1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_4pt_doubleprecision
#endif



   SUBROUTINE add_msg_4pt_integer ( fld , kdim ) 2
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim   
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      if      ( kdim  > 1 ) then
        CALL rsl_build_message(w1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n1,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n1,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_4pt_integer


   SUBROUTINE add_msg_8pt_real ( fld , kdim ) 39,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim   
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_4pt ( fld , kdim )
      if (      kdim >  1 ) then
        CALL rsl_build_message(nw,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(nw,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_8pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_8pt_doubleprecision ( fld , kdim ) 1,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      CALL add_msg_4pt ( fld , kdim )
      if (      kdim >  1 ) then
        CALL rsl_build_message(nw,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(nw,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_8pt_doubleprecision
#endif



   SUBROUTINE add_msg_8pt_integer( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim  
         CASE DEFAULT
      END SELECT
      CALL add_msg_4pt ( fld , kdim )
      if (      kdim >  1 ) then
        CALL rsl_build_message(nw,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(nw,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_8pt_integer


   SUBROUTINE add_msg_12pt_real ( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_12pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_12pt_doubleprecision ( fld , kdim ) 1,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_12pt_doubleprecision
#endif



   SUBROUTINE add_msg_12pt_integer ( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_12pt_integer


   SUBROUTINE add_msg_24pt_real ( fld , kdim ) 70,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n2w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n2w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_24pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_24pt_doubleprecision ( fld , kdim ) 1,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n2w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n2w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_24pt_doubleprecision
#endif



   SUBROUTINE add_msg_24pt_integer ( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      CALL add_msg_8pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n2w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n2w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_24pt_integer


   SUBROUTINE add_msg_48pt_real ( fld , kdim ) 113,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_24pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n3w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e2,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e3,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n3w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e2,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e3,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_48pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_48pt_doubleprecision ( fld , kdim ) 1,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_24pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n3w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e2,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e3,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n3w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e2,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e3,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_48pt_doubleprecision
#endif


   SUBROUTINE add_msg_48pt_integer ( fld , kdim ) 4,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      CALL add_msg_24pt ( fld , kdim )
      if      ( kdim >  1 ) then
        CALL rsl_build_message(n3w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3w,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n3e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(n2e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(nw3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(ne3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(sw3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(se3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s2e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3w,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e2,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
        CALL rsl_build_message(s3e3,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(n3w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3w,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n3e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(n2e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(nw3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(ne3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(sw3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(se3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s2e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3w,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e2,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
        CALL rsl_build_message(s3e3,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_48pt_integer



   SUBROUTINE add_msg_80pt_real ( fld , kdim ) 2
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      if      ( kdim >  1 ) then
        CALL rsl_build_message(msg_msg,TRUE_RSL_REAL_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(msg_msg,TRUE_RSL_REAL_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_80pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_80pt_doubleprecision ( fld , kdim ) 1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim   
         CASE DEFAULT
      END SELECT
      if      ( kdim >  1 ) then
        CALL rsl_build_message(msg_msg,RSL_DOUBLE_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(msg_msg,RSL_DOUBLE_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_80pt_doubleprecision 
#endif


   SUBROUTINE add_msg_80pt_integer ( fld , kdim ) 2
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = kdim    ; ll(2) = kdim
           gl(3) = glen(3) ; ll(3) = llen(3)
         CASE ( DATA_ORDER_XYZ )
           gl(1) = glen(1) ; ll(1) = llen(1)
           gl(2) = glen(2) ; ll(2) = llen(2)
           gl(3) = kdim    ; ll(3) = kdim
         CASE DEFAULT
      END SELECT
      if      ( kdim >  1 ) then
        CALL rsl_build_message(msg_msg,RSL_INTEGER_F90,fld,3,decomp(1),gl(1),ll(1))
      else if ( kdim == 1 ) then
        CALL rsl_build_message(msg_msg,RSL_INTEGER_F90,fld,2,decomp2d(1),glen2d(1),llen2d(1))
      endif
      RETURN
   END SUBROUTINE add_msg_80pt_integer


   SUBROUTINE add_msg_120pt_real ( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      real fld(*)
      CALL add_msg_80pt ( fld , kdim )
      RETURN
   END SUBROUTINE add_msg_120pt_real

#if ( RWORDSIZE != DWORDSIZE )

   SUBROUTINE add_msg_120pt_doubleprecision ( fld , kdim ) 1,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      doubleprecision fld(*)
      CALL add_msg_80pt ( fld , kdim )
      RETURN
   END SUBROUTINE add_msg_120pt_doubleprecision
#endif


   SUBROUTINE add_msg_120pt_integer ( fld , kdim ) 2,1
      IMPLICIT NONE
      integer kdim, gl(3), ll(3)
      integer fld(*)
      CALL add_msg_80pt ( fld , kdim )
      RETURN
   END SUBROUTINE add_msg_120pt_integer


   SUBROUTINE stencil_x_shift ( did , stenid ) 1
      IMPLICIT NONE
      INTEGER did, stenid
      messages = RSL_INVALID
      messages(22) = w3
      messages(23) = w2
      messages(24) = w1
      messages(25) = e1
      messages(26) = e2
      messages(27) = e3
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_48PT, messages )
      RETURN
   END SUBROUTINE stencil_x_shift


   SUBROUTINE stencil_y_shift ( did , stenid ) 1
      IMPLICIT NONE
      INTEGER did, stenid
      messages = RSL_INVALID
      messages( 4) = n3
      messages(11) = n2
      messages(18) = n1
      messages(31) = s1
      messages(38) = s2
      messages(45) = s3
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_48PT, messages )
      RETURN
   END SUBROUTINE stencil_y_shift


   SUBROUTINE stencil_4pt ( did, stenid ) 11
      IMPLICIT NONE
      INTEGER did, stenid
      messages(1) =          n1
      messages(2) =   w1
      messages(3) =                 e1
      messages(4) =          s1
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_4PT, messages )
      RETURN
   END SUBROUTINE stencil_4pt


   SUBROUTINE stencil_8pt ( did, stenid ) 4
      IMPLICIT NONE
      INTEGER did, stenid
      messages(1) =   nw
      messages(2) =          n1
      messages(3) =                 ne
      messages(4) =   w1
      messages(5) =                 e1
      messages(6) =   sw
      messages(7) =          s1
      messages(8) =                 se
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_8PT, messages )
      RETURN
   END SUBROUTINE stencil_8pt


   SUBROUTINE stencil_12pt ( did, stenid )
      IMPLICIT NONE
      INTEGER did, stenid
      messages(1)  =                 n2
      messages(2)  =          nw
      messages(3)  =                 n1
      messages(4)  =                           ne
      messages(5)  =  w2
      messages(6)  =          w1                  
      messages(7)  =                           e1
      messages(8)  =                                    e2
      messages(9)  =          sw
      messages(10) =                 s1
      messages(11) =                           se
      messages(12) =                 s2
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_12PT, messages )
      RETURN
   END SUBROUTINE stencil_12pt


   SUBROUTINE stencil_24pt ( did, stenid ) 7
      IMPLICIT NONE
      INTEGER did, stenid, i
      messages( 1) = n2w2
      messages( 2) = n2w
      messages( 3) = n2
      messages( 4) = n2e
      messages( 5) = n2e2
      messages( 6) = nw2
      messages( 7) = nw
      messages( 8) = n1
      messages( 9) = ne
      messages(10) = ne2
      messages(11) = w2
      messages(12) = w1
      messages(13) = e1
      messages(14) = e2
      messages(15) = sw2
      messages(16) = sw
      messages(17) = s1
      messages(18) = se
      messages(19) = se2
      messages(20) = s2w2
      messages(21) = s2w
      messages(22) = s2
      messages(23) = s2e
      messages(24) = s2e2
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_24PT, messages )
      RETURN
   END SUBROUTINE stencil_24pt


   SUBROUTINE stencil_48pt ( did, stenid ) 11
      IMPLICIT NONE
      INTEGER did, stenid, i
      messages( 1) = n3w3
      messages( 2) = n3w2
      messages( 3) = n3w
      messages( 4) = n3
      messages( 5) = n3e
      messages( 6) = n3e2
      messages( 7) = n3e3
      messages( 8) = n2w3
      messages( 9) = n2w2
      messages(10) = n2w
      messages(11) = n2
      messages(12) = n2e
      messages(13) = n2e2
      messages(14) = n2e3
      messages(15) = nw3
      messages(16) = nw2
      messages(17) = nw
      messages(18) = n1
      messages(19) = ne
      messages(20) = ne2
      messages(21) = ne3
      messages(22) = w3
      messages(23) = w2
      messages(24) = w1
      messages(25) = e1
      messages(26) = e2
      messages(27) = e3
      messages(28) = sw3
      messages(29) = sw2
      messages(30) = sw
      messages(31) = s1
      messages(32) = se
      messages(33) = se2
      messages(34) = se3
      messages(35) = s2w3
      messages(36) = s2w2
      messages(37) = s2w
      messages(38) = s2
      messages(39) = s2e
      messages(40) = s2e2
      messages(41) = s2e3
      messages(42) = s3w3
      messages(43) = s3w2
      messages(44) = s3w
      messages(45) = s3
      messages(46) = s3e
      messages(47) = s3e2
      messages(48) = s3e3
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_48PT, messages )
      RETURN
   END SUBROUTINE stencil_48pt


   SUBROUTINE stencil_80pt ( did, stenid )
      IMPLICIT NONE
      INTEGER did, stenid, i
#if 1
      do i = 1, 80
         messages(i) = msg_msg
      enddo
#else
messages(1)= 	n4w4
messages(2)= 	n4w3
messages(3)= 	n4w2
messages(4)= 	n4w
messages(5)= 	n4
messages(6)= 	n4e
messages(7)= 	n4e2
messages(8)= 	n4e3
messages(9)= 	n4e4
messages(10)= 	n3w4
messages(11)= 	n3w3
messages(12)= 	n3w2
messages(13)= 	n3w
messages(14)= 	n3
messages(15)= 	n3e
messages(16)= 	n3e2
messages(17)= 	n3e3
messages(18)= 	n3e4
messages(19)= 	n2w4
messages(20)= 	n2w3
messages(21)= 	n2w2
messages(22)= 	n2w
messages(23)= 	n2
messages(24)= 	n2e
messages(25)= 	n2e2
messages(26)= 	n2e3
messages(27)= 	n2e4
messages(28)= 	nw4
messages(29)= 	nw3
messages(30)= 	nw2
messages(31)= 	nw
messages(32)= 	n1
messages(33)= 	ne
messages(34)= 	ne2
messages(35)= 	ne3
messages(36)= 	ne4
messages(37)= 	w4
messages(38)= 	w3
messages(39)= 	w2
messages(40)= 	w1
messages(41)= 	e1
messages(42)= 	e2
messages(43)= 	e3
messages(44)= 	e4
messages(45)= 	sw4
messages(46)= 	sw3
messages(47)= 	sw2
messages(48)= 	sw
messages(49)= 	s1
messages(50)= 	se
messages(51)= 	se2
messages(52)= 	se3
messages(53)= 	se4
messages(54)= 	s2w4
messages(55)= 	s2w3
messages(56)= 	s2w2
messages(57)= 	s2w
messages(58)= 	s2
messages(59)= 	s2e
messages(60)= 	s2e2
messages(61)= 	s2e3
messages(62)= 	s2e4
messages(63)= 	s3w4
messages(64)= 	s3w3
messages(65)= 	s3w2
messages(66)= 	s3w
messages(67)= 	s3
messages(68)= 	s3e
messages(69)= 	s3e2
messages(70)= 	s3e3
messages(71)= 	s3e4
messages(72)= 	s4w4
messages(73)= 	s4w3
messages(74)= 	s4w2
messages(75)= 	s4w
messages(76)= 	s4
messages(77)= 	s4e
messages(78)= 	s4e2
messages(79)= 	s4e3
messages(80)= 	s4e4
#endif
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_80PT, messages )
      RETURN
   END SUBROUTINE stencil_80pt


   SUBROUTINE stencil_120pt ( did, stenid )
      IMPLICIT NONE
      INTEGER did, stenid, i
#if 1
      do i = 1, 120
         messages(i) = msg_msg
      enddo
#else
messages(1)=	n5w5
messages(2)=	n5w4
messages(3)=	n5w3
messages(4)=	n5w2
messages(5)=	n5w
messages(6)=	n5
messages(7)=	n5e
messages(8)=	n5e2
messages(9)=	n5e3
messages(10)=	n5e4
messages(11)=	n5e5
messages(12)=	n4w5
messages(13)=	n4w4
messages(14)=	n4w3
messages(15)=	n4w2
messages(16)=	n4w
messages(17)=	n4
messages(18)=	n4e
messages(19)=	n4e2
messages(20)=	n4e3
messages(21)=	n4e4
messages(22)=	n4e5
messages(23)=	n3w5
messages(24)=	n3w4
messages(25)=	n3w3
messages(26)=	n3w2
messages(27)=	n3w
messages(28)=	n3
messages(29)=	n3e
messages(30)=	n3e2
messages(31)=	n3e3
messages(32)=	n3e4
messages(33)=	n3e5
messages(34)=	n2w5
messages(35)=	n2w4
messages(36)=	n2w3
messages(37)=	n2w2
messages(38)=	n2w
messages(39)=	n2
messages(40)=	n2e
messages(41)=	n2e2
messages(42)=	n2e3
messages(43)=	n2e4
messages(44)=	n2e5
messages(45)=	nw5
messages(46)=	nw4
messages(47)=	nw3
messages(48)=	nw2
messages(49)=	nw
messages(50)=	n1
messages(51)=	ne
messages(52)=	ne2
messages(53)=	ne3
messages(54)=	ne4
messages(55)=	ne5
messages(56)=	w5
messages(57)=	w4
messages(58)=	w3
messages(59)=	w2
messages(60)=	w1
messages(61)=	e1
messages(62)=	e2
messages(63)=	e3
messages(64)=	e4
messages(65)=	e5
messages(66)=	sw5
messages(67)=	sw4
messages(68)=	sw3
messages(69)=	sw2
messages(70)=	sw
messages(71)=	s1
messages(72)=	se
messages(73)=	se2
messages(74)=	se3
messages(75)=	se4
messages(76)=	se5
messages(77)=	s2w5
messages(78)=	s2w4
messages(79)=	s2w3
messages(80)=	s2w2
messages(81)=	s2w
messages(82)=	s2
messages(83)=	s2e
messages(84)=	s2e2
messages(85)=	s2e3
messages(86)=	s2e4
messages(87)=	s2e5
messages(88)=	s3w5
messages(89)=	s3w4
messages(90)=	s3w3
messages(91)=	s3w2
messages(92)=	s3w
messages(93)=	s3
messages(94)=	s3e
messages(95)=	s3e2
messages(96)=	s3e3
messages(97)=	s3e4
messages(98)=	s3e5
messages(99)=	s4w5
messages(100)=	s4w4
messages(101)=	s4w3
messages(102)=	s4w2
messages(103)=	s4w
messages(104)=	s4
messages(105)=	s4e
messages(106)=	s4e2
messages(107)=	s4e3
messages(108)=	s4e4
messages(109)=	s4e5
messages(110)=	s5w5
messages(111)=	s5w4
messages(112)=	s5w3
messages(113)=	s5w2
messages(114)=	s5w
messages(115)=	s5
messages(116)=	s5e
messages(117)=	s5e2
messages(118)=	s5e3
messages(119)=	s5e4
messages(120)=	s5e5
#endif
      CALL rsl_create_stencil( stenid )
      CALL rsl_describe_stencil ( did, stenid, RSL_120PT, messages )
      RETURN
   END SUBROUTINE stencil_120pt


   SUBROUTINE setup_halo_rsl( grid ) 36,1
       USE module_domain
       IMPLICIT NONE
       TYPE(domain) , INTENT (INOUT) :: grid 
      INTEGER i, kms, ims, jms
   ! executable
      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_ZXY )
            kms = grid%sm31
            ims = grid%sm32
            jms = grid%sm33
            decomp(1) = RSL_NOTDECOMPOSED
            decomp(2) = RSL_M
            decomp(3) = RSL_N
            decomp2d(1) = RSL_M
            decomp2d(2) = RSL_N
            glen2d(1) = grid%ed32 - grid%sd32 + 1
            glen2d(2) = grid%ed33 - grid%sd33 + 1
            llen2d(1) = grid%em32 - grid%sm32 + 1
            llen2d(2) = grid%em33 - grid%sm33 + 1
         CASE ( DATA_ORDER_XYZ )
            kms = grid%sm33
            ims = grid%sm31
            jms = grid%sm32
            decomp(1) = RSL_M
            decomp(2) = RSL_N
            decomp(3) = RSL_NOTDECOMPOSED
            decomp2d(1) = RSL_M
            decomp2d(2) = RSL_N
            glen2d(1) = grid%ed31 - grid%sd31 + 1
            glen2d(2) = grid%ed32 - grid%sd32 + 1
            llen2d(1) = grid%em31 - grid%sm31 + 1
            llen2d(2) = grid%em32 - grid%sm32 + 1
         CASE ( DATA_ORDER_XZY )
            kms = grid%sm32
            ims = grid%sm31
            jms = grid%sm33
            decomp(1) = RSL_M
            decomp(2) = RSL_NOTDECOMPOSED
            decomp(3) = RSL_N
            decomp2d(1) = RSL_M
            decomp2d(2) = RSL_N
            glen2d(1) = grid%ed31 - grid%sd31 + 1
            glen2d(2) = grid%ed33 - grid%sd33 + 1
            llen2d(1) = grid%em31 - grid%sm31 + 1
            llen2d(2) = grid%em33 - grid%sm33 + 1
         CASE ( DATA_ORDER_YXZ )
            kms = grid%sm33
            ims = grid%sm32
            jms = grid%sm31
            decomp(1) = RSL_N
            decomp(2) = RSL_M
            decomp(3) = RSL_NOTDECOMPOSED
            decomp2d(1) = RSL_N
            decomp2d(2) = RSL_M
            glen2d(1) = grid%ed32 - grid%sd32 + 1
            glen2d(2) = grid%ed31 - grid%sd31 + 1
            llen2d(1) = grid%em32 - grid%sm32 + 1
            llen2d(2) = grid%em31 - grid%sm31 + 1
      END SELECT

      glen(1)   = grid%ed31 - grid%sd31 + 1
      glen(2)   = grid%ed32 - grid%sd32 + 1
      glen(3)   = grid%ed33 - grid%sd33 + 1
      llen(1)   = grid%em31 - grid%sm31 + 1
      llen(2)   = grid%em32 - grid%sm32 + 1
      llen(3)   = grid%em33 - grid%sm33 + 1

   END SUBROUTINE setup_halo_rsl



   SUBROUTINE setup_xpose_rsl( grid ) 1,2
       USE module_domain
       IMPLICIT NONE
       TYPE(domain) , INTENT (INOUT) :: grid 
      INTEGER i, kms, ims, jms

      CALL setup_halo_rsl ( grid )

      llen_tx(1) = grid%em31x - grid%sm31x + 1
      llen_tx(2) = grid%em32x - grid%sm32x + 1
      llen_tx(3) = grid%em33x - grid%sm33x + 1
      llen_ty(1) = grid%em31y - grid%sm31y + 1
      llen_ty(2) = grid%em32y - grid%sm32y + 1
      llen_ty(3) = grid%em33y - grid%sm33y + 1

   END SUBROUTINE setup_xpose_rsl


   SUBROUTINE setup_period_rsl( grid ) 14,3
       USE module_domain
       IMPLICIT NONE
       TYPE(domain) , INTENT (INOUT) :: grid 
      INTEGER i, kms, ims, jms

      CALL setup_xpose_rsl ( grid )

   ! Define periodic BC's -- for the period routines, the glen
   ! array contains the actual logical size of the field (that is,
   ! staggering is explicitly stated).  Llen is not affected.

      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_XZY )

      glen(1)    = grid%ed31 - grid%sd31
      glen(2)    = grid%ed32 - grid%sd32 + 1
      glen(3)    = grid%ed33 - grid%sd33
      glenx(1)   = glen(1)
      glenx(2)   = glen(2)
      glenx(3)   = glen(3)
      gleny(1)   = glen(1)
      gleny(2)   = glen(2)
      gleny(3)   = glen(3)
      glenxy(1)   = glen(1)
      glenxy(2)   = glen(2)
      glenxy(3)   = glen(3)
      llenx(1)   = llen(1)
      llenx(2)   = llen(2)
      llenx(3)   = llen(3)
      lleny(1)   = llen(1)
      lleny(2)   = llen(2)
      lleny(3)   = llen(3)
      llenxy(1)   = llen(1)
      llenxy(2)   = llen(2)
      llenxy(3)   = llen(3)

      glen2d(1)    = grid%ed31 - grid%sd31
      glen2d(2)    = grid%ed33 - grid%sd33
      glenx2d(1)   = glen2d(1)
      glenx2d(2)   = glen2d(2)
      gleny2d(1)   = glen2d(1)
      gleny2d(2)   = glen2d(2)
      glenxy2d(1)  = glen2d(1)
      glenxy2d(2)  = glen2d(2)
      llenx2d(1)   = llen2d(1)
      llenx2d(2)   = llen2d(2)
      lleny2d(1)   = llen2d(1)
      lleny2d(2)   = llen2d(2)
      llenxy2d(1)   = llen2d(1)
      llenxy2d(2)   = llen2d(2)

      decompx(1)   = RSL_M_STAG
      decompx(2)   = RSL_NOTDECOMPOSED
      decompx(3)   = RSL_N
      decompy(1)   = RSL_M
      decompy(2)   = RSL_NOTDECOMPOSED
      decompy(3)   = RSL_N_STAG
      decompxy(1)  = RSL_M_STAG
      decompxy(2)  = RSL_NOTDECOMPOSED
      decompxy(3)  = RSL_N_STAG

      decomp2d(1)  = RSL_M
      decomp2d(2)  = RSL_N

      decompx2d(1)  = RSL_M_STAG
      decompx2d(2)  = RSL_N

      decompy2d(1)  = RSL_M
      decompy2d(2)  = RSL_N_STAG

      decompxy2d(1)  = RSL_M_STAG
      decompxy2d(2)  = RSL_N_STAG

         CASE DEFAULT
            CALL wrf_error_fatal ( "module_dm: setup_period_rsl: unsuppported data order" )

      END SELECT

      RETURN
   END SUBROUTINE setup_period_rsl

!------------------------------------------------------------------

   INTEGER FUNCTION intermediate_mapping ( w1, w2, info, m, n, py, px ),1
      IMPLICIT NONE
      INTEGER, DIMENSION(*)   :: w1, w2
      REAL, DIMENSION(*)      :: info
      INTEGER, INTENT(IN)     :: m, n, py, px
      INTEGER                 :: nest_m, nest_n, nri, nrj, nest_domdesc, shw

      nest_m = int(info(1)+.01) ; nest_n = int(info(2)+.01) ; nest_domdesc = int(info(3)+.01)
      nri = int(info(4)+.01)    ; nrj    = int(info(5)+.01)
      shw = int(info(6)+.01)
      CALL  intermediate_mapping2 ( w1, w2, info, m, n, nest_m, nest_n, nest_domdesc, py, px, nri, nrj, shw )
      intermediate_mapping = 0
      RETURN
   END FUNCTION intermediate_mapping


   SUBROUTINE intermediate_mapping2 ( w1, w2, info, m, n, nest_m, nest_n, nest_domdesc, py, px, nri, nrj, shw ) 1
      IMPLICIT NONE
      INTEGER, DIMENSION(*)   :: w1, w2
      REAL, DIMENSION(*)      :: info
      INTEGER, INTENT(IN)     :: m, n, nest_m, nest_n, nest_domdesc, py, px, nri, nrj, shw
      INTEGER                 :: nest_decomp( nest_m, nest_n )
      INTEGER                 :: i, j

      CALL GET_DOMAIN_DECOMP ( nest_domdesc, nest_decomp, nest_m*nest_n )
      DO j = 1, nest_n, nrj
        DO i = 1, nest_m, nri
	  w2((i/nri+1+shw) + (j/nrj+1-1+shw)*m) = nest_decomp(i,j)
	ENDDO
      ENDDO
#if 1
      ! fill out the stencil to the edges of the intermediate domain
      do j = 1,n
        do i = 1,shw
          w2(i+(j-1)*m) = w2(shw+1+(j-1)*m)
        enddo
        do i = m,m-shw-1,-1
          w2(i+(j-1)*m) = w2(m-shw-2+(j-1)*m)
        enddo
      enddo
      do i = 1,m
        do j = 1,shw
          w2(i+(j-1)*m) = w2(i+(shw+1-1)*m)
        enddo
        do j = n,n-shw-1,-1
          w2(i+(j-1)*m) = w2(i+(n-shw-2-1)*m)
        enddo
      enddo
#endif

      RETURN
   END SUBROUTINE intermediate_mapping2

!------------------------------------------------------------------


   SUBROUTINE patch_domain_rsl( id  , domdesc , parent, parent_id , parent_domdesc , & 1,13
                                sd1 , ed1 , sp1 , ep1 , sm1 , em1 ,        &
                                sd2 , ed2 , sp2 , ep2 , sm2 , em2 ,        &
                                sd3 , ed3 , sp3 , ep3 , sm3 , em3 ,        &
                                            sp1x , ep1x , sm1x , em1x ,        &
                                            sp2x , ep2x , sm2x , em2x ,        &
                                            sp3x , ep3x , sm3x , em3x ,        &
                                            sp1y , ep1y , sm1y , em1y ,        &
                                            sp2y , ep2y , sm2y , em2y ,        &
                                            sp3y , ep3y , sm3y , em3y ,        &
                                bdx , bdy )

      USE module_domain
      USE module_machine

      IMPLICIT NONE
      INTEGER, INTENT(IN)   :: sd1 , ed1 , sd2 , ed2 , sd3 , ed3 , bdx , bdy
      INTEGER, INTENT(OUT)  :: sp1 , ep1 , sp2 , ep2 , sp3 , ep3 , &
                               sm1 , em1 , sm2 , em2 , sm3 , em3
      INTEGER, INTENT(OUT)  :: sp1x , ep1x , sp2x , ep2x , sp3x , ep3x , &
                               sm1x , em1x , sm2x , em2x , sm3x , em3x
      INTEGER, INTENT(OUT)  :: sp1y , ep1y , sp2y , ep2y , sp3y , ep3y , &
                               sm1y , em1y , sm2y , em2y , sm3y , em3y
      INTEGER, INTENT(IN)   :: id
      INTEGER, INTENT(OUT)  :: domdesc
      INTEGER, INTENT(IN)   :: parent_id
      INTEGER, INTENT(IN)   :: parent_domdesc
      TYPE(domain),POINTER  :: parent
! Local variables
      INTEGER               :: c_sd1 , c_ed1 , c_sd2 , c_ed2 , c_sd3 , c_ed3
      INTEGER               :: c_sp1 , c_ep1 , c_sp2 , c_ep2 , c_sp3 , c_ep3 , &
                               c_sm1 , c_em1 , c_sm2 , c_em2 , c_sm3 , c_em3
      INTEGER               :: c_sp1x , c_ep1x , c_sp2x , c_ep2x , c_sp3x , c_ep3x , &
                               c_sm1x , c_em1x , c_sm2x , c_em2x , c_sm3x , c_em3x
      INTEGER               :: c_sp1y , c_ep1y , c_sp2y , c_ep2y , c_sp3y , c_ep3y , &
                               c_sm1y , c_em1y , c_sm2y , c_em2y , c_sm3y , c_em3y

      INTEGER               :: mloc , nloc , zloc         ! all k on same proc
      INTEGER               :: mloc_x , nloc_x , zloc_x   ! all x on same proc
      INTEGER               :: mloc_y , nloc_y , zloc_y   ! all y on same proc
      INTEGER               :: c_mloc , c_nloc , c_zloc         ! all k on same proc
      INTEGER               :: c_mloc_x , c_nloc_x , c_zloc_x   ! all x on same proc
      INTEGER               :: c_mloc_y , c_nloc_y , c_zloc_y   ! all y on same proc
      INTEGER               :: mglob , nglob
      INTEGER               :: idim , jdim , kdim , i
      INTEGER , PARAMETER   :: rsl_jjx_x = 2047
      INTEGER , DIMENSION( rsl_jjx_x ) :: rsl_js_x0 , rsl_je_x0 , rsl_is_x0 , rsl_ie_x0
      INTEGER                          :: rsl_xinest_x0 , rsl_idif_x0 , rsl_jdif_x0
      INTEGER               :: i_parent_start , j_parent_start
      INTEGER               :: ids, ide, jds, jde, kds, kde
      INTEGER               :: c_ids, c_ide, c_jds, c_jde, c_kds, c_kde
      INTEGER               :: parent_grid_ratio
      INTEGER               :: shw
      INTEGER               :: idim_cd, jdim_cd, intermediate_domdesc
      INTEGER               :: intermediate_mloc, intermediate_nloc
      INTEGER               :: intermediate_mglob, intermediate_nglob
      REAL                  :: info(7)
      TYPE(domain), POINTER :: intermediate_grid
      TYPE(domain), POINTER  :: nest_grid

      SELECT CASE ( model_data_order )
         ! need to finish other cases
         CASE ( DATA_ORDER_ZXY )
            idim = ed2-sd2+1
            jdim = ed3-sd3+1
            kdim = ed1-sd1+1
         CASE ( DATA_ORDER_XYZ )
            idim = ed1-sd1+1
            jdim = ed2-sd2+1
            kdim = ed3-sd3+1
         CASE ( DATA_ORDER_XZY )
            idim = ed1-sd1+1
            jdim = ed3-sd3+1
            kdim = ed2-sd2+1
         CASE ( DATA_ORDER_YXZ)
            idim = ed2-sd2+1
            jdim = ed1-sd1+1
            kdim = ed3-sd3+1
      END SELECT
      if ( id == 1 ) then
#ifndef NMM_CORE
         CALL rsl_mother_domain3d(domdesc, RSL_24PT,               &
#else
         CALL rsl_mother_domain3d(domdesc, RSL_120PT,               &
#endif
                                  idim   ,  jdim   ,  kdim   ,     &
                                  mloc   ,  nloc   ,  zloc   ,     &
#ifdef D3VAR_IRY_KLUDGE
! see comment above, 20020910 JM
                                  mloc_x ,  nloc_x ,  zloc_x ,     &
                                  mloc_y ,  nloc_y ,  zloc_y       )
#else
                                  mloc_y ,  nloc_y ,  zloc_y ,     &   ! x->y 20020908
                                  mloc_x ,  nloc_x ,  zloc_x       )   ! y->x 20020908
#endif
         CALL show_domain_decomp(domdesc)
         ! this computes the dimension information for the
         ! nest and passes these back
         CALL compute_memory_dims_using_rsl (          &
                   domdesc ,                           &
                   mloc   ,  nloc   ,  zloc   ,        &
                   mloc_x ,  nloc_x ,  zloc_x ,        &
                   mloc_y ,  nloc_y ,  zloc_y ,        &
                   sd1,  ed1,  sd2,  ed2,  sd3,  ed3,  &
                   sp1,  ep1,  sp2,  ep2,  sp3,  ep3,  &
                   sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
                   sp1y, ep1y, sp2y, ep2y, sp3y, ep3y, &
                   sm1,  em1,  sm2,  em2,  sm3,  em3,  &
                   sm1x, em1x, sm2x, em2x, sm3x, em3x, &
                   sm1y, em1y, sm2y, em2y, sm3y, em3y  )

#if 1
!# if 1
      else
	 !
         ! first spawn the actual nest. It is not
	 ! directly associated in RSL with the parent
	 ! so we spawn it as an unassociated domain
	 ! (another "mother")
	 !
#ifndef NMM_CORE
         CALL rsl_mother_domain3d(domdesc, RSL_24PT,               &
#else
         CALL rsl_mother_domain3d(domdesc, RSL_120PT,               &
#endif
                                  idim   ,  jdim   ,  kdim   ,     &
                                  mloc   ,  nloc   ,  zloc   ,     &
#  ifdef D3VAR_IRY_KLUDGE
! see comment above, 20020910 JM
                                  mloc_x ,  nloc_x ,  zloc_x ,     &
                                  mloc_y ,  nloc_y ,  zloc_y       )
#  else
                                  mloc_y ,  nloc_y ,  zloc_y ,     &     ! x->y 20020910
                                  mloc_x ,  nloc_x ,  zloc_x       )     ! y->x 20020910
#  endif
         CALL show_domain_decomp(domdesc)
         ! this computes the dimension information for the
         ! nest and passes these back
         CALL compute_memory_dims_using_rsl (          &
                   domdesc ,                           &
                   mloc   ,  nloc   ,  zloc   ,        &
                   mloc_x ,  nloc_x ,  zloc_x ,        &
                   mloc_y ,  nloc_y ,  zloc_y ,        &
                   sd1,  ed1,  sd2,  ed2,  sd3,  ed3,  &
                   sp1,  ep1,  sp2,  ep2,  sp3,  ep3,  &
                   sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
                   sp1y, ep1y, sp2y, ep2y, sp3y, ep3y, &
                   sm1,  em1,  sm2,  em2,  sm3,  em3,  &
                   sm1x, em1x, sm2x, em2x, sm3x, em3x, &
                   sm1y, em1y, sm2y, em2y, sm3y, em3y  )

         ! now that the nest is defined, we define an intermediate
	 ! domain, that actually is associated with the parent. This
	 ! intermediate is the same resolution as the parent but only
	 ! covers an area over the ND with some additional cells for
	 ! the interpolation stencil. We make sure that the CD is decomposed
	 ! the same as the ND (or at least the same as one of the ND points
	 ! under the CD)

         CALL get_shw( id, shw )
         CALL get_i_parent_start( id , i_parent_start )
         CALL get_j_parent_start( id , j_parent_start )
	 CALL get_parent_grid_ratio( id, parent_grid_ratio )

         info(1) = idim               ! nest i dimension for intermediate mapping
	 info(2) = jdim               ! nest j dimension for intermediate mapping
         info(3) = domdesc            ! nest domain descriptor
	 info(4) = parent_grid_ratio  ! nesting ratio in i
	 info(5) = parent_grid_ratio  ! nesting ratio in j
	 info(6) = shw                ! stencil half-width

# if 1
   ! tells which descriptor will be given back next when intermediate domain is spawned below
   ! that is used to associate the decomposition information from the nested domain with
   ! this intermediate domain, so that it will be decomposed identically, through 
   ! the intermediate mapping function.
         CALL get_next_domain_descriptor ( intermediate_domdesc )
         CALL set_def_decomp_fcn1 ( intermediate_domdesc, intermediate_mapping )
	 CALL set_def_decomp_info ( intermediate_domdesc, info )
# endif

	 ! now spawn the intermediate domain that will serve as the
	 ! nest-decomposed area of the CD domain, onto which data
	 ! will be transferred from the CD for interpolation
	 ! ** need to make sure the decomposition matches the
	 ! ** nested decomposition

	 idim_cd = idim / parent_grid_ratio + 1 + 2*shw + 1
	 jdim_cd = jdim / parent_grid_ratio + 1 + 2*shw + 1

         c_ids = i_parent_start-shw ; c_ide = c_ids + idim_cd - 1
         c_jds = j_parent_start-shw ; c_jde = c_jds + jdim_cd - 1
         c_kds = sd2                ; c_kde = ed2                   ! IKJ ONLY

         CALL RSL_SPAWN_REGULAR_NEST1(                  &
                intermediate_domdesc,                   &
                parent_domdesc,                         &
#ifndef NMM_CORE
                RSL_24PT,                               &
#else
                RSL_120PT,                               &
#endif
                c_ids, c_jds,                               &
                idim_cd,jdim_cd,                        &
		1, 1,                                   &
                intermediate_mloc,intermediate_nloc,    &
                intermediate_mglob,intermediate_nglob)

         zloc = kdim
         ! compute dims for intermediate domain
         CALL show_domain_decomp(intermediate_domdesc)
         CALL compute_memory_dims_using_rsl (          &
                   intermediate_domdesc ,              &
                   intermediate_mloc   ,  intermediate_nloc   ,  zloc   ,        &
                   c_mloc_x ,  c_nloc_x ,  c_zloc_x ,        &
                   c_mloc_y ,  c_nloc_y ,  c_zloc_y ,        &
                   c_ids,  c_ide,  c_kds,  c_kde,  c_jds,  c_jde,  &   ! IKJ ONLY
                   c_sp1,  c_ep1,  c_sp2,  c_ep2,  c_sp3,  c_ep3, &
                   c_sp1x, c_ep1x, c_sp2x, c_ep2x, c_sp3x, c_ep3x, &
                   c_sp1y, c_ep1y, c_sp2y, c_ep2y, c_sp3y, c_ep3y, &
                   c_sm1,  c_em1,  c_sm2,  c_em2,  c_sm3,  c_em3,  &
                   c_sm1x, c_em1x, c_sm2x, c_em2x, c_sm3x, c_em3x, &
                   c_sm1y, c_em1y, c_sm2y, c_em2y, c_sm3y, c_em3y  )
         ! since the RSL_SPAWN_REGULAR_NEST1 does not do the vert dimension
         ! we need to set that manually  >>>>> IKJ ONLY
         c_sp2 = c_kds   !IKJ ONLY
         c_ep2 = c_kde   !IKJ ONLY
         c_sm2 = c_kds   !IKJ ONLY
         c_em2 = c_kde   !IKJ ONLY

         ! global dims are same as CD
         ! good for IKJ only
         c_sd1 = parent%sd31       ; c_ed1 = parent%ed31
         c_sd2 = parent%sd32       ; c_ed2 = parent%ed32
         c_sd3 = parent%sd33       ; c_ed3 = parent%ed33


         ! Sequence of calls to create a new, intermediate domain
         ! data structures that can be used to store the CD data
         ! that will be used as input to the forcing interpolation
         ! on each processor.
         ALLOCATE ( intermediate_grid )
         ALLOCATE ( intermediate_grid%parents( max_parents ) )
         ALLOCATE ( intermediate_grid%nests( max_nests ) )

         NULLIFY( intermediate_grid%sibling )
         DO i = 1, max_nests
            NULLIFY( intermediate_grid%nests(i)%ptr )
         ENDDO
         NULLIFY  (intermediate_grid%next)
         NULLIFY  (intermediate_grid%same_level)
         NULLIFY  (intermediate_grid%i_start)
         NULLIFY  (intermediate_grid%j_start)
         NULLIFY  (intermediate_grid%i_end)
         NULLIFY  (intermediate_grid%j_end)

         intermediate_grid%id = id
         intermediate_grid%domdesc = intermediate_domdesc
         intermediate_grid%num_nests = 0
         intermediate_grid%num_siblings = 0
         intermediate_grid%num_parents = 1
         intermediate_grid%max_tiles   = 0
         intermediate_grid%num_tiles_spec   = 0
         ! hook up some pointers
         
         CALL find_grid_by_id ( id, head_grid, nest_grid )
	 nest_grid%intermediate_grid => intermediate_grid  ! nest grid now has a pointer to this baby
         intermediate_grid%parents(1)%ptr => nest_grid     ! the intermediate grid considers nest its parent
         intermediate_grid%num_parents = 1

         c_sm1x = 1 ; c_em1x = 1 ; c_sm2x = 1 ; c_em2x = 1 ; c_sm3x = 1 ; c_em3x = 1
         c_sm1y = 1 ; c_em1y = 1 ; c_sm2y = 1 ; c_em2y = 1 ; c_sm3y = 1 ; c_em3y = 1

	 ! allocate space for the intermediate domain
         CALL alloc_space_field ( intermediate_grid, id ,          &   ! use same id as nest
                               c_sd1, c_ed1, c_sd2, c_ed2, c_sd3, c_ed3,       &
                               c_sm1,  c_em1,  c_sm2,  c_em2,  c_sm3,  c_em3,  &
                               c_sm1x, c_em1x, c_sm2x, c_em2x, c_sm3x, c_em3x, &   ! x-xpose
                               c_sm1y, c_em1y, c_sm2y, c_em2y, c_sm3y, c_em3y  )   ! y-xpose

         intermediate_grid%sd31                            =   c_sd1
         intermediate_grid%ed31                            =   c_ed1
         intermediate_grid%sp31                            = c_sp1
         intermediate_grid%ep31                            = c_ep1
         intermediate_grid%sm31                            = c_sm1
         intermediate_grid%em31                            = c_em1
         intermediate_grid%sd32                            =   c_sd2
         intermediate_grid%ed32                            =   c_ed2
         intermediate_grid%sp32                            = c_sp2
         intermediate_grid%ep32                            = c_ep2
         intermediate_grid%sm32                            = c_sm2
         intermediate_grid%em32                            = c_em2
         intermediate_grid%sd33                            =   c_sd3
         intermediate_grid%ed33                            =   c_ed3
         intermediate_grid%sp33                            = c_sp3
         intermediate_grid%ep33                            = c_ep3
         intermediate_grid%sm33                            = c_sm3
         intermediate_grid%em33                            = c_em3

         CALL med_add_config_info_to_grid ( intermediate_grid )

         intermediate_grid%dx = parent%dx
         intermediate_grid%dy = parent%dy
         intermediate_grid%dt = parent%dt

         CALL wrf_dm_define_comms ( intermediate_grid )

!# else
!      else
!         CALL get_i_parent_start( id , i_parent_start )
!         CALL get_j_parent_start( id , j_parent_start )
!	 CALL get_parent_grid_ratio( id, parent_grid_ratio )
!
!         CALL RSL_SPAWN_REGULAR_NEST1(         &
!                domdesc,                       &
!                parent_domdesc,                &
!                RSL_24PT,                      &
!                i_parent_start,j_parent_start, &
!                idim,jdim,                     &
!                parent_grid_ratio,parent_grid_ratio,       &
!                mloc,nloc,                     &
!                mglob,nglob)
!
!# endif
#endif
      endif

      RETURN
  END SUBROUTINE patch_domain_rsl


  SUBROUTINE compute_memory_dims_using_rsl (        & 3,1
                domdesc ,                           &
                mloc   ,  nloc   ,  zloc   ,        &
                mloc_x ,  nloc_x ,  zloc_x ,        &
                mloc_y ,  nloc_y ,  zloc_y ,        &
                sd1,  ed1,  sd2,  ed2,  sd3,  ed3,  &
                sp1,  ep1,  sp2,  ep2,  sp3,  ep3,  &
                sp1x, ep1x, sp2x, ep2x, sp3x, ep3x, &
                sp1y, ep1y, sp2y, ep2y, sp3y, ep3y, &
                sm1,  em1,  sm2,  em2,  sm3,  em3,  &
                sm1x, em1x, sm2x, em2x, sm3x, em3x, &
                sm1y, em1y, sm2y, em2y, sm3y, em3y  )
      USE module_machine
      IMPLICIT NONE
      ! Arguments
      INTEGER, INTENT(IN ) :: domdesc
      INTEGER, INTENT(IN ) :: mloc , nloc , zloc         ! all k on same proc
      INTEGER, INTENT(IN ) :: mloc_x , nloc_x , zloc_x   ! all x on same proc
      INTEGER, INTENT(IN ) :: mloc_y , nloc_y , zloc_y   ! all y on same proc
      INTEGER, INTENT(IN ) :: sd1, ed1, sd2, ed2, sd3, ed3
      INTEGER, INTENT(OUT) :: sp1, ep1, sp2, ep2, sp3, ep3
      INTEGER, INTENT(OUT) :: sp1x, ep1x, sp2x, ep2x, sp3x, ep3x
      INTEGER, INTENT(OUT) :: sp1y, ep1y, sp2y, ep2y, sp3y, ep3y
      INTEGER, INTENT(OUT) :: sm1, em1, sm2, em2, sm3, em3
      INTEGER, INTENT(OUT) :: sm1x, em1x, sm2x, em2x, sm3x, em3x
      INTEGER, INTENT(OUT) :: sm1y, em1y, sm2y, em2y, sm3y, em3y
      ! Local data
      INTEGER , PARAMETER   :: rsl_jjx_x = 2047
      INTEGER , DIMENSION( rsl_jjx_x ) :: rsl_js_x0 , rsl_je_x0 , rsl_is_x0 , rsl_ie_x0
      INTEGER                          :: rsl_xinest_x0 , rsl_idif_x0 , rsl_jdif_x0

      CALL RSL_REG_RUN_INFOP(domdesc , 0 ,               &
                             rsl_jjx_x ,                 &
                             rsl_xinest_x0 ,             &
                             rsl_is_x0 , rsl_ie_x0 ,     &
                             rsl_js_x0 , rsl_je_x0 ,     &
                             rsl_idif_x0 , rsl_jdif_x0   )

      SELECT CASE ( model_data_order )
         CASE ( DATA_ORDER_ZXY )

           CALL rsl_reg_patchinfo_mn ( domdesc ,                       &
                       sp2  , ep2  , sp3  , ep3  ,  sp1  , ep1   )
	   sp1 = sp1 - ( 1 - sd1 ) ; ep1 = ep1 - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2 = sp2 - ( 1 - sd2 ) ; ep2 = ep2 - ( 1 - sd2 )
	   sp3 = sp3 - ( 1 - sd3 ) ; ep3 = ep3 - ( 1 - sd3 )
           sm2 = sp2 - rsl_padarea
           em2 = sm2 + mloc - 1
           sm3 = sp3 - rsl_padarea
           em3 = sm3 + nloc - 1
           sm1 = sp1
           em1 = sm1 + zloc - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &                    ! switched m->n 20020910
#endif
                       sp2x , ep2x , sp3x , ep3x ,  sp1x , ep1x  )
	   sp1x = sp1x - ( 1 - sd1 ) ; ep1x = ep1x - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2x = sp2x - ( 1 - sd2 ) ; ep2x = ep2x - ( 1 - sd2 )
	   sp3x = sp3x - ( 1 - sd3 ) ; ep3x = ep3x - ( 1 - sd3 )
           sm2x = sp2x - rsl_padarea
           em2x = sm2x + mloc_x - 1
           sm3x = sp3x - rsl_padarea
           em3x = sm3x + nloc_x - 1
           sm1x = sp1x
           em1x = sm1x + zloc_x - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &                    ! switched n->m 20020910
#endif
                       sp2y , ep2y , sp3y , ep3y ,  sp1y , ep1y  )
	   sp1y = sp1y - ( 1 - sd1 ) ; ep1y = ep1y - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2y = sp2y - ( 1 - sd2 ) ; ep2y = ep2y - ( 1 - sd2 )
	   sp3y = sp3y - ( 1 - sd3 ) ; ep3y = ep3y - ( 1 - sd3 )
           sm2y = sp2y - rsl_padarea
           em2y = sm2y + mloc_y - 1
           sm3y = sp3y - rsl_padarea
           em3y = sm3y + nloc_y - 1
           sm1y = sp1y
           em1y = sm1y + zloc_y - 1

         CASE ( DATA_ORDER_XZY )

           CALL rsl_reg_patchinfo_mn ( domdesc ,                       &
                       sp1  , ep1  , sp3  , ep3  ,  sp2  , ep2   )

	   sp1 = sp1 - ( 1 - sd1 ) ; ep1 = ep1 - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2 = sp2 - ( 1 - sd2 ) ; ep2 = ep2 - ( 1 - sd2 )
	   sp3 = sp3 - ( 1 - sd3 ) ; ep3 = ep3 - ( 1 - sd3 )

           sm1 = sp1 - rsl_padarea
           em1 = sm1 + mloc - 1
           sm3 = sp3 - rsl_padarea
           em3 = sm3 + nloc - 1
           sm2 = sp2
           em2 = sm2 + zloc - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &   ! switched m->n 20020908
#endif
                       sp1x , ep1x , sp3x , ep3x ,  sp2x , ep2x  )
	   sp1x = sp1x - ( 1 - sd1 ) ; ep1x = ep1x - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2x = sp2x - ( 1 - sd2 ) ; ep2x = ep2x - ( 1 - sd2 )
	   sp3x = sp3x - ( 1 - sd3 ) ; ep3x = ep3x - ( 1 - sd3 )
           sm1x = sp1x - rsl_padarea
           em1x = sm1x + mloc_x - 1
           sm3x = sp3x - rsl_padarea
           em3x = sm3x + nloc_x - 1
           sm2x = sp2x
           em2x = sm2x + zloc_x - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &   ! switched n->m 20020908
#endif
                       sp1y , ep1y , sp3y , ep3y ,  sp2y , ep2y  )
	   sp1y = sp1y - ( 1 - sd1 ) ; ep1y = ep1y - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2y = sp2y - ( 1 - sd2 ) ; ep2y = ep2y - ( 1 - sd2 )
	   sp3y = sp3y - ( 1 - sd3 ) ; ep3y = ep3y - ( 1 - sd3 )
           sm1y = sp1y - rsl_padarea
           em1y = sm1y + mloc_y - 1
           sm3y = sp3y - rsl_padarea
           em3y = sm3y + nloc_y - 1
           sm2y = sp2y
           em2y = sm2y + zloc_y - 1

         CASE ( DATA_ORDER_XYZ )

           CALL rsl_reg_patchinfo_mn ( domdesc ,                       &
                       sp1  , ep1  , sp2  , ep2  ,  sp3  , ep3   )
	   sp1 = sp1 - ( 1 - sd1 ) ; ep1 = ep1 - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2 = sp2 - ( 1 - sd2 ) ; ep2 = ep2 - ( 1 - sd2 )
	   sp3 = sp3 - ( 1 - sd3 ) ; ep3 = ep3 - ( 1 - sd3 )
           sm1 = sp1 - rsl_padarea
           em1 = sm1 + mloc - 1
           sm2 = sp2 - rsl_padarea
           em2 = sm2 + nloc - 1
           sm3 = sp3
           em3 = sm3 + zloc - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &     ! switched m->n 20020910
#endif
                       sp1x , ep1x , sp2x , ep2x ,  sp3x , ep3x  )
	   sp1x = sp1x - ( 1 - sd1 ) ; ep1x = ep1x - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2x = sp2x - ( 1 - sd2 ) ; ep2x = ep2x - ( 1 - sd2 )
	   sp3x = sp3x - ( 1 - sd3 ) ; ep3x = ep3x - ( 1 - sd3 )
           sm1x = sp1x - rsl_padarea
           em1x = sm1x + mloc_x - 1
           sm2x = sp2x - rsl_padarea
           em2x = sm2x + nloc_x - 1
           sm3x = sp3x
           em3x = sm3x + zloc_x - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &     ! switched n->m 20020910
#endif
                       sp1y , ep1y , sp2y , ep2y ,  sp3y , ep3y  )
	   sp1y = sp1y - ( 1 - sd1 ) ; ep1y = ep1y - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2y = sp2y - ( 1 - sd2 ) ; ep2y = ep2y - ( 1 - sd2 )
	   sp3y = sp3y - ( 1 - sd3 ) ; ep3y = ep3y - ( 1 - sd3 )
           sm1y = sp1y - rsl_padarea
           em1y = sm1y + mloc_y - 1
           sm2y = sp2y - rsl_padarea
           em2y = sm2y + nloc_y - 1
           sm3y = sp3y
           em3y = sm3y + zloc_y - 1

         CASE ( DATA_ORDER_YXZ )

           CALL rsl_reg_patchinfo_mn ( domdesc ,                       &
                       sp2  , ep2  , sp1  , ep1  ,  sp3  , ep3   )

	   sp1 = sp1 - ( 1 - sd1 ) ; ep1 = ep1 - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2 = sp2 - ( 1 - sd2 ) ; ep2 = ep2 - ( 1 - sd2 )
	   sp3 = sp3 - ( 1 - sd3 ) ; ep3 = ep3 - ( 1 - sd3 )
           sm2 = sp2 - rsl_padarea
           em2 = sm2 + mloc - 1
           sm1 = sp1 - rsl_padarea
           em1 = sm1 + nloc - 1
           sm3 = sp3
           em3 = sm3 + zloc - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &     ! switched n->m 20020910
#endif
                       sp2x , ep2x , sp1x , ep1x ,  sp3x , ep3x  )
	   sp1x = sp1x - ( 1 - sd1 ) ; ep1x = ep1x - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2x = sp2x - ( 1 - sd2 ) ; ep2x = ep2x - ( 1 - sd2 )
	   sp3x = sp3x - ( 1 - sd3 ) ; ep3x = ep3x - ( 1 - sd3 )
           sm2x = sp2x - rsl_padarea
           em2x = sm2x + mloc_x - 1
           sm1x = sp1x - rsl_padarea
           em1x = sm1x + nloc_x - 1
           sm3x = sp3x
           em3x = sm3x + zloc_x - 1

#ifdef D3VAR_IRY_KLUDGE
           CALL rsl_reg_patchinfo_nz ( domdesc ,                       &
#else
           CALL rsl_reg_patchinfo_mz ( domdesc ,                       &     ! switched m->n 20020910
#endif
                       sp2y , ep2y , sp1y , ep1y ,  sp3y , ep3y  )
	   sp1y = sp1y - ( 1 - sd1 ) ; ep1y = ep1y - ( 1 - sd1 )   ! adjust if domain start not 1
	   sp2y = sp2y - ( 1 - sd2 ) ; ep2y = ep2y - ( 1 - sd2 )
	   sp3y = sp3y - ( 1 - sd3 ) ; ep3y = ep3y - ( 1 - sd3 )
           sm2y = sp2y - rsl_padarea
           em2y = sm2y + mloc_y - 1
           sm1y = sp1y - rsl_padarea
           em1y = sm1y + nloc_y - 1
           sm3y = sp3y
           em3y = sm3y + zloc_y - 1

      END SELECT

      RETURN
   END SUBROUTINE compute_memory_dims_using_rsl


   SUBROUTINE init_module_dm 1,3
      IMPLICIT NONE
      INTEGER mpi_comm_local, ierr, mytask
      INCLUDE 'mpif.h'
      LOGICAL mpi_inited
      EXTERNAL rsl_patch_decomp
      CALL mpi_initialized( mpi_inited, ierr )
      IF ( .NOT. mpi_inited ) THEN
	! If MPI has not been initialized then initialize it and 
	! make comm_world the communicator
	! Otherwise, something else (e.g. quilt-io) has already 
	! initialized MPI, so just grab the communicator that
	! should already be stored and use that.
	CALL mpi_init ( ierr )
        CALL wrf_termio_dup
	CALL wrf_set_dm_communicator ( MPI_COMM_WORLD )
!        CALL mpi_comm_rank(MPI_COMM_WORLD, mytask, ierr )
!        CALL rsl_error_dup1( mytask )
      ENDIF
      CALL wrf_get_dm_communicator( mpi_comm_local )
      CALL rsl_initialize1( mpi_comm_local )
      CALL set_def_decomp_fcn ( rsl_patch_decomp )
   END SUBROUTINE init_module_dm
END MODULE module_dm

!=========================================================================
! wrf_dm_patch_domain has to be outside the module because it is called
! by a routine in module_domain but depends on module domain


SUBROUTINE wrf_dm_patch_domain ( id  , domdesc , parent_id , parent_domdesc , & 1,4
                          sd1 , ed1 , sp1 , ep1 , sm1 , em1 , &
                          sd2 , ed2 , sp2 , ep2 , sm2 , em2 , &
                          sd3 , ed3 , sp3 , ep3 , sm3 , em3 , &
                                      sp1x , ep1x , sm1x , em1x , &
                                      sp2x , ep2x , sm2x , em2x , &
                                      sp3x , ep3x , sm3x , em3x , &
                                      sp1y , ep1y , sm1y , em1y , &
                                      sp2y , ep2y , sm2y , em2y , &
                                      sp3y , ep3y , sm3y , em3y , &
                          bdx , bdy )
   USE module_domain
   USE module_dm
   IMPLICIT NONE

   INTEGER, INTENT(IN)   :: sd1 , ed1 , sd2 , ed2 , sd3 , ed3 , bdx , bdy
   INTEGER, INTENT(OUT)  :: sp1 , ep1 , sp2 , ep2 , sp3 , ep3 , &
                            sm1 , em1 , sm2 , em2 , sm3 , em3
   INTEGER, INTENT(OUT)  :: sp1x , ep1x , sp2x , ep2x , sp3x , ep3x , &
                            sm1x , em1x , sm2x , em2x , sm3x , em3x
   INTEGER, INTENT(OUT)  :: sp1y , ep1y , sp2y , ep2y , sp3y , ep3y , &
                            sm1y , em1y , sm2y , em2y , sm3y , em3y
   INTEGER, INTENT(INOUT):: id  , domdesc , parent_id , parent_domdesc

   TYPE(domain), POINTER :: parent, grid_ptr

   ! this is necessary because we cannot pass parent directly into 
   ! wrf_dm_patch_domain because creating the correct interface definitions
   ! would generate a circular USE reference between module_domain and module_dm
   ! see comment this date in module_domain for more information. JM 20020416

   NULLIFY( parent )
   grid_ptr => head_grid
   CALL find_grid_by_id( parent_id , grid_ptr , parent )

   CALL patch_domain_rsl ( id  , domdesc , parent, parent_id , parent_domdesc , & 
                           sd1 , ed1 , sp1 , ep1 , sm1 , em1 , & 
                           sd2 , ed2 , sp2 , ep2 , sm2 , em2 , &
                           sd3 , ed3 , sp3 , ep3 , sm3 , em3 , &
                                       sp1x , ep1x , sm1x , em1x , &
                                       sp2x , ep2x , sm2x , em2x , &
                                       sp3x , ep3x , sm3x , em3x , &
                                       sp1y , ep1y , sm1y , em1y , &
                                       sp2y , ep2y , sm2y , em2y , &
                                       sp3y , ep3y , sm3y , em3y , &
                           bdx , bdy )


   RETURN
END SUBROUTINE wrf_dm_patch_domain


SUBROUTINE wrf_termio_dup 2
  IMPLICIT NONE
  INCLUDE 'mpif.h'
  INTEGER mytask, ntasks, ierr
  CALL mpi_comm_size(MPI_COMM_WORLD, ntasks, ierr )
  CALL mpi_comm_rank(MPI_COMM_WORLD, mytask, ierr )
  write(0,*)'starting wrf task ',mytask,' of ',ntasks
  CALL rsl_error_dup1( mytask )
END SUBROUTINE wrf_termio_dup


SUBROUTINE wrf_get_myproc( myproc ) 8
  IMPLICIT NONE
# include <rsl.inc>
  INTEGER myproc
  myproc = rsl_myproc
  RETURN
END SUBROUTINE wrf_get_myproc


SUBROUTINE wrf_get_nproc( nproc ) 4
  IMPLICIT NONE
# include <rsl.inc>
  INTEGER nproc
  nproc = rsl_nproc_all
  RETURN
END SUBROUTINE wrf_get_nproc


SUBROUTINE wrf_get_nprocx( nprocx ) 1
  IMPLICIT NONE
# include <rsl.inc>
  INTEGER nprocx
  nprocx = rsl_nproc_min
  RETURN
END SUBROUTINE wrf_get_nprocx


SUBROUTINE wrf_get_nprocy( nprocy )
  IMPLICIT NONE
# include <rsl.inc>
  INTEGER nprocy
  nprocy = rsl_nproc_maj
  RETURN
END SUBROUTINE wrf_get_nprocy


SUBROUTINE wrf_dm_bcast_bytes ( buf , size ) 94,1
   USE module_dm
   IMPLICIT NONE
   INTEGER size
   INTEGER*1 BUF(size)
   CALL rsl_mon_bcast( buf , size )
   RETURN
END SUBROUTINE wrf_dm_bcast_bytes


SUBROUTINE wrf_dm_bcast_string( BUF, N1 ) 2
   IMPLICIT NONE
   INTEGER n1
   CHARACTER*(*) buf
   INTEGER ibuf(256),i,n
   CHARACTER*256 tstr
   n = n1
   IF (n .GT. 256) n = 256
   IF (n .GT. 0 ) then
     CALL rsl_mon_bcast( n , IWORDSIZE )
     DO i = 1, n
       ibuf(I) = ichar(buf(I:I))
     ENDDO
     CALL rsl_mon_bcast( ibuf, n*IWORDSIZE )
     buf = ''
     DO i = 1, n
       buf(i:i) = char(ibuf(i))
     ENDDO
   ENDIF
   RETURN
END SUBROUTINE wrf_dm_bcast_string


SUBROUTINE wrf_dm_bcast_integer( BUF, N1 )
   IMPLICIT NONE
   INTEGER n1
   INTEGER  buf(*)
   CALL rsl_mon_bcast( BUF , N1 * IWORDSIZE )
   RETURN
END SUBROUTINE wrf_dm_bcast_integer


SUBROUTINE wrf_dm_bcast_double( BUF, N1 )
   IMPLICIT NONE
   INTEGER n1
   DOUBLEPRECISION  buf(*)
   CALL rsl_mon_bcast( BUF , N1 * DWORDSIZE )
   RETURN
END SUBROUTINE wrf_dm_bcast_double


SUBROUTINE wrf_dm_bcast_real( BUF, N1 ) 7
   IMPLICIT NONE
   INTEGER n1
   REAL  buf(*)
   CALL rsl_mon_bcast( BUF , N1 * RWORDSIZE )
   RETURN
END SUBROUTINE wrf_dm_bcast_real


SUBROUTINE wrf_dm_bcast_logical( BUF, N1 )
   IMPLICIT NONE
   INTEGER n1
   LOGICAL  buf(*)
   CALL rsl_mon_bcast( BUF , N1 * LWORDSIZE )
   RETURN
END SUBROUTINE wrf_dm_bcast_logical


SUBROUTINE wrf_dm_halo ( domdesc , comms , stencil_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , stencil_id
   CALL rsl_exch_stencil ( domdesc , comms( stencil_id ) )
   RETURN
END SUBROUTINE wrf_dm_halo


SUBROUTINE wrf_dm_xpose_z2y ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_mn_nz ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_mn_mz ( domdesc , comms( xpose_id ) )      ! switched nz->mz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_z2y


SUBROUTINE wrf_dm_xpose_y2z ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_nz_mn ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_mz_mn ( domdesc , comms( xpose_id ) )      ! switched nz->mz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_y2z


SUBROUTINE wrf_dm_xpose_y2x ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_nz_mz ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_mz_nz ( domdesc , comms( xpose_id ) )      ! switched nz<->mz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_y2x


SUBROUTINE wrf_dm_xpose_x2y ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_mz_nz ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_nz_mz ( domdesc , comms( xpose_id ) )      ! switched nz<->mz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_x2y


SUBROUTINE wrf_dm_xpose_x2z ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_mz_mn ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_nz_mn ( domdesc , comms( xpose_id ) )      ! switched mz->nz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_x2z


SUBROUTINE wrf_dm_xpose_z2x ( domdesc , comms , xpose_id ),1
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , xpose_id
#ifdef D3VAR_IRY_KLUDGE
   CALL rsl_xpose_mn_mz ( domdesc , comms( xpose_id ) )
#else
   CALL rsl_xpose_mn_nz ( domdesc , comms( xpose_id ) )      ! switched mz->nz 20020910
#endif
   RETURN
END SUBROUTINE wrf_dm_xpose_z2x

#if 0

SUBROUTINE wrf_dm_boundary ( domdesc , comms , period_id , &,1
                             periodic_x , periodic_y )
   USE module_dm
   IMPLICIT NONE
   INTEGER domdesc , comms(*) , period_id
   LOGICAL , INTENT(IN)      :: periodic_x, periodic_y
# include <rsl.inc>

   IF ( periodic_x ) THEN
     CALL rsl_exch_period ( domdesc , comms( period_id ) , RSL_M )
   END IF
   IF ( periodic_y ) THEN
     CALL rsl_exch_period ( domdesc , comms( period_id ) , RSL_N )
   END IF
   RETURN
END SUBROUTINE wrf_dm_boundary
#endif


SUBROUTINE wrf_dm_define_comms ( grid ) 2,5
   USE module_domain
   USE module_dm
   IMPLICIT NONE
   TYPE(domain) , INTENT (INOUT) :: grid 
   INTEGER dyn_opt
   INTEGER idum1, idum2, icomm

#ifdef DEREF_KLUDGE
   INTEGER     :: sm31 , em31 , sm32 , em32 , sm33 , em33
#endif

#ifdef DEREF_KLUDGE
   sm31             = grid%sm31
   em31             = grid%em31
   sm32             = grid%sm32
   em32             = grid%em32
   sm33             = grid%sm33
   em33             = grid%em33
#endif

   CALL get_dyn_opt( dyn_opt )

   CALL set_scalar_indices_from_config ( grid%id , idum1 , idum2 )

! RSL interface has been restructured so there is no longer a 
! need to call a dyncore specific define_comms routine here.
! Removed 6/2001. JM

   DO icomm = 1, max_comms
     grid%comms(icomm) = invalid_message_value
   ENDDO
   grid%shift_x = invalid_message_value
   grid%shift_y = invalid_message_value

   RETURN
END SUBROUTINE wrf_dm_define_comms


SUBROUTINE write_68( grid, v , s , &,3
                   ids, ide, jds, jde, kds, kde, &
                   ims, ime, jms, jme, kms, kme, &
                   its, ite, jts, jte, kts, kte )
  USE module_domain
  IMPLICIT NONE
  TYPE(domain) , INTENT (INOUT) :: grid 
  CHARACTER *(*) s
  INTEGER ids, ide, jds, jde, kds, kde, &
          ims, ime, jms, jme, kms, kme, &
          its, ite, jts, jte, kts, kte
  REAL, DIMENSION( ims:ime , kms:kme, jms:jme ) :: v
# include <rsl.inc>

  INTEGER i,j,k

  logical, external :: wrf_dm_on_monitor
  real globbuf( ids:ide, kds:kde, jds:jde )
  character*3 ord, stag

  if ( kds == kde ) then
    ord = 'xy'
    stag = 'xy'
  CALL wrf_patch_to_global_real ( v, globbuf, grid%domdesc, stag, ord, &
                     ids, ide, jds, jde, kds, kde, &
                     ims, ime, jms, jme, kms, kme, &
                     its, ite, jts, jte, kts, kte )
  else

    stag = 'xyz' 
    ord = 'xzy'
  CALL wrf_patch_to_global_real ( v, globbuf, grid%domdesc, stag, ord, &
                     ids, ide, kds, kde, jds, jde, &
                     ims, ime, kms, kme, jms, jme, &
                     its, ite, kts, kte, jts, jte )
  endif


  if ( wrf_dm_on_monitor() ) THEN
    WRITE(68,*) ide-ids+1, jde-jds+1 , s
    DO j = jds, jde
    DO i = ids, ide
       WRITE(68,*) globbuf(i,1,j)
    ENDDO
    ENDDO
  endif

  RETURN
END


   SUBROUTINE wrf_abort 1
      INCLUDE 'mpif.h'
      CALL mpi_abort(MPI_COMM_WORLD,1,ierr)
   END SUBROUTINE wrf_abort


   SUBROUTINE wrf_dm_shutdown 7
# include <rsl.inc>
      CALL RSL_SHUTDOWN
      RETURN
   END SUBROUTINE wrf_dm_shutdown


   LOGICAL FUNCTION wrf_dm_on_monitor()
      LOGICAL rsl_iammonitor
      EXTERNAL rsl_iammonitor
      wrf_dm_on_monitor = rsl_iammonitor()
      RETURN
   END FUNCTION wrf_dm_on_monitor


   SUBROUTINE wrf_get_dm_communicator ( communicator ) 6
      IMPLICIT NONE
      INTEGER , INTENT(OUT) :: communicator
      CALL rsl_get_communicator ( communicator )
      RETURN
   END SUBROUTINE wrf_get_dm_communicator


   SUBROUTINE wrf_get_dm_iocommunicator ( iocommunicator )
      IMPLICIT NONE
      INTEGER , INTENT(OUT) :: iocommunicator
      CALL rsl_get_communicator ( iocommunicator )  ! same as regular communicator
      RETURN
   END SUBROUTINE wrf_get_dm_iocommunicator


   SUBROUTINE wrf_set_dm_communicator ( communicator ) 3
      IMPLICIT NONE
      INTEGER , INTENT(IN) :: communicator
      CALL rsl_set_communicator ( communicator )
      RETURN
   END SUBROUTINE wrf_set_dm_communicator


   SUBROUTINE wrf_set_dm_iocommunicator ( iocommunicator )
      IMPLICIT NONE
      INTEGER , INTENT(IN) :: iocommunicator
!      CALL rsl_set_communicator ( iocommunicator )  ! same as regular communicator
      RETURN
   END SUBROUTINE wrf_set_dm_iocommunicator


!!!!!!!!!!!!!!!!!!!!!!! PATCH TO GLOBAL !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


   SUBROUTINE wrf_patch_to_global_real (buf,globbuf,domdesc,stagger,ordering,& 4,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       REAL globbuf(*)
       REAL buf(*)

       CALL wrf_patch_to_global_generic (buf,globbuf,domdesc,stagger,ordering,TRUE_RSL_REAL,&
                                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                         MS1,ME1,MS2,ME2,MS3,ME3,&
                                         PS1,PE1,PS2,PE2,PS3,PE3 )

       RETURN
   END SUBROUTINE wrf_patch_to_global_real 


   SUBROUTINE wrf_patch_to_global_doubleprecision (buf,globbuf,domdesc,stagger,ordering,&,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       DOUBLEPRECISION globbuf(*)
       DOUBLEPRECISION buf(*)

       CALL wrf_patch_to_global_generic (buf,globbuf,domdesc,stagger,ordering,RSL_DOUBLE,&
                                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                         MS1,ME1,MS2,ME2,MS3,ME3,&
                                         PS1,PE1,PS2,PE2,PS3,PE3 )

       RETURN
   END SUBROUTINE wrf_patch_to_global_doubleprecision



   SUBROUTINE wrf_patch_to_global_integer (buf,globbuf,domdesc,stagger,ordering,& 1,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       INTEGER globbuf(*)
       INTEGER buf(*)

       CALL wrf_patch_to_global_generic (buf,globbuf,domdesc,stagger,ordering,rsl_integer,&
                                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                         MS1,ME1,MS2,ME2,MS3,ME3,&
                                         PS1,PE1,PS2,PE2,PS3,PE3 )

       RETURN
   END SUBROUTINE wrf_patch_to_global_integer 


   SUBROUTINE wrf_patch_to_global_generic (buf,globbuf,domdesc,stagger,ordering,type,& 3,5
                                       DS1a,DE1a,DS2a,DE2a,DS3a,DE3a,&
                                       MS1a,ME1a,MS2a,ME2a,MS3a,ME3a,&
                                       PS1a,PE1a,PS2a,PE2a,PS3a,PE3a )
       USE module_driver_constants
       USE module_timing
       USE module_wrf_error
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1a,DE1a,DS2a,DE2a,DS3a,DE3a,&
                                       MS1a,ME1a,MS2a,ME2a,MS3a,ME3a,&
                                       PS1a,PE1a,PS2a,PE2a,PS3a,PE3A 
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc,type
       REAL globbuf(*)
       REAL buf(*)

       LOGICAL, EXTERNAL :: has_char
       INTEGER glen(3),llen(3),glen2d(3),llen2d(3)
       INTEGER i, j, k, ord, ord2d, ndim
       INTEGER mlen, nlen, zlen

       DS1 = DS1a ; DE1 = DE1a ; DS2=DS2a ; DE2 = DE2a ; DS3 = DS3a ; DE3 = DE3a
       MS1 = MS1a ; ME1 = ME1a ; MS2=MS2a ; ME2 = ME2a ; MS3 = MS3a ; ME3 = ME3a
       PS1 = PS1a ; PE1 = PE1a ; PS2=PS2a ; PE2 = PE2a ; PS3 = PS3a ; PE3 = PE3a

       ndim = len(TRIM(ordering))

       CALL rsl_get_glen( domdesc, glen(1), glen(2), glen(3) )

       SELECT CASE ( TRIM(ordering) )
         CASE ( 'xyz','xy' )
           ord = io3d_ijk_internal ; ord2d = io2d_ij_internal
            ! the non-staggered variables come in at one-less than
            ! domain dimensions, but RSL wants full domain spec, so 
            ! adjust if not staggered
           IF ( .NOT. has_char( stagger, 'x' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
         CASE ( 'yxz','yx' )
#ifndef D3VAR_IRY_KLUDGE
           ord = io3d_jik_internal ; ord2d = io2d_ji_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
#else
           ord = io3d_ijk_internal ; ord2d = io2d_ij_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
#endif
         CASE ( 'zxy' )
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE3 = DE3+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE1 = DE1+1
           ord = io3d_kij_internal ; ord2d = io2d_ij_internal
#if 0
         CASE ( 'zyx' )
           ord = io3d_kji_internal ; ord2d = io2d_ji_internal
         CASE ( 'yzx' )
           ord = io3d_jki_internal ; ord2d = io2d_ji_internal
#endif
         CASE ( 'xzy' )
           IF ( .NOT. has_char( stagger, 'x' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE3 = DE3+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE2 = DE2+1
           ord = io3d_ikj_internal ; ord2d = io2d_ij_internal
         CASE DEFAULT
           ord = -1 ; ord2d = -1
       END SELECT


       glen(1) = DE1-DS1+1   ; glen(2) = DE2-DS2+1   ; glen(3) = DE3-DS3+1
       llen(1) = ME1-MS1+1   ; llen(2) = ME2-MS2+1   ; llen(3) = ME3-MS3+1
       glen2d(1) = DE1-DS1+1 ; glen2d(2) = DE2-DS2+1
       llen2d(1) = ME1-MS1+1 ; llen2d(2) = ME2-MS2+1

       IF ( wrf_at_debug_level(500) ) THEN
         CALL start_timing
       ENDIF

       IF ( ndim .EQ. 3 ) THEN
         CALL rsl_write(globbuf,ord,buf,domdesc,type,glen,llen)
       ELSE
         CALL rsl_write(globbuf,ord2d,buf,domdesc,type,glen2d,llen2d)
       ENDIF
       IF ( wrf_at_debug_level(500) ) THEN
         CALL end_timing('wrf_patch_to_global_generic')
       ENDIF
       RETURN
    END SUBROUTINE wrf_patch_to_global_generic

!!!!!!!!!!!!!!!!!!!!!!! GLOBAL TO PATCH !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    SUBROUTINE wrf_global_to_patch_real (globbuf,buf,domdesc,stagger,ordering,& 2,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       REAL globbuf(*)
       REAL buf(*)

       CALL wrf_global_to_patch_generic (globbuf,buf,domdesc,stagger,ordering,TRUE_RSL_REAL,&
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       RETURN
    END SUBROUTINE wrf_global_to_patch_real


    SUBROUTINE wrf_global_to_patch_doubleprecision (globbuf,buf,domdesc,stagger,ordering,&,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       DOUBLEPRECISION globbuf(*)
       DOUBLEPRECISION buf(*)

       CALL wrf_global_to_patch_generic (globbuf,buf,domdesc,stagger,ordering,RSL_DOUBLE,&
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       RETURN
    END SUBROUTINE wrf_global_to_patch_doubleprecision



    SUBROUTINE wrf_global_to_patch_integer (globbuf,buf,domdesc,stagger,ordering,& 2,1
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc
       INTEGER globbuf(*)
       INTEGER buf(*)

       CALL wrf_global_to_patch_generic (globbuf,buf,domdesc,stagger,ordering,rsl_integer,&
                                       DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3 )
       RETURN
    END SUBROUTINE wrf_global_to_patch_integer


    SUBROUTINE wrf_global_to_patch_generic (globbuf,buf,domdesc,stagger,ordering,type,& 3,1
                                       DS1a,DE1a,DS2a,DE2a,DS3a,DE3a,&
                                       MS1a,ME1a,MS2a,ME2a,MS3a,ME3a,&
                                       PS1a,PE1a,PS2a,PE2a,PS3a,PE3a )
       USE module_driver_constants
       IMPLICIT NONE
#include <rsl.inc>
       INTEGER                         DS1a,DE1a,DS2a,DE2a,DS3a,DE3a,&
                                       MS1a,ME1a,MS2a,ME2a,MS3a,ME3a,&
                                       PS1a,PE1a,PS2a,PE2a,PS3a,PE3A 
       INTEGER                         DS1,DE1,DS2,DE2,DS3,DE3,&
                                       MS1,ME1,MS2,ME2,MS3,ME3,&
                                       PS1,PE1,PS2,PE2,PS3,PE3
       CHARACTER *(*) stagger,ordering
       INTEGER fid,domdesc,type
       REAL globbuf(*)
       REAL buf(*)
       LOGICAL, EXTERNAL :: has_char

       INTEGER i,j,k,ord,ord2d,ndim
       INTEGER glen(3),llen(3),glen2d(3),llen2d(3)

       DS1 = DS1a ; DE1 = DE1a ; DS2=DS2a ; DE2 = DE2a ; DS3 = DS3a ; DE3 = DE3a
       MS1 = MS1a ; ME1 = ME1a ; MS2=MS2a ; ME2 = ME2a ; MS3 = MS3a ; ME3 = ME3a
       PS1 = PS1a ; PE1 = PE1a ; PS2=PS2a ; PE2 = PE2a ; PS3 = PS3a ; PE3 = PE3a

       ndim = len(TRIM(ordering))

       SELECT CASE ( TRIM(ordering) )
         CASE ( 'xyz','xy' )
           ord = io3d_ijk_internal ; ord2d = io2d_ij_internal
            ! the non-staggered variables come in at one-less than
            ! domain dimensions, but RSL wants full domain spec, so 
            ! adjust if not staggered
           IF ( .NOT. has_char( stagger, 'x' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
         CASE ( 'yxz','yx' )
#ifndef D3VAR_IRY_KLUDGE
           ord = io3d_jik_internal ; ord2d = io2d_ji_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
#else
           ord = io3d_ijk_internal ; ord2d = io2d_ij_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE3 = DE3+1
#endif
         CASE ( 'zxy' )
           ord = io3d_kij_internal ; ord2d = io2d_ij_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE2 = DE2+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE3 = DE3+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE1 = DE1+1
#if 0
         CASE ( 'zyx' )
           ord = io3d_kji_internal ; ord2d = io2d_ji_internal
         CASE ( 'yzx' )
           ord = io3d_jki_internal ; ord2d = io2d_ji_internal
#endif
         CASE ( 'xzy' )
           ord = io3d_ikj_internal ; ord2d = io2d_ij_internal
           IF ( .NOT. has_char( stagger, 'x' ) ) DE1 = DE1+1
           IF ( .NOT. has_char( stagger, 'y' ) ) DE3 = DE3+1
           IF ( .NOT. has_char( stagger, 'z' ) ) DE2 = DE2+1
         CASE DEFAULT
           ord = -1 ; ord2d = -1
       END SELECT

       glen(1) = DE1-DS1+1   ; glen(2) = DE2-DS2+1   ; glen(3) = DE3-DS3+1
       llen(1) = ME1-MS1+1   ; llen(2) = ME2-MS2+1   ; llen(3) = ME3-MS3+1
       glen2d(1) = DE1-DS1+1 ; glen2d(2) = DE2-DS2+1
       llen2d(1) = ME1-MS1+1 ; llen2d(2) = ME2-MS2+1

       IF ( ndim .EQ. 3 ) THEN
         CALL rsl_read(globbuf,ord,buf,domdesc,type,glen,llen)
       ELSE
         CALL rsl_read(globbuf,ord2d,buf,domdesc,type,glen2d,llen2d)
       ENDIF
       RETURN
    END SUBROUTINE wrf_global_to_patch_generic


!------------------------------------------------------------------

#if ( EM_CORE == 1 )

!------------------------------------------------------------------


   SUBROUTINE force_domain_em_part2 ( grid, ngrid, config_flags ,  & 1,5
!
#include "em_dummy_args.inc"
!
                 )
      USE module_domain
      USE module_configure
      USE module_dm
!
      TYPE(domain), POINTER :: grid          ! name of the grid being dereferenced (must be "grid")
      TYPE(domain), POINTER :: ngrid
#include <em_dummy_decl.inc>
#include <em_i1_decl.inc>
      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
#define COPY_IN
#include <em_scalar_derefs.inc>
#ifdef DM_PARALLEL
#    define REGISTER_I1
#      include <em_data_calls.inc>
#endif

      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 (  ngrid ,              &
                                nids, nide, njds, njde, nkds, nkde,    &
                                nims, nime, njms, njme, nkms, nkme,    &
                                nips, nipe, njps, njpe, nkps, nkpe    )

      nlev  = ckde - ckds + 1

#  include "em_nest_interpdown_unpack.inc"

#include "HALO_EM_INIT.inc"

      ! code here to interpolate the data into the nested domain
#  include "em_nest_forcedown_interp.inc"

#define COPY_OUT
#include <em_scalar_derefs.inc>
      RETURN
   END SUBROUTINE force_domain_em_part2



!------------------------------------------------------------------


   SUBROUTINE interp_domain_em_part1 ( grid, intermediate_grid, config_flags ,  & 4,12
!
#include "em_dummy_args.inc"
!
                 )
      USE module_domain
      USE module_configure
      USE module_dm
      USE module_timing
!
      TYPE(domain), POINTER :: grid          ! name of the grid being dereferenced (must be "grid")
      TYPE(domain), POINTER :: intermediate_grid
#include <em_dummy_decl.inc>
      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
#define COPY_IN
#include <em_scalar_derefs.inc>
!
      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 ,              &
                                nids, nide, njds, njde, nkds, nkde,    &
                                nims, nime, njms, njme, nkms, nkme,    &
                                nips, nipe, njps, njpe, nkps, nkpe    )

      nlev  = ckde - ckds + 1

#  include "em_nest_interpdown_pack.inc"

call start_timing
      CALL rsl_bcast_msgs
call end_timing('rsl_bcast_msgs')

#define COPY_OUT
#include <em_scalar_derefs.inc>
      RETURN
   END SUBROUTINE interp_domain_em_part1


   SUBROUTINE interp_domain_em_part2 ( grid, ngrid, config_flags ,  & 1,5
!
#include "em_dummy_args.inc"
!
                 )
      USE module_domain
      USE module_configure
      USE module_dm
!
      TYPE(domain), POINTER :: grid          ! name of the grid being dereferenced (must be "grid")
      TYPE(domain), POINTER :: ngrid
#include <em_dummy_decl.inc>
#include <em_i1_decl.inc>
      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
#define COPY_IN
#include <em_scalar_derefs.inc>
#ifdef DM_PARALLEL
#    define REGISTER_I1
#      include <em_data_calls.inc>
#endif
      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 (  ngrid ,              &
                                nids, nide, njds, njde, nkds, nkde,    &
                                nims, nime, njms, njme, nkms, nkme,    &
                                nips, nipe, njps, njpe, nkps, nkpe    )
      nlev  = ckde - ckds + 1 

#  include "em_nest_interpdown_unpack.inc"

#include "HALO_EM_INIT.inc"
      ! code here to interpolate the data into the nested domain

write(0,*)' calling em_nest_interpdown_interp.inc from interp_domain_em_part2 in module_dm'
#  include "em_nest_interpdown_interp.inc"
write(0,*)' back from em_nest_interpdown_interp.inc from interp_domain_em_part2 in module_dm'

#define COPY_OUT
#include <em_scalar_derefs.inc>
      RETURN
   END SUBROUTINE interp_domain_em_part2

!------------------------------------------------------------------


   SUBROUTINE feedback_domain_em_part1 ( grid, ngrid, config_flags ,  & 1,5
!
#include "em_dummy_args.inc"
!
                 )
      USE module_domain
      USE module_configure
      USE module_dm
!
      TYPE(domain), POINTER :: grid          ! name of the grid being dereferenced (must be "grid")
      TYPE(domain), POINTER :: ngrid
#include <em_dummy_decl.inc>
      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
#define COPY_IN
#include <em_scalar_derefs.inc>
!
      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 (  ngrid ,                  &
                                nids, nide, njds, njde, nkds, nkde,    &
                                nims, nime, njms, njme, nkms, nkme,    &
                                nips, nipe, njps, njpe, nkps, nkpe    )

      nlev  = ckde - ckds + 1


      ips_save = ngrid%i_parent_start   ! used in feedback_domain_em_part2 below
      jps_save = ngrid%j_parent_start
      ipe_save = ngrid%i_parent_start + (nide-nids+1) / ngrid%parent_grid_ratio - 1
      jpe_save = ngrid%j_parent_start + (njde-njds+1) / ngrid%parent_grid_ratio - 1


#  include "em_nest_feedbackup_interp.inc"

#define COPY_OUT
#include <em_scalar_derefs.inc>
      RETURN
   END SUBROUTINE feedback_domain_em_part1

!------------------------------------------------------------------


   SUBROUTINE feedback_domain_em_part2 ( grid, intermediate_grid, config_flags ,  & 1,5
!
#include "em_dummy_args.inc"
!
                 )
      USE module_domain
      USE module_configure
      USE module_dm
!
      TYPE(domain), POINTER :: grid          ! name of the grid being dereferenced (must be "grid")
      TYPE(domain), POINTER :: intermediate_grid
#include <em_dummy_decl.inc>
#include <em_i1_decl.inc>
      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
      LOGICAL, EXTERNAL  :: em_cd_feedback_mask
#define COPY_IN
#include <em_scalar_derefs.inc>
#ifdef DM_PARALLEL
#    define REGISTER_I1
#      include <em_data_calls.inc>
#endif


      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 ,              &
                                nids, nide, njds, njde, nkds, nkde,    &
                                nims, nime, njms, njme, nkms, nkme,    &
                                nips, nipe, njps, njpe, nkps, nkpe    )

      nlev  = ckde - ckds + 1

      i_parent_start = ips_save
      j_parent_start = jps_save

#  include "em_nest_feedbackup_pack.inc"

      CALL rsl_merge_msgs

#  include "em_nest_feedbackup_unpack.inc"

      ! code here to interpolate the data into the nested domain

#  include "em_nest_feedbackup_smooth.inc"

#define COPY_OUT
#include <em_scalar_derefs.inc>
      RETURN
   END SUBROUTINE feedback_domain_em_part2

#endif

!------------------------------------------------------------------


   SUBROUTINE wrf_gatherv_real (Field, field_ofst,            & 2
                                my_count ,                    &    ! sendcount
                                globbuf, glob_ofst ,          &    ! recvbuf
                                counts                      , &    ! recvcounts
                                displs                      , &    ! displs
                                root                        , &    ! root
                                communicator                , &    ! communicator
                                ierr )
   IMPLICIT NONE
   INCLUDE 'mpif.h'
   INTEGER field_ofst, glob_ofst
   INTEGER my_count, communicator, root, ierr
   INTEGER , DIMENSION(*) :: counts, displs
   REAL, DIMENSION(*) :: Field, globbuf

           CALL mpi_gatherv( Field( field_ofst ),      &    ! sendbuf
                            my_count ,                       &    ! sendcount
                            MPI_REAL         ,               &    ! sendtype
                            globbuf( glob_ofst ) ,                 &    ! recvbuf
                            counts                         , &    ! recvcounts
                            displs                         , &    ! displs
                            MPI_REAL                       , &    ! recvtype
                            root                           , &    ! root
                            communicator                   , &    ! communicator
                            ierr )

   END SUBROUTINE wrf_gatherv_real


   SUBROUTINE wrf_gatherv_integer (Field, field_ofst,            & 2
                                my_count ,                    &    ! sendcount
                                globbuf, glob_ofst ,          &    ! recvbuf
                                counts                      , &    ! recvcounts
                                displs                      , &    ! displs
                                root                        , &    ! root
                                communicator                , &    ! communicator
                                ierr )
   IMPLICIT NONE
   INCLUDE 'mpif.h'
   INTEGER field_ofst, glob_ofst
   INTEGER my_count, communicator, root, ierr
   INTEGER , DIMENSION(*) :: counts, displs
   INTEGER, DIMENSION(*) :: Field, globbuf

           CALL mpi_gatherv( Field( field_ofst ),      &    ! sendbuf
                            my_count ,                       &    ! sendcount
                            MPI_INTEGER         ,               &    ! sendtype
                            globbuf( glob_ofst ) ,                 &    ! recvbuf
                            counts                         , &    ! recvcounts
                            displs                         , &    ! displs
                            MPI_INTEGER                       , &    ! recvtype
                            root                           , &    ! root
                            communicator                   , &    ! communicator
                            ierr )

   END SUBROUTINE wrf_gatherv_integer