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 3953 for branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90 – NEMO

Ignore:
Timestamp:
2013-07-03T13:41:32+02:00 (11 years ago)
Author:
gm
Message:

dev_r3858_NOC_ZTC, #863 : activate tide potential in filtered ssh case + style in tide modules

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2013/dev_r3858_NOC_ZTC/NEMOGCM/NEMO/OPA_SRC/DIA/diaharm.F90

    r3294 r3953  
    11MODULE diaharm  
    2  
    3 #if defined key_diaharm && defined key_tide 
    4    !!================================================================================= 
     2   !!====================================================================== 
    53   !!                       ***  MODULE  diaharm  *** 
    64   !! Harmonic analysis of tidal constituents  
    7    !!================================================================================= 
    8    !! * Modules used 
     5   !!====================================================================== 
     6   !! History :  3.1  !  2007  (O. Le Galloudec, J. Chanut)  Original code 
     7   !!---------------------------------------------------------------------- 
     8#if defined key_diaharm && defined key_tide 
     9   !!---------------------------------------------------------------------- 
     10   !!   'key_diaharm' 
     11   !!   'key_tide' 
     12   !!---------------------------------------------------------------------- 
    913   USE oce             ! ocean dynamics and tracers variables 
    1014   USE dom_oce         ! ocean space and time domain 
    11    USE in_out_manager  ! I/O units 
    12    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    13    USE ioipsl          ! NetCDF IPSL library 
    14    USE diadimg         ! To write dimg 
    1515   USE phycst 
    1616   USE dynspg_oce 
     
    1818   USE daymod 
    1919   USE tide_mod 
    20    USE iom  
     20   USE in_out_manager  ! I/O units 
     21   USE iom             ! I/0 library 
     22   USE ioipsl          ! NetCDF IPSL library 
     23   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     24   USE diadimg         ! To write dimg 
    2125   USE timing          ! preformance summary 
    2226   USE wrk_nemo        ! working arrays 
     
    3034   INTEGER, PARAMETER :: jpdimsparse  = jpincomax*300*24 
    3135 
    32    INTEGER ::                            & !! namelist variables 
    33                          nit000_han = 1, & ! First time step used for harmonic analysis 
    34                          nitend_han = 1, & ! Last time step used for harmonic analysis 
    35                          nstep_han  = 1, & ! Time step frequency for harmonic analysis 
    36                          nb_ana            ! Number of harmonics to analyse 
    37  
    38    INTEGER , ALLOCATABLE, DIMENSION(:)       :: name 
    39    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) :: ana_temp 
    40    REAL(wp), ALLOCATABLE, DIMENSION(:)       :: ana_freq, vt, ut, ft 
    41    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   :: out_eta, & 
    42                                                 out_u  , & 
    43                                                 out_v 
    44  
    45    INTEGER :: ninco, nsparse 
    46    INTEGER ,       DIMENSION(jpdimsparse)         :: njsparse, nisparse 
    47    INTEGER , SAVE, DIMENSION(jpincomax)           :: ipos1 
    48    REAL(wp),       DIMENSION(jpdimsparse)         :: valuesparse 
    49    REAL(wp),       DIMENSION(jpincomax)           :: ztmp4 , ztmp7 
    50    REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) :: ztmp3 , zpilier 
    51    REAL(wp), SAVE, DIMENSION(jpincomax)           :: zpivot 
    52  
    53    CHARACTER (LEN=4), DIMENSION(jpmax_harmo) ::   & 
    54        tname         ! Names of tidal constituents ('M2', 'K1',...) 
    55  
    56  
    57 !! * Routine accessibility 
    58    PUBLIC  dia_harm    ! routine called by step.F90 
    59  
    60    !!--------------------------------------------------------------------------------- 
    61    !!   
    62    !!--------------------------------------------------------------------------------- 
    63  
     36   !                            !!!namelist variables 
     37   INTEGER ::   nit000_han = 1   ! First time step used for harmonic analysis 
     38   INTEGER ::   nitend_han = 1   ! Last time step used for harmonic analysis 
     39   INTEGER ::   nstep_han  = 1   ! Time step frequency for harmonic analysis 
     40   INTEGER ::   nb_ana           ! Number of harmonics to analyse 
     41 
     42   INTEGER , ALLOCATABLE, DIMENSION(:)       ::   name 
     43   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ana_temp 
     44   REAL(wp), ALLOCATABLE, DIMENSION(:)       ::   ana_freq, ut   , vt   , ft 
     45   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:)   ::   out_eta , out_u, out_v 
     46 
     47   INTEGER ::   ninco, nsparse 
     48   INTEGER ,       DIMENSION(jpdimsparse)         ::   njsparse, nisparse 
     49   INTEGER , SAVE, DIMENSION(jpincomax)           ::   ipos1 
     50   REAL(wp),       DIMENSION(jpdimsparse)         ::   valuesparse 
     51   REAL(wp),       DIMENSION(jpincomax)           ::   ztmp4 , ztmp7 
     52   REAL(wp), SAVE, DIMENSION(jpincomax,jpincomax) ::   ztmp3 , zpilier 
     53   REAL(wp), SAVE, DIMENSION(jpincomax)           ::   zpivot 
     54 
     55   CHARACTER (LEN=4), DIMENSION(jpmax_harmo) ::   tname   ! Names of tidal constituents ('M2', 'K1',...) 
     56 
     57   PUBLIC   dia_harm   ! routine called by step.F90 
     58 
     59   !!---------------------------------------------------------------------- 
     60   !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
     61   !! $Id:$ 
     62   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     63   !!---------------------------------------------------------------------- 
    6464CONTAINS 
    6565 
     
    6767      !!---------------------------------------------------------------------- 
    6868      !!                 ***  ROUTINE dia_harm_init  *** 
    69       !!---------------------------------------------------------------------- 
    7069      !!          
    7170      !! ** Purpose :   Initialization of tidal harmonic analysis 
     
    7372      !! ** Method  :   Initialize frequency array and  nodal factor for nit000_han 
    7473      !! 
    75       !! History : 
    76       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    77       !!-------------------------------------------------------------------- 
    78       !! * Local declarations  
     74      !!-------------------------------------------------------------------- 
    7975      INTEGER :: jh, nhan, jk, ji 
    80  
     76      ! 
    8177      NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, tname 
    8278      !!---------------------------------------------------------------------- 
     
    9288      tname(:)='' 
    9389      ! 
    94       ! Read Namelist nam_diaharm 
    95       REWIND ( numnam ) 
    96       READ   ( numnam, nam_diaharm ) 
     90      REWIND( numnam )                   ! Read Namelist nam_diaharm 
     91      READ  ( numnam, nam_diaharm ) 
    9792      ! 
    9893      IF(lwp) THEN 
     
    10499      ! Basic checks on harmonic analysis time window: 
    105100      ! ---------------------------------------------- 
    106       IF (nit000 > nit000_han) THEN 
    107         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nit000_han must be greater than nit000, stop' 
    108         IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    109         nstop = nstop + 1 
    110       ENDIF 
    111       IF (nitend < nitend_han) THEN 
    112         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nitend_han must be lower than nitend, stop' 
    113         IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    114         nstop = nstop + 1 
    115       ENDIF 
    116  
    117       IF (MOD(nitend_han-nit000_han+1,nstep_han).NE.0) THEN 
    118         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : analysis time span must be a multiple of nstep_han, stop' 
    119         nstop = nstop + 1 
    120       END IF 
    121  
    122       nb_ana=0 
     101      IF( nit000 > nit000_han )   CALL ctl_stop( 'dia_harm_init : nit000_han must be greater than nit000',   & 
     102         &                                       ' restart capability not implemented' ) 
     103      IF( nitend < nitend_han )   CALL ctl_stop( 'dia_harm_init : nitend_han must be lower than nitend',   & 
     104         &                                       'restart capability not implemented' ) 
     105 
     106      IF( MOD( nitend_han-nit000_han+1 , nstep_han ) /= 0 )   & 
     107         &                        CALL ctl_stop( 'dia_harm_init : analysis time span must be a multiple of nstep_han' ) 
     108 
     109      nb_ana = 0 
    123110      DO jk=1,jpmax_harmo 
    124111         DO ji=1,jpmax_harmo 
     
    153140      ! Initialize frequency array: 
    154141      ! --------------------------- 
    155       ALLOCATE(ana_freq(nb_ana)) 
    156       ALLOCATE(vt      (nb_ana)) 
    157       ALLOCATE(ut      (nb_ana)) 
    158       ALLOCATE(ft      (nb_ana)) 
    159  
    160       CALL tide_harmo(ana_freq, vt, ut , ft, name ,nb_ana) 
     142      ALLOCATE( ana_freq(nb_ana), ut(nb_ana), vt(nb_ana), ft(nb_ana) ) 
     143 
     144      CALL tide_harmo( ana_freq, vt, ut, ft, name, nb_ana ) 
    161145 
    162146      IF(lwp) WRITE(numout,*) 'Analysed frequency  : ',nb_ana ,'Frequency ' 
     
    168152      ! Initialize temporary arrays: 
    169153      ! ---------------------------- 
    170       ALLOCATE( ana_temp(jpi,jpj,nb_ana*2,3)) 
     154      ALLOCATE( ana_temp(jpi,jpj,2*nb_ana,3) ) 
    171155      ana_temp(:,:,:,:) = 0.e0 
    172156 
    173157   END SUBROUTINE dia_harm_init 
    174     
     158 
     159 
    175160   SUBROUTINE dia_harm ( kt ) 
    176161      !!---------------------------------------------------------------------- 
    177162      !!                 ***  ROUTINE dia_harm  *** 
    178       !!---------------------------------------------------------------------- 
    179163      !!          
    180164      !! ** Purpose :   Tidal harmonic analysis main routine 
     
    182166      !! ** Action  :   Sums ssh/u/v over time analysis [nit000_han,nitend_han] 
    183167      !! 
    184       !! History : 
    185       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    186       !!-------------------------------------------------------------------- 
    187       !! * Argument: 
     168      !!-------------------------------------------------------------------- 
    188169      INTEGER, INTENT( IN ) :: kt 
    189  
    190       !! * Local declarations 
     170      ! 
    191171      INTEGER  :: ji, jj, jh, jc, nhc 
    192172      REAL(wp) :: ztime, ztemp 
     
    194174      IF( nn_timing == 1 )   CALL timing_start('dia_harm') 
    195175 
    196       IF ( kt .EQ. nit000 ) CALL dia_harm_init 
     176      IF ( kt == nit000 ) CALL dia_harm_init 
    197177 
    198178      IF ( ((kt.GE.nit000_han).AND.(kt.LE.nitend_han)).AND. & 
     
    211191              DO ji = 1,jpi 
    212192                ! Elevation 
    213                 ana_temp(ji,jj,nhc,1) = ana_temp(ji,jj,nhc,1)                & 
    214                                         + ztemp*sshn(ji,jj)*tmask(ji,jj,1)         
     193                ana_temp(ji,jj,nhc,1) = ana_temp(ji,jj,nhc,1) + ztemp*sshn(ji,jj)           *tmask(ji,jj,1)         
    215194#if defined key_dynspg_ts 
    216                 ! ubar 
    217                 ana_temp(ji,jj,nhc,2) = ana_temp(ji,jj,nhc,2)                & 
    218                                         + ztemp*un_b(ji,jj)*hur(ji,jj)*umask(ji,jj,1) 
    219                 ! vbar 
    220                 ana_temp(ji,jj,nhc,3) = ana_temp(ji,jj,nhc,3)                & 
    221                                         + ztemp*vn_b(ji,jj)*hvr(ji,jj)*vmask(ji,jj,1) 
     195                ana_temp(ji,jj,nhc,2) = ana_temp(ji,jj,nhc,2) + ztemp*un_b(ji,jj)*hur(ji,jj)*umask(ji,jj,1) 
     196                ana_temp(ji,jj,nhc,3) = ana_temp(ji,jj,nhc,3) + ztemp*vn_b(ji,jj)*hvr(ji,jj)*vmask(ji,jj,1) 
    222197#endif 
    223198              END DO 
     
    229204      END IF 
    230205 
    231       IF ( kt .EQ. nitend_han ) CALL dia_harm_end 
     206      IF ( kt == nitend_han )  CALL dia_harm_end 
    232207 
    233208      IF( nn_timing == 1 )   CALL timing_stop('dia_harm') 
     
    235210   END SUBROUTINE dia_harm 
    236211 
     212 
    237213   SUBROUTINE dia_harm_end 
    238214      !!---------------------------------------------------------------------- 
    239215      !!                 ***  ROUTINE diaharm_end  *** 
    240       !!---------------------------------------------------------------------- 
    241216      !!          
    242217      !! ** Purpose :  Compute the Real and Imaginary part of tidal constituents 
     
    244219      !! ** Action  :  Decompose the signal on the harmonic constituents  
    245220      !! 
    246       !! History : 
    247       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    248       !!-------------------------------------------------------------------- 
    249  
    250       !! * Local declarations 
     221      !!-------------------------------------------------------------------- 
    251222      INTEGER :: ji, jj, jh, jc, jn, nhan, jl 
    252223      INTEGER :: ksp, kun, keq 
     
    279250               nisparse(ksp) = keq 
    280251               njsparse(ksp) = kun 
    281                valuesparse(ksp)= & 
    282                    +(   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) & 
    283                    +(1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh))) 
     252               valuesparse(ksp) = (   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh))   & 
     253                  &             + (1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh)) ) 
    284254            END DO 
    285255         END DO 
    286256      END DO 
    287257 
    288       nsparse=ksp 
     258      nsparse = ksp 
    289259 
    290260      ! Elevation: 
     
    292262         DO ji = 1, jpi 
    293263            ! Fill input array 
    294             kun=0 
    295             DO jh = 1,nb_ana 
    296                DO jc = 1,2 
     264            kun = 0 
     265            DO jh = 1, nb_ana 
     266               DO jc = 1, 2 
    297267                  kun = kun + 1 
    298268                  ztmp4(kun)=ana_temp(ji,jj,kun,1) 
    299                ENDDO 
    300             ENDDO 
     269               END DO 
     270            END DO 
    301271 
    302272            CALL SUR_DETERMINE(jj) 
     
    310280      END DO 
    311281 
    312       ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 
    313       ALLOCATE(out_u  (jpi,jpj,2*nb_ana)) 
    314       ALLOCATE(out_v  (jpi,jpj,2*nb_ana)) 
     282      ALLOCATE( out_eta(jpi,jpj,2*nb_ana),   &  
     283         &      out_u  (jpi,jpj,2*nb_ana),   & 
     284         &      out_v  (jpi,jpj,2*nb_ana)  ) 
    315285 
    316286      DO jj = 1, jpj 
    317287         DO ji = 1, jpi 
    318288            DO jh = 1, nb_ana  
    319                X1=ana_amp(ji,jj,jh,1) 
    320                X2=-ana_amp(ji,jj,jh,2) 
    321                out_eta(ji,jj,jh)=X1 * tmask(ji,jj,1) 
    322                out_eta(ji,jj,nb_ana+jh)=X2 * tmask(ji,jj,1) 
     289               X1 = ana_amp(ji,jj,jh,1) 
     290               X2 =-ana_amp(ji,jj,jh,2) 
     291               out_eta(ji,jj,jh       ) = X1 * tmask(ji,jj,1) 
     292               out_eta(ji,jj,jh+nb_ana) = X2 * tmask(ji,jj,1) 
    323293            ENDDO 
    324294         ENDDO 
     
    398368   END SUBROUTINE dia_harm_end 
    399369 
     370 
    400371   SUBROUTINE dia_wri_harm 
    401372      !!-------------------------------------------------------------------- 
    402373      !!                 ***  ROUTINE dia_wri_harm  *** 
    403       !!-------------------------------------------------------------------- 
    404374      !!          
    405375      !! ** Purpose : Write tidal harmonic analysis results in a netcdf file 
    406       !! 
    407       !! 
    408       !! History : 
    409       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    410       !!-------------------------------------------------------------------- 
    411  
    412       !! * Local declarations 
     376      !!-------------------------------------------------------------------- 
    413377      CHARACTER(LEN=lc) :: cltext 
    414378      CHARACTER(LEN=lc) ::   & 
     
    468432#else 
    469433      DO jh = 1, nb_ana 
    470       CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh) ) 
    471       CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,nb_ana+jh) ) 
     434         CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh       ) ) 
     435         CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,jh+nb_ana) ) 
    472436      END DO 
    473437#endif 
    474438 
    475439   END SUBROUTINE dia_wri_harm 
     440 
    476441 
    477442   SUBROUTINE SUR_DETERMINE(init) 
     
    482447   !!        
    483448   !!--------------------------------------------------------------------------------- 
    484    INTEGER, INTENT(in) :: init  
    485                 
     449   INTEGER, INTENT(in) ::   init  
     450   ! 
    486451   INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd 
    487452   REAL(wp)                        :: zval1, zval2, zx1 
     
    492457   CALL wrk_alloc( jpincomax , ipos2 , ipivot        ) 
    493458             
    494    IF( init==1 )THEN 
    495  
    496       IF( nsparse .GT. jpdimsparse ) & 
    497          CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 
    498  
    499       IF( ninco .GT. jpincomax ) & 
    500          CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 
    501  
    502       ztmp3(:,:)=0.e0 
    503  
     459   IF( init == 1 ) THEN 
     460      IF( nsparse > jpdimsparse )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 
     461      IF( ninco   > jpincomax   )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 
     462      ! 
     463      ztmp3(:,:) = 0._wp 
     464      ! 
    504465      DO jk1_sd = 1, nsparse 
    505466         DO jk2_sd = 1, nsparse 
    506  
    507             nisparse(jk2_sd)=nisparse(jk2_sd) 
    508             njsparse(jk2_sd)=njsparse(jk2_sd) 
    509  
     467            nisparse(jk2_sd) = nisparse(jk2_sd) 
     468            njsparse(jk2_sd) = njsparse(jk2_sd) 
    510469            IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN 
    511470               ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))  & 
    512471                                                        + valuesparse(jk1_sd)*valuesparse(jk2_sd) 
    513472            ENDIF 
    514  
    515          ENDDO 
    516       ENDDO 
     473         END DO 
     474      END DO 
    517475 
    518476      DO jj_sd = 1 ,ninco 
     
    584542   ENDDO 
    585543 
    586  
    587544   CALL wrk_dealloc( jpincomax , ztmpx , zcol1 , zcol2 ) 
    588545   CALL wrk_dealloc( jpincomax , ipos2 , ipivot        ) 
     
    590547  END SUBROUTINE SUR_DETERMINE 
    591548 
    592  
    593549#else 
    594550   !!---------------------------------------------------------------------- 
     
    597553   LOGICAL, PUBLIC, PARAMETER ::   lk_diaharm = .FALSE. 
    598554CONTAINS 
    599  
    600555   SUBROUTINE dia_harm ( kt )     ! Empty routine 
    601556      INTEGER, INTENT( IN ) :: kt   
    602557      WRITE(*,*) 'dia_harm: you should not have seen this print' 
    603558   END SUBROUTINE dia_harm 
    604  
    605  
    606 #endif 
     559#endif 
     560 
    607561   !!====================================================================== 
    608562END MODULE diaharm 
Note: See TracChangeset for help on using the changeset viewer.