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

Ignore:
Timestamp:
2018-10-05T17:57:31+02:00 (6 years ago)
Author:
dancopsey
Message:

Merged in dev_r5518_cleanup_1d_cpl branch.

File:
1 edited

Legend:

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

    r10159 r10176  
    2828#endif 
    2929   USE par_oce                      ! ocean parameters 
     30   USE cpl_rnf_1d, ONLY: nn_cpl_river   ! Variables used in 1D river outflow 
    3031   USE dom_oce                      ! ocean space and time domain 
    3132   USE in_out_manager               ! I/O manager 
     
    3940   PUBLIC   cpl_snd 
    4041   PUBLIC   cpl_rcv 
     42   PUBLIC   cpl_rcv_1d 
    4143   PUBLIC   cpl_freq 
    4244   PUBLIC   cpl_finalize 
     
    8890      INTEGER               ::   nct       ! Number of categories in field 
    8991      INTEGER               ::   ncplmodel ! Maximum number of models to/from which this variable may be sent/received 
     92      INTEGER               ::   dimensions ! Number of dimensions of coupling field 
    9093   END TYPE FLD_CPL 
    9194 
     
    150153      ! 
    151154      INTEGER :: id_part 
     155      INTEGER :: id_part_0d     ! Partition for 0d fields 
     156      INTEGER :: id_part_rnf_1d ! Partition for 1d river outflow fields 
     157      INTEGER :: id_part_temp   ! Temperary partition used to choose either 0d or 1d partitions 
     158      INTEGER :: vector_length  ! Length of 0d or 1d variables (0d variables will have vector_length=1) 
    152159      INTEGER :: paral(5)       ! OASIS3 box partition 
    153160      INTEGER :: ishape(4)      ! Shape of arrays passed to PSMILe.  
     
    222229       
    223230      CALL oasis_def_partition ( id_part, paral, nerror, jpiglo*jpjglo) 
     231 
     232      ! A special partition is needed for 0D fields 
     233      
     234      paral(1) = 0                                       ! serial partitioning 
     235      paral(2) = 0    
     236      IF ( nproc == 0) THEN 
     237         paral(3) = 1                   ! Size of array to couple (scalar) 
     238      ELSE 
     239         paral(3) = 0                   ! Dummy size for PE's not involved 
     240      END IF 
     241      paral(4) = 0 
     242      paral(5) = 0 
     243         
     244      CALL oasis_def_partition ( id_part_0d, paral, nerror, 1 ) 
     245 
     246      ! Another partition is needed for 1D river routing fields 
     247       
     248      paral(1) = 0                                       ! serial partitioning 
     249      paral(2) = 0    
     250      IF ( nproc == 0) THEN 
     251         paral(3) = nn_cpl_river                   ! Size of array to couple (vector) 
     252      ELSE 
     253         paral(3) = 0                   ! Dummy size for PE's not involved 
     254      END IF 
     255      paral(4) = 0 
     256      paral(5) = 0 
     257 
     258 
     259      CALL oasis_def_partition ( id_part_rnf_1d, paral, nerror, nn_cpl_river ) 
     260  
    224261      ! 
    225262      ! ... Announce send variables.  
     
    306343#endif 
    307344                  IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_In 
    308  
    309                   ! ... Set the field dimension and bundle count 
    310                   var_nodims(1) = 2 
    311                   var_nodims(2) = 1 ! Modify this value to cater for bundled fields.     
    312  
    313                   CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part   , var_nodims,   & 
    314                      &                OASIS_In           , ishape , OASIS_REAL, nerror ) 
     345                  flush(numout) 
     346 
     347                  ! Define 0D (Greenland or Antarctic ice mass) or 1D (river outflow) coupling fields 
     348                  IF (srcv(ji)%dimensions <= 1) THEN 
     349                    var_nodims(1) = 1 
     350                    var_nodims(2) = 1 ! Modify this value to cater for bundled fields.   
     351                    IF (nproc == 0) THEN                     
     352                        
     353                       IF (srcv(ji)%dimensions == 0) THEN 
     354                        
     355                          ! If 0D then set temporary variables to 0D components 
     356                          id_part_temp = id_part_0d 
     357                          vector_length = 1 
     358                       ELSE 
     359                        
     360                          ! If 1D then set temporary variables to river outflow components 
     361                          id_part_temp = id_part_rnf_1d 
     362                          vector_length = nn_cpl_river 
     363                           
     364                       END IF 
     365                        
     366                       CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part_temp   , var_nodims,   & 
     367                                   OASIS_In           , (/ 1, vector_length /) , OASIS_REAL, nerror ) 
     368                    ELSE 
     369                       ! Dummy call to keep OASIS3-MCT happy.  
     370                       CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part_0d   , var_nodims,   & 
     371                                   OASIS_In           , (/ 0, 0 /) , OASIS_REAL, nerror ) 
     372                    END IF 
     373                  ELSE  
     374                    ! It's a "normal" 2D (or pseudo 3D) coupling field.  
     375                    ! ... Set the field dimension and bundle count 
     376                    var_nodims(1) = 2 
     377                    var_nodims(2) = 1 ! Modify this value to cater for bundled fields.      
     378 
     379                    CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part   , var_nodims,   & 
     380                                         OASIS_In           , ishape , OASIS_REAL, nerror ) 
     381                  ENDIF 
     382 
    315383                  IF ( nerror /= OASIS_Ok ) THEN 
    316384                     WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 
     
    412480                
    413481               llaction =  kinfo == OASIS_Recvd   .OR. kinfo == OASIS_FromRest .OR.   & 
    414                   &        kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 
     482                &        kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 
    415483                
    416484               IF ( ln_ctl )   WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 
     
    437505                     WRITE(numout,*) '****************' 
    438506                  ENDIF 
    439                    
     507 
    440508               ENDIF 
    441                 
     509 
    442510            ENDIF 
    443511             
     
    451519      ! 
    452520   END SUBROUTINE cpl_rcv 
     521 
     522   SUBROUTINE cpl_rcv_1d( kid, kstep, pdata, nitems, kinfo ) 
     523      !!--------------------------------------------------------------------- 
     524      !!              ***  ROUTINE cpl_rcv_1d  *** 
     525      !! 
     526      !! ** Purpose : - A special version of cpl_rcv to deal exclusively with 
     527      !! receipt of 0D or 1D fields.  
     528      !! The fields are recieved into a 1D array buffer which is simply a  
     529      !! dynamically sized sized array (which may be of size 1) 
     530      !! of 0 dimensional fields. This allows us to pass miltiple 0D  
     531      !! fields via a single put/get operation.   
     532      !!---------------------------------------------------------------------- 
     533      INTEGER , INTENT(in   ) ::   nitems      ! Number of 0D items to recieve  
     534                                               ! during this get operation. i.e. 
     535                                               ! The size of the 1D array in which 
     536                                               ! 0D items are passed.    
     537      INTEGER , INTENT(in   ) ::   kid         ! ID index of the incoming 
     538                                               ! data.   
     539      INTEGER , INTENT(in   ) ::   kstep       ! ocean time-step in seconds 
     540      REAL(wp), INTENT(inout) ::   pdata(1:nitems) ! The original value(s),   
     541                                                   ! unchanged if nothing is  
     542                                                   ! received 
     543      INTEGER , INTENT(  out) ::   kinfo       ! OASIS3 info argument 
     544      !!  
     545      REAL(wp) ::   recvfld(1:nitems)          ! Local receive field buffer 
     546      INTEGER  ::   jc,jm     ! local loop index 
     547      INTEGER  ::   ierr 
     548      LOGICAL  ::   llaction 
     549      INTEGER  ::   MPI_WORKING_PRECISION 
     550      INTEGER  ::   number_to_print  
     551      !!-------------------------------------------------------------------- 
     552      ! 
     553      ! receive local data from OASIS3 on every process 
     554      ! 
     555      kinfo = OASIS_idle 
     556      ! 
     557      ! 0D and 1D fields won't have categories or any other form of "pseudo level"  
     558      ! so we only cater for a single set of values and thus don't bother  
     559      ! with a loop over the jc index  
     560      jc = 1 
     561 
     562      DO jm = 1, srcv(kid)%ncplmodel 
     563 
     564         IF( srcv(kid)%nid(jc,jm) /= -1 ) THEN 
     565 
     566            IF ( ( srcv(kid)%dimensions <= 1) .AND. (nproc == 0) ) THEN 
     567               ! Since there is no concept of data decomposition for zero  
     568               ! dimension fields, they must only be exchanged through the master PE,  
     569               ! unlike "normal" 2D field cases where every PE is involved.  
     570 
     571               CALL oasis_get ( srcv(kid)%nid(jc,jm), kstep, recvfld, kinfo )    
     572                
     573               llaction =  kinfo == OASIS_Recvd   .OR. kinfo == OASIS_FromRest .OR.   & 
     574                           kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 
     575                
     576               IF ( ln_ctl ) WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , & 
     577                                     llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 
     578                
     579               IF ( llaction ) THEN 
     580                   
     581                  kinfo = OASIS_Rcv 
     582                  pdata(1:nitems) = recvfld(1:nitems)  
     583                   
     584                  IF ( ln_ctl ) THEN         
     585                     number_to_print = 10 
     586                     IF ( nitems < number_to_print ) number_to_print = nitems 
     587                     WRITE(numout,*) '****************' 
     588                     WRITE(numout,*) 'oasis_get: Incoming ', srcv(kid)%clname 
     589                     WRITE(numout,*) 'oasis_get: ivarid '  , srcv(kid)%nid(jc,jm) 
     590                     WRITE(numout,*) 'oasis_get:   kstep', kstep 
     591                     WRITE(numout,*) 'oasis_get:   info ', kinfo 
     592                     WRITE(numout,*) '     - Minimum Value is ', MINVAL(pdata(:)) 
     593                     WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:)) 
     594                     WRITE(numout,*) '     - Start of data is ', pdata(1:number_to_print) 
     595                     WRITE(numout,*) '****************' 
     596                  ENDIF 
     597                   
     598               ENDIF 
     599            ENDIF    
     600          ENDIF 
     601             
     602       ENDDO 
     603        
     604       ! Set the precision that we want to broadcast using MPI_BCAST 
     605       SELECT CASE( wp ) 
     606       CASE( sp )  
     607         MPI_WORKING_PRECISION = MPI_REAL                ! Single precision 
     608       CASE( dp ) 
     609         MPI_WORKING_PRECISION = MPI_DOUBLE_PRECISION    ! Double precision 
     610       CASE default 
     611         CALL oasis_abort( ncomp_id, "cpl_rcv_1d", "Could not find precision for coupling 0d or 1d field" ) 
     612       END SELECT 
     613 
     614       ! We have to broadcast (potentially) received values from PE 0 to all  
     615       ! the others. If no new data has been received we're just  
     616       ! broadcasting the existing values but there's no more efficient way  
     617       ! to deal with that w/o NEMO adopting a UM-style test mechanism 
     618       ! to determine active put/get timesteps.  
     619       CALL mpi_bcast( pdata, nitems, MPI_WORKING_PRECISION, localRoot, mpi_comm_opa, ierr ) 
     620 
     621      ! 
     622   END SUBROUTINE cpl_rcv_1d 
    453623 
    454624 
Note: See TracChangeset for help on using the changeset viewer.