2025-09-05 09:42:21 +02:00

142 lines
6.2 KiB
Fortran
Executable File

MODULE usrdef_istate
!!==============================================================================
!! *** MODULE usrdef_istate ***
!!
!! === DOME configuration ===
!!
!! User defined : set the initial state of a user configuration
!!==============================================================================
!! History : NEMO 4.x ! 2020-12 (J. Chanut) Original code
!!----------------------------------------------------------------------
!!----------------------------------------------------------------------
!! usr_def_istate : initial state in Temperature and salinity
!!----------------------------------------------------------------------
USE par_oce ! ocean space and time domain
USE phycst ! physical constants
USE eosbn2, ONLY: rn_a0
USE dom_oce
!
USE in_out_manager ! I/O manager
USE lib_mpp ! MPP library
IMPLICIT NONE
PRIVATE
PUBLIC usr_def_istate ! called by istate.F90
PUBlIC usr_def_istate_ssh
!!----------------------------------------------------------------------
!! NEMO/OCE 4.0 , NEMO Consortium (2018)
!! $Id: usrdef_istate.F90 12489 2020-02-28 15:55:11Z davestorkey $
!! Software governed by the CeCILL license (see ./LICENSE)
!!----------------------------------------------------------------------
!! * Substitutions
# include "do_loop_substitute.h90"
CONTAINS
SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv )
!!----------------------------------------------------------------------
!! *** ROUTINE usr_def_istate ***
!!
!! ** Purpose : Initialization of the dynamics and tracers
!! Here OVERFLOW configuration
!!
!! ** Method : - set temprature field
!! - set salinity field
!!
!! ** Reference: Legg, S., Hallberg, R. W. and J. B. Girton, 2006:
!! Comparison of entrainment in overflows simulated by z-coordinate,
!! isopycnal and non-hydrostatic models. Ocean Modelling, 11, 69-97.
!!
!!----------------------------------------------------------------------
REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: pdept ! depth of t-point [m]
REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: ptmask ! t-point ocean mask [m]
REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT( out) :: pts ! T & S fields [Celsius ; g/kg]
REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pu ! i-component of the velocity [m/s]
REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT( out) :: pv ! j-component of the velocity [m/s]
!
INTEGER :: ji,jj,jk ! dummy loop indices
REAL(wp) :: zdt, zn2, zrho1, zdb, zh, zstar, zxw, zro, zhe, zh0, zf
REAL(wp) :: zri1, zri2, zri, ztd, ztu
!!----------------------------------------------------------------------
!
IF(lwp) WRITE(numout,*)
IF(lwp) WRITE(numout,*) 'usr_def_istate : DOME configuration, analytical definition of initial state'
IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~ Ocean at rest, filled with a constant stratification '
IF(lwp) WRITE(numout,*) ' salinity is used as a passive tracer here, initially=0'
IF(lwp) WRITE(numout,*) ' and set to 1 inside inlet'
!
!
pu (:,:,:) = 0._wp ! ocean at rest
pv (:,:,:) = 0._wp
pts(:,:,:,:) = 0._wp
!
zn2 = (2.3e-3)**2 ! brunt vaisala squared
zdb = 0.019 ! buoyancy anomaly
zh0 = 300._wp
zhe = 600._wp
zro = sqrt(zdb*zh0) / 1.e-4 ! Rossby radius
zri = 1._wp/3._wp
zri1 = zri / (2._wp-zri)
zri2 = -zri / (2._wp+zri)
! ! T & S profiles
DO_2D( 1, 1, 1, 1 )
DO jk = 1, jpkm1
zdt = pdept(ji,jj,jk)
zxw = (glamt(ji,jj) + 50._wp) * 1.e3 ! Distance from western wall
zh = zh0 * exp(-zxw/zro)
! zstar = (zdt - zh - zhe) / zh
! IF (zstar.ge.zri1 ) THEN
! zf = 1._wp
! ELSEIF ( (zstar.gt.zri2).AND.(zstar.lt.zri1) ) THEN
! zf = zstar/(1._wp+zstar)/zri + 0.5_wp
! ELSE
! zf = 0._wp
! ENDIF
IF (zdt > zhe-zh) THEN
zf = 0._wp
ELSE
zf = 1._wp
ENDIF
zrho1 = rho0*zn2*zdt/grav/rn_a0
pts(ji,jj,jk,jp_tem) = (15._wp - zrho1) * ptmask(ji,jj,jk)
! Mass conserving initialization:
! ztd = 15._wp*gdepw_0(ji,jj,jk+1)-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk+1)**2
! ztu = 15._wp*gdepw_0(ji,jj,jk )-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk )**2
! pts(ji,jj,jk,jp_tem) = (ztd - ztu)/e3t_0(ji,jj,jk) * ptmask(ji,jj,jk)
IF (Agrif_root().AND.( mjg0(jj) == Nj0glo-2 ) ) THEN
pv(ji,jj,jk) = -sqrt(zdb*zh0)*exp(-zxw/zro)*(1._wp-zf) * ptmask(ji,jj,jk)
ENDIF
IF (Agrif_root().AND.( mjg0(jj) == Nj0glo-1 ) ) THEN
pts(ji,jj,jk,jp_tem) = MIN(pts(ji,jj,jk,jp_tem), 15._wp - zdb*rho0/grav/rn_a0*(1._wp-zf)) * ptmask(ji,jj,jk)
pts(ji,jj,jk,jp_sal) = 1._wp * ptmask(ji,jj,jk)
ENDIF
END DO
END_2D
!
END SUBROUTINE usr_def_istate
SUBROUTINE usr_def_istate_ssh( ptmask, pssh )
!!----------------------------------------------------------------------
!! *** ROUTINE usr_def_istate ***
!!
!! ** Purpose : Initialization of ssh
!! Here DOME configuration
!!
!! ** Method : set no initial sea level anomaly
!!
!!----------------------------------------------------------------------
REAL(wp), DIMENSION(jpi,jpj,jpk) , INTENT(in ) :: ptmask !
REAL(wp), DIMENSION(jpi,jpj) , INTENT( out) :: pssh !
!
!!----------------------------------------------------------------------
!
pssh(:,:) = 0._wp
!
END SUBROUTINE usr_def_istate_ssh
!!======================================================================
END MODULE usrdef_istate