MODULE usrdef_sbc !!====================================================================== !! *** MODULE usrdef_sbc *** !! Ocean forcing: user defined momentum, heat and freshwater forcings !! !! === Here GYRE configuration === !! !!===================================================================== !! History : 4.0 ! 2016-03 (S. Flavoni, G. Madec) user defined interface !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! usr_def_sbc : user defined surface bounday conditions in GYRE case !!---------------------------------------------------------------------- USE oce ! ocean dynamics and tracers USE dom_oce ! ocean space and time domain USE sbc_oce ! Surface boundary condition: ocean fields USE phycst ! physical constants ! USE in_out_manager ! I/O manager USE lib_mpp ! distribued memory computing library USE lbclnk ! ocean lateral boundary conditions (or mpp link) USE lib_fortran ! IMPLICIT NONE PRIVATE PUBLIC usr_def_sbc ! routine called in sbcmod module !! * Substitutions # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OPA 4.0 , NEMO Consortium (2016) !! $Id: $ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE usr_def_sbc( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE usr_def_sbc *** !! !! ** Purpose : provide at each time-step the surface boundary !! condition, i.e. the momentum, heat and freshwater fluxes. !! !! ** Method : analytical seasonal cycle (all 0 fields, for overflow !! case). !! CAUTION : never mask the surface stress field ! !! !! ** Action : - set the ocean surface boundary condition, i.e. !! utau, vtau, taum, wndm, qns, qsr, emp, sfx !! !!---------------------------------------------------------------------- INTEGER, INTENT(in) :: kt ! ocean time step !! !SF INTEGER :: ji, jj ! dummy loop indices !SF INTEGER :: zyear0 ! initial year !SF INTEGER :: zmonth0 ! initial month !SF INTEGER :: zday0 ! initial day !SF INTEGER :: zday_year0 ! initial day since january 1st !SF REAL(wp) :: ztau , ztau_sais ! wind intensity and of the seasonal cycle !SF REAL(wp) :: ztime ! time in hour !SF REAL(wp) :: ztimemax , ztimemin ! 21th June, and 21th decem. if date0 = 1st january !SF REAL(wp) :: ztimemax1, ztimemin1 ! 21th June, and 21th decem. if date0 = 1st january !SF REAL(wp) :: ztimemax2, ztimemin2 ! 21th June, and 21th decem. if date0 = 1st january !SF REAL(wp) :: ztaun ! intensity !SF REAL(wp) :: zemp_s, zemp_n, zemp_sais, ztstar !SF REAL(wp) :: zcos_sais1, zcos_sais2, ztrp, zconv, t_star !SF REAL(wp) :: zsumemp, zsurf !SF REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 !SF REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient !SF REAL(wp) :: ztx, zty, zmod, zcoef ! temporary variables !SF REAL(wp) :: zyydd ! number of days in one year !SF ------- !SF sbc ana: REAL(wp) :: zrhoa = 1.22_wp ! air density kg/m3 REAL(wp) :: zcdrag = 1.5e-3_wp ! drag coefficient REAL(wp) :: zfact, ztx ! local scalars REAL(wp) :: zcoef, zty, zmod ! - - INTEGER :: nn_tau000 = 0 ! gently increase the stress over the first ntau_rst time-steps REAL(wp) :: rn_utau0 = 0.e0 ! uniform value for the i-stress REAL(wp) :: rn_vtau0 = 0.e0 ! uniform value for the j-stress REAL(wp) :: rn_qns0 = 0.e0 ! uniform value for the total heat flux REAL(wp) :: rn_qsr0 = 0.e0 ! uniform value for the solar radiation REAL(wp) :: rn_emp0 = 0.e0 ! uniform value for the freswater budget (E-P) ! !!--------------------------------------------------------------------- ! IF( kt == nit000 ) THEN ! IF(lwp) WRITE(numout,*)' sbc_ana : Constant surface fluxes read in namsbc_ana namelist' IF(lwp) WRITE(numout,*)' ~~~~~~~ ' IF(lwp) WRITE(numout,*)' spin up of the stress nn_tau000 = ', nn_tau000, ' time-steps' IF(lwp) WRITE(numout,*)' constant j-stress rn_vtau0 = ', rn_vtau0 , ' N/m2' IF(lwp) WRITE(numout,*)' non solar heat flux rn_qns0 = ', rn_qns0 , ' W/m2' IF(lwp) WRITE(numout,*)' solar heat flux rn_qsr0 = ', rn_qsr0 , ' W/m2' IF(lwp) WRITE(numout,*)' net heat flux rn_emp0 = ', rn_emp0 , ' Kg/m2/s' ! nn_tau000 = MAX( nn_tau000, 1 ) ! must be >= 1 ! utau(:,:) = rn_utau0 vtau(:,:) = rn_vtau0 taum(:,:) = SQRT ( rn_utau0 * rn_utau0 + rn_vtau0 * rn_vtau0 ) wndm(:,:) = SQRT ( taum(1,1) / ( zrhoa * zcdrag ) ) ! emp (:,:) = rn_emp0 sfx (:,:) = 0.0_wp qns (:,:) = rn_qns0 - emp(:,:) * sst_m(:,:) * rcp ! including heat content associated with mass flux at SST qsr (:,:) = rn_qsr0 ! ENDIF IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN ! IF( kt <= nn_tau000 ) THEN ! Increase the stress to its nominal value ! ! during the first nn_tau000 ! time-steps zfact = 0.5 * ( 1. - COS( rpi * REAL( kt, wp ) / REAL( nn_tau000, wp ) ) ) zcoef = 1. / ( zrhoa * zcdrag ) ztx = zfact * rn_utau0 zty = zfact * rn_vtau0 zmod = SQRT( ztx * ztx + zty * zty ) utau(:,:) = ztx vtau(:,:) = zty taum(:,:) = zmod zmod = SQRT( zmod * zcoef ) wndm(:,:) = zmod ENDIF ! ! update heat and fresh water fluxes ! ! as they may have been changed by ! sbcssr module emp (:,:) = rn_emp0 ! NB: qns changes with SST if emp /= 0 sfx (:,:) = 0._wp qns (:,:) = rn_qns0 - emp(:,:) * sst_m(:,:) * rcp qsr (:,:) = rn_qsr0 ! ENDIF ! !SF END sbc ana !SF ----------- END SUBROUTINE usr_def_sbc !!====================================================================== END MODULE usrdef_sbc