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.
Changeset 4292 for branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90 – NEMO

Ignore:
Timestamp:
2013-11-20T17:28:04+01:00 (11 years ago)
Author:
cetlod
Message:

dev_MERGE_2013 : 1st step of the merge, see ticket #1185

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_MERGE_2013/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90

    r3651 r4292  
    11MODULE 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 tideini 
    17   USE iom 
     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 
     11   USE daymod 
     12   USE dynspg_oce 
     13   USE tideini 
     14   ! 
     15   USE iom 
     16   USE in_out_manager  ! I/O units 
     17   USE ioipsl          ! NetCDF IPSL library 
     18   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    1819 
    19   IMPLICIT NONE 
    20   PUBLIC 
     20   IMPLICIT NONE 
     21   PUBLIC 
    2122 
    22   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: pot_astro 
     23   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   pot_astro   ! 
    2324 
    2425#if defined key_tide 
     26   !!---------------------------------------------------------------------- 
     27   !!   'key_tide' :                                        tidal potential 
     28   !!---------------------------------------------------------------------- 
     29   !!   sbc_tide            :  
     30   !!   tide_init_potential : 
     31   !!---------------------------------------------------------------------- 
    2532 
    26   LOGICAL, PUBLIC, PARAMETER ::   lk_tide  = .TRUE. 
    27   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: amp_pot,phi_pot 
    28   !!--------------------------------------------------------------------------------- 
    29   !!   OPA 9.0 , LODYC-IPSL  (2003) 
    30   !!--------------------------------------------------------------------------------- 
     33   LOGICAL, PUBLIC, PARAMETER ::   lk_tide  = .TRUE. 
     34   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   amp_pot, phi_pot 
    3135 
     36   !!---------------------------------------------------------------------- 
     37   !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
     38   !! $Id: $ 
     39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     40   !!---------------------------------------------------------------------- 
    3241CONTAINS 
    3342 
    34   SUBROUTINE sbc_tide ( kt ) 
    35     !!---------------------------------------------------------------------- 
    36     !!                 ***  ROUTINE sbc_tide  *** 
    37     !!----------------------------------------------------------------------       
    38     !! * Arguments 
    39     INTEGER, INTENT( in ) ::   kt     ! ocean time-step 
    40     !!---------------------------------------------------------------------- 
     43   SUBROUTINE sbc_tide( kt ) 
     44      !!---------------------------------------------------------------------- 
     45      !!                 ***  ROUTINE sbc_tide  *** 
     46      !!----------------------------------------------------------------------       
     47      INTEGER, INTENT( in ) ::   kt     ! ocean time-step 
     48      INTEGER               ::   jk     ! dummy loop index 
     49      !!---------------------------------------------------------------------- 
    4150 
    42     IF ( kt == nit000 .AND. .NOT. lk_dynspg_ts )  CALL ctl_stop( 'STOP', 'sbc_tide : tidal potential use only with time splitting' ) 
    43  
    44     IF ( nsec_day == NINT(0.5 * rdttra(1)) ) THEN 
     51      IF( nsec_day == NINT(0.5_wp * rdttra(1)) ) 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         ENDIF 
     57         ! 
     58         amp_pot(:,:,:) = 0._wp 
     59         phi_pot(:,:,:) = 0._wp 
     60         pot_astro(:,:) = 0._wp 
     61         ! 
     62         CALL tide_harmo( omega_tide, v0tide, utide, ftide, ntide, nb_harmo ) 
     63         ! 
     64         kt_tide = kt 
     65         ! 
     66         IF(lwp) THEN 
     67            WRITE(numout,*) 
     68            WRITE(numout,*) 'sbc_tide : Update of the components and (re)Init. the potential at kt=', kt 
     69            WRITE(numout,*) '~~~~~~~~ ' 
     70            DO jk = 1, nb_harmo 
     71               WRITE(numout,*) Wave(ntide(jk))%cname_tide, utide(jk), ftide(jk), v0tide(jk), omega_tide(jk) 
     72            END DO 
     73         ENDIF 
     74         ! 
     75         IF( ln_tide_pot )   CALL tide_init_potential 
     76         ! 
     77      ENDIF 
    4578      ! 
    46       kt_tide = kt 
    47  
    48       IF(lwp) THEN 
    49          WRITE(numout,*) 
    50          WRITE(numout,*) 'sbc_tide : (re)Initialization of the tidal potential at kt=',kt 
    51          WRITE(numout,*) '~~~~~~~ ' 
    52       ENDIF 
    53  
    54       IF(lwp) THEN 
    55          IF ( kt == nit000 ) WRITE(numout,*) 'Apply astronomical potential : ln_tide_pot =', ln_tide_pot 
    56          CALL flush(numout) 
    57       ENDIF 
    58  
    59       IF ( kt == nit000 ) ALLOCATE(amp_pot(jpi,jpj,nb_harmo)) 
    60       IF ( kt == nit000 ) ALLOCATE(phi_pot(jpi,jpj,nb_harmo)) 
    61       IF ( kt == nit000 ) ALLOCATE(pot_astro(jpi,jpj)) 
    62  
    63       amp_pot(:,:,:) = 0.e0 
    64       phi_pot(:,:,:) = 0.e0 
    65       pot_astro(:,:) = 0.e0 
    66  
    67       IF ( ln_tide_pot ) CALL tide_init_potential 
    68       ! 
    69     ENDIF 
    70  
    71   END SUBROUTINE sbc_tide 
    72  
    73   SUBROUTINE tide_init_potential 
    74     !!---------------------------------------------------------------------- 
    75     !!                 ***  ROUTINE tide_init_potential  *** 
    76     !!---------------------------------------------------------------------- 
    77     !! * Local declarations 
    78     INTEGER  :: ji,jj,jk 
    79     REAL(wp) :: zcons,ztmp1,ztmp2,zlat,zlon 
     79   END SUBROUTINE sbc_tide 
    8080 
    8181 
    82     DO jk=1,nb_harmo 
    83        zcons=0.7*Wave(ntide(jk))%equitide*ftide(jk) 
    84        do ji=1,jpi 
    85           do jj=1,jpj 
    86              ztmp1 = amp_pot(ji,jj,jk)*COS(phi_pot(ji,jj,jk)) 
    87              ztmp2 = -amp_pot(ji,jj,jk)*SIN(phi_pot(ji,jj,jk)) 
    88              zlat = gphit(ji,jj)*rad !! latitude en radian 
    89              zlon = glamt(ji,jj)*rad !! longitude en radian 
    90              ! le potentiel est composé des effets des astres: 
    91              IF (Wave(ntide(jk))%nutide .EQ.1) THEN 
    92                 ztmp1= ztmp1 + zcons*(SIN(2.*zlat))*COS(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon) 
    93                 ztmp2= ztmp2 - zcons*(SIN(2.*zlat))*SIN(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon) 
    94              ENDIF 
    95              IF (Wave(ntide(jk))%nutide.EQ.2) THEN 
    96                 ztmp1= ztmp1 + zcons*(COS(zlat)**2)*COS(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon) 
    97                 ztmp2= ztmp2 - zcons*(COS(zlat)**2)*SIN(v0tide(jk)+utide(jk)+Wave(ntide(jk))%nutide*zlon) 
    98              ENDIF 
    99              amp_pot(ji,jj,jk)=SQRT(ztmp1**2+ztmp2**2) 
    100              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))) 
    101           enddo 
    102        enddo 
    103     END DO 
     82   SUBROUTINE tide_init_potential 
     83      !!---------------------------------------------------------------------- 
     84      !!                 ***  ROUTINE tide_init_potential  *** 
     85      !!---------------------------------------------------------------------- 
     86      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
     87      REAL(wp) ::   zcons, ztmp1, ztmp2, zlat, zlon, ztmp, zamp, zcs   ! local scalar 
     88      !!---------------------------------------------------------------------- 
    10489 
    105   END SUBROUTINE tide_init_potential 
     90      DO jk = 1, nb_harmo 
     91         zcons = 0.7_wp * Wave(ntide(jk))%equitide * ftide(jk) 
     92         DO ji = 1, jpi 
     93            DO jj = 1, jpj 
     94               ztmp1 =  amp_pot(ji,jj,jk) * COS( phi_pot(ji,jj,jk) ) 
     95               ztmp2 = -amp_pot(ji,jj,jk) * SIN( phi_pot(ji,jj,jk) ) 
     96               zlat = gphit(ji,jj)*rad !! latitude en radian 
     97               zlon = glamt(ji,jj)*rad !! longitude en radian 
     98               ztmp = v0tide(jk) + utide(jk) + Wave(ntide(jk))%nutide * zlon 
     99               ! le potentiel est composé des effets des astres: 
     100               IF    ( Wave(ntide(jk))%nutide == 1 )  THEN  ;  zcs = zcons * SIN( 2._wp*zlat ) 
     101               ELSEIF( Wave(ntide(jk))%nutide == 2 )  THEN  ;  zcs = zcons * COS( zlat )**2 
     102               ELSE                                         ;  zcs = 0._wp 
     103               ENDIF 
     104               ztmp1 = ztmp1 + zcs * COS( ztmp ) 
     105               ztmp2 = ztmp2 - zcs * SIN( ztmp ) 
     106               zamp = SQRT( ztmp1*ztmp1 + ztmp2*ztmp2 ) 
     107               amp_pot(ji,jj,jk) = zamp 
     108               phi_pot(ji,jj,jk) = ATAN2( -ztmp2 / MAX( 1.e-10_wp , zamp ) ,   & 
     109                  &                        ztmp1 / MAX( 1.e-10_wp,  zamp )   ) 
     110            END DO 
     111         END DO 
     112      END DO 
     113      ! 
     114   END SUBROUTINE tide_init_potential 
    106115 
    107116#else 
     
    116125  END SUBROUTINE sbc_tide 
    117126#endif 
     127 
    118128  !!====================================================================== 
    119  
    120129END MODULE sbctide 
Note: See TracChangeset for help on using the changeset viewer.