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 trunk/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90 @ 3294

Last change on this file since 3294 was 3294, checked in by rblod, 12 years ago

Merge of 3.4beta into the trunk

File size: 5.6 KB
Line 
1MODULE sbctide
2  !!=================================================================================
3  !!                       ***  MODULE  sbctide  ***
4  !! Initialization of tidal forcing
5  !! History :  9.0  !  07  (O. Le Galloudec)  Original code
6  !!=================================================================================
7  !! * Modules used
8  USE oce             ! ocean dynamics and tracers variables
9  USE dom_oce         ! ocean space and time domain
10  USE in_out_manager  ! I/O units
11  USE ioipsl          ! NetCDF IPSL library
12  USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
13  USE phycst
14  USE daymod
15  USE dynspg_oce
16  USE tide_mod
17  USE iom
18
19  IMPLICIT NONE
20  PUBLIC
21
22  REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: pot_astro
23  LOGICAL, PUBLIC :: ln_tide_pot = .false.
24#if defined key_tide
25
26  LOGICAL, PUBLIC, PARAMETER ::   lk_tide  = .TRUE.
27
28  REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) :: omega_tide 
29
30  REAL(wp), ALLOCATABLE, DIMENSION(:) ::  &
31       v0tide,      &
32       utide,       &
33       ftide
34
35  REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: amp_pot,phi_pot
36
37  INTEGER, PUBLIC :: nb_harmo
38  INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) :: ntide
39  INTEGER, PUBLIC :: nn_tide, kt_tide
40
41  !!---------------------------------------------------------------------------------
42  !!   OPA 9.0 , LODYC-IPSL  (2003)
43  !!---------------------------------------------------------------------------------
44
45CONTAINS
46
47  SUBROUTINE sbc_tide ( kt )
48    !!----------------------------------------------------------------------
49    !!                 ***  ROUTINE sbc_tide  ***
50    !!----------------------------------------------------------------------     
51    !! * Arguments
52    INTEGER, INTENT( in ) ::   kt     ! ocean time-step
53    !! * Local declarations
54    INTEGER  :: jk,ji
55    CHARACTER(LEN=4), DIMENSION(jpmax_harmo) :: clname
56    !!----------------------------------------------------------------------
57
58    NAMELIST/nam_tide/ln_tide_pot,nb_harmo,clname,nn_tide
59
60    IF ( kt == nit000 ) THEN
61
62       IF( .NOT. lk_dynspg_ts  )  CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' )
63
64    ! Read Namelist nam_tide
65
66    nn_tide=INT(rday/rdt)
67
68    CALL tide_init_Wave
69
70    REWIND ( numnam )
71    READ   ( numnam, nam_tide )
72
73    IF(lwp) THEN
74       WRITE(numout,*)
75       WRITE(numout,*) 'sbc_tide : Initialization of the tidal components'
76       WRITE(numout,*) '~~~~~~~ '
77    ENDIF
78
79    IF(lwp) THEN
80       WRITE(numout,*) '        Namelist nam_tide'
81       WRITE(numout,*) '        Apply astronomical potential : ln_tide_pot =', ln_tide_pot
82       WRITE(numout,*) '        nb_harmo    = ', nb_harmo
83       CALL flush(numout)
84    ENDIF
85
86    ALLOCATE(ntide     (nb_harmo))
87    DO jk=1,nb_harmo
88       DO ji=1,jpmax_harmo
89          IF (TRIM(clname(jk)) .eq. Wave(ji)%cname_tide) THEN
90             ntide(jk) = ji
91             EXIT
92          END IF
93       END DO
94    END DO
95    ALLOCATE(omega_tide(nb_harmo))
96    ALLOCATE(v0tide    (nb_harmo))
97    ALLOCATE(utide     (nb_harmo))
98    ALLOCATE(ftide     (nb_harmo))
99    ALLOCATE(amp_pot(jpi,jpj,nb_harmo))
100    ALLOCATE(phi_pot(jpi,jpj,nb_harmo))
101    ALLOCATE(pot_astro(jpi,jpj))
102    ENDIF
103
104    IF ( MOD( kt - 1, nn_tide ) == 0 ) THEN
105      kt_tide = kt
106      CALL tide_harmo(omega_tide, v0tide, utide, ftide, ntide, nb_harmo)
107    ENDIF
108
109    amp_pot(:,:,:) = 0.e0
110    phi_pot(:,:,:) = 0.e0
111    pot_astro(:,:) = 0.e0
112
113    IF (ln_tide_pot          ) CALL tide_init_potential
114
115  END SUBROUTINE sbc_tide
116
117  SUBROUTINE tide_init_potential
118    !!----------------------------------------------------------------------
119    !!                 ***  ROUTINE tide_init_potential  ***
120    !!----------------------------------------------------------------------
121    !! * Local declarations
122    INTEGER  :: ji,jj,jk
123    REAL(wp) :: zcons,ztmp1,ztmp2,zlat,zlon
124
125
126    DO jk=1,nb_harmo
127       zcons=0.7*Wave(ntide(jk))%equitide*ftide(jk)
128       do ji=1,jpi
129          do jj=1,jpj
130             ztmp1 = amp_pot(ji,jj,jk)*COS(phi_pot(ji,jj,jk))
131             ztmp2 = -amp_pot(ji,jj,jk)*SIN(phi_pot(ji,jj,jk))
132             zlat = gphit(ji,jj)*rad !! latitude en radian
133             zlon = glamt(ji,jj)*rad !! longitude en radian
134             ! le potentiel est composé des effets des astres:
135             IF (Wave(ntide(jk))%nutide .EQ.1) THEN
136                ztmp1= ztmp1 + zcons*(SIN(2.*zlat))*COS(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon)
137                ztmp2= ztmp2 - zcons*(SIN(2.*zlat))*SIN(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon)
138             ENDIF
139             IF (Wave(ntide(jk))%nutide.EQ.2) THEN
140                ztmp1= ztmp1 + zcons*(COS(zlat)**2)*COS(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon)
141                ztmp2= ztmp2 - zcons*(COS(zlat)**2)*SIN(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon)
142             ENDIF
143             amp_pot(ji,jj,jk)=SQRT(ztmp1**2+ztmp2**2)
144             phi_pot(ji,jj,jk)=ATAN2(-ztmp2/MAX(1.E-10,SQRT(ztmp1**2+ztmp2**2)),ztmp1/MAX(1.E-10,SQRT(ztmp1**2+ztmp2**2)))
145          enddo
146       enddo
147    END DO
148
149  END SUBROUTINE tide_init_potential
150
151#else
152  !!----------------------------------------------------------------------
153  !!   Default case :   Empty module
154  !!----------------------------------------------------------------------
155  LOGICAL, PUBLIC, PARAMETER ::   lk_tide = .FALSE.
156CONTAINS
157  SUBROUTINE sbc_tide( kt )      ! Empty routine
158    INTEGER         , INTENT(in) ::   kt         ! ocean time-step
159    WRITE(*,*) 'sbc_tide: You should not have seen this print! error?', kt
160  END SUBROUTINE sbc_tide
161#endif
162  !!======================================================================
163
164END MODULE sbctide
Note: See TracBrowser for help on using the repository browser.