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 13463 for NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/SBC/cpl_oasis3.F90 – NEMO

Ignore:
Timestamp:
2020-09-14T17:40:34+02:00 (4 years ago)
Author:
andmirek
Message:

Ticket #2195:update to trunk 13461

Location:
NEMO/branches/2019/dev_r11351_fldread_with_XIOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS

    • Property svn:externals
      •  

        old new  
        33^/utils/build/mk@HEAD         mk 
        44^/utils/tools@HEAD            tools 
        5 ^/vendors/AGRIF/dev@HEAD      ext/AGRIF 
         5^/vendors/AGRIF/dev_r12970_AGRIF_CMEMS      ext/AGRIF 
        66^/vendors/FCM@HEAD            ext/FCM 
        77^/vendors/IOIPSL@HEAD         ext/IOIPSL 
         8 
         9# SETTE 
         10^/utils/CI/sette@13382        sette 
  • NEMO/branches/2019/dev_r11351_fldread_with_XIOS/src/OCE/SBC/cpl_oasis3.F90

    r10582 r13463  
    6969   INTEGER, PUBLIC, PARAMETER ::   nmaxcat=5    ! Maximum number of coupling fields 
    7070   INTEGER, PUBLIC, PARAMETER ::   nmaxcpl=5    ! Maximum number of coupling fields 
    71    LOGICAL, PARAMETER         ::   ltmp_wapatch = .TRUE.   ! patch to restore wraparound rows in cpl_send, cpl_rcv, cpl_define   
    72    INTEGER                    ::   nldi_save, nlei_save 
    73    INTEGER                    ::   nldj_save, nlej_save 
    7471    
    7572   TYPE, PUBLIC ::   FLD_CPL               !: Type for coupling field information 
     
    114111      !------------------------------------------------------------------ 
    115112      CALL oasis_init_comp ( ncomp_id, TRIM(cd_modname), nerror ) 
    116       IF ( nerror /= OASIS_Ok ) & 
     113      IF( nerror /= OASIS_Ok ) & 
    117114         CALL oasis_abort (ncomp_id, 'cpl_init', 'Failure in oasis_init_comp') 
    118115 
     
    122119 
    123120      CALL oasis_get_localcomm ( kl_comm, nerror ) 
    124       IF ( nerror /= OASIS_Ok ) & 
     121      IF( nerror /= OASIS_Ok ) & 
    125122         CALL oasis_abort (ncomp_id, 'cpl_init','Failure in oasis_get_localcomm' ) 
    126123      ! 
     
    148145      !!-------------------------------------------------------------------- 
    149146 
    150       ! patch to restore wraparound rows in cpl_send, cpl_rcv, cpl_define 
    151       IF ( ltmp_wapatch ) THEN 
    152          nldi_save = nldi   ;   nlei_save = nlei 
    153          nldj_save = nldj   ;   nlej_save = nlej 
    154          IF( nimpp           ==      1 ) nldi = 1 
    155          IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 
    156          IF( njmpp           ==      1 ) nldj = 1 
    157          IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 
    158       ENDIF  
    159147      IF(lwp) WRITE(numout,*) 
    160148      IF(lwp) WRITE(numout,*) 'cpl_define : initialization in coupled ocean/atmosphere case' 
     
    177165      ENDIF 
    178166      ! 
    179       ! ... Define the shape for the area that excludes the halo 
    180       !     For serial configuration (key_mpp_mpi not being active) 
    181       !     nl* is set to the global values 1 and jp*glo. 
     167      ! ... Define the shape for the area that excludes the halo as we don't want them to be "seen" by oasis 
    182168      ! 
    183169      ishape(1) = 1 
    184       ishape(2) = nlei-nldi+1 
     170      ishape(2) = Ni_0 
    185171      ishape(3) = 1 
    186       ishape(4) = nlej-nldj+1 
     172      ishape(4) = Nj_0 
    187173      ! 
    188174      ! ... Allocate memory for data exchange 
    189175      ! 
    190       ALLOCATE(exfld(nlei-nldi+1, nlej-nldj+1), stat = nerror) 
     176      ALLOCATE(exfld(Ni_0, Nj_0), stat = nerror)        ! allocate only inner domain (without halos) 
    191177      IF( nerror > 0 ) THEN 
    192178         CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in allocating exfld')   ;   RETURN 
     
    194180      ! 
    195181      ! ----------------------------------------------------------------- 
    196       ! ... Define the partition  
     182      ! ... Define the partition, excluding halos as we don't want them to be "seen" by oasis     
    197183      ! ----------------------------------------------------------------- 
    198184       
    199       paral(1) = 2                                              ! box partitioning 
    200       paral(2) = jpiglo * (nldj-1+njmpp-1) + (nldi-1+nimpp-1)   ! NEMO lower left corner global offset     
    201       paral(3) = nlei-nldi+1                                    ! local extent in i  
    202       paral(4) = nlej-nldj+1                                    ! local extent in j 
    203       paral(5) = jpiglo                                         ! global extent in x 
     185      paral(1) = 2                                      ! box partitioning 
     186      paral(2) = Ni0glo * mjg0(nn_hls) + mig0(nn_hls)   ! NEMO lower left corner global offset, without halos  
     187      paral(3) = Ni_0                                   ! local extent in i, excluding halos 
     188      paral(4) = Nj_0                                   ! local extent in j, excluding halos 
     189      paral(5) = Ni0glo                                 ! global extent in x, excluding halos 
    204190       
    205       IF( ln_ctl ) THEN 
     191      IF( sn_cfctl%l_oasout ) THEN 
    206192         WRITE(numout,*) ' multiexchg: paral (1:5)', paral 
    207          WRITE(numout,*) ' multiexchg: jpi, jpj =', jpi, jpj 
    208          WRITE(numout,*) ' multiexchg: nldi, nlei, nimpp =', nldi, nlei, nimpp 
    209          WRITE(numout,*) ' multiexchg: nldj, nlej, njmpp =', nldj, nlej, njmpp 
     193         WRITE(numout,*) ' multiexchg: Ni_0, Nj_0 =', Ni_0, Nj_0 
     194         WRITE(numout,*) ' multiexchg: Nis0, Nie0, nimpp =', Nis0, Nie0, nimpp 
     195         WRITE(numout,*) ' multiexchg: Njs0, Nje0, njmpp =', Njs0, Nje0, njmpp 
    210196      ENDIF 
    211197    
    212       CALL oasis_def_partition ( id_part, paral, nerror, jpiglo*jpjglo ) 
     198      CALL oasis_def_partition ( id_part, paral, nerror, Ni0glo*Nj0glo )   ! global number of points, excluding halos 
    213199      ! 
    214200      ! ... Announce send variables.  
     
    217203      ! 
    218204      DO ji = 1, ksnd 
    219          IF ( ssnd(ji)%laction ) THEN 
     205         IF( ssnd(ji)%laction ) THEN 
    220206 
    221207            IF( ssnd(ji)%nct > nmaxcat ) THEN 
     
    228214               DO jm = 1, kcplmodel 
    229215 
    230                   IF ( ssnd(ji)%nct .GT. 1 ) THEN 
     216                  IF( ssnd(ji)%nct .GT. 1 ) THEN 
    231217                     WRITE(cli2,'(i2.2)') jc 
    232218                     zclname = TRIM(ssnd(ji)%clname)//'_cat'//cli2 
     
    234220                     zclname = ssnd(ji)%clname 
    235221                  ENDIF 
    236                   IF ( kcplmodel  > 1 ) THEN 
     222                  IF( kcplmodel  > 1 ) THEN 
    237223                     WRITE(cli2,'(i2.2)') jm 
    238224                     zclname = 'model'//cli2//'_'//TRIM(zclname) 
     
    241227                  IF( agrif_fixed() /= 0 ) THEN  
    242228                     zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 
    243                   END IF 
    244 #endif 
    245                   IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_Out 
     229                  ENDIF 
     230#endif 
     231                  IF( sn_cfctl%l_oasout ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_Out 
    246232                  CALL oasis_def_var (ssnd(ji)%nid(jc,jm), zclname, id_part   , (/ 2, 1 /),   & 
    247233                     &                OASIS_Out          , ishape , OASIS_REAL, nerror ) 
    248                   IF ( nerror /= OASIS_Ok ) THEN 
     234                  IF( nerror /= OASIS_Ok ) THEN 
    249235                     WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 
    250236                     CALL oasis_abort ( ssnd(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 
    251237                  ENDIF 
    252                   IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
    253                   IF( ln_ctl .AND. ssnd(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
     238                  IF( sn_cfctl%l_oasout .AND. ssnd(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
     239                  IF( sn_cfctl%l_oasout .AND. ssnd(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
    254240               END DO 
    255241            END DO 
     
    262248      ! 
    263249      DO ji = 1, krcv 
    264          IF ( srcv(ji)%laction ) THEN  
     250         IF( srcv(ji)%laction ) THEN  
    265251             
    266252            IF( srcv(ji)%nct > nmaxcat ) THEN 
     
    273259               DO jm = 1, kcplmodel 
    274260                   
    275                   IF ( srcv(ji)%nct .GT. 1 ) THEN 
     261                  IF( srcv(ji)%nct .GT. 1 ) THEN 
    276262                     WRITE(cli2,'(i2.2)') jc 
    277263                     zclname = TRIM(srcv(ji)%clname)//'_cat'//cli2 
     
    279265                     zclname = srcv(ji)%clname 
    280266                  ENDIF 
    281                   IF ( kcplmodel  > 1 ) THEN 
     267                  IF( kcplmodel  > 1 ) THEN 
    282268                     WRITE(cli2,'(i2.2)') jm 
    283269                     zclname = 'model'//cli2//'_'//TRIM(zclname) 
     
    286272                  IF( agrif_fixed() /= 0 ) THEN  
    287273                     zclname=TRIM(Agrif_CFixed())//'_'//TRIM(zclname) 
    288                   END IF 
    289 #endif 
    290                   IF( ln_ctl ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_In 
     274                  ENDIF 
     275#endif 
     276                  IF( sn_cfctl%l_oasout ) WRITE(numout,*) "Define", ji, jc, jm, " "//TRIM(zclname), " for ", OASIS_In 
    291277                  CALL oasis_def_var (srcv(ji)%nid(jc,jm), zclname, id_part   , (/ 2, 1 /),   & 
    292278                     &                OASIS_In           , ishape , OASIS_REAL, nerror ) 
    293                   IF ( nerror /= OASIS_Ok ) THEN 
     279                  IF( nerror /= OASIS_Ok ) THEN 
    294280                     WRITE(numout,*) 'Failed to define transient ', ji, jc, jm, " "//TRIM(zclname) 
    295281                     CALL oasis_abort ( srcv(ji)%nid(jc,jm), 'cpl_define', 'Failure in oasis_def_var' ) 
    296282                  ENDIF 
    297                   IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
    298                   IF( ln_ctl .AND. srcv(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
     283                  IF( sn_cfctl%l_oasout .AND. srcv(ji)%nid(jc,jm) /= -1 ) WRITE(numout,*) "variable defined in the namcouple" 
     284                  IF( sn_cfctl%l_oasout .AND. srcv(ji)%nid(jc,jm) == -1 ) WRITE(numout,*) "variable NOT defined in the namcouple" 
    299285 
    300286               END DO 
     
    306292      ! End of definition phase 
    307293      !------------------------------------------------------------------ 
    308        
     294      !      
     295#if defined key_agrif 
     296      IF( agrif_fixed() == Agrif_Nb_Fine_Grids() ) THEN 
     297#endif 
    309298      CALL oasis_enddef(nerror) 
    310299      IF( nerror /= OASIS_Ok )   CALL oasis_abort ( ncomp_id, 'cpl_define', 'Failure in oasis_enddef') 
    311       ! 
    312       IF ( ltmp_wapatch ) THEN 
    313          nldi = nldi_save   ;   nlei = nlei_save 
    314          nldj = nldj_save   ;   nlej = nlej_save 
    315       ENDIF 
     300#if defined key_agrif 
     301      ENDIF 
     302#endif 
     303      ! 
    316304   END SUBROUTINE cpl_define 
    317305    
     
    331319      INTEGER                                   ::   jc,jm     ! local loop index 
    332320      !!-------------------------------------------------------------------- 
    333       ! patch to restore wraparound rows in cpl_send, cpl_rcv, cpl_define 
    334       IF ( ltmp_wapatch ) THEN 
    335          nldi_save = nldi   ;   nlei_save = nlei 
    336          nldj_save = nldj   ;   nlej_save = nlej 
    337          IF( nimpp           ==      1 ) nldi = 1 
    338          IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 
    339          IF( njmpp           ==      1 ) nldj = 1 
    340          IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 
    341       ENDIF 
    342321      ! 
    343322      ! snd data to OASIS3 
     
    346325         DO jm = 1, ssnd(kid)%ncplmodel 
    347326         
    348             IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN 
    349                CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(nldi:nlei, nldj:nlej,jc), kinfo ) 
     327            IF( ssnd(kid)%nid(jc,jm) /= -1 ) THEN   ! exclude halos from data sent to oasis 
     328               CALL oasis_put ( ssnd(kid)%nid(jc,jm), kstep, pdata(Nis0:Nie0, Njs0:Nje0,jc), kinfo ) 
    350329                
    351                IF ( ln_ctl ) THEN         
     330               IF ( sn_cfctl%l_oasout ) THEN         
    352331                  IF ( kinfo == OASIS_Sent     .OR. kinfo == OASIS_ToRest .OR.   & 
    353332                     & kinfo == OASIS_SentOut  .OR. kinfo == OASIS_ToRestOut ) THEN 
     
    357336                     WRITE(numout,*) 'oasis_put:  kstep ', kstep 
    358337                     WRITE(numout,*) 'oasis_put:   info ', kinfo 
    359                      WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
    360                      WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
    361                      WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
     338                     WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
     339                     WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
     340                     WRITE(numout,*) '     -     Sum value is ',    SUM(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
    362341                     WRITE(numout,*) '****************' 
    363342                  ENDIF 
     
    368347         ENDDO 
    369348      ENDDO 
    370       IF ( ltmp_wapatch ) THEN 
    371          nldi = nldi_save   ;   nlei = nlei_save 
    372          nldj = nldj_save   ;   nlej = nlej_save 
    373       ENDIF 
    374349      ! 
    375350    END SUBROUTINE cpl_snd 
     
    390365      !! 
    391366      INTEGER                                   ::   jc,jm     ! local loop index 
    392       LOGICAL                                   ::   llaction, llfisrt 
     367      LOGICAL                                   ::   llaction, ll_1st 
    393368      !!-------------------------------------------------------------------- 
    394       ! patch to restore wraparound rows in cpl_send, cpl_rcv, cpl_define 
    395       IF ( ltmp_wapatch ) THEN 
    396          nldi_save = nldi   ;   nlei_save = nlei 
    397          nldj_save = nldj   ;   nlej_save = nlej 
    398       ENDIF 
    399369      ! 
    400370      ! receive local data from OASIS3 on every process 
     
    403373      ! 
    404374      DO jc = 1, srcv(kid)%nct 
    405          IF ( ltmp_wapatch ) THEN 
    406             IF( nimpp           ==      1 ) nldi = 1 
    407             IF( nimpp + jpi - 1 == jpiglo ) nlei = jpi 
    408             IF( njmpp           ==      1 ) nldj = 1 
    409             IF( njmpp + jpj - 1 == jpjglo ) nlej = jpj 
    410          ENDIF 
    411          llfisrt = .TRUE. 
     375         ll_1st = .TRUE. 
    412376 
    413377         DO jm = 1, srcv(kid)%ncplmodel 
     
    420384                  &        kinfo == OASIS_RecvOut .OR. kinfo == OASIS_FromRestOut 
    421385                
    422                IF ( ln_ctl )   WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 
     386               IF ( sn_cfctl%l_oasout )   & 
     387                  &  WRITE(numout,*) "llaction, kinfo, kstep, ivarid: " , llaction, kinfo, kstep, srcv(kid)%nid(jc,jm) 
    423388                
    424                IF ( llaction ) THEN 
     389               IF( llaction ) THEN   ! data received from oasis do not include halos 
    425390                   
    426391                  kinfo = OASIS_Rcv 
    427                   IF( llfisrt ) THEN  
    428                      pdata(nldi:nlei,nldj:nlej,jc) =                                 exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
    429                      llfisrt = .FALSE. 
     392                  IF( ll_1st ) THEN  
     393                     pdata(Nis0:Nie0,Njs0:Nje0,jc) =   exfld(:,:) * pmask(Nis0:Nie0,Njs0:Nje0,jm) 
     394                     ll_1st = .FALSE. 
    430395                  ELSE 
    431                      pdata(nldi:nlei,nldj:nlej,jc) = pdata(nldi:nlei,nldj:nlej,jc) + exfld(:,:) * pmask(nldi:nlei,nldj:nlej,jm) 
     396                     pdata(Nis0:Nie0,Njs0:Nje0,jc) = pdata(Nis0:Nie0,Njs0:Nje0,jc)   & 
     397                        &                                + exfld(:,:) * pmask(Nis0:Nie0,Njs0:Nje0,jm) 
    432398                  ENDIF 
    433399                   
    434                   IF ( ln_ctl ) THEN         
     400                  IF ( sn_cfctl%l_oasout ) THEN         
    435401                     WRITE(numout,*) '****************' 
    436402                     WRITE(numout,*) 'oasis_get: Incoming ', srcv(kid)%clname 
     
    438404                     WRITE(numout,*) 'oasis_get:   kstep', kstep 
    439405                     WRITE(numout,*) 'oasis_get:   info ', kinfo 
    440                      WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(:,:,jc)) 
    441                      WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(:,:,jc)) 
    442                      WRITE(numout,*) '     -     Sum value is ', SUM(pdata(:,:,jc)) 
     406                     WRITE(numout,*) '     - Minimum value is ', MINVAL(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
     407                     WRITE(numout,*) '     - Maximum value is ', MAXVAL(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
     408                     WRITE(numout,*) '     -     Sum value is ',    SUM(pdata(Nis0:Nie0,Njs0:Nje0,jc)) 
    443409                     WRITE(numout,*) '****************' 
    444410                  ENDIF 
     
    450416         ENDDO 
    451417 
    452          IF ( ltmp_wapatch ) THEN 
    453             nldi = nldi_save   ;   nlei = nlei_save 
    454             nldj = nldj_save   ;   nlej = nlej_save 
    455          ENDIF 
    456          !--- Fill the overlap areas and extra hallows (mpp) 
    457          !--- check periodicity conditions (all cases) 
    458          IF( .not. llfisrt ) THEN 
     418         !--- we must call lbc_lnk to fill the halos that where not received. 
     419         IF( .NOT. ll_1st ) THEN 
    459420            CALL lbc_lnk( 'cpl_oasis3', pdata(:,:,jc), srcv(kid)%clgrid, srcv(kid)%nsgn )    
    460421         ENDIF 
     
    483444      ! 
    484445      DO ji = 1, nsnd 
    485          IF (ssnd(ji)%laction ) THEN 
     446         IF(ssnd(ji)%laction ) THEN 
    486447            DO jm = 1, ncplmodel 
    487448               IF( ssnd(ji)%nid(1,jm) /= -1 ) THEN 
     
    495456      ENDDO 
    496457      DO ji = 1, nrcv 
    497          IF (srcv(ji)%laction ) THEN 
     458         IF(srcv(ji)%laction ) THEN 
    498459            DO jm = 1, ncplmodel 
    499460               IF( srcv(ji)%nid(1,jm) /= -1 ) THEN 
     
    529490      ! 
    530491      DEALLOCATE( exfld ) 
    531       IF (nstop == 0) THEN 
     492      IF(nstop == 0) THEN 
    532493         CALL oasis_terminate( nerror )          
    533494      ELSE 
Note: See TracChangeset for help on using the changeset viewer.