SURFEX v8.1
General documentation of Surfex
interp_grid.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !######################
7 !######################
8 
9 INTERFACE interp_grid
10 
11 SUBROUTINE interp_grid_1d(PZ1,PT1,PZ2,PT2)
12 !
13 REAL, DIMENSION(:,:), INTENT(IN) :: PZ1 ! input vertical grid
14 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! input temperatures
15 REAL, DIMENSION(:), INTENT(IN) :: PZ2 ! output vertical grid
16 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! output temperatures
17 !
18 END SUBROUTINE interp_grid_1d
19 !
20 SUBROUTINE interp_grid_2d(PZ1,PT1,PZ2,PT2)
21 !
22 REAL, DIMENSION(:,:), INTENT(IN) :: PZ1 ! input vertical grid
23 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! input temperatures
24 REAL, DIMENSION(:,:), INTENT(IN) :: PZ2 ! output vertical grid
25 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! output temperatures
26 !
27 END SUBROUTINE interp_grid_2d
28 !
29 END INTERFACE
30 
31 END MODULE modi_interp_grid
32 
33 ! ##########################################
34  SUBROUTINE interp_grid_1d(PZ1,PT1,PZ2,PT2)
35 ! ##########################################
36 !!
37 !!**** *INTERP_GRID* - interpolation on the vertical
38 !!
39 !! PURPOSE
40 !! -------
41 !!
42 !! input grid/data is (x,z1)
43 !! output grid/data is (x,z2)
44 !!
45 !!** METHOD
46 !! ------
47 !!
48 !! REFERENCE
49 !! ---------
50 !!
51 !!
52 !! AUTHOR
53 !! ------
54 !! V. Masson
55 !!
56 !! MODIFICATIONS
57 !! -------------
58 !! Original 01/2004
59 !!------------------------------------------------------------------
60 !
61 USE modd_surf_par, ONLY : xundef
62 !
63 USE yomhook ,ONLY : lhook, dr_hook
64 USE parkind1 ,ONLY : jprb
65 !
66 IMPLICIT NONE
67 !
68 !* 0.1 Declaration of dummy arguments
69 !
70 REAL, DIMENSION(:,:), INTENT(IN) :: PZ1 ! input vertical grid
71 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! input temperatures
72 REAL, DIMENSION(:), INTENT(IN) :: PZ2 ! output vertical grid
73 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! output temperatures
74 !
75 !* 0.2 Declaration of local variables
76 !
77 REAL, DIMENSION(SIZE(PZ1,2)-1) :: ZDIZ1
78 INTEGER :: JL, JI, JK, JK2 ! loop counter
79 REAL :: ZTHR
80 REAL :: ZEPS ! a small number
81 REAL :: ZCOEFLIN ! interpolation coefficients
82 INTEGER :: IKLIN ! lower interpolating level of
83 INTEGER :: ILEVEL, IS1
84 ! ! grid 1 for each level of grid 2
85 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
86 !-----------------------------------------------------------------------------
87 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_1D_1',0,zhook_handle)
88 !
89 is1 = SIZE(pz1,2)
90 !
91 zeps=1.e-12
92 !
93 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_1D_1',1,zhook_handle)
94 !
95 !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
96 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_1D_2',0,zhook_handle_omp)
97 !$OMP DO PRIVATE(JI,JK,ZDIZ1,JK2,ZTHR,ILEVEL,IKLIN,ZCOEFLIN)
98 DO ji = 1,SIZE(pz1,1)
99  !
100  IF (any(pt1(ji,:)==xundef)) THEN
101  !
102  pt2(ji,:)=xundef
103  !
104  ELSE
105  !
106  DO jk = 1,SIZE(pz1,2)-1
107  IF (pz1(ji,jk)==pz1(ji,jk+1)) THEN
108  zdiz1(jk) = 0.
109  ELSE
110  zdiz1(jk) = 1./(pz1(ji,jk)-pz1(ji,jk+1))
111  ENDIF
112  ENDDO
113  !
114  DO jk2 = 1,SIZE(pz2)
115  !
116  zthr = pz2(jk2) * (1.-zeps)
117  ilevel = count(pz1(ji,:)<=zthr)
118  !
119  IF (ilevel < 1 ) THEN ! no extrapolation
120  !
121  iklin = 1
122  zcoeflin = 1.
123  !
124  ELSE
125  !
126  !* linear extrapolation
127  ilevel = min(ilevel,is1-1)
128  !
129  iklin = ilevel
130  !
131  zcoeflin = ( pz2(jk2)-pz1(ji,ilevel+1) ) * zdiz1(ilevel)
132  IF (ilevel==is1-1) zcoeflin = max(zcoeflin,0.) ! no extrapolation
133  !
134  ENDIF
135  !
136  pt2(ji,jk2) = zcoeflin * pt1(ji,iklin) + (1.-zcoeflin) * pt1(ji,iklin+1)
137  !
138  END DO
139  !
140  ENDIF
141 !-------------------------------------------------------------------------------
142 ENDDO
143 !$OMP ENDDO
144 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_1D_2',1,zhook_handle_omp)
145 !$OMP END PARALLEL
146 !
147 !-----------------------------------------------------------------------------
148 END SUBROUTINE interp_grid_1d
149 !
150 ! ##########################################
151  SUBROUTINE interp_grid_2d(PZ1,PT1,PZ2,PT2)
152 ! ##########################################
153 !
154 USE modd_surf_par, ONLY : xundef
155 !
156 USE yomhook ,ONLY : lhook, dr_hook
157 USE parkind1 ,ONLY : jprb
158 !
159 IMPLICIT NONE
160 !
161 !* 0.1 Declaration of dummy arguments
162 !
163 REAL, DIMENSION(:,:), INTENT(IN) :: PZ1 ! input vertical grid
164 REAL, DIMENSION(:,:), INTENT(IN) :: PT1 ! input temperatures
165 REAL, DIMENSION(:,:), INTENT(IN) :: PZ2 ! output vertical grid
166 REAL, DIMENSION(:,:), INTENT(OUT) :: PT2 ! output temperatures
167 !
168 !* 0.2 Declaration of local variables
169 !
170 REAL, DIMENSION(SIZE(PZ1,2)-1) :: ZDIZ1
171 REAL :: ZTHR
172 REAL :: ZEPS ! a small number
173 REAL :: ZCOEFLIN ! interpolation coefficients
174 INTEGER :: JI, JK, JK2 ! loop counter
175 INTEGER :: IKLIN ! lower interpolating level of
176 INTEGER :: ILEVEL, IS1
177 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
178 !-----------------------------------------------------------------------------
179 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_2D_1',0,zhook_handle)
180 !
181 is1 = SIZE(pz1,2)
182 !
183 zeps=1.e-12
184 !
185 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_2D_1',1,zhook_handle)
186 !
187 !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
188 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_2D_2',0,zhook_handle_omp)
189 !$OMP DO PRIVATE(JI,JK,ZDIZ1,JK2,ZTHR,ILEVEL,IKLIN,ZCOEFLIN)
190 DO ji = 1,SIZE(pz1,1)
191  !
192  IF (any(pt1(ji,:)==xundef)) THEN
193  !
194  pt2(ji,:)=xundef
195  !
196  ELSE
197  !
198  DO jk = 1,SIZE(pz1,2)-1
199  IF (pz1(ji,jk)==pz1(ji,jk+1)) THEN
200  zdiz1(jk) = 0.
201  ELSE
202  zdiz1(jk) = 1./(pz1(ji,jk)-pz1(ji,jk+1))
203  ENDIF
204  ENDDO
205  !
206  DO jk2 = 1,SIZE(pz2,2)
207  !
208  zthr = pz2(ji,jk2) * (1.-zeps)
209  ilevel = count(pz1(ji,:)<=zthr)
210  !
211  IF (ilevel < 1 ) THEN
212  !
213  iklin = 1
214  zcoeflin = 1. ! no extrapolation
215  !
216  ELSE
217  !
218  !* linear extrapolation
219  ilevel = min(ilevel,is1-1)
220  iklin = ilevel
221  !
222  zcoeflin = ( pz2(ji,jk2)-pz1(ji,ilevel+1) ) * zdiz1(ilevel)
223  IF (ilevel==is1-1) zcoeflin = max(zcoeflin,0.) ! no extrapolation
224  !
225  ENDIF
226  !
227  pt2(ji,jk2) = zcoeflin * pt1(ji,iklin) + (1.-zcoeflin) * pt1(ji,iklin+1)
228  !
229  END DO
230  !
231  ENDIF
232 !-------------------------------------------------------------------------------
233 ENDDO
234 !$OMP ENDDO
235 IF (lhook) CALL dr_hook('MODI_INTERP_GRID:INTERP_GRID_2D_2',1,zhook_handle_omp)
236 !$OMP END PARALLEL
237 !
238 !-----------------------------------------------------------------------------
239 END SUBROUTINE interp_grid_2d
240 !
subroutine interp_grid_2d(PZ1, PT1, PZ2, PT2)
subroutine interp_grid_1d(PZ1, PT1, PZ2, PT2)
Definition: interp_grid.F90:35
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
logical lhook
Definition: yomhook.F90:15
static int count
Definition: memory_hook.c:21