source: NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/LBC/lbclnk.F90 @ 12603

Last change on this file since 12603 was 12603, checked in by orioltp, 8 months ago

Adding several interfaces to work with both single and double precision

  • Property svn:keywords set to Id
File size: 15.5 KB
Line 
1MODULE lbclnk
2   !!======================================================================
3   !!                       ***  MODULE  lbclnk  ***
4   !! NEMO        : lateral boundary conditions
5   !!=====================================================================
6   !! History :  OPA  ! 1997-06  (G. Madec)  Original code
7   !!   NEMO     1.0  ! 2002-09  (G. Madec)  F90: Free form and module
8   !!            3.2  ! 2009-03  (R. Benshila)  External north fold treatment 
9   !!            3.5  ! 2012     (S.Mocavero, I. Epicoco)  optimization of BDY comm. via lbc_bdy_lnk and lbc_obc_lnk
10   !!            3.4  ! 2012-12  (R. Bourdalle-Badie, G. Reffray)  add a C1D case 
11   !!            3.6  ! 2015-06  (O. Tintó and M. Castrillo)  add lbc_lnk_multi 
12   !!            4.0  ! 2017-03  (G. Madec) automatique allocation of array size (use with any 3rd dim size)
13   !!             -   ! 2017-04  (G. Madec) remove duplicated routines (lbc_lnk_2d_9, lbc_lnk_2d_multiple, lbc_lnk_3d_gather)
14   !!             -   ! 2017-05  (G. Madec) create generic.h90 files to generate all lbc and north fold routines
15   !!----------------------------------------------------------------------
16   !!           define the generic interfaces of lib_mpp routines
17   !!----------------------------------------------------------------------
18   !!   lbc_lnk       : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp
19   !!   lbc_bdy_lnk   : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp
20   !!----------------------------------------------------------------------
21   USE dom_oce        ! ocean space and time domain
22   USE lib_mpp        ! distributed memory computing library
23   USE lbcnfd         ! north fold
24   USE in_out_manager ! I/O manager
25
26   IMPLICIT NONE
27   PRIVATE
28
29   INTERFACE lbc_lnk
30      MODULE PROCEDURE   mpp_lnk_2d_sp   , mpp_lnk_3d_sp   , mpp_lnk_4d_sp
31      MODULE PROCEDURE   mpp_lnk_2d_dp   , mpp_lnk_3d_dp   , mpp_lnk_4d_dp
32   END INTERFACE
33   INTERFACE lbc_lnk_ptr
34      MODULE PROCEDURE   mpp_lnk_2d_ptr_sp , mpp_lnk_3d_ptr_sp , mpp_lnk_4d_ptr_sp
35      MODULE PROCEDURE   mpp_lnk_2d_ptr_dp , mpp_lnk_3d_ptr_dp , mpp_lnk_4d_ptr_dp
36   END INTERFACE
37   INTERFACE lbc_lnk_multi
38      MODULE PROCEDURE   lbc_lnk_2d_multi_sp , lbc_lnk_3d_multi_sp, lbc_lnk_4d_multi_sp
39      MODULE PROCEDURE   lbc_lnk_2d_multi_dp , lbc_lnk_3d_multi_dp, lbc_lnk_4d_multi_dp
40   END INTERFACE
41   !
42   INTERFACE lbc_lnk_icb
43      MODULE PROCEDURE mpp_lnk_2d_icb_dp, mpp_lnk_2d_icb_sp
44   END INTERFACE
45
46   INTERFACE mpp_nfd
47      MODULE PROCEDURE   mpp_nfd_2d_sp    , mpp_nfd_3d_sp    , mpp_nfd_4d_sp
48      MODULE PROCEDURE   mpp_nfd_2d_dp    , mpp_nfd_3d_dp    , mpp_nfd_4d_dp
49      MODULE PROCEDURE   mpp_nfd_2d_ptr_sp, mpp_nfd_3d_ptr_sp, mpp_nfd_4d_ptr_sp
50      MODULE PROCEDURE   mpp_nfd_2d_ptr_dp, mpp_nfd_3d_ptr_dp, mpp_nfd_4d_ptr_dp
51     
52   END INTERFACE
53
54   PUBLIC   lbc_lnk       ! ocean/ice lateral boundary conditions
55   PUBLIC   lbc_lnk_multi ! modified ocean/ice lateral boundary conditions
56   PUBLIC   lbc_lnk_icb   ! iceberg lateral boundary conditions
57
58#if   defined key_mpp_mpi
59!$AGRIF_DO_NOT_TREAT
60   INCLUDE 'mpif.h'
61!$AGRIF_END_DO_NOT_TREAT
62#endif
63
64   INTEGER, PUBLIC, PARAMETER ::   jpfillnothing = 1
65   INTEGER, PUBLIC, PARAMETER ::   jpfillcst     = 2
66   INTEGER, PUBLIC, PARAMETER ::   jpfillcopy    = 3
67   INTEGER, PUBLIC, PARAMETER ::   jpfillperio   = 4
68   INTEGER, PUBLIC, PARAMETER ::   jpfillmpi     = 5
69
70   !! * Substitutions
71#  include "do_loop_substitute.h90"
72   !!----------------------------------------------------------------------
73   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
74   !! $Id$
75   !! Software governed by the CeCILL license (see ./LICENSE)
76   !!----------------------------------------------------------------------
77CONTAINS
78
79   !!----------------------------------------------------------------------
80   !!                   ***   load_ptr_(2,3,4)d   ***
81   !!
82   !!   * Dummy Argument :
83   !!       in    ==>   ptab       ! array to be loaded (2D, 3D or 4D)
84   !!                   cd_nat     ! nature of pt2d array grid-points
85   !!                   psgn       ! sign used across the north fold boundary
86   !!       inout <=>   ptab_ptr   ! array of 2D, 3D or 4D pointers
87   !!                   cdna_ptr   ! nature of ptab array grid-points
88   !!                   psgn_ptr   ! sign used across the north fold boundary
89   !!                   kfld       ! number of elements that has been attributed
90   !!----------------------------------------------------------------------
91
92   !!----------------------------------------------------------------------
93   !!                  ***   lbc_lnk_(2,3,4)d_multi   ***
94   !!                     ***   load_ptr_(2,3,4)d   ***
95   !!
96   !!   * Argument : dummy argument use in lbc_lnk_multi_... routines
97   !!
98   !!----------------------------------------------------------------------
99
100   !!
101   !!   ----   SINGLE PRECISION VERSIONS
102   !!
103#  define SINGLE_PRECISION
104#  define DIM_2d
105#     define ROUTINE_LOAD           load_ptr_2d_sp
106#     define ROUTINE_MULTI          lbc_lnk_2d_multi_sp
107#     include "lbc_lnk_multi_generic.h90"
108#     undef ROUTINE_MULTI
109#     undef ROUTINE_LOAD
110#  undef DIM_2d
111
112#  define DIM_3d
113#     define ROUTINE_LOAD           load_ptr_3d_sp
114#     define ROUTINE_MULTI          lbc_lnk_3d_multi_sp
115#     include "lbc_lnk_multi_generic.h90"
116#     undef ROUTINE_MULTI
117#     undef ROUTINE_LOAD
118#  undef DIM_3d
119
120#  define DIM_4d
121#     define ROUTINE_LOAD           load_ptr_4d_sp
122#     define ROUTINE_MULTI          lbc_lnk_4d_multi_sp
123#     include "lbc_lnk_multi_generic.h90"
124#     undef ROUTINE_MULTI
125#     undef ROUTINE_LOAD
126#  undef DIM_4d
127#  undef SINGLE_PRECISION
128   !!
129   !!   ----   DOUBLE PRECISION VERSIONS
130   !!
131
132#  define DIM_2d
133#     define ROUTINE_LOAD           load_ptr_2d_dp
134#     define ROUTINE_MULTI          lbc_lnk_2d_multi_dp
135#     include "lbc_lnk_multi_generic.h90"
136#     undef ROUTINE_MULTI
137#     undef ROUTINE_LOAD
138#  undef DIM_2d
139
140#  define DIM_3d
141#     define ROUTINE_LOAD           load_ptr_3d_dp
142#     define ROUTINE_MULTI          lbc_lnk_3d_multi_dp
143#     include "lbc_lnk_multi_generic.h90"
144#     undef ROUTINE_MULTI
145#     undef ROUTINE_LOAD
146#  undef DIM_3d
147
148#  define DIM_4d
149#     define ROUTINE_LOAD           load_ptr_4d_dp
150#     define ROUTINE_MULTI          lbc_lnk_4d_multi_dp
151#     include "lbc_lnk_multi_generic.h90"
152#     undef ROUTINE_MULTI
153#     undef ROUTINE_LOAD
154#  undef DIM_4d
155
156   !!----------------------------------------------------------------------
157   !!                   ***  routine mpp_lnk_(2,3,4)d  ***
158   !!
159   !!   * Argument : dummy argument use in mpp_lnk_... routines
160   !!                ptab      :   array or pointer of arrays on which the boundary condition is applied
161   !!                cd_nat    :   nature of array grid-points
162   !!                psgn      :   sign used across the north fold boundary
163   !!                kfld      :   optional, number of pt3d arrays
164   !!                kfillmode :   optional, method to be use to fill the halos (see jpfill* variables)
165   !!                pfillval  :   optional, background value (used with jpfillcopy)
166   !!----------------------------------------------------------------------
167   !
168   !                       !==  2D array and array of 2D pointer  ==!
169   !
170   !!
171   !!   ----   SINGLE PRECISION VERSIONS
172   !!
173# define SINGLE_PRECISION
174#  define DIM_2d
175#     define ROUTINE_LNK           mpp_lnk_2d_sp
176#     include "mpp_lnk_generic.h90"
177#     undef ROUTINE_LNK
178#     define MULTI
179#     define ROUTINE_LNK           mpp_lnk_2d_ptr_sp
180#     include "mpp_lnk_generic.h90"
181#     undef ROUTINE_LNK
182#     undef MULTI
183#  undef DIM_2d
184   !
185   !                       !==  3D array and array of 3D pointer  ==!
186   !
187#  define DIM_3d
188#     define ROUTINE_LNK           mpp_lnk_3d_sp
189#     include "mpp_lnk_generic.h90"
190#     undef ROUTINE_LNK
191#     define MULTI
192#     define ROUTINE_LNK           mpp_lnk_3d_ptr_sp
193#     include "mpp_lnk_generic.h90"
194#     undef ROUTINE_LNK
195#     undef MULTI
196#  undef DIM_3d
197   !
198   !                       !==  4D array and array of 4D pointer  ==!
199   !
200#  define DIM_4d
201#     define ROUTINE_LNK           mpp_lnk_4d_sp
202#     include "mpp_lnk_generic.h90"
203#     undef ROUTINE_LNK
204#     define MULTI
205#     define ROUTINE_LNK           mpp_lnk_4d_ptr_sp
206#     include "mpp_lnk_generic.h90"
207#     undef ROUTINE_LNK
208#     undef MULTI
209#  undef DIM_4d
210# undef SINGLE_PRECISION
211
212   !!
213   !!   ----   DOUBLE PRECISION VERSIONS
214   !!
215#  define DIM_2d
216#     define ROUTINE_LNK           mpp_lnk_2d_dp
217#     include "mpp_lnk_generic.h90"
218#     undef ROUTINE_LNK
219#     define MULTI
220#     define ROUTINE_LNK           mpp_lnk_2d_ptr_dp
221#     include "mpp_lnk_generic.h90"
222#     undef ROUTINE_LNK
223#     undef MULTI
224#  undef DIM_2d
225   !
226   !                       !==  3D array and array of 3D pointer  ==!
227   !
228#  define DIM_3d
229#     define ROUTINE_LNK           mpp_lnk_3d_dp
230#     include "mpp_lnk_generic.h90"
231#     undef ROUTINE_LNK
232#     define MULTI
233#     define ROUTINE_LNK           mpp_lnk_3d_ptr_dp
234#     include "mpp_lnk_generic.h90"
235#     undef ROUTINE_LNK
236#     undef MULTI
237#  undef DIM_3d
238   !
239   !                       !==  4D array and array of 4D pointer  ==!
240   !
241#  define DIM_4d
242#     define ROUTINE_LNK           mpp_lnk_4d_dp
243#     include "mpp_lnk_generic.h90"
244#     undef ROUTINE_LNK
245#     define MULTI
246#     define ROUTINE_LNK           mpp_lnk_4d_ptr_dp
247#     include "mpp_lnk_generic.h90"
248#     undef ROUTINE_LNK
249#     undef MULTI
250#  undef DIM_4d
251
252
253   !!----------------------------------------------------------------------
254   !!                   ***  routine mpp_nfd_(2,3,4)d  ***
255   !!
256   !!   * Argument : dummy argument use in mpp_nfd_... routines
257   !!                ptab      :   array or pointer of arrays on which the boundary condition is applied
258   !!                cd_nat    :   nature of array grid-points
259   !!                psgn      :   sign used across the north fold boundary
260   !!                kfld      :   optional, number of pt3d arrays
261   !!                kfillmode :   optional, method to be use to fill the halos (see jpfill* variables)
262   !!                pfillval  :   optional, background value (used with jpfillcopy)
263   !!----------------------------------------------------------------------
264   !
265   !                       !==  2D array and array of 2D pointer  ==!
266   !
267   !!
268   !!   ----   SINGLE PRECISION VERSIONS
269   !!
270#  define SINGLE_PRECISION
271#  define DIM_2d
272#     define ROUTINE_NFD           mpp_nfd_2d_sp
273#     include "mpp_nfd_generic.h90"
274#     undef ROUTINE_NFD
275#     define MULTI
276#     define ROUTINE_NFD           mpp_nfd_2d_ptr_sp
277#     include "mpp_nfd_generic.h90"
278#     undef ROUTINE_NFD
279#     undef MULTI
280#  undef DIM_2d
281   !
282   !                       !==  3D array and array of 3D pointer  ==!
283   !
284#  define DIM_3d
285#     define ROUTINE_NFD           mpp_nfd_3d_sp
286#     include "mpp_nfd_generic.h90"
287#     undef ROUTINE_NFD
288#     define MULTI
289#     define ROUTINE_NFD           mpp_nfd_3d_ptr_sp
290#     include "mpp_nfd_generic.h90"
291#     undef ROUTINE_NFD
292#     undef MULTI
293#  undef DIM_3d
294   !
295   !                       !==  4D array and array of 4D pointer  ==!
296   !
297#  define DIM_4d
298#     define ROUTINE_NFD           mpp_nfd_4d_sp
299#     include "mpp_nfd_generic.h90"
300#     undef ROUTINE_NFD
301#     define MULTI
302#     define ROUTINE_NFD           mpp_nfd_4d_ptr_sp
303#     include "mpp_nfd_generic.h90"
304#     undef ROUTINE_NFD
305#     undef MULTI
306#  undef DIM_4d
307#  undef SINGLE_PRECISION
308
309   !!
310   !!   ----   DOUBLE PRECISION VERSIONS
311   !!
312#  define DIM_2d
313#     define ROUTINE_NFD           mpp_nfd_2d_dp
314#     include "mpp_nfd_generic.h90"
315#     undef ROUTINE_NFD
316#     define MULTI
317#     define ROUTINE_NFD           mpp_nfd_2d_ptr_dp
318#     include "mpp_nfd_generic.h90"
319#     undef ROUTINE_NFD
320#     undef MULTI
321#  undef DIM_2d
322   !
323   !                       !==  3D array and array of 3D pointer  ==!
324   !
325#  define DIM_3d
326#     define ROUTINE_NFD           mpp_nfd_3d_dp
327#     include "mpp_nfd_generic.h90"
328#     undef ROUTINE_NFD
329#     define MULTI
330#     define ROUTINE_NFD           mpp_nfd_3d_ptr_dp
331#     include "mpp_nfd_generic.h90"
332#     undef ROUTINE_NFD
333#     undef MULTI
334#  undef DIM_3d
335   !
336   !                       !==  4D array and array of 4D pointer  ==!
337   !
338#  define DIM_4d
339#     define ROUTINE_NFD           mpp_nfd_4d_dp
340#     include "mpp_nfd_generic.h90"
341#     undef ROUTINE_NFD
342#     define MULTI
343#     define ROUTINE_NFD           mpp_nfd_4d_ptr_dp
344#     include "mpp_nfd_generic.h90"
345#     undef ROUTINE_NFD
346#     undef MULTI
347#  undef DIM_4d
348
349   !!======================================================================
350
351
352   !!======================================================================
353     !!---------------------------------------------------------------------
354      !!                   ***  routine mpp_lbc_north_icb  ***
355      !!
356      !! ** Purpose :   Ensure proper north fold horizontal bondary condition
357      !!              in mpp configuration in case of jpn1 > 1 and for 2d
358      !!              array with outer extra halo
359      !!
360      !! ** Method  :   North fold condition and mpp with more than one proc
361      !!              in i-direction require a specific treatment. We gather
362      !!              the 4+kextj northern lines of the global domain on 1
363      !!              processor and apply lbc north-fold on this sub array.
364      !!              Then we scatter the north fold array back to the processors.
365      !!              This routine accounts for an extra halo with icebergs
366      !!              and assumes ghost rows and columns have been suppressed.
367      !!
368      !!----------------------------------------------------------------------
369#     define SINGLE_PRECISION
370#     define ROUTINE_LNK           mpp_lbc_north_icb_sp
371#     include "mpp_lbc_north_icb_generic.h90"
372#     undef ROUTINE_LNK
373#     undef SINGLE_PRECISION
374#     define ROUTINE_LNK           mpp_lbc_north_icb_dp
375#     include "mpp_lbc_north_icb_generic.h90"
376#     undef ROUTINE_LNK
377 
378
379      !!----------------------------------------------------------------------
380      !!                  ***  routine mpp_lnk_2d_icb  ***
381      !!
382      !! ** Purpose :   Message passing management for 2d array (with extra halo for icebergs)
383      !!                This routine receives a (1-kexti:jpi+kexti,1-kexti:jpj+kextj)
384      !!                array (usually (0:jpi+1, 0:jpj+1)) from lbc_lnk_icb calls.
385      !!
386      !! ** Method  :   Use mppsend and mpprecv function for passing mask
387      !!      between processors following neighboring subdomains.
388      !!            domain parameters
389      !!                    jpi    : first dimension of the local subdomain
390      !!                    jpj    : second dimension of the local subdomain
391      !!                    kexti  : number of columns for extra outer halo
392      !!                    kextj  : number of rows for extra outer halo
393      !!                    nbondi : mark for "east-west local boundary"
394      !!                    nbondj : mark for "north-south local boundary"
395      !!                    noea   : number for local neighboring processors
396      !!                    nowe   : number for local neighboring processors
397      !!                    noso   : number for local neighboring processors
398      !!                    nono   : number for local neighboring processors
399      !!----------------------------------------------------------------------
400
401#     define SINGLE_PRECISION
402#     define ROUTINE_LNK           mpp_lnk_2d_icb_sp
403#     include "mpp_lnk_icb_generic.h90"
404#     undef ROUTINE_LNK
405#     undef SINGLE_PRECISION
406#     define ROUTINE_LNK           mpp_lnk_2d_icb_dp
407#     include "mpp_lnk_icb_generic.h90"
408#     undef ROUTINE_LNK
409 
410END MODULE lbclnk
411
Note: See TracBrowser for help on using the repository browser.