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