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 13874 for NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src – NEMO

Ignore:
Timestamp:
2020-11-25T14:49:40+01:00 (4 years ago)
Author:
techene
Message:

#2574 ssh set up at initialization or restart separated from u,v,ts : removed from istate_init added in dom_init

Location:
NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domain.F90

    r13737 r13874  
    1515   !!            3.7  !  2015-11  (G. Madec, A. Coward)  time varying zgr by default 
    1616   !!            4.0  !  2016-10  (G. Madec, S. Flavoni)  domain configuration / user defined interface 
    17    !!            4.0  ! 2020-02  (G. Madec, S. Techene)  introduce ssh to h0 ratio 
     17   !!            4.1  ! 2020-02  (G. Madec, S. Techene)  introduce ssh to h0 ratio 
    1818   !!---------------------------------------------------------------------- 
    1919    
     
    2828   USE oce            ! ocean variables 
    2929   USE dom_oce        ! domain: ocean 
     30#if defined key_qco 
     31   USE domqco         ! quasi-eulerian 
     32#else 
     33   USE domvvl         ! variable volume 
     34#endif 
     35   USE sshwzv  , ONLY : ssh_init_rst   ! set initial ssh  
    3036   USE sbc_oce        ! surface boundary condition: ocean 
    3137   USE trc_oce        ! shared ocean & passive tracers variab 
     
    3541   USE dommsk         ! domain: set the mask system 
    3642   USE domwri         ! domain: write the meshmask file 
    37 #if ! defined key_qco 
    38    USE domvvl         ! variable volume 
    39 #else 
    40    USE domqco          ! variable volume 
    41 #endif 
    4243   USE c1d            ! 1D configuration 
    4344   USE dyncor_c1d     ! 1D configuration: Coriolis term    (cor_c1d routine) 
    44    USE wet_dry, ONLY : ll_wd 
    45    USE closea , ONLY : dom_clo ! closed seas 
     45   USE wet_dry , ONLY : ll_wd     ! wet & drying flag 
     46   USE closea  , ONLY : dom_clo   ! closed seas routine 
    4647   ! 
    4748   USE in_out_manager ! I/O manager 
     
    5657   PUBLIC   domain_cfg   ! called by nemogcm.F90 
    5758 
     59   !! * Substitutions 
     60#  include "do_loop_substitute.h90" 
    5861   !!------------------------------------------------------------------------- 
    5962   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    173176      r1_hf_0(:,:) = ssfmask(:,:) / ( hf_0(:,:) + 1._wp -  ssfmask(:,:) ) 
    174177      ! 
     178      IF( ll_wd ) THEN       ! wet and drying (check ht_0 >= 0) 
     179         DO_2D( 1, 1, 1, 1 ) 
     180            IF( ht_0(ji,jj) < 0._wp .AND. ssmask(ji,jj) == 1._wp ) THEN 
     181               CALL ctl_stop( 'ssh_init_rst : ht_0 must be positive at potentially wet points' ) 
     182            ENDIF 
     183         END_2D 
     184      ENDIF 
     185      ! 
     186      !           !==  initialisation of time varying coordinate  ==! 
     187      ! 
     188      !                                 != ssh initialization 
     189      IF( cdstr /= 'SAS' ) THEN 
     190         CALL ssh_init_rst( Kbb, Kmm, Kaa ) 
     191      ENDIF 
     192      ! 
    175193#if defined key_qco 
    176       !           !==  initialisation of time varying coordinate  ==!  Quasi-Euerian coordinate case 
     194      !                                 != Quasi-Euerian coordinate case 
    177195      ! 
    178196      IF( .NOT.l_offline )   CALL dom_qco_init( Kbb, Kmm, Kaa ) 
    179       ! 
    180       IF( ln_linssh )        CALL ctl_stop('STOP','domain: key_qco and ln_linssh = T are incompatible') 
    181       ! 
    182197#else 
    183       !           !==  time varying part of coordinate system  ==! 
    184       ! 
    185       IF( ln_linssh ) THEN       != Fix in time : set to the reference one for all 
     198      ! 
     199      IF( ln_linssh ) THEN              != Fix in time : set to the reference one for all 
    186200         ! 
    187201         DO jt = 1, jpt                         ! depth of t- and w-grid-points 
     
    209223               ht   (:,:) =    ht_0(:,:) 
    210224         ! 
    211       ELSE                       != time varying : initialize before/now/after variables 
     225      ELSE                              != Time varying : initialize before/now/after variables 
    212226         ! 
    213227         IF( .NOT.l_offline )   CALL dom_vvl_init( Kbb, Kmm, Kaa ) 
     
    325339      ENDIF 
    326340      ! 
     341      !                       !=======================! 
     342      !                       !==  namelist namrun  ==! 
     343      !                       !=======================! 
    327344      ! 
    328345      READ  ( numnam_ref, namrun, IOSTAT = ios, ERR = 901) 
     
    423440         END SELECT 
    424441      ENDIF 
    425  
     442      ! 
     443      !                       !=======================! 
     444      !                       !==  namelist namdom  ==! 
     445      !                       !=======================! 
     446      ! 
    426447      READ  ( numnam_ref, namdom, IOSTAT = ios, ERR = 903) 
    427448903   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdom in reference namelist' ) 
     
    431452      ! 
    432453#if defined key_agrif 
    433       IF( .NOT. Agrif_Root() ) THEN 
    434             rn_Dt = Agrif_Parent(rn_Dt) / Agrif_Rhot() 
     454      IF( .NOT. Agrif_Root() ) THEN    ! AGRIF child, subdivide the Parent timestep 
     455         rn_Dt = Agrif_Parent (rn_Dt ) / Agrif_Rhot() 
    435456      ENDIF 
    436457#endif 
     
    446467      ENDIF 
    447468      ! 
    448       !! Initialise current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3 
    449       rDt  = 2._wp * rn_Dt 
     469      ! set current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3 
     470      rDt   = 2._wp * rn_Dt 
    450471      r1_Dt = 1._wp / rDt 
     472      ! 
     473#if defined key_qco 
     474      IF( ln_linssh )   CALL ctl_stop( 'STOP','domain: key_qco and ln_linssh = T are incompatible' ) 
     475#endif 
    451476 
    452477      IF( TRIM(Agrif_CFixed()) == '0' ) THEN 
    453          lrxios = ln_xios_read.AND.ln_rstart 
    454 !set output file type for XIOS based on NEMO namelist  
    455          IF (nn_wxios > 0) lwxios = .TRUE.  
     478         lrxios = ln_xios_read .AND. ln_rstart 
     479         IF (nn_wxios > 0)   lwxios = .TRUE.    ! set output file type for XIOS based on NEMO namelist 
    456480         nxioso = nn_wxios 
    457481      ENDIF 
    458482 
    459483#if defined key_netcdf4 
    460       !                             ! NetCDF 4 case   ("key_netcdf4" defined) 
     484      ! 
     485      !                       !=======================! 
     486      !                       !==  namelist namnc4  ==!   NetCDF 4 case   ("key_netcdf4" defined) 
     487      !                       !=======================! 
     488      ! 
    461489      READ  ( numnam_ref, namnc4, IOSTAT = ios, ERR = 907) 
    462490907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namnc4 in reference namelist' ) 
     
    467495      IF(lwp) THEN                        ! control print 
    468496         WRITE(numout,*) 
    469          WRITE(numout,*) '   Namelist namnc4 - Netcdf4 chunking parameters' 
     497         WRITE(numout,*) '   Namelist namnc4 - Netcdf4 chunking parameters ("key_netcdf4" defined)' 
    470498         WRITE(numout,*) '      number of chunks in i-dimension             nn_nchunks_i = ', nn_nchunks_i 
    471499         WRITE(numout,*) '      number of chunks in j-dimension             nn_nchunks_j = ', nn_nchunks_j 
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domqco.F90

    r13761 r13874  
    99   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    1010   !!            4.1  !  2019-08  (A. Coward, D. Storkey) add time level indices for prognostic variables 
    11    !!            4.x  !  2020-02  (S. Techene, G. Madec) quasi-eulerian coordinate (z* or s*) from domvvl 
    12    !!---------------------------------------------------------------------- 
    13  
    14    !!---------------------------------------------------------------------- 
    15    !!   dom_qco_init   : define initial vertical scale factors, depths and column thickness 
    16    !!   dom_qco_zgr    : Set ssh/h_0 ratio at t 
    17    !!   dom_qco_r3c    : Compute ssh/h_0 ratio at t-, u-, v-, and optionally f-points 
    18    !!       qco_rst_read : read/write restart file 
    19    !!       qco_ctl    : Check the vvl options 
     11   !!             -   !  2020-02  (S. Techene, G. Madec) quasi-eulerian coordinate (z* or s*) 
     12   !!---------------------------------------------------------------------- 
     13 
     14   !!---------------------------------------------------------------------- 
     15   !!   dom_qco_init  : define initial vertical scale factors, depths and column thickness 
     16   !!   dom_qco_zgr   : Set ssh/h_0 ratio at t 
     17   !!   dom_qco_r3c   : Compute ssh/h_0 ratio at t-, u-, v-, and optionally f-points 
     18   !!       qco_ctl   : Check the vvl options 
    2019   !!---------------------------------------------------------------------- 
    2120   USE oce            ! ocean dynamics and tracers 
     
    5655   LOGICAL , PUBLIC :: ln_vvl_dbg = .FALSE.                ! debug control prints 
    5756 
    58    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: un_td, vn_td                ! thickness diffusion transport 
    59  
    6057   !! * Substitutions 
    6158#  include "do_loop_substitute.h90" 
     
    8885      ! 
    8986      CALL qco_ctl                            ! choose vertical coordinate (z_star, z_tilde or layer) 
    90       ! 
    91       CALL qco_rst_read( nit000, Kbb, Kmm )   ! Read or initialize ssh_(Kbb/Kmm) 
    9287      ! 
    9388      CALL dom_qco_zgr( Kbb, Kmm )            ! interpolation scale factor, depth and water column 
     
    113108      !!                ***  ROUTINE dom_qco_init  *** 
    114109      !! 
    115       !! ** Purpose :  Initialization of all ssh./h._0 ratio 
    116       !! 
    117       !! ** Method  :  - call domqco using Kbb and Kmm 
    118       !! 
    119       !! ** Action  : - r3(t/u/v)_b 
    120       !!              - r3(t/u/v/f)_n 
     110      !! ** Purpose :  Initialization of all r3. = ssh./h._0 ratios 
     111      !! 
     112      !! ** Method  :  Call domqco using Kbb and Kmm 
     113      !!               NB: dom_qco_zgr is called by dom_qco_init it uses ssh from ssh_init  
     114      !! 
     115      !! ** Action  : - r3(t/u/v)(Kbb) 
     116      !!              - r3(t/u/v/f)(Kmm) 
    121117      !!---------------------------------------------------------------------- 
    122118      INTEGER, INTENT(in) ::   Kbb, Kmm   ! time level indices 
     
    125121      !                    !== Set of all other vertical scale factors  ==!  (now and before) 
    126122      !                                ! Horizontal interpolation of e3t 
    127       CALL dom_qco_r3c( ssh(:,:,Kbb), r3t(:,:,Kbb), r3u(:,:,Kbb), r3v(:,:,Kbb) ) 
     123      CALL dom_qco_r3c( ssh(:,:,Kbb), r3t(:,:,Kbb), r3u(:,:,Kbb), r3v(:,:,Kbb)           ) 
    128124      CALL dom_qco_r3c( ssh(:,:,Kmm), r3t(:,:,Kmm), r3u(:,:,Kmm), r3v(:,:,Kmm), r3f(:,:) ) 
    129       ! 
    130125      ! 
    131126   END SUBROUTINE dom_qco_zgr 
     
    204199      ! 
    205200   END SUBROUTINE dom_qco_r3c 
    206  
    207  
    208    SUBROUTINE qco_rst_read( kt, Kbb, Kmm ) 
    209       !!--------------------------------------------------------------------- 
    210       !!                   ***  ROUTINE qco_rst_read  *** 
    211       !! 
    212       !! ** Purpose :   Read ssh in restart file 
    213       !! 
    214       !! ** Method  :   use of IOM library 
    215       !!                if the restart does not contain ssh, 
    216       !!                it is set to the _0 values. 
    217       !!---------------------------------------------------------------------- 
    218       INTEGER, INTENT(in) ::   kt         ! ocean time-step 
    219       INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
    220       ! 
    221       INTEGER ::   ji, jj, jk 
    222       INTEGER ::   id1, id2     ! local integers 
    223       !!---------------------------------------------------------------------- 
    224       ! 
    225       IF( ln_rstart ) THEN                   !* Read the restart file 
    226          CALL rst_read_open                  !  open the restart file if necessary 
    227          ! 
    228          id1 = iom_varid( numror, 'sshb', ldstop = .FALSE. ) 
    229          id2 = iom_varid( numror, 'sshn', ldstop = .FALSE. ) 
    230          ! 
    231          !                             ! --------- ! 
    232          !                             ! all cases ! 
    233          !                             ! --------- ! 
    234          ! 
    235          IF( MIN( id1, id2 ) > 0 ) THEN       ! all required arrays exist 
    236             CALL iom_get( numror, jpdom_auto, 'sshb'   , ssh(:,:,Kbb), ldxios = lrxios    ) 
    237             CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
    238             ! needed to restart if land processor not computed 
    239             IF(lwp) write(numout,*) 'qco_rst_read : ssh(:,:,Kbb) and ssh(:,:,Kmm) found in restart files' 
    240             !!WHERE ( ssmask(:,:) == 0.0_wp )   !!gm/st ==> sm should not be necessary on ssh while it was required on e3 
    241             !!   ssh(:,:,Kmm) = 0._wp 
    242             !!   ssh(:,:,Kbb) = 0._wp 
    243             !!END WHERE 
    244             IF( l_1st_euler ) THEN 
    245                ssh(:,:,Kbb) = ssh(:,:,Kmm) 
    246             ENDIF 
    247          ELSE IF( id1 > 0 ) THEN 
    248             IF(lwp) write(numout,*) 'qco_rst_read WARNING : ssh(:,:,Kmm) not found in restart files' 
    249             IF(lwp) write(numout,*) 'sshn set equal to sshb.' 
    250             IF(lwp) write(numout,*) 'neuler is forced to 0' 
    251             CALL iom_get( numror, jpdom_auto, 'sshb', ssh(:,:,Kbb), ldxios = lrxios ) 
    252             ssh(:,:,Kmm) = ssh(:,:,Kbb) 
    253             l_1st_euler = .TRUE. 
    254          ELSE IF( id2 > 0 ) THEN 
    255             IF(lwp) write(numout,*) 'qco_rst_read WARNING : ssh(:,:,Kbb) not found in restart files' 
    256             IF(lwp) write(numout,*) 'sshb set equal to sshn.' 
    257             IF(lwp) write(numout,*) 'neuler is forced to 0' 
    258             CALL iom_get( numror, jpdom_auto, 'sshn', ssh(:,:,Kmm), ldxios = lrxios ) 
    259             ssh(:,:,Kbb) = ssh(:,:,Kmm) 
    260             l_1st_euler = .TRUE. 
    261          ELSE 
    262             IF(lwp) write(numout,*) 'qco_rst_read WARNING : ssh(:,:,Kmm) not found in restart file' 
    263             IF(lwp) write(numout,*) 'ssh_b and ssh_n set to zero' 
    264             IF(lwp) write(numout,*) 'neuler is forced to 0' 
    265             ssh(:,:,:) = 0._wp 
    266             l_1st_euler = .TRUE. 
    267          ENDIF 
    268          ! 
    269       ELSE                                   !* Initialize at "rest" 
    270          ! 
    271          IF( ll_wd ) THEN   ! MJB ll_wd edits start here - these are essential 
    272             ! 
    273             IF( cn_cfg == 'wad' ) THEN            ! Wetting and drying test case 
    274                CALL usr_def_istate( gdept(:,:,:,Kbb), tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb), ssh(:,:,Kbb)  ) 
    275                ts (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb)       ! set now values from to before ones 
    276                ssh(:,:    ,Kmm) = ssh(:,:    ,Kbb) 
    277                uu (:,:,:  ,Kmm) = uu (:,:,:  ,Kbb) 
    278                vv (:,:,:  ,Kmm) = vv (:,:,:  ,Kbb) 
    279             ELSE                                  ! if not test case 
    280                ssh(:,:,Kmm) = -ssh_ref 
    281                ssh(:,:,Kbb) = -ssh_ref 
    282                ! 
    283                DO_2D( 1, 1, 1, 1 ) 
    284                   IF( ht_0(ji,jj)-ssh_ref <  rn_wdmin1 ) THEN ! if total depth is less than min depth 
    285                      ssh(ji,jj,Kbb) = rn_wdmin1 - (ht_0(ji,jj) ) 
    286                      ssh(ji,jj,Kmm) = rn_wdmin1 - (ht_0(ji,jj) ) 
    287                   ENDIF 
    288                END_2D 
    289             ENDIF 
    290             ! 
    291             DO ji = 1, jpi 
    292                DO jj = 1, jpj 
    293                   IF ( ht_0(ji,jj) .LE. 0.0 .AND. NINT( ssmask(ji,jj) ) .EQ. 1) THEN 
    294                     CALL ctl_stop( 'qco_rst_read: ht_0 must be positive at potentially wet points' ) 
    295                   ENDIF 
    296                END DO 
    297             END DO 
    298             ! 
    299          ELSE 
    300             ! 
    301             ! Just to read set ssh in fact, called latter once vertical grid 
    302             ! is set up: 
    303 !           CALL usr_def_istate( gdept_0, tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb), ssh(:,:,Kbb)  ) 
    304 !           ! 
    305 !!st            ssh(:,:,:) = 0._wp 
    306             CALL usr_def_ssh( tmask, ssh(:,:,Kbb) ) 
    307             ! 
    308             ssh(:,:,Kmm) = ssh(:,:,Kbb) 
    309             ! 
    310          ENDIF           ! end of ll_wd edits 
    311          ! 
    312       ENDIF 
    313       ! 
    314    END SUBROUTINE qco_rst_read 
    315201 
    316202 
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domvvl.F90

    r13295 r13874  
    99   !!            3.6  !  2014-11  (P. Mathiot) add ice shelf capability 
    1010   !!            4.1  !  2019-08  (A. Coward, D. Storkey) rename dom_vvl_sf_swp -> dom_vvl_sf_update for new timestepping 
    11    !!            4.x  ! 2020-02  (G. Madec, S. Techene) introduce ssh to h0 ratio 
     11   !!             -   ! 2020-02  (G. Madec, S. Techene) introduce ssh to h0 ratio 
    1212   !!---------------------------------------------------------------------- 
    1313 
     
    805805         IF( ln_rstart ) THEN                   !* Read the restart file 
    806806            CALL rst_read_open                  !  open the restart file if necessary 
    807             CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
    808807            ! 
    809808            id1 = iom_varid( numror, 'e3t_b', ldstop = .FALSE. ) 
     
    882881            ENDIF 
    883882            ! 
    884          ELSE                                   !* Initialize at "rest" 
     883         ELSE                                   !* Initialize at "rest" with ssh 
    885884            ! 
    886  
    887             IF( ll_wd ) THEN   ! MJB ll_wd edits start here - these are essential  
    888                ! 
    889                IF( cn_cfg == 'wad' ) THEN 
    890                   ! Wetting and drying test case 
    891                   CALL usr_def_istate( gdept(:,:,:,Kbb), tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb), ssh(:,:,Kbb)  ) 
    892                   ts  (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb)       ! set now values from to before ones 
    893                   ssh (:,:,Kmm)     = ssh(:,:,Kbb) 
    894                   uu   (:,:,:,Kmm)   = uu  (:,:,:,Kbb) 
    895                   vv   (:,:,:,Kmm)   = vv  (:,:,:,Kbb) 
    896                ELSE 
    897                   ! if not test case 
    898                   ssh(:,:,Kmm) = -ssh_ref 
    899                   ssh(:,:,Kbb) = -ssh_ref 
    900  
    901                   DO_2D( 1, 1, 1, 1 ) 
    902                      IF( ht_0(ji,jj)-ssh_ref <  rn_wdmin1 ) THEN ! if total depth is less than min depth 
    903                         ssh(ji,jj,Kbb) = rn_wdmin1 - (ht_0(ji,jj) ) 
    904                         ssh(ji,jj,Kmm) = rn_wdmin1 - (ht_0(ji,jj) ) 
    905                      ENDIF 
    906                   END_2D 
    907                ENDIF !If test case else 
    908  
    909                ! Adjust vertical metrics for all wad 
    910                DO jk = 1, jpk 
    911                   e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kmm)  ) & 
    912                     &                            / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk)   & 
    913                     &            + e3t_0(:,:,jk) * ( 1._wp - tmask(:,:,jk) ) 
    914                END DO 
    915                e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
    916  
    917                DO_2D( 1, 1, 1, 1 ) 
    918                   IF ( ht_0(ji,jj) .LE. 0.0 .AND. NINT( ssmask(ji,jj) ) .EQ. 1) THEN 
    919                      CALL ctl_stop( 'dom_vvl_rst: ht_0 must be positive at potentially wet points' ) 
    920                   ENDIF 
    921                END_2D 
    922                ! 
    923             ELSE 
    924                ! 
    925                ! Just to read set ssh in fact, called latter once vertical grid 
    926                ! is set up: 
    927 !               CALL usr_def_istate( gdept_0, tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb), ssh(:,:,Kbb)  ) 
    928 !               ! 
    929 !               DO jk=1,jpk 
    930 !                  e3t(:,:,jk,Kbb) =  e3t_0(:,:,jk) * ( ht_0(:,:) + ssh(:,:,Kbb) ) & 
    931 !                     &            / ( ht_0(:,:) + 1._wp -ssmask(:,:) ) * tmask(:,:,jk) 
    932 !               END DO 
    933 !               e3t(:,:,:,Kmm) = e3t(:,:,:,Kbb) 
    934                 ssh(:,:,Kmm)=0._wp 
    935                 e3t(:,:,:,Kmm)=e3t_0(:,:,:) 
    936                 e3t(:,:,:,Kbb)=e3t_0(:,:,:) 
    937                ! 
    938             END IF           ! end of ll_wd edits 
    939  
     885            DO jk = 1, jpk 
     886               e3t(:,:,jk,Kmm) =  e3t_0(:,:,jk) * ( 1._wp + ssh(:,:,Kmm)  / ( ht_0(:,:) + 1._wp - ssmask(:,:) ) * tmask(:,:,jk) ) 
     887            END DO 
     888            e3t(:,:,:,Kbb) = e3t(:,:,:,Kmm) 
     889            ! 
    940890            IF( ln_vvl_ztilde .OR. ln_vvl_layer) THEN 
    941891               tilde_e3t_b(:,:,:) = 0._wp 
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/istate.F90

    r13734 r13874  
    5959      !!  
    6060      !! ** Purpose :   Initialization of the dynamics and tracer fields. 
     61      !! 
     62      !! ** Method  :    
    6163      !!---------------------------------------------------------------------- 
    6264      INTEGER, INTENT( in )  ::  Kbb, Kmm, Kaa   ! ocean time level indices 
     
    7375      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' 
    7476 
    75 !!gm  Why not include in the first call of dta_tsd ?   
    76 !!gm  probably associated with the use of internal damping... 
    7777       CALL dta_tsd_init        ! Initialisation of T & S input data 
    78 !!gm to be moved in usrdef of C1D case 
     78 
    7979!      IF( lk_c1d )   CALL dta_uvd_init        ! Initialization of U & V input data 
    80 !!gm 
     80 
    8181      rhd  (:,:,:      ) = 0._wp   ;   rhop (:,:,:  ) = 0._wp      ! set one for all to 0 at level jpk 
    8282      rn2b (:,:,:      ) = 0._wp   ;   rn2  (:,:,:  ) = 0._wp      ! set one for all to 0 at levels 1 and jpk 
     
    9595         CALL agrif_istate( Kbb, Kmm, Kaa )   ! Interp from parent 
    9696         ! 
    97          ts (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb)  
     97         ts (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb) 
     98!!st 
     99!!st need for a recent agrif version to be displaced toward ssh_init_rst with agrif_istate_ssh 
    98100         ssh(:,:,    Kmm) = ssh(:,:    ,Kbb) 
     101!!st end 
    99102         uu (:,:,:  ,Kmm) = uu (:,:,:  ,Kbb) 
    100103         vv (:,:,:  ,Kmm) = vv (:,:,:  ,Kbb) 
     
    116119            CALL dta_tsd( nit000, ts(:,:,:,:,Kbb) )       ! read 3D T and S data at nit000 
    117120            ! 
    118             ssh(:,:  ,Kbb) = 0._wp               ! set the ocean at rest 
    119121            uu (:,:,:,Kbb) = 0._wp 
    120122            vv (:,:,:,Kbb) = 0._wp   
    121123            ! 
    122             IF( ll_wd ) THEN 
    123                ssh(:,:,Kbb) =  -ssh_ref  ! Added in 30 here for bathy that adds 30 as Iterative test CEOD  
    124                ! 
    125                ! Apply minimum wetdepth criterion 
    126                ! 
    127                DO_2D( 1, 1, 1, 1 ) 
    128                   IF( ht_0(ji,jj) + ssh(ji,jj,Kbb)  < rn_wdmin1 ) THEN 
    129                      ssh(ji,jj,Kbb) = tmask(ji,jj,1)*( rn_wdmin1 - (ht_0(ji,jj)) ) 
    130                   ENDIF 
    131                END_2D 
    132             ENDIF  
    133              ! 
    134124         ELSE                                 ! user defined initial T and S 
    135125            DO jk = 1, jpk 
    136126               zgdept(:,:,jk) = gdept(:,:,jk,Kbb) 
    137127            END DO 
    138             CALL usr_def_istate( zgdept, tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb), ssh(:,:,Kbb)  )          
     128            CALL usr_def_istate( zgdept, tmask, ts(:,:,:,:,Kbb), uu(:,:,:,Kbb), vv(:,:,:,Kbb) ) 
    139129         ENDIF 
    140130         ts (:,:,:,:,Kmm) = ts (:,:,:,:,Kbb)       ! set now values from to before ones 
    141          ssh(:,:    ,Kmm) = ssh(:,:    ,Kbb)    
    142131         uu (:,:,:  ,Kmm) = uu (:,:,:  ,Kbb) 
    143132         vv (:,:,:  ,Kmm) = vv (:,:,:  ,Kbb) 
    144133 
    145 !!gm POTENTIAL BUG : 
    146 !!gm  ISSUE :  if ssh(:,:,Kbb) /= 0  then, in non linear free surface, the e3._n, e3._b should be recomputed 
    147 !!             as well as gdept_ and gdepw_....   !!!!!  
    148 !!      ===>>>>   probably a call to domvvl initialisation here.... 
    149  
    150  
    151134         ! 
    152 !!gm to be moved in usrdef of C1D case 
    153 !         IF ( ln_uvd_init .AND. lk_c1d ) THEN ! read 3D U and V data at nit000 
    154 !            ALLOCATE( zuvd(jpi,jpj,jpk,2) ) 
    155 !            CALL dta_uvd( nit000, zuvd ) 
    156 !            uu(:,:,:,Kbb) = zuvd(:,:,:,1) ;  uu(:,:,:,Kmm) = uu(:,:,:,Kbb) 
    157 !            vv(:,:,:,Kbb) = zuvd(:,:,:,2) ;  vv(:,:,:,Kmm) = vv(:,:,:,Kbb) 
    158 !            DEALLOCATE( zuvd ) 
    159 !         ENDIF 
     135!!gm ==>>>  to be moved in usrdef_istate of C1D case  
     136         IF ( ln_uvd_init .AND. lk_c1d ) THEN ! read 3D U and V data at nit000 
     137            ALLOCATE( zuvd(jpi,jpj,jpk,2) ) 
     138            CALL dta_uvd( nit000, Kbb, zuvd ) 
     139            uu(:,:,:,Kbb) = zuvd(:,:,:,1) ;  uu(:,:,:,Kmm) = uu(:,:,:,Kbb) 
     140            vv(:,:,:,Kbb) = zuvd(:,:,:,2) ;  vv(:,:,:,Kmm) = vv(:,:,:,Kbb) 
     141            DEALLOCATE( zuvd ) 
     142         ENDIF 
    160143         ! 
    161 !!gm This is to be changed !!!! 
    162 !         ! - ML - ssh(:,:,Kmm) could be modified by istate_eel, so that initialization of e3t(:,:,:,Kbb) is done here 
    163 !         IF( .NOT.ln_linssh ) THEN 
    164 !            DO jk = 1, jpk 
    165 !               e3t(:,:,jk,Kbb) = e3t(:,:,jk,Kmm) 
    166 !            END DO 
    167 !         ENDIF 
    168 !!gm  
    169144         !  
    170145      ENDIF  
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DYN/sshwzv.F90

    r13427 r13874  
    66   !! History :  3.1  !  2009-02  (G. Madec, M. Leclair)  Original code 
    77   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  modified LF-RA  
    8    !!             -   !  2010-05  (K. Mogensen, A. Weaver, M. Martin, D. Lea) Assimilation interface 
    9    !!             -   !  2010-09  (D.Storkey and E.O'Dea) bug fixes for BDY module 
    10    !!            3.3  !  2011-10  (M. Leclair) split former ssh_wzv routine and remove all vvl related work 
    11    !!            4.0  !  2018-12  (A. Coward) add mixed implicit/explicit advection 
    12    !!            4.1  !  2019-08  (A. Coward, D. Storkey) Rename ssh_nxt -> ssh_atf. Now only does time filtering. 
     8   !!             -   !  2010-05  (K. Mogensen, A. Weaver, M. Martin, D. Lea)  Assimilation interface 
     9   !!             -   !  2010-09  (D.Storkey and E.O'Dea)  bug fixes for BDY module 
     10   !!            3.3  !  2011-10  (M. Leclair)  split former ssh_wzv routine and remove all vvl related work 
     11   !!            4.0  !  2018-12  (A. Coward)  add mixed implicit/explicit advection 
     12   !!            4.1  !  2019-08  (A. Coward, D. Storkey)  Rename ssh_nxt -> ssh_atf. Now only does time filtering. 
     13   !!             -   !  2020-08  (S. Techene, G. Madec)  add here ssh initiatlisation 
    1314   !!---------------------------------------------------------------------- 
    1415 
     
    1718   !!   ssh_atf       : time filter the ssh arrays 
    1819   !!   wzv           : compute now vertical velocity 
     20   !!   ssh_init_rst  : ssh set from restart or domcfg.nc file or usr_def_istat_ssh 
    1921   !!---------------------------------------------------------------------- 
    2022   USE oce            ! ocean dynamics and tracers variables 
     
    4042   USE timing         ! Timing 
    4143   USE wet_dry        ! Wetting/Drying flux limiting 
    42  
     44   USE usrdef_istate, ONLY : usr_def_istate_ssh   ! user defined ssh initial state  
     45    
    4346   IMPLICIT NONE 
    4447   PRIVATE 
    4548 
    46    PUBLIC   ssh_nxt    ! called by step.F90 
    47    PUBLIC   wzv        ! called by step.F90 
    48    PUBLIC   wAimp      ! called by step.F90 
    49    PUBLIC   ssh_atf    ! called by step.F90 
     49   PUBLIC   ssh_nxt        ! called by step.F90 
     50   PUBLIC   wzv            ! called by step.F90 
     51   PUBLIC   wAimp          ! called by step.F90 
     52   PUBLIC   ssh_atf        ! called by step.F90 
     53   PUBLIC   ssh_init_rst   ! called by domain.F90 
    5054 
    5155   !! * Substitutions 
    5256#  include "do_loop_substitute.h90" 
    5357#  include "domzgr_substitute.h90" 
    54  
    5558   !!---------------------------------------------------------------------- 
    5659   !! NEMO/OCE 4.0 , NEMO Consortium (2018) 
     
    433436      ! 
    434437   END SUBROUTINE wAimp 
     438 
     439 
     440   SUBROUTINE ssh_init_rst( Kbb, Kmm, Kaa ) 
     441      !!--------------------------------------------------------------------- 
     442      !!                   ***  ROUTINE ssh_init_rst  *** 
     443      !! 
     444      !! ** Purpose :   ssh initialization of the sea surface height (ssh) 
     445      !! 
     446      !! ** Method  :   set ssh from restart or read configuration, or user_def 
     447      !!              * ln_rstart = T 
     448      !!                   USE of IOM library to read ssh in the restart file 
     449      !!                   Leap-Frog: Kbb and Kmm are read except for l_1st_euler=T 
     450      !!                              or Kbb not found  
     451      !!              * otherwise  
     452      !!                   call user defined ssh or 
     453      !!                   set to -ssh_ref in wet and drying case with domcfg.nc 
     454      !! 
     455      !!              NB: ssh_b/n are written by restart.F90 
     456      !!---------------------------------------------------------------------- 
     457      INTEGER, INTENT(in) ::   Kbb, Kmm, Kaa   ! ocean time level indices 
     458      ! 
     459      INTEGER ::   ji, jj, jk 
     460      INTEGER ::   id_sshb, id_sshn     ! local integers 
     461      !!---------------------------------------------------------------------- 
     462      ! 
     463      !                            !=============================! 
     464      IF( ln_rstart ) THEN         !==  Read the restart file  ==! 
     465         !                         !=============================! 
     466         ! 
     467         CALL rst_read_open                    !*  open the restart file 
     468         ! 
     469         id_sshb = iom_varid( numror, 'sshb', ldstop = .FALSE. ) 
     470         id_sshn = iom_varid( numror, 'sshn', ldstop = .FALSE. ) 
     471         ! 
     472         IF( id_sshb <= 0 .AND. .NOT.l_1st_euler ) THEN 
     473            CALL ctl_warn ('ssh_init_rst: ssh at Kbb not found in restart files ',   & 
     474               &                         'l_1st_euler forced to .true. and ',        & 
     475               &                         'ssh(Kbb) = ssh(Kmm) '                    ) 
     476            l_1st_euler = .TRUE. 
     477         ENDIF 
     478         ! 
     479         IF( id_sshn <= 0 ) THEN       ! A restart require sshn present in the restart file 
     480            CALL ctl_stop('STOP', 'ssh_init_rst: ssh at Kmm not found in the restart file') 
     481            ! 
     482         ELSE                          ! read ssh at Kmm 
     483            CALL iom_get( numror, jpdom_auto, 'sshn'   , ssh(:,:,Kmm), ldxios = lrxios    ) 
     484            ! 
     485            IF( l_1st_euler ) THEN     ! Euler at first time-step: ssh_Kbb = ssh_Kmm 
     486               ssh(:,:,Kbb) = ssh(:,:,Kmm) 
     487               ! 
     488            ELSE                       ! read ssh at Kbb 
     489               CALL iom_get( numror, jpdom_auto, 'sshb', ssh(:,:,Kbb), ldxios = lrxios ) 
     490            ENDIF 
     491         ENDIF 
     492         !                         !============================! 
     493      ELSE                         !==  Initialize at "rest"  ==! 
     494         !                         !============================! 
     495         ! 
     496         IF( ll_wd ) THEN                      !* wet and dry  
     497            ! 
     498            IF( ln_read_cfg  ) THEN                 ! read configuration : ssh_ref is read in domain_cfg file 
     499!!st  why ssh is not masked : i.e. ssh(:,:,Kmm) = -ssh_ref*ssmask(:,:), 
     500!!st  since at the 1st time step lbclnk will be applied on ssh at Kaa but not initially at Kbb and Kmm 
     501               ssh(:,:,Kbb) = -ssh_ref 
     502               ! 
     503               DO_2D( 1, 1, 1, 1 ) 
     504                  IF( ht_0(ji,jj)-ssh_ref <  rn_wdmin1 ) THEN   ! if total depth is less than min depth 
     505                     ssh(ji,jj,Kbb) = rn_wdmin1 - ht_0(ji,jj) 
     506                  ENDIF 
     507               END_2D 
     508            ELSE                                    ! user define configuration case   
     509               CALL usr_def_istate_ssh( tmask, ssh(:,:,Kbb) ) 
     510            ENDIF 
     511            ! 
     512         ELSE                                  !* user defined configuration 
     513            CALL usr_def_istate_ssh( tmask, ssh(:,:,Kbb) ) 
     514            ! 
     515         ENDIF 
     516         ! 
     517         ssh(:,:,Kmm) = ssh(:,:,Kbb)           !* set now values from to before ones 
     518         ssh(:,:,Kaa) = 0._wp  
     519      ENDIF 
     520      ! 
     521   END SUBROUTINE ssh_init_rst 
     522       
    435523   !!====================================================================== 
    436524END MODULE sshwzv 
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/IOM/restart.F90

    r13697 r13874  
    1111   !!            3.7  !  2014-01  (G. Madec) suppression of curl and hdiv from the restart 
    1212   !!             -   !  2014-12  (G. Madec) remove KPP scheme 
     13   !!            4.1  !  2020-11  (S. Techene, G. Madec)  move ssh initiatlisation in DYN/sshwzv:ssh_init_rst 
    1314   !!---------------------------------------------------------------------- 
    1415 
     
    139140      !! ** Method  :   Write in numrow when kt == nitrst in NetCDF 
    140141      !!              file, save fields which are necessary for restart 
     142      !! 
     143      !!                NB: ssh is written here (rst_write) 
     144      !!                    but is read or set in DYN/sshwzv:shh_init_rst 
    141145      !!---------------------------------------------------------------------- 
    142146      INTEGER, INTENT(in) ::   kt         ! ocean time-step 
     
    209213! can handle checking if variable is in the restart file (there will be no need to open 
    210214! restart) 
    211          IF(.NOT.lxios_set) lrxios = lrxios.AND.lxios_sini 
    212          IF( lrxios) THEN 
     215         IF( .NOT.lxios_set )  lrxios = lrxios.AND.lxios_sini 
     216         IF( lrxios ) THEN 
    213217             crxios_context = 'nemo_rst' 
    214218             IF( .NOT.lxios_set ) THEN 
     
    218222             ENDIF 
    219223         ENDIF 
    220          IF( TRIM(Agrif_CFixed()) /= '0' .AND. lrxios) THEN 
     224         IF( TRIM(Agrif_CFixed()) /= '0' .AND. lrxios ) THEN 
    221225             CALL iom_init( crxios_context ) 
    222226             IF(lwp) WRITE(numout,*) 'Enable restart reading by XIOS for AGRIF' 
     
    232236      !!                   ***  ROUTINE rst_read  *** 
    233237      !!  
    234       !! ** Purpose :   Read files for NetCDF restart 
     238      !! ** Purpose :   Read velocity and T-S fields in the restart file 
    235239      !!  
    236       !! ** Method  :   Read in restart.nc file fields which are necessary for restart 
     240      !! ** Method  :   Read in restart.nc fields which are necessary for restart 
     241      !! 
     242      !!                NB: ssh is read or set in DYN/sshwzv:shh_init_rst 
     243      !!                    but is written     in IOM/restart:rst_write 
    237244      !!---------------------------------------------------------------------- 
    238245      INTEGER, INTENT(in) ::   Kbb, Kmm   ! ocean time level indices 
     
    242249      !!---------------------------------------------------------------------- 
    243250 
    244       CALL rst_read_open           ! open restart for reading (if not already opened) 
    245  
    246       ! Check dynamics and tracer time-step consistency and force Euler restart if changed 
     251      CALL rst_read_open            ! open restart for reading (if not already opened) 
     252 
     253      !                             ! Check time-step consistency and force Euler restart if changed 
    247254      IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 )   THEN 
    248255         CALL iom_get( numror, 'rdt', zrdt, ldxios = lrxios ) 
     
    258265      CALL iom_delay_rst( 'READ', 'OCE', numror )   ! read only ocean delayed global communication variables 
    259266       
    260       ! Diurnal DSST  
    261       IF( ln_diurnal ) CALL iom_get( numror, jpdom_auto, 'Dsst' , x_dsst, ldxios = lrxios )  
     267      !                             ! Diurnal DSST  
     268      IF( ln_diurnal )   CALL iom_get( numror, jpdom_auto, 'Dsst' , x_dsst, ldxios = lrxios )  
    262269      IF ( ln_diurnal_only ) THEN  
    263270         IF(lwp) WRITE( numout, * ) & 
     
    275282         CALL iom_get( numror, jpdom_auto, 'tb'     , ts(:,:,:,jp_tem,Kbb), ldxios = lrxios ) 
    276283         CALL iom_get( numror, jpdom_auto, 'sb'     , ts(:,:,:,jp_sal,Kbb), ldxios = lrxios ) 
    277 #if ! defined key_qco 
    278          CALL iom_get( numror, jpdom_auto, 'sshb'   ,ssh(:,:         ,Kbb), ldxios = lrxios ) 
    279 #endif 
    280284      ELSE 
    281285         l_1st_euler =  .TRUE.      ! before field not found, forced euler 1st time-step 
     
    287291      CALL iom_get( numror, jpdom_auto, 'tn'     , ts(:,:,:,jp_tem,Kmm), ldxios = lrxios ) 
    288292      CALL iom_get( numror, jpdom_auto, 'sn'     , ts(:,:,:,jp_sal,Kmm), ldxios = lrxios ) 
    289 #if ! defined key_qco 
    290       CALL iom_get( numror, jpdom_auto, 'sshn'   ,ssh(:,:         ,Kmm), ldxios = lrxios ) 
    291 #endif 
     293      ! 
    292294      IF( iom_varid( numror, 'rhop', ldstop = .FALSE. ) > 0 ) THEN 
    293295         CALL iom_get( numror, jpdom_auto, 'rhop'   , rhop, ldxios = lrxios )   ! now    potential density 
     
    296298      ENDIF 
    297299      ! 
    298       IF( l_1st_euler ) THEN                                  ! Euler restart  
    299          ts   (:,:,:,:,Kbb) = ts   (:,:,:,:,Kmm)              ! all before fields set to now values 
    300          uu   (:,:,:  ,Kbb) = uu   (:,:,:  ,Kmm) 
    301          vv   (:,:,:  ,Kbb) = vv   (:,:,:  ,Kmm) 
    302          ssh  (:,:    ,Kbb) = ssh  (:,:    ,Kmm) 
     300      IF( l_1st_euler ) THEN                 ! Euler restart  
     301         ts(:,:,:,:,Kbb) = ts(:,:,:,:,Kmm)         ! all before fields set to now values 
     302         uu(:,:,:  ,Kbb) = uu(:,:,:  ,Kmm) 
     303         vv(:,:,:  ,Kbb) = vv(:,:,:  ,Kmm) 
    303304      ENDIF 
    304305      ! 
  • NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/USR/usrdef_istate.F90

    r13761 r13874  
    77   !! User defined : set the initial state of a user configuration 
    88   !!====================================================================== 
    9    !! History :  4.0 ! 2016-03  (S. Flavoni) Original code 
     9   !! History :  4.0  ! 2016-03  (S. Flavoni) Original code 
     10   !!                 ! 2020-11  (S. Techene, G. Madec) separate tsuv from ssh 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    2223   PRIVATE 
    2324 
    24    PUBLIC   usr_def_istate   ! called in istate.F90 
    25    PUBLIC   usr_def_ssh      ! called by domqco.F90 
     25   PUBLIC   usr_def_istate       ! called in istate.F90 
     26   PUBLIC   usr_def_istate_ssh   ! called by domqco.F90 
    2627 
    2728   !! * Substitutions 
     
    3435CONTAINS 
    3536   
    36    SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv, pssh ) 
     37   SUBROUTINE usr_def_istate( pdept, ptmask, pts, pu, pv ) 
    3738      !!---------------------------------------------------------------------- 
    3839      !!                   ***  ROUTINE usr_def_istate  *** 
     
    4950      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pu      ! i-component of the velocity  [m/s]  
    5051      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(  out) ::   pv      ! j-component of the velocity  [m/s]  
    51       REAL(wp), DIMENSION(jpi,jpj)         , INTENT(  out) ::   pssh    ! sea-surface height 
    5252      ! 
    5353      INTEGER :: ji, jj, jk  ! dummy loop indices 
     
    6060      pu  (:,:,:) = 0._wp        ! ocean at rest 
    6161      pv  (:,:,:) = 0._wp 
    62       pssh(:,:)   = 0._wp 
    6362      ! 
    6463      DO_3D( 1, 1, 1, 1, 1, jpk ) 
     
    8281 
    8382    
    84    SUBROUTINE usr_def_ssh( ptmask, pssh ) 
     83   SUBROUTINE usr_def_istate_ssh( ptmask, pssh ) 
    8584      !!---------------------------------------------------------------------- 
    86       !!                   ***  ROUTINE usr_def_istate  *** 
     85      !!                   ***  ROUTINE usr_def_istate_ssh  *** 
    8786      !!  
    8887      !! ** Purpose :   Initialization of ssh 
    8988      !! 
    90       !! ** Method  :   Set as null 
     89      !! ** Method  :   Set ssh as null, ptmask is required for test cases 
    9190      !!---------------------------------------------------------------------- 
    9291      REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   ptmask  ! t-point ocean mask   [m] 
     
    9594      ! 
    9695      IF(lwp) WRITE(numout,*) 
    97       IF(lwp) WRITE(numout,*) 'usr_def_ssh : GYRE configuration, analytical definition of initial state' 
    98       IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~   ' 
     96      IF(lwp) WRITE(numout,*) 'usr_def_istate_ssh : GYRE configuration, analytical definition of initial state' 
     97      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~~   Ocean at rest, ssh is zero' 
    9998      ! 
    10099      ! Sea level: 
    101100      pssh(:,:) = 0._wp 
    102        
    103    END SUBROUTINE usr_def_ssh 
     101      ! 
     102   END SUBROUTINE usr_def_istate_ssh 
    104103 
    105104   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.