13 #include "inc_openmp.h" 51 integer,
private,
allocatable :: interp_xi2z_idx (:,:,:,:)
52 real(RP),
private,
allocatable :: interp_xi2z_coef(:,:,:,:)
53 integer,
private,
allocatable :: interp_z2xi_idx (:,:,:,:)
54 real(RP),
private,
allocatable :: interp_z2xi_coef(:,:,:,:)
56 integer,
private,
allocatable :: interp_xi2p_idx (:,:,:,:)
57 real(RP),
private,
allocatable :: interp_xi2p_coef(:,:,:,:)
74 integer :: k, i, j, kk, kp
78 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[INTERPOLATION] / Categ[ATMOS-RM GRID] / Origin[SCALElib]' 86 allocate( interp_xi2z_idx(
ka,
ia,
ja,2) )
87 allocate( interp_xi2z_coef(
ka,
ia,
ja,3) )
88 allocate( interp_z2xi_idx(
ka,
ia,
ja,2) )
89 allocate( interp_z2xi_coef(
ka,
ia,
ja,3) )
98 interp_xi2z_idx(k,i,j,1) =
ks 99 interp_xi2z_idx(k,i,j,2) =
ks 100 interp_xi2z_coef(k,i,j,1) = 0.0_rp
101 interp_xi2z_coef(k,i,j,2) = 0.0_rp
102 interp_xi2z_coef(k,i,j,3) = 1.0_rp
106 interp_xi2z_idx(k,i,j,1) =
ks 107 interp_xi2z_idx(k,i,j,2) =
ks 108 interp_xi2z_coef(k,i,j,1) = 0.0_rp
109 interp_xi2z_coef(k,i,j,2) = 1.0_rp
110 interp_xi2z_coef(k,i,j,3) = 0.0_rp
114 interp_xi2z_idx(k,i,j,1) =
ke 115 interp_xi2z_idx(k,i,j,2) =
ke 116 interp_xi2z_coef(k,i,j,1) = 0.0_rp
117 interp_xi2z_coef(k,i,j,2) = 0.0_rp
118 interp_xi2z_coef(k,i,j,3) = 1.0_rp
122 interp_xi2z_idx(k,i,j,1) =
ke 123 interp_xi2z_idx(k,i,j,2) =
ke 124 interp_xi2z_coef(k,i,j,1) = 1.0_rp
125 interp_xi2z_coef(k,i,j,2) = 0.0_rp
126 interp_xi2z_coef(k,i,j,3) = 0.0_rp
135 interp_xi2z_idx(k,i,j,1) = kp - 1
136 interp_xi2z_idx(k,i,j,2) = kp
141 interp_xi2z_coef(k,i,j,3) = 0.0_rp
153 interp_z2xi_idx(k,i,j,1) =
ks 154 interp_z2xi_idx(k,i,j,2) =
ks 155 interp_z2xi_coef(k,i,j,1) = 0.0_rp
156 interp_z2xi_coef(k,i,j,2) = 0.0_rp
157 interp_z2xi_coef(k,i,j,3) = 1.0_rp
161 interp_z2xi_idx(k,i,j,1) =
ks 162 interp_z2xi_idx(k,i,j,2) =
ks 163 interp_z2xi_coef(k,i,j,1) = 0.0_rp
164 interp_z2xi_coef(k,i,j,2) = 1.0_rp
165 interp_z2xi_coef(k,i,j,3) = 0.0_rp
169 interp_z2xi_idx(k,i,j,1) =
ke 170 interp_z2xi_idx(k,i,j,2) =
ke 171 interp_z2xi_coef(k,i,j,1) = 0.0_rp
172 interp_z2xi_coef(k,i,j,2) = 0.0_rp
173 interp_z2xi_coef(k,i,j,3) = 1.0_rp
177 interp_z2xi_idx(k,i,j,1) =
ke 178 interp_z2xi_idx(k,i,j,2) =
ke 179 interp_z2xi_coef(k,i,j,1) = 1.0_rp
180 interp_z2xi_coef(k,i,j,2) = 0.0_rp
181 interp_z2xi_coef(k,i,j,3) = 0.0_rp
190 interp_z2xi_idx(k,i,j,1) = kp - 1
191 interp_z2xi_idx(k,i,j,2) = kp
196 interp_z2xi_coef(k,i,j,3) = 0.0_rp
207 interp_xi2z_idx( 1:
ks-1,i,j,1) =
ks 208 interp_xi2z_idx( 1:
ks-1,i,j,2) =
ks 209 interp_xi2z_coef( 1:
ks-1,i,j,1) = 0.0_rp
210 interp_xi2z_coef( 1:
ks-1,i,j,2) = 0.0_rp
211 interp_xi2z_coef( 1:
ks-1,i,j,3) = 1.0_rp
213 interp_xi2z_idx(
ke+1:
ka,i,j,1) =
ke 214 interp_xi2z_idx(
ke+1:
ka,i,j,2) =
ke 215 interp_xi2z_coef(
ke+1:
ka,i,j,1) = 0.0_rp
216 interp_xi2z_coef(
ke+1:
ka,i,j,2) = 0.0_rp
217 interp_xi2z_coef(
ke+1:
ka,i,j,3) = 1.0_rp
219 interp_z2xi_idx( 1:
ks-1,i,j,1) =
ks 220 interp_z2xi_idx( 1:
ks-1,i,j,2) =
ks 221 interp_z2xi_coef( 1:
ks-1,i,j,1) = 0.0_rp
222 interp_z2xi_coef( 1:
ks-1,i,j,2) = 0.0_rp
223 interp_z2xi_coef( 1:
ks-1,i,j,3) = 1.0_rp
225 interp_z2xi_idx(
ke+1:
ka,i,j,1) =
ke 226 interp_z2xi_idx(
ke+1:
ka,i,j,2) =
ke 227 interp_z2xi_coef(
ke+1:
ka,i,j,1) = 0.0_rp
228 interp_z2xi_coef(
ke+1:
ka,i,j,2) = 0.0_rp
229 interp_z2xi_coef(
ke+1:
ka,i,j,3) = 1.0_rp
247 matrix_solver_tridiagonal
250 real(RP),
intent(in) :: var (
ka,
ia,
ja)
251 real(RP),
intent(out) :: var_z(
ka,
ia,
ja)
257 real(RP) :: c1, c2, c3
264 if (
kmax == 2 )
then 274 var_z(k,i,j) = interp_xi2z_coef(k,i,j,1) * var(interp_xi2z_idx(k,i,j,1),i,j) &
275 + interp_xi2z_coef(k,i,j,2) * var(interp_xi2z_idx(k,i,j,2),i,j) &
297 md(
ks+1) = 2.0 * ( fdz(
ks) + fdz(
ks+1) ) + fdz(
ks)
299 md(k) = 2.0 * ( fdz(k-1) + fdz(k) )
301 md(
ke-1) = 2.0 * ( fdz(
ke-2) + fdz(
ke-1) ) + fdz(
ke-1)
304 v(k) = ( var(k+1,i,j) - var(k ,i,j) ) / fdz(k) &
305 - ( var(k ,i,j) - var(k-1,i,j) ) / fdz(k-1)
308 call matrix_solver_tridiagonal( &
316 kk = min(interp_xi2z_idx(k,i,j,1),
ke-1)
317 c3 = ( u(kk+1) - u(kk) ) / fdz(kk)
319 c1 = ( var(kk+1,i,j) - var(kk,i,j) ) / fdz(kk) - ( u(kk) * 2.0_rp + u(kk+1) ) * fdz(kk)
321 var_z(k,i,j) = interp_xi2z_coef(k,i,j,3) *
const_undef &
322 + ( 1.0_rp - interp_xi2z_coef(k,i,j,3) ) &
323 * ( ( ( c3 * d + c2 ) * d + c1 ) * d + var(kk,i,j) )
344 matrix_solver_tridiagonal
349 real(RP),
intent(in) :: var (
ka,
ia,
ja)
350 real(RP),
intent(out) :: var_xi(
ka,
ia,
ja)
355 real(RP) :: c1, c2, c3
362 if (
kmax == 2 )
then 372 var_xi(k,i,j) = interp_z2xi_coef(k,i,j,1) * var(interp_z2xi_idx(k,i,j,1),i,j) &
373 + interp_z2xi_coef(k,i,j,2) * var(interp_z2xi_idx(k,i,j,2),i,j) &
383 md(
ks+1) = 2.0 * ( fdz(
ks) + fdz(
ks+1) ) + fdz(
ks)
385 md(k) = 2.0 * ( fdz(k-1) + fdz(k) )
387 md(
ke-1) = 2.0 * ( fdz(
ke-2) + fdz(
ke-1) ) + fdz(
ke-1)
399 v(k) = ( var(k+1,i,j) - var(k ,i,j) ) / fdz(k) &
400 - ( var(k ,i,j) - var(k-1,i,j) ) / fdz(k-1)
403 call matrix_solver_tridiagonal( &
411 kk = min(interp_z2xi_idx(k,i,j,1),
ke-1)
412 c3 = ( u(kk+1) - u(kk) ) / fdz(kk)
414 c1 = ( var(kk+1,i,j) - var(kk,i,j) ) / fdz(kk) - ( u(kk) * 2.0_rp + u(kk+1) ) * fdz(kk)
416 var_xi(k,i,j) = interp_z2xi_coef(k,i,j,3) *
const_undef &
417 + ( 1.0_rp - interp_z2xi_coef(k,i,j,3) ) &
418 * ( ( ( c3 * d + c2 ) * d + c1 ) * d + var(kk,i,j) )
435 integer,
intent(in) :: kpres
438 allocate( interp_xi2p_idx(kpres,
ia,
ja,2) )
439 allocate( interp_xi2p_coef(kpres,
ia,
ja,3) )
452 integer,
intent(in) :: kpres
453 real(RP),
intent(in) :: pres (
ka,
ia,
ja)
454 real(RP),
intent(in) :: sfc_pres(
ia,
ja)
455 real(RP),
intent(in) :: paxis (kpres)
457 real(RP) :: lnpres (
ka,
ia,
ja)
458 real(RP) :: lnsfc_pres(
ia,
ja)
459 real(RP) :: lnpaxis (kpres)
461 integer :: k, i, j, kk, kp
467 lnpres(k,i,j) = log( pres(k,i,j) )
474 lnsfc_pres(i,j) = log( sfc_pres(i,j) )
478 lnpaxis(:) = log( paxis(:) )
483 if ( lnpaxis(k) >= lnsfc_pres(i,j) )
then 485 interp_xi2p_idx(k,i,j,1) =
ks 486 interp_xi2p_idx(k,i,j,2) =
ks 487 interp_xi2p_coef(k,i,j,1) = 0.0_rp
488 interp_xi2p_coef(k,i,j,2) = 0.0_rp
489 interp_xi2p_coef(k,i,j,3) = 1.0_rp
491 elseif( lnpaxis(k) >= lnpres(
ks,i,j) )
then 493 interp_xi2p_idx(k,i,j,1) =
ks 494 interp_xi2p_idx(k,i,j,2) =
ks 495 interp_xi2p_coef(k,i,j,1) = 0.0_rp
496 interp_xi2p_coef(k,i,j,2) = 1.0_rp
497 interp_xi2p_coef(k,i,j,3) = 0.0_rp
499 elseif( lnpaxis(k) < lnpres(
ke,i,j) )
then 501 interp_xi2p_idx(k,i,j,1) =
ke 502 interp_xi2p_idx(k,i,j,2) =
ke 503 interp_xi2p_coef(k,i,j,1) = 0.0_rp
504 interp_xi2p_coef(k,i,j,2) = 0.0_rp
505 interp_xi2p_coef(k,i,j,3) = 1.0_rp
511 if( lnpaxis(k) >= lnpres(kk,i,j) )
exit 514 interp_xi2p_idx(k,i,j,1) = kp - 1
515 interp_xi2p_idx(k,i,j,2) = kp
516 interp_xi2p_coef(k,i,j,1) = ( lnpaxis(k) - lnpres(kp,i,j) ) &
517 / ( lnpres(kp-1,i,j) - lnpres(kp,i,j) )
518 interp_xi2p_coef(k,i,j,2) = ( lnpres(kp-1,i,j) - lnpaxis(k) ) &
519 / ( lnpres(kp-1,i,j) - lnpres(kp,i,j) )
520 interp_xi2p_coef(k,i,j,3) = 0.0_rp
539 integer,
intent(in) :: kpres
540 real(RP),
intent(in) :: var (
ka ,
ia,
ja)
541 real(RP),
intent(out) :: var_p(kpres,
ia,
ja)
549 var_p(k,i,j) = interp_xi2p_coef(k,i,j,1) * var(interp_xi2p_idx(k,i,j,1),i,j) &
550 + interp_xi2p_coef(k,i,j,2) * var(interp_xi2p_idx(k,i,j,2),i,j) &
subroutine, public interp_setup
Setup.
subroutine, public interp_vertical_xi2p(Kpres, var, var_P)
logical, public io_l
output log or not? (this process)
real(rp), dimension(:), allocatable, public grid_cz
center coordinate [m]: z, local=global
integer, public ke
end point of inner domain: z, local
real(rp), dimension(:,:,:), allocatable, public real_fz
geopotential height [m] (cell face )
subroutine, public interp_vertical_xi2z(var, var_Z)
real(rp), dimension(:,:,:), allocatable, public real_cz
geopotential height [m] (cell center)
real(rp), public const_undef
integer, public ia
of whole cells: x, local, with HALO
real(rp), dimension(:), allocatable, public grid_fdz
z-length of grid(k+1) to grid(k) [m]
subroutine, public interp_update_pres(Kpres, PRES, SFC_PRES, Paxis)
integer, public ka
of whole cells: z, local, with HALO
subroutine, public interp_setup_pres(Kpres)
Reset random seed.
integer, public kmax
of computational cells: z, local
real(rp), dimension(:), allocatable, public grid_fz
face coordinate [m]: z, local=global
integer, public ks
start point of inner domain: z, local
logical, public topo_exist
topography exists?
logical, public interp_available
topography exists & vertical interpolation has meaning?
subroutine, public interp_vertical_z2xi(var, var_Xi)
integer, public io_fid_log
Log file ID.
integer, public ja
of whole cells: y, local, with HALO