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 1553 – NEMO

Changeset 1553


Ignore:
Timestamp:
2009-07-29T12:29:21+02:00 (15 years ago)
Author:
ctlod
Message:

add an option to control the global freshwater budget emp in sbcfwb.F90, see ticket: #501

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/SBC/sbcfwb.F90

    r1245 r1553  
    77   !!            8.5  !  02-06  (G. Madec)  F90: Free form and module 
    88   !!            9.0  !  06-08  (G. Madec)  Surface module 
     9   !!            9.2  !  09-07  (C. Talandier) emp mean s spread over erp area  
    910   !!---------------------------------------------------------------------- 
    1011 
     
    1819   USE phycst          ! physical constants 
    1920   USE sbcrnf          ! ocean runoffs 
     21   USE sbcssr          ! SS damping terms 
    2022   USE daymod          ! calendar 
    2123   USE in_out_manager  ! I/O manager 
    2224   USE lib_mpp         ! distribued memory computing library 
     25   USE lbclnk          ! ocean lateral boundary conditions 
    2326 
    2427   IMPLICIT NONE 
     
    5457      !!                =1 global mean of emp set to zero at each nn_fsbc time step 
    5558      !!                =2 annual global mean corrected from previous year 
     59      !!                =3 global mean of emp set to zero at each nn_fsbc time step 
     60      !!                   & spread out over erp area depending its sign 
    5661      !!---------------------------------------------------------------------- 
    5762      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index 
     
    6267      INTEGER  ::   ikty, iyear           !  
    6368      CHARACTER (len=32) ::   clname  
    64       REAL(wp) ::   z_emp                 ! temporary scalars 
     69      REAL(wp) ::   z_emp, z_emp_nsrf       ! temporary scalars 
     70      REAL(wp) ::   zsurf_neg, zsurf_pos, zsurf_tospread 
     71      REAL(wp), DIMENSION(jpi,jpj) ::   ztmsk_neg, ztmsk_pos, ztmsk_tospread 
     72      REAL(wp), DIMENSION(jpi,jpj) ::   z_wgt, zerp_cor 
    6573      !!---------------------------------------------------------------------- 
    6674      ! 
     
    7381            IF( kn_fwb == 1 )   WRITE(numout,*) '          instantaneously set to zero' 
    7482            IF( kn_fwb == 2 )   WRITE(numout,*) '          adjusted from previous year budget' 
     83            IF( kn_fwb == 3 )   WRITE(numout,*) '          set to zero and spread out over erp area' 
    7584         ENDIF 
    7685         ! 
     
    142151         ENDIF 
    143152         ! 
     153      CASE ( 3 )                               ! global emp set to zero and spread out over erp area 
     154         ! 
     155         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN 
     156            ! Select <0 and >0 area of erp 
     157            ztmsk_pos(:,:) = tmask_i(:,:) 
     158            WHERE( erp < 0.e0 ) ztmsk_pos = 0.e0 
     159            ztmsk_neg(:,:) = tmask_i(:,:) - ztmsk_pos(:,:) 
     160 
     161            ! Area filled by <0 and >0 erp  
     162            zsurf_neg = SUM( e1e2_i(:,:)*ztmsk_neg(:,:) ) 
     163            zsurf_pos = SUM( e1e2_i(:,:)*ztmsk_pos(:,:) ) 
     164         
     165            ! emp global mean  
     166            z_emp = SUM( e1e2_i(:,:) * emp(:,:) ) / area 
     167            ! 
     168            IF( lk_mpp )   CALL  mpp_sum( z_emp ) 
     169             
     170            IF( z_emp < 0.e0 ) THEN 
     171                ! to spread out over >0 erp area to increase evaporation damping process 
     172                zsurf_tospread = zsurf_pos 
     173                ztmsk_tospread(:,:) = ztmsk_pos(:,:) 
     174            ELSE 
     175                ! to spread out over <0 erp area to increase precipitation damping process 
     176                zsurf_tospread = zsurf_neg 
     177                ztmsk_tospread(:,:) = ztmsk_neg(:,:) 
     178            ENDIF 
     179 
     180            ! emp global mean over <0 or >0 erp area 
     181            z_emp_nsrf = SUM( e1e2_i(:,:) * z_emp ) / ( zsurf_tospread + rsmall ) 
     182            ! weight to respect erp field 2D structure  
     183            z_wgt(:,:) = ztmsk_tospread(:,:) * erp(:,:) / ( SUM( ztmsk_tospread(:,:) * erp(:,:) * e1e2_i(:,:) ) + rsmall ) 
     184            ! final correction term to apply 
     185            zerp_cor(:,:) = -1. * z_emp_nsrf * zsurf_tospread * z_wgt(:,:) 
     186 
     187            CALL lbc_lnk( zerp_cor, 'T', 1. ) 
     188 
     189            emp (:,:) = emp (:,:) + zerp_cor(:,:) 
     190            emps(:,:) = emps(:,:) + zerp_cor(:,:) 
     191            erp (:,:) = erp (:,:) + zerp_cor(:,:) 
     192             
     193            IF( nprint == 1 .AND. lwp ) THEN 
     194               IF( z_emp < 0.e0 ) THEN 
     195                  WRITE(numout,*)'       z_emp < 0' 
     196                  WRITE(numout,*)'       SUM(erp+)        = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2_i(:,:) )*1.e-3,' m3.s-1' 
     197               ELSE 
     198                   WRITE(numout,*)'      z_emp >= 0' 
     199                   WRITE(numout,*)'      SUM(erp-)        = ', SUM( ztmsk_tospread(:,:)*erp(:,:)*e1e2_i(:,:) )*1.e-3,' m3.s-1' 
     200               ENDIF 
     201               WRITE(numout,*)'      SUM(empG)        = ', SUM( z_emp*e1e2_i(:,:) )*1.e-3,' m3.s-1' 
     202               WRITE(numout,*)'      z_emp            = ', z_emp      ,' mm.s-1' 
     203               WRITE(numout,*)'      z_emp_nsrf       = ', z_emp_nsrf ,' mm.s-1' 
     204               WRITE(numout,*)'      MIN(zerp_cor)    = ', MINVAL(zerp_cor)  
     205               WRITE(numout,*)'      MAX(zerp_cor)    = ', MAXVAL(zerp_cor)  
     206            ENDIF 
     207            ! 
     208         ENDIF 
     209         ! 
    144210      CASE DEFAULT    ! you should never be there 
    145211         WRITE(ctmp1,*)'sbc_fwb : nn_fwb = ', kn_fwb, ' is not permitted for the FreshWater Budget correction, choose either 1/2' 
Note: See TracChangeset for help on using the changeset viewer.