Ignore:
Timestamp:
2019-03-29T13:54:25+01:00 (2 years ago)
Author:
smueller
Message:

Replacement of the module variable used to store information about all available tidal components (variable Wave in module tide_mod) by an array used to store information about the selected components only (variable tide_components in module tide_mod), replacement of the corresponding initialisation subroutine, as well as related adjustments in various modules (bdytides, diaharm, sbctide, and tide_mod) and in one include file (tide.h90) (ticket #2194)

File:
1 edited

Legend:

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

    r10800 r10811  
    2121   PUBLIC   tide_init 
    2222   PUBLIC   tide_harmo       ! called by tideini and diaharm modules 
    23    PUBLIC   tide_init_Wave   ! called by tideini and diaharm modules 
     23   PUBLIC   tide_init_components ! called internally and by module diaharm 
    2424   PUBLIC   tide_init_load 
    2525   PUBLIC   tide_init_potential 
    2626   PUBLIC   upd_tide         ! called in dynspg_... modules 
    2727 
    28    INTEGER, PUBLIC, PARAMETER ::   jpmax_harmo = 19   !: maximum number of harmonic 
     28   INTEGER, PUBLIC, PARAMETER ::   jpmax_harmo = 64   !: maximum number of harmonic components 
    2929 
    3030   TYPE, PUBLIC ::    tide 
    31       CHARACTER(LEN=4) ::   cname_tide 
     31      CHARACTER(LEN=4) ::   cname_tide = '' 
    3232      REAL(wp)         ::   equitide 
    3333      INTEGER          ::   nutide 
     
    3737   END TYPE tide 
    3838 
    39    TYPE(tide), PUBLIC, DIMENSION(jpmax_harmo) ::   Wave   !: 
     39   TYPE(tide), PUBLIC, DIMENSION(:), POINTER ::   tide_components !: Array of selected tidal component parameters 
    4040 
    4141   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   omega_tide   !: 
     
    4949   LOGICAL , PUBLIC ::   ln_scal_load    !: 
    5050   LOGICAL , PUBLIC ::   ln_tide_ramp    !: 
    51    INTEGER , PUBLIC ::   nb_harmo        !: 
     51   INTEGER , PUBLIC ::   nb_harmo        !: Number of active tidal components 
    5252   INTEGER , PUBLIC ::   kt_tide         !: 
    5353   REAL(wp), PUBLIC ::   rn_tide_ramp_dt     !: 
     
    5555   CHARACTER(lc), PUBLIC ::   cn_tide_load   !:  
    5656   REAL(wp)         ::   rn_tide_gamma   ! Tidal tilt factor 
    57  
    58    INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntide   !: 
    5957 
    6058   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   pot_astro !: tidal potential 
     
    7977      !!----------------------------------------------------------------------       
    8078      INTEGER  :: ji, jk 
    81       CHARACTER(LEN=4), DIMENSION(jpmax_harmo) :: sn_tide_cnames 
     79      CHARACTER(LEN=4), DIMENSION(jpmax_harmo) :: sn_tide_cnames ! Names of selected tidal components 
    8280      INTEGER  ::   ios                 ! Local integer output status for namelist read 
    8381      ! 
     
    8684      !!---------------------------------------------------------------------- 
    8785      ! 
     86      ! Initialise all array elements of sn_tide_cnames, as some of them 
     87      ! typically do not appear in namelist_ref or namelist_cfg 
     88      sn_tide_cnames(:) = '' 
    8889      ! Read Namelist nam_tide 
    8990      REWIND( numnam_ref )              ! Namelist nam_tide in reference namelist : Tides 
     
    120121      ENDIF 
    121122      ! 
    122       CALL tide_init_Wave 
    123       ! 
    124       nb_harmo=0 
    125       DO jk = 1, jpmax_harmo 
    126          DO ji = 1,jpmax_harmo 
    127             IF( TRIM(sn_tide_cnames(jk)) == Wave(ji)%cname_tide )   nb_harmo = nb_harmo + 1 
    128          END DO 
    129       END DO 
     123      ! Initialise array of selected tidal components 
     124      CALL tide_init_components(sn_tide_cnames, tide_components) 
     125      ! Number of active tidal components 
     126      nb_harmo = size(tide_components) 
    130127      !        
    131128      ! Ensure that tidal components have been set in namelist_cfg 
     
    143140         &   CALL ctl_stop('rn_tide_ramp_dt must be positive') 
    144141      ! 
    145       ALLOCATE( ntide(nb_harmo) ) 
    146       DO jk = 1, nb_harmo 
    147          DO ji = 1, jpmax_harmo 
    148             IF( TRIM(sn_tide_cnames(jk)) == Wave(ji)%cname_tide ) THEN 
    149                ntide(jk) = ji 
    150                EXIT 
    151             ENDIF 
    152          END DO 
    153       END DO 
    154       ! 
    155142      ALLOCATE( omega_tide(nb_harmo), v0tide    (nb_harmo),   & 
    156143         &      utide     (nb_harmo), ftide     (nb_harmo)  ) 
     
    168155 
    169156 
    170    SUBROUTINE tide_init_Wave 
    171 #     include "tide.h90" 
    172    END SUBROUTINE tide_init_Wave 
     157   SUBROUTINE tide_init_components(pcnames, ptide_comp) 
     158      !!---------------------------------------------------------------------- 
     159      !!                 ***  ROUTINE tide_init_components  *** 
     160      !! 
     161      !! Returns pointer to array of variables of type 'tide' that contain 
     162      !! information about the selected tidal components 
     163      !! ---------------------------------------------------------------------- 
     164      CHARACTER(LEN=4),              DIMENSION(jpmax_harmo), INTENT(in)  ::   pcnames         ! Names of selected components 
     165      TYPE(tide),       POINTER,     DIMENSION(:),           INTENT(out) ::   ptide_comp      ! Selected components 
     166      INTEGER,          ALLOCATABLE, DIMENSION(:)                        ::   kcomppos        ! Indices of selected components 
     167      INTEGER                                                            ::   kcomp, jk, ji   ! Miscellaneous integers 
     168      TYPE(tide),       POINTER,     DIMENSION(:)                        ::   tide_components ! All available components 
     169       
     170      ! Populate local array with information about all available tidal 
     171      ! components 
     172      ! 
     173      ! Note, here 'tide_components' locally overrides the global module 
     174      ! variable of the same name to enable the use of the global name in the 
     175      ! include file that contains the initialisation of elements of array 
     176      ! 'tide_components' 
     177      ALLOCATE(tide_components(jpmax_harmo), kcomppos(jpmax_harmo)) 
     178      ! Initialise array of indices of the selected componenents 
     179      kcomppos(:) = 0 
     180      ! Include tidal component parameters for all available components 
     181#include "tide.h90" 
     182       
     183      ! Identify the selected components that are availble 
     184      kcomp = 0 
     185      DO jk = 1, jpmax_harmo 
     186         IF (TRIM(pcnames(jk)) /= '') THEN 
     187            DO ji = 1, jpmax_harmo 
     188               IF (TRIM(pcnames(jk)) == tide_components(ji)%cname_tide) THEN 
     189                  kcomp = kcomp + 1 
     190                  WRITE(numout, '(10X,"Tidal component #",I2.2,36X,"= ",A4)') kcomp, pcnames(jk) 
     191                  kcomppos(kcomp) = ji 
     192                  EXIT 
     193               END IF 
     194            END DO 
     195         END IF 
     196      END DO 
     197       
     198      ! Allocate and populate reduced list of components 
     199      ALLOCATE(ptide_comp(kcomp)) 
     200      DO jk = 1, kcomp 
     201         ptide_comp(jk) = tide_components(kcomppos(jk)) 
     202      END DO 
     203       
     204      ! Release local array of available components and list of selected 
     205      ! components 
     206      DEALLOCATE(tide_components, kcomppos) 
     207       
     208   END SUBROUTINE tide_init_components 
    173209 
    174210 
     
    182218 
    183219      DO jk = 1, nb_harmo 
    184          zcons = rn_tide_gamma * Wave(ntide(jk))%equitide * ftide(jk) 
     220         zcons = rn_tide_gamma * tide_components(jk)%equitide * ftide(jk) 
    185221         DO ji = 1, jpi 
    186222            DO jj = 1, jpj 
     
    189225               zlat = gphit(ji,jj)*rad !! latitude en radian 
    190226               zlon = glamt(ji,jj)*rad !! longitude en radian 
    191                ztmp = v0tide(jk) + utide(jk) + Wave(ntide(jk))%nutide * zlon 
     227               ztmp = v0tide(jk) + utide(jk) + tide_components(jk)%nutide * zlon 
    192228               ! le potentiel est composé des effets des astres: 
    193                IF    ( Wave(ntide(jk))%nutide == 1 )  THEN  ;  zcs = zcons * SIN( 2._wp*zlat ) 
    194                ELSEIF( Wave(ntide(jk))%nutide == 2 )  THEN  ;  zcs = zcons * COS( zlat )**2 
     229               IF    ( tide_components(jk)%nutide == 1 )  THEN  ;  zcs = zcons * SIN( 2._wp*zlat ) 
     230               ELSEIF( tide_components(jk)%nutide == 2 )  THEN  ;  zcs = zcons * COS( zlat )**2 
    195231               ELSE                                         ;  zcs = 0._wp 
    196232               ENDIF 
     
    225261      ! 
    226262      DO itide = 1, nb_harmo 
    227          CALL iom_get  ( inum, jpdom_data,TRIM(Wave(ntide(itide))%cname_tide)//'_z1', ztr(:,:) ) 
    228          CALL iom_get  ( inum, jpdom_data,TRIM(Wave(ntide(itide))%cname_tide)//'_z2', zti(:,:) ) 
     263         CALL iom_get  ( inum, jpdom_data,TRIM(tide_components(itide)%cname_tide)//'_z1', ztr(:,:) ) 
     264         CALL iom_get  ( inum, jpdom_data,TRIM(tide_components(itide)%cname_tide)//'_z2', zti(:,:) ) 
    229265         ! 
    230266         DO ji=1,jpi 
     
    241277 
    242278 
    243    SUBROUTINE tide_harmo( pomega, pvt, put , pcor, ktide ,kc) 
    244       !!---------------------------------------------------------------------- 
    245       !!---------------------------------------------------------------------- 
    246       INTEGER , DIMENSION(kc), INTENT(in ) ::   ktide            ! Indice of tidal constituents 
     279   SUBROUTINE tide_harmo( pomega, pvt, put , pcor, kc) 
     280      !!---------------------------------------------------------------------- 
     281      !!---------------------------------------------------------------------- 
    247282      INTEGER                , INTENT(in ) ::   kc               ! Total number of tidal constituents 
    248283      REAL(wp), DIMENSION(kc), INTENT(out) ::   pomega           ! pulsation in radians/s 
     
    251286      ! 
    252287      CALL astronomic_angle 
    253       CALL tide_pulse( pomega, ktide ,kc ) 
    254       CALL tide_vuf  ( pvt, put, pcor, ktide ,kc ) 
     288      CALL tide_pulse( pomega, kc ) 
     289      CALL tide_vuf  ( pvt, put, pcor, kc ) 
    255290      ! 
    256291   END SUBROUTINE tide_harmo 
     
    348383 
    349384 
    350    SUBROUTINE tide_pulse( pomega, ktide ,kc ) 
     385   SUBROUTINE tide_pulse( pomega, kc ) 
    351386      !!---------------------------------------------------------------------- 
    352387      !!                     ***  ROUTINE tide_pulse  *** 
     
    355390      !!---------------------------------------------------------------------- 
    356391      INTEGER                , INTENT(in ) ::   kc       ! Total number of tidal constituents 
    357       INTEGER , DIMENSION(kc), INTENT(in ) ::   ktide    ! Indice of tidal constituents 
    358392      REAL(wp), DIMENSION(kc), INTENT(out) ::   pomega   ! pulsation in radians/s 
    359393      ! 
     
    371405      ! 
    372406      DO jh = 1, kc 
    373          pomega(jh) = (  zomega_T * Wave( ktide(jh) )%nT   & 
    374             &          + zomega_s * Wave( ktide(jh) )%ns   & 
    375             &          + zomega_h * Wave( ktide(jh) )%nh   & 
    376             &          + zomega_p * Wave( ktide(jh) )%np   & 
    377             &          + zomega_p1* Wave( ktide(jh) )%np1  ) * zscale 
     407         pomega(jh) = (  zomega_T * tide_components( jh )%nT   & 
     408            &          + zomega_s * tide_components( jh )%ns   & 
     409            &          + zomega_h * tide_components( jh )%nh   & 
     410            &          + zomega_p * tide_components( jh )%np   & 
     411            &          + zomega_p1* tide_components( jh )%np1  ) * zscale 
    378412      END DO 
    379413      ! 
     
    381415 
    382416 
    383    SUBROUTINE tide_vuf( pvt, put, pcor, ktide ,kc ) 
     417   SUBROUTINE tide_vuf( pvt, put, pcor, kc ) 
    384418      !!---------------------------------------------------------------------- 
    385419      !!                     ***  ROUTINE tide_vuf  *** 
     
    392426      !!---------------------------------------------------------------------- 
    393427      INTEGER                , INTENT(in ) ::   kc               ! Total number of tidal constituents 
    394       INTEGER , DIMENSION(kc), INTENT(in ) ::   ktide            ! Indice of tidal constituents 
    395428      REAL(wp), DIMENSION(kc), INTENT(out) ::   pvt, put, pcor   ! 
    396429      ! 
     
    401434         !  Phase of the tidal potential relative to the Greenwhich  
    402435         !  meridian (e.g. the position of the fictuous celestial body). Units are radian: 
    403          pvt(jh) = sh_T * Wave( ktide(jh) )%nT    & 
    404             &    + sh_s * Wave( ktide(jh) )%ns    & 
    405             &    + sh_h * Wave( ktide(jh) )%nh    & 
    406             &    + sh_p * Wave( ktide(jh) )%np    & 
    407             &    + sh_p1* Wave( ktide(jh) )%np1   & 
    408             &    +        Wave( ktide(jh) )%shift * rad 
     436         pvt(jh) = sh_T * tide_components( jh )%nT    & 
     437            &    + sh_s * tide_components( jh )%ns    & 
     438            &    + sh_h * tide_components( jh )%nh    & 
     439            &    + sh_p * tide_components( jh )%np    & 
     440            &    + sh_p1* tide_components( jh )%np1   & 
     441            &    +        tide_components( jh )%shift * rad 
    409442         ! 
    410443         !  Phase correction u due to nodal motion. Units are radian: 
    411          put(jh) = sh_xi     * Wave( ktide(jh) )%nksi   & 
    412             &    + sh_nu     * Wave( ktide(jh) )%nnu0   & 
    413             &    + sh_nuprim * Wave( ktide(jh) )%nnu1   & 
    414             &    + sh_nusec  * Wave( ktide(jh) )%nnu2   & 
    415             &    + sh_R      * Wave( ktide(jh) )%R 
     444         put(jh) = sh_xi     * tide_components( jh )%nksi   & 
     445            &    + sh_nu     * tide_components( jh )%nnu0   & 
     446            &    + sh_nuprim * tide_components( jh )%nnu1   & 
     447            &    + sh_nusec  * tide_components( jh )%nnu2   & 
     448            &    + sh_R      * tide_components( jh )%R 
    416449 
    417450         !  Nodal correction factor: 
    418          pcor(jh) = nodal_factort( Wave( ktide(jh) )%nformula ) 
     451         pcor(jh) = nodal_factort( tide_components( jh )%nformula ) 
    419452      END DO 
    420453      ! 
Note: See TracChangeset for help on using the changeset viewer.