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.
sbctide.F90 in branches/2017/dev_r8329_ENHANCE14_SAL/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: branches/2017/dev_r8329_ENHANCE14_SAL/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90 @ 8363

Last change on this file since 8363 was 8363, checked in by cbricaud, 7 years ago

commit change for in 2017WP/ENHANCE-14_Jerome_SAL branch ; see ticket #1926

  • Property svn:keywords set to Id
File size: 7.2 KB
Line 
1MODULE sbctide
2   !!======================================================================
3   !!                       ***  MODULE  sbctide  ***
4   !! Initialization of tidal forcing
5   !!======================================================================
6   !! History :  9.0  !  2007  (O. Le Galloudec)  Original code
7   !!----------------------------------------------------------------------
8   USE oce            ! ocean dynamics and tracers variables
9   USE dom_oce        ! ocean space and time domain
10   USE phycst         ! physical constant
11   USE daymod         ! calandar
12   USE tideini        !
13   USE wrk_nemo        ! Memory allocation
14   !
15   USE in_out_manager ! I/O units
16   USE iom            ! xIOs server
17   USE ioipsl         ! NetCDF IPSL library
18   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
19
20   IMPLICIT NONE
21   PUBLIC
22
23   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   pot_astro   !
24
25   !!----------------------------------------------------------------------
26   !!   tidal potential
27   !!----------------------------------------------------------------------
28   !!   sbc_tide            :
29   !!   tide_init_potential :
30   !!----------------------------------------------------------------------
31
32   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   amp_pot, phi_pot
33   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   amp_load, phi_load
34 
35   !!----------------------------------------------------------------------
36   !! NEMO/OPA 3.5 , NEMO Consortium (2013)
37   !! $Id$
38   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
39   !!----------------------------------------------------------------------
40CONTAINS
41
42   SUBROUTINE sbc_tide( kt )
43      !!----------------------------------------------------------------------
44      !!                 ***  ROUTINE sbc_tide  ***
45      !!----------------------------------------------------------------------     
46      INTEGER, INTENT( in ) ::   kt     ! ocean time-step
47      INTEGER               ::   jk     ! dummy loop index
48      INTEGER               ::   nsec_day_orig     ! Temporary variable
49      !!----------------------------------------------------------------------
50     
51      IF( nsec_day == NINT(0.5_wp * rdt) .OR. kt == nit000 ) THEN      ! start a new day
52         !
53         IF( kt == nit000 )THEN
54            ALLOCATE( amp_pot(jpi,jpj,nb_harmo),                      &
55               &      phi_pot(jpi,jpj,nb_harmo), pot_astro(jpi,jpj)   )
56            IF( ln_tide_load )THEN
57               ALLOCATE( amp_load(jpi,jpj,nb_harmo), phi_load(jpi,jpj,nb_harmo) )
58               CALL tide_init_load
59            ENDIF
60         ENDIF
61         !
62         IF( ln_tide_load )THEN
63            amp_pot(:,:,:) = amp_load(:,:,:)
64            phi_pot(:,:,:) = phi_load(:,:,:)
65         ELSE
66            amp_pot(:,:,:) = 0._wp
67            phi_pot(:,:,:) = 0._wp
68         ENDIF
69         pot_astro(:,:) = 0._wp
70         !
71         ! If the run does not start from midnight then need to initialise tides
72         ! at the start of the current day (only occurs when kt==nit000)
73         ! Temporarily set nsec_day to beginning of day.
74         nsec_day_orig = nsec_day
75         IF ( nsec_day /= NINT(0.5_wp * rdt) ) THEN
76            kt_tide = kt - (nsec_day - 0.5_wp * rdt)/rdt
77            nsec_day = NINT(0.5_wp * rdt)
78         ELSE
79            kt_tide = kt 
80         ENDIF
81         CALL tide_harmo( omega_tide, v0tide, utide, ftide, ntide, nb_harmo )
82         !
83         !
84         IF(lwp) THEN
85            WRITE(numout,*)
86            WRITE(numout,*) 'sbc_tide : Update of the components and (re)Init. the potential at kt=', kt
87            WRITE(numout,*) '~~~~~~~~ '
88            DO jk = 1, nb_harmo
89               WRITE(numout,*) Wave(ntide(jk))%cname_tide, utide(jk), ftide(jk), v0tide(jk), omega_tide(jk)
90            END DO
91         ENDIF
92         !
93         IF( ln_tide_pot )   CALL tide_init_potential
94         !
95         ! Reset nsec_day
96         nsec_day = nsec_day_orig 
97      ENDIF
98      !
99   END SUBROUTINE sbc_tide
100
101
102   SUBROUTINE tide_init_potential
103      !!----------------------------------------------------------------------
104      !!                 ***  ROUTINE tide_init_potential  ***
105      !!----------------------------------------------------------------------
106      INTEGER  ::   ji, jj, jk   ! dummy loop indices
107      REAL(wp) ::   zcons, ztmp1, ztmp2, zlat, zlon, ztmp, zamp, zcs   ! local scalar
108      !!----------------------------------------------------------------------
109
110      DO jk = 1, nb_harmo
111         zcons = 0.7_wp * Wave(ntide(jk))%equitide * ftide(jk)
112         DO ji = 1, jpi
113            DO jj = 1, jpj
114               ztmp1 =  ftide(jk) * amp_pot(ji,jj,jk) * COS( phi_pot(ji,jj,jk) + v0tide(jk) + utide(jk) )
115               ztmp2 = -ftide(jk) * amp_pot(ji,jj,jk) * SIN( phi_pot(ji,jj,jk) + v0tide(jk) + utide(jk) )
116               zlat = gphit(ji,jj)*rad !! latitude en radian
117               zlon = glamt(ji,jj)*rad !! longitude en radian
118               ztmp = v0tide(jk) + utide(jk) + Wave(ntide(jk))%nutide * zlon
119               ! le potentiel est composé des effets des astres:
120               IF    ( Wave(ntide(jk))%nutide == 1 )  THEN  ;  zcs = zcons * SIN( 2._wp*zlat )
121               ELSEIF( Wave(ntide(jk))%nutide == 2 )  THEN  ;  zcs = zcons * COS( zlat )**2
122               ELSE                                         ;  zcs = 0._wp
123               ENDIF
124               ztmp1 = ztmp1 + zcs * COS( ztmp )
125               ztmp2 = ztmp2 - zcs * SIN( ztmp )
126               zamp = SQRT( ztmp1*ztmp1 + ztmp2*ztmp2 )
127               amp_pot(ji,jj,jk) = zamp
128               phi_pot(ji,jj,jk) = ATAN2( -ztmp2 / MAX( 1.e-10_wp , zamp ) ,   &
129                  &                        ztmp1 / MAX( 1.e-10_wp,  zamp )   )
130            END DO
131         END DO
132      END DO
133      !
134   END SUBROUTINE tide_init_potential
135
136   SUBROUTINE tide_init_load
137      !!----------------------------------------------------------------------
138      !!                 ***  ROUTINE tide_init_load  ***
139      !!----------------------------------------------------------------------
140      INTEGER :: inum                 ! Logical unit of input file
141      INTEGER :: ji, jj, itide        ! dummy loop indices
142      REAL(wp), POINTER, DIMENSION(:,:) ::   ztr, zti   !: workspace to read in tidal harmonics data
143      !!----------------------------------------------------------------------
144      IF(lwp) THEN
145         WRITE(numout,*)
146         WRITE(numout,*) 'tide_init_load : Initialization of load potential'
147         WRITE(numout,*) '~~~~~~~~~~~~~~ '
148      ENDIF
149      !
150      CALL wrk_alloc( jpi, jpj, zti, ztr )
151      !
152      CALL iom_open ( filetide_load , inum )
153      !
154      DO itide = 1, nb_harmo
155         CALL iom_get  ( inum, jpdom_data,TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) )
156         CALL iom_get  ( inum, jpdom_data,TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) )
157         !
158         DO ji=1,jpi
159            DO jj=1,jpj
160               amp_load(ji,jj,itide) =  SQRT( ztr(ji,jj)**2. + zti(ji,jj)**2. )
161               phi_load(ji,jj,itide) = ATAN2(-zti(ji,jj), ztr(ji,jj) )
162            END DO
163         END DO
164         !
165      END DO
166      CALL iom_close( inum )
167      !
168      CALL wrk_dealloc( jpi, jpj, zti, ztr )
169      !
170   END SUBROUTINE tide_init_load
171
172  !!======================================================================
173END MODULE sbctide
Note: See TracBrowser for help on using the repository browser.