!> @file
!! @brief Process land, sea/lake ice, open water/Near Sea Surface
!! Temperature (NSST) fields.
!! @author George Gayno NCEP/EMC

!> Process surface and nst fields. Interpolates fields from the input
!! to target grids. Adjusts soil temperature according to differences
!! in input and target grid terrain. Rescales soil moisture for soil
!! type differences between input and target grid. Computes frozen
!! portion of total soil moisture.
!!
!! Assumes the input land data are Noah LSM-based, and the fv3 run
!! will use the Noah LSM. NSST fields are not available when using
!! GRIB2 input data.
!!
!! Public variables are defined below. "target" indicates field
!! associated with the target grid. "input" indicates field associated
!! with the input grid.
!!
!! @author George Gayno NCEP/EMC
 module surface

 use esmf

 use surface_target_data, only : canopy_mc_target_grid, t2m_target_grid, &
                                 q2m_target_grid, tprcp_target_grid, &
                                 f10m_target_grid, seaice_fract_target_grid, &
                                 ffmm_target_grid, ustar_target_grid, &
                                 srflag_target_grid, soil_temp_target_grid, &
                                 seaice_depth_target_grid, snow_liq_equiv_target_grid, &
                                 seaice_skin_temp_target_grid, skin_temp_target_grid, &
                                 snow_depth_target_grid, z0_target_grid, &
                                 c_d_target_grid, c_0_target_grid, &
                                 d_conv_target_grid, dt_cool_target_grid, &
                                 ifd_target_grid, qrain_target_grid, &
                                 tref_target_grid, w_d_target_grid, &
                                 w_0_target_grid, xs_target_grid, &
                                 xt_target_grid, xu_target_grid, &
                                 xv_target_grid, xz_target_grid, &
                                 xtts_target_grid, xzts_target_grid, &
                                 z_c_target_grid, zm_target_grid, &
                                 soilm_tot_target_grid, lai_target_grid, &
                                 soilm_liq_target_grid

 use write_data, only : write_fv3_sfc_data_netcdf

 use utilities, only  : error_handler

 implicit none

 private

 integer, parameter                 :: veg_type_landice_target = 15
                                       !< Vegetation type category that
                                       !< defines permanent land ice points.
                                       !< The Noah LSM land ice physics
                                       !< are applied at these points.

 type(esmf_field)                   :: soil_type_from_input_grid
                                       !< soil type interpolated from
                                       !< input grid
 type(esmf_field)                   :: terrain_from_input_grid
                                       !< terrain height interpolated
                                       !< from input grid
 type(esmf_field)                   :: terrain_from_input_grid_land
                                       !< terrain height interpolated
                                       !< from input grid at all land points 

 real, parameter, private           :: blim        = 5.5
                                       !< soil 'b' parameter limit
 real, parameter, private           :: frz_h2o     = 273.15
                                       !< melting pt water
 real, parameter, private           :: frz_ice     = 271.21
                                       !< melting pt sea ice
 real, parameter, private           :: grav        = 9.81
                                       !< gravity
 real, parameter, private           :: hlice       = 3.335E5
                                       !< latent heat of fusion
                                       

 type realptr_2d
   real(esmf_kind_r8), pointer :: p(:,:)
                                       !< array of 2d pointers
 end type realptr_2d
                                       !< pointer to hold array of 2d pointers 
  type realptr_3d
   real(esmf_kind_r8), pointer :: p(:,:,:)
                                       !< array of 3d pointers
 end type realptr_3d
                                       !< pointer to hold array of 3d pointers

 public :: surface_driver
 public :: create_nst_esmf_fields
 public :: interp
 public :: create_surface_esmf_fields
 public :: nst_land_fill
 public :: regrid_many
 public :: search_many

 contains

!> Driver routine to process surface/nst data
!!
!! @param[in] localpet  ESMF local persistent execution thread
!!
!! @author George Gayno NCEP/EMC
 subroutine surface_driver(localpet)

 use sfc_input_data, only            : cleanup_input_sfc_data, &
                                       read_input_sfc_data

 use nst_input_data, only            : cleanup_input_nst_data, &
                                       read_input_nst_data

 use program_setup, only             : calc_soil_params_driver, &
                                       convert_nst
                                  
 use static_data, only               :  get_static_fields, &
                                       cleanup_static_fields

 use surface_target_data, only       : cleanup_target_nst_data

 use utilities, only                 : error_handler

 implicit none

 integer, intent(in)                :: localpet

!-----------------------------------------------------------------------
! Compute soil-based parameters.
!-----------------------------------------------------------------------

 call calc_soil_params_driver(localpet)

!-----------------------------------------------------------------------
! Get static data (like vegetation type) on the target grid.
!-----------------------------------------------------------------------

 call get_static_fields(localpet)

!-----------------------------------------------------------------------
! Read surface data on input grid.
!-----------------------------------------------------------------------

 call read_input_sfc_data(localpet)

!-----------------------------------------------------------------------
! Read nst data on input grid.
!-----------------------------------------------------------------------

 if (convert_nst) call read_input_nst_data(localpet)

!-----------------------------------------------------------------------
! Create surface field objects for target grid.
!-----------------------------------------------------------------------

 call create_surface_esmf_fields

!-----------------------------------------------------------------------
! Create nst field objects for target grid.
!-----------------------------------------------------------------------

 if (convert_nst) call create_nst_esmf_fields
 
!-----------------------------------------------------------------------
! Adjust soil levels of input grid !! not implemented yet
!-----------------------------------------------------------------------

 call adjust_soil_levels(localpet)

!-----------------------------------------------------------------------
! Horizontally interpolate fields.
!-----------------------------------------------------------------------

 call interp(localpet)
 
!---------------------------------------------------------------------------------------------
! Adjust soil/landice column temperatures for any change in elevation between  the
! input and target grids.
!---------------------------------------------------------------------------------------------

 call adjust_soilt_for_terrain
 
!---------------------------------------------------------------------------------------------
! Rescale soil moisture for changes in soil type between the input and target grids.
!---------------------------------------------------------------------------------------------

 call rescale_soil_moisture
 
!---------------------------------------------------------------------------------------------
! Compute liquid portion of total soil moisture.
!---------------------------------------------------------------------------------------------

 call calc_liq_soil_moisture

!---------------------------------------------------------------------------------------------
! Set z0 at land and sea ice.
!---------------------------------------------------------------------------------------------

 call roughness

!---------------------------------------------------------------------------------------------
! Perform some final qc checks.
!---------------------------------------------------------------------------------------------

 call qc_check

!---------------------------------------------------------------------------------------------
! Set flag values at land for nst fields.
!---------------------------------------------------------------------------------------------

 if (convert_nst) call nst_land_fill

!---------------------------------------------------------------------------------------------
! Free up memory.
!---------------------------------------------------------------------------------------------

 call cleanup_input_sfc_data

 if (convert_nst) call cleanup_input_nst_data

!---------------------------------------------------------------------------------------------
! Write data to file.
!---------------------------------------------------------------------------------------------

 call write_fv3_sfc_data_netcdf(localpet)

!---------------------------------------------------------------------------------------------
! Free up memory.
!---------------------------------------------------------------------------------------------

 if (convert_nst) call cleanup_target_nst_data

 call cleanup_all_target_sfc_data

 call cleanup_static_fields

 return

 end subroutine surface_driver

!> Horizontally interpolate surface fields from input to target FV3
!> grid using esmf routines.
!!
!! @param[in] localpet  ESMF local persistent execution thread
!!
!! @author George Gayno NOAA/EMC
 subroutine interp(localpet)

 use mpi_f08
 use esmf

 use sfc_input_data, only            : canopy_mc_input_grid,  &
                                       f10m_input_grid,  &
                                       ffmm_input_grid,  &
                                       landsea_mask_input_grid, &
                                       q2m_input_grid,  &
                                       seaice_depth_input_grid, &
                                       seaice_fract_input_grid, &
                                       seaice_skin_temp_input_grid, &
                                       skin_temp_input_grid, &
                                       snow_depth_input_grid, &
                                       snow_liq_equiv_input_grid, &
                                       soil_temp_input_grid, &
                                       soil_type_input_grid, &
                                       soilm_tot_input_grid, &
                                       srflag_input_grid, &
                                       t2m_input_grid,  &
                                       tprcp_input_grid,  &
                                       ustar_input_grid,  &
                                       veg_type_input_grid, &
                                       z0_input_grid, &
                                       veg_type_landice_input, &
                                       veg_greenness_input_grid, &
                                       max_veg_greenness_input_grid, &
                                       min_veg_greenness_input_grid, &
                                       lai_input_grid

 use nst_input_data, only           :  c_d_input_grid, &
                                       c_0_input_grid, &
                                       d_conv_input_grid, &
                                       dt_cool_input_grid, &
                                       ifd_input_grid, &
                                       qrain_input_grid, &
                                       tref_input_grid, &
                                       w_d_input_grid, &
                                       w_0_input_grid, &
                                       xs_input_grid, &
                                       xt_input_grid, &
                                       xu_input_grid, &
                                       xv_input_grid, &
                                       xz_input_grid, &
                                       xtts_input_grid, &
                                       xzts_input_grid, &
                                       z_c_input_grid, &
                                       zm_input_grid

 use atm_input_data, only            : terrain_input_grid

 use model_grid, only                : input_grid, target_grid, &
                                       i_target, j_target, &
                                       lsoil_target, &
                                       num_tiles_target_grid, &
                                       landmask_target_grid, &
                                       seamask_target_grid,  &
                                       latitude_target_grid

 use program_setup, only             : convert_nst, &
                                       vgtyp_from_climo, & 
                                       sotyp_from_climo, &
                                       vgfrc_from_climo, &
                                       minmax_vgfrc_from_climo, &
                                       lai_from_climo, &
                                       tg3_from_soil
                                       
 use static_data, only               : veg_type_target_grid, &
                                       soil_type_target_grid, &
                                       veg_greenness_target_grid, &
                                       substrate_temp_target_grid,&
                                       min_veg_greenness_target_grid,&
                                       max_veg_greenness_target_grid

 use search_util

 implicit none

 integer, intent(in)                :: localpet

 integer                            :: l(1), u(1)
 integer                            :: i, j, ij, rc, tile
 integer                            :: clb_target(2), cub_target(2)
 integer                            :: isrctermprocessing
 integer                            :: num_fields
 integer                            :: vgfrc_ind, mmvg_ind, lai_ind
 integer, allocatable               :: search_nums(:)
 integer(esmf_kind_i4), pointer     :: unmapped_ptr(:)
 integer(esmf_kind_i4), pointer     :: mask_input_ptr(:,:)
 integer(esmf_kind_i4), pointer     :: mask_target_ptr(:,:)
 integer(esmf_kind_i8), pointer     :: landmask_target_ptr(:,:)
 integer(esmf_kind_i8), allocatable :: mask_target_one_tile(:,:)
 integer(esmf_kind_i8), allocatable :: water_target_one_tile(:,:)
 integer(esmf_kind_i8), allocatable :: land_target_one_tile(:,:)
 integer(esmf_kind_i8), pointer     :: seamask_target_ptr(:,:)

 real(esmf_kind_r8), allocatable    :: data_one_tile(:,:)
 real(esmf_kind_r8), allocatable    :: data_one_tile2(:,:)
 real(esmf_kind_r8), allocatable    :: data_one_tile_3d(:,:,:)
 real(esmf_kind_r8), allocatable    :: latitude_one_tile(:,:)
 real(esmf_kind_r8), pointer        :: seaice_fract_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: srflag_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: terrain_from_input_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: soil_type_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: landmask_input_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_input_ptr(:,:)
 real(esmf_kind_r8), allocatable    :: veg_type_target_one_tile(:,:)

 type(esmf_regridmethod_flag)       :: method
 type(esmf_routehandle)             :: regrid_bl_no_mask
 type(esmf_routehandle)             :: regrid_all_land
 type(esmf_routehandle)             :: regrid_land
 type(esmf_routehandle)             :: regrid_landice
 type(esmf_routehandle)             :: regrid_nonland
 type(esmf_routehandle)             :: regrid_seaice
 type(esmf_routehandle)             :: regrid_water
 
 type(esmf_fieldbundle)             :: bundle_all_target, bundle_all_input
 type(esmf_fieldbundle)             :: bundle_seaice_target, bundle_seaice_input
 type(esmf_fieldbundle)             :: bundle_water_target, bundle_water_input
 type(esmf_fieldbundle)             :: bundle_allland_target, bundle_allland_input
 type(esmf_fieldbundle)             :: bundle_landice_target, bundle_landice_input
 type(esmf_fieldbundle)             :: bundle_nolandice_target, bundle_nolandice_input
 
 logical, allocatable               :: dozero(:)

