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 7256 for branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC – NEMO

Ignore:
Timestamp:
2016-11-18T08:18:45+01:00 (7 years ago)
Author:
cbricaud
Message:

phaze NEMO routines in CRS branch with nemo_v3_6_STABLE branch at rev 7213 (09-09-2016) (merge -r 5519:7213 )

Location:
branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC/lbclnk.F90

    r5602 r7256  
    1111   !!                            the BDY/OBC communications 
    1212   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  add a C1D case   
     13   !!            3.6  ! 2015-06  (O. Tintó and M. Castrillo)  add lbc_lnk_multi   
    1314   !!---------------------------------------------------------------------- 
    1415#if defined key_mpp_mpi 
     
    2425 
    2526   INTERFACE lbc_lnk_multi 
    26       MODULE PROCEDURE mpp_lnk_2d_9 
     27      MODULE PROCEDURE mpp_lnk_2d_9, mpp_lnk_2d_multiple 
    2728   END INTERFACE 
    2829 
     
    8081   END INTERFACE 
    8182 
     83   INTERFACE lbc_lnk_multi 
     84      MODULE PROCEDURE lbc_lnk_2d_9, lbc_lnk_2d_multiple 
     85   END INTERFACE 
     86 
    8287   INTERFACE lbc_bdy_lnk 
    8388      MODULE PROCEDURE lbc_bdy_lnk_2d, lbc_bdy_lnk_3d 
     
    8792      MODULE PROCEDURE lbc_lnk_2d_e 
    8893   END INTERFACE 
     94    
     95   TYPE arrayptr 
     96      REAL , DIMENSION (:,:),  POINTER :: pt2d 
     97   END TYPE arrayptr 
     98   PUBLIC   arrayptr 
    8999 
    90100   PUBLIC   lbc_lnk       ! ocean/ice  lateral boundary conditions 
    91101   PUBLIC   lbc_lnk_e  
     102   PUBLIC   lbc_lnk_multi ! modified ocean lateral boundary conditions 
    92103   PUBLIC   lbc_bdy_lnk   ! ocean lateral BDY boundary conditions 
    93104   PUBLIC   lbc_lnk_icb 
     
    171182      ! 
    172183   END SUBROUTINE lbc_lnk_2d 
     184    
     185   SUBROUTINE lbc_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields ) 
     186      !! 
     187      INTEGER :: num_fields 
     188      TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
     189      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! define the nature of ptab array grid-points 
     190      !                                                               ! = T , U , V , F , W and I points 
     191      REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! =-1 the sign change across the north fold boundary 
     192      !                                                               ! =  1. , the sign is kept 
     193      ! 
     194      INTEGER  ::   ii    !!MULTI SEND DUMMY LOOP INDICES 
     195      ! 
     196      DO ii = 1, num_fields 
     197        CALL lbc_lnk_2d( pt2d_array(ii)%pt2d, type_array(ii), psgn_array(ii) ) 
     198      END DO      
     199      ! 
     200   END SUBROUTINE lbc_lnk_2d_multiple 
     201 
     202   SUBROUTINE lbc_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
     203      &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
     204      &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
     205      !!--------------------------------------------------------------------- 
     206      ! Second 2D array on which the boundary condition is applied 
     207      REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA 
     208      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
     209      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI 
     210      ! define the nature of ptab array grid-points 
     211      CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA 
     212      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
     213      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
     214      ! =-1 the sign change across the north fold boundary 
     215      REAL(wp)                                      , INTENT(in   ) ::   psgnA 
     216      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
     217      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI 
     218      CHARACTER(len=3)                    , OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     219      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
     220      !! 
     221      !!--------------------------------------------------------------------- 
     222 
     223      !!The first array 
     224      CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
     225 
     226      !! Look if more arrays to process 
     227      IF(PRESENT (psgnB) )CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
     228      IF(PRESENT (psgnC) )CALL lbc_lnk( pt2dC, cd_typeC, psgnC )  
     229      IF(PRESENT (psgnD) )CALL lbc_lnk( pt2dD, cd_typeD, psgnD )  
     230      IF(PRESENT (psgnE) )CALL lbc_lnk( pt2dE, cd_typeE, psgnE )  
     231      IF(PRESENT (psgnF) )CALL lbc_lnk( pt2dF, cd_typeF, psgnF )  
     232      IF(PRESENT (psgnG) )CALL lbc_lnk( pt2dG, cd_typeG, psgnG )  
     233      IF(PRESENT (psgnH) )CALL lbc_lnk( pt2dH, cd_typeH, psgnH )  
     234      IF(PRESENT (psgnI) )CALL lbc_lnk( pt2dI, cd_typeI, psgnI )  
     235 
     236   END SUBROUTINE lbc_lnk_2d_9 
     237 
     238 
     239 
     240 
    173241 
    174242#else 
     
    372440      !     
    373441   END SUBROUTINE lbc_lnk_2d 
     442    
     443   SUBROUTINE lbc_lnk_2d_multiple( pt2d_array , type_array , psgn_array , num_fields ) 
     444      !! 
     445      INTEGER :: num_fields 
     446      TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
     447      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   type_array   ! define the nature of ptab array grid-points 
     448      !                                                               ! = T , U , V , F , W and I points 
     449      REAL(wp)        , DIMENSION(:), INTENT(in   ) ::   psgn_array   ! =-1 the sign change across the north fold boundary 
     450      !                                                               ! =  1. , the sign is kept 
     451      ! 
     452      INTEGER  ::   ii    !!MULTI SEND DUMMY LOOP INDICES 
     453      ! 
     454      DO ii = 1, num_fields 
     455        CALL lbc_lnk_2d( pt2d_array(ii)%pt2d, type_array(ii), psgn_array(ii) ) 
     456      END DO      
     457      ! 
     458   END SUBROUTINE lbc_lnk_2d_multiple 
     459 
     460   SUBROUTINE lbc_lnk_2d_9( pt2dA, cd_typeA, psgnA, pt2dB, cd_typeB, psgnB, pt2dC, cd_typeC, psgnC   & 
     461      &                   , pt2dD, cd_typeD, psgnD, pt2dE, cd_typeE, psgnE, pt2dF, cd_typeF, psgnF   & 
     462      &                   , pt2dG, cd_typeG, psgnG, pt2dH, cd_typeH, psgnH, pt2dI, cd_typeI, psgnI, cd_mpp, pval) 
     463      !!--------------------------------------------------------------------- 
     464      ! Second 2D array on which the boundary condition is applied 
     465      REAL(wp), DIMENSION(jpi,jpj), TARGET          , INTENT(inout) ::   pt2dA 
     466      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dB , pt2dC , pt2dD , pt2dE 
     467      REAL(wp), DIMENSION(jpi,jpj), TARGET, OPTIONAL, INTENT(inout) ::   pt2dF , pt2dG , pt2dH , pt2dI 
     468      ! define the nature of ptab array grid-points 
     469      CHARACTER(len=1)                              , INTENT(in   ) ::   cd_typeA 
     470      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeB , cd_typeC , cd_typeD , cd_typeE 
     471      CHARACTER(len=1)                    , OPTIONAL, INTENT(in   ) ::   cd_typeF , cd_typeG , cd_typeH , cd_typeI 
     472      ! =-1 the sign change across the north fold boundary 
     473      REAL(wp)                                      , INTENT(in   ) ::   psgnA 
     474      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnB , psgnC , psgnD , psgnE 
     475      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   psgnF , psgnG , psgnH , psgnI 
     476      CHARACTER(len=3)                    , OPTIONAL, INTENT(in   ) ::   cd_mpp   ! fill the overlap area only 
     477      REAL(wp)                            , OPTIONAL, INTENT(in   ) ::   pval     ! background value (used at closed boundaries) 
     478      !! 
     479      !!--------------------------------------------------------------------- 
     480 
     481      !!The first array 
     482      CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
     483 
     484      !! Look if more arrays to process 
     485      IF(PRESENT (psgnB) )CALL lbc_lnk( pt2dA, cd_typeA, psgnA )  
     486      IF(PRESENT (psgnC) )CALL lbc_lnk( pt2dC, cd_typeC, psgnC )  
     487      IF(PRESENT (psgnD) )CALL lbc_lnk( pt2dD, cd_typeD, psgnD )  
     488      IF(PRESENT (psgnE) )CALL lbc_lnk( pt2dE, cd_typeE, psgnE )  
     489      IF(PRESENT (psgnF) )CALL lbc_lnk( pt2dF, cd_typeF, psgnF )  
     490      IF(PRESENT (psgnG) )CALL lbc_lnk( pt2dG, cd_typeG, psgnG )  
     491      IF(PRESENT (psgnH) )CALL lbc_lnk( pt2dH, cd_typeH, psgnH )  
     492      IF(PRESENT (psgnI) )CALL lbc_lnk( pt2dI, cd_typeI, psgnI )  
     493 
     494   END SUBROUTINE lbc_lnk_2d_9 
     495 
    374496 
    375497#endif 
     
    441563   !!====================================================================== 
    442564END MODULE lbclnk 
     565 
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC/lib_mpp.F90

    r6772 r7256  
    2424   !!            3.5  !  2013  ( C. Ethe, G. Madec ) message passing arrays as local variables  
    2525   !!            3.5  !  2013 (S.Mocavero, I.Epicoco - CMCC) north fold optimizations 
     26   !!            3.6  !  2015 (O. Tintó and M. Castrillo - BSC) Added 'mpp_lnk_2d_multiple', 'mpp_lbc_north_2d_multiple', 'mpp_max_multiple'  
    2627   !!---------------------------------------------------------------------- 
    2728 
     
    6263   USE lbcnfd         ! north fold treatment 
    6364   USE in_out_manager ! I/O manager 
     65   USE wrk_nemo       ! work arrays 
    6466 
    6567   IMPLICIT NONE 
     
    7072   PUBLIC   mpp_ini_north, mpp_lbc_north, mpp_lbc_north_e 
    7173   PUBLIC   mpp_min, mpp_max, mpp_sum, mpp_minloc, mpp_maxloc 
     74   PUBLIC   mpp_max_multiple 
    7275   PUBLIC   mpp_lnk_3d, mpp_lnk_3d_gather, mpp_lnk_2d, mpp_lnk_2d_e 
    73    PUBLIC   mpp_lnk_2d_9  
     76   PUBLIC   mpp_lnk_2d_9 , mpp_lnk_2d_multiple  
    7477   PUBLIC   mppscatter, mppgather, mppgatheri 
    7578   PUBLIC   mpp_ini_ice, mpp_ini_znl 
     
    7881   PUBLIC   mpp_lnk_bdy_2d, mpp_lnk_bdy_3d 
    7982   PUBLIC   mpp_lbc_north_icb, mpp_lnk_2d_icb 
     83   PUBLIC   mpprank 
    8084 
    8185   TYPE arrayptr 
    8286      REAL , DIMENSION (:,:),  POINTER :: pt2d 
    8387   END TYPE arrayptr 
     88   PUBLIC   arrayptr 
    8489    
    8590   !! * Interfaces 
     
    105110   INTERFACE mpp_maxloc 
    106111      MODULE PROCEDURE mpp_maxloc2d ,mpp_maxloc3d 
     112   END INTERFACE 
     113 
     114   INTERFACE mpp_max_multiple 
     115      MODULE PROCEDURE mppmax_real_multiple 
    107116   END INTERFACE 
    108117 
     
    298307      ENDIF 
    299308 
     309#if defined key_agrif 
     310      IF (Agrif_Root()) THEN 
     311         CALL Agrif_MPI_Init(mpi_comm_opa) 
     312      ELSE 
     313         CALL Agrif_MPI_set_grid_comm(mpi_comm_opa) 
     314      ENDIF 
     315#endif 
     316 
    300317      CALL mpi_comm_rank( mpi_comm_opa, mpprank, ierr ) 
    301318      CALL mpi_comm_size( mpi_comm_opa, mppsize, ierr ) 
     
    724741      ! ----------------------- 
    725742      ! 
    726       DO ii = 1 , num_fields 
    727743         !First Array 
    728          IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
    729             ! 
    730             SELECT CASE ( jpni ) 
    731             CASE ( 1 )     ;   CALL lbc_nfd      ( pt2d_array(ii)%pt2d( : , : ), type_array(ii) , psgn_array(ii) )   ! only 1 northern proc, no mpp 
    732             CASE DEFAULT   ;   CALL mpp_lbc_north( pt2d_array(ii)%pt2d( : , : ), type_array(ii), psgn_array(ii) )   ! for all northern procs. 
    733             END SELECT 
    734             ! 
    735          ENDIF 
    736          ! 
    737       END DO 
     744      IF( npolj /= 0 .AND. .NOT. PRESENT(cd_mpp) ) THEN 
     745         ! 
     746         SELECT CASE ( jpni ) 
     747         CASE ( 1 )     ;    
     748             DO ii = 1 , num_fields   
     749                       CALL lbc_nfd      ( pt2d_array(ii)%pt2d( : , : ), type_array(ii) , psgn_array(ii) )   ! only 1 northern proc, no mpp 
     750             END DO 
     751         CASE DEFAULT   ;   CALL mpp_lbc_north_2d_multiple( pt2d_array, type_array, psgn_array, num_fields )   ! for all northern procs. 
     752         END SELECT 
     753         ! 
     754      ENDIF 
     755        ! 
    738756       
    739757      DEALLOCATE( zt2ns, zt2sn, zt2ew, zt2we ) 
     
    17031721   END SUBROUTINE mppmax_real 
    17041722 
     1723   SUBROUTINE mppmax_real_multiple( ptab, NUM , kcom  ) 
     1724      !!---------------------------------------------------------------------- 
     1725      !!                  ***  routine mppmax_real  *** 
     1726      !! 
     1727      !! ** Purpose :   Maximum 
     1728      !! 
     1729      !!---------------------------------------------------------------------- 
     1730      REAL(wp), DIMENSION(:) ,  INTENT(inout)           ::   ptab   ! ??? 
     1731      INTEGER , INTENT(in   )           ::   NUM 
     1732      INTEGER , INTENT(in   ), OPTIONAL ::   kcom   ! ??? 
     1733      !! 
     1734      INTEGER  ::   ierror, localcomm 
     1735      REAL(wp) , POINTER , DIMENSION(:) ::   zwork 
     1736      !!---------------------------------------------------------------------- 
     1737      ! 
     1738      CALL wrk_alloc(NUM , zwork) 
     1739      localcomm = mpi_comm_opa 
     1740      IF( PRESENT(kcom) )   localcomm = kcom 
     1741      ! 
     1742      CALL mpi_allreduce( ptab, zwork, NUM, mpi_double_precision, mpi_max, localcomm, ierror ) 
     1743      ptab = zwork 
     1744      CALL wrk_dealloc(NUM , zwork) 
     1745      ! 
     1746   END SUBROUTINE mppmax_real_multiple 
     1747 
    17051748 
    17061749   SUBROUTINE mppmin_a_real( ptab, kdim, kcom ) 
     
    25972640   END SUBROUTINE mpp_lbc_north_2d 
    25982641 
     2642   SUBROUTINE mpp_lbc_north_2d_multiple( pt2d_array, cd_type, psgn, num_fields) 
     2643      !!--------------------------------------------------------------------- 
     2644      !!                   ***  routine mpp_lbc_north_2d  *** 
     2645      !! 
     2646      !! ** Purpose :   Ensure proper north fold horizontal bondary condition 
     2647      !!              in mpp configuration in case of jpn1 > 1 
     2648      !!              (for multiple 2d arrays ) 
     2649      !! 
     2650      !! ** Method  :   North fold condition and mpp with more than one proc 
     2651      !!              in i-direction require a specific treatment. We gather 
     2652      !!              the 4 northern lines of the global domain on 1 processor 
     2653      !!              and apply lbc north-fold on this sub array. Then we 
     2654      !!              scatter the north fold array back to the processors. 
     2655      !! 
     2656      !!---------------------------------------------------------------------- 
     2657      INTEGER ,  INTENT (in   ) ::   num_fields  ! number of variables contained in pt2d 
     2658      TYPE( arrayptr ), DIMENSION(:) :: pt2d_array 
     2659      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_type   ! nature of pt2d grid-points 
     2660      !                                                          !   = T ,  U , V , F or W  gridpoints 
     2661      REAL(wp), DIMENSION(:), INTENT(in   ) ::   psgn      ! = -1. the sign change across the north fold  
     2662      !!                                                             ! =  1. , the sign is kept 
     2663      INTEGER ::   ji, jj, jr, jk 
     2664      INTEGER ::   ierr, itaille, ildi, ilei, iilb 
     2665      INTEGER ::   ijpj, ijpjm1, ij, iproc 
     2666      INTEGER, DIMENSION (jpmaxngh)      ::   ml_req_nf          !for mpi_isend when avoiding mpi_allgather 
     2667      INTEGER                            ::   ml_err             ! for mpi_isend when avoiding mpi_allgather 
     2668      INTEGER, DIMENSION(MPI_STATUS_SIZE)::   ml_stat            ! for mpi_isend when avoiding mpi_allgather 
     2669      !                                                              ! Workspace for message transfers avoiding mpi_allgather 
     2670      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: ztab 
     2671      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: znorthloc, zfoldwk 
     2672      REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE   :: znorthgloio 
     2673      REAL(wp), DIMENSION(:,:,:)  , ALLOCATABLE   :: ztabl, ztabr 
     2674      INTEGER :: istatus(mpi_status_size) 
     2675      INTEGER :: iflag 
     2676      !!---------------------------------------------------------------------- 
     2677      ! 
     2678      ALLOCATE( ztab(jpiglo,4,num_fields), znorthloc(jpi,4,num_fields), zfoldwk(jpi,4,num_fields),   &  
     2679            &   znorthgloio(jpi,4,num_fields,jpni) )   ! expanded to 3 dimensions 
     2680      ALLOCATE( ztabl(jpi,4,num_fields), ztabr(jpi*jpmaxngh, 4,num_fields) ) 
     2681      ! 
     2682      ijpj   = 4 
     2683      ijpjm1 = 3 
     2684      ! 
     2685       
     2686      DO jk = 1, num_fields 
     2687         DO jj = nlcj-ijpj+1, nlcj             ! put in znorthloc the last 4 jlines of pt2d (for every variable) 
     2688            ij = jj - nlcj + ijpj 
     2689            znorthloc(:,ij,jk) = pt2d_array(jk)%pt2d(:,jj) 
     2690         END DO 
     2691      END DO 
     2692      !                                     ! Build in procs of ncomm_north the znorthgloio 
     2693      itaille = jpi * ijpj 
     2694                                                                   
     2695      IF ( l_north_nogather ) THEN 
     2696         ! 
     2697         ! Avoid the use of mpi_allgather by exchanging only with the processes already identified  
     2698         ! (in nemo_northcomms) as being  involved in this process' northern boundary exchange 
     2699         ! 
     2700         ztabr(:,:,:) = 0 
     2701         ztabl(:,:,:) = 0 
     2702 
     2703         DO jk = 1, num_fields 
     2704            DO jj = nlcj-ijpj+1, nlcj          ! First put local values into the global array 
     2705               ij = jj - nlcj + ijpj 
     2706               DO ji = nfsloop, nfeloop 
     2707                  ztabl(ji,ij,jk) = pt2d_array(jk)%pt2d(ji,jj) 
     2708               END DO 
     2709            END DO 
     2710         END DO 
     2711 
     2712         DO jr = 1,nsndto 
     2713            IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
     2714               CALL mppsend(5, znorthloc, itaille*num_fields, nfipproc(isendto(jr),jpnj), ml_req_nf(jr)) ! Buffer expanded "num_fields" times 
     2715            ENDIF 
     2716         END DO 
     2717         DO jr = 1,nsndto 
     2718            iproc = nfipproc(isendto(jr),jpnj) 
     2719            IF(iproc .ne. -1) THEN 
     2720               ilei = nleit (iproc+1) 
     2721               ildi = nldit (iproc+1) 
     2722               iilb = nfiimpp(isendto(jr),jpnj) - nfiimpp(isendto(1),jpnj) 
     2723            ENDIF 
     2724            IF((iproc .ne. (narea-1)) .and. (iproc .ne. -1)) THEN 
     2725              CALL mpprecv(5, zfoldwk, itaille*num_fields, iproc) ! Buffer expanded "num_fields" times 
     2726              DO jk = 1 , num_fields 
     2727                 DO jj = 1, ijpj 
     2728                    DO ji = ildi, ilei 
     2729                       ztabr(iilb+ji,jj,jk) = zfoldwk(ji,jj,jk)       ! Modified to 3D 
     2730                    END DO 
     2731                 END DO 
     2732              END DO 
     2733            ELSE IF (iproc .eq. (narea-1)) THEN 
     2734              DO jk = 1, num_fields 
     2735                 DO jj = 1, ijpj 
     2736                    DO ji = ildi, ilei 
     2737                          ztabr(iilb+ji,jj,jk) = pt2d_array(jk)%pt2d(ji,nlcj-ijpj+jj)       ! Modified to 3D 
     2738                    END DO 
     2739                 END DO 
     2740              END DO 
     2741            ENDIF 
     2742         END DO 
     2743         IF (l_isend) THEN 
     2744            DO jr = 1,nsndto 
     2745               IF ((nfipproc(isendto(jr),jpnj) .ne. (narea-1)) .and. (nfipproc(isendto(jr),jpnj) .ne. -1)) THEN 
     2746                  CALL mpi_wait(ml_req_nf(jr), ml_stat, ml_err) 
     2747               ENDIF 
     2748            END DO 
     2749         ENDIF 
     2750         ! 
     2751         DO ji = 1, num_fields     ! Loop to manage 3D variables 
     2752            CALL mpp_lbc_nfd( ztabl(:,:,ji), ztabr(:,:,ji), cd_type(ji), psgn(ji) )  ! North fold boundary condition 
     2753         END DO 
     2754         ! 
     2755         DO jk = 1, num_fields 
     2756            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt2d 
     2757               ij = jj - nlcj + ijpj 
     2758               DO ji = 1, nlci 
     2759                  pt2d_array(jk)%pt2d(ji,jj) = ztabl(ji,ij,jk)       ! Modified to 3D 
     2760               END DO 
     2761            END DO 
     2762         END DO 
     2763          
     2764         ! 
     2765      ELSE 
     2766         ! 
     2767         CALL MPI_ALLGATHER( znorthloc  , itaille*num_fields, MPI_DOUBLE_PRECISION,        & 
     2768            &                znorthgloio, itaille*num_fields, MPI_DOUBLE_PRECISION, ncomm_north, ierr ) 
     2769         ! 
     2770         ztab(:,:,:) = 0.e0 
     2771         DO jk = 1, num_fields 
     2772            DO jr = 1, ndim_rank_north            ! recover the global north array 
     2773               iproc = nrank_north(jr) + 1 
     2774               ildi = nldit (iproc) 
     2775               ilei = nleit (iproc) 
     2776               iilb = nimppt(iproc) 
     2777               DO jj = 1, ijpj 
     2778                  DO ji = ildi, ilei 
     2779                     ztab(ji+iilb-1,jj,jk) = znorthgloio(ji,jj,jk,jr) 
     2780                  END DO 
     2781               END DO 
     2782            END DO 
     2783         END DO 
     2784          
     2785         DO ji = 1, num_fields 
     2786            CALL lbc_nfd( ztab(:,:,ji), cd_type(ji), psgn(ji) )   ! North fold boundary condition 
     2787         END DO 
     2788         ! 
     2789         DO jk = 1, num_fields 
     2790            DO jj = nlcj-ijpj+1, nlcj             ! Scatter back to pt2d 
     2791               ij = jj - nlcj + ijpj 
     2792               DO ji = 1, nlci 
     2793                  pt2d_array(jk)%pt2d(ji,jj) = ztab(ji+nimpp-1,ij,jk) 
     2794               END DO 
     2795            END DO 
     2796         END DO 
     2797         ! 
     2798         ! 
     2799      ENDIF 
     2800      DEALLOCATE( ztab, znorthloc, zfoldwk, znorthgloio ) 
     2801      DEALLOCATE( ztabl, ztabr ) 
     2802      ! 
     2803   END SUBROUTINE mpp_lbc_north_2d_multiple 
    25992804 
    26002805   SUBROUTINE mpp_lbc_north_e( pt2d, cd_type, psgn) 
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC/mppini.F90

    r5601 r7256  
    201201       
    202202#endif 
    203       IF(lwp) THEN 
    204          WRITE(numout,*) 
    205          WRITE(numout,*) '           defines mpp subdomains' 
    206          WRITE(numout,*) '           ----------------------' 
    207          WRITE(numout,*) '           iresti=',iresti,' irestj=',irestj 
    208          WRITE(numout,*) '           jpni  =',jpni  ,' jpnj  =',jpnj 
    209          ifreq = 4 
    210          il1   = 1 
    211          DO jn = 1, (jpni-1)/ifreq+1 
    212             il2 = MIN( jpni, il1+ifreq-1 ) 
    213             WRITE(numout,*) 
    214             WRITE(numout,9200) ('***',ji = il1,il2-1) 
    215             DO jj = jpnj, 1, -1 
    216                WRITE(numout,9203) ('   ',ji = il1,il2-1) 
    217                WRITE(numout,9202) jj, ( ilcit(ji,jj),ilcjt(ji,jj),ji = il1,il2 ) 
    218                WRITE(numout,9203) ('   ',ji = il1,il2-1) 
    219                WRITE(numout,9200) ('***',ji = il1,il2-1) 
    220             END DO 
    221             WRITE(numout,9201) (ji,ji = il1,il2) 
    222             il1 = il1+ifreq 
    223          END DO 
    224  9200    FORMAT('     ***',20('*************',a3)) 
    225  9203    FORMAT('     *     ',20('         *   ',a3)) 
    226  9201    FORMAT('        ',20('   ',i3,'          ')) 
    227  9202    FORMAT(' ',i3,' *  ',20(i3,'  x',i3,'   *   ')) 
    228       ENDIF 
    229  
    230       zidom = nreci 
    231       DO ji = 1, jpni 
    232          zidom = zidom + ilcit(ji,1) - nreci 
    233       END DO 
    234       IF(lwp) WRITE(numout,*) 
    235       IF(lwp) WRITE(numout,*)' sum ilcit(i,1) = ', zidom, ' jpiglo = ', jpiglo 
    236        
    237       zjdom = nrecj 
    238       DO jj = 1, jpnj 
    239          zjdom = zjdom + ilcjt(1,jj) - nrecj 
    240       END DO 
    241       IF(lwp) WRITE(numout,*)' sum ilcit(1,j) = ', zjdom, ' jpjglo = ', jpjglo 
    242       IF(lwp) WRITE(numout,*) 
    243        
    244203 
    245204      !  2. Index arrays for subdomains 
     
    313272         nlejt(jn) = nlej 
    314273      END DO 
    315        
    316  
    317       ! 4. From global to local 
     274 
     275      ! 4. Subdomain print 
     276      ! ------------------ 
     277       
     278      IF(lwp) WRITE(numout,*) 
     279      IF(lwp) WRITE(numout,*) ' mpp_init: defines mpp subdomains' 
     280      IF(lwp) WRITE(numout,*) ' ~~~~~~  ----------------------' 
     281      IF(lwp) WRITE(numout,*) 
     282      IF(lwp) WRITE(numout,*) 'iresti=',iresti,' irestj=',irestj 
     283      IF(lwp) WRITE(numout,*) 
     284      IF(lwp) WRITE(numout,*) 'jpni=',jpni,' jpnj=',jpnj 
     285      zidom = nreci 
     286      DO ji = 1, jpni 
     287         zidom = zidom + ilcit(ji,1) - nreci 
     288      END DO 
     289      IF(lwp) WRITE(numout,*) 
     290      IF(lwp) WRITE(numout,*)' sum ilcit(i,1)=', zidom, ' jpiglo=', jpiglo 
     291 
     292      zjdom = nrecj 
     293      DO jj = 1, jpnj 
     294         zjdom = zjdom + ilcjt(1,jj) - nrecj 
     295      END DO 
     296      IF(lwp) WRITE(numout,*)' sum ilcit(1,j)=', zjdom, ' jpjglo=', jpjglo 
     297      IF(lwp) WRITE(numout,*) 
     298 
     299      IF(lwp) THEN 
     300         ifreq = 4 
     301         il1   = 1 
     302         DO jn = 1, (jpni-1)/ifreq+1 
     303            il2 = MIN( jpni, il1+ifreq-1 ) 
     304            WRITE(numout,*) 
     305            WRITE(numout,9200) ('***',ji = il1,il2-1) 
     306            DO jj = jpnj, 1, -1 
     307               WRITE(numout,9203) ('   ',ji = il1,il2-1) 
     308               WRITE(numout,9202) jj, ( ilcit(ji,jj),ilcjt(ji,jj),ji = il1,il2 ) 
     309               WRITE(numout,9204) (nfipproc(ji,jj),ji=il1,il2) 
     310               WRITE(numout,9203) ('   ',ji = il1,il2-1) 
     311               WRITE(numout,9200) ('***',ji = il1,il2-1) 
     312            END DO 
     313            WRITE(numout,9201) (ji,ji = il1,il2) 
     314            il1 = il1+ifreq 
     315         END DO 
     316 9200     FORMAT('     ***',20('*************',a3)) 
     317 9203     FORMAT('     *     ',20('         *   ',a3)) 
     318 9201     FORMAT('        ',20('   ',i3,'          ')) 
     319 9202     FORMAT(' ',i3,' *  ',20(i3,'  x',i3,'   *   ')) 
     320 9204     FORMAT('     *  ',20('      ',i3,'   *   ')) 
     321      ENDIF 
     322 
     323      ! 5. From global to local 
    318324      ! ----------------------- 
    319325 
     
    322328 
    323329 
    324       ! 5. Subdomain neighbours 
     330      ! 6. Subdomain neighbours 
    325331      ! ---------------------- 
    326332 
     
    445451         WRITE(numout,*) ' nimpp  = ', nimpp 
    446452         WRITE(numout,*) ' njmpp  = ', njmpp 
    447          WRITE(numout,*) ' nbse   = ', nbse  , ' npse   = ', npse 
    448          WRITE(numout,*) ' nbsw   = ', nbsw  , ' npsw   = ', npsw 
    449          WRITE(numout,*) ' nbne   = ', nbne  , ' npne   = ', npne 
    450          WRITE(numout,*) ' nbnw   = ', nbnw  , ' npnw   = ', npnw 
     453         WRITE(numout,*) ' nreci  = ', nreci  , ' npse   = ', npse 
     454         WRITE(numout,*) ' nrecj  = ', nrecj  , ' npsw   = ', npsw 
     455         WRITE(numout,*) ' jpreci = ', jpreci , ' npne   = ', npne 
     456         WRITE(numout,*) ' jprecj = ', jprecj , ' npnw   = ', npnw 
     457         WRITE(numout,*) 
    451458      ENDIF 
    452459 
     
    455462      ! Prepare mpp north fold 
    456463 
    457       IF (jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN 
     464      IF( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN 
    458465         CALL mpp_ini_north 
    459       END IF 
     466         IF(lwp) WRITE(numout,*) ' mpp_init : North fold boundary prepared for jpni >1' 
     467      ENDIF 
    460468 
    461469      ! Prepare NetCDF output file (if necessary) 
  • branches/2015/dev_r5003_MERCATOR6_CRS/NEMOGCM/NEMO/OPA_SRC/LBC/mppini_2.h90

    r6772 r7256  
    309309         ENDIF 
    310310 
     311         ! Check wet points over the entire domain to preserve the MPI communication stencil 
    311312         isurf = 0 
    312313         DO jj = 1, ilj 
     
    315316            END DO 
    316317         END DO 
     318 
    317319         IF(isurf /= 0) THEN 
    318320            icont = icont + 1 
     
    326328 
    327329      nfipproc(:,:) = ipproc(:,:) 
    328  
    329330 
    330331      ! Control 
     
    434435      ii = iin(narea) 
    435436      ij = ijn(narea) 
     437 
     438      ! set default neighbours 
     439      noso = ioso(ii,ij) 
     440      nowe = iowe(ii,ij) 
     441      noea = ioea(ii,ij) 
     442      nono = iono(ii,ij)  
     443      npse = iose(ii,ij) 
     444      npsw = iosw(ii,ij) 
     445      npne = ione(ii,ij) 
     446      npnw = ionw(ii,ij) 
     447 
     448      ! check neighbours location 
    436449      IF( ioso(ii,ij) >= 0 .AND. ioso(ii,ij) <= (jpni*jpnj-1) ) THEN  
    437450         iiso = 1 + MOD(ioso(ii,ij),jpni) 
     
    517530      IF (lwp) THEN 
    518531         CALL ctl_opn( inum, 'layout.dat', 'REPLACE', 'FORMATTED', 'SEQUENTIAL', -1, numout, .FALSE., narea ) 
     532         WRITE(inum,'(a)') '   jpnij     jpi     jpj     jpk  jpiglo  jpjglo' 
    519533         WRITE(inum,'(6i8)') jpnij,jpi,jpj,jpk,jpiglo,jpjglo 
    520534         WRITE(inum,'(a)') 'NAREA nlci nlcj nldi nldj nlei nlej nimpp njmpp' 
     
    529543      END IF 
    530544 
    531       IF( nperio == 1 .AND.jpni /= 1 ) CALL ctl_stop( ' mpp_init2:  error on cyclicity' ) 
    532  
    533       ! Prepare mpp north fold 
    534  
    535       IF( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN 
    536          CALL mpp_ini_north 
    537          IF(lwp) WRITE(numout,*) ' mpp_init2 : North fold boundary prepared for jpni >1' 
    538       ENDIF 
    539  
    540545      ! Defined npolj, either 0, 3 , 4 , 5 , 6 
    541546      ! In this case the important thing is that npolj /= 0 
     
    554559      ENDIF 
    555560 
     561      ! Periodicity : no corner if nbondi = 2 and nperio != 1 
     562 
     563      IF(lwp) THEN 
     564         WRITE(numout,*) ' nproc  = ', nproc 
     565         WRITE(numout,*) ' nowe   = ', nowe  , ' noea   =  ', noea 
     566         WRITE(numout,*) ' nono   = ', nono  , ' noso   =  ', noso 
     567         WRITE(numout,*) ' nbondi = ', nbondi 
     568         WRITE(numout,*) ' nbondj = ', nbondj 
     569         WRITE(numout,*) ' npolj  = ', npolj 
     570         WRITE(numout,*) ' nperio = ', nperio 
     571         WRITE(numout,*) ' nlci   = ', nlci 
     572         WRITE(numout,*) ' nlcj   = ', nlcj 
     573         WRITE(numout,*) ' nimpp  = ', nimpp 
     574         WRITE(numout,*) ' njmpp  = ', njmpp 
     575         WRITE(numout,*) ' nreci  = ', nreci  , ' npse   = ', npse 
     576         WRITE(numout,*) ' nrecj  = ', nrecj  , ' npsw   = ', npsw 
     577         WRITE(numout,*) ' jpreci = ', jpreci , ' npne   = ', npne 
     578         WRITE(numout,*) ' jprecj = ', jprecj , ' npnw   = ', npnw 
     579         WRITE(numout,*) 
     580      ENDIF 
     581 
     582      IF( nperio == 1 .AND. jpni /= 1 ) CALL ctl_stop( ' mpp_init2: error on cyclicity' ) 
     583 
     584      ! Prepare mpp north fold 
     585 
     586      IF( jperio >= 3 .AND. jperio <= 6 .AND. jpni > 1 ) THEN 
     587         CALL mpp_ini_north 
     588         IF(lwp) WRITE(numout,*) ' mpp_init2 : North fold boundary prepared for jpni >1' 
     589      ENDIF 
     590 
    556591      ! Prepare NetCDF output file (if necessary) 
    557592      CALL mpp_init_ioipsl 
    558593 
    559       ! Periodicity : no corner if nbondi = 2 and nperio != 1 
    560  
    561       IF(lwp) THEN 
    562          WRITE(numout,*) ' nproc=  ',nproc 
    563          WRITE(numout,*) ' nowe=   ',nowe 
    564          WRITE(numout,*) ' noea=   ',noea 
    565          WRITE(numout,*) ' nono=   ',nono 
    566          WRITE(numout,*) ' noso=   ',noso 
    567          WRITE(numout,*) ' nbondi= ',nbondi 
    568          WRITE(numout,*) ' nbondj= ',nbondj 
    569          WRITE(numout,*) ' npolj=  ',npolj 
    570          WRITE(numout,*) ' nperio= ',nperio 
    571          WRITE(numout,*) ' nlci=   ',nlci 
    572          WRITE(numout,*) ' nlcj=   ',nlcj 
    573          WRITE(numout,*) ' nimpp=  ',nimpp 
    574          WRITE(numout,*) ' njmpp=  ',njmpp 
    575          WRITE(numout,*) ' nbse=   ',nbse,' npse= ',npse 
    576          WRITE(numout,*) ' nbsw=   ',nbsw,' npsw= ',npsw 
    577          WRITE(numout,*) ' nbne=   ',nbne,' npne= ',npne 
    578          WRITE(numout,*) ' nbnw=   ',nbnw,' npnw= ',npnw 
    579       ENDIF 
    580594 
    581595   END SUBROUTINE mpp_init2 
Note: See TracChangeset for help on using the changeset viewer.