New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
lbclnk.F90 in NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/LBC – NEMO

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

Last change on this file since 12623 was 12603, checked in by orioltp, 4 years ago

Adding several interfaces to work with both single and double precision

  • Property svn:keywords set to Id
File size: 15.5 KB
RevLine 
[3]1MODULE lbclnk
2   !!======================================================================
[232]3   !!                       ***  MODULE  lbclnk  ***
[9019]4   !! NEMO        : lateral boundary conditions
[3]5   !!=====================================================================
[6140]6   !! History :  OPA  ! 1997-06  (G. Madec)  Original code
7   !!   NEMO     1.0  ! 2002-09  (G. Madec)  F90: Free form and module
[2335]8   !!            3.2  ! 2009-03  (R. Benshila)  External north fold treatment 
[9019]9   !!            3.5  ! 2012     (S.Mocavero, I. Epicoco)  optimization of BDY comm. via lbc_bdy_lnk and lbc_obc_lnk
[6140]10   !!            3.4  ! 2012-12  (R. Bourdalle-Badie, G. Reffray)  add a C1D case 
[6490]11   !!            3.6  ! 2015-06  (O. Tintó and M. Castrillo)  add lbc_lnk_multi 
[9019]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
[1344]15   !!----------------------------------------------------------------------
[9019]16   !!           define the generic interfaces of lib_mpp routines
[15]17   !!----------------------------------------------------------------------
[9019]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   !!----------------------------------------------------------------------
[11536]21   USE dom_oce        ! ocean space and time domain
[6140]22   USE lib_mpp        ! distributed memory computing library
[9019]23   USE lbcnfd         ! north fold
[11536]24   USE in_out_manager ! I/O manager
[3]25
[11536]26   IMPLICIT NONE
27   PRIVATE
28
[3]29   INTERFACE lbc_lnk
[12603]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
[3]32   END INTERFACE
[9019]33   INTERFACE lbc_lnk_ptr
[12603]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
[6140]36   END INTERFACE
[9019]37   INTERFACE lbc_lnk_multi
[12603]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
[9019]40   END INTERFACE
[6493]41   !
[4990]42   INTERFACE lbc_lnk_icb
[12603]43      MODULE PROCEDURE mpp_lnk_2d_icb_dp, mpp_lnk_2d_icb_sp
[4990]44   END INTERFACE
45
[11536]46   INTERFACE mpp_nfd
[12603]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     
[11536]52   END INTERFACE
53
[9019]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
[2335]57
[11536]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
[12377]70   !! * Substitutions
71#  include "do_loop_substitute.h90"
[3]72   !!----------------------------------------------------------------------
[9598]73   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[2335]74   !! $Id$
[10068]75   !! Software governed by the CeCILL license (see ./LICENSE)
[2335]76   !!----------------------------------------------------------------------
[9019]77CONTAINS
78
[3]79   !!----------------------------------------------------------------------
[11536]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
[3]90   !!----------------------------------------------------------------------
[11536]91
[9019]92   !!----------------------------------------------------------------------
[11536]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   !!
[3]98   !!----------------------------------------------------------------------
99
[12603]100   !!
101   !!   ----   SINGLE PRECISION VERSIONS
102   !!
103#  define SINGLE_PRECISION
[11536]104#  define DIM_2d
[12603]105#     define ROUTINE_LOAD           load_ptr_2d_sp
106#     define ROUTINE_MULTI          lbc_lnk_2d_multi_sp
[11536]107#     include "lbc_lnk_multi_generic.h90"
108#     undef ROUTINE_MULTI
109#     undef ROUTINE_LOAD
110#  undef DIM_2d
[3]111
[11536]112#  define DIM_3d
[12603]113#     define ROUTINE_LOAD           load_ptr_3d_sp
114#     define ROUTINE_MULTI          lbc_lnk_3d_multi_sp
[11536]115#     include "lbc_lnk_multi_generic.h90"
116#     undef ROUTINE_MULTI
117#     undef ROUTINE_LOAD
118#  undef DIM_3d
[3]119
[11536]120#  define DIM_4d
[12603]121#     define ROUTINE_LOAD           load_ptr_4d_sp
122#     define ROUTINE_MULTI          lbc_lnk_4d_multi_sp
[11536]123#     include "lbc_lnk_multi_generic.h90"
124#     undef ROUTINE_MULTI
125#     undef ROUTINE_LOAD
126#  undef DIM_4d
[12603]127#  undef SINGLE_PRECISION
128   !!
129   !!   ----   DOUBLE PRECISION VERSIONS
130   !!
[3764]131
[12603]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
[9019]156   !!----------------------------------------------------------------------
[11536]157   !!                   ***  routine mpp_lnk_(2,3,4)d  ***
[9019]158   !!
[11536]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)
[9019]166   !!----------------------------------------------------------------------
167   !
168   !                       !==  2D array and array of 2D pointer  ==!
169   !
[12603]170   !!
171   !!   ----   SINGLE PRECISION VERSIONS
172   !!
173# define SINGLE_PRECISION
[9019]174#  define DIM_2d
[12603]175#     define ROUTINE_LNK           mpp_lnk_2d_sp
[11536]176#     include "mpp_lnk_generic.h90"
[9019]177#     undef ROUTINE_LNK
178#     define MULTI
[12603]179#     define ROUTINE_LNK           mpp_lnk_2d_ptr_sp
[11536]180#     include "mpp_lnk_generic.h90"
[9019]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
[12603]188#     define ROUTINE_LNK           mpp_lnk_3d_sp
[11536]189#     include "mpp_lnk_generic.h90"
[9019]190#     undef ROUTINE_LNK
191#     define MULTI
[12603]192#     define ROUTINE_LNK           mpp_lnk_3d_ptr_sp
[11536]193#     include "mpp_lnk_generic.h90"
[9019]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
[12603]201#     define ROUTINE_LNK           mpp_lnk_4d_sp
[11536]202#     include "mpp_lnk_generic.h90"
[9019]203#     undef ROUTINE_LNK
204#     define MULTI
[12603]205#     define ROUTINE_LNK           mpp_lnk_4d_ptr_sp
[11536]206#     include "mpp_lnk_generic.h90"
[9019]207#     undef ROUTINE_LNK
208#     undef MULTI
209#  undef DIM_4d
[12603]210# undef SINGLE_PRECISION
[473]211
[12603]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
[9019]253   !!----------------------------------------------------------------------
[11536]254   !!                   ***  routine mpp_nfd_(2,3,4)d  ***
[9019]255   !!
[11536]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)
[9019]263   !!----------------------------------------------------------------------
[11536]264   !
265   !                       !==  2D array and array of 2D pointer  ==!
266   !
[12603]267   !!
268   !!   ----   SINGLE PRECISION VERSIONS
269   !!
270#  define SINGLE_PRECISION
[11536]271#  define DIM_2d
[12603]272#     define ROUTINE_NFD           mpp_nfd_2d_sp
[11536]273#     include "mpp_nfd_generic.h90"
274#     undef ROUTINE_NFD
275#     define MULTI
[12603]276#     define ROUTINE_NFD           mpp_nfd_2d_ptr_sp
[11536]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
[12603]285#     define ROUTINE_NFD           mpp_nfd_3d_sp
[11536]286#     include "mpp_nfd_generic.h90"
287#     undef ROUTINE_NFD
288#     define MULTI
[12603]289#     define ROUTINE_NFD           mpp_nfd_3d_ptr_sp
[11536]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
[12603]298#     define ROUTINE_NFD           mpp_nfd_4d_sp
[11536]299#     include "mpp_nfd_generic.h90"
300#     undef ROUTINE_NFD
301#     define MULTI
[12603]302#     define ROUTINE_NFD           mpp_nfd_4d_ptr_sp
[11536]303#     include "mpp_nfd_generic.h90"
304#     undef ROUTINE_NFD
305#     undef MULTI
306#  undef DIM_4d
[12603]307#  undef SINGLE_PRECISION
[10233]308
[12603]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
[4153]348
[11536]349   !!======================================================================
[6140]350
[4153]351
[12603]352   !!======================================================================
353     !!---------------------------------------------------------------------
[11536]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      !!
[3609]368      !!----------------------------------------------------------------------
[12603]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 
[3609]378
[11536]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      !!----------------------------------------------------------------------
[9019]400
[12603]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 
[3]410END MODULE lbclnk
[6490]411
Note: See TracBrowser for help on using the repository browser.