!-----------------------------------------------------------------------
! Interpolate fieids that do not require 'masked' interpolation.
!-----------------------------------------------------------------------

 method=ESMF_REGRIDMETHOD_BILINEAR

 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore FOR NON-MASKED BILINEAR INTERPOLATION."
 call ESMF_FieldRegridStore(t2m_input_grid, &
                            t2m_target_grid, &
                            polemethod=ESMF_POLEMETHOD_ALLAVG, &
                            srctermprocessing=isrctermprocessing, &
                            routehandle=regrid_bl_no_mask, &
                            regridmethod=method, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 bundle_all_target = ESMF_FieldBundleCreate(name="all points target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 bundle_all_input = ESMF_FieldBundleCreate(name="all points input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
      
 call ESMF_FieldBundleAdd(bundle_all_target, (/t2m_target_grid,q2m_target_grid,tprcp_target_grid, &
                         f10m_target_grid,ffmm_target_grid,ustar_target_grid,srflag_target_grid/), &
                         rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)                        
 call ESMF_FieldBundleAdd(bundle_all_input, (/t2m_input_grid,q2m_input_grid,tprcp_input_grid, &
                         f10m_input_grid,ffmm_input_grid,ustar_input_grid,srflag_input_grid/), &
                         rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)  
                            
 call ESMF_FieldBundleGet(bundle_all_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)  
 
 allocate(dozero(num_fields))
 dozero(:) = .True.  

 call regrid_many(bundle_all_input,bundle_all_target,num_fields,regrid_bl_no_mask,dozero)
 deallocate(dozero) 

 call ESMF_FieldBundleDestroy(bundle_all_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)  
 call ESMF_FieldBundleDestroy(bundle_all_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)  
 
 print*,"- CALL FieldGet FOR SRFLAG."
 call ESMF_FieldGet(srflag_target_grid, &
                    farrayPtr=srflag_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

!-----------------------------------------------------------------------
! This is a flag field.  Using neighbor was expensive.  So use
! bilinear and 'nint'.
!-----------------------------------------------------------------------

 srflag_target_ptr = nint(srflag_target_ptr)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_bl_no_mask, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!-----------------------------------------------------------------------
! First, set the mask on the target and input grids.
!-----------------------------------------------------------------------

 print*,"- CALL GridAddItem FOR TARGET GRID."
 call ESMF_GridAddItem(target_grid, &
                       itemflag=ESMF_GRIDITEM_MASK, &
                       staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN GridAddItem", rc)

 print*,"- CALL GridGetItem FOR TARGET GRID."
 call ESMF_GridGetItem(target_grid, &
                       itemflag=ESMF_GRIDITEM_MASK, &
                       farrayPtr=mask_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN GridGetItem", rc)

 print*,"- CALL FieldGet FOR TARGET GRID SEAMASK."
 call ESMF_FieldGet(seamask_target_grid, &
                    computationalLBound=clb_target, &
                    computationalUBound=cub_target, &
                    farrayPtr=seamask_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)
    
 print*,"- CALL FieldGet FOR TARGET GRID LANDMASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=landmask_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)   

 print*,"- CALL GridAddItem FOR INPUT GRID SEAMASK."
 call ESMF_GridAddItem(input_grid, &
                       itemflag=ESMF_GRIDITEM_MASK, &
                       staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN GridAddItem", rc)

 print*,"- CALL FieldGet FOR INPUT GRID LANDMASK."
 call ESMF_FieldGet(landsea_mask_input_grid, &
                    farrayPtr=landmask_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL GridGetItem FOR INPUT GRID LANDMASK."
 call ESMF_GridGetItem(input_grid, &
                       itemflag=ESMF_GRIDITEM_MASK, &
                       farrayPtr=mask_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN GridGetItem", rc)

  if (localpet == 0) then
   allocate(data_one_tile(i_target,j_target))
   allocate(data_one_tile_3d(i_target,j_target,lsoil_target))
   allocate(mask_target_one_tile(i_target,j_target))
 else
   allocate(data_one_tile(0,0))
   allocate(data_one_tile_3d(0,0,0))
   allocate(mask_target_one_tile(0,0))
 endif
    
 !-----------------------------------------------------------------------
 ! Interpolate vegetation type to target grid if chosen in namelist and terrain
 ! for use in replacing isolated bad terrain values
 !-----------------------------------------------------------------------
 
 method=ESMF_REGRIDMETHOD_NEAREST_STOD

 isrctermprocessing = 1
 
 mask_input_ptr = 0
 where (nint(landmask_input_ptr) == 1) mask_input_ptr = 1

 mask_target_ptr = 0
 where (landmask_target_ptr == 1) mask_target_ptr = 1
 
 print*,"- CALL FieldCreate FOR TERRAIN FROM INPUT GRID LAND."
 terrain_from_input_grid_land = ESMF_FieldCreate(target_grid, &
                                           typekind=ESMF_TYPEKIND_R8, &
                                           staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)
 
 print*,"- CALL FieldRegridStore for land fields."
 call ESMF_FieldRegridStore(terrain_input_grid, &
                            terrain_from_input_grid_land, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_all_land, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 print*,"- CALL Field_Regrid TERRAIN."
 call ESMF_FieldRegrid(terrain_input_grid, &
                       terrain_from_input_grid_land, &
                       routehandle=regrid_all_land, &
                       termorderflag=ESMF_TERMORDER_SRCSEQ,  rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegrid", rc)
    
 print*,"- CALL FieldGet FOR terrain from input grid at land."
 call ESMF_FieldGet(terrain_from_input_grid_land, &
                    farrayPtr=terrain_from_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)
    
 l = lbound(unmapped_ptr)
 u = ubound(unmapped_ptr)

 do ij = l(1), u(1)
   call ij_to_i_j(unmapped_ptr(ij), i_target, j_target, i, j)
   terrain_from_input_ptr(i,j) = -9999.9 
 enddo
  nullify(terrain_from_input_ptr) 
  
 do tile = 1, num_tiles_target_grid
 
   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
      
   print*,"- CALL FieldGather FOR TERRAIN FROM INPUT GRID: ", tile
   call ESMF_FieldGather(terrain_from_input_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     allocate(land_target_one_tile(i_target,j_target))
     land_target_one_tile = 0
     where(mask_target_one_tile == 1) land_target_one_tile = 1
     call search(data_one_tile, land_target_one_tile, i_target, j_target, tile, 7)
     deallocate(land_target_one_tile)
   endif

   print*,"- CALL FieldScatter FOR TERRAIN FROM INPUT GRID: ", tile
   call ESMF_FieldScatter(terrain_from_input_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldScatter", rc)
 enddo
 
 if(.not. vgtyp_from_climo) then
  
   print*,"- CALL FieldRegrid VEG TYPE."
   call ESMF_FieldRegrid(veg_type_input_grid, &
                         veg_type_target_grid, &
                         routehandle=regrid_all_land, &
                         termorderflag=ESMF_TERMORDER_SRCSEQ, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldRegrid", rc)
   
   print*,"- CALL FieldGet FOR TARGET grid veg type."
   call ESMF_FieldGet(veg_type_target_grid, &
                      farrayPtr=veg_type_target_ptr, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGet", rc)
        
   l = lbound(unmapped_ptr)
   u = ubound(unmapped_ptr)

   do ij = l(1), u(1)
     call ij_to_i_j(unmapped_ptr(ij), i_target, j_target, i, j)
     veg_type_target_ptr(i,j) = -9999.9 
   enddo

   do tile = 1, num_tiles_target_grid
     print*,"- CALL FieldGather FOR TARGET GRID VEG TYPE TILE: ", tile
     call ESMF_FieldGather(veg_type_target_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldGather", rc)

     print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
     call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldGather", rc)

     if (localpet == 0) then
       allocate(land_target_one_tile(i_target,j_target))
       land_target_one_tile = 0
       where(mask_target_one_tile == 1) land_target_one_tile = 1
       call search(data_one_tile, land_target_one_tile, i_target, j_target, tile, 225)
       deallocate(land_target_one_tile)
     endif

     print*,"- CALL FieldScatter FOR TARGET GRID VEG TYPE: ", tile
     call ESMF_FieldScatter(veg_type_target_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldScatter", rc)
   enddo
   nullify(veg_type_target_ptr) 
 endif
 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_all_land, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)
    
!-----------------------------------------------------------------------
! Next, determine the sea ice fraction on target grid.  
! Interpolate.
!-----------------------------------------------------------------------

 mask_input_ptr = 1
 where (nint(landmask_input_ptr) == 1) mask_input_ptr = 0
 
 mask_target_ptr = int(seamask_target_ptr,kind=esmf_kind_i4)

 method=ESMF_REGRIDMETHOD_CONSERVE

 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for sea ice fraction."
 call ESMF_FieldRegridStore(seaice_fract_input_grid, &
                            seaice_fract_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_nonland, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 print*,"- CALL Field_Regrid for sea ice fraction."
 call ESMF_FieldRegrid(seaice_fract_input_grid, &
                       seaice_fract_target_grid, &
                       routehandle=regrid_nonland, &
                       termorderflag=ESMF_TERMORDER_SRCSEQ, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegrid", rc)

 print*,"- CALL FieldGet FOR TARGET grid sea ice fraction."
 call ESMF_FieldGet(seaice_fract_target_grid, &
                    farrayPtr=seaice_fract_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 l = lbound(unmapped_ptr)
 u = ubound(unmapped_ptr)

 do ij = l(1), u(1)
   call ij_to_i_j(unmapped_ptr(ij), i_target, j_target, i, j)
   seaice_fract_target_ptr(i,j) = -9999.9 ! flag value for missing point
                               ! which will be replaced in routine
                               ! "search".
 enddo

 if (localpet == 0) then
   allocate(latitude_one_tile(i_target,j_target))
 else
   allocate(latitude_one_tile(0,0))
 endif

 do tile = 1, num_tiles_target_grid

   print*,"- CALL FieldGather FOR TARGET GRID SEAICE FRACTION TILE: ", tile
   call ESMF_FieldGather(seaice_fract_target_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
   
   print*,"- CALL FieldGather FOR TARGET GRID MASK TILE: ", tile
   call ESMF_FieldGather(seamask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   print*,"- CALL FieldGather FOR TARGET LATITUDE TILE: ", tile
   call ESMF_FieldGather(latitude_target_grid, latitude_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     call search(data_one_tile, mask_target_one_tile, i_target, j_target, tile, 91, &
                 latitude=latitude_one_tile)
   endif

   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
   
   
   if (localpet == 0) then
     do j = 1, j_target
     do i = 1, i_target
       if (data_one_tile(i,j) > 1.0_esmf_kind_r8) then
         data_one_tile(i,j) = 1.0_esmf_kind_r8
       endif
       if (data_one_tile(i,j) < 0.15_esmf_kind_r8) data_one_tile(i,j) = 0.0_esmf_kind_r8
       if (data_one_tile(i,j) >= 0.15_esmf_kind_r8) mask_target_one_tile(i,j) = 2
     enddo
     enddo
   endif

   print*,"- CALL FieldScatter FOR TARGET GRID SEAICE FRACTION TILE: ", tile
   call ESMF_FieldScatter(seaice_fract_target_grid, data_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldScatter", rc)

   print*,"- CALL FieldScatter FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldScatter(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldScatter", rc)

 enddo

 deallocate(latitude_one_tile)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_nonland, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!---------------------------------------------------------------------------------------------
! Now interpolate other sea ice related fields.  Since we know what points are ice on
! the target grid, reset the target grid mask.
!---------------------------------------------------------------------------------------------

 mask_input_ptr = 0
 where (nint(landmask_input_ptr) == 2) mask_input_ptr = 1

 print*,"- CALL FieldGet FOR TARGET land sea mask."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=landmask_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 mask_target_ptr = 0 
 do j = clb_target(2), cub_target(2)
 do i = clb_target(1), cub_target(1)
   if (landmask_target_ptr(i,j) == 2) mask_target_ptr(i,j) = 1
 enddo
 enddo

 method=ESMF_REGRIDMETHOD_NEAREST_STOD
 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for 3d seaice fields."
 call ESMF_FieldRegridStore(soil_temp_input_grid, &
                            soil_temp_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_seaice, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 bundle_seaice_target = ESMF_FieldBundleCreate(name="sea ice target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 bundle_seaice_input = ESMF_FieldBundleCreate(name="sea ice input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 call ESMF_FieldBundleAdd(bundle_seaice_target, (/seaice_depth_target_grid, snow_depth_target_grid, &
                          snow_liq_equiv_target_grid, seaice_skin_temp_target_grid, &
                          soil_temp_target_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleAdd(bundle_seaice_input, (/seaice_depth_input_grid, snow_depth_input_grid, &
                          snow_liq_equiv_input_grid, seaice_skin_temp_input_grid, &
                          soil_temp_input_grid/), rc=rc)                          
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleGet(bundle_seaice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)
 

 allocate(search_nums(num_fields))
 allocate(dozero(num_fields))

 search_nums = (/92,66,65,21,21/)
 dozero(:) = .True.
 
 l = lbound(unmapped_ptr)
 u = ubound(unmapped_ptr)
 
 call regrid_many(bundle_seaice_input,bundle_seaice_target,num_fields,regrid_seaice,dozero, &
                  unmapped_ptr=unmapped_ptr )
 deallocate(dozero)                 
 call ESMF_FieldBundleDestroy(bundle_seaice_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 do tile = 1, num_tiles_target_grid

   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then   
     where(mask_target_one_tile == 1) mask_target_one_tile = 0
     where(mask_target_one_tile == 2) mask_target_one_tile = 1
     call search_many(num_fields,bundle_seaice_target,tile, search_nums,localpet, &
                    mask=mask_target_one_tile)
   else
     call search_many(num_fields,bundle_seaice_target, tile,search_nums,localpet)
   endif

 enddo

 deallocate(search_nums)
 call ESMF_FieldBundleDestroy(bundle_seaice_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleDestroy", rc)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_seaice, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!---------------------------------------------------------------------------------------------
! Now interpolate water fields. 
!---------------------------------------------------------------------------------------------

 mask_input_ptr = 0
 where (nint(landmask_input_ptr) == 0) mask_input_ptr = 1

 mask_target_ptr = 0
 where (landmask_target_ptr == 0) mask_target_ptr = 1

 method=ESMF_REGRIDMETHOD_CONSERVE
 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for water fields."
 call ESMF_FieldRegridStore(skin_temp_input_grid, &
                            skin_temp_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_water, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 bundle_water_target = ESMF_FieldBundleCreate(name="water target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 bundle_water_input = ESMF_FieldBundleCreate(name="water input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 call ESMF_FieldBundleAdd(bundle_water_target, (/skin_temp_target_grid, z0_target_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleAdd(bundle_water_input, (/skin_temp_input_grid, z0_input_grid/), rc=rc)  
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)

 if (convert_nst) then

   call ESMF_FieldBundleAdd(bundle_water_target, (/c_d_target_grid,c_0_target_grid,d_conv_target_grid, &
                            dt_cool_target_grid,ifd_target_grid,qrain_target_grid,tref_target_grid, &
                            w_d_target_grid,w_0_target_grid,xs_target_grid,xt_target_grid,xu_target_grid, &
                            xv_target_grid,xz_target_grid,xtts_target_grid,xzts_target_grid, &
                            z_c_target_grid,zm_target_grid/), rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldBundleAdd", rc)
        
   call ESMF_FieldBundleAdd(bundle_water_input, (/c_d_input_grid,c_0_input_grid,d_conv_input_grid, &
                            dt_cool_input_grid,ifd_input_grid,qrain_input_grid,tref_input_grid, &
                            w_d_input_grid,w_0_input_grid,xs_input_grid,xt_input_grid,xu_input_grid, &
                            xv_input_grid,xz_input_grid,xtts_input_grid,xzts_input_grid, &
                            z_c_input_grid,zm_input_grid/), rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleGet(bundle_water_target,fieldCount=num_fields,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldBundleGet", rc)
        
   allocate(search_nums(num_fields))
   allocate(dozero(num_fields))
     
   search_nums(:)=(/11,83,0,0,0,0,1,0,11,0,0,0,0,0,0,30,0,0,0,0/)
   dozero(:) = .True.
             
 else
   call ESMF_FieldBundleGet(bundle_water_target,fieldCount=num_fields,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldBundleGet", rc)
        
   allocate(search_nums(num_fields))
   allocate(dozero(num_fields))
   search_nums(:)=(/11,83/)
   dozero(:) = .True.
 endif

 call regrid_many(bundle_water_input,bundle_water_target,num_fields,regrid_water,dozero, &
                  unmapped_ptr=unmapped_ptr, resetifd=.True.)
 deallocate(dozero)                 
 call ESMF_FieldBundleDestroy(bundle_water_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)


 if (localpet == 0) then
   allocate(latitude_one_tile(i_target,j_target))
 else
   allocate(latitude_one_tile(0,0))
 endif

 do tile = 1, num_tiles_target_grid

   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   print*,"- CALL FieldGather FOR TARGET LATITUDE TILE: ", tile
   call ESMF_FieldGather(latitude_target_grid, latitude_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     allocate(water_target_one_tile(i_target,j_target))
     water_target_one_tile = 0
     where(mask_target_one_tile == 0) water_target_one_tile = 1

     call search_many(num_fields,bundle_water_target, tile,search_nums,localpet, &
                latitude=latitude_one_tile,mask=water_target_one_tile)
   else
     call search_many(num_fields,bundle_water_target, tile,search_nums,localpet)
   endif

   if (localpet == 0) deallocate(water_target_one_tile)

 enddo

 deallocate(latitude_one_tile,search_nums)
 
 call ESMF_FieldBundleDestroy(bundle_water_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_water, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!---------------------------------------------------------------------------------------------
! Now interpolate "all land" to "all land".  Here, "all land" means landice and non-land ice.
!---------------------------------------------------------------------------------------------

 mask_input_ptr = 0
 where (nint(landmask_input_ptr) == 1) mask_input_ptr = 1

 mask_target_ptr = 0
 where (landmask_target_ptr == 1) mask_target_ptr = 1

 method=ESMF_REGRIDMETHOD_CONSERVE
 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for land fields."
 call ESMF_FieldRegridStore(snow_depth_input_grid, &
                            snow_depth_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_all_land, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

 bundle_allland_target = ESMF_FieldBundleCreate(name="all land target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 bundle_allland_input = ESMF_FieldBundleCreate(name="all land input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 call ESMF_FieldBundleAdd(bundle_allland_target, (/canopy_mc_target_grid, snow_depth_target_grid, &
                          snow_liq_equiv_target_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleAdd(bundle_allland_input, (/canopy_mc_input_grid, snow_depth_input_grid, &
                          snow_liq_equiv_input_grid/), rc=rc)                          
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleGet(bundle_allland_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)
 
 allocate(search_nums(num_fields))
 allocate(dozero(num_fields))

 search_nums = (/223,66,65/)
 dozero=(/.True.,.False.,.False./)
 
 call regrid_many(bundle_allland_input,bundle_allland_target,num_fields,regrid_all_land,dozero, &
                  unmapped_ptr=unmapped_ptr)
 deallocate(dozero)
 call ESMF_FieldBundleDestroy(bundle_allland_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)
  

 do tile = 1, num_tiles_target_grid

   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     allocate(land_target_one_tile(i_target,j_target))
     land_target_one_tile = 0
     where(mask_target_one_tile == 1) land_target_one_tile = 1
   
     call search_many(num_fields,bundle_allland_target, &
                    tile,search_nums,localpet, mask=land_target_one_tile)
   else
     call search_many(num_fields,bundle_allland_target, tile,search_nums,localpet)
   endif

   if (localpet == 0) deallocate(land_target_one_tile)   
 enddo

 deallocate(search_nums) 
 call ESMF_FieldBundleDestroy(bundle_allland_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)
      
 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_all_land, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!---------------------------------------------------------------------------------------------
! Now interpolate landice points to landice points.
!---------------------------------------------------------------------------------------------

 print*,"- CALL FieldGet FOR INPUT GRID VEG TYPE."
 call ESMF_FieldGet(veg_type_input_grid, &
                    farrayPtr=veg_type_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,'land ice check ',veg_type_landice_input

 mask_input_ptr = 0
 where (nint(veg_type_input_ptr) == veg_type_landice_input) mask_input_ptr = 1

 print*,"- CALL FieldGet FOR TARGET GRID VEG TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 mask_target_ptr = 0
 where (nint(veg_type_target_ptr) == veg_type_landice_target) mask_target_ptr = 1

 method=ESMF_REGRIDMETHOD_NEAREST_STOD
 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for landice fields."
 call ESMF_FieldRegridStore(soil_temp_input_grid, &
                            soil_temp_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_landice, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

  bundle_landice_target = ESMF_FieldBundleCreate(name="landice target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 bundle_landice_input = ESMF_FieldBundleCreate(name="landice input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
 call ESMF_FieldBundleAdd(bundle_landice_target, (/skin_temp_target_grid, terrain_from_input_grid,& 
                          soil_temp_target_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleAdd(bundle_landice_input, (/skin_temp_input_grid, terrain_input_grid,&
                          soil_temp_input_grid/), rc=rc)                       
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleAdd", rc)
 
 if (.not. sotyp_from_climo) then
   call ESMF_FieldBundleAdd(bundle_landice_input, (/soil_type_input_grid/),rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleAdd(bundle_landice_target,(/soil_type_target_grid/),rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleAdd", rc)
 endif  

 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 call ESMF_FieldBundleGet(bundle_landice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)

 allocate(search_nums(num_fields))
 allocate(dozero(num_fields))
 
 if (sotyp_from_climo) then
   search_nums = (/21,7,21/)
   dozero(:)=.False.
 else
   search_nums = (/21,7,21,231/)
   dozero(:)=(/.False.,.False.,.False.,.True./)
 endif

 call regrid_many(bundle_landice_input,bundle_landice_target,num_fields,regrid_landice,dozero, &
                  unmapped_ptr=unmapped_ptr )  
 deallocate(dozero)                                
 call ESMF_FieldBundleDestroy(bundle_landice_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 if (localpet == 0) then
   allocate (veg_type_target_one_tile(i_target,j_target))
   allocate (land_target_one_tile(i_target,j_target))
   allocate (data_one_tile2(i_target,j_target))
 else
   allocate (veg_type_target_one_tile(0,0))
   allocate (land_target_one_tile(0,0))
   allocate (data_one_tile2(0,0))
 endif

 do tile = 1, num_tiles_target_grid
   print*,"- CALL FieldGather FOR TARGET VEG TYPE TILE: ", tile
   call ESMF_FieldGather(veg_type_target_grid, veg_type_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     land_target_one_tile = 0
     where(nint(veg_type_target_one_tile) == veg_type_landice_target) land_target_one_tile = 1
   endif
   
   print*,"- CALL FieldGather FOR TERRAIN FROM INPUT GRID LAND, TILE: ", tile
    call ESMF_FieldGather(terrain_from_input_grid_land, data_one_tile2, rootPet=0, tile=tile, rc=rc)
    if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
       call error_handler("IN FieldGather", rc)

   if (localpet==0) then
      call search_many(num_fields,bundle_landice_target,tile,search_nums,localpet,&
                terrain_land=data_one_tile2,mask=land_target_one_tile)
   else
      call search_many(num_fields,bundle_landice_target,tile,search_nums,localpet)
   endif
 enddo

 deallocate (veg_type_target_one_tile)
 deallocate (land_target_one_tile)
 deallocate(search_nums)
 
 call ESMF_FieldBundleDestroy(bundle_landice_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_landice, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

!---------------------------------------------------------------------------------------------
! Now interpolate land (not including landice pts) to land (not including landice).
!---------------------------------------------------------------------------------------------

 mask_input_ptr = 0
 where (nint(landmask_input_ptr) == 1) mask_input_ptr = 1
 where (nint(veg_type_input_ptr) == veg_type_landice_input) mask_input_ptr = 0

 mask_target_ptr = 0
 where (landmask_target_ptr == 1) mask_target_ptr = 1
 where (nint(veg_type_target_ptr) == veg_type_landice_target) mask_target_ptr = 0

 method=ESMF_REGRIDMETHOD_NEAREST_STOD
 isrctermprocessing = 1

 print*,"- CALL FieldRegridStore for 3d land (but no land ice) fields."
 call ESMF_FieldRegridStore(soilm_tot_input_grid, &
                            soilm_tot_target_grid, &
                            srcmaskvalues=(/0/), &
                            dstmaskvalues=(/0/), &
                            polemethod=ESMF_POLEMETHOD_NONE, &
                            srctermprocessing=isrctermprocessing, &
                            unmappedaction=ESMF_UNMAPPEDACTION_IGNORE, &
                            normtype=ESMF_NORMTYPE_FRACAREA, &
                            routehandle=regrid_land, &
                            regridmethod=method, &
                            unmappedDstList=unmapped_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridStore", rc)

  bundle_nolandice_target = ESMF_FieldBundleCreate(name="land no landice target", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
      
 bundle_nolandice_input = ESMF_FieldBundleCreate(name="land no landice input", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleCreate", rc)
      
 call ESMF_FieldBundleAdd(bundle_nolandice_target, (/skin_temp_target_grid, terrain_from_input_grid,& 
                          soil_type_from_input_grid,soilm_tot_target_grid,soil_temp_target_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
      
 call ESMF_FieldBundleAdd(bundle_nolandice_input, (/skin_temp_input_grid, terrain_input_grid,&
                          soil_type_input_grid,soilm_tot_input_grid,soil_temp_input_grid/), rc=rc)
  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
 
 
 if (.not. sotyp_from_climo) then 
!   call ESMF_FieldBundleAdd(bundle_nolandice_target, (/soil_type_target_grid/), rc=rc)
!   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
!      call error_handler("IN FieldBundleAdd", rc)
!   call ESMF_FieldBundleAdd(bundle_nolandice_input, (/soil_type_input_grid/), rc=rc)
!   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
!      call error_handler("IN FieldBundleAdd", rc)
   print*,"- CALL Field_Regrid ."
   call ESMF_FieldRegrid(soil_type_input_grid, &
                         soil_type_target_grid, &
                         routehandle=regrid_land, &
                         zeroregion=ESMF_REGION_SELECT, &
                         termorderflag=ESMF_TERMORDER_SRCSEQ,  rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldRegrid", rc)
    
   call ESMF_FieldGet(soil_type_target_grid, &
                    farrayPtr=soil_type_target_ptr, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGet", rc)
    
   l = lbound(unmapped_ptr)
   u = ubound(unmapped_ptr)

   do ij = l(1), u(1)
     call ij_to_i_j(unmapped_ptr(ij), i_target, j_target, i, j)
     soil_type_target_ptr(i,j) = -9999.9 
   enddo
 !  call ESMF_FieldBundleGet(bundle_nolandice_target,fieldCount=num_fields,rc=rc)
 !  if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
 !     call error_handler("IN FieldBundleGet", rc)
 !  sotyp_ind = 3
 endif
 
 if (.not. vgfrc_from_climo) then 
   call ESMF_FieldBundleAdd(bundle_nolandice_target, (/veg_greenness_target_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleAdd(bundle_nolandice_input, (/veg_greenness_input_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleGet(bundle_nolandice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)
   vgfrc_ind = num_fields
 endif
 
 if (.not. lai_from_climo) then 
   call ESMF_FieldBundleAdd(bundle_nolandice_target, (/lai_target_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleAdd(bundle_nolandice_input, (/lai_input_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleGet(bundle_nolandice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)
   lai_ind = num_fields
 endif
 
 if (.not. minmax_vgfrc_from_climo) then 
   call ESMF_FieldBundleAdd(bundle_nolandice_target, (/max_veg_greenness_target_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleAdd(bundle_nolandice_input, (/max_veg_greenness_input_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
      
   call ESMF_FieldBundleAdd(bundle_nolandice_target, (/min_veg_greenness_target_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
   call ESMF_FieldBundleAdd(bundle_nolandice_input, (/min_veg_greenness_input_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleAdd", rc)
      
   call ESMF_FieldBundleGet(bundle_nolandice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)
      
   mmvg_ind = num_fields-1
 endif
 
 call ESMF_FieldBundleGet(bundle_nolandice_target,fieldCount=num_fields,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleGet", rc)

 allocate(search_nums(num_fields))
 allocate(dozero(num_fields))
 
 search_nums(1:5) = (/85,7,224,85,86/)
 dozero(1:5) = (/.False.,.False.,.True.,.True.,.False./)
 
 !if (.not.sotyp_from_climo) then
 !  search_nums(sotyp_ind) = 226
 !  dozero(sotyp_ind) = .False.
 !endif
 
 if (.not. vgfrc_from_climo) then
   search_nums(vgfrc_ind) = 224
   dozero(vgfrc_ind) = .True.
 endif
 
 if (.not. lai_from_climo) then
   search_nums(lai_ind) = 229
   dozero(lai_ind) = .True.
 endif
 
 if (.not. minmax_vgfrc_from_climo) then
   search_nums(mmvg_ind) = 227
   dozero(mmvg_ind) = .True.
   
   search_nums(mmvg_ind+1) = 228
   dozero(mmvg_ind+1) = .True.
 endif

 call regrid_many(bundle_nolandice_input,bundle_nolandice_target,num_fields,regrid_land,dozero, &
                  unmapped_ptr=unmapped_ptr)
 deallocate(dozero)
 call ESMF_FieldBundleDestroy(bundle_nolandice_input,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 if (localpet == 0) then
   allocate (veg_type_target_one_tile(i_target,j_target))
 else
   allocate (veg_type_target_one_tile(0,0))
 endif

 do tile = 1, num_tiles_target_grid

   print*,"- CALL FieldGather FOR TARGET LANDMASK TILE: ", tile
   call ESMF_FieldGather(landmask_target_grid, mask_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   print*,"- CALL FieldGather FOR TARGET VEG TYPE TILE: ", tile
   call ESMF_FieldGather(veg_type_target_grid, veg_type_target_one_tile, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     where(nint(veg_type_target_one_tile) == veg_type_landice_target) mask_target_one_tile = 0
   endif
   
   print*,"- CALL FieldGather FOR SOIL TYPE TARGET GRID, TILE: ", tile
   call ESMF_FieldGather(soil_type_target_grid, data_one_tile2, rootPet=0,tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldGather", rc)
   if (localpet==0) then 
      call search_many(num_fields,bundle_nolandice_target,tile,search_nums,localpet, &
                soilt_climo=data_one_tile2, mask=mask_target_one_tile)
   else
      call search_many(num_fields,bundle_nolandice_target, tile,search_nums,localpet)
   endif
   
   print*,"- CALL FieldGather FOR TARGET GRID TOTAL SOIL MOISTURE, TILE: ", tile
   call ESMF_FieldGather(soilm_tot_target_grid, data_one_tile_3d, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)

   if (localpet == 0) then
     do j = 1, lsoil_target
       data_one_tile = data_one_tile_3d(:,:,j)
       call search(data_one_tile, mask_target_one_tile, i_target, j_target, tile, 86)
       data_one_tile_3d(:,:,j) = data_one_tile
     enddo
   endif

   print*,"- CALL FieldGather FOR TARGET GRID SOIL TEMPERATURE, TILE: ", tile
   call ESMF_FieldGather(soil_temp_target_grid, data_one_tile_3d, rootPet=0, tile=tile, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
      
   if (tg3_from_soil) then
     print*,"- CALL FieldScatter FOR TARGET GRID SUBSTRATE TEMPERATURE, TILE: ", tile
     call ESMF_FieldScatter(substrate_temp_target_grid, data_one_tile_3d(:,:,lsoil_target), rootPet=0, tile=tile, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
        call error_handler("IN FieldScatter", rc)
   endif
   
   if (.not. sotyp_from_climo) then
     print*,"- CALL FieldGather FOR SOIL TYPE TARGET GRID LAND, TILE: ",tile
     call ESMF_FieldGather(soil_type_target_grid, data_one_tile,rootPet=0,tile=tile, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldGather", rc)

     if (localpet == 0) then
       call search(data_one_tile, mask_target_one_tile, i_target, j_target,tile,226)
     endif

     print*,"- CALL FieldScatter FOR SOIL TYPE TARGET GRID, TILE: ", tile
     call ESMF_FieldScatter(soil_type_target_grid,data_one_tile,rootPet=0,tile=tile,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldScatter", rc)
   endif

 enddo

 deallocate(search_nums) 
 call ESMF_FieldBundleDestroy(bundle_nolandice_target,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldBundleDestroy", rc)

 print*,"- CALL FieldRegridRelease."
 call ESMF_FieldRegridRelease(routehandle=regrid_land, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldRegridRelease", rc)

 deallocate(veg_type_target_one_tile)

 deallocate(data_one_tile, data_one_tile2)
 deallocate(data_one_tile_3d)
 deallocate(mask_target_one_tile)

 return

 end subroutine interp
 
!> Compute liquid portion of the total soil moisture.
!!
!! @author George Gayno NOAA/EMC
 subroutine calc_liq_soil_moisture

 use esmf

 use model_grid, only                : landmask_target_grid

 use program_setup, only             : maxsmc_target, &
                                       bb_target, &
                                       satpsi_target

 use static_data, only               : soil_type_target_grid, &
                                       veg_type_target_grid

 implicit none
 
 integer                            :: clb(3), cub(3), rc
 integer                            :: i, j, n, soil_type

 integer(esmf_kind_i8), pointer     :: landmask_ptr(:,:)

 real                               :: bx, fk
 real(esmf_kind_r8), pointer        :: soilm_liq_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soilm_tot_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soil_temp_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soil_type_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_ptr(:,:)

 print*,"- COMPUTE LIQUID PORTION OF TOTAL SOIL MOISTURE."

 print*,"- CALL FieldGet FOR TOTAL SOIL MOISTURE."
 call ESMF_FieldGet(soilm_tot_target_grid, &
                    computationalLBound=clb, &
                    computationalUBound=cub, &
                    farrayPtr=soilm_tot_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR LIQUID SOIL MOISTURE."
 call ESMF_FieldGet(soilm_liq_target_grid, &
                    farrayPtr=soilm_liq_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR SOIL TEMPERATURE."
 call ESMF_FieldGet(soil_temp_target_grid, &
                    farrayPtr=soil_temp_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR VEGETATION TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR SOIL TYPE."
 call ESMF_FieldGet(soil_type_target_grid, &
                    farrayPtr=soil_type_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR LANDMASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=landmask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
   do i = clb(1), cub(1)

!---------------------------------------------------------------------------------------------
! Check land points that are not permanent land ice.  
!---------------------------------------------------------------------------------------------

     if (landmask_ptr(i,j) == 1 .and. nint(veg_type_ptr(i,j)) /= veg_type_landice_target) then

       soil_type = nint(soil_type_ptr(i,j))

       do n = clb(3), cub(3) 

         if (soil_temp_ptr(i,j,n) < (frz_h2o-0.0001)) then

           bx = bb_target(soil_type)

           if (bx .gt. blim) bx = blim

           fk=(((hlice/(grav*(-satpsi_target(soil_type))))*           &
            ((soil_temp_ptr(i,j,n)-frz_h2o)/soil_temp_ptr(i,j,n)))**             &
            (-1/bx))*maxsmc_target(soil_type)

           if (fk .lt. 0.02) fk = 0.02

           soilm_liq_ptr(i,j,n) = min ( fk, soilm_tot_ptr(i,j,n) )

!-----------------------------------------------------------------------
! now use iterative solution for liquid soil water content using
! FUNCTION FRH2O with the initial guess for SH2O from above explicit
! first guess.
!-----------------------------------------------------------------------

           soilm_liq_ptr(i,j,n) = frh2O(soil_temp_ptr(i,j,n),                        &
                           soilm_tot_ptr(i,j,n), soilm_liq_ptr(i,j,n),             &
                           maxsmc_target(soil_type),bb_target(soil_type),    &
                           satpsi_target(soil_type))

         else  ! temp above freezing. all moisture is liquid

           soilm_liq_ptr(i,j,n) = soilm_tot_ptr(i,j,n)

         end if  ! is soil layer below freezing?

       enddo ! soil layer

     end if ! is this point land?

   enddo
 enddo

 end subroutine calc_liq_soil_moisture

!> Calculate supercooled soil moisture
!!
!! Calculate amount of supercooled liquid soil water content if
!! temperature is below 273.15K. Requires Newton-type iteration to
!! solve the nonlinear implicit equation given in eqn 17 of Koren et. al
!! (1999, JGR, VOL 104(D16), 19569-19585).
!!
!! New version (June 2001): Much faster and more accurate Newton
!! iteration achieved by first taking log of eqn cited above -- less than
!! 4 (typically 1 or 2) iterations achieves convergence. Also, explicit
!! 1-step solution option for special case of parameter ck=0, which
!! reduces the original implicit equation to a simpler explicit form,
!! known as the "Flerchinger eqn". Improved handling of solution in the
!! limit of freezing point temperature.
!!
!! @param[in]  tkelv  Temperature (Kelvin)
!! @param[in]  smc    Total soil moisture content (volumetric)
!! @param[in]  sh2O   Liquid soil moisture content (volumetric)
!! @param[in]  smcmax  Saturation soil moisture content
!! @param[in]  bexp    Soil type "b" parameter
!! @param[in]  psis    Saturated soil matric potential
!! @return     frh2O   Supercooled liquid water content
!!
!! @author George Gayno NOAA/EMC @date 2005-05-20
 FUNCTION FRH2O (TKELV,SMC,SH2O,SMCMAX,BEXP,PSIS)

 use esmf

 IMPLICIT NONE

 INTEGER NLOG
 INTEGER KCOUNT

 REAL BEXP
 REAL BX
 REAL DENOM
 REAL DF
 REAL DSWL
 REAL FK
 REAL FRH2O
 REAL PSIS
 REAL(esmf_kind_r8) :: SH2O
 REAL(esmf_kind_r8) :: SMC
 REAL SMCMAX
 REAL SWL
 REAL SWLK
 REAL(esmf_kind_r8) :: TKELV

 REAL, PARAMETER                  :: CK    = 8.0
 REAL, PARAMETER                  :: ERROR = 0.005

! ----------------------------------------------------------------------
! LIMITS ON PARAMETER B: B < 5.5  (use parameter BLIM)
! SIMULATIONS SHOWED IF B > 5.5 UNFROZEN WATER CONTENT IS
! NON-REALISTICALLY HIGH AT VERY LOW TEMPERATURES.
! ----------------------------------------------------------------------

 BX = BEXP
 IF (BEXP .GT. BLIM) BX = BLIM

! ----------------------------------------------------------------------
! INITIALIZING ITERATIONS COUNTER AND ITERATIVE SOLUTION FLAG.
! ----------------------------------------------------------------------

 NLOG=0
 KCOUNT=0

 IF (CK .NE. 0.0) THEN

! ----------------------------------------------------------------------
! OPTION 1: ITERATED SOLUTION FOR NONZERO CK
! IN KOREN ET AL, JGR, 1999, EQN 17
! ----------------------------------------------------------------------
! INITIAL GUESS FOR SWL (frozen content)
! ----------------------------------------------------------------------

   SWL = SMC-SH2O

! ----------------------------------------------------------------------
! KEEP WITHIN BOUNDS.
! ----------------------------------------------------------------------

   IF (SWL .GT. (SMC-0.02)) SWL = SMC-0.02
   IF (SWL .LT. 0.) SWL = 0.

! ----------------------------------------------------------------------
!  START OF ITERATIONS
! ----------------------------------------------------------------------

   DO WHILE ( (NLOG .LT. 10) .AND. (KCOUNT .EQ. 0) )

     NLOG = NLOG+1
     DF = LOG(( PSIS*GRAV/HLICE ) * ( ( 1.+CK*SWL )**2. ) *      &
        ( SMCMAX/(SMC-SWL) )**BX) - LOG(-(TKELV-frz_h2o)/TKELV)
     DENOM = 2. * CK / ( 1.+CK*SWL ) + BX / ( SMC - SWL )
     SWLK = SWL - DF/DENOM

! ----------------------------------------------------------------------
! BOUNDS USEFUL FOR MATHEMATICAL SOLUTION.
! ----------------------------------------------------------------------

     IF (SWLK .GT. (SMC-0.02)) SWLK = SMC - 0.02
     IF (SWLK .LT. 0.) SWLK = 0.

! ----------------------------------------------------------------------
! MATHEMATICAL SOLUTION BOUNDS APPLIED.
! ----------------------------------------------------------------------

     DSWL = ABS(SWLK-SWL)
     SWL = SWLK

! ----------------------------------------------------------------------
! IF MORE THAN 10 ITERATIONS, USE EXPLICIT METHOD (CK=0 APPROX.)
! WHEN DSWL LESS OR EQ. ERROR, NO MORE ITERATIONS REQUIRED.
! ----------------------------------------------------------------------

     IF ( DSWL .LE. ERROR )  THEN
       KCOUNT = KCOUNT+1
     ENDIF

   END DO

! ----------------------------------------------------------------------
!  END OF ITERATIONS
! ----------------------------------------------------------------------
! BOUNDS APPLIED WITHIN DO-BLOCK ARE VALID FOR PHYSICAL SOLUTION.
! ----------------------------------------------------------------------

   FRH2O = SMC - SWL

! ----------------------------------------------------------------------
! END OPTION 1
! ----------------------------------------------------------------------

 ENDIF

!-----------------------------------------------------------------------
! OPTION 2: EXPLICIT SOLUTION FOR FLERCHINGER EQ. i.e. CK=0
! IN KOREN ET AL., JGR, 1999, EQN 17
! APPLY PHYSICAL BOUNDS TO FLERCHINGER SOLUTION
! ----------------------------------------------------------------------

 IF (KCOUNT .EQ. 0) THEN

   FK = (((HLICE/(GRAV*(-PSIS)))*                  &
        ((TKELV-frz_h2o)/TKELV))**(-1/BX))*SMCMAX

   IF (FK .LT. 0.02) FK = 0.02

   FRH2O = MIN (FK, SMC)

 ENDIF

 RETURN

 END function frh2o

!> Adjust soil moisture for changes in soil type between the input and
!! target grids. Works for Noah land model only. Required to preserve
!! latent/sensible heat fluxes.
!!
!! @author George Gayno NOAA/EMC
 subroutine rescale_soil_moisture

 use esmf

 use model_grid, only                : landmask_target_grid

 use program_setup, only             : drysmc_input, drysmc_target, &
                                       maxsmc_input, maxsmc_target, &
                                       refsmc_input, refsmc_target, &
                                       wltsmc_input, wltsmc_target

 use static_data, only               : soil_type_target_grid, &
                                       veg_greenness_target_grid, &
                                       veg_type_target_grid

 implicit none

 integer                            :: clb(3), cub(3), i, j, k, rc
 integer                            :: soilt_input, soilt_target
 integer(esmf_kind_i8), pointer     :: landmask_ptr(:,:)

 real(esmf_kind_r8), pointer        :: soilm_tot_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soil_type_input_ptr(:,:)
 real(esmf_kind_r8), pointer        :: soil_type_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_greenness_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_ptr(:,:)
 real                               :: f1, fn, smcdir, smctra

 print*,"- RESCALE SOIL MOISTURE FOR CHANGES IN SOIL TYPE."

 print*,"- CALL FieldGet FOR TOTAL SOIL MOISTURE."
 call ESMF_FieldGet(soilm_tot_target_grid, &
                    computationalLBound=clb, &
                    computationalUBound=cub, &
                    farrayPtr=soilm_tot_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR LAND MASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=landmask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR VEGETATION TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR VEGETATION GREENNESS."
 call ESMF_FieldGet(veg_greenness_target_grid, &
                    farrayPtr=veg_greenness_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID SOIL TYPE."
 call ESMF_FieldGet(soil_type_target_grid, &
                    farrayPtr=soil_type_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR SOIL TYPE FROM INPUT GRID."
 call ESMF_FieldGet(soil_type_from_input_grid, &
                    farrayPtr=soil_type_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
   do i = clb(1), cub(1)

!---------------------------------------------------------------------------------------------
! Check land points that are not permanent land ice.  
!---------------------------------------------------------------------------------------------

     if (landmask_ptr(i,j) == 1 .and. nint(veg_type_ptr(i,j)) /= veg_type_landice_target) then

        soilt_target = nint(soil_type_target_ptr(i,j))
        soilt_input  = nint(soil_type_input_ptr(i,j))

!---------------------------------------------------------------------------------------------
! Rescale soil moisture at points where the soil type between the input and output
! grids is different.  Caution, this logic assumes the input and target grids use the same
! soil type dataset.
!---------------------------------------------------------------------------------------------

        if (soilt_target /= soilt_input) then
!---------------------------------------------------------------------------------------------
! Rescale top layer.  First, determine direct evaporation part:
!---------------------------------------------------------------------------------------------

          f1=(soilm_tot_ptr(i,j,1)-drysmc_input(soilt_input)) /    &
             (maxsmc_input(soilt_input)-drysmc_input(soilt_input))

          smcdir=drysmc_target(soilt_target) + f1 *        &
                (maxsmc_target(soilt_target) - drysmc_target(soilt_target))

!---------------------------------------------------------------------------------------------
! Continue top layer rescale.  Now determine transpiration part:
!---------------------------------------------------------------------------------------------

          if (soilm_tot_ptr(i,j,1) < refsmc_input(soilt_input)) then
            f1=(soilm_tot_ptr(i,j,1) - wltsmc_input(soilt_input)) /       &
               (refsmc_input(soilt_input) - wltsmc_input(soilt_input))
            smctra=wltsmc_target(soilt_target) + f1  *     &
                  (refsmc_target(soilt_target) - wltsmc_target(soilt_target))
          else
            f1=(soilm_tot_ptr(i,j,1) - refsmc_input(soilt_input)) /        &
               (maxsmc_input(soilt_input) - refsmc_input(soilt_input))
            smctra=refsmc_target(soilt_target) + f1 *      &
                  (maxsmc_target(soilt_target) - refsmc_target(soilt_target))
          endif

!---------------------------------------------------------------------------------------------
! Top layer is weighted by green vegetation fraction:
!---------------------------------------------------------------------------------------------

          soilm_tot_ptr(i,j,1) = ((1.0 - veg_greenness_ptr(i,j)) * smcdir)  + &
                                  (veg_greenness_ptr(i,j) * smctra)

!---------------------------------------------------------------------------------------------
! Rescale bottom layers as follows:
!
! - Rescale between wilting point and reference value when wilting < soil m < reference, or
! - Rescale between reference point and maximum value when reference < soil m < max.
!---------------------------------------------------------------------------------------------

          do k = 2, cub(3)
            if (soilm_tot_ptr(i,j,k) < refsmc_input(soilt_input)) then
              fn = (soilm_tot_ptr(i,j,k) - wltsmc_input(soilt_input)) /        &
                (refsmc_input(soilt_input) - wltsmc_input(soilt_input))
              soilm_tot_ptr(i,j,k) = wltsmc_target(soilt_target) + fn *         &
                (refsmc_target(soilt_target) - wltsmc_target(soilt_target))
            else
              fn = (soilm_tot_ptr(i,j,k) - refsmc_input(soilt_input)) /         &
                (maxsmc_input(soilt_input) - refsmc_input(soilt_input))
              soilm_tot_ptr(i,j,k) = refsmc_target(soilt_target) + fn *         &
                (maxsmc_target(soilt_target) - refsmc_target(soilt_target))
            endif
          enddo

        endif ! is soil type different?

!---------------------------------------------------------------------------------------------
! Range check all layers.
!---------------------------------------------------------------------------------------------

        soilm_tot_ptr(i,j,1)=min(soilm_tot_ptr(i,j,1),maxsmc_target(soilt_target))
        soilm_tot_ptr(i,j,1)=max(drysmc_target(soilt_target),soilm_tot_ptr(i,j,1))

        do k = 2, cub(3)
          soilm_tot_ptr(i,j,k)=min(soilm_tot_ptr(i,j,k),maxsmc_target(soilt_target))
          soilm_tot_ptr(i,j,k)=max(wltsmc_target(soilt_target),soilm_tot_ptr(i,j,k))
        enddo

     endif ! is this a land point?

   enddo
 enddo

 return

 end subroutine rescale_soil_moisture

!> Adjust soil temperature for changes in terrain height between the input and
!! target grids.
!!
!! @author George Gayno NOAA/EMC
 subroutine adjust_soilt_for_terrain

 use model_grid, only                : landmask_target_grid,  &
                                       terrain_target_grid

 use static_data, only               : veg_type_target_grid

 implicit none

 integer                            :: clb(3), cub(3), i, j, k, rc
 integer(esmf_kind_i8), pointer     :: landmask_ptr(:,:)

 real, parameter                    :: lapse_rate  = 6.5e-03
 real                               :: terrain_diff
 real(esmf_kind_r8), pointer        :: terrain_input_ptr(:,:)
 real(esmf_kind_r8), pointer        :: terrain_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_target_ptr(:,:)
 real(esmf_kind_r8), pointer        :: soil_temp_target_ptr(:,:,:)

 print*,"- CALL FieldGet FOR TARGET GRID LAND-SEA MASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=landmask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID VEGETATION TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID TERRAIN."
 call ESMF_FieldGet(terrain_target_grid, &
                    farrayPtr=terrain_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TERRAIN INTERP TO TARGET GRID."
 call ESMF_FieldGet(terrain_from_input_grid, &
                    farrayPtr=terrain_input_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR SOIL TEMP TARGET GRID."
 call ESMF_FieldGet(soil_temp_target_grid, &
                    computationalLBound=clb, &
                    computationalUBound=cub, &
                    farrayPtr=soil_temp_target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)
 
 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 1) then
     terrain_diff = abs(terrain_input_ptr(i,j) - terrain_target_ptr(i,j))
     if (terrain_diff > 100.0) then
       do k = clb(3), cub(3)
         soil_temp_target_ptr(i,j,k) = soil_temp_target_ptr(i,j,k) + &
              ((terrain_input_ptr(i,j) - terrain_target_ptr(i,j)) * lapse_rate)
         if (nint(veg_type_target_ptr(i,j)) == veg_type_landice_target) then
           soil_temp_target_ptr(i,j,k) = min(soil_temp_target_ptr(i,j,k), 273.16)
         endif
       enddo
     endif
   endif
 enddo
 enddo

 end subroutine adjust_soilt_for_terrain

!> Adjust soil levels of the input grid if there is a mismatch between input and
!! target grids. Presently can only convert from 9 to 4 levels. 
!!
!! @param[in] localpet  ESMF local persistent execution thread
!! @author Larissa Reames
!! @author Jeff Beck
 subroutine adjust_soil_levels(localpet)
 use model_grid, only       : lsoil_target, i_input, j_input, input_grid
 use sfc_input_data, only   : lsoil_input, soil_temp_input_grid, &
                              soilm_liq_input_grid, soilm_tot_input_grid
 implicit none
 integer, intent(in)                   :: localpet
 character(len=500)       :: msg
 character(len=2)         :: lsoil_input_ch, lsoil_target_ch
 integer                  :: rc
 real(esmf_kind_r8)          :: tmp(i_input,j_input), &
                                data_one_tile(i_input,j_input,lsoil_input), &
                                tmp3d(i_input,j_input,lsoil_target)
 if (lsoil_input == 9 .and. lsoil_target == 4) then
   print*, "CONVERTING FROM 9 INPUT SOIL LEVELS TO 4 TARGET SOIL LEVELS"
   call ESMF_FieldGather(soil_temp_input_grid, data_one_tile, rootPet=0, tile=1, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
      
   call ESMF_FieldDestroy(soil_temp_input_grid,rc=rc)
   soil_temp_input_grid = ESMF_FieldCreate(input_grid, &
                         typekind=ESMF_TYPEKIND_R8, &
                         staggerloc=ESMF_STAGGERLOC_CENTER, &
                         ungriddedLBound=(/1/), &
                         ungriddedUBound=(/lsoil_target/), rc=rc)
                                         
   if(localpet==0)then
      tmp3d(:,:,1)= (data_one_tile(:,:,1) + data_one_tile(:,:,2))/2.0 * 0.1 + &
                                      (data_one_tile(:,:,2) + data_one_tile(:,:,3))/2.0 * 0.3 + &
                                      (data_one_tile(:,:,3) + data_one_tile(:,:,4))/2.0 * 0.6
      tmp = (data_one_tile(:,:,6) - data_one_tile(:,:,5)) / 30.0 * 10.0 + data_one_tile(:,:,5) !Linear approx. of 40 cm obs
      tmp3d(:,:,2)= (data_one_tile(:,:,4) + data_one_tile(:,:,5)) / 2.0 * 0.75 + &
                                      (data_one_tile(:,:,5) + tmp) / 2.0 * 0.25
      tmp3d(:,:,3)= (tmp + data_one_tile(:,:,6)) /2.0 * (1.0/3.0) + &
                                      (data_one_tile(:,:,6) + data_one_tile(:,:,7)) / 2.0 * (2.0/3.0)
      tmp = (data_one_tile(:,:,9) - data_one_tile(:,:,9)) / 140.0 * 40.0 + data_one_tile(:,:,8) !Linear approx of 200 cm obs
      tmp3d(:,:,4)= (data_one_tile(:,:,7) + data_one_tile(:,:,8)) / 2.0 * 0.6 + &
                                      (data_one_tile(:,:,8) + tmp) / 2.0 * 0.4
   endif
  
   call ESMF_FieldScatter(soil_temp_input_grid, tmp3d, rootpet=0, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldScatter", rc)   
                                                                              
   call ESMF_FieldGather(soilm_tot_input_grid, data_one_tile, rootPet=0, tile=1, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
      
   call ESMF_FieldDestroy(soilm_tot_input_grid,rc=rc)
   soilm_tot_input_grid = ESMF_FieldCreate(input_grid, &
                         typekind=ESMF_TYPEKIND_R8, &
                         staggerloc=ESMF_STAGGERLOC_CENTER, &
                         ungriddedLBound=(/1/), &
                         ungriddedUBound=(/lsoil_target/), rc=rc)
                                         
  if(localpet==0) then
      tmp3d(:,:,1)= (data_one_tile(:,:,1) + data_one_tile(:,:,2))/2.0 * 0.1 + &
                                      (data_one_tile(:,:,2) + data_one_tile(:,:,3))/2.0 * 0.3 + &
                                      (data_one_tile(:,:,3) + data_one_tile(:,:,4))/2.0 * 0.6
      tmp = (data_one_tile(:,:,6) - data_one_tile(:,:,5)) / 30.0 * 10.0 + data_one_tile(:,:,5) !Linear approx. of 40 cm obs
      tmp3d(:,:,2)= (data_one_tile(:,:,4) + data_one_tile(:,:,5)) / 2.0 * 0.75 + &
                                      (data_one_tile(:,:,5) + tmp) / 2.0 * 0.25
      tmp3d(:,:,3)= (tmp + data_one_tile(:,:,6)) /2.0 * (1.0/3.0) + &
                                      (data_one_tile(:,:,6) + data_one_tile(:,:,7)) / 2.0 * (2.0/3.0)
      tmp = (data_one_tile(:,:,9) - data_one_tile(:,:,9)) / 140.0 * 40.0 + data_one_tile(:,:,8) !Linear approx of 200 cm obs
      tmp3d(:,:,4)= (data_one_tile(:,:,7) + data_one_tile(:,:,8)) / 2.0 * 0.6 + &
                                      (data_one_tile(:,:,8) + tmp) / 2.0 * 0.4
   endif
  
   call ESMF_FieldScatter(soilm_tot_input_grid, tmp3d, rootpet=0, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldScatter", rc)   
  
   call ESMF_FieldGather(soilm_liq_input_grid, data_one_tile, rootPet=0, tile=1, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldGather", rc)
      
   call ESMF_FieldDestroy(soilm_liq_input_grid,rc=rc)
   soilm_liq_input_grid = ESMF_FieldCreate(input_grid, &
                         typekind=ESMF_TYPEKIND_R8, &
                         staggerloc=ESMF_STAGGERLOC_CENTER, &
                         ungriddedLBound=(/1/), &
                         ungriddedUBound=(/lsoil_target/), rc=rc)
  if(localpet==0) then
      tmp3d(:,:,1)= (data_one_tile(:,:,1) + data_one_tile(:,:,2))/2.0 * 0.1 + &
                                      (data_one_tile(:,:,2) + data_one_tile(:,:,3))/2.0 * 0.3 + &
                                      (data_one_tile(:,:,3) + data_one_tile(:,:,4))/2.0 * 0.6
      tmp = (data_one_tile(:,:,6) - data_one_tile(:,:,5)) / 30.0 * 10.0 + data_one_tile(:,:,5) !Linear approx. of 40 cm obs
      tmp3d(:,:,2)= (data_one_tile(:,:,4) + data_one_tile(:,:,5)) / 2.0 * 0.75 + &
                                      (data_one_tile(:,:,5) + tmp) / 2.0 * 0.25
      tmp3d(:,:,3)= (tmp + data_one_tile(:,:,6)) /2.0 * (1.0/3.0) + &
                                      (data_one_tile(:,:,6) + data_one_tile(:,:,7)) / 2.0 * (2.0/3.0)
      tmp = (data_one_tile(:,:,9) - data_one_tile(:,:,9)) / 140.0 * 40.0 + data_one_tile(:,:,8) !Linear approx of 200 cm obs
      tmp3d(:,:,4)= (data_one_tile(:,:,7) + data_one_tile(:,:,8)) / 2.0 * 0.6 + &
                                      (data_one_tile(:,:,8) + tmp) / 2.0 * 0.4
   endif
  
   call ESMF_FieldScatter(soilm_liq_input_grid, tmp3d, rootpet=0, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldScatter", rc)   
 
 elseif (lsoil_input /= lsoil_target) then
  rc = -1
  write(lsoil_input_ch, '(i2)') lsoil_input
  write(lsoil_target_ch, '(i2)') lsoil_target
  msg="NUMBER OF SOIL LEVELS IN INPUT " // lsoil_input_ch // " AND OUTPUT " &
      // lsoil_target_ch // " MUST EITHER BE EQUAL OR 9 AND 4 RESPECTIVELY."
  call error_handler(msg, rc)
 endif
 
 end subroutine adjust_soil_levels

!> Set roughness length at land and sea ice. At land, roughness is
!! set from a lookup table based on the vegetation type. At sea ice,
!! roughness is set to 1 cm.
!!
!! @author George Gayno NOAA/EMC
 subroutine roughness

 use model_grid, only                : landmask_target_grid
 use static_data, only               : veg_type_target_grid

 implicit none

 integer                            :: clb(2), cub(2), i, j, rc
 integer(esmf_kind_i8), pointer     :: landmask_ptr(:,:)

 real                               :: z0_igbp(20)
 real(esmf_kind_r8), pointer        :: data_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_ptr(:,:)

 data z0_igbp /1.089, 2.653, 0.854, 0.826, 0.800, 0.050,  &
               0.030, 0.856, 0.856, 0.150, 0.040, 0.130,  &
               1.000, 0.250, 0.011, 0.011, 0.001, 0.076,  &
               0.050, 0.030/

 print*,"- CALL FieldGet FOR TARGET GRID LAND-SEA MASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    computationalLBound=clb, &
                    computationalUBound=cub, &
                    farrayPtr=landmask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID VEGETATION TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID Z0."
 call ESMF_FieldGet(z0_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 2) then
     data_ptr(i,j) = 1.0
   elseif (landmask_ptr(i,j) == 1) then
     data_ptr(i,j) = z0_igbp(nint(veg_type_ptr(i,j))) * 100.0
   endif
 enddo
 enddo

 end subroutine roughness

!> Perform some quality control checks before output.
!!
!! @author George Gayno NOAA/EMC
 subroutine qc_check

 use model_grid, only                : landmask_target_grid

 use static_data, only               : alvsf_target_grid, &
                                       alvwf_target_grid, &
                                       alnsf_target_grid, &
                                       alnwf_target_grid, &
                                       facsf_target_grid, &
                                       facwf_target_grid, &
                                       mxsno_albedo_target_grid, &
                                       max_veg_greenness_target_grid, &
                                       min_veg_greenness_target_grid, &
                                       slope_type_target_grid, &
                                       soil_type_target_grid, &
                                       substrate_temp_target_grid, &
                                       veg_greenness_target_grid, &
                                       veg_type_target_grid

 implicit none

 integer                            :: clb(2), cub(2), i, j, rc
 integer(esmf_kind_i8), pointer     :: landmask_ptr(:,:)

 real(esmf_kind_r8), pointer        :: data_ptr(:,:)
 real(esmf_kind_r8), pointer        :: data3d_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soilmt_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: soilml_ptr(:,:,:)
 real(esmf_kind_r8), pointer        :: veg_greenness_ptr(:,:)
 real(esmf_kind_r8), pointer        :: veg_type_ptr(:,:)
 real(esmf_kind_r8), pointer        :: seaice_skint_ptr(:,:)
 real(esmf_kind_r8), pointer        :: skint_ptr(:,:)
 real(esmf_kind_r8), pointer        :: fice_ptr(:,:)
 real(esmf_kind_r8), pointer        :: hice_ptr(:,:)

 print*,"- CALL FieldGet FOR TARGET GRID LAND-SEA MASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    computationalLBound=clb, &
                    computationalUBound=cub, &
                    farrayPtr=landmask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- SET NON-LAND FLAG FOR TARGET GRID SLOPE TYPE."
 call ESMF_FieldGet(slope_type_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID SOIL TYPE."
 call ESMF_FieldGet(soil_type_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID VEGETATION TYPE."
 call ESMF_FieldGet(veg_type_target_grid, &
                    farrayPtr=veg_type_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) veg_type_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET TARGET GRID ALVSF AT NON-LAND."
 call ESMF_FieldGet(alvsf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.06 ! gfs physics flag value
 enddo
 enddo

 print*,"- SET TARGET GRID ALVWF AT NON-LAND."
 call ESMF_FieldGet(alvwf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.06 ! gfs physics flag value
 enddo
 enddo

 print*,"- SET TARGET GRID ALNSF AT NON-LAND."
 call ESMF_FieldGet(alnsf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.06 ! gfs physics flag value
 enddo
 enddo

 print*,"- SET TARGET GRID ALNWF AT NON-LAND."
 call ESMF_FieldGet(alnwf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.06 ! gfs physics flag value
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID FACSF."
 call ESMF_FieldGet(facsf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID FACSF."
 call ESMF_FieldGet(facwf_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID MAXIMUM GREENNESS."
 call ESMF_FieldGet(max_veg_greenness_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID MINIMUM GREENNESS."
 call ESMF_FieldGet(min_veg_greenness_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID VEGETATION GREENNESS."
 call ESMF_FieldGet(veg_greenness_target_grid, &
                    farrayPtr=veg_greenness_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) veg_greenness_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- SET NON-LAND FLAG FOR TARGET GRID MAX SNOW ALBEDO."
 call ESMF_FieldGet(mxsno_albedo_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) /= 1) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- ZERO OUT TARGET GRID CANOPY MOISTURE CONTENT WHERE NO PLANTS."
 call ESMF_FieldGet(canopy_mc_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (veg_greenness_ptr(i,j) <= 0.01) data_ptr(i,j) = 0.0
 enddo
 enddo

 print*,"- CALL FieldGet FOR TARGET GRID ICE SKIN TEMP."
 call ESMF_FieldGet(seaice_skin_temp_target_grid, &
                    farrayPtr=seaice_skint_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- SET TARGET GRID SKIN TEMP AT ICE POINTS."
 call ESMF_FieldGet(skin_temp_target_grid, &
                    farrayPtr=skint_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR TARGET GRID SEA ICE FRACTION."
 call ESMF_FieldGet(seaice_fract_target_grid, &
                    farrayPtr=fice_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- SET TARGET GRID SEA ICE DEPTH TO ZERO AT NON-ICE POINTS."
 call ESMF_FieldGet(seaice_depth_target_grid, &
                    farrayPtr=hice_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (fice_ptr(i,j) > 0.0) then
     skint_ptr(i,j) = (fice_ptr(i,j) * seaice_skint_ptr(i,j)) +  &
                      ( (1.0 - fice_ptr(i,j)) * frz_ice )
   else
     seaice_skint_ptr(i,j) = skint_ptr(i,j)
     hice_ptr(i,j) = 0.0
   endif
 enddo
 enddo

 print*,"- SET TARGET GRID SUBSTRATE TEMP AT ICE."
 call ESMF_FieldGet(substrate_temp_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 2) then  ! sea ice
     data_ptr(i,j) = frz_ice
   elseif (landmask_ptr(i,j) == 0) then  ! open water flag value.
     data_ptr(i,j) = skint_ptr(i,j)
   endif
 enddo
 enddo

 print*,"- ZERO OUT TARGET GRID SNOW DEPTH AT OPEN WATER."
 call ESMF_FieldGet(snow_depth_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 0) then  ! open water
     data_ptr(i,j) = 0.0
   end if
 enddo
 enddo

 print*,"- ZERO OUT TARGET GRID SNOW LIQ AT OPEN WATER."
 call ESMF_FieldGet(snow_liq_equiv_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 0) then  ! open water
     data_ptr(i,j) = 0.0
   endif
 enddo
 enddo

 print*,"- SET NON-LAND FLAG VALUE FOR TARGET GRID TOTAL SOIL MOISTURE."
 call ESMF_FieldGet(soilm_tot_target_grid, &
                    farrayPtr=soilmt_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 print*,"- SET NON-LAND FLAG VALUE FOR  TARGET GRID LIQUID SOIL MOISTURE."
 call ESMF_FieldGet(soilm_liq_target_grid, &
                    farrayPtr=soilml_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 2 .or. landmask_ptr(i,j) == 0 .or. &
       nint(veg_type_ptr(i,j)) == veg_type_landice_target) then
     soilmt_ptr(i,j,:) = 1.0
     soilml_ptr(i,j,:) = 1.0
   endif
 enddo
 enddo

 print*,"- SET OPEN WATER FLAG FOR TARGET GRID SOIL TEMPERATURE."
 call ESMF_FieldGet(soil_temp_target_grid, &
                    farrayPtr=data3d_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 do j = clb(2), cub(2)
 do i = clb(1), cub(1)
   if (landmask_ptr(i,j) == 0) then
     data3d_ptr(i,j,:) = skint_ptr(i,j)  ! open water flag value.
   endif
 enddo
 enddo

 return

 end subroutine qc_check

!> nst is not active at land or sea ice points.  Set nst fields to flag values at these
!! points.
!!
!! @author George Gayno NOAA/EMC
 subroutine nst_land_fill

 use model_grid, only         : landmask_target_grid

 implicit none

 integer(esmf_kind_i8), pointer     :: mask_ptr(:,:)
 integer                            :: rc,i
 integer, PARAMETER                 :: num_nst_fields_minus2 = 16
 integer, PARAMETER                 :: xz_fill = 30.0
 integer, PARAMETER                 :: nst_fill = 0.0

 real(esmf_kind_r8), pointer        :: data_ptr(:,:)
 real(esmf_kind_r8), pointer        :: skint_ptr(:,:)

 type(esmf_field)                   :: temp_field
 type(esmf_fieldbundle)             :: nst_bundle

 print*,"- CALL FieldGet FOR TARGET GRID LANDMASK."
 call ESMF_FieldGet(landmask_target_grid, &
                    farrayPtr=mask_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN FieldGet", rc)
    
 nst_bundle = ESMF_FieldBundleCreate(name="nst_bundle", rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleCreate", rc)

 call ESMF_FieldBundleAdd(nst_bundle, (/c_d_target_grid,c_0_target_grid,d_conv_target_grid, &
                          dt_cool_target_grid,ifd_target_grid,qrain_target_grid,&
                          w_d_target_grid,w_0_target_grid,xs_target_grid,xt_target_grid,&
                          xu_target_grid,xv_target_grid,xtts_target_grid,xzts_target_grid, &
                          z_c_target_grid, zm_target_grid/), rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleAdd", rc) 

 print*,"- CALL FieldGet FOR TREF."
 call ESMF_FieldGet(tref_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN FieldGet", rc)

 print*,"- CALL FieldGet FOR SKIN T."
 call ESMF_FieldGet(skin_temp_target_grid, &
                    farrayPtr=skint_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN FieldGet", rc)

 where(mask_ptr /= 0) data_ptr = skint_ptr

! xz

 print*,"- CALL FieldGet FOR XZ."
 call ESMF_FieldGet(xz_target_grid, &
                    farrayPtr=data_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN FieldGet", rc)

 where(mask_ptr /= 0) data_ptr = xz_fill

 do i = 1,num_nst_fields_minus2
   
   call ESMF_FieldBundleGet(nst_bundle,i,temp_field,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
       call error_handler("IN FieldBundleGet", rc)
       
   call ESMF_FieldGet(temp_field,farrayPtr=data_ptr,rc=rc)
    if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
     call error_handler("IN FieldGet", rc)
     
   where(mask_ptr /= 0) data_ptr = nst_fill

 enddo

 call ESMF_FieldBundleDestroy(nst_bundle,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldBundleDestroy", rc)  
      
 end subroutine nst_land_fill

!> Create ESMF fields for the target grid surface variables
!!
!! @author George Gayno NOAA/EMC
 subroutine create_surface_esmf_fields

 use model_grid, only         : target_grid, lsoil_target

 implicit none

 integer                        :: rc

 real(esmf_kind_r8), pointer    :: target_ptr(:,:), target_ptr_3d(:,:,:)
 real                           :: init_val = -999.9

 print*,"- CALL FieldCreate FOR TARGET GRID T2M."
 t2m_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="t2m_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid t2m."
 call ESMF_FieldGet(t2m_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID Q2M."
 q2m_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="q2m_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid q2m."
 call ESMF_FieldGet(q2m_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID TPRCP."
 tprcp_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="tprcp_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid tprcp."
 call ESMF_FieldGet(tprcp_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID F10M."
 f10m_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="f10m_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid f10m."
 call ESMF_FieldGet(f10m_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID FFMM."
 ffmm_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="ffmm_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid ffmm."
 call ESMF_FieldGet(ffmm_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID USTAR."
 ustar_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name="ustar_target_grid", &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid ustar."
 call ESMF_FieldGet(ustar_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SNOW LIQ EQUIV."
 snow_liq_equiv_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="snow_liq_equiv_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid snow liq equiv."
 call ESMF_FieldGet(snow_liq_equiv_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SNOW DEPTH."
 snow_depth_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="snow_depth_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid snow depth."
 call ESMF_FieldGet(snow_depth_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SEA ICE FRACTION."
 seaice_fract_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="seaice_fract_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid sea ice fraction."
 call ESMF_FieldGet(seaice_fract_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SEA ICE DEPTH."
 seaice_depth_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="seaice_depth_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET sea ice depth."
 call ESMF_FieldGet(seaice_depth_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SEA ICE SKIN TEMP."
 seaice_skin_temp_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="seaice_skin_temp_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET sea ice skin temp."
 call ESMF_FieldGet(seaice_skin_temp_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SRFLAG."
 srflag_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="srflag_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET srflag."
 call ESMF_FieldGet(srflag_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SKIN TEMPERATURE."
 skin_temp_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="skin_temp_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid skin temp."
 call ESMF_FieldGet(skin_temp_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID CANOPY MOISTURE CONTENT."
 canopy_mc_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="canopy_mc_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid canopy moisture."
 call ESMF_FieldGet(canopy_mc_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val
 
 print*,"- CALL FieldCreate FOR TARGET GRID LEAF AREA INDEX."
 lai_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="lai_target_grid",&
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET leaf area index."
 call ESMF_FieldGet(lai_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID Z0."
 z0_target_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="z0_target_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid z0."
 call ESMF_FieldGet(z0_target_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR INTERPOLATED TARGET GRID TERRAIN."
 terrain_from_input_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     name="terrain_from_input_grid", &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid interpolated terrain."
 call ESMF_FieldGet(terrain_from_input_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR INTERPOLATED TARGET GRID SOIL TYPE."
 soil_type_from_input_grid = ESMF_FieldCreate(target_grid, &
                                     typekind=ESMF_TYPEKIND_R8, &
                                     staggerloc=ESMF_STAGGERLOC_CENTER, &
                                     name="soil_type_from_input_grid", rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid soil type"
 call ESMF_FieldGet(soil_type_from_input_grid, &
                    farrayPtr=target_ptr, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID SOIL TEMPERATURE."
 soil_temp_target_grid = ESMF_FieldCreate(target_grid, &
                                   typekind=ESMF_TYPEKIND_R8, &
                                   staggerloc=ESMF_STAGGERLOC_CENTER, &
                                   name="soil_temp_target_grid", &
                                   ungriddedLBound=(/1/), &
                                   ungriddedUBound=(/lsoil_target/), rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid soil temp"
 call ESMF_FieldGet(soil_temp_target_grid, &
                    farrayPtr=target_ptr_3d, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr_3d = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID TOTAL SOIL MOISTURE."
 soilm_tot_target_grid = ESMF_FieldCreate(target_grid, &
                                   typekind=ESMF_TYPEKIND_R8, &
                                   staggerloc=ESMF_STAGGERLOC_CENTER, &
                                   name="soilm_tot_target_grid", &
                                   ungriddedLBound=(/1/), &
                                   ungriddedUBound=(/lsoil_target/), rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid soil moist"
 call ESMF_FieldGet(soilm_tot_target_grid, &
                    farrayPtr=target_ptr_3d, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr_3d = init_val

 print*,"- CALL FieldCreate FOR TARGET GRID LIQUID SOIL MOISTURE."
 soilm_liq_target_grid = ESMF_FieldCreate(target_grid, &
                                   typekind=ESMF_TYPEKIND_R8, &
                                   staggerloc=ESMF_STAGGERLOC_CENTER, &
                                   name="soilm_liq_target_grid", &
                                   ungriddedLBound=(/1/), &
                                   ungriddedUBound=(/lsoil_target/), rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- INITIALIZE TARGET grid soil liq"
 call ESMF_FieldGet(soilm_liq_target_grid, &
                    farrayPtr=target_ptr_3d, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldGet", rc)

 target_ptr_3d = init_val

 end subroutine create_surface_esmf_fields

!> Create ESMF fields for the target grid nst variables
!!
!! @author George Gayno
 subroutine create_nst_esmf_fields

 use model_grid, only               : target_grid

 implicit none

 integer                           :: rc

 print*,"- CALL FieldCreate FOR TARGET GRID C_D."
 c_d_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='c_d', &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID C_0."
 c_0_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='c_0', &
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID D_CONV."
 d_conv_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='d_conv',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID DT_COOL."
 dt_cool_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='dt_cool',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID IFD."
 ifd_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='ifd',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID QRAIN."
 qrain_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='qrain',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID TREF."
 tref_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='tref',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID W_D."
 w_d_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='w_d',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID W_0."
 w_0_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='w_0',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XS."
 xs_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xs',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XT."
 xt_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xt',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XU."
 xu_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xu',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XV."
 xv_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xv',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XZ."
 xz_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xz',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XTTS."
 xtts_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xtts',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID XZTS."
 xzts_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='xzts',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID Z_C."
 z_c_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='z_c',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 print*,"- CALL FieldCreate FOR TARGET GRID ZM."
 zm_target_grid = ESMF_FieldCreate(target_grid, &
                                    typekind=ESMF_TYPEKIND_R8, &
                                     name='zm',&
                                    staggerloc=ESMF_STAGGERLOC_CENTER, rc=rc)
 if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
    call error_handler("IN FieldCreate", rc)

 end subroutine create_nst_esmf_fields

!> Convert 1d index to 2d indices.
!!
!! @param[in] ij  the 1d index
!! @param[in] itile  i-dimension of the tile
!! @param[in] jtile  j-dimension of the tile
!! @param[out] i  the "i" index
!! @param[out] j  the "j" index
!! @author George Gayno NOAA/EMC
 subroutine ij_to_i_j(ij, itile, jtile, i, j)

 implicit none

 integer(esmf_kind_i4), intent(in)  :: ij
 integer              , intent(in)  :: itile, jtile

 integer              , intent(out) :: i, j

 integer                            :: tile_num
 integer                            :: pt_loc_this_tile

 tile_num = ((ij-1) / (itile*jtile)) ! tile number minus 1
 pt_loc_this_tile = ij - (tile_num * itile * jtile)
                                     ! "ij" location of point within tile.

 j = (pt_loc_this_tile - 1) / itile + 1
 i = mod(pt_loc_this_tile, itile)

 if (i==0) i = itile

 return

 end subroutine ij_to_i_j

!> Regrid multiple ESMF fields from input to target grid
!!
!! @param[in] bundle_pre  ESMF fieldBundle on input grid
!! @param[in] bundle_post  ESMF fieldBundle on target grid
!! @param[in] num_field  Number of fields in target field pointer
!! @param[inout] route  Route handle to saved ESMF regridding instructions
!! @param[in]  dozero  Logical length num_field for whether field should be zeroed out before regridding
!! @param[inout]  unmapped_ptr (optional) Pointer to unmapped points from FieldRegrid
!! @param[in]  resetifd (optional) Logical for whether to reset ifd (only for water where nst data is used)
!! @author Larissa Reames, OU CIMMS/NOAA/NSSL
 subroutine regrid_many(bundle_pre,bundle_post, num_field,route,dozero, &
                        unmapped_ptr,resetifd)
 
 use esmf  
 use program_setup, only                : convert_nst
 use model_grid, only                   : i_target, j_target

 implicit none
 
 integer, intent(in)                    :: num_field
 type(esmf_routehandle), intent(inout)  :: route
 type(esmf_fieldbundle), intent(in)     :: bundle_pre, bundle_post
 logical, intent(in)                    :: dozero(num_field)
 logical, intent(in), optional       :: resetifd
 integer(esmf_kind_i4), intent(inout), optional  :: unmapped_ptr(:)
 
 type(esmf_field)                       :: field_pre,field_post
 real(esmf_kind_r8), pointer            :: tmp_ptr(:,:)
 type(realptr_2d),allocatable           :: ptr_2d(:)
 type(realptr_3d),allocatable           :: ptr_3d(:)
 logical                                :: is2d(num_field)
 character(len=50)                      :: fname
 integer :: i, j, k, ij, ind_2d, ind_3d, rc, ndims,n2d, n3d,localpet, l(1), u(1)
 type(esmf_vm) :: vm

 ind_2d = 0
 ind_3d = 0

 if(present(unmapped_ptr)) then
   l = lbound(unmapped_ptr)
   u = ubound(unmapped_ptr)
 endif
 
 do i = 1, num_field
   call ESMF_FieldBundleGet(bundle_pre,i,field_pre,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
     call error_handler("IN FieldBundleGet", rc)

   call ESMF_FieldBundleGet(bundle_post,i,field_post,rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
     call error_handler("IN FieldBundleGet", rc)

   call ESMF_FieldGet(field_post,dimCount=ndims,name=fname,rc=rc)   
    if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
     call error_handler("IN FieldGet", rc)
   
   call ESMF_VMGetGlobal(vm, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN VMGetGlobal", rc)
   call ESMF_VMGet(vm, localPet=localpet, rc=rc)
   if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
    call error_handler("IN VMGet", rc)
   if(localpet==0) print*, "in regrid_many fname = ", fname, ndims
   if (ndims == 2) is2d(i) = .True.
   if (ndims == 3) is2d(i) = .False.
   
   if (dozero(i)) then
     call ESMF_FieldRegrid(field_pre, &
                           field_post, &
                           routehandle=route, &
                           termorderflag=ESMF_TERMORDER_SRCSEQ, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldRegrid", rc)
   else
     call ESMF_FieldRegrid(field_pre, &
                           field_post, &
                           routehandle=route, &
                           zeroregion=ESMF_REGION_SELECT, &
                           termorderflag=ESMF_TERMORDER_SRCSEQ, rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
      call error_handler("IN FieldRegrid", rc)
   endif
 enddo
 
 if (present(resetifd)) then
   if( resetifd .and. convert_nst) then 
     call ESMF_FieldGet(ifd_target_grid,farrayPtr=tmp_ptr,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
         call error_handler("IN FieldGet", rc)
     tmp_ptr = float(nint(tmp_ptr))
   endif
 endif
 
 n2d = count(is2d(:))
 n3d = count(.not.is2d(:))
 if(localpet==0) print*, is2d(:) 
 if (present(unmapped_ptr)) then
   allocate(ptr_2d(n2d))
   if (n3d .ne. 0) allocate(ptr_3d(n3d))
   do i=1, num_field
     if (is2d(i)) then 
       ind_2d = ind_2d + 1
       call ESMF_FieldBundleGet(bundle_post,i,field_post,rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
         call error_handler("IN FieldBundleGet", rc)
       call ESMF_FieldGet(field_post, farrayPtr=ptr_2d(ind_2d)%p, rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
         call error_handler("IN FieldGet", rc) 
       call ESMF_FieldGet(field_post,name=fname,rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
          call error_handler("IN FieldGet", rc)
       if (localpet==0) print*, "in doreplace loop, 2d field = ", trim(fname)
     else
       ind_3d = ind_3d + 1
       call ESMF_FieldBundleGet(bundle_post,i,field_post,rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
         call error_handler("IN FieldBundleGet", rc)
       call ESMF_FieldGet(field_post,name=fname,rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
          call error_handler("IN FieldGet", rc)
       if (localpet==0) print*, "in doreplace loop, 3d field = ", trim(fname)
       call ESMF_FieldGet(field_post, farrayPtr=ptr_3d(ind_3d)%p, rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__)) &
          call error_handler("IN FieldGet", rc) 
     endif
   end do
 
   do ij = l(1), u(1)
     call ij_to_i_j(unmapped_ptr(ij), i_target, j_target, i, j)
     do k = 1,n2d
       ptr_2d(k)%p(i,j) = -9999.9
     enddo 
     do k = 1,n3d
       ptr_3d(k)%p(i,j,:) = -9999.9
     enddo
   enddo
   deallocate(ptr_2d)
   if(n3d .ne. 0) deallocate(ptr_3d)
 endif
 end subroutine regrid_many

!> Execute the search function for multple fields
!!
!! @param[in] num_field  Number of fields to process.
!! @param[inout] bundle_target  ESMF FieldBundle holding target fields to search
!! @param[in] tile  Current cubed sphere tile.
!! @param[inout]  search_nums  Array length num_field holding search field numbers corresponding to each field provided for searching.
!! @param[in]  localpet  ESMF local persistent execution thread.
!! @param[in]  latitude  (optional) A real array size i_target,j_target of latitude on the target grid 
!! @param[in]  terrain_land  (optional) A real array size i_target,j_target of terrain height (m) on the target grid 
!! @param[in]  soilt_climo  (optional) A real array size i_target,j_target of climatological soil type on the target grid 
!! @param[inout] mask  (optional) An integer array of size i_target,j_target that holds masked (0) and unmasked (1)
!!                     values indicating where to execute search (only at
!unmasked points).
!! @author Larissa Reames, OU CIMMS/NOAA/NSSL
 subroutine search_many(num_field,bundle_target,tile,search_nums,localpet,latitude, &
                        terrain_land,soilt_climo, mask)

 use model_grid, only                  : i_target,j_target, lsoil_target
 use program_setup, only               : external_model, input_type
 use search_util

 implicit none

 integer, intent(in)                         :: num_field
 type(esmf_fieldbundle), intent(inout)       :: bundle_target

 real(esmf_kind_r8), intent(inout), optional :: latitude(i_target,j_target)
 real(esmf_kind_r8), intent(inout), optional :: terrain_land(i_target,j_target)
 real(esmf_kind_r8), intent(inout), optional :: soilt_climo(i_target,j_target)
 integer(esmf_kind_i8), intent(inout), optional  :: mask(i_target,j_target)
 
 real(esmf_kind_r8), allocatable :: field_data_2d(:,:)   
 real(esmf_kind_r8), allocatable :: field_data_3d(:,:,:)  
 integer, intent(in)             :: tile,localpet
 integer, intent(inout)          :: search_nums(num_field)
 
 type(esmf_field)                :: temp_field
 character(len=50)               :: fname
 integer, parameter              :: SOTYP_LAND_FIELD_NUM = 224
 integer, parameter              :: SST_FIELD_NUM = 11
 integer, parameter              :: TERRAIN_FIELD_NUM= 7
 integer :: j,k, rc, ndims

 
 do k = 1,num_field
   call ESMF_FieldBundleGet(bundle_target,k,temp_field, rc=rc)
    if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
      call error_handler("IN FieldGet", rc)
   call ESMF_FieldGet(temp_field, name=fname, dimcount=ndims,rc=rc)
        if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
          call error_handler("IN FieldGet", rc)
   if (localpet==0) then
       allocate(field_data_2d(i_target,j_target))
   else
       allocate(field_data_2d(0,0))
   endif
   if (ndims .eq. 2) then
       call ESMF_FieldGather(temp_field,field_data_2d,rootPet=0,tile=tile, rc=rc)
       if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldGather", rc)
     if (localpet == 0) then 
       if (present(latitude) .and. search_nums(k).eq.SST_FIELD_NUM) then
         ! Sea surface temperatures; pass latitude field to search
         call search(field_data_2d, mask, i_target, j_target, tile,search_nums(k),latitude=latitude)
       elseif (present(terrain_land) .and. search_nums(k) .eq. TERRAIN_FIELD_NUM) then
         ! Terrain height; pass optional climo terrain array to search
         call search(field_data_2d, mask, i_target, j_target, tile,search_nums(k),terrain_land=terrain_land)
       elseif (search_nums(k) .eq. SOTYP_LAND_FIELD_NUM) then
         ! Soil type over land    
         if (fname .eq. "soil_type_target_grid") then
           ! Soil type over land when interpolating input data to target grid
           ! *with* the intention of retaining interpolated data in output
           call search(field_data_2d, mask, i_target, j_target, tile,search_nums(k),soilt_climo=soilt_climo)
         elseif (present(soilt_climo)) then
           if (maxval(field_data_2d) > 0 .and. (trim(external_model) .ne. "GFS" .or. trim(input_type) .ne. "grib2")) then
             ! Soil type over land when interpolating input data to target grid
             ! *without* the intention of retaining data in output file
             call search(field_data_2d, mask, i_target, j_target, tile, search_nums(k))
           else 
             ! If no soil type field exists in input data (e.g., GFS grib2) then don't search
             ! but simply set data to the climo field. This may result in
             ! somewhat inaccurate soil moistures as no scaling will occur 
             field_data_2d = soilt_climo
           endif !check field value   
         endif !sotype from target grid
       else
         ! Any field that doesn't require any of the special treatments or
         ! passing of additional variables as in those above
         call search(field_data_2d, mask, i_target, j_target, tile,search_nums(k))
       endif !if present  
     endif !localpet
     call ESMF_FieldScatter(temp_field, field_data_2d, rootPet=0, tile=tile,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldScatter", rc)
   else
     if (localpet==0) then
         allocate(field_data_3d(i_target,j_target,lsoil_target))
     else
         allocate(field_data_3d(0,0,0))
     endif
 
     ! Process 3d fields soil temperature, moisture, and liquid
     call ESMF_FieldGather(temp_field,field_data_3d,rootPet=0,tile=tile,rc=rc)
     if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldGather", rc)
        
     if (localpet==0) then 
       do j = 1, lsoil_target
         field_data_2d = field_data_3d(:,:,j)
         call search(field_data_2d, mask, i_target, j_target, tile, 21)
         field_data_3d(:,:,j) = field_data_2d
       enddo
     endif
     call ESMF_FieldScatter(temp_field, field_data_3d, rootPet=0, tile=tile,rc=rc)
      if(ESMF_logFoundError(rcToCheck=rc,msg=ESMF_LOGERR_PASSTHRU,line=__LINE__,file=__FILE__))&
        call error_handler("IN FieldScatter", rc)
     deallocate(field_data_3d)
   endif !ndims
   deallocate(field_data_2d)
 end do !fields

 end subroutine search_many

!> Free up memory once the target grid surface fields are
!! no longer needed.
!!
!! @author George Gayno NOAA/EMC
 subroutine cleanup_all_target_sfc_data

 use surface_target_data, only : cleanup_target_sfc_data

 implicit none

 integer                     :: rc

 print*,"- DESTROY LOCAL TARGET GRID SURFACE FIELDS."

 call ESMF_FieldDestroy(terrain_from_input_grid, rc=rc)
 call ESMF_FieldDestroy(terrain_from_input_grid_land, rc=rc)
 call ESMF_FieldDestroy(soil_type_from_input_grid, rc=rc)

 call cleanup_target_sfc_data

 end subroutine cleanup_all_target_sfc_data

 end module surface