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 11822 for NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdytra.F90 – NEMO

Ignore:
Timestamp:
2019-10-29T11:41:36+01:00 (4 years ago)
Author:
acc
Message:

Branch 2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps. Sette tested updates to branch to align with trunk changes between 10721 and 11740. Sette tests are passing but results differ from branch before these changes (except for GYRE_PISCES and VORTEX) and branch results already differed from trunk because of algorithmic fixes. Will need more checks to confirm correctness.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10721_KERNEL-02_Storkey_Coward_IMMERSE_first_steps/src/OCE/BDY/bdytra.F90

    r10957 r11822  
    5151      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts,jpt), INTENT(inout) :: pts       ! tracer fields 
    5252      ! 
    53       INTEGER                        :: ib_bdy, jn, igrd   ! Loop indices 
    54       TYPE(ztrabdy), DIMENSION(jpts) :: zdta               ! Temporary data structure 
     53      INTEGER                        :: ib_bdy, jn, igrd, ir   ! Loop indeces 
     54      TYPE(ztrabdy), DIMENSION(jpts) :: zdta                   ! Temporary data structure 
     55      LOGICAL                        :: llrim0                 ! indicate if rim 0 is treated 
     56      LOGICAL, DIMENSION(4)          :: llsend1, llrecv1       ! indicate how communications are to be carried out 
    5557      !!---------------------------------------------------------------------- 
    5658      igrd = 1  
    57  
    58       DO ib_bdy=1, nb_bdy 
     59      llsend1(:) = .false.  ;   llrecv1(:) = .false. 
     60      DO ir = 1, 0, -1   ! treat rim 1 before rim 0 
     61         IF( ir == 0 ) THEN   ;   llrim0 = .TRUE. 
     62         ELSE                 ;   llrim0 = .FALSE. 
     63         END IF 
     64         DO ib_bdy=1, nb_bdy 
     65            ! 
     66            zdta(1)%tra => dta_bdy(ib_bdy)%tem 
     67            zdta(2)%tra => dta_bdy(ib_bdy)%sal 
     68            ! 
     69            DO jn = 1, jpts 
     70               ! 
     71               SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 
     72               CASE('none'        )   ;   CYCLE 
     73               CASE('frs'         )   ! treat the whole boundary at once 
     74                  IF( ir == 0 ) CALL bdy_frs ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
     75               CASE('specified'   )   ! treat the whole rim      at once 
     76                  IF( ir == 0 ) CALL bdy_spe ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
     77               CASE('neumann'     )   ;   CALL bdy_nmn ( idx_bdy(ib_bdy), igrd         , pts(:,:,:,jn,Kaa), llrim0 )   ! tsa masked 
     78               CASE('orlanski'    )   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 
     79                    & zdta(jn)%tra, llrim0, ll_npo=.false. ) 
     80               CASE('orlanski_npo')   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), & 
     81                    & zdta(jn)%tra, llrim0, ll_npo=.true.  ) 
     82               CASE('runoff'      )   ;   CALL bdy_rnf ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), jn, llrim0 ) 
     83               CASE DEFAULT           ;   CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 
     84               END SELECT 
     85               !  
     86            END DO 
     87         END DO 
    5988         ! 
    60          zdta(1)%tra => dta_bdy(ib_bdy)%tem 
    61          zdta(2)%tra => dta_bdy(ib_bdy)%sal 
     89         IF( nn_hls > 1 .AND. ir == 1 ) CYCLE   ! at least 2 halos will be corrected -> no need to correct rim 1 before rim 0 
     90         IF( nn_hls == 1 ) THEN   ;   llsend1(:) = .false.   ;   llrecv1(:) = .false.   ;   END IF 
     91         DO ib_bdy=1, nb_bdy 
     92            SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 
     93            CASE('neumann','runoff') 
     94               llsend1(:) = llsend1(:) .OR. lsend_bdyint(ib_bdy,1,:,ir)   ! possibly every direction, T points 
     95               llrecv1(:) = llrecv1(:) .OR. lrecv_bdyint(ib_bdy,1,:,ir)   ! possibly every direction, T points 
     96            CASE('orlanski', 'orlanski_npo') 
     97               llsend1(:) = llsend1(:) .OR. lsend_bdy(ib_bdy,1,:,ir)   ! possibly every direction, T points 
     98               llrecv1(:) = llrecv1(:) .OR. lrecv_bdy(ib_bdy,1,:,ir)   ! possibly every direction, T points 
     99            END SELECT 
     100         END DO 
     101         IF( ANY(llsend1) .OR. ANY(llrecv1) ) THEN   ! if need to send/recv in at least one direction 
     102            CALL lbc_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T',  1., kfillmode=jpfillnothing ,lsend=llsend1, lrecv=llrecv1 ) 
     103         END IF 
    62104         ! 
    63          DO jn = 1, jpts 
    64             ! 
    65             SELECT CASE( TRIM(cn_tra(ib_bdy)) ) 
    66             CASE('none'        )   ;   CYCLE 
    67             CASE('frs'         )   ;   CALL bdy_frs ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
    68             CASE('specified'   )   ;   CALL bdy_spe ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa), zdta(jn)%tra ) 
    69             CASE('neumann'     )   ;   CALL bdy_nmn ( idx_bdy(ib_bdy), igrd         , pts(:,:,:,jn,Kaa)               ) 
    70             CASE('orlanski'    )   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), zdta(jn)%tra, ll_npo=.false. ) 
    71             CASE('orlanski_npo')   ;   CALL bdy_orl ( idx_bdy(ib_bdy), pts(:,:,:,jn,Kbb), pts(:,:,:,jn,Kaa), zdta(jn)%tra, ll_npo=.true. ) 
    72             CASE('runoff'      )   ;   CALL bdy_rnf ( idx_bdy(ib_bdy),                pts(:,:,:,jn,Kaa),               jn ) 
    73             CASE DEFAULT           ;   CALL ctl_stop( 'bdy_tra : unrecognised option for open boundaries for T and S' ) 
    74             END SELECT 
    75             ! Boundary points should be updated 
    76             CALL lbc_bdy_lnk( 'bdytra', pts(:,:,:,jn,Kaa), 'T', 1., ib_bdy ) 
    77             !  
    78          END DO 
    79       END DO 
     105      END DO   ! ir 
    80106      ! 
    81107   END SUBROUTINE bdy_tra 
    82108 
    83109 
    84    SUBROUTINE bdy_rnf( idx, pt, jpa ) 
     110   SUBROUTINE bdy_rnf( idx, pt, jpa, llrim0 ) 
    85111      !!---------------------------------------------------------------------- 
    86112      !!                 ***  SUBROUTINE bdy_rnf  *** 
     
    91117      !!  
    92118      !!---------------------------------------------------------------------- 
    93       TYPE(OBC_INDEX),                     INTENT(in) ::   idx  ! OBC indices 
    94       REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt  ! tracer trend 
    95       INTEGER,                             INTENT(in) ::   jpa  ! TRA index 
     119      TYPE(OBC_INDEX),                     INTENT(in) ::   idx      ! OBC indices 
     120      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pt       ! tracer trend 
     121      INTEGER,                             INTENT(in) ::   jpa      ! TRA index 
     122      LOGICAL,                             INTENT(in) ::   llrim0   ! indicate if rim 0 is treated 
    96123      ! 
    97       REAL(wp) ::   zwgt           ! boundary weight 
    98       INTEGER  ::   ib, ik, igrd   ! dummy loop indices 
    99       INTEGER  ::   ii, ij, ip, jp ! 2D addresses 
     124      INTEGER  ::   ib, ii, ij, igrd   ! dummy loop indices 
    100125      !!---------------------------------------------------------------------- 
    101126      ! 
    102127      igrd = 1                       ! Everything is at T-points here 
    103       DO ib = 1, idx%nblenrim(igrd) 
    104          ii = idx%nbi(ib,igrd) 
    105          ij = idx%nbj(ib,igrd) 
    106          DO ik = 1, jpkm1 
    107             ip = bdytmask(ii+1,ij  ) - bdytmask(ii-1,ij  ) 
    108             jp = bdytmask(ii  ,ij+1) - bdytmask(ii  ,ij-1) 
    109             if (jpa == jp_tem) pt(ii,ij,ik) = pt(ii+ip,ij+jp,ik) * tmask(ii,ij,ik) 
    110             if (jpa == jp_sal) pt(ii,ij,ik) =                 0.1 * tmask(ii,ij,ik) 
     128      IF(      jpa == jp_tem ) THEN 
     129         CALL bdy_nmn( idx, igrd, pt, llrim0 ) 
     130      ELSE IF( jpa == jp_sal ) THEN 
     131         IF( .NOT. llrim0 )   RETURN 
     132         DO ib = 1, idx%nblenrim(igrd)   ! if llrim0 then treat the whole rim 
     133            ii = idx%nbi(ib,igrd) 
     134            ij = idx%nbj(ib,igrd) 
     135            pt(ii,ij,1:jpkm1) = 0.1 * tmask(ii,ij,1:jpkm1) 
    111136         END DO 
    112       END DO 
     137      END IF 
    113138      ! 
    114139   END SUBROUTINE bdy_rnf 
Note: See TracChangeset for help on using the changeset viewer.