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

source: branches/2013/dev_LOCEAN_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90 @ 4148

Last change on this file since 4148 was 4148, checked in by cetlod, 10 years ago

merge in trunk changes between r3853 and r3940 and commit the changes, see ticket #1169

  • Property svn:keywords set to Id
File size: 10.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   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   sbc_oce_alloc : allocation of sbc arrays
15   !!   sbc_tau2wnd   : wind speed estimated from wind stress
16   !!----------------------------------------------------------------------
17   USE par_oce        ! ocean parameters
18   USE in_out_manager ! I/O manager
19   USE lib_mpp        ! MPP library
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   sbc_oce_alloc   ! routine called in sbcmod.F90
25   PUBLIC   sbc_tau2wnd     ! routine called in several sbc modules
26   
27   !!----------------------------------------------------------------------
28   !!           Namelist for the Ocean Surface Boundary Condition
29   !!----------------------------------------------------------------------
30   !                                   !!* namsbc namelist *
31   LOGICAL , PUBLIC ::   ln_ana         !: analytical boundary condition flag
32   LOGICAL , PUBLIC ::   ln_flx         !: flux      formulation
33   LOGICAL , PUBLIC ::   ln_blk_clio    !: CLIO bulk formulation
34   LOGICAL , PUBLIC ::   ln_blk_core    !: CORE bulk formulation
35   LOGICAL , PUBLIC ::   ln_blk_mfs     !: MFS  bulk formulation
36   LOGICAL , PUBLIC ::   ln_cpl         !: coupled   formulation (overwritten by key_sbc_coupled )
37   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr)
38   LOGICAL , PUBLIC ::   ln_rnf      = .FALSE.   !: runoffs / runoff mouths
39   LOGICAL , PUBLIC ::   ln_ssr         !: Sea Surface restoring on SST and/or SSS     
40   LOGICAL , PUBLIC ::   ln_apr_dyn     !: Atmospheric pressure forcing used on dynamics (ocean & ice)
41   INTEGER , PUBLIC ::   nn_ice         !: flag for ice in the surface boundary condition (=0/1/2/3)
42   INTEGER , PUBLIC ::   nn_ice_embd    !: flag for levitating/embedding sea-ice in the ocean
43   !                                             !: =0 levitating ice (no mass exchange, concentration/dilution effect)
44   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect
45   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure)
46   INTEGER , PUBLIC ::   nn_fwb         !: FreshWater Budget:
47   !                                             !:  = 0 unchecked
48   !                                             !:  = 1 global mean of e-p-r set to zero at each nn_fsbc time step
49   !                                             !:  = 2 annual global mean of e-p-r set to zero
50   LOGICAL , PUBLIC ::   ln_wave        !: true if some coupling with wave model
51   LOGICAL , PUBLIC ::   ln_cdgw        !: true if neutral drag coefficient from wave model
52   LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d stokes drift from wave model
53   !
54   LOGICAL , PUBLIC ::   ln_icebergs    !: Icebergs
55
56   !!----------------------------------------------------------------------
57   !!              Ocean Surface Boundary Condition fields
58   !!----------------------------------------------------------------------
59   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress)
60   !!                                   !!   now    ! before   !!
61   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2]
62   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   vtau   , vtau_b   !: sea surface j-stress (ocean referential)     [N/m2]
63   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   taum              !: module of sea surface stress (at T-point)    [N/m2]
64   !! wndm is used onmpute surface gases exchanges in ice-free ocean or leads
65   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s]
66   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2]
67   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2]
68   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2]
69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns_tot           !: total non solar heat flux (over sea and ice) [W/m2]
70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp    , emp_b    !: freshwater budget: volume flux               [Kg/m2/s]
71   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sfx    , sfx_b    !: salt flux                                    [PSU/m2/s]
72   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s]
73   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s]
74   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff   [Kg/m2/s] 
75   !!
76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts
77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  qsr_hc , qsr_hc_b   !: heat content trend due to qsr flux     [K.m/s] jpi,jpj,jpk
78   !!
79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tprecip           !: total precipitation                          [Kg/m2/s]
80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sprecip           !: solid precipitation                          [Kg/m2/s]
81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fr_i              !: ice fraction = 1 - lead fraction      (between 0 to 1)
82#if defined key_cpl_carbon_cycle
83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm]
84#endif
85
86   !!----------------------------------------------------------------------
87   !!                     Sea Surface Mean fields
88   !!----------------------------------------------------------------------
89   INTEGER , PUBLIC                     ::   nn_fsbc   !: frequency of sbc computation (as well as sea-ice model)
90   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssu_m     !: mean (nn_fsbc time-step) surface sea i-current (U-point) [m/s]
91   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssv_m     !: mean (nn_fsbc time-step) surface sea j-current (V-point) [m/s]
92   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sst_m     !: mean (nn_fsbc time-step) surface sea temperature     [Celsius]
93   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   sss_m     !: mean (nn_fsbc time-step) surface sea salinity            [psu]
94   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m]
95
96   !! * Substitutions
97#  include "vectopt_loop_substitute.h90"
98   !!----------------------------------------------------------------------
99   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
100   !! $Id$
101   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
102   !!----------------------------------------------------------------------
103CONTAINS
104
105   INTEGER FUNCTION sbc_oce_alloc()
106      !!---------------------------------------------------------------------
107      !!                  ***  FUNCTION sbc_oce_alloc  ***
108      !!---------------------------------------------------------------------
109      INTEGER :: ierr(4)
110      !!---------------------------------------------------------------------
111      ierr(:) = 0
112      !
113      ALLOCATE( utau(jpi,jpj) , utau_b(jpi,jpj) , taum(jpi,jpj) ,     &
114         &      vtau(jpi,jpj) , vtau_b(jpi,jpj) , wndm(jpi,jpj) , STAT=ierr(1) ) 
115         !
116      ALLOCATE( qns_tot(jpi,jpj) , qns  (jpi,jpj) , qns_b(jpi,jpj),        &
117         &      qsr_tot(jpi,jpj) , qsr  (jpi,jpj) ,                        &
118         &      emp    (jpi,jpj) , emp_b(jpi,jpj) ,                        &
119         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) )
120         !
121      ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     &
122         &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) )
123         !
124      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     &
125#if defined key_cpl_carbon_cycle
126         &      atm_co2(jpi,jpj) ,                                        &
127#endif
128         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) ,                       &
129         &      ssv_m  (jpi,jpj) , sss_m  (jpi,jpj), ssh_m(jpi,jpj) , STAT=ierr(4) )
130         !
131      sbc_oce_alloc = MAXVAL( ierr )
132      IF( lk_mpp            )   CALL mpp_sum ( sbc_oce_alloc )
133      IF( sbc_oce_alloc > 0 )   CALL ctl_warn('sbc_oce_alloc: allocation of arrays failed')
134      !
135   END FUNCTION sbc_oce_alloc
136
137
138   SUBROUTINE sbc_tau2wnd
139      !!---------------------------------------------------------------------
140      !!                    ***  ROUTINE sbc_tau2wnd  ***
141      !!                   
142      !! ** Purpose : Estimation of wind speed as a function of wind stress   
143      !!
144      !! ** Method  : |tau|=rhoa*Cd*|U|^2
145      !!---------------------------------------------------------------------
146      USE dom_oce         ! ocean space and time domain
147      USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
148      REAL(wp) ::   zrhoa  = 1.22         ! Air density kg/m3
149      REAL(wp) ::   zcdrag = 1.5e-3       ! drag coefficient
150      REAL(wp) ::   ztx, zty, ztau, zcoef ! temporary variables
151      INTEGER  ::   ji, jj                ! dummy indices
152      !!---------------------------------------------------------------------
153      zcoef = 0.5 / ( zrhoa * zcdrag ) 
154!CDIR NOVERRCHK
155      DO jj = 2, jpjm1
156!CDIR NOVERRCHK
157         DO ji = fs_2, fs_jpim1   ! vect. opt.
158            ztx = utau(ji-1,jj  ) + utau(ji,jj) 
159            zty = vtau(ji  ,jj-1) + vtau(ji,jj) 
160            ztau = SQRT( ztx * ztx + zty * zty )
161            wndm(ji,jj) = SQRT ( ztau * zcoef ) * tmask(ji,jj,1)
162         END DO
163      END DO
164      CALL lbc_lnk( wndm(:,:) , 'T', 1. )
165      !
166   END SUBROUTINE sbc_tau2wnd
167
168   !!======================================================================
169END MODULE sbc_oce
Note: See TracBrowser for help on using the repository browser.