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 10419 for NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex/NEMO/subfiles/chap_time_domain.tex – NEMO

Ignore:
Timestamp:
2018-12-19T20:46:30+01:00 (5 years ago)
Author:
smasson
Message:

dev_r10164_HPC09_ESIWACE_PREP_MERGE: merge with trunk@10418, see #2133

Location:
NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex

    • Property svn:ignore set to
      *.aux
      *.bbl
      *.blg
      *.dvi
      *.fdb*
      *.fls
      *.idx
      *.ilg
      *.ind
      *.log
      *.maf
      *.mtc*
      *.out
      *.pdf
      *.toc
      _minted-*
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex/NEMO

    • Property svn:ignore set to
      *.aux
      *.bbl
      *.blg
      *.dvi
      *.fdb*
      *.fls
      *.idx
      *.ilg
      *.ind
      *.log
      *.maf
      *.mtc*
      *.out
      *.pdf
      *.toc
      _minted-*
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex/NEMO/subfiles

    • Property svn:ignore set to
      *.aux
      *.bbl
      *.blg
      *.dvi
      *.fdb*
      *.fls
      *.idx
      *.ilg
      *.ind
      *.log
      *.maf
      *.mtc*
      *.out
      *.pdf
      *.toc
      _minted-*
  • NEMO/branches/2018/dev_r10164_HPC09_ESIWACE_PREP_MERGE/doc/latex/NEMO/subfiles/chap_time_domain.tex

    r10368 r10419  
    1 \documentclass[../tex_main/NEMO_manual]{subfiles} 
     1\documentclass[../main/NEMO_manual]{subfiles} 
     2 
    23\begin{document} 
    34 
    45% ================================================================ 
    5 % Chapter 2 ——— Time Domain (step.F90) 
     6% Chapter 2 Time Domain (step.F90) 
    67% ================================================================ 
    78\chapter{Time Domain (STP) } 
    89\label{chap:STP} 
     10 
    911\minitoc 
    1012 
    1113% Missing things: 
    1214%  - daymod: definition of the time domain (nit000, nitend andd the calendar) 
    13  
    1415 
    1516\gmcomment{STEVEN :maybe a picture of the directory structure in the introduction which could be referred to here, 
     
    1718%%%% 
    1819 
    19  
    2020\newpage 
    21 $\ $\newline    % force a new ligne 
    22  
    2321 
    2422Having defined the continuous equations in \autoref{chap:PE}, we need now to choose a time discretization, 
     
    2826the consequences for the order in which the equations are solved. 
    2927 
    30 $\ $\newline    % force a new ligne 
    3128% ================================================================ 
    3229% Time Discretisation 
     
    3633 
    3734The time stepping used in \NEMO is a three level scheme that can be represented as follows: 
    38 \begin{equation} \label{eq:STP} 
    39    x^{t+\rdt} = x^{t-\rdt} + 2 \, \rdt \  \text{RHS}_x^{t-\rdt,\,t,\,t+\rdt} 
     35\begin{equation} 
     36  \label{eq:STP} 
     37  x^{t+\rdt} = x^{t-\rdt} + 2 \, \rdt \  \text{RHS}_x^{t-\rdt,\,t,\,t+\rdt} 
    4038\end{equation}  
    4139where $x$ stands for $u$, $v$, $T$ or $S$; 
     
    8583This filter, first designed by \citet{Robert_JMSJ66} and more comprehensively studied by \citet{Asselin_MWR72}, 
    8684is a kind of laplacian diffusion in time that mixes odd and even time steps: 
    87 \begin{equation} \label{eq:STP_asselin} 
    88 x_F^t  = x^t + \gamma \, \left[ x_F^{t-\rdt} - 2 x^t + x^{t+\rdt} \right] 
     85\begin{equation} 
     86  \label{eq:STP_asselin} 
     87  x_F^t  = x^t + \gamma \, \left[ x_F^{t-\rdt} - 2 x^t + x^{t+\rdt} \right] 
    8988\end{equation}  
    9089where the subscript $F$ denotes filtered values and $\gamma$ is the Asselin coefficient. 
     
    111110For a tendancy $D_x$, representing a diffusion term or a restoring term to a tracer climatology 
    112111(when present, see \autoref{sec:TRA_dmp}), a forward time differencing scheme is used : 
    113 \begin{equation} \label{eq:STP_euler} 
     112\[ 
     113  % \label{eq:STP_euler} 
    114114   x^{t+\rdt} = x^{t-\rdt} + 2 \, \rdt \ {D_x}^{t-\rdt} 
    115 \end{equation}  
     115\]  
    116116 
    117117This is diffusive in time and conditionally stable. 
    118118The conditions for stability of second and fourth order horizontal diffusion schemes are \citep{Griffies_Bk04}: 
    119 \begin{equation} \label{eq:STP_euler_stability} 
    120 A^h < \left\{ 
    121 \begin{aligned} 
    122                     &\frac{e^2}{  8 \; \rdt }   &&\quad \text{laplacian diffusion}  \\ 
    123                     &\frac{e^4}{64 \; \rdt }    &&\quad \text{bilaplacian diffusion}  
    124             \end{aligned} 
    125 \right. 
     119\begin{equation} 
     120  \label{eq:STP_euler_stability} 
     121  A^h < \left\{ 
     122    \begin{aligned} 
     123      &\frac{e^2}{  8 \; \rdt }  &&\quad \text{laplacian diffusion}  \\ 
     124      &\frac{e^4}{64 \; \rdt }   &&\quad \text{bilaplacian diffusion} 
     125    \end{aligned} 
     126  \right. 
    126127\end{equation} 
    127128where $e$ is the smallest grid size in the two horizontal directions and $A^h$ is the mixing coefficient. 
     
    138139the stability criterion is reduced by a factor of $N$. 
    139140The computation is performed as follows: 
    140 \begin{equation} \label{eq:STP_ts} 
    141 \begin{split} 
    142 & x_\ast ^{t-\rdt} = x^{t-\rdt}   \\ 
    143 & x_\ast ^{t-\rdt+L\frac{2\rdt}{N}}=x_\ast ^{t-\rdt+\left( {L-1}  
    144 \right)\frac{2\rdt}{N}}+\frac{2\rdt}{N}\;\text{DF}^{t-\rdt+\left( {L-1} \right)\frac{2\rdt}{N}} 
    145         \quad \text{for $L=1$ to $N$}      \\ 
    146 & x^{t+\rdt} = x_\ast^{t+\rdt} 
    147 \end{split} 
    148 \end{equation} 
     141\[ 
     142  % \label{eq:STP_ts} 
     143  \begin{split} 
     144    & x_\ast ^{t-\rdt} = x^{t-\rdt}   \\ 
     145    & x_\ast ^{t-\rdt+L\frac{2\rdt}{N}}=x_\ast ^{t-\rdt+\left( {L-1} 
     146      \right)\frac{2\rdt}{N}}+\frac{2\rdt}{N}\;\text{DF}^{t-\rdt+\left( {L-1} \right)\frac{2\rdt}{N}} 
     147    \quad \text{for $L=1$ to $N$}      \\ 
     148    & x^{t+\rdt} = x_\ast^{t+\rdt} 
     149  \end{split} 
     150\] 
    149151with DF a vertical diffusion term. 
    150152The number of fractional time steps, $N$, is given by setting \np{nn\_zdfexp}, (namelist parameter). 
    151153The scheme $(b)$ is unconditionally stable but diffusive. It can be written as follows: 
    152 \begin{equation} \label{eq:STP_imp} 
    153    x^{t+\rdt} = x^{t-\rdt} + 2 \, \rdt \  \text{RHS}_x^{t+\rdt} 
     154\begin{equation} 
     155  \label{eq:STP_imp} 
     156  x^{t+\rdt} = x^{t-\rdt} + 2 \, \rdt \  \text{RHS}_x^{t+\rdt} 
    154157\end{equation}  
    155158 
     
    161164but it becomes attractive since a value of 3 or more is needed for N in the forward time differencing scheme. 
    162165For example, the finite difference approximation of the temperature equation is: 
    163 \begin{equation} \label{eq:STP_imp_zdf} 
    164 \frac{T(k)^{t+1}-T(k)^{t-1}}{2\;\rdt}\equiv \text{RHS}+\frac{1}{e_{3t} }\delta  
    165 _k \left[ {\frac{A_w^{vT} }{e_{3w} }\delta _{k+1/2} \left[ {T^{t+1}} \right]}  
    166 \right] 
    167 \end{equation} 
     166\[ 
     167  % \label{eq:STP_imp_zdf} 
     168  \frac{T(k)^{t+1}-T(k)^{t-1}}{2\;\rdt}\equiv \text{RHS}+\frac{1}{e_{3t} }\delta 
     169  _k \left[ {\frac{A_w^{vT} }{e_{3w} }\delta_{k+1/2} \left[ {T^{t+1}} \right]} 
     170  \right] 
     171\] 
    168172where RHS is the right hand side of the equation except for the vertical diffusion term. 
    169173We rewrite \autoref{eq:STP_imp} as: 
    170 \begin{equation} \label{eq:STP_imp_mat} 
    171 -c(k+1)\;T^{t+1}(k+1) + d(k)\;T^{t+1}(k) - \;c(k)\;T^{t+1}(k-1) \equiv b(k) 
     174\begin{equation} 
     175  \label{eq:STP_imp_mat} 
     176  -c(k+1)\;T^{t+1}(k+1) + d(k)\;T^{t+1}(k) - \;c(k)\;T^{t+1}(k-1) \equiv b(k) 
    172177\end{equation} 
    173178where  
    174 \begin{align*}  
    175  c(k) &= A_w^{vT} (k) \, / \, e_{3w} (k)     \\ 
    176  d(k) &= e_{3t} (k)       \, / \, (2\rdt) + c_k + c_{k+1}    \\ 
    177  b(k) &= e_{3t} (k) \; \left( T^{t-1}(k) \, / \, (2\rdt) + \text{RHS} \right)     
     179\begin{align*} 
     180  c(k) &= A_w^{vT} (k) \, / \, e_{3w} (k)     \\ 
     181  d(k) &= e_{3t} (k)       \, / \, (2\rdt) + c_k + c_{k+1}    \\ 
     182  b(k) &= e_{3t} (k) \; \left( T^{t-1}(k) \, / \, (2\rdt) + \text{RHS} \right)     
    178183\end{align*} 
    179184 
     
    199204  \begin{center} 
    200205    \includegraphics[width=0.7\textwidth]{Fig_TimeStepping_flowchart} 
    201     \caption{  \protect\label{fig:TimeStep_flowchart} 
     206    \caption{ 
     207      \protect\label{fig:TimeStep_flowchart} 
    202208      Sketch of the leapfrog time stepping sequence in \NEMO from \citet{Leclair_Madec_OM09}. 
    203209      The use of a semi-implicit computation of the hydrostatic pressure gradient requires the tracer equation to 
     
    208214      (see \autoref{sec:DYN_spg}). 
    209215    } 
    210 \end{center}   \end{figure} 
     216  \end{center} 
     217\end{figure} 
    211218%>>>>>>>>>>>>>>>>>>>>>>>>>>>> 
    212219%} 
     
    226233and the time filter is given by \autoref{eq:STP_asselin} so that $Q$ is redistributed over several time step. 
    227234In the modified LF-RA environment, these two formulations have been replaced by: 
    228 \begin{align}  
    229 x^{t+\rdt}  &= x^{t-\rdt} + \rdt \left( Q^{t-\rdt/2} + Q^{t+\rdt/2} \right)                   \label{eq:STP_forcing} \\ 
    230 % 
    231 x_F^t  &= x^t + \gamma \, \left[ x_F^{t-\rdt} - 2 x^t + x^{t+\rdt} \right]  
     235\begin{align} 
     236  x^{t+\rdt}  &= x^{t-\rdt} + \rdt \left( Q^{t-\rdt/2} + Q^{t+\rdt/2} \right)                   \label{eq:STP_forcing} \\ 
     237  % 
     238  x_F^t  &= x^t + \gamma \, \left[ x_F^{t-\rdt} - 2 x^t + x^{t+\rdt} \right] 
    232239           - \gamma\,\rdt \, \left[ Q^{t+\rdt/2} -  Q^{t-\rdt/2} \right]                          \label{eq:STP_RA} 
    233240\end{align} 
     
    259266  \begin{center} 
    260267    \includegraphics[width=0.90\textwidth]{Fig_MLF_forcing} 
    261     \caption{  \protect\label{fig:MLF_forcing} 
     268    \caption{ 
     269      \protect\label{fig:MLF_forcing} 
    262270      Illustration of forcing integration methods. 
    263271      (top) ''Traditional'' formulation: 
     
    284292The first time step of this three level scheme when starting from initial conditions is a forward step 
    285293(Euler time integration): 
    286 \begin{equation} \label{eq:DOM_euler} 
    287    x^1 = x^0 + \rdt \ \text{RHS}^0 
    288 \end{equation} 
     294\[ 
     295  % \label{eq:DOM_euler} 
     296  x^1 = x^0 + \rdt \ \text{RHS}^0 
     297\] 
    289298This is done simply by keeping the leapfrog environment ($i.e.$ the \autoref{eq:STP} three level time stepping) but 
    290299setting all $x^0$ (\textit{before}) and $x^{1}$ (\textit{now}) fields equal at the first time step and 
     
    301310(see \autoref{subsec:DYN_hpg_imp}), an extra three-dimensional field has to 
    302311be added to the restart file to ensure an exact restartability. 
    303 This is done optionally via the  \np{nn\_dynhpg\_rst} namelist parameter, 
     312This is done optionally via the \np{nn\_dynhpg\_rst} namelist parameter, 
    304313so that the size of the restart file can be reduced when restartability is not a key issue 
    305314(operational oceanography or in ensemble simulations for seasonal forecasting). 
     
    307316Note the size of the time step used, $\rdt$, is also saved in the restart file. 
    308317When restarting, if the the time step has been changed, a restart using an Euler time stepping scheme is imposed.  
    309 Options are defined through the  \ngn{namrun} namelist variables. 
     318Options are defined through the \ngn{namrun} namelist variables. 
    310319%%% 
    311320\gmcomment{ 
     
    351360 
    352361\begin{flalign*} 
    353 &\frac{\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1}}{2\rdt} 
    354 \equiv \text{RHS}+ \delta _k \left[ {\frac{A_w^{vt} }{e_{3w}^{t+1} }\delta _{k+1/2} \left[ {T^{t+1}} \right]}  
    355 \right]      \\ 
    356 &\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1} 
    357 \equiv {2\rdt} \ \text{RHS}+ {2\rdt} \ \delta _k \left[ {\frac{A_w^{vt} }{e_{3w}^{t+1} }\delta _{k+1/2} \left[ {T^{t+1}} \right]}  
    358 \right]      \\ 
    359 &\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1} 
    360 \equiv 2\rdt \ \text{RHS} 
    361 + 2\rdt \ \left\{ \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2} [ T_{k+1}^{t+1} - T_k      ^{t+1} ] 
    362                           - \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2} [ T_k       ^{t+1} - T_{k-1}^{t+1} ]  \right\}     \\ 
    363 &\\ 
    364 &\left( e_{3t}\,T \right)_k^{t+1} 
    365 -  {2\rdt} \           \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2}                  T_{k+1}^{t+1}  
    366 + {2\rdt} \ \left\{  \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2}  
    367                             +  \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}     \right\}   T_{k    }^{t+1} 
    368 -  {2\rdt} \           \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}                  T_{k-1}^{t+1}      \\ 
    369 &\equiv \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}    \\ 
    370 % 
     362  &\frac{\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1}}{2\rdt} 
     363  \equiv \text{RHS}+ \delta_k \left[ {\frac{A_w^{vt} }{e_{3w}^{t+1} }\delta_{k+1/2} \left[ {T^{t+1}} \right]} 
     364  \right]      \\ 
     365  &\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1} 
     366  \equiv {2\rdt} \ \text{RHS}+ {2\rdt} \ \delta_k \left[ {\frac{A_w^{vt} }{e_{3w}^{t+1} }\delta_{k+1/2} \left[ {T^{t+1}} \right]} 
     367  \right]      \\ 
     368  &\left( e_{3t}\,T \right)_k^{t+1}-\left( e_{3t}\,T \right)_k^{t-1} 
     369  \equiv 2\rdt \ \text{RHS} 
     370  + 2\rdt \ \left\{ \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2} [ T_{k+1}^{t+1} - T_k      ^{t+1} ] 
     371    - \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2} [ T_k       ^{t+1} - T_{k-1}^{t+1} ]  \right\}     \\ 
     372  &\\ 
     373  &\left( e_{3t}\,T \right)_k^{t+1} 
     374  -  {2\rdt} \           \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2}                  T_{k+1}^{t+1} 
     375  + {2\rdt} \ \left\{  \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2} 
     376    +  \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}     \right\}   T_{k    }^{t+1} 
     377  -  {2\rdt} \           \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}                  T_{k-1}^{t+1}      \\ 
     378  &\equiv \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}    \\ 
     379  %  
    371380\end{flalign*} 
    372381 
    373382\begin{flalign*} 
    374 \allowdisplaybreaks 
    375 \intertext{ Tracer case } 
    376 % 
    377 &  \qquad \qquad  \quad   -  {2\rdt}                  \ \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2}    
    378                                                                                                       \qquad \qquad \qquad  \qquad  T_{k+1}^{t+1}   \\ 
    379 &+ {2\rdt} \ \biggl\{  (e_{3t})_{k   }^{t+1}  \bigg. +    \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2}   
    380                                                                                +   \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2} \bigg. \biggr\}  \ \ \ T_{k   }^{t+1}  &&\\ 
    381 & \qquad \qquad  \qquad \qquad \qquad \quad \ \ -  {2\rdt} \                          \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}                          \quad \ \ T_{k-1}^{t+1}      
    382 \ \equiv \ \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}  \\ 
    383 % 
     383  \allowdisplaybreaks 
     384  \intertext{ Tracer case } 
     385  % 
     386  &  \qquad \qquad  \quad   -  {2\rdt}                  \ \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2} 
     387  \qquad \qquad \qquad  \qquad  T_{k+1}^{t+1}   \\ 
     388  &+ {2\rdt} \ \biggl\{  (e_{3t})_{k   }^{t+1}  \bigg. +    \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k+1/2} 
     389  +   \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2} \bigg. \biggr\}  \ \ \ T_{k   }^{t+1}  &&\\ 
     390  & \qquad \qquad  \qquad \qquad \qquad \quad \ \ -  {2\rdt} \                          \left[ \frac{A_w^{vt}}{e_{3w}^{t+1}} \right]_{k-1/2}                          \quad \ \ T_{k-1}^{t+1} 
     391  \ \equiv \ \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}  \\ 
     392  % 
    384393\end{flalign*} 
    385394\begin{flalign*} 
    386 \allowdisplaybreaks 
    387 \intertext{ Tracer content case } 
    388 % 
    389 & -  {2\rdt} \              & \frac{(A_w^{vt})_{k+1/2}} {(e_{3w})_{k+1/2}^{t+1}\;(e_{3t})_{k+1}^{t+1}}  && \  \left( e_{3t}\,T \right)_{k+1}^{t+1}   &\\ 
    390 & + {2\rdt} \ \left[ 1  \right.+ & \frac{(A_w^{vt})_{k+1/2}} {(e_{3w})_{k+1/2}^{t+1}\;(e_{3t})_k^{t+1}}  
    391                                     + & \frac{(A_w^{vt})_{k -1/2}} {(e_{3w})_{k -1/2}^{t+1}\;(e_{3t})_k^{t+1}}  \left.  \right]  & \left( e_{3t}\,T \right)_{k   }^{t+1}  &\\ 
    392 & -  {2\rdt} \               & \frac{(A_w^{vt})_{k -1/2}} {(e_{3w})_{k -1/2}^{t+1}\;(e_{3t})_{k-1}^{t+1}}     &\  \left( e_{3t}\,T \right)_{k-1}^{t+1}    
    393 \equiv \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}  & 
     395  \allowdisplaybreaks 
     396  \intertext{ Tracer content case } 
     397  % 
     398  & -  {2\rdt} \              & \frac{(A_w^{vt})_{k+1/2}} {(e_{3w})_{k+1/2}^{t+1}\;(e_{3t})_{k+1}^{t+1}}  && \  \left( e_{3t}\,T \right)_{k+1}^{t+1}   &\\ 
     399  & + {2\rdt} \ \left[ 1  \right.+ & \frac{(A_w^{vt})_{k+1/2}} {(e_{3w})_{k+1/2}^{t+1}\;(e_{3t})_k^{t+1}} 
     400  + & \frac{(A_w^{vt})_{k -1/2}} {(e_{3w})_{k -1/2}^{t+1}\;(e_{3t})_k^{t+1}}  \left.  \right]  & \left( e_{3t}\,T \right)_{k   }^{t+1}  &\\ 
     401  & -  {2\rdt} \               & \frac{(A_w^{vt})_{k -1/2}} {(e_{3w})_{k -1/2}^{t+1}\;(e_{3t})_{k-1}^{t+1}}     &\  \left( e_{3t}\,T \right)_{k-1}^{t+1} 
     402  \equiv \left( e_{3t}\,T \right)_k^{t-1} + {2\rdt} \ \text{RHS}  & 
    394403\end{flalign*} 
    395404 
     
    397406} 
    398407%% 
     408\biblio 
     409 
    399410\end{document} 
Note: See TracChangeset for help on using the changeset viewer.