6b6949264f90e4a133bf89e2878a0ec4ebfcaf2c
[MNH-git_open_source-lfs.git] / src / MNH / mode_extrapol.f90
1 !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
3 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
4 !MNH_LIC for details. version 1.
5 MODULE MODE_EXTRAPOL
6
7   INTERFACE EXTRAPOL
8
9      MODULE PROCEDURE EXTRAPOL3D,EXTRAPOL3DN,EXTRAPOL2D,EXTRAPOL2DN
10
11   END INTERFACE
12   
13   INTERFACE EXTRAPOL_ON_PSEUDO_HALO
14
15      MODULE PROCEDURE EXTRAPOL_ON_PSEUDO_HALO3D,EXTRAPOL_ON_PSEUDO_HALO2D
16
17   END INTERFACE
18
19 CONTAINS
20
21   SUBROUTINE EXTRAPOL3D(HBORD,PTAB)
22     USE MODD_LBC_n
23     USE MODE_ll
24     !
25     IMPLICIT NONE
26     !
27     !*       0.1   Declarations of arguments
28     !
29     CHARACTER              :: HBORD
30     REAL, DIMENSION(:,:,:) :: PTAB
31
32     !
33     !*       0.2   Declarations of local variables
34     !
35     INTEGER          :: IIB,IJB,IKB    ! Begining useful area  in x,y,z directions
36     INTEGER          :: IIE,IJE,IKE    ! End useful area in x,y,z directions
37     !
38     !-------------------------------------------------------------------------------
39     !
40     !*       1.     EXTRAPOLE LATERAL BOUNDARY CONDITIONS :
41     !               ---------------------------------------
42     !
43     !RETURN
44     CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
45
46     SELECT  CASE (HBORD)
47     CASE ('W')
48        IF (LWEST_ll() .AND. CLBCX(1)/='CYCL')  &
49             PTAB(IIB-1,:,:) = 2. * PTAB(IIB,:,:) - PTAB(IIB+1,:,:)
50     CASE ('E')
51        IF (LEAST_ll() .AND. CLBCX(1)/='CYCL')   &
52             PTAB(IIE+1,:,:) = 2. * PTAB(IIE,:,:) - PTAB(IIE-1,:,:)
53     CASE ('S')
54        IF (LSOUTH_ll() .AND. CLBCY(1)/='CYCL') &
55             PTAB(:,IJB-1,:) = 2. * PTAB(:,IJB,:) - PTAB(:,IJB+1,:)
56     CASE ('N')
57        IF (LNORTH_ll() .AND. CLBCY(1)/='CYCL') &
58             PTAB(:,IJE+1,:) = 2. * PTAB(:,IJE,:) - PTAB(:,IJE-1,:)
59     CASE   DEFAULT
60     END SELECT
61
62   END SUBROUTINE EXTRAPOL3D
63
64   SUBROUTINE EXTRAPOL3DN(HBORD,P1,P2,P3,P4,P5,P6 )
65     IMPLICIT NONE
66     CHARACTER              :: HBORD
67     REAL, DIMENSION(:,:,:)            :: P1,P2
68     REAL, DIMENSION(:,:,:) , OPTIONAL :: P3,P4,P5,P6
69
70     CALL EXTRAPOL(HBORD,P1)
71     CALL EXTRAPOL(HBORD,P2)
72     IF (PRESENT(P3)) CALL EXTRAPOL(HBORD,P3)
73     IF (PRESENT(P4)) CALL EXTRAPOL(HBORD,P4)
74     IF (PRESENT(P5)) CALL EXTRAPOL(HBORD,P5)
75     IF (PRESENT(P6)) CALL EXTRAPOL(HBORD,P6)
76
77   END SUBROUTINE EXTRAPOL3DN
78
79   SUBROUTINE EXTRAPOL2D(HBORD,PTAB)
80     USE MODD_LBC_n
81     USE MODE_ll
82     !
83     IMPLICIT NONE
84     !
85     !*       0.1   Declarations of arguments
86     !
87     CHARACTER              :: HBORD
88     REAL, DIMENSION(:,:) :: PTAB
89
90     !
91     !*       0.2   Declarations of local variables
92     !
93     INTEGER          :: IIB,IJB    ! Begining useful area  in x,y,z directions
94     INTEGER          :: IIE,IJE    ! End useful area in x,y,z directions
95     !
96     !-------------------------------------------------------------------------------
97     !
98     !*       1.     EXTRAPOLE LATERAL BOUNDARY CONDITIONS :
99     !               ---------------------------------------
100     !
101     !RETURN
102     CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
103
104     SELECT  CASE (HBORD)
105     CASE ('W')
106        IF (LWEST_ll() .AND. CLBCX(1)/='CYCL')  &
107             PTAB(IIB-1,:) = 2. * PTAB(IIB,:) - PTAB(IIB+1,:)
108     CASE ('E')
109        IF (LEAST_ll() .AND. CLBCX(1)/='CYCL')   &
110             PTAB(IIE+1,:) = 2. * PTAB(IIE,:) - PTAB(IIE-1,:)
111     CASE ('S')
112        IF (LSOUTH_ll() .AND. CLBCY(1)/='CYCL') &
113             PTAB(:,IJB-1) = 2. * PTAB(:,IJB) - PTAB(:,IJB+1)
114     CASE ('N')
115        IF (LNORTH_ll() .AND. CLBCY(1)/='CYCL') &
116             PTAB(:,IJE+1) = 2. * PTAB(:,IJE) - PTAB(:,IJE-1)
117     CASE   DEFAULT
118     END SELECT
119
120   END SUBROUTINE EXTRAPOL2D
121
122   SUBROUTINE EXTRAPOL2DN(HBORD,P1,P2,P3,P4,P5,P6 )
123     IMPLICIT NONE
124     CHARACTER              :: HBORD
125     REAL, DIMENSION(:,:)            :: P1,P2
126     REAL, DIMENSION(:,:) , OPTIONAL :: P3,P4,P5,P6
127
128     CALL EXTRAPOL(HBORD,P1)
129     CALL EXTRAPOL(HBORD,P2)
130     IF (PRESENT(P3)) CALL EXTRAPOL(HBORD,P3)
131     IF (PRESENT(P4)) CALL EXTRAPOL(HBORD,P4)
132     IF (PRESENT(P5)) CALL EXTRAPOL(HBORD,P5)
133     IF (PRESENT(P6)) CALL EXTRAPOL(HBORD,P6)
134
135   END SUBROUTINE EXTRAPOL2DN
136
137 !     #######################################################################
138   SUBROUTINE EXTRAPOL_ON_PSEUDO_HALO3D(PTAB,OCYCLIC_EXTRAPOL)
139 !     #######################################################################
140 !
141 !!****  *EXTRAPOL_ON_PSEUDO_HALO3D * - when using LS_FORCING_ll with a 
142 !!                child domain defined on the whole father domain (possibly minus 1 point)
143 !!                we need to extrapolate the field on the child model before doing the interpolation
144 !!                from the father grid to the child grid
145 !!
146 !!    AUTHOR
147 !!    ------
148 !!
149 !!       M.Moge     * LA - CNRS *
150 !!
151 !!    MODIFICATIONS
152 !!    -------------
153 !!
154 !!      Original    18/02/2015
155 !-------------------------------------------------------------------------------
156     USE MODD_LBC_n
157     USE MODE_MODELN_HANDLER
158     USE MODE_ll
159     USE MODD_PARAMETERS, ONLY : JPHEXT
160     USE MODE_EXCHANGE_ll, ONLY : UPDATE_HALO_EXTENDED_ll
161     !
162     IMPLICIT NONE
163     !
164     !*       0.1   Declarations of arguments
165     !
166     REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTAB
167     LOGICAL, OPTIONAL, INTENT(IN) :: OCYCLIC_EXTRAPOL   !if true, we consider the cyclic case if necessary, if false, we do the extrapolation even in the cyclic case
168
169     !
170     !*       0.2   Declarations of local variables
171     !
172     INTEGER          :: IIB,IJB,IKB     ! Begining useful area  in x,y,z directions
173     INTEGER          :: IIE,IJE,IKE     ! End useful area in x,y,z directions
174     INTEGER          :: IDIMX_C,IDIMY_C ! size of the child domain (in the father grid)
175     INTEGER          :: IINFO_ll
176     INTEGER          :: II
177     TYPE(LIST_ll), POINTER :: TZZSFIELD_ll   ! list of fields to exchange
178     LOGICAL :: GCYCLIC_EXTRAPOL
179     !
180     !-------------------------------------------------------------------------------
181     !
182     !*       1.     EXTRAPOLATE LATERAL BOUNDARY CONDITIONS :
183     !               ---------------------------------------
184     !
185     IF ( PRESENT(OCYCLIC_EXTRAPOL) ) THEN
186       GCYCLIC_EXTRAPOL = OCYCLIC_EXTRAPOL
187     ELSE
188       GCYCLIC_EXTRAPOL = .TRUE.
189     ENDIF
190     !
191     CALL GOTO_MODEL(1)
192     CALL GO_TOMODEL_ll(1, IINFO_ll)
193     CALL GET_CHILD_DIM_ll(2, IDIMX_C, IDIMY_C, IINFO_ll)
194     CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
195     CALL GO_TOMODEL_ll(2, IINFO_ll)
196     CALL GOTO_MODEL(2)
197     ! if the child domain has the same size as the father domain in X or Y
198     ! AND the boundary conditions are CYCLIC in the corresponding direction
199     ! we perform an UPDATE_HALO_ll instead of an extrapolation
200     IF ( GCYCLIC_EXTRAPOL .AND. ( ((IDIMX_C > IIE - IIB + 1 + 2*JPHEXT) .AND. CLBCX(1)=='CYCL' )&
201             .OR. ((IDIMY_C > IJE - IJB + 1 + 2*JPHEXT) .AND. CLBCY(1)=='CYCL') ) ) THEN
202       CALL GOTO_MODEL(1)
203       CALL GO_TOMODEL_ll(1, IINFO_ll)
204       DO II=1,SIZE(PTAB,3)
205         NULLIFY(TZZSFIELD_ll)
206         CALL ADD2DFIELD_ll(TZZSFIELD_ll, PTAB(:,:,II))
207         CALL UPDATE_HALO_EXTENDED_ll(TZZSFIELD_ll,IINFO_ll)
208         CALL CLEANLIST_ll(TZZSFIELD_ll)
209       ENDDO
210       CALL GO_TOMODEL_ll(2, IINFO_ll)
211       CALL GOTO_MODEL(2)
212     ENDIF
213 !
214 !we take into account the case of a child domain of the size of the father domain minus 1
215     IF ( IDIMX_C > IIE - IIB + 1 + 2*JPHEXT ) THEN
216       IF ( IDIMX_C == IIE - IIB + 3 + 2*JPHEXT ) THEN !the child domain has the same size as the father domain
217         IF ( LWEST_ll() .AND. (CLBCX(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
218           PTAB(1,:,:) = 2. * PTAB(2,:,:) - PTAB(3,:,:)
219         ENDIF
220         IF ( LEAST_ll() .AND. (CLBCX(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
221           PTAB(IDIMX_C,:,:) = 2. * PTAB(IDIMX_C-1,:,:) - PTAB(IDIMX_C-2,:,:)
222         ENDIF
223       ELSEIF ( IDIMX_C == IIE - IIB + 2 + 2*JPHEXT ) THEN !the child domain has the size of the father domain minus one
224         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO3D, case not supported : &
225                 the child grid has to be one point larger or one point smaller in X dim"
226         CALL ABORT
227 !        IF ( IIB>1 .AND. LWEST_ll() .AND. CLBCX(1)/='CYCL' )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
228 !          PTAB(1,:,:) = 2. * PTAB(2,:,:) - PTAB(3,:,:)
229 !        ELSEIF ( IIB>1 .AND. LWEST_ll() .AND. CLBCX(1)=='CYCL' ) THEN
230 !          PTAB(1,:,:) = PTAB(IDIMX_C-1,:,:)
231 !        ENDIF
232 !        IF ( IIB==1 .AND. LEAST_ll() .AND. CLBCX(1)/='CYCL' )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
233 !          PTAB(IDIMX_C,:,:) = 2. * PTAB(IDIMX_C-1,:,:) - PTAB(IDIMX_C-2,:,:)
234 !        ELSEIF ( IIB==1 .AND. LEAST_ll() .AND. CLBCX(1)=='CYCL' ) THEN
235 !          PTAB(IDIMX_C,:,:) = PTAB(2,:,:)
236 !        ENDIF
237       ELSE !Error, this should not happen
238         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO3D, IDIMX_C = ",  &
239                 IDIMX_C, ", IIE - IIB + 1 + 2*JPHEXT = ", IIE - IIB + 1 + 2*JPHEXT
240         CALL ABORT
241       ENDIF
242     ENDIF
243     IF ( IDIMY_C > IJE - IJB + 1 + 2*JPHEXT ) THEN
244       IF ( IDIMY_C == IJE - IJB + 3 + 2*JPHEXT ) THEN !the child domain has the same size as the father domain
245         IF ( LNORTH_ll() .AND. (CLBCY(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
246           PTAB(:,1,:) = 2. * PTAB(:,2,:) - PTAB(:,3,:)
247         ENDIF
248         IF ( LSOUTH_ll() .AND. (CLBCY(1)/='CYCL' ) .OR. .NOT. GCYCLIC_EXTRAPOL)  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
249           PTAB(:,IDIMY_C,:) = 2. * PTAB(:,IDIMY_C-1,:) - PTAB(:,IDIMY_C-2,:)
250         ENDIF
251       ELSEIF ( IDIMY_C == IJE - IJB + 2 + 2*JPHEXT ) THEN !the child domain has the size of the father domain minus one
252         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO3D, case not supported :  &
253         the child grid has to be one point larger or one point smaller in Y dim"
254         CALL ABORT
255 !        IF ( IJB>1 .AND. LNORTH_ll() .AND. CLBCY(1)/='CYCL' )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
256 !          PTAB(:,1,:) = 2. * PTAB(:,2,:) - PTAB(:,3,:)
257 !        ELSEIF ( IJB>1 .AND. LNORTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
258 !          PTAB(:,1,:) = PTAB(:,IDIMY_C-1,:)
259 !        ENDIF
260 !        IF ( IJB==1 .AND. LSOUTH_ll() .AND. CLBCY(1)/='CYCL' )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
261 !          PTAB(:,IDIMY_C,:) = 2. * PTAB(:,IDIMY_C-1,:) - PTAB(:,IDIMY_C-2,:)
262 !        ELSEIF ( IJB==1 .AND. LSOUTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
263 !          PTAB(:,IDIMY_C,:) = PTAB(:,2,:)
264 !        ENDIF
265       ELSE !Error, this should not happen
266         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO3D, IDIMY_C = ",  &
267                 IDIMY_C, ", IIE - IIB + 1 + 2*JPHEXT = ", IIE - IIB + 1 + 2*JPHEXT
268         CALL ABORT
269       ENDIF
270     ENDIF
271 !
272   END SUBROUTINE EXTRAPOL_ON_PSEUDO_HALO3D
273   
274 !     #######################################################################
275   SUBROUTINE EXTRAPOL_ON_PSEUDO_HALO2D(PTAB,OCYCLIC_EXTRAPOL)
276 !     #######################################################################
277 !
278 !!****  *EXTRAPOL_ON_PSEUDO_HALO2D * - when using LS_FORCING_ll with a 
279 !!                child domain defined on the whole father domain (possibly minus 1 point)
280 !!                we need to extrapolate the field on the child model before doing the interpolation
281 !!                from the father grid to the child grid
282 !!
283 !!    AUTHOR
284 !!    ------
285 !!
286 !!       M.Moge     * LA - CNRS *
287 !!
288 !!    MODIFICATIONS
289 !!    -------------
290 !!
291 !!      Original    18/02/2015
292 !-------------------------------------------------------------------------------
293     USE MODD_LBC_n
294     USE MODE_MODELN_HANDLER
295     USE MODE_ll
296     USE MODD_PARAMETERS, ONLY : JPHEXT
297     USE MODE_EXCHANGE_ll, ONLY : UPDATE_HALO_EXTENDED_ll
298     !
299     IMPLICIT NONE
300     !
301     !*       0.1   Declarations of arguments
302     !
303     REAL, DIMENSION(:,:), INTENT(INOUT) :: PTAB
304     LOGICAL, OPTIONAL, INTENT(IN) :: OCYCLIC_EXTRAPOL   !if true, we consider the cyclic case if necessary, if false, we do the extrapolation even in the cyclic case
305
306     !
307     !*       0.2   Declarations of local variables
308     !
309     INTEGER          :: IIB,IJB,IKB     ! Begining useful area  in x,y,z directions
310     INTEGER          :: IIE,IJE,IKE     ! End useful area in x,y,z directions
311     INTEGER          :: IDIMX_C,IDIMY_C ! size of the child domain (in the father grid)
312     INTEGER          :: IINFO_ll
313     TYPE(LIST_ll), POINTER :: TZZSFIELD_ll   ! list of fields to exchange
314     LOGICAL :: GCYCLIC_EXTRAPOL
315     !
316     !-------------------------------------------------------------------------------
317     !
318     !*       1.     EXTRAPOLATE LATERAL BOUNDARY CONDITIONS :
319     !               ---------------------------------------
320     !
321     IF ( PRESENT(OCYCLIC_EXTRAPOL) ) THEN
322       GCYCLIC_EXTRAPOL = OCYCLIC_EXTRAPOL
323     ELSE
324       GCYCLIC_EXTRAPOL = .TRUE.
325     ENDIF
326     !
327     CALL GOTO_MODEL(1)
328     CALL GO_TOMODEL_ll(1, IINFO_ll)
329     CALL GET_CHILD_DIM_ll(2, IDIMX_C, IDIMY_C, IINFO_ll)
330     CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
331     CALL GO_TOMODEL_ll(2, IINFO_ll)
332     CALL GOTO_MODEL(2)
333     ! if the child domain has the same size as the father domain in X or Y
334     ! AND the boundary conditions are CYCLIC in the corresponding direction
335     ! we perform an UPDATE_HALO_ll instead of an extrapolation
336     IF ( GCYCLIC_EXTRAPOL .AND. ( ((IDIMX_C > IIE - IIB + 1 + 2*JPHEXT) .AND. CLBCX(1)=='CYCL' )&
337             .OR. ((IDIMY_C > IJE - IJB + 1 + 2*JPHEXT) .AND. CLBCY(1)=='CYCL') ) ) THEN
338       CALL GOTO_MODEL(1)
339       CALL GO_TOMODEL_ll(1, IINFO_ll)
340       NULLIFY(TZZSFIELD_ll)
341       CALL ADD2DFIELD_ll(TZZSFIELD_ll, PTAB)
342       CALL UPDATE_HALO_EXTENDED_ll(TZZSFIELD_ll,IINFO_ll)
343       CALL CLEANLIST_ll(TZZSFIELD_ll)
344       CALL GO_TOMODEL_ll(2, IINFO_ll)
345       CALL GOTO_MODEL(2)
346     ENDIF
347 !    
348 !we take into account the case of a child domain of the size of the father domain minus 1
349     IF ( IDIMX_C > IIE - IIB + 1 + 2*JPHEXT ) THEN
350       IF ( IDIMX_C == IIE - IIB + 3 + 2*JPHEXT ) THEN !the child domain has the same size as the father domain
351         IF ( LWEST_ll() .AND. (CLBCX(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
352           PTAB(1,:) = 2. * PTAB(2,:) - PTAB(3,:)
353         ENDIF
354         IF ( LEAST_ll() .AND. (CLBCX(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
355           PTAB(IDIMX_C,:) = 2. * PTAB(IDIMX_C-1,:) - PTAB(IDIMX_C-2,:)
356         ENDIF
357       ELSEIF ( IDIMX_C == IIE - IIB + 2 + 2*JPHEXT ) THEN !the child domain has the size of the father domain minus one
358         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO2D, case not supported :  &
359                 the child grid has to be one point larger or one point smaller in X dim"
360         CALL ABORT
361 !        IF ( IIB>1 .AND. LWEST_ll() .AND. CLBCX(1)/='CYCL' )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
362 !          PTAB(1,:) = 2. * PTAB(2,:) - PTAB(3,:)
363 !        ELSEIF ( IIB>1 .AND. LWEST_ll() .AND. CLBCX(1)=='CYCL' ) THEN
364 !          PTAB(1,:) = PTAB(IDIMX_C-1,:)
365 !        ENDIF
366 !        IF ( IIB==1 .AND. LEAST_ll() .AND. CLBCX(1)/='CYCL' )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
367 !          PTAB(IDIMX_C,:) = 2. * PTAB(IDIMX_C-1,:) - PTAB(IDIMX_C-2,:)
368 !        ELSEIF ( IIB==1 .AND. LEAST_ll() .AND. CLBCX(1)=='CYCL' ) THEN
369 !          PTAB(IDIMX_C,:) = PTAB(2,:)
370 !        ENDIF
371       ELSE !Error, this should not happen
372         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO2D, IDIMX_C = ", IDIMX_C, &
373                 ", IIE - IIB + 1 + 2*JPHEXT = ", IIE - IIB + 1 + 2*JPHEXT
374         CALL ABORT
375       ENDIF
376     ENDIF
377     IF ( IDIMY_C > IJE - IJB + 1 + 2*JPHEXT ) THEN
378       IF ( IDIMY_C == IJE - IJB + 3 + 2*JPHEXT ) THEN !the child domain has the same size as the father domain
379         IF ( LNORTH_ll() .AND. (CLBCY(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
380           PTAB(:,1) = 2. * PTAB(:,2) - PTAB(:,3)
381 !        ELSEIF ( LNORTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
382 !          PTAB(:,1) = PTAB(:,IDIMY_C-1)
383         ENDIF
384         IF ( LSOUTH_ll() .AND. (CLBCY(1)/='CYCL' .OR. .NOT. GCYCLIC_EXTRAPOL) )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
385           PTAB(:,IDIMY_C) = 2. * PTAB(:,IDIMY_C-1) - PTAB(:,IDIMY_C-2)
386 !        ELSEIF ( LSOUTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
387 !          PTAB(:,IDIMY_C) = PTAB(:,2)
388         ENDIF
389       ELSEIF ( IDIMY_C == IJE - IJB + 2 + 2*JPHEXT ) THEN !the child domain has the size of the father domain minus one
390         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO2D, case not supported : &
391                 the child grid has to be one point larger or one point smaller in Y dim"
392         CALL ABORT
393 !        IF ( IJB>1 .AND. LNORTH_ll() .AND. CLBCY(1)/='CYCL' )  THEN !du cote ouest, on a un point dans le 'pseudo halo' a extrapoler
394 !          PTAB(:,1) = 2. * PTAB(:,2) - PTAB(:,3)
395 !        ELSEIF ( IJB>1 .AND. LNORTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
396 !          PTAB(:,1) = PTAB(:,IDIMY_C-1)
397 !        ENDIF
398 !        IF ( IJB==1 .AND. LSOUTH_ll() .AND. CLBCY(1)/='CYCL' )  THEN !du cote est, on a un point dans le 'pseudo halo' a extrapoler
399 !          PTAB(:,IDIMY_C) = 2. * PTAB(:,IDIMY_C-1) - PTAB(:,IDIMY_C-2)
400 !        ELSEIF ( IJB==1 .AND. LSOUTH_ll() .AND. CLBCY(1)=='CYCL' ) THEN
401 !          PTAB(:,IDIMY_C) = PTAB(:,2)
402 !        ENDIF
403       ELSE !Error, this should not happen
404         WRITE(*,*) "ERROR in EXTRAPOL_ON_PSEUDO_HALO2D, IDIMY_C = ", IDIMY_C, &
405                 ", IIE - IIB + 1 + 2*JPHEXT = ", IIE - IIB + 1 + 2*JPHEXT
406         CALL ABORT
407       ENDIF
408     ENDIF
409 !
410   END SUBROUTINE EXTRAPOL_ON_PSEUDO_HALO2D
411
412 END MODULE MODE_EXTRAPOL