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.
Changeset 8196 – NEMO

Changeset 8196


Ignore:
Timestamp:
2017-06-20T17:01:49+02:00 (7 years ago)
Author:
acc
Message:

Branch 2017/dev_r8126_ROBUST08_no_ghost. Add generic routine for the north fold operation without global width arrays or MPI_ALLGATHER operations (lbc_nfd_nogather_generic.h90). Actually the generic form is not strictly neccessary since only the 4d array version is used. Other possibilities are currently commented out. This commit includes fixes to mpp_nfd_generic.h90 which ensure only necessary arrays are allocated depending on ln_nnogather setting. Tested with ORCA2LIMPIS_LONG SETTE test and produces identical results with ln_nnogather true or false.

Location:
branches/2017/dev_r8126_ROBUST08_no_ghost/NEMOGCM/NEMO/OPA_SRC/LBC
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r8126_ROBUST08_no_ghost/NEMOGCM/NEMO/OPA_SRC/LBC/lbcnfd.F90

    r8186 r8196  
    1313   !!   lbc_nfd_3d    : lateral boundary condition: North fold treatment for a 3D arrays   (lbc_nfd) 
    1414   !!   lbc_nfd_2d    : lateral boundary condition: North fold treatment for a 2D arrays   (lbc_nfd) 
    15 !   !!   mpp_lbc_nfd_3d: North fold treatment for a 3D arrays optimized for MPP 
    16 !   !!   mpp_lbc_nfd_2d: North fold treatment for a 2D arrays optimized for MPP 
     15   !!   lbc_nfd_nogather       : generic interface for lbc_nfd_nogather_3d and  
     16   !!                            lbc_nfd_nogather_2d routines (designed for use 
     17   !!                            with ln_nnogather to avoid global width arrays 
     18   !!                            mpi all gather operations) 
    1719   !!---------------------------------------------------------------------- 
    1820   USE dom_oce        ! ocean space and time domain  
     
    2729   END INTERFACE 
    2830   ! 
    29 !!gm   INTERFACE mpp_lbc_nfd 
    30 !!gm      MODULE PROCEDURE   mpp_lbc_nfd_3d, mpp_lbc_nfd_2d 
    31 !!gm   END INTERFACE 
     31   INTERFACE lbc_nfd_nogather 
     32!                        ! Currently only 4d array version is needed 
     33!     MODULE PROCEDURE   lbc_nfd_nogather_2d    , lbc_nfd_nogather_3d 
     34      MODULE PROCEDURE   lbc_nfd_nogather_4d 
     35!     MODULE PROCEDURE   lbc_nfd_nogather_2d_ptr, lbc_nfd_nogather_3d_ptr 
     36!     MODULE PROCEDURE   lbc_nfd_nogather_4d_ptr 
     37   END INTERFACE 
    3238 
    3339   TYPE, PUBLIC ::   PTR_2D   !: array of 2D pointers (also used in lib_mpp) 
     
    4147   END TYPE PTR_4D 
    4248 
    43    PUBLIC   lbc_nfd       ! north fold conditions 
    44 !!gm   PUBLIC   mpp_lbc_nfd   ! north fold conditions (parallel case) 
     49   PUBLIC   lbc_nfd            ! north fold conditions 
     50   PUBLIC   lbc_nfd_nogather   ! north fold conditions (no allgather case) 
    4551 
    4652   INTEGER, PUBLIC, PARAMETER            ::   jpmaxngh = 3               !: 
     
    104110#     undef ROUTINE_NFD 
    105111#     undef MULTI 
     112#  undef DIM_4d 
     113   ! 
     114   !  lbc_nfd_nogather routines 
     115   ! 
     116   !                       !==  2D array and array of 2D pointer  ==! 
     117   ! 
     118!#  define DIM_2d 
     119!#     define ROUTINE_NFD           lbc_nfd_nogather_2d 
     120!#     include "lbc_nfd_nogather_generic.h90" 
     121!#     undef ROUTINE_NFD 
     122!#     define MULTI 
     123!#     define ROUTINE_NFD           lbc_nfd_nogather_2d_ptr 
     124!#     include "lbc_nfd_nogather_generic.h90" 
     125!#     undef ROUTINE_NFD 
     126!#     undef MULTI 
     127!#  undef DIM_2d 
     128   ! 
     129   !                       !==  3D array and array of 3D pointer  ==! 
     130   ! 
     131!#  define DIM_3d 
     132!#     define ROUTINE_NFD           lbc_nfd_nogather_3d 
     133!#     include "lbc_nfd_nogather_generic.h90" 
     134!#     undef ROUTINE_NFD 
     135!#     define MULTI 
     136!#     define ROUTINE_NFD           lbc_nfd_nogather_3d_ptr 
     137!#     include "lbc_nfd_nogather_generic.h90" 
     138!#     undef ROUTINE_NFD 
     139!#     undef MULTI 
     140!#  undef DIM_3d 
     141   ! 
     142   !                       !==  4D array and array of 4D pointer  ==! 
     143   ! 
     144#  define DIM_4d 
     145#     define ROUTINE_NFD           lbc_nfd_nogather_4d 
     146#     include "lbc_nfd_nogather_generic.h90" 
     147#     undef ROUTINE_NFD 
     148!#     define MULTI 
     149!#     define ROUTINE_NFD           lbc_nfd_nogather_4d_ptr 
     150!#     include "lbc_nfd_nogather_generic.h90" 
     151!#     undef ROUTINE_NFD 
     152!#     undef MULTI 
    106153#  undef DIM_4d 
    107154 
  • branches/2017/dev_r8126_ROBUST08_no_ghost/NEMOGCM/NEMO/OPA_SRC/LBC/mpp_nfd_generic.h90

    r8186 r8196  
    7373      ipj   = 4            ! 2nd dimension of message transfers (last j-lines) 
    7474      ! 
    75       ALLOCATE( ztab   (jpiglo,4,ipk,ipl,ipf) , znorthloc  (jpi         ,4,ipk,ipl,ipf)      ) 
    76       ALLOCATE( zfoldwk(jpi   ,4,ipk,ipl,ipf) , znorthgloio(jpi         ,4,ipk,ipl,ipf,jpni) ) 
    77       ALLOCATE( ztabl  (jpi   ,4,ipk,ipl,ipf) , ztabr      (jpi*jpmaxngh,4,ipk,ipl,ipf)      )  
     75      ALLOCATE( znorthloc(jpi,4,ipk,ipl,ipf) ) 
    7876      ! 
    7977      znorthloc(:,:,:,:,:) = 0._wp 
    8078      ! 
    81       DO jf = 1, ipf                ! put in xnorthloc the last ipj j-lines of ptab 
     79      DO jf = 1, ipf                ! put in znorthloc the last ipj j-lines of ptab 
    8280         DO jl = 1, ipl 
    8381            DO jk = 1, ipk 
     
    9088      END DO 
    9189      ! 
    92       !                             ! Build in procs of ncomm_north the znorthgloio 
    9390      ! 
    9491      itaille = jpi * ipj * ipk * ipl * ipf 
    9592      ! 
    9693      IF( l_north_nogather ) THEN      !==  ????  ==! 
     94         ALLOCATE( zfoldwk(jpi,4,ipk,ipl,ipf) ) 
     95         ALLOCATE( ztabl(jpi   ,4,ipk,ipl,ipf) , ztabr(jpi*jpmaxngh,4,ipk,ipl,ipf) )  
    9796         ! 
    9897         ztabr(:,:,:,:,:) = 0._wp 
     
    158157            END DO 
    159158         ENDIF 
    160 !!gm ERROR         CALL mpp_lbc_nfd( ztabl, ztabr, cd_nat, psgn )   ! North fold boundary condition 
     159         DO jf = 1, ipf 
     160            CALL lbc_nfd_nogather( ztabl(:,:,:,:,jf), ztabr(:,:,:,:,jf), cd_nat LBC_ARG, psgn LBC_ARG )   ! North fold boundary condition 
     161         END DO 
    161162         DO jf = 1, ipf 
    162163            DO jl = 1, ipl 
     
    172173         END DO 
    173174         ! 
     175         DEALLOCATE( zfoldwk ) 
     176         DEALLOCATE( ztabl, ztabr )  
    174177      ELSE                             !==  ????  ==! 
     178         ALLOCATE( ztab       (jpiglo,4,ipk,ipl,ipf     ) ) 
     179         ALLOCATE( znorthgloio(jpi   ,4,ipk,ipl,ipf,jpni) ) 
    175180         ! 
    176181         CALL MPI_ALLGATHER( znorthloc  , itaille, MPI_DOUBLE_PRECISION,                & 
     
    212217         END DO 
    213218         ! 
     219      ! 
     220         DEALLOCATE( ztab ) 
     221         DEALLOCATE( znorthgloio ) 
    214222      ENDIF 
    215223      ! 
     
    221229      ! this domain will be identical. 
    222230      ! 
    223       DEALLOCATE( ztab, znorthloc, zfoldwk, znorthgloio ) 
    224       DEALLOCATE( ztabl, ztabr )  
     231      DEALLOCATE( znorthloc ) 
    225232      ! 
    226233   END SUBROUTINE ROUTINE_NFD 
Note: See TracChangeset for help on using the changeset viewer.