source: branches/UKMO/AMM15_v3_6_STABLE_package_collate_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90

Last change on this file was 11277, checked in by kingr, 19 months ago

Merged Juan's changes for running AMM15 woth wave coupling.
Corrected minor logic error to allow AMM7-uncoupled to reproduce earlier results.
Few line spacing changes to allow merging with OBS br and trunk rvn 5518.

File size: 17.4 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   !!----------------------------------------------------------------------
13
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
22   IMPLICIT NONE
23   PRIVATE
24
25   PUBLIC   sbc_oce_alloc   ! routine called in sbcmod.F90
26   PUBLIC   sbc_tau2wnd     ! routine called in several sbc modules
27   
28   !!----------------------------------------------------------------------
29   !!           Namelist for the Ocean Surface Boundary Condition
30   !!----------------------------------------------------------------------
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
37#if defined key_oasis3 || defined key_oasis3mct
38   LOGICAL , PUBLIC ::   lk_oasis = .TRUE.  !: OASIS used
39#else
40   LOGICAL , PUBLIC ::   lk_oasis = .FALSE. !: OASIS unused
41#endif
42   LOGICAL , PUBLIC ::   ln_cpl         !: ocean-atmosphere coupled formulation
43   LOGICAL , PUBLIC ::   ln_mixcpl      !: ocean-atmosphere forced-coupled mixed formulation
44   LOGICAL , PUBLIC ::   ln_wavcpl      !: ocean-wave forced-coupled mixed formulation
45   LOGICAL , PUBLIC ::   ll_purecpl     !: ocean-atmosphere or ocean-wave pure coupled formulation
46   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr)
47   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths
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   LOGICAL, PUBLIC  ::   ln_usernfmask = .false.   !  use a runoff mask file to merge data received from several models
51                                                   !   -> file rnfmask.nc with the float variable called rnfmask (jpi,jpj,nn_cplmodel)
52   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3)
53   INTEGER , PUBLIC ::   nn_isf         !: flag for isf in the surface boundary condition (=0/1/2/3/4)
54   INTEGER , PUBLIC ::   nn_ice_embd    !: flag for levitating/embedding sea-ice in the ocean
55   !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect)
56   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect
57   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure)
58   INTEGER , PUBLIC ::   nn_components  !: flag for sbc module (including sea-ice) coupling mode (see component definition below)
59   INTEGER , PUBLIC ::   nn_limflx      !: LIM3 Multi-category heat flux formulation
60   !                                             !: =-1  Use of per-category fluxes
61   !                                             !: = 0  Average per-category fluxes
62   !                                             !: = 1  Average then redistribute per-category fluxes
63   !                                             !: = 2  Redistribute a single flux over categories
64   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:
65   !                                             !:  = 0 unchecked
66   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step
67   !                                             !:  = 2 annual global mean of e-p-r set to zero
68   LOGICAL , PUBLIC ::   ln_wave        !: true if some coupling with wave model
69   LOGICAL , PUBLIC ::   ln_cdgw        !: true if neutral drag coefficient from wave model
70   LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d Stokes drift from wave model
71   LOGICAL , PUBLIC ::   ln_stcor       !: true if Stokes-Coriolis term is used
72   LOGICAL , PUBLIC ::   ln_tauoc       !: true if normalized stress from wave is used 
73   LOGICAL , PUBLIC ::   ln_tauw        !: true if ocean stress components from wave is used 
74   LOGICAL , PUBLIC ::   ln_phioc       !: true if wave energy to ocean is used 
75   LOGICAL , PUBLIC ::   ln_rough       !: true if wave roughness equals significant wave height
76   LOGICAL , PUBLIC ::   ln_zdfqiao     !: Enhanced wave vertical mixing Qiao(2010) formulation flag
77   INTEGER , PUBLIC ::   nn_drag        ! type of formula to calculate wind stress from wind components
78   INTEGER , PUBLIC ::   nn_wmix        ! type of wave breaking mixing
79   !
80   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs
81   !
82   INTEGER , PUBLIC ::   nn_lsm         !: Number of iteration if seaoverland is applied
83   !!----------------------------------------------------------------------
84   !!           switch definition (improve readability)
85   !!----------------------------------------------------------------------
86   INTEGER , PUBLIC, PARAMETER ::   jp_gyre    = 0        !: GYRE analytical               formulation
87   INTEGER , PUBLIC, PARAMETER ::   jp_ana     = 1        !: analytical                    formulation
88   INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux                          formulation
89   INTEGER , PUBLIC, PARAMETER ::   jp_clio    = 3        !: CLIO bulk                     formulation
90   INTEGER , PUBLIC, PARAMETER ::   jp_core    = 4        !: CORE bulk                     formulation
91   INTEGER , PUBLIC, PARAMETER ::   jp_purecpl = 5        !: Pure ocean-atmosphere Coupled formulation
92   INTEGER , PUBLIC, PARAMETER ::   jp_mfs     = 6        !: MFS  bulk                     formulation
93   INTEGER , PUBLIC, PARAMETER ::   jp_none    = 7        !: for OPA when doing coupling via SAS module
94   INTEGER , PUBLIC, PARAMETER ::   jp_esopa   = -1       !: esopa test, ALL formulations
95   
96   !!----------------------------------------------------------------------
97   !!           component definition
98   !!----------------------------------------------------------------------
99   INTEGER , PUBLIC, PARAMETER ::   jp_iam_nemo = 0      !: Initial single executable configuration
100                                                         !  (no internal OASIS coupling)
101   INTEGER , PUBLIC, PARAMETER ::   jp_iam_opa  = 1      !: Multi executable configuration - OPA component
102                                                         !  (internal OASIS coupling)
103   INTEGER , PUBLIC, PARAMETER ::   jp_iam_sas  = 2      !: Multi executable configuration - SAS component
104                                                         !  (internal OASIS coupling)
105   !!----------------------------------------------------------------------
106   !!           wind stress definition
107   !!----------------------------------------------------------------------
108   INTEGER, PUBLIC, PARAMETER ::   jp_ukmo  = 0        ! UKMO SHELF formulation
109   INTEGER, PUBLIC, PARAMETER ::   jp_std   = 1        ! standard formulation with forced or coupled drag coefficient 
110   INTEGER, PUBLIC, PARAMETER ::   jp_const = 2        ! standard formulation with constant drag coefficient 
111   INTEGER, PUBLIC, PARAMETER ::   jp_mcore = 3        ! momentum calculated from core forcing fields 
112
113   !!----------------------------------------------------------------------
114   !!           Wave mixing vertical parameterization
115   !!----------------------------------------------------------------------
116   INTEGER, PUBLIC, PARAMETER ::   jp_craigbanner = 0  ! Craig and Banner formulation (original NEMO formulation -
117                                                       ! direct conversion of mechanical to turbulent energy)
118   INTEGER, PUBLIC, PARAMETER ::   jp_janssen     = 1  ! Janssen formulation - no assumption on direct energy conversion
119   !!----------------------------------------------------------------------
120   !!              Ocean Surface Boundary Condition fields
121   !!----------------------------------------------------------------------
122   INTEGER , PUBLIC ::  ncpl_qsr_freq            !: qsr coupling frequency per days from atmosphere
123   !
124   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress)
125   !!                                   !!   now    ! before   !!
126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
127   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
128   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
129   !! wndm is used onmpute surface gases exchanges in ice-free ocean or leads
130   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
131   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
132   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
133   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
134   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
135   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
136   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s]
137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
138   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
139   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff        [Kg/m2/s] 
140   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfisf , fwfisf_b !: ice shelf melting   [Kg/m2/s] 
141   !!
142   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
143   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
144   !!
145   !!
146   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
147   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
148   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
149   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   pressnow          !: UKMO SHELF pressure
150   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   apgu              !: UKMO SHELF pressure forcing
151   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   apgv              !: UKMO SHELF pressure forcing
152#if defined key_cpl_carbon_cycle
153   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
154#endif
155   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl)
156   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xrnfmask          !: coupling mask for ln_usernfmask (warning: allocated in sbcrnf)
157
158   !!----------------------------------------------------------------------
159   !!                     Sea Surface Mean fields
160   !!----------------------------------------------------------------------
161   INTEGER , PUBLIC                     ::   nn_fsbc   !: frequency of sbc computation (as well as sea-ice model)
162   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssu_m     !: mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
163   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssv_m     !: mean (nn_fsbc time-step) surface sea j-current (V-point) [m/s]
164   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sst_m     !: mean (nn_fsbc time-step) surface sea temperature     [Celsius]
165   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu]
166   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m]
167   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface layer thickness       [m]
168   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   frq_m     !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-]
169
170   !! * Substitutions
171#  include "vectopt_loop_substitute.h90"
172   !!----------------------------------------------------------------------
173   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
174   !! $Id$
175   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
176   !!----------------------------------------------------------------------
177CONTAINS
178
179   INTEGER FUNCTION sbc_oce_alloc()
180      !!---------------------------------------------------------------------
181      !!                  ***  FUNCTION sbc_oce_alloc  ***
182      !!---------------------------------------------------------------------
183      INTEGER :: ierr(5)
184      !!---------------------------------------------------------------------
185      ierr(:) = 0
186      !
187      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
188         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) ) 
189         !
190      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
191         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
192         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
193         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
194         !
195      ALLOCATE( fwfisf  (jpi,jpj), rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     &
196         &      fwfisf_b(jpi,jpj), rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) )
197         !
198      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
199#if defined key_cpl_carbon_cycle
200         &      atm_co2(jpi,jpj) ,                                        &
201#endif
202         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      &
203         &      pressnow(jpi,jpj), apgu(jpi,jpj)    , apgv(jpi,jpj) ,     &
204         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) )
205         !
206#if defined key_vvl
207      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) )
208#endif
209         !
210      sbc_oce_alloc = MAXVAL( ierr )
211      IF( lk_mpp            )   CALL mpp_sum ( sbc_oce_alloc )
212      IF( sbc_oce_alloc > 0 )   CALL ctl_warn('sbc_oce_alloc: allocation of arrays failed')
213      !
214   END FUNCTION sbc_oce_alloc
215
216
217   SUBROUTINE sbc_tau2wnd
218      !!---------------------------------------------------------------------
219      !!                    ***  ROUTINE sbc_tau2wnd  ***
220      !!                   
221      !! ** Purpose : Estimation of wind speed as a function of wind stress   
222      !!
223      !! ** Method  : |tau|=rhoa*Cd*|U|^2
224      !!---------------------------------------------------------------------
225      USE dom_oce         ! ocean space and time domain
226      USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
227      REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
228      REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
229      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
230      INTEGER  ::   ji, jj                ! dummy indices
231      !!---------------------------------------------------------------------
232      zcoef = 0.5 / ( zrhoa * zcdrag ) 
233!CDIR NOVERRCHK
234      DO jj = 2, jpjm1
235!CDIR NOVERRCHK
236         DO ji = fs_2, fs_jpim1   ! vect. opt.
237            ztx = utau(ji-1,jj  ) + utau(ji,jj) 
238            zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
239            ztau = SQRT( ztx * ztx + zty * zty )
240            wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
241         END DO
242      END DO
243      CALL lbc_lnk( wndm(:,:) , 'T', 1. )
244      !
245   END SUBROUTINE sbc_tau2wnd
246
247   !!======================================================================
248END MODULE sbc_oce
Note: See TracBrowser for help on using the repository browser.