49 private :: intrpnest_search_nearest_block
50 private :: intrpnest_search_horiz_1points
51 private :: intrpnest_search_horiz_3points
52 private :: intrpnest_search_horiz_4points
53 private :: intrpnest_search_horiz_5points
54 private :: intrpnest_search_horiz_8points
55 private :: intrpnest_search_horiz_12points
56 private :: intrpnest_search_vert_offline
57 private :: intrpnest_search_vert_online
58 private :: intrpnest_interp_2d_1points
59 private :: intrpnest_interp_3d_1points
60 private :: intrpnest_interp_2d_3points
61 private :: intrpnest_interp_3d_3points
62 private :: intrpnest_interp_2d_4points
63 private :: intrpnest_interp_3d_4points
64 private :: intrpnest_interp_2d_5points
65 private :: intrpnest_interp_3d_5points
66 private :: intrpnest_interp_2d_8points
67 private :: intrpnest_interp_3d_8points
68 private :: intrpnest_interp_2d_12points
69 private :: intrpnest_interp_3d_12points
70 private :: intrpnest_haversine
74 subroutine intrpnest_intfc_search_h( &
89 real(RP),
intent(out) :: hfact(:)
90 integer,
intent(out) :: igrd (:)
91 integer,
intent(out) :: jgrd (:)
92 real(RP),
intent(in) :: mylat
93 real(RP),
intent(in) :: mylon
94 real(RP),
intent(in) :: inlat(:,:)
95 real(RP),
intent(in) :: inlon(:,:)
96 integer,
intent(in) :: is
97 integer,
intent(in) :: ie
98 integer,
intent(in) :: js
99 integer,
intent(in) :: je
100 end subroutine intrpnest_intfc_search_h
102 procedure(INTRPNEST_intfc_search_h),
pointer :: INTRPNEST_search_horiz => null()
103 private :: intrpnest_search_horiz
107 subroutine intrpnest_intfc_search_v( &
124 real(RP),
intent(inout) :: vfact(:,:,:,:,:)
125 integer,
intent(inout) :: kgrd (:,:,:,:,:)
126 integer,
intent(out) :: ncopy(:)
127 integer,
intent(in) :: igrd(:)
128 integer,
intent(in) :: jgrd(:)
129 real(RP),
intent(in) :: myhgt(:)
130 real(RP),
intent(in) :: inhgt(:,:,:)
131 integer,
intent(in) :: iloc
132 integer,
intent(in) :: jloc
133 integer,
intent(in) :: ks
134 integer,
intent(in) :: ke
135 integer,
intent(in) :: inKA
136 logical,
intent(in) :: lndgrd
137 end subroutine intrpnest_intfc_search_v
139 procedure(INTRPNEST_intfc_search_v),
pointer :: INTRPNEST_search_vert => null()
140 private :: intrpnest_search_vert
144 subroutine intrpnest_intfc_interp_2d( &
155 real(RP),
intent(out) :: intp(:,:)
156 real(RP),
intent(in) :: ref (:,:)
157 real(RP),
intent(in) :: hfact(:,:,:)
158 integer,
intent(in) :: igrd (:,:,:)
159 integer,
intent(in) :: jgrd (:,:,:)
160 integer,
intent(in) :: ia
161 integer,
intent(in) :: ja
162 end subroutine intrpnest_intfc_interp_2d
169 subroutine intrpnest_intfc_interp_3d( &
185 real(RP),
intent(out) :: intp(:,:,:)
186 real(RP),
intent(in) :: ref (:,:,:)
187 real(RP),
intent(in) :: hfact(:,:,:)
188 real(RP),
intent(in) :: vfact(:,:,:,:,:)
189 integer,
intent(in) :: kgrd (:,:,:,:,:)
190 integer,
intent(in) :: igrd (:,:,:)
191 integer,
intent(in) :: jgrd (:,:,:)
192 integer,
intent(in) ::
ia 193 integer,
intent(in) ::
ja 194 integer,
intent(in) ::
ks 195 integer,
intent(in) ::
ke 196 logical,
intent(in),
optional :: logwegt
197 end subroutine intrpnest_intfc_interp_3d
206 real(RP),
private,
parameter :: large_number_1 = 9.999e+15_rp
207 real(RP),
private,
parameter :: large_number_2 = 9.888e+15_rp
208 real(RP),
private,
parameter :: large_number_3 = 9.777e+15_rp
209 real(RP),
private,
parameter :: large_number_4 = 9.666e+15_rp
210 real(RP),
private,
parameter :: large_number_5 = 9.555e+15_rp
211 real(RP),
private,
parameter :: large_number_6 = 9.444e+15_rp
212 real(RP),
private,
parameter :: large_number_7 = 9.333e+15_rp
213 real(RP),
private,
parameter :: large_number_8 = 9.222e+15_rp
214 real(RP),
private,
parameter :: large_number_9 = 9.111e+15_rp
215 real(RP),
private,
parameter :: large_number_10 = 9.000e+15_rp
216 real(RP),
private,
parameter :: large_number_11 = 8.999e+15_rp
217 real(RP),
private,
parameter :: large_number_12 = 8.888e+15_rp
219 integer,
private :: weight_order
221 integer,
private :: divnum
222 integer,
private :: itp_nh
229 interp_search_divnum, &
231 NEST_INTERP_WEIGHT_ORDER, &
237 integer,
intent(in) :: interp_search_divnum
238 integer,
intent(in) :: nest_interp_level
239 integer,
intent(in) :: nest_interp_weight_order
240 logical,
intent(in) :: offline
242 character(len=7) :: select_type
246 if(
io_l )
write(
io_fid_log,*)
'++++++ Module[INTERP NEST] / Categ[ATMOS-RM GRID] / Origin[SCALElib]' 248 divnum = interp_search_divnum
249 weight_order = nest_interp_weight_order
251 select case( nest_interp_level )
253 intrpnest_search_horiz => intrpnest_search_horiz_1points
259 intrpnest_search_horiz => intrpnest_search_horiz_3points
265 intrpnest_search_horiz => intrpnest_search_horiz_4points
271 intrpnest_search_horiz => intrpnest_search_horiz_5points
277 intrpnest_search_horiz => intrpnest_search_horiz_8points
283 intrpnest_search_horiz => intrpnest_search_horiz_12points
289 write(*,*)
'xxx invarid NEST_INTERP_LEVEL (', nest_interp_level, &
290 ') [setup: nest/interp]' 295 select_type =
"offline" 296 intrpnest_search_vert => intrpnest_search_vert_offline
298 select_type =
"online" 299 intrpnest_search_vert => intrpnest_search_vert_online
303 if(
io_l )
write(
io_fid_log,*)
'*** Horizontal interpolation with ', nest_interp_level,
" points." 304 if(
io_l )
write(
io_fid_log,*)
'*** Vertical interpolation : ', trim(select_type)
328 real(RP),
intent(out) :: hfact(:,:,:)
329 integer,
intent(out) :: igrd (:,:,:)
330 integer,
intent(out) :: jgrd (:,:,:)
332 real(RP),
intent(in) :: mylat(:,:)
333 real(RP),
intent(in) :: mylon(:,:)
334 integer,
intent(in) :: myia
335 integer,
intent(in) :: myja
337 real(RP),
intent(in) :: inlat(:,:)
338 real(RP),
intent(in) :: inlon(:,:)
339 integer,
intent(in) :: inia
340 integer,
intent(in) :: inja
347 hfact(:,:,:) = 0.0_rp
352 call intrpnest_search_nearest_block(
is,
ie,
js,
je, &
353 mylat(i,j), mylon(i,j), &
354 inlat(:,:), inlon(:,:), &
358 call intrpnest_search_horiz( hfact(i,j,:), &
401 real(RP),
intent(out) :: hfact(:,:,:)
402 real(RP),
intent(out) :: vfact(:,:,:,:,:)
403 integer,
intent(out) :: kgrd (:,:,:,:,:)
404 integer,
intent(out) :: igrd (:,:,:)
405 integer,
intent(out) :: jgrd (:,:,:)
406 integer,
intent(out) :: ncopy(:,:,:)
408 real(RP),
intent(in) :: myhgt(:,:,:)
409 real(RP),
intent(in) :: mylat(:,:)
410 real(RP),
intent(in) :: mylon(:,:)
411 integer,
intent(in) :: myks
412 integer,
intent(in) :: myke
413 integer,
intent(in) :: myia
414 integer,
intent(in) :: myja
416 real(RP),
intent(in) :: inhgt(:,:,:)
417 real(RP),
intent(in) :: inlat(:,:)
418 real(RP),
intent(in) :: inlon(:,:)
419 integer,
intent(in) :: inka
420 integer,
intent(in) :: inia
421 integer,
intent(in) :: inja
423 logical,
intent(in),
optional :: landgrid
432 if (
present(landgrid) )
then 438 hfact(:,:,:) = 0.0_rp
439 vfact(:,:,:,:,:) = 0.0_rp
446 call intrpnest_search_nearest_block(
is,
ie,
js,
je, &
447 mylat(i,j), mylon(i,j), &
448 inlat(:,:), inlon(:,:), &
452 call intrpnest_search_horiz( hfact(i,j,:), &
463 call intrpnest_search_vert( vfact, &
484 subroutine intrpnest_search_nearest_block( &
497 integer,
intent(out) ::
is 498 integer,
intent(out) ::
ie 499 integer,
intent(out) ::
js 500 integer,
intent(out) ::
je 502 real(RP),
intent(in) :: mylat
503 real(RP),
intent(in) :: mylon
504 real(RP),
intent(in) :: inlat(:,:)
505 real(RP),
intent(in) :: inlon(:,:)
506 integer,
intent(in) :: inia
507 integer,
intent(in) :: inja
509 real(RP) :: distance, dist
511 integer :: iinc, jinc
512 integer :: blk_i, blk_j
515 iinc = max( (inia + 1) / divnum, 1 )
516 jinc = max( (inja + 1) / divnum, 1 )
517 dist = large_number_1
520 do while (jj <= inja)
522 do while (ii <= inia)
523 distance = intrpnest_haversine( mylat, mylon, &
524 inlat(ii,jj), inlon(ii,jj) )
525 if( distance < dist )
then 536 is = blk_i - (iinc/2) - 3
538 ie = blk_i + (iinc/2) + 3
539 if(
ie > inia )
ie = inia
540 js = blk_j - (jinc/2) - 3
542 je = blk_j + (jinc/2) + 3
543 if(
je > inja )
je = inja
546 end subroutine intrpnest_search_nearest_block
551 subroutine intrpnest_search_horiz_1points( &
565 real(RP),
intent(out) :: hfact(:)
566 integer,
intent(out) :: igrd (:)
567 integer,
intent(out) :: jgrd (:)
569 real(RP),
intent(in) :: mylat
570 real(RP),
intent(in) :: mylon
571 real(RP),
intent(in) :: inlat(:,:)
572 real(RP),
intent(in) :: inlon(:,:)
574 integer,
intent(in) ::
is 575 integer,
intent(in) ::
ie 576 integer,
intent(in) ::
js 577 integer,
intent(in) ::
je 584 dist = large_number_1
590 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
591 if ( distance <= dist )
then 592 dist = distance; igrd(1) = ii; jgrd(1) = jj
600 end subroutine intrpnest_search_horiz_1points
605 subroutine intrpnest_search_horiz_3points( &
621 real(RP),
intent(out) :: hfact(:)
622 integer,
intent(out) :: igrd (:)
623 integer,
intent(out) :: jgrd (:)
625 real(RP),
intent(in) :: mylat
626 real(RP),
intent(in) :: mylon
627 real(RP),
intent(in) :: inlat(:,:)
628 real(RP),
intent(in) :: inlon(:,:)
630 integer,
intent(in) ::
is 631 integer,
intent(in) ::
ie 632 integer,
intent(in) ::
js 633 integer,
intent(in) ::
je 641 dist(1) = large_number_3
642 dist(2) = large_number_2
643 dist(3) = large_number_1
649 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
650 distance = distance**weight_order
651 if ( distance <= dist(1) )
then 652 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
653 dist(2) = dist(1); igrd(2) = igrd(1); jgrd(2) = jgrd(1)
654 dist(1) = distance; igrd(1) = ii; jgrd(1) = jj
655 elseif ( dist(1) < distance .AND. distance <= dist(2) )
then 656 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
657 dist(2) = distance; igrd(2) = ii; jgrd(2) = jj
658 elseif ( dist(2) < distance .AND. distance <= dist(3) )
then 659 dist(3) = distance; igrd(3) = ii; jgrd(3) = jj
664 if ( abs(dist(1)) < eps )
then 669 denom = 1.0_rp / ( (1.0_rp/dist(1)) + (1.0_rp/dist(2)) + (1.0_rp/dist(3)) )
670 hfact(1) = ( 1.0_rp/dist(1) ) * denom
671 hfact(2) = ( 1.0_rp/dist(2) ) * denom
672 hfact(3) = ( 1.0_rp/dist(3) ) * denom
676 end subroutine intrpnest_search_horiz_3points
681 subroutine intrpnest_search_horiz_4points( &
697 real(RP),
intent(out) :: hfact(:)
698 integer,
intent(out) :: igrd (:)
699 integer,
intent(out) :: jgrd (:)
701 real(RP),
intent(in) :: mylat
702 real(RP),
intent(in) :: mylon
703 real(RP),
intent(in) :: inlat(:,:)
704 real(RP),
intent(in) :: inlon(:,:)
706 integer,
intent(in) ::
is 707 integer,
intent(in) ::
ie 708 integer,
intent(in) ::
js 709 integer,
intent(in) ::
je 717 dist(1) = large_number_4
718 dist(2) = large_number_3
719 dist(3) = large_number_2
720 dist(4) = large_number_1
726 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
727 distance = distance**weight_order
728 if ( distance <= dist(1) )
then 729 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
730 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
731 dist(2) = dist(1); igrd(2) = igrd(1); jgrd(2) = jgrd(1)
732 dist(1) = distance; igrd(1) = ii; jgrd(1) = jj
733 elseif ( dist(1) < distance .AND. distance <= dist(2) )
then 734 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
735 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
736 dist(2) = distance; igrd(2) = ii; jgrd(2) = jj
737 elseif ( dist(2) < distance .AND. distance <= dist(3) )
then 738 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
739 dist(3) = distance; igrd(3) = ii; jgrd(3) = jj
740 elseif ( dist(3) < distance .AND. distance <= dist(4) )
then 741 dist(4) = distance; igrd(4) = ii; jgrd(4) = jj
746 if ( abs(dist(1)) < eps )
then 752 denom = 1.0_rp / ( (1.0_rp/dist(1)) + (1.0_rp/dist(2)) &
753 + (1.0_rp/dist(3)) + (1.0_rp/dist(4)) )
754 hfact(1) = ( 1.0_rp/dist(1) ) * denom
755 hfact(2) = ( 1.0_rp/dist(2) ) * denom
756 hfact(3) = ( 1.0_rp/dist(3) ) * denom
757 hfact(4) = ( 1.0_rp/dist(4) ) * denom
761 end subroutine intrpnest_search_horiz_4points
766 subroutine intrpnest_search_horiz_5points( &
782 real(RP),
intent(out) :: hfact(:)
783 integer,
intent(out) :: igrd (:)
784 integer,
intent(out) :: jgrd (:)
786 real(RP),
intent(in) :: mylat
787 real(RP),
intent(in) :: mylon
788 real(RP),
intent(in) :: inlat(:,:)
789 real(RP),
intent(in) :: inlon(:,:)
791 integer,
intent(in) ::
is 792 integer,
intent(in) ::
ie 793 integer,
intent(in) ::
js 794 integer,
intent(in) ::
je 802 dist(1) = large_number_5
803 dist(2) = large_number_4
804 dist(3) = large_number_3
805 dist(4) = large_number_2
806 dist(5) = large_number_1
812 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
813 distance = distance**weight_order
814 if ( distance <= dist(1) )
then 815 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
816 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
817 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
818 dist(2) = dist(1); igrd(2) = igrd(1); jgrd(2) = jgrd(1)
819 dist(1) = distance; igrd(1) = ii; jgrd(1) = jj
820 elseif ( dist(1) < distance .AND. distance <= dist(2) )
then 821 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
822 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
823 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
824 dist(2) = distance; igrd(2) = ii; jgrd(2) = jj
825 elseif ( dist(2) < distance .AND. distance <= dist(3) )
then 826 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
827 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
828 dist(3) = distance; igrd(3) = ii; jgrd(3) = jj
829 elseif ( dist(3) < distance .AND. distance <= dist(4) )
then 830 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
831 dist(4) = distance; igrd(4) = ii; jgrd(4) = jj
832 elseif ( dist(4) < distance .AND. distance <= dist(5) )
then 833 dist(5) = distance; igrd(5) = ii; jgrd(5) = jj
838 if ( abs(dist(1)) < eps )
then 845 denom = 1.0_rp / ( (1.0_rp/dist(1)) + (1.0_rp/dist(2)) &
846 + (1.0_rp/dist(3)) + (1.0_rp/dist(4)) + (1.0_rp/dist(5)) )
847 hfact(1) = ( 1.0_rp/dist(1) ) * denom
848 hfact(2) = ( 1.0_rp/dist(2) ) * denom
849 hfact(3) = ( 1.0_rp/dist(3) ) * denom
850 hfact(4) = ( 1.0_rp/dist(4) ) * denom
851 hfact(5) = ( 1.0_rp/dist(5) ) * denom
855 end subroutine intrpnest_search_horiz_5points
860 subroutine intrpnest_search_horiz_8points( &
876 real(RP),
intent(out) :: hfact(:)
877 integer,
intent(out) :: igrd (:)
878 integer,
intent(out) :: jgrd (:)
880 real(RP),
intent(in) :: mylat
881 real(RP),
intent(in) :: mylon
882 real(RP),
intent(in) :: inlat(:,:)
883 real(RP),
intent(in) :: inlon(:,:)
885 integer,
intent(in) ::
is 886 integer,
intent(in) ::
ie 887 integer,
intent(in) ::
js 888 integer,
intent(in) ::
je 896 dist(1) = large_number_8
897 dist(2) = large_number_7
898 dist(3) = large_number_6
899 dist(4) = large_number_5
900 dist(5) = large_number_4
901 dist(6) = large_number_3
902 dist(7) = large_number_2
903 dist(8) = large_number_1
909 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
910 distance = distance**weight_order
911 if ( distance <= dist(1) )
then 912 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
913 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
914 dist(6) = dist(5); igrd(6) = igrd(5); jgrd(6) = jgrd(5)
915 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
916 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
917 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
918 dist(2) = dist(1); igrd(2) = igrd(1); jgrd(2) = jgrd(1)
919 dist(1) = distance; igrd(1) = ii; jgrd(1) = jj
920 elseif ( dist(1) < distance .AND. distance <= dist(2) )
then 921 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
922 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
923 dist(6) = dist(5); igrd(6) = igrd(5); jgrd(6) = jgrd(5)
924 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
925 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
926 dist(3) = dist(2); igrd(3) = igrd(2); jgrd(3) = jgrd(2)
927 dist(2) = distance; igrd(2) = ii; jgrd(2) = jj
928 elseif ( dist(2) < distance .AND. distance <= dist(3) )
then 929 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
930 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
931 dist(6) = dist(5); igrd(6) = igrd(5); jgrd(6) = jgrd(5)
932 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
933 dist(4) = dist(3); igrd(4) = igrd(3); jgrd(4) = jgrd(3)
934 dist(3) = distance; igrd(3) = ii; jgrd(3) = jj
935 elseif ( dist(3) < distance .AND. distance <= dist(4) )
then 936 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
937 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
938 dist(6) = dist(5); igrd(6) = igrd(5); jgrd(6) = jgrd(5)
939 dist(5) = dist(4); igrd(5) = igrd(4); jgrd(5) = jgrd(4)
940 dist(4) = distance; igrd(4) = ii; jgrd(4) = jj
941 elseif ( dist(4) < distance .AND. distance <= dist(5) )
then 942 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
943 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
944 dist(6) = dist(5); igrd(6) = igrd(5); jgrd(6) = jgrd(5)
945 dist(5) = distance; igrd(5) = ii; jgrd(5) = jj
946 elseif ( dist(5) < distance .AND. distance <= dist(6) )
then 947 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
948 dist(7) = dist(6); igrd(7) = igrd(6); jgrd(7) = jgrd(6)
949 dist(6) = distance; igrd(6) = ii; jgrd(6) = jj
950 elseif ( dist(6) < distance .AND. distance <= dist(7) )
then 951 dist(8) = dist(7); igrd(8) = igrd(7); jgrd(8) = jgrd(7)
952 dist(7) = distance; igrd(7) = ii; jgrd(7) = jj
953 elseif ( dist(7) < distance .AND. distance <= dist(8) )
then 954 dist(8) = distance; igrd(8) = ii; jgrd(8) = jj
959 if ( abs(dist(1)) < eps )
then 963 denom = 1.0_rp / ( (1.0_rp/dist(1)) + (1.0_rp/dist(2)) &
964 + (1.0_rp/dist(3)) + (1.0_rp/dist(4)) &
965 + (1.0_rp/dist(5)) + (1.0_rp/dist(6)) &
966 + (1.0_rp/dist(7)) + (1.0_rp/dist(8)) )
967 hfact(1) = ( 1.0_rp/dist(1) ) * denom
968 hfact(2) = ( 1.0_rp/dist(2) ) * denom
969 hfact(3) = ( 1.0_rp/dist(3) ) * denom
970 hfact(4) = ( 1.0_rp/dist(4) ) * denom
971 hfact(5) = ( 1.0_rp/dist(5) ) * denom
972 hfact(6) = ( 1.0_rp/dist(6) ) * denom
973 hfact(7) = ( 1.0_rp/dist(7) ) * denom
974 hfact(8) = ( 1.0_rp/dist(8) ) * denom
978 end subroutine intrpnest_search_horiz_8points
983 subroutine intrpnest_search_horiz_12points( &
999 real(RP),
intent(out) :: hfact(:)
1000 integer,
intent(out) :: igrd (:)
1001 integer,
intent(out) :: jgrd (:)
1003 real(RP),
intent(in) :: mylat
1004 real(RP),
intent(in) :: mylon
1005 real(RP),
intent(in) :: inlat(:,:)
1006 real(RP),
intent(in) :: inlon(:,:)
1008 integer,
intent(in) ::
is 1009 integer,
intent(in) ::
ie 1010 integer,
intent(in) ::
js 1011 integer,
intent(in) ::
je 1013 real(RP) :: distance
1015 real(RP) :: dist(12)
1019 dist(1 ) = large_number_12
1020 dist(2 ) = large_number_11
1021 dist(3 ) = large_number_10
1022 dist(4 ) = large_number_9
1023 dist(5 ) = large_number_8
1024 dist(6 ) = large_number_7
1025 dist(7 ) = large_number_6
1026 dist(8 ) = large_number_5
1027 dist(9 ) = large_number_4
1028 dist(10) = large_number_3
1029 dist(11) = large_number_2
1030 dist(12) = large_number_1
1036 distance = intrpnest_haversine( mylat,mylon,inlat(ii,jj),inlon(ii,jj) )
1037 distance = distance**weight_order
1038 if ( distance <= dist(1) )
then 1039 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1040 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1041 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1042 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1043 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1044 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1045 dist(6 ) = dist(5 ); igrd(6 ) = igrd(5 ); jgrd(6 ) = jgrd(5 )
1046 dist(5 ) = dist(4 ); igrd(5 ) = igrd(4 ); jgrd(5 ) = jgrd(4 )
1047 dist(4 ) = dist(3 ); igrd(4 ) = igrd(3 ); jgrd(4 ) = jgrd(3 )
1048 dist(3 ) = dist(2 ); igrd(3 ) = igrd(2 ); jgrd(3 ) = jgrd(2 )
1049 dist(2 ) = dist(1 ); igrd(2 ) = igrd(1 ); jgrd(2 ) = jgrd(1 )
1050 dist(1 ) = distance; igrd(1 ) = ii; jgrd(1 ) = jj
1051 elseif ( dist(1) < distance .AND. distance <= dist(2) )
then 1052 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1053 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1054 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1055 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1056 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1057 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1058 dist(6 ) = dist(5 ); igrd(6 ) = igrd(5 ); jgrd(6 ) = jgrd(5 )
1059 dist(5 ) = dist(4 ); igrd(5 ) = igrd(4 ); jgrd(5 ) = jgrd(4 )
1060 dist(4 ) = dist(3 ); igrd(4 ) = igrd(3 ); jgrd(4 ) = jgrd(3 )
1061 dist(3 ) = dist(2 ); igrd(3 ) = igrd(2 ); jgrd(3 ) = jgrd(2 )
1062 dist(2 ) = distance; igrd(2 ) = ii; jgrd(2 ) = jj
1063 elseif ( dist(2) < distance .AND. distance <= dist(3) )
then 1064 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1065 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1066 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1067 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1068 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1069 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1070 dist(6 ) = dist(5 ); igrd(6 ) = igrd(5 ); jgrd(6 ) = jgrd(5 )
1071 dist(5 ) = dist(4 ); igrd(5 ) = igrd(4 ); jgrd(5 ) = jgrd(4 )
1072 dist(4 ) = dist(3 ); igrd(4 ) = igrd(3 ); jgrd(4 ) = jgrd(3 )
1073 dist(3 ) = distance; igrd(3 ) = ii; jgrd(3 ) = jj
1074 elseif ( dist(3) < distance .AND. distance <= dist(4) )
then 1075 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1076 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1077 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1078 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1079 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1080 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1081 dist(6 ) = dist(5 ); igrd(6 ) = igrd(5 ); jgrd(6 ) = jgrd(5 )
1082 dist(5 ) = dist(4 ); igrd(5 ) = igrd(4 ); jgrd(5 ) = jgrd(4 )
1083 dist(4 ) = distance; igrd(4 ) = ii; jgrd(4 ) = jj
1084 elseif ( dist(4) < distance .AND. distance <= dist(5) )
then 1085 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1086 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1087 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1088 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1089 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1090 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1091 dist(6 ) = dist(5 ); igrd(6 ) = igrd(5 ); jgrd(6 ) = jgrd(5 )
1092 dist(5 ) = distance; igrd(5 ) = ii; jgrd(5 ) = jj
1093 elseif ( dist(5) < distance .AND. distance <= dist(6) )
then 1094 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1095 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1096 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1097 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1098 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1099 dist(7 ) = dist(6 ); igrd(7 ) = igrd(6 ); jgrd(7 ) = jgrd(6 )
1100 dist(6 ) = distance; igrd(6 ) = ii; jgrd(6 ) = jj
1101 elseif ( dist(6) < distance .AND. distance <= dist(7) )
then 1102 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1103 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1104 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1105 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1106 dist(8 ) = dist(7 ); igrd(8 ) = igrd(7 ); jgrd(8 ) = jgrd(7 )
1107 dist(7 ) = distance; igrd(7 ) = ii; jgrd(7 ) = jj
1108 elseif ( dist(7) < distance .AND. distance <= dist(8) )
then 1109 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1110 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1111 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1112 dist(9 ) = dist(8 ); igrd(9 ) = igrd(8 ); jgrd(9 ) = jgrd(8 )
1113 dist(8 ) = distance; igrd(8 ) = ii; jgrd(8 ) = jj
1114 elseif ( dist(8) < distance .AND. distance <= dist(9) )
then 1115 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1116 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1117 dist(10) = dist(9 ); igrd(10) = igrd(9 ); jgrd(10) = jgrd(9 )
1118 dist(9 ) = distance; igrd(9 ) = ii; jgrd(9 ) = jj
1119 elseif ( dist(9) < distance .AND. distance <= dist(10) )
then 1120 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1121 dist(11) = dist(10); igrd(11) = igrd(10); jgrd(11) = jgrd(10)
1122 dist(10) = distance; igrd(10) = ii; jgrd(10) = jj
1123 elseif ( dist(10) < distance .AND. distance <= dist(11) )
then 1124 dist(12) = dist(11); igrd(12) = igrd(11); jgrd(12) = jgrd(11)
1125 dist(11) = distance; igrd(11) = ii; jgrd(11) = jj
1126 elseif ( dist(11) < distance .AND. distance <= dist(12) )
then 1127 dist(12) = distance; igrd(12) = ii; jgrd(12) = jj
1132 if ( abs(dist(1)) < eps )
then 1136 denom = 1.0_rp / ( (1.0_rp/dist(1 )) + (1.0_rp/dist(2 )) &
1137 + (1.0_rp/dist(3 )) + (1.0_rp/dist(4 )) &
1138 + (1.0_rp/dist(5 )) + (1.0_rp/dist(6 )) &
1139 + (1.0_rp/dist(7 )) + (1.0_rp/dist(8 )) &
1140 + (1.0_rp/dist(9 )) + (1.0_rp/dist(10)) &
1141 + (1.0_rp/dist(11)) + (1.0_rp/dist(12)) )
1142 hfact(1 ) = ( 1.0_rp/dist(1 ) ) * denom
1143 hfact(2 ) = ( 1.0_rp/dist(2 ) ) * denom
1144 hfact(3 ) = ( 1.0_rp/dist(3 ) ) * denom
1145 hfact(4 ) = ( 1.0_rp/dist(4 ) ) * denom
1146 hfact(5 ) = ( 1.0_rp/dist(5 ) ) * denom
1147 hfact(6 ) = ( 1.0_rp/dist(6 ) ) * denom
1148 hfact(7 ) = ( 1.0_rp/dist(7 ) ) * denom
1149 hfact(8 ) = ( 1.0_rp/dist(8 ) ) * denom
1150 hfact(9 ) = ( 1.0_rp/dist(9 ) ) * denom
1151 hfact(10) = ( 1.0_rp/dist(10) ) * denom
1152 hfact(11) = ( 1.0_rp/dist(11) ) * denom
1153 hfact(12) = ( 1.0_rp/dist(12) ) * denom
1157 end subroutine intrpnest_search_horiz_12points
1162 subroutine intrpnest_search_vert_online( &
1180 real(RP),
intent(inout) :: vfact(:,:,:,:,:)
1181 integer,
intent(inout) :: kgrd (:,:,:,:,:)
1182 integer,
intent(out) :: ncopy(:)
1184 integer,
intent(in) :: igrd(:)
1185 integer,
intent(in) :: jgrd(:)
1186 real(RP),
intent(in) :: myhgt(:)
1187 real(RP),
intent(in) :: inhgt(:,:,:)
1188 integer,
intent(in) :: iloc
1189 integer,
intent(in) :: jloc
1190 integer,
intent(in) ::
ks 1191 integer,
intent(in) ::
ke 1192 integer,
intent(in) :: inka
1193 logical,
intent(in) :: lndgrd
1197 integer :: ii, jj, idx
1199 integer :: inks, inke
1204 write(*,*)
'xxx internal error [interporation: nest/interp]' 1205 write(*,*)
' land grid is not araviable in online' 1217 dist(1) = large_number_2
1218 dist(2) = large_number_1
1221 kgrd(k,iloc,jloc,idx,:) = -1
1225 if( myhgt(k) < inhgt(inks,ii,jj) )
then 1227 ncopy(idx) = ncopy(idx) + 1
1229 kgrd(k,iloc,jloc,idx,:) = inks
1231 vfact(k,iloc,jloc,idx,1) = 1.0_rp
1232 vfact(k,iloc,jloc,idx,2) = 0.0_rp
1237 dist(1) = myhgt(k) - inhgt(kk ,ii,jj)
1238 dist(2) = myhgt(k) - inhgt(kk+1,ii,jj)
1240 if( dist(1) >= 0.0_rp .AND. dist(2) < 0.0_rp )
then 1241 kgrd(k,iloc,jloc,idx,1) = kk
1242 kgrd(k,iloc,jloc,idx,2) = kk+1
1244 vfact(k,iloc,jloc,idx,1) = abs(dist(2)) / ( abs(dist(1)) + abs(dist(2)) )
1245 vfact(k,iloc,jloc,idx,2) = abs(dist(1)) / ( abs(dist(1)) + abs(dist(2)) )
1254 if( .NOT. dflag )
then 1255 write(*,*)
'xxx internal error [INTRPNEST_search_vert_online]' 1256 write(*,*)
'xxx data for interpolation was not found.' 1257 write(*,*)
'xxx iloc=',iloc,
' jloc=',jloc,
' k=',k,
' idx=',idx
1265 end subroutine intrpnest_search_vert_online
1269 subroutine intrpnest_search_vert_offline( &
1289 real(RP),
intent(inout) :: vfact(:,:,:,:,:)
1290 integer,
intent(inout) :: kgrd (:,:,:,:,:)
1291 integer,
intent(out) :: ncopy(:)
1293 integer,
intent(in) :: igrd(:)
1294 integer,
intent(in) :: jgrd(:)
1295 real(RP),
intent(in) :: myhgt(:)
1296 real(RP),
intent(in) :: inhgt(:,:,:)
1297 integer,
intent(in) :: iloc
1298 integer,
intent(in) :: jloc
1299 integer,
intent(in) ::
ks 1300 integer,
intent(in) ::
ke 1301 integer,
intent(in) :: inka
1302 logical,
intent(in) :: lndgrd
1308 integer :: k, kk, kks, kke
1313 kks = 1; kke =
lkmax 1324 dist(1) = large_number_2
1325 dist(2) = large_number_1
1326 kgrd(k,iloc,jloc,idx,:) = -1
1329 if( myhgt(k) < inhgt(1,ii,jj) )
then 1330 kgrd(k,iloc,jloc,idx,:) = 1
1331 vfact(k,iloc,jloc,idx,1) = 1.0_rp
1332 vfact(k,iloc,jloc,idx,2) = 0.0_rp
1334 else if( abs(inhgt(inka,ii,jj)-myhgt(k))<eps )
then 1335 kgrd(k,iloc,jloc,idx,:) = inka
1336 vfact(k,iloc,jloc,idx,1) = 1.0_rp
1337 vfact(k,iloc,jloc,idx,2) = 0.0_rp
1339 else if( inhgt(inka,ii,jj) < myhgt(k) )
then 1341 kgrd(k,iloc,jloc,idx,:) = inka
1342 vfact(k,iloc,jloc,idx,1) = 1.0_rp
1343 vfact(k,iloc,jloc,idx,2) = 0.0_rp
1346 write(*,*)
'xxx internal error [INTRPNEST_search_vert_offline]' 1347 write(*,*)
'xxx data level is beyond parent data' 1348 write(*,*)
'in',ii,jj,inka,inhgt(inka,ii,jj),
'my',iloc,jloc,k,myhgt(k)
1354 if( (inhgt(kk,ii,jj)<=myhgt(k)).AND.(myhgt(k)<inhgt(kk+1,ii,jj)) )
then 1355 kgrd(k,iloc,jloc,idx,1) = kk
1356 kgrd(k,iloc,jloc,idx,2) = kk+1
1357 dist(1) = abs( myhgt(k) - inhgt(kk,ii,jj) )
1358 dist(2) = abs( myhgt(k) - inhgt(kk+1,ii,jj) )
1360 if ( abs(dist(1))<eps )
then 1361 vfact(k,iloc,jloc,idx,1) = 1.0_rp
1362 vfact(k,iloc,jloc,idx,2) = 0.0_rp
1364 denom = 1.0_rp / ( (1.0_rp/dist(1)) + (1.0_rp/dist(2)) )
1365 vfact(k,iloc,jloc,idx,1) = ( 1.0_rp/dist(1) ) * denom
1366 vfact(k,iloc,jloc,idx,2) = ( 1.0_rp/dist(2) ) * denom
1373 if( .NOT. dflag )
then 1374 write(*,*)
'xxx internal error [INTRPNEST_search_vert_offline]' 1375 write(*,*)
'xxx data for interpolation was not found.' 1376 write(*,*)
'xxx iloc=',iloc,
' jloc=',jloc,
' k=',k,
' idx=',idx
1384 end subroutine intrpnest_search_vert_offline
1388 subroutine intrpnest_interp_2d_1points( &
1398 real(RP),
intent(out) :: intp(:,:)
1400 real(RP),
intent(in) :: ref (:,:)
1401 real(RP),
intent(in) :: hfact(:,:,:)
1402 integer,
intent(in) :: igrd (:,:,:)
1403 integer,
intent(in) :: jgrd (:,:,:)
1404 integer,
intent(in) ::
ia 1405 integer,
intent(in) ::
ja 1413 intp(i,j) = ref(igrd(i,j,1),jgrd(i,j,1)) * hfact(i,j,1)
1418 end subroutine intrpnest_interp_2d_1points
1423 subroutine intrpnest_interp_3d_1points( &
1438 real(RP),
intent(out) :: intp(:,:,:)
1440 real(RP),
intent(in) :: ref (:,:,:)
1441 real(RP),
intent(in) :: hfact(:,:,:)
1442 real(RP),
intent(in) :: vfact(:,:,:,:,:)
1443 integer,
intent(in) :: kgrd (:,:,:,:,:)
1444 integer,
intent(in) :: igrd (:,:,:)
1445 integer,
intent(in) :: jgrd (:,:,:)
1446 integer,
intent(in) ::
ia 1447 integer,
intent(in) ::
ja 1448 integer,
intent(in) ::
ks 1449 integer,
intent(in) ::
ke 1451 logical,
intent(in),
optional :: logwegt
1454 logical :: logarithmic
1457 logarithmic = .false.
1458 if (
present(logwegt) )
then 1460 logarithmic = .true.
1469 intp(k,i,j) = ref(kgrd(k,i,j,1,1),igrd(i,j,1),jgrd(i,j,1)) &
1470 * hfact(i,j,1) * vfact(k,i,j,1,1) &
1471 + ref(kgrd(k,i,j,1,2),igrd(i,j,1),jgrd(i,j,1)) &
1472 * hfact(i,j,1) * vfact(k,i,j,1,2)
1478 if ( logarithmic )
then 1482 intp(k,i,j) = exp( intp(k,i,j) )
1489 end subroutine intrpnest_interp_3d_1points
1494 subroutine intrpnest_interp_2d_3points( &
1504 real(RP),
intent(out) :: intp(:,:)
1506 real(RP),
intent(in) :: ref (:,:)
1507 real(RP),
intent(in) :: hfact(:,:,:)
1508 integer,
intent(in) :: igrd (:,:,:)
1509 integer,
intent(in) :: jgrd (:,:,:)
1510 integer,
intent(in) ::
ia 1511 integer,
intent(in) ::
ja 1519 intp(i,j) = ref(igrd(i,j,1),jgrd(i,j,1)) * hfact(i,j,1) &
1520 + ref(igrd(i,j,2),jgrd(i,j,2)) * hfact(i,j,2) &
1521 + ref(igrd(i,j,3),jgrd(i,j,3)) * hfact(i,j,3)
1526 end subroutine intrpnest_interp_2d_3points
1531 subroutine intrpnest_interp_3d_3points( &
1546 real(RP),
intent(out) :: intp(:,:,:)
1548 real(RP),
intent(in) :: ref (:,:,:)
1549 real(RP),
intent(in) :: hfact(:,:,:)
1550 real(RP),
intent(in) :: vfact(:,:,:,:,:)
1551 integer,
intent(in) :: kgrd (:,:,:,:,:)
1552 integer,
intent(in) :: igrd (:,:,:)
1553 integer,
intent(in) :: jgrd (:,:,:)
1554 integer,
intent(in) ::
ia 1555 integer,
intent(in) ::
ja 1556 integer,
intent(in) ::
ks 1557 integer,
intent(in) ::
ke 1559 logical,
intent(in),
optional :: logwegt
1562 logical :: logarithmic
1565 logarithmic = .false.
1566 if (
present(logwegt) )
then 1568 logarithmic = .true.
1577 intp(k,i,j) = ref(kgrd(k,i,j,1,1),igrd(i,j,1),jgrd(i,j,1)) &
1578 * hfact(i,j,1) * vfact(k,i,j,1,1) &
1579 + ref(kgrd(k,i,j,2,1),igrd(i,j,2),jgrd(i,j,2)) &
1580 * hfact(i,j,2) * vfact(k,i,j,2,1) &
1581 + ref(kgrd(k,i,j,3,1),igrd(i,j,3),jgrd(i,j,3)) &
1582 * hfact(i,j,3) * vfact(k,i,j,3,1) &
1583 + ref(kgrd(k,i,j,1,2),igrd(i,j,1),jgrd(i,j,1)) &
1584 * hfact(i,j,1) * vfact(k,i,j,1,2) &
1585 + ref(kgrd(k,i,j,2,2),igrd(i,j,2),jgrd(i,j,2)) &
1586 * hfact(i,j,2) * vfact(k,i,j,2,2) &
1587 + ref(kgrd(k,i,j,3,2),igrd(i,j,3),jgrd(i,j,3)) &
1588 * hfact(i,j,3) * vfact(k,i,j,3,2)
1594 if ( logarithmic )
then 1598 intp(k,i,j) = exp( intp(k,i,j) )
1605 end subroutine intrpnest_interp_3d_3points
1610 subroutine intrpnest_interp_2d_4points( &
1620 real(RP),
intent(out) :: intp(:,:)
1622 real(RP),
intent(in) :: ref (:,:)
1623 real(RP),
intent(in) :: hfact(:,:,:)
1624 integer,
intent(in) :: igrd (:,:,:)
1625 integer,
intent(in) :: jgrd (:,:,:)
1626 integer,
intent(in) ::
ia 1627 integer,
intent(in) ::
ja 1635 intp(i,j) = ref(igrd(i,j,1),jgrd(i,j,1)) * hfact(i,j,1) &
1636 + ref(igrd(i,j,2),jgrd(i,j,2)) * hfact(i,j,2) &
1637 + ref(igrd(i,j,3),jgrd(i,j,3)) * hfact(i,j,3) &
1638 + ref(igrd(i,j,4),jgrd(i,j,4)) * hfact(i,j,4)
1643 end subroutine intrpnest_interp_2d_4points
1648 subroutine intrpnest_interp_3d_4points( &
1663 real(RP),
intent(out) :: intp(:,:,:)
1665 real(RP),
intent(in) :: ref (:,:,:)
1666 real(RP),
intent(in) :: hfact(:,:,:)
1667 real(RP),
intent(in) :: vfact(:,:,:,:,:)
1668 integer,
intent(in) :: kgrd (:,:,:,:,:)
1669 integer,
intent(in) :: igrd (:,:,:)
1670 integer,
intent(in) :: jgrd (:,:,:)
1671 integer,
intent(in) ::
ia 1672 integer,
intent(in) ::
ja 1673 integer,
intent(in) ::
ks 1674 integer,
intent(in) ::
ke 1676 logical,
intent(in),
optional :: logwegt
1679 logical :: logarithmic
1682 logarithmic = .false.
1683 if (
present(logwegt) )
then 1685 logarithmic = .true.
1694 intp(k,i,j) = ref(kgrd(k,i,j,1,1),igrd(i,j,1),jgrd(i,j,1)) &
1695 * hfact(i,j,1) * vfact(k,i,j,1,1) &
1696 + ref(kgrd(k,i,j,2,1),igrd(i,j,2),jgrd(i,j,2)) &
1697 * hfact(i,j,2) * vfact(k,i,j,2,1) &
1698 + ref(kgrd(k,i,j,3,1),igrd(i,j,3),jgrd(i,j,3)) &
1699 * hfact(i,j,3) * vfact(k,i,j,3,1) &
1700 + ref(kgrd(k,i,j,4,1),igrd(i,j,4),jgrd(i,j,4)) &
1701 * hfact(i,j,4) * vfact(k,i,j,4,1) &
1702 + ref(kgrd(k,i,j,1,2),igrd(i,j,1),jgrd(i,j,1)) &
1703 * hfact(i,j,1) * vfact(k,i,j,1,2) &
1704 + ref(kgrd(k,i,j,2,2),igrd(i,j,2),jgrd(i,j,2)) &
1705 * hfact(i,j,2) * vfact(k,i,j,2,2) &
1706 + ref(kgrd(k,i,j,3,2),igrd(i,j,3),jgrd(i,j,3)) &
1707 * hfact(i,j,3) * vfact(k,i,j,3,2) &
1708 + ref(kgrd(k,i,j,4,2),igrd(i,j,4),jgrd(i,j,4)) &
1709 * hfact(i,j,4) * vfact(k,i,j,4,2)
1715 if ( logarithmic )
then 1719 intp(k,i,j) = exp( intp(k,i,j) )
1726 end subroutine intrpnest_interp_3d_4points
1731 subroutine intrpnest_interp_2d_5points( &
1741 real(RP),
intent(out) :: intp(:,:)
1743 real(RP),
intent(in) :: ref (:,:)
1744 real(RP),
intent(in) :: hfact(:,:,:)
1745 integer,
intent(in) :: igrd (:,:,:)
1746 integer,
intent(in) :: jgrd (:,:,:)
1747 integer,
intent(in) ::
ia 1748 integer,
intent(in) ::
ja 1756 intp(i,j) = ref(igrd(i,j,1),jgrd(i,j,1)) * hfact(i,j,1) &
1757 + ref(igrd(i,j,2),jgrd(i,j,2)) * hfact(i,j,2) &
1758 + ref(igrd(i,j,3),jgrd(i,j,3)) * hfact(i,j,3) &
1759 + ref(igrd(i,j,4),jgrd(i,j,4)) * hfact(i,j,4) &
1760 + ref(igrd(i,j,5),jgrd(i,j,5)) * hfact(i,j,5)
1765 end subroutine intrpnest_interp_2d_5points
1770 subroutine intrpnest_interp_3d_5points( &
1785 real(RP),
intent(out) :: intp(:,:,:)
1787 real(RP),
intent(in) :: ref (:,:,:)
1788 real(RP),
intent(in) :: hfact(:,:,:)
1789 real(RP),
intent(in) :: vfact(:,:,:,:,:)
1790 integer,
intent(in) :: kgrd (:,:,:,:,:)
1791 integer,
intent(in) :: igrd (:,:,:)
1792 integer,
intent(in) :: jgrd (:,:,:)
1793 integer,
intent(in) ::
ia 1794 integer,
intent(in) ::
ja 1795 integer,
intent(in) ::
ks 1796 integer,
intent(in) ::
ke 1798 logical,
intent(in),
optional :: logwegt
1801 logical :: logarithmic
1804 logarithmic = .false.
1805 if (
present(logwegt) )
then 1807 logarithmic = .true.
1816 intp(k,i,j) = ref(kgrd(k,i,j,1,1),igrd(i,j,1),jgrd(i,j,1)) &
1817 * hfact(i,j,1) * vfact(k,i,j,1,1) &
1818 + ref(kgrd(k,i,j,2,1),igrd(i,j,2),jgrd(i,j,2)) &
1819 * hfact(i,j,2) * vfact(k,i,j,2,1) &
1820 + ref(kgrd(k,i,j,3,1),igrd(i,j,3),jgrd(i,j,3)) &
1821 * hfact(i,j,3) * vfact(k,i,j,3,1) &
1822 + ref(kgrd(k,i,j,4,1),igrd(i,j,4),jgrd(i,j,4)) &
1823 * hfact(i,j,4) * vfact(k,i,j,4,1) &
1824 + ref(kgrd(k,i,j,5,1),igrd(i,j,5),jgrd(i,j,5)) &
1825 * hfact(i,j,5) * vfact(k,i,j,5,1) &
1826 + ref(kgrd(k,i,j,1,2),igrd(i,j,1),jgrd(i,j,1)) &
1827 * hfact(i,j,1) * vfact(k,i,j,1,2) &
1828 + ref(kgrd(k,i,j,2,2),igrd(i,j,2),jgrd(i,j,2)) &
1829 * hfact(i,j,2) * vfact(k,i,j,2,2) &
1830 + ref(kgrd(k,i,j,3,2),igrd(i,j,3),jgrd(i,j,3)) &
1831 * hfact(i,j,3) * vfact(k,i,j,3,2) &
1832 + ref(kgrd(k,i,j,4,2),igrd(i,j,4),jgrd(i,j,4)) &
1833 * hfact(i,j,4) * vfact(k,i,j,4,2) &
1834 + ref(kgrd(k,i,j,5,2),igrd(i,j,5),jgrd(i,j,5)) &
1835 * hfact(i,j,5) * vfact(k,i,j,5,2)
1841 if ( logarithmic )
then 1845 intp(k,i,j) = exp( intp(k,i,j) )
1852 end subroutine intrpnest_interp_3d_5points
1857 subroutine intrpnest_interp_2d_8points( &
1867 real(RP),
intent(out) :: intp(:,:)
1869 real(RP),
intent(in) :: ref (:,:)
1870 real(RP),
intent(in) :: hfact(:,:,:)
1871 integer,
intent(in) :: igrd (:,:,:)
1872 integer,
intent(in) :: jgrd (:,:,:)
1873 integer,
intent(in) ::
ia 1874 integer,
intent(in) ::
ja 1882 intp(i,j) = ref(igrd(i,j,1),jgrd(i,j,1)) * hfact(i,j,1) &
1883 + ref(igrd(i,j,2),jgrd(i,j,2)) * hfact(i,j,2) &
1884 + ref(igrd(i,j,3),jgrd(i,j,3)) * hfact(i,j,3) &
1885 + ref(igrd(i,j,4),jgrd(i,j,4)) * hfact(i,j,4) &
1886 + ref(igrd(i,j,5),jgrd(i,j,5)) * hfact(i,j,5) &
1887 + ref(igrd(i,j,6),jgrd(i,j,6)) * hfact(i,j,6) &
1888 + ref(igrd(i,j,7),jgrd(i,j,7)) * hfact(i,j,7) &
1889 + ref(igrd(i,j,8),jgrd(i,j,8)) * hfact(i,j,8)
1894 end subroutine intrpnest_interp_2d_8points
1899 subroutine intrpnest_interp_3d_8points( &
1914 real(RP),
intent(out) :: intp(:,:,:)
1916 real(RP),
intent(in) :: ref (:,:,:)
1917 real(RP),
intent(in) :: hfact(:,:,:)
1918 real(RP),
intent(in) :: vfact(:,:,:,:,:)
1919 integer,
intent(in) :: kgrd (:,:,:,:,:)
1920 integer,
intent(in) :: igrd (:,:,:)
1921 integer,
intent(in) :: jgrd (:,:,:)
1922 integer,
intent(in) ::
ia 1923 integer,
intent(in) ::
ja 1924 integer,
intent(in) ::
ks 1925 integer,
intent(in) ::
ke 1927 logical,
intent(in),
optional :: logwegt
1930 logical :: logarithmic
1933 logarithmic = .false.
1934 if (
present(logwegt) )
then 1936 logarithmic = .true.
1945 intp(k,i,j) = ref(kgrd(k,i,j,1,1),igrd(i,j,1),jgrd(i,j,1)) &
1946 * hfact(i,j,1) * vfact(k,i,j,1,1) &
1947 + ref(kgrd(k,i,j,2,1),igrd(i,j,2),jgrd(i,j,2)) &
1948 * hfact(i,j,2) * vfact(k,i,j,2,1) &
1949 + ref(kgrd(k,i,j,3,1),igrd(i,j,3),jgrd(i,j,3)) &
1950 * hfact(i,j,3) * vfact(k,i,j,3,1) &
1951 + ref(kgrd(k,i,j,4,1),igrd(i,j,4),jgrd(i,j,4)) &
1952 * hfact(i,j,4) * vfact(k,i,j,4,1) &
1953 + ref(kgrd(k,i,j,5,1),igrd(i,j,5),jgrd(i,j,5)) &
1954 * hfact(i,j,5) * vfact(k,i,j,5,1) &
1955 + ref(kgrd(k,i,j,6,1),igrd(i,j,6),jgrd(i,j,6)) &
1956 * hfact(i,j,6) * vfact(k,i,j,6,1) &
1957 + ref(kgrd(k,i,j,7,1),igrd(i,j,7),jgrd(i,j,7)) &
1958 * hfact(i,j,7) * vfact(k,i,j,7,1) &
1959 + ref(kgrd(k,i,j,8,1),igrd(i,j,8),jgrd(i,j,8)) &
1960 * hfact(i,j,8) * vfact(k,i,j,8,1) &
1961 + ref(kgrd(k,i,j,1,2),igrd(i,j,1),jgrd(i,j,1)) &
1962 * hfact(i,j,1) * vfact(k,i,j,1,2) &
1963 + ref(kgrd(k,i,j,2,2),igrd(i,j,2),jgrd(i,j,2)) &
1964 * hfact(i,j,2) * vfact(k,i,j,2,2) &
1965 + ref(kgrd(k,i,j,3,2),igrd(i,j,3),jgrd(i,j,3)) &
1966 * hfact(i,j,3) * vfact(k,i,j,3,2) &
1967 + ref(kgrd(k,i,j,4,2),igrd(i,j,3),jgrd(i,j,3)) &
1968 * hfact(i,j,4) * vfact(k,i,j,4,2) &
1969 + ref(kgrd(k,i,j,5,2),igrd(i,j,3),jgrd(i,j,3)) &
1970 * hfact(i,j,5) * vfact(k,i,j,5,2) &
1971 + ref(kgrd(k,i,j,6,2),igrd(i,j,3),jgrd(i,j,3)) &
1972 * hfact(i,j,6) * vfact(k,i,j,6,2) &
1973 + ref(kgrd(k,i,j,7,2),igrd(i,j,3),jgrd(i,j,3)) &
1974 * hfact(i,j,7) * vfact(k,i,j,7,2) &
1975 + ref(kgrd(k,i,j,8,2),igrd(i,j,8),jgrd(i,j,8)) &
1976 * hfact(i,j,8) * vfact(k,i,j,8,2)
1982 if ( logarithmic )
then 1986 intp(k,i,j) = exp( intp(k,i,j) )
1993 end subroutine intrpnest_interp_3d_8points
1998 subroutine intrpnest_interp_2d_12points( &
2008 real(RP),
intent(out) :: intp(:,:)
2010 real(RP),
intent(in) :: ref (:,:)
2011 real(RP),
intent(in) :: hfact(:,:,:)
2012 integer,
intent(in) :: igrd (:,:,:)
2013 integer,
intent(in) :: jgrd (:,:,:)
2014 integer,
intent(in) ::
ia 2015 integer,
intent(in) ::
ja 2023 intp(i,j) = ref(igrd(i,j,1), jgrd(i,j,1)) * hfact(i,j,1) &
2024 + ref(igrd(i,j,2), jgrd(i,j,2)) * hfact(i,j,2) &
2025 + ref(igrd(i,j,3), jgrd(i,j,3)) * hfact(i,j,3) &
2026 + ref(igrd(i,j,4), jgrd(i,j,4)) * hfact(i,j,4) &
2027 + ref(igrd(i,j,5), jgrd(i,j,5)) * hfact(i,j,5) &
2028 + ref(igrd(i,j,6), jgrd(i,j,6)) * hfact(i,j,6) &
2029 + ref(igrd(i,j,7), jgrd(i,j,7)) * hfact(i,j,7) &
2030 + ref(igrd(i,j,8), jgrd(i,j,8)) * hfact(i,j,8) &
2031 + ref(igrd(i,j,9), jgrd(i,j,9)) * hfact(i,j,9) &
2032 + ref(igrd(i,j,10),jgrd(i,j,10)) * hfact(i,j,10) &
2033 + ref(igrd(i,j,11),jgrd(i,j,11)) * hfact(i,j,11) &
2034 + ref(igrd(i,j,12),jgrd(i,j,12)) * hfact(i,j,12)
2039 end subroutine intrpnest_interp_2d_12points
2044 subroutine intrpnest_interp_3d_12points( &
2059 real(RP),
intent(out) :: intp(:,:,:)
2061 real(RP),
intent(in) :: ref (:,:,:)
2062 real(RP),
intent(in) :: hfact(:,:,:)
2063 real(RP),
intent(in) :: vfact(:,:,:,:,:)
2064 integer,
intent(in) :: kgrd (:,:,:,:,:)
2065 integer,
intent(in) :: igrd (:,:,:)
2066 integer,
intent(in) :: jgrd (:,:,:)
2067 integer,
intent(in) ::
ia 2068 integer,
intent(in) ::
ja 2069 integer,
intent(in) ::
ks 2070 integer,
intent(in) ::
ke 2072 logical,
intent(in),
optional :: logwegt
2075 logical :: logarithmic
2078 logarithmic = .false.
2079 if (
present(logwegt) )
then 2081 logarithmic = .true.
2090 intp(k,i,j) = ref(kgrd(k,i,j,1, 1),igrd(i,j,1 ),jgrd(i,j,1 )) &
2091 * hfact(i,j,1 ) * vfact(k,i,j,1, 1) &
2092 + ref(kgrd(k,i,j,2, 1),igrd(i,j,2 ),jgrd(i,j,2 )) &
2093 * hfact(i,j,2 ) * vfact(k,i,j,2, 1) &
2094 + ref(kgrd(k,i,j,3, 1),igrd(i,j,3 ),jgrd(i,j,3 )) &
2095 * hfact(i,j,3 ) * vfact(k,i,j,3, 1) &
2096 + ref(kgrd(k,i,j,4, 1),igrd(i,j,4 ),jgrd(i,j,4 )) &
2097 * hfact(i,j,4 ) * vfact(k,i,j,4, 1) &
2098 + ref(kgrd(k,i,j,5, 1),igrd(i,j,5 ),jgrd(i,j,5 )) &
2099 * hfact(i,j,5 ) * vfact(k,i,j,5, 1) &
2100 + ref(kgrd(k,i,j,6, 1),igrd(i,j,6 ),jgrd(i,j,6 )) &
2101 * hfact(i,j,6 ) * vfact(k,i,j,6, 1) &
2102 + ref(kgrd(k,i,j,7, 1),igrd(i,j,7 ),jgrd(i,j,7 )) &
2103 * hfact(i,j,7 ) * vfact(k,i,j,7, 1) &
2104 + ref(kgrd(k,i,j,8, 1),igrd(i,j,8 ),jgrd(i,j,8 )) &
2105 * hfact(i,j,8 ) * vfact(k,i,j,8, 1) &
2106 + ref(kgrd(k,i,j,9, 1),igrd(i,j,9 ),jgrd(i,j,9 )) &
2107 * hfact(i,j,9 ) * vfact(k,i,j,9, 1) &
2108 + ref(kgrd(k,i,j,10,1),igrd(i,j,10),jgrd(i,j,10)) &
2109 * hfact(i,j,10) * vfact(k,i,j,10,1) &
2110 + ref(kgrd(k,i,j,11,1),igrd(i,j,11),jgrd(i,j,11)) &
2111 * hfact(i,j,11) * vfact(k,i,j,11,1) &
2112 + ref(kgrd(k,i,j,12,1),igrd(i,j,12),jgrd(i,j,12)) &
2113 * hfact(i,j,12) * vfact(k,i,j,12,1) &
2114 + ref(kgrd(k,i,j,1, 2),igrd(i,j,1 ),jgrd(i,j,1 )) &
2115 * hfact(i,j,1 ) * vfact(k,i,j,1, 2) &
2116 + ref(kgrd(k,i,j,2, 2),igrd(i,j,2 ),jgrd(i,j,2 )) &
2117 * hfact(i,j,2 ) * vfact(k,i,j,2, 2) &
2118 + ref(kgrd(k,i,j,3, 2),igrd(i,j,3 ),jgrd(i,j,3 )) &
2119 * hfact(i,j,3 ) * vfact(k,i,j,3, 2) &
2120 + ref(kgrd(k,i,j,4, 2),igrd(i,j,4 ),jgrd(i,j,4 )) &
2121 * hfact(i,j,4 ) * vfact(k,i,j,4, 2) &
2122 + ref(kgrd(k,i,j,5, 2),igrd(i,j,5 ),jgrd(i,j,5 )) &
2123 * hfact(i,j,5 ) * vfact(k,i,j,5, 2) &
2124 + ref(kgrd(k,i,j,6, 2),igrd(i,j,6 ),jgrd(i,j,6 )) &
2125 * hfact(i,j,6 ) * vfact(k,i,j,6, 2) &
2126 + ref(kgrd(k,i,j,7, 2),igrd(i,j,7 ),jgrd(i,j,7 )) &
2127 * hfact(i,j,7 ) * vfact(k,i,j,7, 2) &
2128 + ref(kgrd(k,i,j,8, 2),igrd(i,j,8 ),jgrd(i,j,8 )) &
2129 * hfact(i,j,8 ) * vfact(k,i,j,8, 2) &
2130 + ref(kgrd(k,i,j,9, 2),igrd(i,j,9 ),jgrd(i,j,9 )) &
2131 * hfact(i,j,9 ) * vfact(k,i,j,9, 2) &
2132 + ref(kgrd(k,i,j,10,2),igrd(i,j,10),jgrd(i,j,10)) &
2133 * hfact(i,j,10) * vfact(k,i,j,10,2) &
2134 + ref(kgrd(k,i,j,11,2),igrd(i,j,11),jgrd(i,j,11)) &
2135 * hfact(i,j,11) * vfact(k,i,j,11,2) &
2136 + ref(kgrd(k,i,j,12,2),igrd(i,j,12),jgrd(i,j,12)) &
2137 * hfact(i,j,12) * vfact(k,i,j,12,2)
2143 if ( logarithmic )
then 2147 intp(k,i,j) = exp( intp(k,i,j) )
2154 end subroutine intrpnest_interp_3d_12points
2173 real(RP),
intent(in) :: lon_org(:,:)
2174 real(RP),
intent(in) :: lat_org(:,:)
2175 real(RP),
intent(in) :: lev_org(:,:,:)
2176 real(RP),
intent(in) :: lon_loc(:,:)
2177 real(RP),
intent(in) :: lat_loc(:,:)
2178 real(RP),
intent(in) :: lev_loc(:,:,:)
2179 logical,
intent(in),
optional :: skip_x
2180 logical,
intent(in),
optional :: skip_y
2181 logical,
intent(in),
optional :: skip_z
2183 real(RP) :: max_ref, min_ref
2184 real(RP) :: max_loc, min_loc
2186 logical :: do_xdirec
2187 logical :: do_ydirec
2188 logical :: do_zdirec
2194 if (
present(skip_x) )
then 2201 if (
present(skip_y) )
then 2208 if (
present(skip_z) )
then 2214 if ( do_xdirec )
then 2215 max_ref = maxval( lon_org(:,:) / d2r )
2216 min_ref = minval( lon_org(:,:) / d2r )
2217 max_loc = maxval( lon_loc(:,:) / d2r )
2218 min_loc = minval( lon_loc(:,:) / d2r )
2220 if ( (min_ref+360.0_rp-max_ref) < 360.0_rp /
size(lon_org,1) * 2.0_rp)
then 2222 else if ( max_ref < max_loc .OR. min_ref > min_loc )
then 2223 write(*,*)
'xxx ERROR: REQUESTED DOMAIN IS TOO MUCH BROAD' 2224 write(*,*)
'xxx -- LONGITUDINAL direction over the limit' 2225 write(*,*)
'xxx -- reference max: ', max_ref
2226 write(*,*)
'xxx -- reference min: ', min_ref
2227 write(*,*)
'xxx -- local max: ', max_loc
2228 write(*,*)
'xxx -- local min: ', min_loc
2233 if ( do_ydirec )
then 2234 max_ref = maxval( lat_org(:,:) / d2r )
2235 min_ref = minval( lat_org(:,:) / d2r )
2236 max_loc = maxval( lat_loc(:,:) / d2r )
2237 min_loc = minval( lat_loc(:,:) / d2r )
2239 if ( max_ref < max_loc .OR. min_ref > min_loc )
then 2240 write(*,*)
'xxx ERROR: REQUESTED DOMAIN IS TOO MUCH BROAD' 2241 write(*,*)
'xxx -- LATITUDINAL direction over the limit' 2242 write(*,*)
'xxx -- reference max: ', max_ref
2243 write(*,*)
'xxx -- reference min: ', min_ref
2244 write(*,*)
'xxx -- local max: ', max_loc
2245 write(*,*)
'xxx -- local min: ', min_loc
2250 if ( do_zdirec )
then 2251 max_ref = maxval( lev_org(:,:,:) )
2253 max_loc = maxval( lev_loc(:,:,:) )
2257 if ( max_ref < max_loc )
then 2259 write(*,*)
'xxx ERROR: REQUESTED DOMAIN IS TOO MUCH BROAD' 2260 write(*,*)
'xxx -- VERTICAL direction over the limit' 2261 write(*,*)
'xxx -- reference max: ', max_ref
2263 write(*,*)
'xxx -- local max: ', max_loc
2275 function intrpnest_haversine( &
2282 real(RP),
intent(in) :: la0, lo0, la, lo
2283 real(RP) :: d, dlon, dlat, work1, work2
2289 work1 = (sin(dlat/2.0_rp))**2.0_rp + &
2290 cos(la0) * cos(la) * (sin(dlon/2.0_rp))**2.0_rp
2291 work2 = 2.0_rp * asin(min( 1.0_rp, sqrt(work1) ))
2294 end function intrpnest_haversine
integer, public is
start point of inner domain: x, local
subroutine, public intrpnest_domain_compatibility(lon_org, lat_org, lev_org, lon_loc, lat_loc, lev_loc, skip_x, skip_y, skip_z)
integer, public je
end point of inner domain: y, local
subroutine, public prc_mpistop
Abort MPI.
logical, public io_l
output log or not? (this process)
real(rp), public const_radius
radius of the planet [m]
integer, public ke
end point of inner domain: z, local
real(rp), public const_d2r
degree to radian
procedure(intrpnest_intfc_interp_2d), pointer, public intrpnest_interp_2d
subroutine, public intrpnest_interp_fact_latlon(hfact, igrd, jgrd, mylat, mylon, myIA, myJA, inlat, inlon, inIA, inJA)
subroutine, public intrpnest_interp_fact_llz(hfact, vfact, kgrd, igrd, jgrd, ncopy, myhgt, mylat, mylon, myKS, myKE, myIA, myJA, inhgt, inlat, inlon, inKA, inIA, inJA, landgrid)
integer, public ia
of whole cells: x, local, with HALO
integer, public js
start point of inner domain: y, local
procedure(intrpnest_intfc_interp_3d), pointer, public intrpnest_interp_3d
integer, public ks
start point of inner domain: z, local
integer, parameter, public khalo
of halo cells: z
module INTERPOLATION (nesting system)
integer, public ie
end point of inner domain: x, local
real(rp), public const_eps
small number
integer, public io_fid_log
Log file ID.
integer, public ja
of whole cells: y, local, with HALO
subroutine, public intrpnest_setup(interp_search_divnum, NEST_INTERP_LEVEL, NEST_INTERP_WEIGHT_ORDER, OFFLINE)
Setup.