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/2018/dev_r10057_ENHANCE03_ZTILDE/tests/COMODO-IW/MY_SRC – NEMO

source: NEMO/branches/2018/dev_r10057_ENHANCE03_ZTILDE/tests/COMODO-IW/MY_SRC/usrdef_istate.F90 @ 10118

Last change on this file since 10118 was 10118, checked in by jchanut, 6 years ago

ztilde update (4): #2126
Add internal wave ALE benchmark (from COMODO group)

File size: 5.8 KB
Line 
1MODULE usrdef_istate
2   !!======================================================================
3   !!                   ***  MODULE  usrdef_istate   ***
4   !!
5   !!                   ===  COMODO-IW configuration  ===
6   !!
7   !! User defined : set the initial state of a user configuration
8   !!======================================================================
9   !! History :  4.0 ! 2018-09 (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   !
19   USE in_out_manager ! I/O manager
20   USE lib_mpp        ! MPP library
21   
22   IMPLICIT NONE
23   PRIVATE
24
25   PUBLIC   usr_def_istate   ! called in istate.F90
26
27   !!----------------------------------------------------------------------
28   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
29   !! $Id:$
30   !! Software governed by the CeCILL licence     (./LICENSE)
31   !!----------------------------------------------------------------------
32CONTAINS
33 
34   SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv, pssh )
35      !!----------------------------------------------------------------------
36      !!                   ***  ROUTINE usr_def_istate  ***
37      !!
38      !! ** Purpose :   Initialization of the dynamics and tracers
39      !!                for "COMODO internal waves" setup
40      !!
41      !! ** Method  : - set temprature field
42      !!              - set salinity   field
43      !!----------------------------------------------------------------------
44      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
45      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask             [m]
46      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   pts     ! T & S fields      [Celsius ; g/kg]
47      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s]
48      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s]
49      REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height
50      !
51      INTEGER :: ji, jj, jk  ! dummy loop indices
52      INTEGER :: kcase
53      REAL(wp):: znn         ! Stratification
54      !!----------------------------------------------------------------------
55      !
56      IF(lwp) WRITE(numout,*)
57      IF(lwp) WRITE(numout,*) 'usr_def_istate : analytical definition of initial state '
58      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   Ocean at rest, with an horizontally uniform T and S profiles'
59      !
60      pu  (:,:,:) = 0._wp        ! ocean at rest
61      pv  (:,:,:) = 0._wp
62      pssh(:,:)   = 0._wp
63      !
64      znn = 0.002_wp ! N [s-1]
65      kcase = 1 
66      !
67      SELECT CASE ( kcase )
68         !
69      CASE( 1 )
70         DO jk = 1, jpk             ! Linearly stratified
71            DO jj = 1, jpj
72               DO ji = 1, jpi
73                  pts(ji,jj,jk,jp_tem) = (10._wp - (1026.2_wp-rau0) / rn_a0 &
74                       &                -(znn**2) * rau0 /grav / rn_a0 &
75                       &               * (pdept(ji,jj,jk)-50._wp)           &
76                       &                 ) * ptmask(ji,jj,jk)
77                  pts(ji,jj,jk,jp_sal) = 35._wp * ptmask(ji,jj,jk)
78               END DO
79            END DO
80         END DO
81      !
82      CASE( 2 )
83         DO jk=1, jpkm1             ! Interfacial waves:
84            DO jj=1,jpj             ! Set a two layer system with
85               DO ji=1,jpi          ! a density jump = 1.2 kg/m3 at z=50m
86                  IF ( 0.5_wp*(pdept(ji,jj,jk)+pdept(ji,jj,jk+1))<= 50._wp ) THEN
87                     pts(ji,jj,jk,jp_tem) = (10._wp - (1025.8_wp-rau0) / rn_a0 ) * ptmask(ji,jj,jk)
88                  ELSE                       
89                     pts(ji,jj,jk,jp_tem) = (10._wp - (1027.0_wp-rau0) / rn_a0 ) * ptmask(ji,jj,jk)
90                  ENDIF
91                  pts(ji,jj,jk,jp_sal) = 35._wp * ptmask(ji,jj,jk)
92               END DO
93            END DO
94         END DO
95         !
96      CASE( 3 )
97         DO jk=1, jpkm1             ! Interfacial waves:
98            DO jj=1,jpj                       ! stratification + mixed layer and thermocline
99               DO ji=1,jpi
100                  IF (pdept(ji,jj,jk)< 50._wp) THEN
101                     pts(ji,jj,jk,jp_tem) = (10._wp - (1025.0_wp-rau0) / rn_a0 ) * ptmask(ji,jj,jk)
102                  ELSEIF ((pdept(ji,jj,jk)>= 50._wp).AND.(pdept(ji,jj,jk)< 60._wp)) THEN
103                     pts(ji,jj,jk,jp_tem) =  (10._wp - (1026.2_wp-rau0) / rn_a0                   & 
104                     &                       -(znn**2) * rau0 /grav / rn_a0                  & 
105                     &                        * (pdept(ji,jj,jk)-50._wp)                          &
106                     &                       -1.2_wp * (pdept(ji,jj,jk)-60._wp) / 10._wp / rn_a0  &
107                     &                      ) * ptmask(ji,jj,jk)
108                  ELSEIF  (pdept(ji,jj,jk)>= 60._wp) THEN
109                     pts(ji,jj,jk,jp_tem) = (10._wp - (1026.2_wp-rau0) / rn_a0    & 
110                     &                       -(znn**2) * rau0 /grav / rn_a0  & 
111                     &                        * (pdept(ji,jj,jk)-50._wp)          &
112                     &                      ) * ptmask(ji,jj,jk)
113                  ENDIF
114                  pts(ji,jj,jk,jp_sal) = 35._wp * ptmask(ji,jj,jk)
115               END DO
116            END DO
117         END DO
118      !
119      END SELECT
120      !   
121   END SUBROUTINE usr_def_istate
122
123   !!======================================================================
124END MODULE usrdef_istate
Note: See TracBrowser for help on using the repository browser.