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/2013/dev_ECMWF_waves/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2013/dev_ECMWF_waves/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90 @ 4351

Last change on this file since 4351 was 4351, checked in by acc, 10 years ago

Branch 2013/dev_ECMWF_waves ticket #1216. First set of code imports from ECMWF. Untested

  • Property svn:keywords set to Id
File size: 13.0 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   LOGICAL , PUBLIC ::   ln_cpl         !: coupled   formulation (overwritten by key_sbc_coupled )
38   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr)
39   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths
40   LOGICAL , PUBLIC ::   ln_ssr         !: Sea Surface restoring on SST and/or SSS     
41   LOGICAL , PUBLIC ::   ln_apr_dyn     !: Atmospheric pressure forcing used on dynamics (ocean & ice)
42   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3)
43   INTEGER , PUBLIC ::   nn_ice_embd    !: flag for levitating/embedding sea-ice in the ocean
44   !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect)
45   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect
46   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure)
47   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:
48   !                                             !:  = 0 unchecked
49   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step
50   !                                             !:  = 2 annual global mean of e-p-r set to zero
51   LOGICAL , PUBLIC ::   ln_wave        !: true if some coupling with wave model
52   LOGICAL , PUBLIC ::   ln_cdgw        !: true if neutral drag coefficient from wave model
53   LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d stokes drift from wave model
54   !
55   REAL(wp), PUBLIC ::   rn_rrelwind = 1.0       !: relative wind ratio (1.0 means surface currents are subtracted, 0.0 means no current)
56   LOGICAL , PUBLIC ::   ln_wavetke  = .FALSE.   !: true if wave parameters are read
57   LOGICAL , PUBLIC ::   ln_stcor    = .FALSE.   !: true if Stokes-Coriolis forcing is included
58   LOGICAL , PUBLIC ::   ln_tauoc    = .FALSE.   !: true if wave-modified water-side stress is used
59
60   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs
61   !
62   CHARACTER (len=8), PUBLIC :: cn_iceflx  !: Flux handling over ice categories
63   LOGICAL, PUBLIC :: ln_iceflx_ave     ! Average heat fluxes over all ice categories
64   LOGICAL, PUBLIC :: ln_iceflx_linear  ! Redistribute mean heat fluxes over all ice categories, using ice temperature and albedo
65   !
66   INTEGER , PUBLIC ::   nn_lsm        !: Number of iteration if seaoverland is applied
67   !!----------------------------------------------------------------------
68   !!              Ocean Surface Boundary Condition fields
69   !!----------------------------------------------------------------------
70   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress)
71   LOGICAL , PUBLIC ::   ltrcdm2dc               !: In case of Diurnal Cycle short wave, compute a Daily Mean short waves flux
72   !!                                   !!   now    ! before   !!
73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
75   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   cdn_wave          !: wave model drag coefficient [N/m2]
77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wspd_wavepar      !: wave model 10-m neutral wind [m/s] CCC
78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tauoc_wavepar     !: normalized stress into the ocean from wave model  CCC
79   !! wndm is used onmpute surface gases exchanges in ice-free ocean or leads
80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_mean          !: daily mean sea heat flux: solar              [W/m2]
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
84   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
85   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
87   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s]
88   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
89   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff   [Kg/m2/s] 
91   !!
92   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
93   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
94   !!
95   !!
96   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
97   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
98   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
99#if defined key_cpl_carbon_cycle
100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
101#endif
102
103   !!----------------------------------------------------------------------
104   !!                     Sea Surface Mean fields
105   !!----------------------------------------------------------------------
106   INTEGER , PUBLIC                     ::   nn_fsbc   !: frequency of sbc computation (as well as sea-ice model)
107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssu_m     !: mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
108   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssv_m     !: mean (nn_fsbc time-step) surface sea j-current (V-point) [m/s]
109   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sst_m     !: mean (nn_fsbc time-step) surface sea temperature     [Celsius]
110   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu]
111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m]
112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface height                [m]
113
114   !! * Substitutions
115#  include "vectopt_loop_substitute.h90"
116   !!----------------------------------------------------------------------
117   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
118   !! $Id$
119   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
120   !!----------------------------------------------------------------------
121CONTAINS
122
123   INTEGER FUNCTION sbc_oce_alloc()
124      !!---------------------------------------------------------------------
125      !!                  ***  FUNCTION sbc_oce_alloc  ***
126      !!---------------------------------------------------------------------
127      INTEGER :: ierr(5)
128      !!---------------------------------------------------------------------
129      ierr(:) = 0
130      !
131      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
132         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) ) 
133         !
134      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
135         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
136         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
137         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
138         !
139      ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     &
140         &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) )
141         ! Initialize these since that is not done in the code.
142      rnf        (:,:) = 0.0_wp
143      sbc_tsc  (:,:,:) = 0.0_wp
144      qsr_hc   (:,:,:) = 0.0_wp
145      rnf_b      (:,:) = 0.0_wp
146      sbc_tsc_b(:,:,:) = 0.0_wp
147      qsr_hc_b (:,:,:) = 0.0_wp
148
149         !
150      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
151#if defined key_cpl_carbon_cycle
152         &      atm_co2(jpi,jpj) ,                                        &
153#endif
154         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) ,                       &
155         &      ssv_m  (jpi,jpj) , sss_m  (jpi,jpj), ssh_m(jpi,jpj) , STAT=ierr(4) )
156      ALLOCATE( cdn_wave(jpi,jpj) )
157      ALLOCATE( wspd_wavepar(jpi,jpj) )
158         !
159#if defined key_vvl
160      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) )
161#endif
162         !
163      IF( ltrcdm2dc ) ALLOCATE( qsr_mean(jpi,jpj) , STAT=ierr(5) )
164         !
165      sbc_oce_alloc = MAXVAL( ierr )
166      IF( lk_mpp            )   CALL mpp_sum ( sbc_oce_alloc )
167      IF( sbc_oce_alloc > 0 )   CALL ctl_warn('sbc_oce_alloc: allocation of arrays failed')
168      !
169   END FUNCTION sbc_oce_alloc
170
171
172   SUBROUTINE sbc_tau2wnd
173      !!---------------------------------------------------------------------
174      !!                    ***  ROUTINE sbc_tau2wnd  ***
175      !!                   
176      !! ** Purpose : Estimation of wind speed as a function of wind stress   
177      !!
178      !! ** Method  : |tau|=rhoa*Cd*|U|^2
179      !!---------------------------------------------------------------------
180      USE dom_oce         ! ocean space and time domain
181      USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
182      REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
183      REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
184      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
185      INTEGER  ::   ji, jj                ! dummy indices
186      !!---------------------------------------------------------------------
187      zcoef = 0.5 / ( zrhoa * zcdrag ) 
188!CDIR NOVERRCHK
189      DO jj = 2, jpjm1
190!CDIR NOVERRCHK
191         DO ji = fs_2, fs_jpim1   ! vect. opt.
192            ztx = utau(ji-1,jj  ) + utau(ji,jj) 
193            zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
194            ztau = SQRT( ztx * ztx + zty * zty )
195            wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
196         END DO
197      END DO
198      CALL lbc_lnk( wndm(:,:) , 'T', 1. )
199      !
200   END SUBROUTINE sbc_tau2wnd
201
202   !!======================================================================
203END MODULE sbc_oce
Note: See TracBrowser for help on using the repository browser.