EZINTERPV: EXAMPLE IN F90:


program main

include "ViConstants_f90.h" 
include "VertInterp_f90.h" 
 
integer :: n_gridIndexInit, n_gridIndexTarget
character(len=25) :: s_option, s_value 
 
                                        ! Initial-grid parameters 
integer, parameter :: n_N_PTS_INIT=4 
real, dimension(n_N_PTS_INIT) :: r_levelsInit 
integer :: n_gridTypeInit 
real, parameter :: r_PTOP_INIT=10., &   ! These 3 are used only for hybrid type
                   r_PREF_INIT=800., & 
                   r_RCOEF_INIT=1. 
 
                                        ! Target-grid parameters 
integer, parameter :: n_N_PTS_TARGET=5 
real, dimension(n_N_PTS_TARGET) :: r_levelsTarget 
integer :: n_gridTypeTarget 
real, parameter :: r_PTOP_TARGET=10., & ! These 3 are used only for hybrid type 
                   r_PREF_TARGET=800., & 
                   r_RCOEF_TARGET=1. 
 
integer, parameter :: n_NI=2, & 
                      n_NJ=1 
real, dimension(n_NI, n_NJ), parameter :: r_PSURF = 100000. 
real, dimension(n_NI, n_NJ), parameter :: r_PTOP = 10. 
 
integer :: n_error 
 
! input state and derivative 
real, dimension(n_NI, n_NJ, n_N_PTS_INIT) :: r_stateIn, & 
                                             r_derivIn 
 
! output state and derivative 
real, dimension(n_NI, n_NJ, n_N_PTS_TARGET) :: r_stateOut, & 
                                               r_derivOut 
real, parameter :: r_EXTRAP_GUIDE_DOWN=0.4, & 
                   r_EXTRAP_GUIDE_UP=-0.5 

integer :: i, j, k

! arrays needed for the surface extrapolation
!
external slfun_tq, sltop_tq       ! from the physics library
real, dimension(n_NI, n_NJ) :: r_z0   ! roughness length
real, dimension(n_NI, n_NJ) :: r_ilmo ! inverse Monin-Obukhov length
real, dimension(n_NI, n_NJ) :: r_hBound!height of the boundary layer
real, dimension(n_NI, n_NJ) :: r_lat  ! latitude (used only for the wind)
integer :: n_numExtArraysIn
integer :: n_numExtArraysOut
real, dimension(n_NI, n_NJ, n_N_PTS_INIT+n_N_PTS_TARGET) :: r_ExtArraysIn
real, dimension(n_NI, n_NJ, 0) :: r_ExtArraysOut
real, dimension(n_NI, n_NJ, n_N_PTS_INIT) :: r_zSrc
real, dimension(n_NI, n_NJ, n_N_PTS_TARGET) :: r_zDest


 
                                        ! Initialize initial grid
n_gridTypeInit = N_GRID_TYPE_SIGMA 
                ! OR N_GRID_TYPE_PRESSURE,N_GRID_TYPE_GENERIC,N_GRID_TYPE_HYBRID,N_GRID_TYPE_ETA 
r_levelsInit=(/0.64, 1.25, 2.44, 2.97/) 
 
                                        ! Initialize target grid 
n_gridTypeTarget = n_gridTypeInit 
r_levelsTarget=(/1.13, 2.62, 2.79, 0.5, 3.1/) 
 
n_error=N_ViqkdefIfc_X(n_gridIndexInit, n_N_PTS_INIT, n_gridTypeInit, r_levelsInit, & 
                     r_PTOP_INIT, r_PREF_INIT, r_RCOEF_INIT) 
n_error=N_ViqkdefIfc_X(n_gridIndexTarget, n_N_PTS_TARGET, n_gridTypeTarget, r_levelsTarget, & 
                     r_PTOP_TARGET, r_PREF_TARGET, r_RCOEF_TARGET)

                                        ! Fill in physical constants on that horizontal grid
r_z0 = 1.0
r_ilmo = 0.99
r_hBound = 300.
r_lat = 0.     ! unused
r_ExtArraysIn(:,:,1) = r_z0
r_ExtArraysIn(:,:,2) = r_ilmo
r_ExtArraysIn(:,:,3) = r_hBound
r_ExtArraysIn(:,:,4) = r_lat
numExtArraysIn = 4
numExtArraysOut = 0
 
n_error=N_VidefsetIfc_X(n_NI, n_NJ, n_gridIndexTarget, n_gridIndexInit, &
                        r_PSURF, r_PTOP, &
                        n_numExtArraysIn, n_numExtArraysOut, &
                        r_ExtArraysIn, r_ExtArraysOut) 
 
r_stateIn(1,1,1) = 0.5971954 
r_stateIn(1,1,2) = 0.9489846 
r_stateIn(1,1,3) = 0.6454 
r_stateIn(1,1,4) = 0.1708 
 
r_derivIn(1,1,1) = 0.8020958 
r_derivIn(1,1,2) = 0.3153224 
r_derivIn(1,1,3) =-0.7638 
r_derivIn(1,1,4) =-0.9853 
 
 
r_stateIn(2,1,1) = 0.744544 
r_stateIn(2,1,2) = 3.009570 
r_stateIn(2,1,3) =-0.8450 
r_stateIn(2,1,4) =-0.1733  
 
r_derivIn(2,1,1) = 1.554346 
r_derivIn(2,1,2) = 10.057510 
r_derivIn(2,1,3) = 1.7140 
r_derivIn(2,1,4) = 1.03003 
 
s_option='interptype' 
s_value ='cubicwithderivs'       ! OR  'nearestneighbour', 'linear', 'cubiclagrange' 
n_error=N_VisetoptIfc(s_option, s_value) 
 
s_option='extraptype' 
s_value ='surface'               ! OR 'clamped', 'lapserate', 'fixed'
! because 'surface' is chosen, r_zSrc (i,j,0) = 0 is presumed by the software
n_error=N_VisetoptIfc(s_option, s_value) 

                                 ! Fill in distances from the Earth's surface

do j=1,n_NJ
  do i=1,n_NI
    do k=1,n_N_PTS_INIT
      r_zSrc (i,j,k) = 8. * k
    end do
    do k=1,n_N_PTS_TARGET
      r_zDest(i,j,k)=5*(k-1.)
    end do
  end do
end do

r_ExtArraysIn(:,:,               1 : n_N_PTS_TARGET             ) = r_zDest
r_ExtArraysIn(:,:,n_N_PTS_TARGET+1 : n_N_PTS_TARGET+n_N_PTS_INIT) = r_zSrc
numExtArraysIn = n_N_PTS_TARGET+n_N_PTS_INIT
numExtArraysOut = 0
 
n_error = N_VisintIfc_X(r_stateOut, r_stateIn, r_derivOut, r_derivIn, & 
                        r_EXTRAP_GUIDE_DOWN, r_EXTRAP_GUIDE_UP, &
                        slfun_tq, sltop_tq, &
                        n_numExtArraysIn, n_numExtArraysOut, &
                        r_ExtArraysIn, r_ExtArraysOut) 

n_error = N_VigdrlsIfc(n_gridIndexInit)
n_error = N_VigdrlsIfc(n_gridIndexTarget)

end program




Return to RPN home page
Return to product index
Last updated: November 12, 2008