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.
sbc_oce.F90 in branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90 @ 7878

Last change on this file since 7878 was 7878, checked in by jcastill, 7 years ago

Add Phillips vertical Stokes drift parameterization as in the HZG wave branch

File size: 16.2 KB
RevLine 
[888]1MODULE sbc_oce
2   !!======================================================================
3   !!                       ***  MODULE  sbc_oce  ***
4   !! Surface module :   variables defined in core memory
5   !!======================================================================
[2528]6   !! History :  3.0  ! 2006-06  (G. Madec)  Original code
7   !!             -   ! 2008-08  (G. Madec)  namsbc moved from sbcmod
8   !!            3.3  ! 2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
9   !!             -   ! 2010-11  (G. Madec) ice-ocean stress always computed at each ocean time-step
10   !!            3.3  ! 2010-10  (J. Chanut, C. Bricaud)  add the surface pressure forcing
[4161]11   !!            4.0  ! 2012-05  (C. Rousset) add attenuation coef for use in ice model
[888]12   !!----------------------------------------------------------------------
13
[2715]14   !!----------------------------------------------------------------------
15   !!   sbc_oce_alloc : allocation of sbc arrays
16   !!   sbc_tau2wnd   : wind speed estimated from wind stress
17   !!----------------------------------------------------------------------
18   USE par_oce        ! ocean parameters
19   USE in_out_manager ! I/O manager
20   USE lib_mpp        ! MPP library
21
[888]22   IMPLICIT NONE
23   PRIVATE
[2715]24
25   PUBLIC   sbc_oce_alloc   ! routine called in sbcmod.F90
26   PUBLIC   sbc_tau2wnd     ! routine called in several sbc modules
[888]27   
28   !!----------------------------------------------------------------------
[1218]29   !!           Namelist for the Ocean Surface Boundary Condition
30   !!----------------------------------------------------------------------
[4147]31   !                                   !!* namsbc namelist *
32   LOGICAL , PUBLIC ::   ln_ana         !: analytical boundary condition flag
33   LOGICAL , PUBLIC ::   ln_flx         !: flux      formulation
34   LOGICAL , PUBLIC ::   ln_blk_clio    !: CLIO bulk formulation
35   LOGICAL , PUBLIC ::   ln_blk_core    !: CORE bulk formulation
36   LOGICAL , PUBLIC ::   ln_blk_mfs     !: MFS  bulk formulation
[4990]37#if defined key_oasis3
[5407]38   LOGICAL , PUBLIC ::   lk_oasis = .TRUE.  !: OASIS used
[4990]39#else
[5407]40   LOGICAL , PUBLIC ::   lk_oasis = .FALSE. !: OASIS unused
[4990]41#endif
[5407]42   LOGICAL , PUBLIC ::   ln_cpl         !: ocean-atmosphere coupled formulation
43   LOGICAL , PUBLIC ::   ln_mixcpl      !: ocean-atmosphere forced-coupled mixed formulation
[7792]44   LOGICAL , PUBLIC ::   ln_wavcpl      !: ocean-wave forced-coupled mixed formulation
45   LOGICAL , PUBLIC ::   ll_purecpl     !: ocean-atmosphere or ocean-wave pure coupled formulation
[4147]46   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr)
[4230]47   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths
[4147]48   LOGICAL , PUBLIC ::   ln_ssr         !: Sea Surface restoring on SST and/or SSS     
49   LOGICAL , PUBLIC ::   ln_apr_dyn     !: Atmospheric pressure forcing used on dynamics (ocean & ice)
50   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3)
[4990]51   INTEGER , PUBLIC ::   nn_isf         !: flag for isf in the surface boundary condition (=0/1/2/3/4)
[4147]52   INTEGER , PUBLIC ::   nn_ice_embd    !: flag for levitating/embedding sea-ice in the ocean
[3625]53   !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect)
54   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect
55   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure)
[5407]56   INTEGER , PUBLIC ::   nn_components  !: flag for sbc module (including sea-ice) coupling mode (see component definition below)
57   INTEGER , PUBLIC ::   nn_limflx      !: LIM3 Multi-category heat flux formulation
[4990]58   !                                             !: =-1  Use of per-category fluxes
59   !                                             !: = 0  Average per-category fluxes
60   !                                             !: = 1  Average then redistribute per-category fluxes
61   !                                             !: = 2  Redistribute a single flux over categories
[4147]62   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:
[1220]63   !                                             !:  = 0 unchecked
64   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step
65   !                                             !:  = 2 annual global mean of e-p-r set to zero
[4147]66   LOGICAL , PUBLIC ::   ln_wave        !: true if some coupling with wave model
67   LOGICAL , PUBLIC ::   ln_cdgw        !: true if neutral drag coefficient from wave model
68   LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d stokes drift from wave model
[7471]69   LOGICAL , PUBLIC ::   ln_tauoc       !: true if normalized stress from wave is used
[7809]70   LOGICAL , PUBLIC ::   ln_phioc       !: true if wave energy to ocean is used
[7471]71   LOGICAL , PUBLIC ::   ln_stcor       !: true if Stokes-Coriolis term is used
[7854]72   INTEGER , PUBLIC ::   nn_drag        ! type of formula to calculate wind stress from wind components
[7878]73   INTEGER , PUBLIC ::   nn_sdrift      ! type of parameterization to calculate vertical Stokes drift
[4147]74   !
75   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs
[4161]76   !
[4990]77   INTEGER , PUBLIC ::   nn_lsm         !: Number of iteration if seaoverland is applied
[1218]78   !!----------------------------------------------------------------------
[4990]79   !!           switch definition (improve readability)
80   !!----------------------------------------------------------------------
[5407]81   INTEGER , PUBLIC, PARAMETER ::   jp_gyre    = 0        !: GYRE analytical               formulation
82   INTEGER , PUBLIC, PARAMETER ::   jp_ana     = 1        !: analytical                    formulation
83   INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux                          formulation
84   INTEGER , PUBLIC, PARAMETER ::   jp_clio    = 3        !: CLIO bulk                     formulation
85   INTEGER , PUBLIC, PARAMETER ::   jp_core    = 4        !: CORE bulk                     formulation
86   INTEGER , PUBLIC, PARAMETER ::   jp_purecpl = 5        !: Pure ocean-atmosphere Coupled formulation
87   INTEGER , PUBLIC, PARAMETER ::   jp_mfs     = 6        !: MFS  bulk                     formulation
88   INTEGER , PUBLIC, PARAMETER ::   jp_none    = 7        !: for OPA when doing coupling via SAS module
[4990]89   INTEGER , PUBLIC, PARAMETER ::   jp_esopa   = -1       !: esopa test, ALL formulations
90   
91   !!----------------------------------------------------------------------
[5407]92   !!           component definition
93   !!----------------------------------------------------------------------
94   INTEGER , PUBLIC, PARAMETER ::   jp_iam_nemo = 0      !: Initial single executable configuration
95                                                         !  (no internal OASIS coupling)
96   INTEGER , PUBLIC, PARAMETER ::   jp_iam_opa  = 1      !: Multi executable configuration - OPA component
97                                                         !  (internal OASIS coupling)
98   INTEGER , PUBLIC, PARAMETER ::   jp_iam_sas  = 2      !: Multi executable configuration - SAS component
99                                                         !  (internal OASIS coupling)
100   !!----------------------------------------------------------------------
[7854]101   !!           wind stress definition
102   !!----------------------------------------------------------------------
103   INTEGER, PUBLIC, PARAMETER ::   jp_ukmo  = 0        ! UKMO SHELF formulation
104   INTEGER, PUBLIC, PARAMETER ::   jp_std   = 1        ! standard formulation with forced or coupled drag coefficient
105   INTEGER, PUBLIC, PARAMETER ::   jp_const = 2        ! standard formulation with constant drag coefficient
106   INTEGER, PUBLIC, PARAMETER ::   jp_mcore = 3        ! momentum calculated from core forcing fields
107
108   !!----------------------------------------------------------------------
[7878]109   !!           Stokes drift parameterization
110   !!----------------------------------------------------------------------
111   INTEGER, PUBLIC, PARAMETER ::   jp_breivik  = 0     ! Breivik 2015: v_z=v_0*[exp(2*k*z)/(1-8*k*z)]
112   INTEGER, PUBLIC, PARAMETER ::   jp_phillips = 1     ! Phillips:     v_z=v_o*[exp(2*k*z)-beta*sqrt(-2*k*pi*z)*erfc(sqrt(-2*k*z))]
113
114   !!----------------------------------------------------------------------
[888]115   !!              Ocean Surface Boundary Condition fields
116   !!----------------------------------------------------------------------
[5385]117   INTEGER , PUBLIC ::  ncpl_qsr_freq            !: qsr coupling frequency per days from atmosphere
118   !
[2528]119   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress)
120   !!                                   !!   now    ! before   !!
[2715]121   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
122   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
123   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
124   !! wndm is used onmpute surface gases exchanges in ice-free ocean or leads
125   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
127   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
128   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
129   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
130   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
[3625]131   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s]
[2715]132   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
[4148]133   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
[5120]134   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff        [Kg/m2/s] 
135   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfisf , fwfisf_b !: ice shelf melting   [Kg/m2/s] 
[2528]136   !!
[2715]137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
138   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
[2528]139   !!
[4161]140   !!
[2715]141   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
142   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
143   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
[1534]144#if defined key_cpl_carbon_cycle
[2715]145   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
[1534]146#endif
[5407]147   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
[888]148
149   !!----------------------------------------------------------------------
150   !!                     Sea Surface Mean fields
151   !!----------------------------------------------------------------------
152   INTEGER , PUBLIC                     ::   nn_fsbc   !: frequency of sbc computation (as well as sea-ice model)
[2715]153   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssu_m     !: mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
154   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssv_m     !: mean (nn_fsbc time-step) surface sea j-current (V-point) [m/s]
155   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sst_m     !: mean (nn_fsbc time-step) surface sea temperature     [Celsius]
156   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu]
157   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m]
[4990]158   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface layer thickness       [m]
[5407]159   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   frq_m     !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-]
[888]160
[2715]161   !! * Substitutions
162#  include "vectopt_loop_substitute.h90"
[888]163   !!----------------------------------------------------------------------
[2715]164   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
[2528]165   !! $Id$
166   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[2715]167   !!----------------------------------------------------------------------
168CONTAINS
169
170   INTEGER FUNCTION sbc_oce_alloc()
171      !!---------------------------------------------------------------------
172      !!                  ***  FUNCTION sbc_oce_alloc  ***
173      !!---------------------------------------------------------------------
[4292]174      INTEGER :: ierr(5)
[2715]175      !!---------------------------------------------------------------------
176      ierr(:) = 0
177      !
178      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
179         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) ) 
180         !
[3625]181      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
182         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
183         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
[4148]184         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
[2715]185         !
[5120]186      ALLOCATE( fwfisf  (jpi,jpj), rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     &
187         &      fwfisf_b(jpi,jpj), rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) )
[2715]188         !
189      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
190#if defined key_cpl_carbon_cycle
191         &      atm_co2(jpi,jpj) ,                                        &
192#endif
[5407]193         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      &
194         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) )
[2715]195         !
[4292]196#if defined key_vvl
197      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) )
198#endif
199         !
[2715]200      sbc_oce_alloc = MAXVAL( ierr )
201      IF( lk_mpp            )   CALL mpp_sum ( sbc_oce_alloc )
202      IF( sbc_oce_alloc > 0 )   CALL ctl_warn('sbc_oce_alloc: allocation of arrays failed')
203      !
204   END FUNCTION sbc_oce_alloc
205
206
207   SUBROUTINE sbc_tau2wnd
208      !!---------------------------------------------------------------------
209      !!                    ***  ROUTINE sbc_tau2wnd  ***
210      !!                   
211      !! ** Purpose : Estimation of wind speed as a function of wind stress   
212      !!
213      !! ** Method  : |tau|=rhoa*Cd*|U|^2
214      !!---------------------------------------------------------------------
215      USE dom_oce         ! ocean space and time domain
216      USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
217      REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
218      REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
219      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
220      INTEGER  ::   ji, jj                ! dummy indices
221      !!---------------------------------------------------------------------
222      zcoef = 0.5 / ( zrhoa * zcdrag ) 
223!CDIR NOVERRCHK
224      DO jj = 2, jpjm1
225!CDIR NOVERRCHK
226         DO ji = fs_2, fs_jpim1   ! vect. opt.
227            ztx = utau(ji-1,jj  ) + utau(ji,jj) 
228            zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
229            ztau = SQRT( ztx * ztx + zty * zty )
230            wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
231         END DO
232      END DO
233      CALL lbc_lnk( wndm(:,:) , 'T', 1. )
234      !
235   END SUBROUTINE sbc_tau2wnd
236
[888]237   !!======================================================================
238END MODULE sbc_oce
Note: See TracBrowser for help on using the repository browser.