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 6827 for branches/2016/dev_r6409_SIMPLIF_2_usrdef_tools/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90 – NEMO

Ignore:
Timestamp:
2016-08-01T15:37:15+02:00 (8 years ago)
Author:
flavoni
Message:

#1692 - branch SIMPLIF_2_usrdef: commit routines Fortran to create domain_cfg.nc file, to have domain (input) files for new simplification branch. To be moved in TOOLS directory

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_r6409_SIMPLIF_2_usrdef_tools/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90

    r5836 r6827  
    2121   USE phycst          ! physical constants 
    2222   USE in_out_manager  ! I/O manager 
    23    USE sbc_oce         ! ocean surface boundary conditions 
    2423   USE lib_fortran,    ONLY: glob_sum, DDPDD 
    2524   USE lbclnk          ! lateral boundary condition - MPP exchanges 
     
    3130 
    3231   PUBLIC dom_clo      ! routine called by domain module 
    33    PUBLIC sbc_clo      ! routine called by step module 
    34    PUBLIC clo_rnf      ! routine called by sbcrnf module 
    35    PUBLIC clo_ups      ! routine called in traadv_cen2(_jki) module 
    3632   PUBLIC clo_bat      ! routine called in domzgr module 
    3733 
     
    185181 
    186182 
    187    SUBROUTINE sbc_clo( kt ) 
    188       !!--------------------------------------------------------------------- 
    189       !!                  ***  ROUTINE sbc_clo  *** 
    190       !!                     
    191       !! ** Purpose :   Special handling of closed seas 
    192       !! 
    193       !! ** Method  :   Water flux is forced to zero over closed sea 
    194       !!      Excess is shared between remaining ocean, or 
    195       !!      put as run-off in open ocean. 
    196       !! 
    197       !! ** Action  :   emp updated surface freshwater fluxes and associated heat content at kt 
    198       !!---------------------------------------------------------------------- 
    199       INTEGER, INTENT(in) ::   kt   ! ocean model time step 
    200       ! 
    201       INTEGER             ::   ji, jj, jc, jn   ! dummy loop indices 
    202       REAL(wp), PARAMETER ::   rsmall = 1.e-20_wp    ! Closed sea correction epsilon 
    203       REAL(wp)            ::   zze2, ztmp, zcorr     !  
    204       REAL(wp)            ::   zcoef, zcoef1         !  
    205       COMPLEX(wp)         ::   ctmp  
    206       REAL(wp), DIMENSION(jpncs) ::   zfwf   ! 1D workspace 
    207       !!---------------------------------------------------------------------- 
    208       ! 
    209       IF( nn_timing == 1 )  CALL timing_start('sbc_clo') 
    210       !                                                   !------------------! 
    211       IF( kt == nit000 ) THEN                             !  Initialisation  ! 
    212          !                                                !------------------! 
    213          IF(lwp) WRITE(numout,*) 
    214          IF(lwp) WRITE(numout,*)'sbc_clo : closed seas ' 
    215          IF(lwp) WRITE(numout,*)'~~~~~~~' 
    216  
    217          surf(:) = 0.e0_wp 
    218          ! 
    219          surf(jpncs+1) = glob_sum( e1e2t(:,:) )   ! surface of the global ocean 
    220          ! 
    221          !                                        ! surface of closed seas  
    222          IF( lk_mpp_rep ) THEN                         ! MPP reproductible calculation 
    223             DO jc = 1, jpncs 
    224                ctmp = CMPLX( 0.e0, 0.e0, wp ) 
    225                DO jj = ncsj1(jc), ncsj2(jc) 
    226                   DO ji = ncsi1(jc), ncsi2(jc) 
    227                      ztmp = e1e2t(ji,jj) * tmask_i(ji,jj) 
    228                      CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 
    229                   END DO  
    230                END DO  
    231                IF( lk_mpp )   CALL mpp_sum( ctmp ) 
    232                surf(jc) = REAL(ctmp,wp) 
    233             END DO 
    234          ELSE                                          ! Standard calculation            
    235             DO jc = 1, jpncs 
    236                DO jj = ncsj1(jc), ncsj2(jc) 
    237                   DO ji = ncsi1(jc), ncsi2(jc) 
    238                      surf(jc) = surf(jc) + e1e2t(ji,jj) * tmask_i(ji,jj)      ! surface of closed seas 
    239                   END DO  
    240                END DO  
    241             END DO  
    242             IF( lk_mpp )   CALL mpp_sum ( surf, jpncs )       ! mpp: sum over all the global domain 
    243          ENDIF 
    244  
    245          IF(lwp) WRITE(numout,*)'     Closed sea surfaces' 
    246          DO jc = 1, jpncs 
    247             IF(lwp)WRITE(numout,FMT='(1I3,4I4,5X,F16.2)') jc, ncsi1(jc), ncsi2(jc), ncsj1(jc), ncsj2(jc), surf(jc) 
    248          END DO 
    249  
    250          ! jpncs+1 : surface of sea, closed seas excluded 
    251          DO jc = 1, jpncs 
    252             surf(jpncs+1) = surf(jpncs+1) - surf(jc) 
    253          END DO            
    254          ! 
    255       ENDIF 
    256       !                                                   !--------------------! 
    257       !                                                   !  update emp        ! 
    258       zfwf = 0.e0_wp                                      !--------------------! 
    259       IF( lk_mpp_rep ) THEN                         ! MPP reproductible calculation 
    260          DO jc = 1, jpncs 
    261             ctmp = CMPLX( 0.e0, 0.e0, wp ) 
    262             DO jj = ncsj1(jc), ncsj2(jc) 
    263                DO ji = ncsi1(jc), ncsi2(jc) 
    264                   ztmp = e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj) 
    265                   CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 
    266                END DO   
    267             END DO  
    268             IF( lk_mpp )   CALL mpp_sum( ctmp ) 
    269             zfwf(jc) = REAL(ctmp,wp) 
    270          END DO 
    271       ELSE                                          ! Standard calculation            
    272          DO jc = 1, jpncs 
    273             DO jj = ncsj1(jc), ncsj2(jc) 
    274                DO ji = ncsi1(jc), ncsi2(jc) 
    275                   zfwf(jc) = zfwf(jc) + e1e2t(ji,jj) * ( emp(ji,jj)-rnf(ji,jj) ) * tmask_i(ji,jj)  
    276                END DO   
    277             END DO  
    278          END DO 
    279          IF( lk_mpp )   CALL mpp_sum ( zfwf(:) , jpncs )       ! mpp: sum over all the global domain 
    280       ENDIF 
    281  
    282       IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN      ! Black Sea case for ORCA_R2 configuration 
    283          zze2    = ( zfwf(3) + zfwf(4) ) * 0.5_wp 
    284          zfwf(3) = zze2 
    285          zfwf(4) = zze2 
    286       ENDIF 
    287  
    288       zcorr = 0._wp 
    289  
    290       DO jc = 1, jpncs 
    291          ! 
    292          ! The following if avoids the redistribution of the round off 
    293          IF ( ABS(zfwf(jc) / surf(jpncs+1) ) > rsmall) THEN 
    294             ! 
    295             IF( ncstt(jc) == 0 ) THEN           ! water/evap excess is shared by all open ocean 
    296                zcoef    = zfwf(jc) / surf(jpncs+1) 
    297                zcoef1   = rcp * zcoef 
    298                emp(:,:) = emp(:,:) + zcoef 
    299                qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
    300                ! accumulate closed seas correction 
    301                zcorr    = zcorr    + zcoef 
    302                ! 
    303             ELSEIF( ncstt(jc) == 1 ) THEN       ! Excess water in open sea, at outflow location, excess evap shared 
    304                IF ( zfwf(jc) <= 0.e0_wp ) THEN  
    305                    DO jn = 1, ncsnr(jc) 
    306                      ji = mi0(ncsir(jc,jn)) 
    307                      jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean 
    308                      IF (      ji > 1 .AND. ji < jpi   & 
    309                          .AND. jj > 1 .AND. jj < jpj ) THEN  
    310                          zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
    311                          zcoef1     = rcp * zcoef 
    312                          emp(ji,jj) = emp(ji,jj) + zcoef 
    313                          qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
    314                      ENDIF  
    315                    END DO  
    316                ELSE  
    317                    zcoef    = zfwf(jc) / surf(jpncs+1) 
    318                    zcoef1   = rcp * zcoef 
    319                    emp(:,:) = emp(:,:) + zcoef 
    320                    qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
    321                    ! accumulate closed seas correction 
    322                    zcorr    = zcorr    + zcoef 
    323                ENDIF 
    324             ELSEIF( ncstt(jc) == 2 ) THEN       ! Excess e-p-r (either sign) goes to open ocean, at outflow location 
    325                DO jn = 1, ncsnr(jc) 
    326                   ji = mi0(ncsir(jc,jn)) 
    327                   jj = mj0(ncsjr(jc,jn)) ! Location of outflow in open ocean 
    328                   IF(      ji > 1 .AND. ji < jpi    & 
    329                      .AND. jj > 1 .AND. jj < jpj ) THEN  
    330                      zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
    331                      zcoef1     = rcp * zcoef 
    332                      emp(ji,jj) = emp(ji,jj) + zcoef 
    333                      qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
    334                   ENDIF  
    335                END DO  
    336             ENDIF  
    337             ! 
    338             DO jj = ncsj1(jc), ncsj2(jc) 
    339                DO ji = ncsi1(jc), ncsi2(jc) 
    340                   zcoef      = zfwf(jc) / surf(jc) 
    341                   zcoef1     = rcp * zcoef 
    342                   emp(ji,jj) = emp(ji,jj) - zcoef 
    343                   qns(ji,jj) = qns(ji,jj) + zcoef1 * sst_m(ji,jj) 
    344                END DO   
    345             END DO  
    346             ! 
    347          END IF 
    348       END DO  
    349  
    350       IF ( ABS(zcorr) > rsmall ) THEN      ! remove the global correction from the closed seas 
    351          DO jc = 1, jpncs                  ! only if it is large enough 
    352             DO jj = ncsj1(jc), ncsj2(jc) 
    353                DO ji = ncsi1(jc), ncsi2(jc) 
    354                   emp(ji,jj) = emp(ji,jj) - zcorr 
    355                   qns(ji,jj) = qns(ji,jj) + rcp * zcorr * sst_m(ji,jj) 
    356                END DO   
    357              END DO  
    358           END DO 
    359       ENDIF 
    360       ! 
    361       emp (:,:) = emp (:,:) * tmask(:,:,1) 
    362       ! 
    363       CALL lbc_lnk( emp , 'T', 1._wp ) 
    364       ! 
    365       IF( nn_timing == 1 )  CALL timing_stop('sbc_clo') 
    366       ! 
    367    END SUBROUTINE sbc_clo 
    368  
    369  
    370    SUBROUTINE clo_rnf( p_rnfmsk ) 
    371       !!--------------------------------------------------------------------- 
    372       !!                  ***  ROUTINE sbc_rnf  *** 
    373       !!                     
    374       !! ** Purpose :   allow the treatment of closed sea outflow grid-points 
    375       !!                to be the same as river mouth grid-points 
    376       !! 
    377       !! ** Method  :   set to 1 the runoff mask (mskrnf, see sbcrnf module) 
    378       !!                at the closed sea outflow grid-point. 
    379       !! 
    380       !! ** Action  :   update (p_)mskrnf (set 1 at closed sea outflow) 
    381       !!---------------------------------------------------------------------- 
    382       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   p_rnfmsk   ! river runoff mask (rnfmsk array) 
    383       ! 
    384       INTEGER  ::   jc, jn, ji, jj      ! dummy loop indices 
    385       !!---------------------------------------------------------------------- 
    386       ! 
    387       DO jc = 1, jpncs 
    388          IF( ncstt(jc) >= 1 ) THEN            ! runoff mask set to 1 at closed sea outflows 
    389              DO jn = 1, 4 
    390                 DO jj =    mj0( ncsjr(jc,jn) ), mj1( ncsjr(jc,jn) ) 
    391                    DO ji = mi0( ncsir(jc,jn) ), mi1( ncsir(jc,jn) ) 
    392                       p_rnfmsk(ji,jj) = MAX( p_rnfmsk(ji,jj), 1.0_wp ) 
    393                    END DO 
    394                 END DO 
    395             END DO  
    396          ENDIF  
    397       END DO  
    398       ! 
    399    END SUBROUTINE clo_rnf 
    400  
    401     
    402    SUBROUTINE clo_ups( p_upsmsk ) 
    403       !!--------------------------------------------------------------------- 
    404       !!                  ***  ROUTINE sbc_rnf  *** 
    405       !!                     
    406       !! ** Purpose :   allow the treatment of closed sea outflow grid-points 
    407       !!                to be the same as river mouth grid-points 
    408       !! 
    409       !! ** Method  :   set to 0.5 the upstream mask (upsmsk, see traadv_cen2  
    410       !!                module) over the closed seas. 
    411       !! 
    412       !! ** Action  :   update (p_)upsmsk (set 0.5 over closed seas) 
    413       !!---------------------------------------------------------------------- 
    414       REAL(wp), DIMENSION(jpi,jpj), INTENT(inout) ::   p_upsmsk   ! upstream mask (upsmsk array) 
    415       ! 
    416       INTEGER  ::   jc, ji, jj      ! dummy loop indices 
    417       !!---------------------------------------------------------------------- 
    418       ! 
    419       DO jc = 1, jpncs 
    420          DO jj = ncsj1(jc), ncsj2(jc) 
    421             DO ji = ncsi1(jc), ncsi2(jc) 
    422                p_upsmsk(ji,jj) = 0.5_wp         ! mixed upstream/centered scheme over closed seas 
    423             END DO  
    424          END DO  
    425        END DO  
    426        ! 
    427    END SUBROUTINE clo_ups 
    428     
    429        
    430183   SUBROUTINE clo_bat( pbat, kbat ) 
    431184      !!--------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.