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 12065 for NEMO/branches/2019/dev_r10742_ENHANCE-12_SimonM-Tides/src/OCE/DIA/diaharm.F90 – NEMO

Ignore:
Timestamp:
2019-12-05T12:06:36+01:00 (4 years ago)
Author:
smueller
Message:

Synchronizing with /NEMO/trunk@12055 (ticket #2194)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r10742_ENHANCE-12_SimonM-Tides/src/OCE/DIA/diaharm.F90

    r10840 r12065  
    55   !!====================================================================== 
    66   !! History :  3.1  !  2007  (O. Le Galloudec, J. Chanut)  Original code 
    7    !!---------------------------------------------------------------------- 
    8 #if defined key_diaharm 
    9    !!---------------------------------------------------------------------- 
    10    !!   'key_diaharm' 
    117   !!---------------------------------------------------------------------- 
    128   USE oce             ! ocean dynamics and tracers variables 
     
    2622   IMPLICIT NONE 
    2723   PRIVATE 
    28  
    29    LOGICAL, PUBLIC, PARAMETER :: lk_diaharm  = .TRUE. 
    3024    
    3125   INTEGER, PARAMETER :: jpincomax    = 2.*jpmax_harmo 
     
    3327 
    3428   !                         !!** namelist variables ** 
    35    INTEGER ::   nit000_han    ! First time step used for harmonic analysis 
    36    INTEGER ::   nitend_han    ! Last time step used for harmonic analysis 
    37    INTEGER ::   nstep_han     ! Time step frequency for harmonic analysis 
    38    INTEGER ::   nb_ana        ! Number of harmonics to analyse 
     29   LOGICAL, PUBLIC ::   ln_diaharm    ! Choose tidal harmonic output or not 
     30   INTEGER         ::   nit000_han    ! First time step used for harmonic analysis 
     31   INTEGER         ::   nitend_han    ! Last time step used for harmonic analysis 
     32   INTEGER         ::   nstep_han     ! Time step frequency for harmonic analysis 
     33   INTEGER         ::   nb_ana        ! Number of harmonics to analyse 
    3934 
    4035   REAL(wp), ALLOCATABLE, DIMENSION(:,:,:,:) ::   ana_temp 
     
    5146   CHARACTER (LEN=4), DIMENSION(jpmax_harmo) ::   tname   ! Names of tidal constituents ('M2', 'K1',...) 
    5247 
    53    PUBLIC   dia_harm   ! routine called by step.F90 
     48   PUBLIC   dia_harm        ! routine called by step.F90 
     49   PUBLIC   dia_harm_init   ! routine called by nemogcm.F90 
    5450 
    5551   !!---------------------------------------------------------------------- 
     
    6965      !! 
    7066      !!-------------------------------------------------------------------- 
    71       INTEGER :: jh, nhan, jk, ji 
     67      INTEGER ::   jh, nhan, ji 
    7268      INTEGER ::   ios                 ! Local integer output status for namelist read 
    7369      TYPE(tide_harmonic), DIMENSION(:), POINTER ::   tide_harmonics  ! Oscillation parameters of selected tidal components 
    7470 
    75       NAMELIST/nam_diaharm/ nit000_han, nitend_han, nstep_han, tname 
     71      NAMELIST/nam_diaharm/ ln_diaharm, nit000_han, nitend_han, nstep_han, tname 
    7672      !!---------------------------------------------------------------------- 
    7773 
     
    8278      ENDIF 
    8379      ! 
    84       IF( .NOT. ln_tide )   CALL ctl_stop( 'dia_harm_init : ln_tide must be true for harmonic analysis') 
    85       ! 
    8680      REWIND( numnam_ref )              ! Namelist nam_diaharm in reference namelist : Tidal harmonic analysis 
    8781      READ  ( numnam_ref, nam_diaharm, IOSTAT = ios, ERR = 901) 
    88 901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nam_diaharm in reference namelist', lwp ) 
     82901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'nam_diaharm in reference namelist' ) 
    8983      REWIND( numnam_cfg )              ! Namelist nam_diaharm in configuration namelist : Tidal harmonic analysis 
    9084      READ  ( numnam_cfg, nam_diaharm, IOSTAT = ios, ERR = 902 ) 
    91 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nam_diaharm in configuration namelist', lwp ) 
     85902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nam_diaharm in configuration namelist' ) 
    9286      IF(lwm) WRITE ( numond, nam_diaharm ) 
    9387      ! 
    9488      IF(lwp) THEN 
    95          WRITE(numout,*) 'First time step used for analysis:  nit000_han= ', nit000_han 
    96          WRITE(numout,*) 'Last  time step used for analysis:  nitend_han= ', nitend_han 
    97          WRITE(numout,*) 'Time step frequency for harmonic analysis:  nstep_han= ', nstep_han 
     89         WRITE(numout,*) 'Tidal diagnostics = ', ln_diaharm 
     90         WRITE(numout,*) '   First time step used for analysis:         nit000_han= ', nit000_han 
     91         WRITE(numout,*) '   Last  time step used for analysis:         nitend_han= ', nitend_han 
     92         WRITE(numout,*) '   Time step frequency for harmonic analysis: nstep_han = ', nstep_han 
    9893      ENDIF 
    9994 
    100       ! Basic checks on harmonic analysis time window: 
    101       ! ---------------------------------------------- 
    102       IF( nit000 > nit000_han )   CALL ctl_stop( 'dia_harm_init : nit000_han must be greater than nit000',   & 
    103          &                                       ' restart capability not implemented' ) 
    104       IF( nitend < nitend_han )   CALL ctl_stop( 'dia_harm_init : nitend_han must be lower than nitend',   & 
    105          &                                       'restart capability not implemented' ) 
    106  
    107       IF( MOD( nitend_han-nit000_han+1 , nstep_han ) /= 0 )   & 
    108          &                        CALL ctl_stop( 'dia_harm_init : analysis time span must be a multiple of nstep_han' ) 
    109  
    110       ! Initialize oscillation parameters for tidal components that have been 
    111       ! selected for harmonic analysis 
    112       ! --------------------------------------------------------------------- 
    113       CALL tide_init_harmonics(tname, tide_harmonics) 
    114       ! Number of tidal components selected for harmonic analysis 
    115       nb_ana = size(tide_harmonics) 
    116       ! 
    117       IF(lwp) THEN 
    118          WRITE(numout,*) '        Namelist nam_diaharm' 
    119          WRITE(numout,*) '        nb_ana    = ', nb_ana 
    120          CALL flush(numout) 
     95      IF( ln_diaharm .AND. .NOT.ln_tide )   CALL ctl_stop( 'dia_harm_init : ln_tide must be true for harmonic analysis') 
     96 
     97      IF( ln_diaharm ) THEN 
     98 
     99         ! 
     100         ! Basic checks on harmonic analysis time window: 
     101         ! ---------------------------------------------- 
     102         IF( nit000 > nit000_han )   CALL ctl_stop( 'dia_harm_init : nit000_han must be greater than nit000',   & 
     103            &                                       ' restart capability not implemented' ) 
     104         IF( nitend < nitend_han )   CALL ctl_stop( 'dia_harm_init : nitend_han must be lower than nitend',   & 
     105            &                                       'restart capability not implemented' ) 
     106 
     107         IF( MOD( nitend_han-nit000_han+1 , nstep_han ) /= 0 )   & 
     108            &                        CALL ctl_stop( 'dia_harm_init : analysis time span must be a multiple of nstep_han' ) 
     109         ! 
     110         ! Initialize oscillation parameters for tidal components that have been 
     111         ! selected for harmonic analysis 
     112         ! --------------------------------------------------------------------- 
     113         CALL tide_init_harmonics(tname, tide_harmonics) 
     114         ! Number of tidal components selected for harmonic analysis 
     115         nb_ana = size(tide_harmonics) 
     116         ! 
     117         IF(lwp) THEN 
     118            WRITE(numout,*) '        Namelist nam_diaharm' 
     119            WRITE(numout,*) '        nb_ana    = ', nb_ana 
     120            CALL flush(numout) 
     121         ENDIF 
     122         ! 
     123         IF (nb_ana > jpmax_harmo) THEN 
     124            WRITE(ctmp1,*) ' nb_ana must be lower than jpmax_harmo' 
     125            WRITE(ctmp2,*) ' jpmax_harmo= ', jpmax_harmo 
     126            CALL ctl_stop( 'dia_harm_init', ctmp1, ctmp2 ) 
     127         ENDIF 
     128 
     129         IF(lwp) WRITE(numout,*) 'Analysed frequency  : ',nb_ana ,'Frequency ' 
     130 
     131         DO jh = 1, nb_ana 
     132            IF(lwp) WRITE(numout,*) '                    : ',tname(jh),' ',tide_harmonics(jh)%omega 
     133         END DO 
     134 
     135         ! Initialize temporary arrays: 
     136         ! ---------------------------- 
     137         ALLOCATE( ana_temp(jpi,jpj,2*nb_ana,3) ) 
     138         ana_temp(:,:,:,:) = 0._wp 
     139 
    121140      ENDIF 
    122       ! 
    123       IF (nb_ana > jpmax_harmo) THEN 
    124          WRITE(ctmp1,*) ' E R R O R dia_harm_init : nb_ana must be lower than jpmax_harmo, stop' 
    125          WRITE(ctmp2,*) ' jpmax_harmo= ', jpmax_harmo 
    126          CALL ctl_stop( 'dia_harm_init', ctmp1, ctmp2 ) 
    127       ENDIF 
    128  
    129       IF(lwp) WRITE(numout,*) 'Analysed frequency  : ',nb_ana ,'Frequency ' 
    130  
    131       DO jh = 1, nb_ana 
    132         IF(lwp) WRITE(numout,*) '                    : ',tname(jh),' ',tide_harmonics(jh)%omega 
    133       END DO 
    134  
    135       ! Initialize temporary arrays: 
    136       ! ---------------------------- 
    137       ALLOCATE( ana_temp(jpi,jpj,2*nb_ana,3) ) 
    138       ana_temp(:,:,:,:) = 0._wp 
    139141 
    140142   END SUBROUTINE dia_harm_init 
     
    156158      !!-------------------------------------------------------------------- 
    157159      IF( ln_timing )   CALL timing_start('dia_harm') 
    158       ! 
    159       IF( kt == nit000 )   CALL dia_harm_init 
    160160      ! 
    161161      IF( kt >= nit000_han .AND. kt <= nitend_han .AND. MOD(kt,nstep_han) == 0 ) THEN 
     
    405405      INTEGER, INTENT(in) ::   init  
    406406      ! 
    407       INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd 
     407      INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jh1_sd, jh2_sd 
    408408      REAL(wp)                        :: zval1, zval2, zx1 
    409409      REAL(wp), DIMENSION(jpincomax) :: ztmpx, zcol1, zcol2 
     
    417417         ztmp3(:,:) = 0._wp 
    418418         ! 
    419          DO jk1_sd = 1, nsparse 
    420             DO jk2_sd = 1, nsparse 
    421                nisparse(jk2_sd) = nisparse(jk2_sd) 
    422                njsparse(jk2_sd) = njsparse(jk2_sd) 
    423                IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN 
    424                   ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))  & 
    425                      &                                     + valuesparse(jk1_sd)*valuesparse(jk2_sd) 
     419         DO jh1_sd = 1, nsparse 
     420            DO jh2_sd = 1, nsparse 
     421               nisparse(jh2_sd) = nisparse(jh2_sd) 
     422               njsparse(jh2_sd) = njsparse(jh2_sd) 
     423               IF( nisparse(jh2_sd) == nisparse(jh1_sd) ) THEN 
     424                  ztmp3(njsparse(jh1_sd),njsparse(jh2_sd)) = ztmp3(njsparse(jh1_sd),njsparse(jh2_sd))  & 
     425                     &                                     + valuesparse(jh1_sd)*valuesparse(jh2_sd) 
    426426               ENDIF 
    427427            END DO 
     
    498498   END SUBROUTINE SUR_DETERMINE 
    499499 
    500 #else 
    501    !!---------------------------------------------------------------------- 
    502    !!   Default case :   Empty module 
    503    !!---------------------------------------------------------------------- 
    504    LOGICAL, PUBLIC, PARAMETER ::   lk_diaharm = .FALSE. 
    505 CONTAINS 
    506    SUBROUTINE dia_harm ( kt )     ! Empty routine 
    507       INTEGER, INTENT( IN ) :: kt   
    508       WRITE(*,*) 'dia_harm: you should not have seen this print' 
    509    END SUBROUTINE dia_harm 
    510 #endif 
    511  
    512500   !!====================================================================== 
    513501END MODULE diaharm 
Note: See TracChangeset for help on using the changeset viewer.