program wrf_interpolate_main

  use kinds
  use mpimod
  use namelist, only : namelistparams,intrp_from_file,intrp_to_file
  use constants, only: init_constants_derived, init_constants
  use wrf_nmm_io
  use general_sub2grid_mod, only: sub2grid_info 
  use wrf_nmm_interpolate, only : interpolate_s2d

  implicit none

  !-------------------------------------------------------------------
  !$$$  main program documentation block
  !
  ! main program: wrf_interpolate
  ! PRGMMR: TONG                           DATE: 2016-02-17
  !
  ! abstract: The wrf interoplation code interpolate wrf fields from
  !   one wrf nmm grid to another wrf nmm grid using modules from
  !   GSI
  !
  !$$$  end documentation bloc
  !-------------------------------------------------------------------

  ! Define variables computed within routine

  real(r_kind)                                       :: exectime_start
  real(r_kind)                                       :: exectime_finish
  type(sub2grid_info) :: grd_src, grd_dst
  type(wrfnmm_variables) :: var_src, var_dst

  !=====================================================================

  ! Initialize MPI session

  call mpi_init(ierror)

  ! Get the number of processes
  call mpi_comm_size(mpi_comm_world,npe,ierror)

  ! Get the number of processes
  call mpi_comm_rank(mpi_comm_world,mype,ierror)

  if(mype==0) then
     call cpu_time(exectime_start)
  end if

  ! Read in namelist
  call namelistparams()

  ! Initialize constants
  call init_constants_derived
  call init_constants(.true.)

  ! Read input grids
  if(mype == 0)then
     call wrf_nmm_interface(intrp_from_file)
     call wrf_nmm_interface(intrp_to_file)
  end if

  call mpi_barrier(mpi_comm_world,ierror)

  call wrf_nmm_read(intrp_from_file,grd_src,var_src)
  call wrf_nmm_read(intrp_to_file,grd_dst,var_dst)

  ! Run interpolation
  call interpolate_s2d(grd_src,var_src,grd_dst,var_dst)

  ! Update target grid
  call wrf_nmm_write(intrp_to_file,grd_dst,var_dst)

  if(mype==0) then
     call cpu_time(exectime_finish)
     write(6,500) exectime_finish - exectime_start
  end if 

  ! Enable the root task to catch up from I/O and calculations

  call mpi_barrier(mpi_comm_world,ierror)

  ! Finalize MPI session

  call mpi_finalize(ierror)

  !=====================================================================

  ! Define format statements

500 format('MAIN: Execution time: ', f13.5, ' seconds.')

  !=====================================================================

end program wrf_interpolate_main