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 6808 for branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90 – NEMO

Ignore:
Timestamp:
2016-07-19T10:38:35+02:00 (8 years ago)
Author:
jamesharle
Message:

merge with trunk@6232 for consistency with SSB code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r5549_BDY_ZEROGRAD/NEMOGCM/NEMO/OPA_SRC/DOM/dommsk.F90

    r5506 r6808  
    77   !!            6.0  ! 1993-03  (M. Guyon)  symetrical conditions (M. Guyon) 
    88   !!            7.0  ! 1996-01  (G. Madec)  suppression of common work arrays 
    9    !!             -   ! 1996-05  (G. Madec)  mask computed from tmask and sup- 
    10    !!                 !                      pression of the double computation of bmask 
     9   !!             -   ! 1996-05  (G. Madec)  mask computed from tmask 
    1110   !!            8.0  ! 1997-02  (G. Madec)  mesh information put in domhgr.F 
    1211   !!            8.1  ! 1997-07  (G. Madec)  modification of mbathy and fmask 
     
    1716   !!             -   ! 2005-11  (V. Garnier) Surface pressure gradient organization 
    1817   !!            3.2  ! 2009-07  (R. Benshila) Suppression of rigid-lid option 
     18   !!            3.6  ! 2015-05  (P. Mathiot) ISF: add wmask,wumask and wvmask 
    1919   !!---------------------------------------------------------------------- 
    2020 
    2121   !!---------------------------------------------------------------------- 
    2222   !!   dom_msk        : compute land/ocean mask 
    23    !!   dom_msk_nsa    : update land/ocean mask when no-slip accurate option is used. 
    2423   !!---------------------------------------------------------------------- 
    2524   USE oce             ! ocean dynamics and tracers 
    2625   USE dom_oce         ! ocean space and time domain 
     26   ! 
    2727   USE in_out_manager  ! I/O manager 
    2828   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    29    USE lib_mpp 
    30    USE dynspg_oce      ! choice/control of key cpp for surface pressure gradient 
     29   USE lib_mpp         ! 
    3130   USE wrk_nemo        ! Memory allocation 
    3231   USE timing          ! Timing 
     
    3534   PRIVATE 
    3635 
    37    PUBLIC   dom_msk         ! routine called by inidom.F90 
    38    PUBLIC   dom_msk_alloc   ! routine called by nemogcm.F90 
     36   PUBLIC   dom_msk    ! routine called by inidom.F90 
    3937 
    4038   !                            !!* Namelist namlbc : lateral boundary condition * 
     
    4341   !                                            with analytical eqs. 
    4442 
    45  
    46    INTEGER, ALLOCATABLE, SAVE, DIMENSION(:,:) ::  icoord ! Workspace for dom_msk_nsa() 
    47  
    4843   !! * Substitutions 
    4944#  include "vectopt_loop_substitute.h90" 
     
    5449   !!---------------------------------------------------------------------- 
    5550CONTAINS 
    56     
    57    INTEGER FUNCTION dom_msk_alloc() 
    58       !!--------------------------------------------------------------------- 
    59       !!                 ***  FUNCTION dom_msk_alloc  *** 
    60       !!--------------------------------------------------------------------- 
    61       dom_msk_alloc = 0 
    62 #if defined key_noslip_accurate 
    63       ALLOCATE(icoord(jpi*jpj*jpk,3), STAT=dom_msk_alloc) 
    64 #endif 
    65       IF( dom_msk_alloc /= 0 )   CALL ctl_warn('dom_msk_alloc: failed to allocate icoord array') 
    66       ! 
    67    END FUNCTION dom_msk_alloc 
    68  
    6951 
    7052   SUBROUTINE dom_msk 
     
    7355      !! 
    7456      !! ** Purpose :   Compute land/ocean mask arrays at tracer points, hori- 
    75       !!      zontal velocity points (u & v), vorticity points (f) and baro- 
    76       !!      tropic stream function  points (b). 
     57      !!      zontal velocity points (u & v), vorticity points (f) points. 
    7758      !! 
    7859      !! ** Method  :   The ocean/land mask is computed from the basin bathy- 
     
    9273      !!                1. IF mbathy( ji ,jj) and mbathy( ji ,jj+1) 
    9374      !!                  and mbathy(ji+1,jj) and mbathy(ji+1,jj+1) >= jk. 
    94       !!      b-point : the same definition as for f-point of the first ocean 
    95       !!                level (surface level) but with 0 along coastlines. 
    9675      !!      tmask_i : interior ocean mask at t-point, i.e. excluding duplicated 
    9776      !!                rows/lines due to cyclic or North Fold boundaries as well 
     
    10786      !! 
    10887      !!      N.B. If nperio not equal to 0, the land/ocean mask arrays 
    109       !!      are defined with the proper value at lateral domain boundaries, 
    110       !!      but bmask. indeed, bmask defined the domain over which the 
    111       !!      barotropic stream function is computed. this domain cannot 
    112       !!      contain identical columns because the matrix associated with 
    113       !!      the barotropic stream function equation is then no more inverti- 
    114       !!      ble. therefore bmask is set to 0 along lateral domain boundaries 
    115       !!      even IF nperio is not zero. 
     88      !!      are defined with the proper value at lateral domain boundaries. 
    11689      !! 
    11790      !!      In case of open boundaries (lk_bdy=T): 
    11891      !!        - tmask is set to 1 on the points to be computed bay the open 
    11992      !!          boundaries routines. 
    120       !!        - bmask is  set to 0 on the open boundaries. 
    12193      !! 
    12294      !! ** Action :   tmask    : land/ocean mask at t-point (=0. or 1.) 
     
    12597      !!               fmask    : land/ocean mask at f-point (=0. or 1.) 
    12698      !!                          =rn_shlat along lateral boundaries 
    127       !!               bmask    : land/ocean mask at barotropic stream 
    128       !!                          function point (=0. or 1.) and set to 0 along lateral boundaries 
    12999      !!               tmask_i  : interior ocean mask 
    130100      !!---------------------------------------------------------------------- 
    131       ! 
    132       INTEGER  ::   ji, jj, jk      ! dummy loop indices 
     101      INTEGER  ::   ji, jj, jk               ! dummy loop indices 
    133102      INTEGER  ::   iif, iil, ii0, ii1, ii   ! local integers 
    134103      INTEGER  ::   ijf, ijl, ij0, ij1       !   -       - 
     
    199168      END DO   
    200169 
    201 !!gm  ???? 
    202 #if defined key_zdfkpp 
    203       IF( cp_cfg == 'orca' ) THEN 
    204          IF( jp_cfg == 2 )   THEN       ! land point on Bab el Mandeb zonal section 
    205             ij0 =  87   ;   ij1 =  88 
    206             ii0 = 160   ;   ii1 = 161 
    207             tmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 0._wp 
    208          ELSE 
    209             IF(lwp) WRITE(numout,*) 
    210             IF(lwp) WRITE(numout,cform_war) 
    211             IF(lwp) WRITE(numout,*) 
    212             IF(lwp) WRITE(numout,*)'          A mask must be applied on Bab el Mandeb strait' 
    213             IF(lwp) WRITE(numout,*)'          in case of ORCAs configurations' 
    214             IF(lwp) WRITE(numout,*)'          This is a problem which is not yet solved' 
    215             IF(lwp) WRITE(numout,*) 
    216          ENDIF 
    217       ENDIF 
    218 #endif 
    219 !!gm end 
    220  
    221170      ! Interior domain mask (used for global sum) 
    222171      ! -------------------- 
    223172      tmask_i(:,:) = ssmask(:,:)            ! (ISH) tmask_i = 1 even on the ice shelf 
     173 
     174      tmask_h(:,:) = 1._wp                 ! 0 on the halo and 1 elsewhere 
    224175      iif = jpreci                         ! ??? 
    225176      iil = nlci - jpreci + 1 
     
    227178      ijl = nlcj - jprecj + 1 
    228179 
    229       tmask_i( 1 :iif,   :   ) = 0._wp      ! first columns 
    230       tmask_i(iil:jpi,   :   ) = 0._wp      ! last  columns (including mpp extra columns) 
    231       tmask_i(   :   , 1 :ijf) = 0._wp      ! first rows 
    232       tmask_i(   :   ,ijl:jpj) = 0._wp      ! last  rows (including mpp extra rows) 
     180      tmask_h( 1 :iif,   :   ) = 0._wp      ! first columns 
     181      tmask_h(iil:jpi,   :   ) = 0._wp      ! last  columns (including mpp extra columns) 
     182      tmask_h(   :   , 1 :ijf) = 0._wp      ! first rows 
     183      tmask_h(   :   ,ijl:jpj) = 0._wp      ! last  rows (including mpp extra rows) 
    233184 
    234185      ! north fold mask 
     
    241192         IF( mjg(nlej) == jpjglo ) THEN                  ! only half of the nlcj-1 row 
    242193            DO ji = iif+1, iil-1 
    243                tmask_i(ji,nlej-1) = tmask_i(ji,nlej-1) * tpol(mig(ji)) 
     194               tmask_h(ji,nlej-1) = tmask_h(ji,nlej-1) * tpol(mig(ji)) 
    244195            END DO 
    245196         ENDIF 
    246197      ENDIF 
     198      
     199      tmask_i(:,:) = tmask_i(:,:) * tmask_h(:,:) 
     200 
    247201      IF( jperio == 5 .OR. jperio == 6 ) THEN      ! F-point pivot 
    248202         tpol(     1    :jpiglo) = 0._wp 
     
    264218         END DO 
    265219      END DO 
    266       ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet u point 
     220      ! (ISF) MIN(1,SUM(umask)) is here to check if you have effectively at least 1 wet cell at u point 
    267221      DO jj = 1, jpjm1 
    268222         DO ji = 1, fs_jpim1   ! vector loop 
    269             umask_i(ji,jj)  = ssmask(ji,jj) * ssmask(ji+1,jj  )  * MIN(1._wp,SUM(umask(ji,jj,:))) 
    270             vmask_i(ji,jj)  = ssmask(ji,jj) * ssmask(ji  ,jj+1)  * MIN(1._wp,SUM(vmask(ji,jj,:))) 
     223            ssumask(ji,jj)  = ssmask(ji,jj) * ssmask(ji+1,jj  )  * MIN(1._wp,SUM(umask(ji,jj,:))) 
     224            ssvmask(ji,jj)  = ssmask(ji,jj) * ssmask(ji  ,jj+1)  * MIN(1._wp,SUM(vmask(ji,jj,:))) 
    271225         END DO 
    272226         DO ji = 1, jpim1      ! NO vector opt. 
    273             fmask_i(ji,jj) =  ssmask(ji,jj  ) * ssmask(ji+1,jj  )   & 
     227            ssfmask(ji,jj) =  ssmask(ji,jj  ) * ssmask(ji+1,jj  )   & 
    274228               &            * ssmask(ji,jj+1) * ssmask(ji+1,jj+1) * MIN(1._wp,SUM(fmask(ji,jj,:))) 
    275229         END DO 
    276230      END DO 
    277       CALL lbc_lnk( umask, 'U', 1._wp )      ! Lateral boundary conditions 
    278       CALL lbc_lnk( vmask, 'V', 1._wp ) 
    279       CALL lbc_lnk( fmask, 'F', 1._wp ) 
    280       CALL lbc_lnk( umask_i, 'U', 1._wp )      ! Lateral boundary conditions 
    281       CALL lbc_lnk( vmask_i, 'V', 1._wp ) 
    282       CALL lbc_lnk( fmask_i, 'F', 1._wp ) 
     231      CALL lbc_lnk( umask  , 'U', 1._wp )      ! Lateral boundary conditions 
     232      CALL lbc_lnk( vmask  , 'V', 1._wp ) 
     233      CALL lbc_lnk( fmask  , 'F', 1._wp ) 
     234      CALL lbc_lnk( ssumask, 'U', 1._wp )      ! Lateral boundary conditions 
     235      CALL lbc_lnk( ssvmask, 'V', 1._wp ) 
     236      CALL lbc_lnk( ssfmask, 'F', 1._wp ) 
    283237 
    284238      ! 3. Ocean/land mask at wu-, wv- and w points  
    285239      !---------------------------------------------- 
    286       wmask (:,:,1) = tmask(:,:,1) ! ???????? 
    287       wumask(:,:,1) = umask(:,:,1) ! ???????? 
    288       wvmask(:,:,1) = vmask(:,:,1) ! ???????? 
    289       DO jk=2,jpk 
    290          wmask (:,:,jk)=tmask(:,:,jk) * tmask(:,:,jk-1) 
    291          wumask(:,:,jk)=umask(:,:,jk) * umask(:,:,jk-1)    
    292          wvmask(:,:,jk)=vmask(:,:,jk) * vmask(:,:,jk-1) 
     240      wmask (:,:,1) = tmask(:,:,1)     ! surface 
     241      wumask(:,:,1) = umask(:,:,1) 
     242      wvmask(:,:,1) = vmask(:,:,1) 
     243      DO jk = 2, jpk                   ! interior values 
     244         wmask (:,:,jk) = tmask(:,:,jk) * tmask(:,:,jk-1) 
     245         wumask(:,:,jk) = umask(:,:,jk) * umask(:,:,jk-1)    
     246         wvmask(:,:,jk) = vmask(:,:,jk) * vmask(:,:,jk-1) 
    293247      END DO 
    294248 
    295       ! 4. ocean/land mask for the elliptic equation 
    296       ! -------------------------------------------- 
    297       bmask(:,:) = ssmask(:,:)       ! elliptic equation is written at t-point 
    298       ! 
    299       !                               ! Boundary conditions 
    300       !                                    ! cyclic east-west : bmask must be set to 0. on rows 1 and jpi 
    301       IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 ) THEN 
    302          bmask( 1 ,:) = 0._wp 
    303          bmask(jpi,:) = 0._wp 
    304       ENDIF 
    305       IF( nperio == 2 ) THEN               ! south symmetric :  bmask must be set to 0. on row 1 
    306          bmask(:, 1 ) = 0._wp 
    307       ENDIF 
    308       !                                    ! north fold :  
    309       IF( nperio == 3 .OR. nperio == 4 ) THEN   ! T-pt pivot : bmask set to 0. on row jpj and on half jpjglo-1 row 
    310          DO ji = 1, jpi                       
    311             ii = ji + nimpp - 1 
    312             bmask(ji,jpj-1) = bmask(ji,jpj-1) * tpol(ii) 
    313             bmask(ji,jpj  ) = 0._wp 
    314          END DO 
    315       ENDIF 
    316       IF( nperio == 5 .OR. nperio == 6 ) THEN   ! F-pt pivot and T-pt elliptic eq. : bmask set to 0. on row jpj 
    317          bmask(:,jpj) = 0._wp 
    318       ENDIF 
    319       ! 
    320       IF( lk_mpp ) THEN                    ! mpp specificities 
    321          !                                      ! bmask is set to zero on the overlap region 
    322          IF( nbondi /= -1 .AND. nbondi /= 2 )   bmask(  1 :jpreci,:) = 0._wp 
    323          IF( nbondi /=  1 .AND. nbondi /= 2 )   bmask(nlci:jpi   ,:) = 0._wp 
    324          IF( nbondj /= -1 .AND. nbondj /= 2 )   bmask(:,  1 :jprecj) = 0._wp 
    325          IF( nbondj /=  1 .AND. nbondj /= 2 )   bmask(:,nlcj:jpj   ) = 0._wp 
    326          ! 
    327          IF( npolj == 3 .OR. npolj == 4 ) THEN  ! north fold : bmask must be set to 0. on rows jpj-1 and jpj 
    328             DO ji = 1, nlci 
    329                ii = ji + nimpp - 1 
    330                bmask(ji,nlcj-1) = bmask(ji,nlcj-1) * tpol(ii) 
    331                bmask(ji,nlcj  ) = 0._wp 
    332             END DO 
    333          ENDIF 
    334          IF( npolj == 5 .OR. npolj == 6 ) THEN  ! F-pt pivot and T-pt elliptic eq. : bmask set to 0. on row jpj 
    335             DO ji = 1, nlci 
    336                bmask(ji,nlcj  ) = 0._wp 
    337             END DO 
    338          ENDIF 
    339       ENDIF 
    340  
    341  
    342       ! mask for second order calculation of vorticity 
    343       ! ---------------------------------------------- 
    344       CALL dom_msk_nsa 
    345  
    346        
    347249      ! Lateral boundary conditions on velocity (modify fmask) 
    348250      ! ---------------------------------------      
     
    377279      IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN   ! ORCA_R2 configuration 
    378280         !                                                 ! Increased lateral friction near of some straits 
    379          IF( nn_cla == 0 ) THEN 
    380             !                                ! Gibraltar strait  : partial slip (fmask=0.5) 
    381             ij0 = 101   ;   ij1 = 101 
    382             ii0 = 139   ;   ii1 = 140   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
    383             ij0 = 102   ;   ij1 = 102 
    384             ii0 = 139   ;   ii1 = 140   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
    385             ! 
    386             !                                ! Bab el Mandeb : partial slip (fmask=1) 
    387             ij0 =  87   ;   ij1 =  88 
    388             ii0 = 160   ;   ii1 = 160   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
    389             ij0 =  88   ;   ij1 =  88 
    390             ii0 = 159   ;   ii1 = 159   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
    391             ! 
    392          ENDIF 
     281         !                                ! Gibraltar strait  : partial slip (fmask=0.5) 
     282         ij0 = 101   ;   ij1 = 101 
     283         ii0 = 139   ;   ii1 = 140   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
     284         ij0 = 102   ;   ij1 = 102 
     285         ii0 = 139   ;   ii1 = 140   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp 
     286         ! 
     287         !                                ! Bab el Mandeb : partial slip (fmask=1) 
     288         ij0 =  87   ;   ij1 =  88 
     289         ii0 = 160   ;   ii1 = 160   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
     290         ij0 =  88   ;   ij1 =  88 
     291         ii0 = 159   ;   ii1 = 159   ;   fmask( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp 
     292         ! 
    393293         !                                ! Danish straits  : strong slip (fmask > 2) 
    394294! We keep this as an example but it is instable in this case  
     
    413313         IF(lwp) WRITE(numout,*) '      Gibraltar ' 
    414314         ii0 = 282           ;   ii1 = 283        ! Gibraltar Strait  
    415          ij0 = 201 + isrow   ;   ij1 = 241 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
     315         ij0 = 241 - isrow   ;   ij1 = 241 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
    416316 
    417317         IF(lwp) WRITE(numout,*) '      Bhosporus ' 
    418318         ii0 = 314           ;   ii1 = 315        ! Bhosporus Strait  
    419          ij0 = 208 + isrow   ;   ij1 = 248 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
     319         ij0 = 248 - isrow   ;   ij1 = 248 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
    420320 
    421321         IF(lwp) WRITE(numout,*) '      Makassar (Top) ' 
    422322         ii0 =  48           ;   ii1 =  48        ! Makassar Strait (Top)  
    423          ij0 = 149 + isrow   ;   ij1 = 190 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
     323         ij0 = 189 - isrow   ;   ij1 = 190 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
    424324 
    425325         IF(lwp) WRITE(numout,*) '      Lombok ' 
    426326         ii0 =  44           ;   ii1 =  44        ! Lombok Strait  
    427          ij0 = 124 + isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
     327         ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
    428328 
    429329         IF(lwp) WRITE(numout,*) '      Ombai ' 
    430330         ii0 =  53           ;   ii1 =  53        ! Ombai Strait  
    431          ij0 = 124 + isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
     331         ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
    432332 
    433333         IF(lwp) WRITE(numout,*) '      Timor Passage ' 
    434334         ii0 =  56           ;   ii1 =  56        ! Timor Passage  
    435          ij0 = 124 + isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
     335         ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp   
    436336 
    437337         IF(lwp) WRITE(numout,*) '      West Halmahera ' 
    438338         ii0 =  58           ;   ii1 =  58        ! West Halmahera Strait  
    439          ij0 = 141 + isrow   ;   ij1 = 182 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
     339         ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
    440340 
    441341         IF(lwp) WRITE(numout,*) '      East Halmahera ' 
    442342         ii0 =  55           ;   ii1 =  55        ! East Halmahera Strait  
    443          ij0 = 141 + isrow   ;   ij1 = 182 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
     343         ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   fmask( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp   
    444344         ! 
    445345      ENDIF 
    446346      ! 
    447347      CALL lbc_lnk( fmask, 'F', 1._wp )      ! Lateral boundary conditions on fmask 
    448  
     348      ! 
    449349      ! CAUTION : The fmask may be further modified in dyn_vor_init ( dynvor.F90 ) 
    450              
    451       IF( nprint == 1 .AND. lwp ) THEN      ! Control print 
    452          imsk(:,:) = INT( tmask_i(:,:) ) 
    453          WRITE(numout,*) ' tmask_i : ' 
    454          CALL prihin( imsk(:,:), jpi, jpj, 1, jpi, 1,   & 
    455                &                           1, jpj, 1, 1, numout) 
    456          WRITE (numout,*) 
    457          WRITE (numout,*) ' dommsk: tmask for each level' 
    458          WRITE (numout,*) ' ----------------------------' 
    459          DO jk = 1, jpk 
    460             imsk(:,:) = INT( tmask(:,:,jk) ) 
    461  
    462             WRITE(numout,*) 
    463             WRITE(numout,*) ' level = ',jk 
    464             CALL prihin( imsk(:,:), jpi, jpj, 1, jpi, 1,   & 
    465                &                              1, jpj, 1, 1, numout) 
    466          END DO 
    467          WRITE(numout,*) 
    468          WRITE(numout,*) ' dom_msk: vmask for each level' 
    469          WRITE(numout,*) ' -----------------------------' 
    470          DO jk = 1, jpk 
    471             imsk(:,:) = INT( vmask(:,:,jk) ) 
    472             WRITE(numout,*) 
    473             WRITE(numout,*) ' level = ',jk 
    474             CALL prihin( imsk(:,:), jpi, jpj, 1, jpi, 1,   & 
    475                &                              1, jpj, 1, 1, numout) 
    476          END DO 
    477          WRITE(numout,*) 
    478          WRITE(numout,*) ' dom_msk: fmask for each level' 
    479          WRITE(numout,*) ' -----------------------------' 
    480          DO jk = 1, jpk 
    481             imsk(:,:) = INT( fmask(:,:,jk) ) 
    482             WRITE(numout,*) 
    483             WRITE(numout,*) ' level = ',jk 
    484             CALL prihin( imsk(:,:), jpi, jpj, 1, jpi, 1,   & 
    485                &                              1, jpj, 1, 1, numout ) 
    486          END DO 
    487          WRITE(numout,*) 
    488          WRITE(numout,*) ' dom_msk: bmask ' 
    489          WRITE(numout,*) ' ---------------' 
    490          WRITE(numout,*) 
    491          imsk(:,:) = INT( bmask(:,:) ) 
    492          CALL prihin( imsk(:,:), jpi, jpj, 1, jpi, 1,   & 
    493             &                              1, jpj, 1, 1, numout ) 
    494       ENDIF 
    495350      ! 
    496351      CALL wrk_dealloc( jpi, jpj, imsk ) 
     
    500355      ! 
    501356   END SUBROUTINE dom_msk 
    502  
    503 #if defined key_noslip_accurate 
    504    !!---------------------------------------------------------------------- 
    505    !!   'key_noslip_accurate' :         accurate no-slip boundary condition 
    506    !!---------------------------------------------------------------------- 
    507     
    508    SUBROUTINE dom_msk_nsa 
    509       !!--------------------------------------------------------------------- 
    510       !!                 ***  ROUTINE dom_msk_nsa  *** 
    511       !!  
    512       !! ** Purpose : 
    513       !! 
    514       !! ** Method  : 
    515       !! 
    516       !! ** Action : 
    517       !!---------------------------------------------------------------------- 
    518       INTEGER  ::   ji, jj, jk, jl      ! dummy loop indices 
    519       INTEGER  ::   ine, inw, ins, inn, itest, ierror, iind, ijnd 
    520       REAL(wp) ::   zaa 
    521       !!--------------------------------------------------------------------- 
    522       ! 
    523       IF( nn_timing == 1 )  CALL timing_start('dom_msk_nsa') 
    524       ! 
    525       IF(lwp) WRITE(numout,*) 
    526       IF(lwp) WRITE(numout,*) 'dom_msk_nsa : noslip accurate boundary condition' 
    527       IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   using Schchepetkin and O Brian scheme' 
    528       IF( lk_mpp )   CALL ctl_stop( ' mpp version is not yet implemented' ) 
    529  
    530       ! mask for second order calculation of vorticity 
    531       ! ---------------------------------------------- 
    532       ! noslip boundary condition: fmask=1  at convex corner, store 
    533       ! index of straight coast meshes ( 'west', refering to a coast, 
    534       ! means west of the ocean, aso) 
    535        
    536       DO jk = 1, jpk 
    537          DO jl = 1, 4 
    538             npcoa(jl,jk) = 0 
    539             DO ji = 1, 2*(jpi+jpj) 
    540                nicoa(ji,jl,jk) = 0 
    541                njcoa(ji,jl,jk) = 0 
    542             END DO 
    543          END DO 
    544       END DO 
    545        
    546       IF( jperio == 2 ) THEN 
    547          WRITE(numout,*) ' ' 
    548          WRITE(numout,*) ' symetric boundary conditions need special' 
    549          WRITE(numout,*) ' treatment not implemented. we stop.' 
    550          STOP 
    551       ENDIF 
    552        
    553       ! convex corners 
    554        
    555       DO jk = 1, jpkm1 
    556          DO jj = 1, jpjm1 
    557             DO ji = 1, jpim1 
    558                zaa = tmask(ji  ,jj,jk) + tmask(ji  ,jj+1,jk)   & 
    559                   &+ tmask(ji+1,jj,jk) + tmask(ji+1,jj+1,jk) 
    560                IF( ABS(zaa-3._wp) <= 0.1_wp )   fmask(ji,jj,jk) = 1._wp 
    561             END DO 
    562          END DO 
    563       END DO 
    564  
    565       ! north-south straight coast 
    566  
    567       DO jk = 1, jpkm1 
    568          inw = 0 
    569          ine = 0 
    570          DO jj = 2, jpjm1 
    571             DO ji = 2, jpim1 
    572                zaa = tmask(ji+1,jj,jk) + tmask(ji+1,jj+1,jk) 
    573                IF( ABS(zaa-2._wp) <= 0.1_wp .AND. fmask(ji,jj,jk) == 0._wp ) THEN 
    574                   inw = inw + 1 
    575                   nicoa(inw,1,jk) = ji 
    576                   njcoa(inw,1,jk) = jj 
    577                   IF( nprint == 1 ) WRITE(numout,*) ' west  : ', jk, inw, ji, jj 
    578                ENDIF 
    579                zaa = tmask(ji,jj,jk) + tmask(ji,jj+1,jk) 
    580                IF( ABS(zaa-2._wp) <= 0.1_wp .AND. fmask(ji,jj,jk) == 0._wp ) THEN 
    581                   ine = ine + 1 
    582                   nicoa(ine,2,jk) = ji 
    583                   njcoa(ine,2,jk) = jj 
    584                   IF( nprint == 1 ) WRITE(numout,*) ' east  : ', jk, ine, ji, jj 
    585                ENDIF 
    586             END DO 
    587          END DO 
    588          npcoa(1,jk) = inw 
    589          npcoa(2,jk) = ine 
    590       END DO 
    591  
    592       ! west-east straight coast 
    593  
    594       DO jk = 1, jpkm1 
    595          ins = 0 
    596          inn = 0 
    597          DO jj = 2, jpjm1 
    598             DO ji =2, jpim1 
    599                zaa = tmask(ji,jj+1,jk) + tmask(ji+1,jj+1,jk) 
    600                IF( ABS(zaa-2._wp) <= 0.1_wp .AND. fmask(ji,jj,jk) == 0._wp ) THEN 
    601                   ins = ins + 1 
    602                   nicoa(ins,3,jk) = ji 
    603                   njcoa(ins,3,jk) = jj 
    604                   IF( nprint == 1 ) WRITE(numout,*) ' south : ', jk, ins, ji, jj 
    605                ENDIF 
    606                zaa = tmask(ji+1,jj,jk) + tmask(ji,jj,jk) 
    607                IF( ABS(zaa-2._wp) <= 0.1_wp .AND. fmask(ji,jj,jk) == 0._wp ) THEN 
    608                   inn = inn + 1 
    609                   nicoa(inn,4,jk) = ji 
    610                   njcoa(inn,4,jk) = jj 
    611                   IF( nprint == 1 ) WRITE(numout,*) ' north : ', jk, inn, ji, jj 
    612                ENDIF 
    613             END DO 
    614          END DO 
    615          npcoa(3,jk) = ins 
    616          npcoa(4,jk) = inn 
    617       END DO 
    618  
    619       itest = 2 * ( jpi + jpj ) 
    620       DO jk = 1, jpk 
    621          IF( npcoa(1,jk) > itest .OR. npcoa(2,jk) > itest .OR.   & 
    622              npcoa(3,jk) > itest .OR. npcoa(4,jk) > itest ) THEN 
    623              
    624             WRITE(ctmp1,*) ' level jk = ',jk 
    625             WRITE(ctmp2,*) ' straight coast index arraies are too small.:' 
    626             WRITE(ctmp3,*) ' npe, npw, nps, npn = ', npcoa(1,jk), npcoa(2,jk),   & 
    627                 &                                     npcoa(3,jk), npcoa(4,jk) 
    628             WRITE(ctmp4,*) ' 2*(jpi+jpj) = ',itest,'. we stop.' 
    629             CALL ctl_stop( ctmp1, ctmp2, ctmp3, ctmp4 ) 
    630         ENDIF 
    631       END DO 
    632  
    633       ierror = 0 
    634       iind = 0 
    635       ijnd = 0 
    636       IF( nperio == 1 .OR. nperio == 4 .OR. nperio == 6 )   iind = 2 
    637       IF( nperio == 3 .OR. nperio == 4 .OR. nperio == 5 .OR. nperio == 6 )   ijnd = 2 
    638       DO jk = 1, jpk 
    639          DO jl = 1, npcoa(1,jk) 
    640             IF( nicoa(jl,1,jk)+3 > jpi+iind ) THEN 
    641                ierror = ierror+1 
    642                icoord(ierror,1) = nicoa(jl,1,jk) 
    643                icoord(ierror,2) = njcoa(jl,1,jk) 
    644                icoord(ierror,3) = jk 
    645             ENDIF 
    646          END DO 
    647          DO jl = 1, npcoa(2,jk) 
    648             IF(nicoa(jl,2,jk)-2 < 1-iind ) THEN 
    649                ierror = ierror + 1 
    650                icoord(ierror,1) = nicoa(jl,2,jk) 
    651                icoord(ierror,2) = njcoa(jl,2,jk) 
    652                icoord(ierror,3) = jk 
    653             ENDIF 
    654          END DO 
    655          DO jl = 1, npcoa(3,jk) 
    656             IF( njcoa(jl,3,jk)+3 > jpj+ijnd ) THEN 
    657                ierror = ierror + 1 
    658                icoord(ierror,1) = nicoa(jl,3,jk) 
    659                icoord(ierror,2) = njcoa(jl,3,jk) 
    660                icoord(ierror,3) = jk 
    661             ENDIF 
    662          END DO 
    663          DO jl = 1, npcoa(4,jk) 
    664             IF( njcoa(jl,4,jk)-2 < 1) THEN 
    665                ierror=ierror + 1 
    666                icoord(ierror,1) = nicoa(jl,4,jk) 
    667                icoord(ierror,2) = njcoa(jl,4,jk) 
    668                icoord(ierror,3) = jk 
    669             ENDIF 
    670          END DO 
    671       END DO 
    672        
    673       IF( ierror > 0 ) THEN 
    674          IF(lwp) WRITE(numout,*) 
    675          IF(lwp) WRITE(numout,*) '              Problem on lateral conditions' 
    676          IF(lwp) WRITE(numout,*) '                 Bad marking off at points:' 
    677          DO jl = 1, ierror 
    678             IF(lwp) WRITE(numout,*) 'Level:',icoord(jl,3),   & 
    679                &                  '  Point(',icoord(jl,1),',',icoord(jl,2),')' 
    680          END DO 
    681          CALL ctl_stop( 'We stop...' ) 
    682       ENDIF 
    683       ! 
    684       IF( nn_timing == 1 )  CALL timing_stop('dom_msk_nsa') 
    685       ! 
    686    END SUBROUTINE dom_msk_nsa 
    687  
    688 #else 
    689    !!---------------------------------------------------------------------- 
    690    !!   Default option :                                      Empty routine 
    691    !!---------------------------------------------------------------------- 
    692    SUBROUTINE dom_msk_nsa        
    693    END SUBROUTINE dom_msk_nsa 
    694 #endif 
    695357    
    696358   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.