source: NEMO/trunk/tests/DOME/MY_SRC/usrdef_istate.F90 @ 14254

Last change on this file since 14254 was 14254, checked in by jchanut, 4 months ago

#2222, DOME test case: for completeness, add online domain definition. input parameters changes

File size: 6.2 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   USE eosbn2, ONLY: rn_a0
18   USE dom_oce
19   !
20   USE in_out_manager ! I/O manager
21   USE lib_mpp        ! MPP library
22   
23   IMPLICIT NONE
24   PRIVATE
25
26   PUBLIC   usr_def_istate   ! called by istate.F90
27   PUBlIC   usr_def_istate_ssh
28   !!----------------------------------------------------------------------
29   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
30   !! $Id: usrdef_istate.F90 12489 2020-02-28 15:55:11Z davestorkey $
31   !! Software governed by the CeCILL license (see ./LICENSE)
32   !!----------------------------------------------------------------------
33   !! * Substitutions
34#  include "do_loop_substitute.h90"
35
36CONTAINS
37 
38   SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv )
39      !!----------------------------------------------------------------------
40      !!                   ***  ROUTINE usr_def_istate  ***
41      !!
42      !! ** Purpose :   Initialization of the dynamics and tracers
43      !!                Here OVERFLOW configuration
44      !!
45      !! ** Method  : - set temprature field
46      !!              - set salinity   field
47      !!
48      !! ** Reference: Legg, S., Hallberg, R. W.  and J. B. Girton, 2006:
49      !!               Comparison of entrainment in overflows simulated by z-coordinate,
50      !!               isopycnal and non-hydrostatic models. Ocean Modelling, 11, 69-97.
51      !!
52      !!----------------------------------------------------------------------
53      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
54      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask             [m]
55      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
56      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s]
57      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s]
58      !
59      INTEGER  :: ji,jj,jk     ! dummy loop indices
60      REAL(wp) :: zdt, zn2, zrho1, zdb, zh, zstar, zxw, zro, zhe, zh0, zf
61      REAL(wp) :: zri1, zri2, zri, ztd, ztu
62      !!----------------------------------------------------------------------
63      !
64      IF(lwp) WRITE(numout,*)
65      IF(lwp) WRITE(numout,*) 'usr_def_istate : DOME configuration, analytical definition of initial state'
66      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   Ocean at rest, filled with a constant stratification '
67      IF(lwp) WRITE(numout,*) '                 salinity is used as a passive tracer here, initially=0' 
68      IF(lwp) WRITE(numout,*) '                 and set to 1 inside inlet' 
69      !
70      !
71      pu  (:,:,:) = 0._wp        ! ocean at rest
72      pv  (:,:,:) = 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/rn_a0
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/(rn_a0*grav)*gdepw_0(ji,jj,jk+1)**2
106            ztu = 15._wp*gdepw_0(ji,jj,jk  )-0.5*rho0*zn2/(rn_a0*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/rn_a0*(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 
121   SUBROUTINE usr_def_istate_ssh( ptmask, pssh )
122      !!----------------------------------------------------------------------
123      !!                   ***  ROUTINE usr_def_istate  ***
124      !!
125      !! ** Purpose :   Initialization of ssh
126      !!                Here DOME configuration
127      !!
128      !! ** Method  :   set no initial sea level anomaly
129      !! 
130      !!----------------------------------------------------------------------
131      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  !
132      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    !
133      !
134      !!----------------------------------------------------------------------
135      !
136      pssh(:,:) = 0._wp
137      !
138   END SUBROUTINE usr_def_istate_ssh
139
140   !!======================================================================
141END MODULE usrdef_istate
Note: See TracBrowser for help on using the repository browser.