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 6558 for branches/UKMO/dev_r5518_hadgem3_mct/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90 – NEMO

Ignore:
Timestamp:
2016-05-18T14:16:20+02:00 (8 years ago)
Author:
frrh
Message:

Add changes as per dev_r5107_hadgem3_mct@6355

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_hadgem3_mct/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90

    r6557 r6558  
    2424   !!   cpl_finalize : finalize the coupled mode communication 
    2525   !!---------------------------------------------------------------------- 
    26 #if defined key_oasis3 
     26#if defined key_oasis3 || defined key_oasis3mct 
    2727   USE mod_oasis                    ! OASIS3-MCT module 
    2828#endif 
     
    3131   USE in_out_manager               ! I/O manager 
    3232   USE lbclnk                       ! ocean lateral boundary conditions (or mpp link) 
     33    
     34#if defined key_cpl_rootexchg 
     35   USE lib_mpp, only : mppsync 
     36   USE lib_mpp, only : mppscatter,mppgather 
     37#endif  
    3338 
    3439   IMPLICIT NONE 
     
    4146   PUBLIC   cpl_freq 
    4247   PUBLIC   cpl_finalize 
     48#if defined key_mpp_mpi 
     49   INCLUDE 'mpif.h' 
     50#endif 
     51    
     52   INTEGER, PARAMETER         :: localRoot  = 0 
     53   LOGICAL                    :: commRank            ! true for ranks doing OASIS communication 
     54#if defined key_cpl_rootexchg 
     55   LOGICAL                    :: rootexchg =.true.   ! logical switch  
     56#else 
     57   LOGICAL                    :: rootexchg =.false.  ! logical switch  
     58#endif  
    4359 
    4460   INTEGER, PUBLIC            ::   OASIS_Rcv  = 1    !: return code if received field 
     
    4662   INTEGER                    ::   ncomp_id          ! id returned by oasis_init_comp 
    4763   INTEGER                    ::   nerror            ! return error code 
    48 #if ! defined key_oasis3 
     64#if ! defined key_oasis3 && ! defined key_oasis3mct 
    4965   ! OASIS Variables not used. defined only for compilation purpose 
    5066   INTEGER                    ::   OASIS_Out         = -1 
     
    8298 
    8399   REAL(wp), DIMENSION(:,:), ALLOCATABLE ::   exfld   ! Temporary buffer for receiving 
    84  
     100   REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   tbuf  ! Temporary buffer for sending / receiving  
     101   INTEGER, PUBLIC :: localComm  
     102       
    85103   !!---------------------------------------------------------------------- 
    86104   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    120138      IF ( nerror /= OASIS_Ok ) & 
    121139         CALL oasis_abort (ncomp_id, 'cpl_init','Failure in oasis_get_localcomm' ) 
     140      localComm = kl_comm  
    122141      ! 
    123142   END SUBROUTINE cpl_init 
     
    148167      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~' 
    149168      IF(lwp) WRITE(numout,*) 
     169       
     170      commRank = .false. 
     171      IF ( rootexchg ) THEN 
     172         IF ( nproc == localRoot ) commRank = .true. 
     173      ELSE 
     174         commRank = .true. 
     175      ENDIF 
    150176 
    151177      ncplmodel = kcplmodel 
     
    172198      ishape(:,2) = (/ 1, nlej-nldj+1 /) 
    173199      ! 
    174       ! ... Allocate memory for data exchange 
    175       ! 
    176       ALLOCATE(exfld(nlei-nldi+1, nlej-nldj+1), stat = nerror) 
    177       IF( nerror > 0 ) THEN 
    178          CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating exfld')   ;   RETURN 
    179       ENDIF 
    180200      ! 
    181201      ! ----------------------------------------------------------------- 
    182202      ! ... Define the partition  
    183203      ! ----------------------------------------------------------------- 
     204       
     205      IF ( rootexchg ) THEN 
     206      
     207      paral(1) = 2              ! box partitioning 
     208      paral(2) = 0              ! NEMO lower left corner global offset      
     209      paral(3) = jpiglo         ! local extent in i  
     210      paral(4) = jpjglo         ! local extent in j 
     211      paral(5) = jpiglo         ! global extent in x 
     212 
     213      ELSE  
    184214       
    185215      paral(1) = 2                                              ! box partitioning 
     
    196226      ENDIF 
    197227       
    198       CALL oasis_def_partition ( id_part, paral, nerror ) 
     228      ENDIF 
     229      IF ( commRank )  CALL oasis_def_partition ( id_part, paral, nerror, jpiglo*jpjglo ) 
     230      
     231      ! ... Allocate memory for data exchange 
     232      ! 
     233      ALLOCATE(exfld(paral(3), paral(4)), stat = nerror) 
     234      IF( nerror > 0 ) THEN 
     235         CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating exfld')   ;   RETURN 
     236      ENDIF 
     237      IF ( rootexchg ) THEN 
     238! Should possibly use one of the work arrays for tbuf really 
     239         ALLOCATE(tbuf(jpi, jpj, jpnij), stat = nerror) 
     240         IF( nerror > 0 ) THEN 
     241             CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating tbuf') ; RETURN 
     242         ENDIF 
     243       ENDIF              
     244       ! 
     245       IF (commRank ) THEN 
    199246      ! 
    200247      ! ... Announce send variables.  
     
    241288            END DO 
    242289         ENDIF 
    243       END DO 
     290      END DO       
    244291      ! 
    245292      ! ... Announce received variables.  
     
    288335         ENDIF 
    289336      END DO 
     337      ! 
     338      ENDIF  ! commRank=true  
    290339       
    291340      !------------------------------------------------------------------ 
     
    293342      !------------------------------------------------------------------ 
    294343       
    295       CALL oasis_enddef(nerror) 
    296       IF( nerror /= OASIS_Ok )   CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in oasis_enddef') 
     344      IF ( commRank ) THEN      
     345       
     346         CALL oasis_enddef(nerror) 
     347         IF( nerror /= OASIS_Ok )   CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in oasis_enddef') 
     348      ENDIF 
    297349      ! 
    298350   END SUBROUTINE cpl_define 
     
    311363      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pdata 
    312364      !! 
    313       INTEGER                                   ::   jc,jm     ! local loop index 
     365      INTEGER                                   ::   jn,jc,jm     ! local loop index 
    314366      !!-------------------------------------------------------------------- 
    315367      ! 
     
    320372         
    321373            IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN 
    322                CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 
     374               IF ( rootexchg ) THEN 
     375                  ! 
     376                  ! collect data on the local root process 
     377                  ! 
     378                  CALL mppgather (pdata(:,:,jc),localRoot,tbuf)  
     379                  CALL mppsync  
     380            
     381                  IF ( nproc == localRoot ) THEN 
     382                                
     383                     DO jn = 1, jpnij 
     384                        exfld(nimppt(jn)-1+nldit(jn):nimppt(jn)+nleit(jn)-1,njmppt(jn)-1+nldjt(jn):njmppt(jn)+nlejt(jn)-1)= & 
     385                          tbuf(nldit(jn):nleit(jn),nldjt(jn):nlejt(jn),jn) 
     386                     ENDDO 
     387                
     388                     ! snd data to OASIS3 
     389                     CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, exfld, kinfo ) 
     390            
     391                  ENDIF 
     392            
     393               ELSE 
     394 
     395                   ! snd data to OASIS3 
     396                   CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 
     397               ENDIF 
    323398                
    324399               IF ( ln_ctl ) THEN         
     
    358433      INTEGER                   , INTENT(  out) ::   kinfo     ! OASIS3 info argument 
    359434      !! 
    360       INTEGER                                   ::   jc,jm     ! local loop index 
     435      INTEGER                                   ::   jn,jc,jm     ! local loop index 
    361436      LOGICAL                                   ::   llaction, llfisrt 
    362437      !!-------------------------------------------------------------------- 
     
    372447 
    373448            IF( srcv(kid)%nid(jc,jm) /= -1 ) THEN 
    374  
    375                CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo )          
     449                
     450               ! 
     451               ! receive data from OASIS3 
     452               ! 
     453               IF ( commRank )  CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, exfld, kinfo ) 
     454        
     455               IF ( rootexchg )  CALL MPI_BCAST ( kinfo, 1, MPI_INTEGER, localRoot, localComm, nerror )                       
    376456                
    377457               llaction =  kinfo == OASIS_Recvd   .OR. kinfo == OASIS_FromRest .OR.   & 
     
    384464                  kinfo = OASIS_Rcv 
    385465                  IF( llfisrt ) THEN  
    386                      pdata(nldi:nlei,nldj:nlej,jc) =                                 exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
     466                      
     467                     IF ( rootexchg ) THEN 
     468            
     469                        ! distribute data to processes 
     470                        ! 
     471                        IF ( nproc == localRoot ) THEN 
     472 
     473                           DO jn = 1, jpnij 
     474                              tbuf(nldit(jn):nleit(jn),nldjt(jn):nlejt(jn),jn)=          & 
     475                              exfld(nimppt(jn)-1+nldit(jn):nimppt(jn)+nleit(jn)-1,njmppt(jn)-1+nldjt(jn):njmppt(jn)+nlejt(jn)-1) 
     476                              ! NOTE: we are missing combining this with pmask (see else below) 
     477                           ENDDO 
     478                
     479                        ENDIF 
     480 
     481                        CALL mppscatter (tbuf,localRoot,pdata(:,:,jc))  
     482                        CALL mppsync 
     483 
     484                     ELSE 
     485            
     486                        pdata(nldi:nlei, nldj:nlej, jc) = exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
     487                
     488                     ENDIF 
     489                      
    387490                     llfisrt = .FALSE. 
    388491                  ELSE 
     
    462565#if defined key_oa3mct_v3 
    463566         CALL oasis_get_freqs(id, mop, 1, itmp, info) 
    464 #else 
     567#endif 
     568#if defined key_oasis3 
    465569         CALL oasis_get_freqs(id,      1, itmp, info) 
    466570#endif 
    467571         cpl_freq = itmp(1) 
     572#if defined key_oasis3mct 
     573         cpl_freq = namflddti( id ) 
     574#endif 
    468575      ENDIF 
    469576      ! 
     
    481588      ! 
    482589      DEALLOCATE( exfld ) 
     590      IF ( rootexchg ) DEALLOCATE ( tbuf ) 
    483591      IF (nstop == 0) THEN 
    484592         CALL oasis_terminate( nerror )          
     
    489597   END SUBROUTINE cpl_finalize 
    490598 
    491 #if ! defined key_oasis3 
     599#if ! defined key_oasis3 && ! defined key_oasis3mct 
    492600 
    493601   !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.