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/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/LBC – NEMO

source: NEMO/branches/2019/dev_r10984_HPC-13_IRRMANN_BDY_optimization/src/OCE/LBC/lbclnk.F90 @ 11067

Last change on this file since 11067 was 11067, checked in by girrmann, 5 years ago

dev_r10984_HPC-13 : new implementation of lbc_bdy_lnk in prevision of step 2, regroup communications, see #2285

  • Property svn:keywords set to Id
File size: 14.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#if defined key_mpp_mpi
17   !!----------------------------------------------------------------------
18   !!   'key_mpp_mpi'             MPI massively parallel processing library
19   !!----------------------------------------------------------------------
20   !!           define the generic interfaces of lib_mpp routines
21   !!----------------------------------------------------------------------
22   !!   lbc_lnk       : generic interface for mpp_lnk_3d and mpp_lnk_2d routines defined in lib_mpp
23   !!   lbc_bdy_lnk   : generic interface for mpp_lnk_bdy_2d and mpp_lnk_bdy_3d routines defined in lib_mpp
24   !!----------------------------------------------------------------------
25   USE par_oce        ! ocean dynamics and tracers   
26   USE lib_mpp        ! distributed memory computing library
27   USE lbcnfd         ! north fold
28
29   INTERFACE lbc_lnk
30      MODULE PROCEDURE   mpp_lnk_2d      , mpp_lnk_3d      , mpp_lnk_4d
31   END INTERFACE
32   INTERFACE lbc_lnk_ptr
33      MODULE PROCEDURE   mpp_lnk_2d_ptr  , mpp_lnk_3d_ptr  , mpp_lnk_4d_ptr
34   END INTERFACE
35   INTERFACE lbc_lnk_multi
36      MODULE PROCEDURE   lbc_lnk_2d_multi, lbc_lnk_3d_multi, lbc_lnk_4d_multi
37   END INTERFACE
38   !
39   INTERFACE lbc_bdy_lnk
40      MODULE PROCEDURE   mpp_lnk_bdy_2d      , mpp_lnk_bdy_3d      , mpp_lnk_bdy_4d
41   END INTERFACE
42   INTERFACE lbc_bdy_lnk_ptr
43      MODULE PROCEDURE   mpp_lnk_bdy_2d_ptr  , mpp_lnk_bdy_3d_ptr  , mpp_lnk_bdy_4d_ptr
44   END INTERFACE
45   INTERFACE lbc_bdy_lnk_multi
46      MODULE PROCEDURE   lbc_lnk_bdy_2d_multi, lbc_lnk_bdy_3d_multi, lbc_lnk_bdy_4d_multi
47   END INTERFACE
48   !
49   INTERFACE lbc_lnk_icb
50      MODULE PROCEDURE mpp_lnk_2d_icb
51   END INTERFACE
52
53   PUBLIC   lbc_lnk           ! ocean/ice lateral boundary conditions
54   PUBLIC   lbc_lnk_multi     ! modified ocean/ice lateral boundary conditions
55   PUBLIC   lbc_bdy_lnk       ! ocean lateral BDY boundary conditions
56   PUBLIC   lbc_bdy_lnk_multi ! modified ocean lateral BDY boundary conditions
57   PUBLIC   lbc_lnk_icb       ! iceberg lateral boundary conditions
58
59   !!----------------------------------------------------------------------
60   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
61   !! $Id$
62   !! Software governed by the CeCILL license (see ./LICENSE)
63   !!----------------------------------------------------------------------
64CONTAINS
65
66#else
67   !!----------------------------------------------------------------------
68   !!   Default option                              shared memory computing
69   !!----------------------------------------------------------------------
70   !!                routines setting the appropriate values
71   !!         on first and last row and column of the global domain
72   !!----------------------------------------------------------------------
73   !!   lbc_lnk_sum_3d: compute sum over the halos on a 3D variable on ocean mesh
74   !!   lbc_lnk_sum_3d: compute sum over the halos on a 2D variable on ocean mesh
75   !!   lbc_lnk       : generic interface for lbc_lnk_3d and lbc_lnk_2d
76   !!   lbc_lnk_3d    : set the lateral boundary condition on a 3D variable on ocean mesh
77   !!   lbc_lnk_2d    : set the lateral boundary condition on a 2D variable on ocean mesh
78   !!   lbc_bdy_lnk   : set the lateral BDY boundary condition
79   !!----------------------------------------------------------------------
80   USE oce            ! ocean dynamics and tracers   
81   USE dom_oce        ! ocean space and time domain
82   USE in_out_manager ! I/O manager
83   USE lbcnfd         ! north fold
84
85   IMPLICIT NONE
86   PRIVATE
87
88   INTERFACE lbc_lnk
89      MODULE PROCEDURE   lbc_lnk_2d      , lbc_lnk_3d      , lbc_lnk_4d
90   END INTERFACE
91   INTERFACE lbc_lnk_ptr
92      MODULE PROCEDURE   lbc_lnk_2d_ptr  , lbc_lnk_3d_ptr  , lbc_lnk_4d_ptr
93   END INTERFACE
94   INTERFACE lbc_lnk_multi
95      MODULE PROCEDURE   lbc_lnk_2d_multi, lbc_lnk_3d_multi, lbc_lnk_4d_multi
96   END INTERFACE
97   !
98   INTERFACE lbc_bdy_lnk
99      MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d, lbc_bdy_lnk_4d
100   END INTERFACE
101   !
102   INTERFACE lbc_lnk_icb
103      MODULE PROCEDURE lbc_lnk_2d_icb
104   END INTERFACE
105   
106   PUBLIC   lbc_lnk       ! ocean/ice  lateral boundary conditions
107   PUBLIC   lbc_lnk_multi ! modified ocean/ice lateral boundary conditions
108   PUBLIC   lbc_bdy_lnk   ! ocean lateral BDY boundary conditions
109   PUBLIC   lbc_lnk_icb   ! iceberg lateral boundary conditions
110   
111   !!----------------------------------------------------------------------
112   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
113   !! $Id$
114   !! Software governed by the CeCILL license (see ./LICENSE)
115   !!----------------------------------------------------------------------
116CONTAINS
117
118   !!======================================================================
119   !!   Default option                           3D shared memory computing
120   !!======================================================================
121   !!          routines setting land point, or east-west cyclic,
122   !!             or north-south cyclic, or north fold values
123   !!         on first and last row and column of the global domain
124   !!----------------------------------------------------------------------
125
126   !!----------------------------------------------------------------------
127   !!                   ***  routine lbc_lnk_(2,3,4)d  ***
128   !!
129   !!   * Argument : dummy argument use in lbc_lnk_... routines
130   !!                ptab   :   array or pointer of arrays on which the boundary condition is applied
131   !!                cd_nat :   nature of array grid-points
132   !!                psgn   :   sign used across the north fold boundary
133   !!                kfld   :   optional, number of pt3d arrays
134   !!                cd_mpp :   optional, fill the overlap area only
135   !!                pval   :   optional, background value (used at closed boundaries)
136   !!----------------------------------------------------------------------
137   !
138   !                       !==  2D array and array of 2D pointer  ==!
139   !
140#  define DIM_2d
141#     define ROUTINE_LNK           lbc_lnk_2d
142#     include "lbc_lnk_generic.h90"
143#     undef ROUTINE_LNK
144#     define MULTI
145#     define ROUTINE_LNK           lbc_lnk_2d_ptr
146#     include "lbc_lnk_generic.h90"
147#     undef ROUTINE_LNK
148#     undef MULTI
149#  undef DIM_2d
150   !
151   !                       !==  3D array and array of 3D pointer  ==!
152   !
153#  define DIM_3d
154#     define ROUTINE_LNK           lbc_lnk_3d
155#     include "lbc_lnk_generic.h90"
156#     undef ROUTINE_LNK
157#     define MULTI
158#     define ROUTINE_LNK           lbc_lnk_3d_ptr
159#     include "lbc_lnk_generic.h90"
160#     undef ROUTINE_LNK
161#     undef MULTI
162#  undef DIM_3d
163   !
164   !                       !==  4D array and array of 4D pointer  ==!
165   !
166#  define DIM_4d
167#     define ROUTINE_LNK           lbc_lnk_4d
168#     include "lbc_lnk_generic.h90"
169#     undef ROUTINE_LNK
170#     define MULTI
171#     define ROUTINE_LNK           lbc_lnk_4d_ptr
172#     include "lbc_lnk_generic.h90"
173#     undef ROUTINE_LNK
174#     undef MULTI
175#  undef DIM_4d
176   
177   !!======================================================================
178   !!   identical routines in both C1D and shared memory computing
179   !!======================================================================
180
181   !!----------------------------------------------------------------------
182   !!                   ***  routine lbc_bdy_lnk_(2,3,4)d  ***
183   !!
184   !!   wrapper rountine to 'lbc_lnk_3d'. This wrapper is used
185   !!   to maintain the same interface with regards to the mpp case
186   !!----------------------------------------------------------------------
187   
188   SUBROUTINE lbc_bdy_lnk_4d( cdname, pt4d, cd_type, psgn, ib_bdy )
189      !!----------------------------------------------------------------------
190      CHARACTER(len=*)          , INTENT(in   ) ::   cdname      ! name of the calling subroutine
191      REAL(wp), DIMENSION(:,:,:,:), INTENT(inout) ::   pt4d      ! 3D array on which the lbc is applied
192      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points
193      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold
194      INTEGER                   , INTENT(in   ) ::   ib_bdy    ! BDY boundary set
195      !!----------------------------------------------------------------------
196      CALL lbc_lnk_4d( cdname, pt4d, cd_type, psgn)
197   END SUBROUTINE lbc_bdy_lnk_4d
198
199   SUBROUTINE lbc_bdy_lnk_3d( cdname, pt3d, cd_type, psgn, ib_bdy )
200      !!----------------------------------------------------------------------
201      CHARACTER(len=*)          , INTENT(in   ) ::   cdname      ! name of the calling subroutine
202      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pt3d      ! 3D array on which the lbc is applied
203      CHARACTER(len=1)          , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points
204      REAL(wp)                  , INTENT(in   ) ::   psgn      ! sign used across north fold
205      INTEGER                   , INTENT(in   ) ::   ib_bdy    ! BDY boundary set
206      !!----------------------------------------------------------------------
207      CALL lbc_lnk_3d( cdname, pt3d, cd_type, psgn)
208   END SUBROUTINE lbc_bdy_lnk_3d
209
210
211   SUBROUTINE lbc_bdy_lnk_2d( cdname, pt2d, cd_type, psgn, ib_bdy )
212      !!----------------------------------------------------------------------
213      CHARACTER(len=*)        , INTENT(in   ) ::   cdname      ! name of the calling subroutine
214      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 3D array on which the lbc is applied
215      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points
216      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold
217      INTEGER                 , INTENT(in   ) ::   ib_bdy    ! BDY boundary set
218      !!----------------------------------------------------------------------
219      CALL lbc_lnk_2d( cdname, pt2d, cd_type, psgn)
220   END SUBROUTINE lbc_bdy_lnk_2d
221
222
223!!gm  This routine should be removed with an optional halos size added in argument of generic routines
224
225   SUBROUTINE lbc_lnk_2d_icb( cdname, pt2d, cd_type, psgn, ki, kj )
226      !!----------------------------------------------------------------------
227      CHARACTER(len=*)        , INTENT(in   ) ::   cdname      ! name of the calling subroutine
228      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   pt2d      ! 2D array on which the lbc is applied
229      CHARACTER(len=1)        , INTENT(in   ) ::   cd_type   ! nature of pt3d grid-points
230      REAL(wp)                , INTENT(in   ) ::   psgn      ! sign used across north fold
231      INTEGER                 , INTENT(in   ) ::   ki, kj    ! sizes of extra halo (not needed in non-mpp)
232      !!----------------------------------------------------------------------
233      CALL lbc_lnk_2d( cdname, pt2d, cd_type, psgn )
234   END SUBROUTINE lbc_lnk_2d_icb
235!!gm end
236
237#endif
238
239   !!======================================================================
240   !!   identical routines in both distributed and shared memory computing
241   !!======================================================================
242
243   !!----------------------------------------------------------------------
244   !!                   ***   load_ptr_(2,3,4)d   ***
245   !!
246   !!   * Dummy Argument :
247   !!       in    ==>   ptab       ! array to be loaded (2D, 3D or 4D)
248   !!                   cd_nat     ! nature of pt2d array grid-points
249   !!                   psgn       ! sign used across the north fold boundary
250   !!       inout <=>   ptab_ptr   ! array of 2D, 3D or 4D pointers
251   !!                   cdna_ptr   ! nature of ptab array grid-points
252   !!                   psgn_ptr   ! sign used across the north fold boundary
253   !!                   kfld       ! number of elements that has been attributed
254   !!----------------------------------------------------------------------
255
256   !!----------------------------------------------------------------------
257   !!                  ***   lbc_lnk_(2,3,4)d_multi   ***
258   !!                     ***   load_ptr_(2,3,4)d   ***
259   !!
260   !!   * Argument : dummy argument use in lbc_lnk_multi_... routines
261   !!
262   !!----------------------------------------------------------------------
263
264#  define DIM_2d
265#     define ROUTINE_LOAD           load_ptr_2d
266#     define ROUTINE_MULTI          lbc_lnk_2d_multi
267#     include "lbc_lnk_multi_generic.h90"
268#     undef ROUTINE_MULTI
269#     undef ROUTINE_LOAD
270#     define IS_BDY
271#     define ROUTINE_LOAD           load_ptr_bdy_2d
272#     define ROUTINE_MULTI          lbc_lnk_bdy_2d_multi
273#     include "lbc_lnk_multi_generic.h90"
274#     undef ROUTINE_MULTI
275#     undef IS_BDY
276#     undef ROUTINE_LOAD
277#  undef DIM_2d
278
279#  define DIM_3d
280#     define ROUTINE_LOAD           load_ptr_3d
281#     define ROUTINE_MULTI          lbc_lnk_3d_multi
282#     include "lbc_lnk_multi_generic.h90"
283#     undef ROUTINE_MULTI
284#     undef ROUTINE_LOAD
285#     define IS_BDY
286#     define ROUTINE_LOAD           load_ptr_bdy_3d
287#     define ROUTINE_MULTI          lbc_lnk_bdy_3d_multi
288#     include "lbc_lnk_multi_generic.h90"
289#     undef ROUTINE_MULTI
290#     undef IS_BDY
291#     undef ROUTINE_LOAD
292#  undef DIM_3d
293
294#  define DIM_4d
295#     define ROUTINE_LOAD           load_ptr_4d
296#     define ROUTINE_MULTI          lbc_lnk_4d_multi
297#     include "lbc_lnk_multi_generic.h90"
298#     undef ROUTINE_MULTI
299#     undef ROUTINE_LOAD
300#     define IS_BDY
301#     define ROUTINE_LOAD           load_ptr_bdy_4d
302#     define ROUTINE_MULTI          lbc_lnk_bdy_4d_multi
303#     include "lbc_lnk_multi_generic.h90"
304#     undef ROUTINE_MULTI
305#     undef IS_BDY
306#     undef ROUTINE_LOAD
307#  undef DIM_4d
308
309
310   !!======================================================================
311END MODULE lbclnk
312
Note: See TracBrowser for help on using the repository browser.