source: NEMO/branches/2019/dev_r11943_MERGE_2019/src/OCE/SBC/sbc_oce.F90 @ 12252

Last change on this file since 12252 was 12252, checked in by smasson, 11 months ago

rev12240_dev_r11943_MERGE_2019: same as [12251], merge trunk 12072:12248, all sette tests ok, GYRE_PISCES, AMM12, ISOMIP, VORTEX intentical to 12236

  • Property svn:keywords set to Id
File size: 15.8 KB
Line 
1MODULE sbc_oce
2   !!======================================================================
3   !!                       ***  MODULE  sbc_oce  ***
4   !! Surface module :   variables defined in core memory
5   !!======================================================================
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
11   !!            4.0  ! 2012-05  (C. Rousset) add attenuation coef for use in ice model
12   !!            4.0  ! 2016-06  (L. Brodeau) new unified bulk routine (based on AeroBulk)
13   !!            4.0  ! 2019-03  (F. Lemarié, G. Samson) add compatibility with ABL mode
14   !!----------------------------------------------------------------------
15
16   !!----------------------------------------------------------------------
17   !!   sbc_oce_alloc : allocation of sbc arrays
18   !!   sbc_tau2wnd   : wind speed estimated from wind stress
19   !!----------------------------------------------------------------------
20   USE par_oce        ! ocean parameters
21   USE in_out_manager ! I/O manager
22   USE lib_mpp        ! MPP library
23
24   IMPLICIT NONE
25   PRIVATE
26
27   PUBLIC   sbc_oce_alloc   ! routine called in sbcmod.F90
28   PUBLIC   sbc_tau2wnd     ! routine called in several sbc modules
29
30   !!----------------------------------------------------------------------
31   !!           Namelist for the Ocean Surface Boundary Condition
32   !!----------------------------------------------------------------------
33   !                                   !!* namsbc namelist *
34   LOGICAL , PUBLIC ::   ln_usr         !: user defined formulation
35   LOGICAL , PUBLIC ::   ln_flx         !: flux      formulation
36   LOGICAL , PUBLIC ::   ln_blk         !: bulk formulation
37   LOGICAL , PUBLIC ::   ln_abl         !: Atmospheric boundary layer model
38#if defined key_oasis3
39   LOGICAL , PUBLIC ::   lk_oasis = .TRUE.  !: OASIS used
40#else
41   LOGICAL , PUBLIC ::   lk_oasis = .FALSE. !: OASIS unused
42#endif
43   LOGICAL , PUBLIC ::   ln_cpl         !: ocean-atmosphere coupled formulation
44   LOGICAL , PUBLIC ::   ln_mixcpl      !: ocean-atmosphere forced-coupled mixed formulation
45   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr)
46   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths
47   LOGICAL , PUBLIC ::   ln_ssr         !: Sea Surface restoring on SST and/or SSS
48   LOGICAL , PUBLIC ::   ln_apr_dyn     !: Atmospheric pressure forcing used on dynamics (ocean & ice)
49   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3)
50   LOGICAL , PUBLIC ::   ln_ice_embd    !: flag for levitating/embedding sea-ice in the ocean
51   !                                             !: =F levitating ice (no presure effect) with mass and salt exchanges
52   !                                             !: =T embedded sea-ice (pressure effect + mass and salt exchanges)
53   INTEGER , PUBLIC ::   nn_components  !: flag for sbc module (including sea-ice) coupling mode (see component definition below)
54   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:
55   !                                             !:  = 0 unchecked
56   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step
57   !                                             !:  = 2 annual global mean of e-p-r set to zero
58   LOGICAL , PUBLIC ::   ln_wave        !: true if some coupling with wave model
59   LOGICAL , PUBLIC ::   ln_cdgw        !: true if neutral drag coefficient from wave model
60   LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d stokes drift from wave model
61   LOGICAL , PUBLIC ::   ln_tauwoc       !: true if normalized stress from wave is used
62   LOGICAL , PUBLIC ::   ln_tauw        !: true if ocean stress components from wave is used
63   LOGICAL , PUBLIC ::   ln_stcor       !: true if Stokes-Coriolis term is used
64   !
65   INTEGER , PUBLIC ::   nn_sdrift      ! type of parameterization to calculate vertical Stokes drift
66   !
67   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs
68   !
69   INTEGER , PUBLIC ::   nn_lsm         !: Number of iteration if seaoverland is applied
70   !
71   !                                   !!* namsbc_cpl namelist *
72   INTEGER , PUBLIC ::   nn_cats_cpl    !: Number of sea ice categories over which the coupling is carried out
73
74   !!----------------------------------------------------------------------
75   !!           switch definition (improve readability)
76   !!----------------------------------------------------------------------
77   INTEGER , PUBLIC, PARAMETER ::   jp_usr     = 1        !: user defined                  formulation
78   INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux                          formulation
79   INTEGER , PUBLIC, PARAMETER ::   jp_blk     = 3        !: bulk                          formulation
80   INTEGER , PUBLIC, PARAMETER ::   jp_abl     = 4        !: Atmospheric boundary layer    formulation
81   INTEGER , PUBLIC, PARAMETER ::   jp_purecpl = 5        !: Pure ocean-atmosphere Coupled formulation
82   INTEGER , PUBLIC, PARAMETER ::   jp_none    = 6        !: for OPA when doing coupling via SAS module
83
84   !!----------------------------------------------------------------------
85   !!           Stokes drift parametrization definition
86   !!----------------------------------------------------------------------
87   INTEGER , PUBLIC, PARAMETER ::   jp_breivik_2014 = 0     !: Breivik  2014: v_z=v_0*[exp(2*k*z)/(1-8*k*z)]
88   INTEGER , PUBLIC, PARAMETER ::   jp_li_2017      = 1     !: Li et al 2017: Stokes drift based on Phillips spectrum (Breivik 2016)
89   !  with depth averaged profile
90   INTEGER , PUBLIC, PARAMETER ::   jp_peakfr       = 2     !: Li et al 2017: using the peak wave number read from wave model instead
91   !  of the inverse depth scale
92   LOGICAL , PUBLIC            ::   ll_st_bv2014  = .FALSE. !  logical indicator, .true. if Breivik 2014 parameterisation is active.
93   LOGICAL , PUBLIC            ::   ll_st_li2017  = .FALSE. !  logical indicator, .true. if Li 2017 parameterisation is active.
94   LOGICAL , PUBLIC            ::   ll_st_bv_li   = .FALSE. !  logical indicator, .true. if either Breivik or Li parameterisation is active.
95   LOGICAL , PUBLIC            ::   ll_st_peakfr  = .FALSE. !  logical indicator, .true. if using Li 2017 with peak wave number
96
97   !!----------------------------------------------------------------------
98   !!           component definition
99   !!----------------------------------------------------------------------
100   INTEGER , PUBLIC, PARAMETER ::   jp_iam_nemo = 0      !: Initial single executable configuration
101   !  (no internal OASIS coupling)
102   INTEGER , PUBLIC, PARAMETER ::   jp_iam_opa  = 1      !: Multi executable configuration - OPA component
103   !  (internal OASIS coupling)
104   INTEGER , PUBLIC, PARAMETER ::   jp_iam_sas  = 2      !: Multi executable configuration - SAS component
105   !  (internal OASIS coupling)
106   !!----------------------------------------------------------------------
107   !!              Ocean Surface Boundary Condition fields
108   !!----------------------------------------------------------------------
109   INTEGER , PUBLIC ::  ncpl_qsr_freq = 0        !: qsr coupling frequency per days from atmosphere (used by top)
110   !
111   !!                                   !!   now    ! before   !!
112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
115   !! wndm is used compute surface gases exchanges in ice-free ocean or leads
116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
117   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rhoa              !: air density at "rn_zu" m above the sea       [kg/m3]
118   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
119   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
120   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
121   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
122   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
123   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSS.kg/m2/s]
124   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
125   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff                                 [Kg/m2/s]
127   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwficb , fwficb_b !: iceberg melting                              [Kg/m2/s]
128   !!
129   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
130   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
131   !!
132   !!
133   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
134   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
135   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
136   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
138
139   !!---------------------------------------------------------------------
140   !! ABL Vertical Domain size
141   !!---------------------------------------------------------------------
142   INTEGER , PUBLIC            ::   jpka   = 2     !: ABL number of vertical levels (default definition)
143   INTEGER , PUBLIC            ::   jpkam1 = 1     !: jpka-1
144   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   ght_abl, ghw_abl          !: ABL geopotential height (needed for iom)
145   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   e3t_abl, e3w_abl          !: ABL vertical scale factors (needed for iom)
146
147   !!----------------------------------------------------------------------
148   !!                     Sea Surface Mean fields
149   !!----------------------------------------------------------------------
150   INTEGER , PUBLIC                     ::   nn_fsbc   !: frequency of sbc computation (as well as sea-ice model)
151   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssu_m     !: mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
152   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssv_m     !: mean (nn_fsbc time-step) surface sea j-current (V-point) [m/s]
153   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sst_m     !: mean (nn_fsbc time-step) surface sea temperature     [Celsius]
154   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu]
155   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m]
156   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tsk_m     !: mean (nn_fsbc time-step) SKIN surface sea temp.      [Celsius]
157   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface layer thickness       [m]
158   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   frq_m     !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-]
159
160   !! * Substitutions
161#  include "vectopt_loop_substitute.h90"
162   !!----------------------------------------------------------------------
163   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
164   !! $Id$
165   !! Software governed by the CeCILL license (see ./LICENSE)
166   !!----------------------------------------------------------------------
167CONTAINS
168
169   INTEGER FUNCTION sbc_oce_alloc()
170      !!---------------------------------------------------------------------
171      !!                  ***  FUNCTION sbc_oce_alloc  ***
172      !!---------------------------------------------------------------------
173      INTEGER :: ierr(5)
174      !!---------------------------------------------------------------------
175      ierr(:) = 0
176      !
177      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
178         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , rhoa(jpi,jpj) , STAT=ierr(1) )
179      !
180      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
181         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
182         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
183         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
184      !
185      ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,  &
186         &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) ,  &
187         &      fwficb  (jpi,jpj), fwficb_b(jpi,jpj), STAT=ierr(3) )
188      !
189      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
190         &      atm_co2(jpi,jpj) , tsk_m(jpi,jpj) ,                       &
191         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      &
192         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) )
193      !
194      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) )
195      !
196      sbc_oce_alloc = MAXVAL( ierr )
197      CALL mpp_sum ( 'sbc_oce', sbc_oce_alloc )
198      IF( sbc_oce_alloc > 0 )   CALL ctl_warn('sbc_oce_alloc: allocation of arrays failed')
199      !
200   END FUNCTION sbc_oce_alloc
201
202
203   SUBROUTINE sbc_tau2wnd
204      !!---------------------------------------------------------------------
205      !!                    ***  ROUTINE sbc_tau2wnd  ***
206      !!
207      !! ** Purpose : Estimation of wind speed as a function of wind stress
208      !!
209      !! ** Method  : |tau|=rhoa*Cd*|U|^2
210      !!---------------------------------------------------------------------
211      USE dom_oce         ! ocean space and time domain
212      USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
213      REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
214      REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
215      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
216      INTEGER  ::   ji, jj                ! dummy indices
217      !!---------------------------------------------------------------------
218      zcoef = 0.5 / ( zrhoa * zcdrag )
219      DO jj = 2, jpjm1
220         DO ji = fs_2, fs_jpim1   ! vect. opt.
221            ztx = utau(ji-1,jj  ) + utau(ji,jj)
222            zty = vtau(ji  ,jj-1) + vtau(ji,jj)
223            ztau = SQRT( ztx * ztx + zty * zty )
224            wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
225         END DO
226      END DO
227      CALL lbc_lnk( 'sbc_oce', wndm(:,:) , 'T', 1. )
228      !
229   END SUBROUTINE sbc_tau2wnd
230
231   !!======================================================================
232END MODULE sbc_oce
Note: See TracBrowser for help on using the repository browser.