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/DIA/diaharm.F90 – NEMO

Ignore:
Timestamp:
2013-11-20T17:28:04+01:00 (10 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/DIA/diaharm.F90

    r4147 r4292  
    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    , & ! First time step used for harmonic analysis 
    34                          nitend_han    , & ! Last time step used for harmonic analysis 
    35                          nstep_han     , & ! 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    ! First time step used for harmonic analysis 
     38   INTEGER ::   nitend_han    ! Last time step used for harmonic analysis 
     39   INTEGER ::   nstep_han     ! 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 
    8076      INTEGER ::   ios                 ! Local integer output status for namelist read 
     
    108104      ! Basic checks on harmonic analysis time window: 
    109105      ! ---------------------------------------------- 
    110       IF (nit000 > nit000_han) THEN 
    111         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nit000_han must be greater than nit000, stop' 
    112         IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    113         nstop = nstop + 1 
    114       ENDIF 
    115       IF (nitend < nitend_han) THEN 
    116         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : nitend_han must be lower than nitend, stop' 
    117         IF(lwp) WRITE(numout,*) ' restart capability not implemented' 
    118         nstop = nstop + 1 
    119       ENDIF 
    120  
    121       IF (MOD(nitend_han-nit000_han+1,nstep_han).NE.0) THEN 
    122         IF(lwp) WRITE(numout,*) ' E R R O R dia_harm_init : analysis time span must be a multiple of nstep_han, stop' 
    123         nstop = nstop + 1 
    124       END IF 
    125  
    126       nb_ana=0 
     106      IF( nit000 > nit000_han )   CALL ctl_stop( 'dia_harm_init : nit000_han must be greater than nit000',   & 
     107         &                                       ' restart capability not implemented' ) 
     108      IF( nitend < nitend_han )   CALL ctl_stop( 'dia_harm_init : nitend_han must be lower than nitend',   & 
     109         &                                       'restart capability not implemented' ) 
     110 
     111      IF( MOD( nitend_han-nit000_han+1 , nstep_han ) /= 0 )   & 
     112         &                        CALL ctl_stop( 'dia_harm_init : analysis time span must be a multiple of nstep_han' ) 
     113 
     114      nb_ana = 0 
    127115      DO jk=1,jpmax_harmo 
    128116         DO ji=1,jpmax_harmo 
     
    157145      ! Initialize frequency array: 
    158146      ! --------------------------- 
    159       ALLOCATE(ana_freq(nb_ana)) 
    160       ALLOCATE(vt      (nb_ana)) 
    161       ALLOCATE(ut      (nb_ana)) 
    162       ALLOCATE(ft      (nb_ana)) 
    163  
    164       CALL tide_harmo(ana_freq, vt, ut , ft, name ,nb_ana) 
     147      ALLOCATE( ana_freq(nb_ana), ut(nb_ana), vt(nb_ana), ft(nb_ana) ) 
     148 
     149      CALL tide_harmo( ana_freq, vt, ut, ft, name, nb_ana ) 
    165150 
    166151      IF(lwp) WRITE(numout,*) 'Analysed frequency  : ',nb_ana ,'Frequency ' 
     
    172157      ! Initialize temporary arrays: 
    173158      ! ---------------------------- 
    174       ALLOCATE( ana_temp(jpi,jpj,nb_ana*2,3)) 
     159      ALLOCATE( ana_temp(jpi,jpj,2*nb_ana,3) ) 
    175160      ana_temp(:,:,:,:) = 0.e0 
    176161 
    177162   END SUBROUTINE dia_harm_init 
    178     
     163 
     164 
    179165   SUBROUTINE dia_harm ( kt ) 
    180166      !!---------------------------------------------------------------------- 
    181167      !!                 ***  ROUTINE dia_harm  *** 
    182       !!---------------------------------------------------------------------- 
    183168      !!          
    184169      !! ** Purpose :   Tidal harmonic analysis main routine 
     
    186171      !! ** Action  :   Sums ssh/u/v over time analysis [nit000_han,nitend_han] 
    187172      !! 
    188       !! History : 
    189       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    190       !!-------------------------------------------------------------------- 
    191       !! * Argument: 
     173      !!-------------------------------------------------------------------- 
    192174      INTEGER, INTENT( IN ) :: kt 
    193  
    194       !! * Local declarations 
     175      ! 
    195176      INTEGER  :: ji, jj, jh, jc, nhc 
    196177      REAL(wp) :: ztime, ztemp 
     
    198179      IF( nn_timing == 1 )   CALL timing_start('dia_harm') 
    199180 
    200       IF ( kt .EQ. nit000 ) CALL dia_harm_init 
     181      IF ( kt == nit000 ) CALL dia_harm_init 
    201182 
    202183      IF ( ((kt.GE.nit000_han).AND.(kt.LE.nitend_han)).AND. & 
     
    215196              DO ji = 1,jpi 
    216197                ! Elevation 
    217                 ana_temp(ji,jj,nhc,1) = ana_temp(ji,jj,nhc,1)                & 
    218                                         + ztemp*sshn(ji,jj)*tmask(ji,jj,1)         
     198                ana_temp(ji,jj,nhc,1) = ana_temp(ji,jj,nhc,1) + ztemp*sshn(ji,jj)           *tmask(ji,jj,1)         
    219199#if defined key_dynspg_ts 
    220                 ! ubar 
    221                 ana_temp(ji,jj,nhc,2) = ana_temp(ji,jj,nhc,2)                & 
    222                                         + ztemp*un_b(ji,jj)*hur(ji,jj)*umask(ji,jj,1) 
    223                 ! vbar 
    224                 ana_temp(ji,jj,nhc,3) = ana_temp(ji,jj,nhc,3)                & 
    225                                         + ztemp*vn_b(ji,jj)*hvr(ji,jj)*vmask(ji,jj,1) 
     200                ana_temp(ji,jj,nhc,2) = ana_temp(ji,jj,nhc,2) + ztemp*un_b(ji,jj)*hur(ji,jj)*umask(ji,jj,1) 
     201                ana_temp(ji,jj,nhc,3) = ana_temp(ji,jj,nhc,3) + ztemp*vn_b(ji,jj)*hvr(ji,jj)*vmask(ji,jj,1) 
    226202#endif 
    227203              END DO 
     
    233209      END IF 
    234210 
    235       IF ( kt .EQ. nitend_han ) CALL dia_harm_end 
     211      IF ( kt == nitend_han )  CALL dia_harm_end 
    236212 
    237213      IF( nn_timing == 1 )   CALL timing_stop('dia_harm') 
     
    239215   END SUBROUTINE dia_harm 
    240216 
     217 
    241218   SUBROUTINE dia_harm_end 
    242219      !!---------------------------------------------------------------------- 
    243220      !!                 ***  ROUTINE diaharm_end  *** 
    244       !!---------------------------------------------------------------------- 
    245221      !!          
    246222      !! ** Purpose :  Compute the Real and Imaginary part of tidal constituents 
     
    248224      !! ** Action  :  Decompose the signal on the harmonic constituents  
    249225      !! 
    250       !! History : 
    251       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    252       !!-------------------------------------------------------------------- 
    253  
    254       !! * Local declarations 
     226      !!-------------------------------------------------------------------- 
    255227      INTEGER :: ji, jj, jh, jc, jn, nhan, jl 
    256228      INTEGER :: ksp, kun, keq 
     
    283255               nisparse(ksp) = keq 
    284256               njsparse(ksp) = kun 
    285                valuesparse(ksp)= & 
    286                    +(   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh)) & 
    287                    +(1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh))) 
     257               valuesparse(ksp) = (   MOD(jc,2) * ft(jh) * COS(ana_freq(jh)*ztime + vt(jh) + ut(jh))   & 
     258                  &             + (1.-MOD(jc,2))* ft(jh) * SIN(ana_freq(jh)*ztime + vt(jh) + ut(jh)) ) 
    288259            END DO 
    289260         END DO 
    290261      END DO 
    291262 
    292       nsparse=ksp 
     263      nsparse = ksp 
    293264 
    294265      ! Elevation: 
     
    296267         DO ji = 1, jpi 
    297268            ! Fill input array 
    298             kun=0 
    299             DO jh = 1,nb_ana 
    300                DO jc = 1,2 
     269            kun = 0 
     270            DO jh = 1, nb_ana 
     271               DO jc = 1, 2 
    301272                  kun = kun + 1 
    302273                  ztmp4(kun)=ana_temp(ji,jj,kun,1) 
    303                ENDDO 
    304             ENDDO 
     274               END DO 
     275            END DO 
    305276 
    306277            CALL SUR_DETERMINE(jj) 
     
    314285      END DO 
    315286 
    316       ALLOCATE(out_eta(jpi,jpj,2*nb_ana)) 
    317       ALLOCATE(out_u  (jpi,jpj,2*nb_ana)) 
    318       ALLOCATE(out_v  (jpi,jpj,2*nb_ana)) 
     287      ALLOCATE( out_eta(jpi,jpj,2*nb_ana),   &  
     288         &      out_u  (jpi,jpj,2*nb_ana),   & 
     289         &      out_v  (jpi,jpj,2*nb_ana)  ) 
    319290 
    320291      DO jj = 1, jpj 
    321292         DO ji = 1, jpi 
    322293            DO jh = 1, nb_ana  
    323                X1=ana_amp(ji,jj,jh,1) 
    324                X2=-ana_amp(ji,jj,jh,2) 
    325                out_eta(ji,jj,jh)=X1 * tmask(ji,jj,1) 
    326                out_eta(ji,jj,nb_ana+jh)=X2 * tmask(ji,jj,1) 
     294               X1 = ana_amp(ji,jj,jh,1) 
     295               X2 =-ana_amp(ji,jj,jh,2) 
     296               out_eta(ji,jj,jh       ) = X1 * tmask(ji,jj,1) 
     297               out_eta(ji,jj,jh+nb_ana) = X2 * tmask(ji,jj,1) 
    327298            ENDDO 
    328299         ENDDO 
     
    402373   END SUBROUTINE dia_harm_end 
    403374 
     375 
    404376   SUBROUTINE dia_wri_harm 
    405377      !!-------------------------------------------------------------------- 
    406378      !!                 ***  ROUTINE dia_wri_harm  *** 
    407       !!-------------------------------------------------------------------- 
    408379      !!          
    409380      !! ** Purpose : Write tidal harmonic analysis results in a netcdf file 
    410       !! 
    411       !! 
    412       !! History : 
    413       !!   9.0  O. Le Galloudec and J. Chanut (Original) 
    414       !!-------------------------------------------------------------------- 
    415  
    416       !! * Local declarations 
     381      !!-------------------------------------------------------------------- 
    417382      CHARACTER(LEN=lc) :: cltext 
    418383      CHARACTER(LEN=lc) ::   & 
     
    472437#else 
    473438      DO jh = 1, nb_ana 
    474       CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh) ) 
    475       CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,nb_ana+jh) ) 
     439         CALL iom_put( TRIM(tname(jh))//'x_v', out_u(:,:,jh       ) ) 
     440         CALL iom_put( TRIM(tname(jh))//'y_v', out_u(:,:,jh+nb_ana) ) 
    476441      END DO 
    477442#endif 
    478443 
    479444   END SUBROUTINE dia_wri_harm 
     445 
    480446 
    481447   SUBROUTINE SUR_DETERMINE(init) 
     
    486452   !!        
    487453   !!--------------------------------------------------------------------------------- 
    488    INTEGER, INTENT(in) :: init  
    489                 
     454   INTEGER, INTENT(in) ::   init  
     455   ! 
    490456   INTEGER                         :: ji_sd, jj_sd, ji1_sd, ji2_sd, jk1_sd, jk2_sd 
    491457   REAL(wp)                        :: zval1, zval2, zx1 
     
    496462   CALL wrk_alloc( jpincomax , ipos2 , ipivot        ) 
    497463             
    498    IF( init==1 )THEN 
    499  
    500       IF( nsparse .GT. jpdimsparse ) & 
    501          CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 
    502  
    503       IF( ninco .GT. jpincomax ) & 
    504          CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 
    505  
    506       ztmp3(:,:)=0.e0 
    507  
     464   IF( init == 1 ) THEN 
     465      IF( nsparse > jpdimsparse )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : nsparse .GT. jpdimsparse') 
     466      IF( ninco   > jpincomax   )   CALL ctl_stop( 'STOP', 'SUR_DETERMINE : ninco .GT. jpincomax') 
     467      ! 
     468      ztmp3(:,:) = 0._wp 
     469      ! 
    508470      DO jk1_sd = 1, nsparse 
    509471         DO jk2_sd = 1, nsparse 
    510  
    511             nisparse(jk2_sd)=nisparse(jk2_sd) 
    512             njsparse(jk2_sd)=njsparse(jk2_sd) 
    513  
     472            nisparse(jk2_sd) = nisparse(jk2_sd) 
     473            njsparse(jk2_sd) = njsparse(jk2_sd) 
    514474            IF( nisparse(jk2_sd) == nisparse(jk1_sd) ) THEN 
    515475               ztmp3(njsparse(jk1_sd),njsparse(jk2_sd)) = ztmp3(njsparse(jk1_sd),njsparse(jk2_sd))  & 
    516476                                                        + valuesparse(jk1_sd)*valuesparse(jk2_sd) 
    517477            ENDIF 
    518  
    519          ENDDO 
    520       ENDDO 
     478         END DO 
     479      END DO 
    521480 
    522481      DO jj_sd = 1 ,ninco 
     
    588547   ENDDO 
    589548 
    590  
    591549   CALL wrk_dealloc( jpincomax , ztmpx , zcol1 , zcol2 ) 
    592550   CALL wrk_dealloc( jpincomax , ipos2 , ipivot        ) 
     
    594552  END SUBROUTINE SUR_DETERMINE 
    595553 
    596  
    597554#else 
    598555   !!---------------------------------------------------------------------- 
     
    601558   LOGICAL, PUBLIC, PARAMETER ::   lk_diaharm = .FALSE. 
    602559CONTAINS 
    603  
    604560   SUBROUTINE dia_harm ( kt )     ! Empty routine 
    605561      INTEGER, INTENT( IN ) :: kt   
    606562      WRITE(*,*) 'dia_harm: you should not have seen this print' 
    607563   END SUBROUTINE dia_harm 
    608  
    609  
    610 #endif 
     564#endif 
     565 
    611566   !!====================================================================== 
    612567END MODULE diaharm 
Note: See TracChangeset for help on using the changeset viewer.