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.
usrdef_istate.F90 in NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/tests/DOME/MY_SRC – NEMO

source: NEMO/branches/2020/dev_r13312_AGRIF-03-04_jchanut_vinterp_tstep/tests/DOME/MY_SRC/usrdef_istate.F90 @ 14001

Last change on this file since 14001 was 14001, checked in by jchanut, 4 years ago

#2222, improve comments for DOME test case

File size: 5.5 KB
Line 
1MODULE usrdef_istate
2   !!==============================================================================
3   !!                       ***  MODULE usrdef_istate  ***
4   !!
5   !!                        ===  DOME configuration  ===
6   !!
7   !! User defined : set the initial state of a user configuration
8   !!==============================================================================
9   !! History :  NEMO 4.x ! 2020-12  (J. Chanut) Original code
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!  usr_def_istate : initial state in Temperature and salinity
14   !!----------------------------------------------------------------------
15   USE par_oce        ! ocean space and time domain
16   USE phycst         ! physical constants
17   !
18   USE in_out_manager ! I/O manager
19   USE lib_mpp        ! MPP library
20   
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   usr_def_istate   ! called by istate.F90
25
26   !!----------------------------------------------------------------------
27   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
28   !! $Id: usrdef_istate.F90 12489 2020-02-28 15:55:11Z davestorkey $
29   !! Software governed by the CeCILL license (see ./LICENSE)
30   !!----------------------------------------------------------------------
31   !! * Substitutions
32#  include "do_loop_substitute.h90"
33
34CONTAINS
35 
36   SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv, pssh )
37      !!----------------------------------------------------------------------
38      !!                   ***  ROUTINE usr_def_istate  ***
39      !!
40      !! ** Purpose :   Initialization of the dynamics and tracers
41      !!                Here OVERFLOW configuration
42      !!
43      !! ** Method  : - set temprature field
44      !!              - set salinity   field
45      !!
46      !! ** Reference: Legg, S., Hallberg, R. W.  and J. B. Girton, 2006:
47      !!               Comparison of entrainment in overflows simulated by z-coordinate,
48      !!               isopycnal and non-hydrostatic models. Ocean Modelling, 11, 69-97.
49      !!
50      !!----------------------------------------------------------------------
51      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
52      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask             [m]
53      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
54      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s]
55      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s]
56      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height
57      !
58      INTEGER  :: ji,jj,jk     ! dummy loop indices
59      REAL(wp) :: zdt, zn2, zrho1, zdb, zh, zstar, zxw, zro, zhe, zh0, zf
60      REAL(wp) :: zri1, zri2, zri, ztd, ztu
61      !!----------------------------------------------------------------------
62      !
63      IF(lwp) WRITE(numout,*)
64      IF(lwp) WRITE(numout,*) 'usr_def_istate : DOME configuration, analytical definition of initial state'
65      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   Ocean at rest, filled with a constant stratification '
66      IF(lwp) WRITE(numout,*) '                 salinity is used as a passive tracer here, initially=0' 
67      IF(lwp) WRITE(numout,*) '                 and set to 1 inside inlet' 
68      !
69      !
70      pu  (:,:,:) = 0._wp        ! ocean at rest
71      pv  (:,:,:) = 0._wp
72      pssh(:,:)   = 0._wp
73      pts(:,:,:,:) = 0._wp
74      !
75      zn2 = (2.3e-3)**2 ! brunt vaisala squared
76      zdb = 0.019       ! buoyancy anomaly
77      zh0 = 300._wp
78      zhe = 600._wp
79      zro = sqrt(zdb*zh0) / 1.e-4 ! Rossby radius
80      zri = 1._wp/3._wp 
81      zri1 =  zri / (2._wp-zri)
82      zri2 = -zri / (2._wp+zri) 
83      !                          ! T & S profiles
84      DO_2D( 1, 1, 1, 1 )
85         DO jk = 1, jpkm1
86            zdt =  pdept(ji,jj,jk)
87            zxw = (glamt(ji,jj) + 50._wp) * 1.e3 ! Distance from western wall
88            zh = zh0 * exp(-zxw/zro) 
89!            zstar = (zdt - zh - zhe) / zh
90!            IF (zstar.ge.zri1 ) THEN
91!               zf = 1._wp
92!            ELSEIF ( (zstar.gt.zri2).AND.(zstar.lt.zri1) ) THEN
93!               zf = zstar/(1._wp+zstar)/zri + 0.5_wp
94!            ELSE
95!               zf = 0._wp
96!            ENDIF
97            IF (zdt > zhe-zh) THEN
98               zf = 0._wp
99            ELSE
100               zf = 1._wp
101            ENDIF   
102            zrho1 = rho0*zn2*zdt/grav/0.2_wp
103            pts(ji,jj,jk,jp_tem) = (15._wp - zrho1) * ptmask(ji,jj,jk)
104! Mass conserving initialization:
105!            ztd = 15._wp*gdepw_0(ji,jj,jk+1)-0.5*rho0*zn2/(0.2_wp*grav)*gdepw_0(ji,jj,jk+1)**2
106!            ztu = 15._wp*gdepw_0(ji,jj,jk  )-0.5*rho0*zn2/(0.2_wp*grav)*gdepw_0(ji,jj,jk  )**2
107!            pts(ji,jj,jk,jp_tem) = (ztd - ztu)/e3t_0(ji,jj,jk) * ptmask(ji,jj,jk)
108            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-2 ) )  THEN
109               pv(ji,jj,jk) = -sqrt(zdb*zh0)*exp(-zxw/zro)*(1._wp-zf) * ptmask(ji,jj,jk)
110            ENDIF
111            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-1 ) )  THEN
112               pts(ji,jj,jk,jp_tem) = MIN(pts(ji,jj,jk,jp_tem), 15._wp - zdb*rho0/grav/0.2_wp*(1._wp-zf)) * ptmask(ji,jj,jk) 
113               pts(ji,jj,jk,jp_sal) = 1._wp * ptmask(ji,jj,jk) 
114            ENDIF
115         END DO
116      END_2D
117      !   
118   END SUBROUTINE usr_def_istate
119
120   !!======================================================================
121END MODULE usrdef_istate
Note: See TracBrowser for help on using the repository browser.