Changeset 215 in lmdz_wrf


Ignore:
Timestamp:
Jan 13, 2015, 1:11:32 PM (10 years ago)
Author:
lfita
Message:

Working but not tested version of the script!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/iniaqua.py

    r214 r215  
    1919filekinds = ['CF', 'WRF']
    2020
    21 ## g.e. # iniaqua.py -d 32,32,39 -p hybdrid -o WRF -t 19791201000000 -z tropo
     21## g.e. # iniaqua.py -d 32,32,39 -p hybdrid -o WRF -t 19791201000000 -z tropo -q 2
    2222def fxy(dx, dy):
    2323    """!
     
    13951395    print rlatuu[0:dy+2]
    13961396
    1397     return aire
     1397    return aire, apoln, apols, airesurg, rlatu, rlatv, cu, cv
    13981398
    13991399def SSUM(n,sx,incx):
     
    14151415    return ssumv
    14161416
    1417 def SCOPY(n,sx,incx,sy,incy):
     1417def SCOPY(ddx,ddy,ddz,sx,incx,sy,incy):
    14181418    """ Obsolete function to copy matrix values
    14191419      from dyn3d/cray.F
    14201420    """
    1421     iy = 1
    1422     ix = 1
    1423 
    1424     for i in range(n):
    1425         sy[iy] = sx[ix]
    1426         ix = ix+incx
    1427         iy = iy+incy
     1421    fname = 'SCOPY'
     1422
     1423    if len(sx.shape) == 2:
     1424        for j in range(ddy-1):
     1425            for i in range(ddx-1):
     1426                sy[iy,ix] = sx[iy,ix]
     1427                ix = ix+incx
     1428            iy = iy+incy
     1429    elif len(sx.shape) == 3:
     1430        iy = 0
     1431        for j in range(ddy):
     1432            ix = 0
     1433            for i in range(ddx):
     1434                for l in range(ddz):
     1435                    sy[l,iy,ix] = sx[l,iy,ix]
     1436                ix = ix+incx
     1437            iy = iy+incy
    14281438
    14291439    return sy
    14301440
    1431 def exner_hyb (dx, dy, dz, psv, pv, aire):
     1441def exner_hyb (dx, dy, dz, psv, pv, aire, apoln, apols):
    14321442    """c
    14331443       c     Auteurs :  P.Le Van  , Fr. Hourdin  .
     
    14591469    fname = 'exner_hyb'
    14601470
    1461     pks = np.zeros((dy, dx), dtype=np.float)
    1462     pk = np.zeros((dz, dy, dx), dtype=np.float)
    1463     pkf = np.zeros((dz, dy, dx), dtype=np.float)
    1464 
    1465     ppn = np.zeros((dy, dx), dtype=np.float)
    1466     pps = np.zeros((dy, dx), dtype=np.float)
    1467 
    1468     ip1jm = (dx+1)*dy
    1469 
    1470     if dz == 1:       
     1471    pksv = np.zeros((dy+1, dx+1), dtype=np.float)
     1472    pkv = np.zeros((dz, dy+1, dx+1), dtype=np.float)
     1473    pkfv = np.zeros((dz, dy+1, dx+1), dtype=np.float)
     1474
     1475    ppn = np.zeros((dy+1, dx+1), dtype=np.float)
     1476    pps = np.zeros((dy+1, dx+1), dtype=np.float)
     1477
     1478    alphav = np.zeros((dz+1, dy+1, dx+1), dtype=np.float)
     1479    betav = np.zeros((dz+1, dy+1, dx+1), dtype=np.float)
     1480
     1481    if dz == 1:
    14711482# Compute pks(:),pk(:),pkf(:)
    14721483        pks = (cpp/preff)*ps
     
    14851496    unpl2k = 1.+ 2.* kappa
    14861497
     1498    for j in range(dy+1):
     1499        for i in range(dx+1):
     1500            pksv[j,i] = cpp * ( psv[j,i]/preff ) ** kappa
     1501
     1502    for j in range(dy+1):
     1503        for i in range(dx+1):
     1504            ppn[j,i] = aire[j,i] * pksv[j,i]
     1505            pps[j,i] = aire[dy,i] * pksv[dy,i]
     1506
     1507    xpn = SSUM(dx,ppn,1) /apoln
     1508    xps = SSUM(dx,pps,1) /apols
     1509
    14871510    for j in range(dy):
    14881511        for i in range(dx):
    1489             pks[j,i] = cpp * ( ps[j,i]/preff ) ** kappa
    1490 
    1491     for j in range(dy):
    1492         for i in range(dx):
    1493             ppn[j,i] = aire[j,i] * pks[j,i]
    1494             pps[j,i] = aire[j,i+ip1jm] * pks[ij+ip1jm]
    1495 
    1496     xpn = SSUM(iim,ppn,1) /apoln
    1497     xps = SSUM(iim,pps,1) /apols
    1498 
    1499     for ij in range(iip1):
    1500         pks[ij] = xpn
    1501         pks[ij+ip1jm] = xps
     1512            pksv[j,i] = xpn[i]
     1513            pksv[dy-1,i] = xps[i]
    15021514#
    15031515#
    15041516#    .... Calcul des coeff. alpha et beta  pour la couche l = llm ..
    15051517#
    1506     for ij in range(ngrid):
    1507         alpha[ij,llm] = 0.
    1508         beta [ij,llm] = 1./ unpl2k
     1518    for j in range(dy+1):
     1519        for i in range(dx+1):
     1520            alphav[dz-1,j,i] = 0.
     1521            betav[dz-1,j,i] = 1./ unpl2k
    15091522
    15101523#
    15111524#     ... Calcul des coeff. alpha et beta  pour l = llm-1  a l = 2 ...
    15121525#
    1513     for l in range (llm-1,1,-1):
    1514 
    1515         for ij in range(ngrid):
    1516             dellta = p[ij,l]* unpl2k + p[ij,l+1]* ( beta[ij,l+1]-unpl2k )
    1517             alpha[ij,l] = -p[ij,l+1] / dellta * alpha[ij,l+1]
    1518             beta[ij,l] = p[ij,l] / dellta   
     1526    for l in range (dz-1,1,-1):
     1527        for j in range(dy+1):
     1528            for i in range(dx+1):
     1529                dellta = pv[l,j,i]* unpl2k + pv[l+1,j,i]* ( betav[l+1,j,i]-unpl2k )
     1530                alphav[l,j,i] = -pv[l+1,j,i] / dellta * alphav[l+1,j,i]
     1531                betav[l,j,i] = pv[l,j,i] / dellta   
    15191532
    15201533#  ***********************************************************************
    15211534#     .....  Calcul de pk pour la couche 1 , pres du sol  ....
    15221535#
    1523     for ij in range(ngrid):
    1524         pk[ij,0] = ( p[ij,0]*pks[ij] - 0.5*alpha[ij,1]*p[ij,1] )                     \
    1525           *(  p[ij,0]* (1.+kappa) + 0.5*( beta[ij,1]-unpl2k )* p[ij,1] )
     1536    for j in range(dy+1):
     1537        for i in range(dx+1):
     1538            pkv[0,j,i] = ( pv[0,j,i]*pksv[j,i] - 0.5*alphav[1,j,i]*pv[1,j,i] )       \
     1539              *(  pv[0,j,i]* (1.+kappa) + 0.5*( betav[1,j,i]-unpl2k )* pv[1,j,i] )
    15261540
    15271541#
    15281542#    ..... Calcul de pk(ij,l) , pour l = 2 a l = llm  ........
    15291543#
    1530     for l in range(1,llm):
    1531         for ij in range(ngrid):
    1532             pk[ij,l] = alpha[ij,l] + beta[ij,l] * pk[ij,l-1]
    1533 #
    1534 #
    1535     pkfv = SCOPY ( ngrid * llm, pk, 1, pkfv, 1 )
     1544    for l in range(dz):
     1545        for j in range(dy+1):
     1546            for i in range(dx+1):
     1547                pkv[l,j,i] = alphav[l,j,i] + betav[l,j,i] * pkv[l-1,j,i]
     1548#
     1549#
     1550    pkfv = SCOPY ( dx+1, dy+1, dz, pkv, 1, pkfv, 1 )
    15361551
    15371552# We do not filter for iniaqua
    15381553#      CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 )
    15391554
    1540     return pksv, pkv, pkfv, aplhav, betav
     1555    return pksv, pkv, pkfv, alphav, betav
    15411556
    15421557def exner_milieu ( ngrid, ps, p,beta, pks, pk, pkf ):
     
    15991614#         Compute pks(:),pk(:),pkf(:)
    16001615       
    1601         for ij in range(ngrid):
    1602             pks[ij] = (cpp/preff) * ps[ij]
    1603             pk[ij,1] = .5*pks[ij]
     1616        for j,i in range(ngrid):
     1617            pks[j,i] = (cpp/preff) * ps[j,i]
     1618            pk[j,i,1] = .5*pks[j,i]
    16041619         
    1605         pkf = SCOPY( ngrid * llm, pk, 1, pkf, 1 )
     1620        pkf = SCOPY(dx,dy,dz, pk, 1, pkf, 1 )
    16061621# We do not filter for iniaqua
    16071622#        CALL filtreg ( pkf, jmp1, llm, 2, 1, .TRUE., 1 )
     
    16161631#     -------------
    16171632   
    1618     for ij in range(ngrid):
    1619         pks[ij] = cpp * ( ps[ij]/preff ) ** kappa
    1620 
    1621     for ij in range(iim):
    1622         ppn[ij] = aire[ij] * pks[ij]
    1623         pps[ij] = aire[ij+ip1jm] * pks[ij+ip1jm]
     1633    for j,i in range(ngrid):
     1634        pks[j,i] = cpp * ( ps[j,i]/preff ) ** kappa
     1635
     1636    for j,i in range(iim):
     1637        ppn[j,i] = aire[j,i] * pks[j,i]
     1638        pps[j,i] = aire[j,i+ip1jm] * pks[j,i+ip1jm]
    16241639
    16251640    xpn = SSUM(iim,ppn,1) /apoln
    16261641    xps = SSUM(iim,pps,1) /apols
    16271642
    1628     for ij in range(iip1):
    1629         pks[ij] = xpn
    1630         pks[ij+ip1jm] = xps
     1643    for j,i in range(iip1):
     1644        pks[j,i] = xpn
     1645        pks[j,i+ip1jm] = xps
    16311646
    16321647#
     
    16371652    dum1 = cpp * (2*preff)**(-kappa)
    16381653    for l in range(llm-1):
    1639         for ij in range(ngrid):
    1640             pk[ij,l] = dum1 * (p[ij,l] + p[ij,l+1])**kappa
     1654        for j,i in range(ngrid):
     1655            pk[j,i,l] = dum1 * (p[j,i,l] + p[j,i,l+1])**kappa
    16411656
    16421657#    .... Calcul de pk  pour la couche l = llm ..
     
    16441659#    et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2)
    16451660
    1646     for ij in range(ngrid):
    1647         pk[ij,llm] = pk[ij,llm-1]**2 / pk[ij,llm-2]
     1661    for j,i in range(ngrid):
     1662        pk[j,i,llm] = pk[j,i,llm-1]**2 / pk[j,i,llm-2]
    16481663
    16491664#    calcul de pkf
    16501665#    -------------
    1651     pkf = SCOPY( ngrid * llm, pk, 1, pkf, 1 )
     1666    pkf = SCOPY( dx,dy,dz, pk, 1, pkf, 1 )
    16521667
    16531668# We do not filter iniaqua
     
    16571672#    --------------------------------
    16581673    for l in range(1, llm):
    1659         for ij in range(ngrid):
    1660             beta[ij,l] = pk[ij,l] / pk[ij,l-1]
     1674        for j,i in range(ngrid):
     1675            beta[j,i,l] = pk[j,i,l] / pk[j,i,l-1]
    16611676
    16621677    return pksv, pkv, pkfv
     
    16761691    fname = 'pression'
    16771692     
    1678     press = np.zeros((dz+1, dy, dx), dtype=np.float)
    1679 
    1680     print 'shape psv:',psv.shape,'press:',press.shape,'ap:',apv.shape,'bp:',bpv.shape
     1693    press = np.zeros((dz+1, dy+1, dx+1), dtype=np.float)
     1694
    16811695    for l in range(dz+1):
    16821696        press[l,:,:] = apv[l] + bpv[l]*psv
     
    20992113    return longitude, latitude
    21002114
    2101 def massdair(p):
     2115def massdair(dx,dy,dz,p,airesurg):
    21022116    """c
    21032117       c *********************************************************************
     
    21162130    fname = 'massdair'
    21172131
    2118     masse = np.zeros((ip1jmp1,llm), dtype=np.float)
     2132    masse = np.zeros((dz+1,dy+1,dx+1), dtype=np.float)
    21192133#
    21202134#
     
    21672181#=======================================================================
    21682182
    2169     for l in range (llm):
    2170         for ij in range(ip1jmp1):
    2171             masse[ij,l] = airesurg[ij] * ( p[ij,l] - p[ij,l+1] )
    2172 
    2173         for ij in range(ip1jmp1,iip1):
    2174             masse[ij+iim,l] = masse[ij,l]
     2183    for l in range (dz-1):
     2184        for j in range(dy+1):
     2185            for i in range(dx+1):
     2186                masse[l,j,i] = airesurg[j,i] * ( p[l,j,i] - p[l+2,j,i] )
     2187
     2188        for j in range(1,dy):
     2189            masse[l,j,dx] = masse[l,j-1,dx]
    21752190       
    21762191    return masse
    21772192
    2178 def geopot(ngrid, teta, pk, pks):
     2193def geopot(dx, dy, dz, teta, pk, pks):
    21792194    """c=======================================================================
    21802195       c
     
    21982213    fname = 'geopot'
    21992214
    2200     phis = np.zeros((ngrid), dtype=np.float)
    2201     phi = np.zeros((ngrid,llm), dtype=np.float)
     2215    phis = np.zeros((dy+1,dx+1), dtype=np.float)
     2216    phi = np.zeros((dz+1,dy+1,dx+1), dtype=np.float)
     2217
     2218    print '  Lluis in ' + fname + ' shapes phis:',phis.shape,'phi:',phi.shape,       \
     2219      'teta:',teta.shape,'pks:',pks.shape,'pk:',pk.shape
    22022220
    22032221#-----------------------------------------------------------------------
    22042222#     calcul de phi au niveau 1 pres du sol  .....
    22052223
    2206     for ij in range(ngrid):
    2207         phi[ij,1] = phis[ij] + teta[ij,0] * ( pks[ij] - pk[ij,0] )
     2224    for j in range(dy):
     2225        for i in range(dx):
     2226            phi[0,j,i] = phis[j,i] + teta[0,j,i] * ( pks[j,i] - pk[0,j,i] )
    22082227
    22092228#     calcul de phi aux niveaux superieurs  .......
    22102229
    2211     for l in range(1,llm):
    2212         for ij in range(ngrid):
    2213             phi[ij,l] = phi[ij,l-1] + 0.5 * ( teta[ij,l]+teta[ij,l-1] ) *            \
    2214               ( pk[ij,l-1]-pk[ij,l] )
     2230    for l in range(1,dz):
     2231        for j in range(dy):
     2232            for i in range(dx):
     2233                phi[l,j,i] = phi[l-1,j,i] + 0.5 * ( teta[l,j,i]+teta[l-1,j,i] ) *    \
     2234                  ( pk[l-1,j,i]-pk[l,j,i] )
    22152235
    22162236    return phis, phi
     
    22522272    return z
    22532273
    2254 def ugeostr(phi):
     2274def ugeostr(dx,dy,dz,phis,phi,rlatu,rlatv,cu):
    22552275    """! Calcul du vent covariant geostrophique a partir du champ de
    22562276       ! geopotentiel.
     
    22612281    """
    22622282    fname = 'ugeostr'
    2263     ucov = np.zeros((iip1,jjp1,llm), dtype=np.float)
    2264     um = np.zeros((jjm,llm), dtype=np.float)
    2265     u = np.zeros((iip1,jjm,llm), dtype=np.float)
    2266 
    2267     for j in range(jjm):
     2283    ucov = np.zeros((dz,dy+1,dx+1), dtype=np.float)
     2284    um = np.zeros((dz,dy), dtype=np.float)
     2285    u = np.zeros((dz,dy,dx+1), dtype=np.float)
     2286
     2287    print '  Lluis in ' + fname + ': shapes phis:',phis.shape,'phi:',phi.shape,'u:',u.shape
     2288
     2289    for j in range(dy):
    22682290        if np.abs(np.sin(rlatv[j])) < 1.e-4:
    22692291            zlat = 1.e-4
    22702292        else:
    2271             zlat=rlatv(j)
     2293            zlat=rlatv[j]
    22722294
    22732295        fact = np.cos(zlat)
     
    22752297        fact = fact*fact
    22762298        fact = fact*fact
    2277         fact = (1.-fact)/ (2.*omeg*sin(zlat)*(rlatu[j+1]-rlatu[j]))
     2299        fact = (1.-fact)/ (2.*omeg*np.sin(zlat)*(rlatu[j+1]-rlatu[j]))
    22782300        fact = -fact/rad
    2279         for l in range(llm):
    2280             for i in range(iim):
    2281                 u[i,j,l] = fact*(phi[i,j+1,l]-phi[i,j,l])
    2282                 um[j,l]=um[j,l]+u[i,j,l]/np.float(iim)
    2283 
    2284     um = dump2d(jjm,llm,'Vent-u geostrophique')
     2301        for l in range(dz):
     2302            for i in range(dx):
     2303                u[l,j,i] = fact*(phi[l,j+1,i]-phi[l,j,i])
     2304                um[l,j]=um[l,j]+u[l,j,i]/np.float(dx)
     2305
     2306    um = dump2d(dz,dy,'Vent-u geostrophique')
    22852307
    22862308# calcul des champ de vent:
    22872309
    2288     for l in range(llm):
    2289         for i in range(iip1):
    2290             ucov[i,1,l]=0.
    2291             ucov[i,jjp1,l]=0.
    2292         for j in range(1,jjm):
    2293             for i in range(iim):
    2294                 ucov[i,j,l] = 0.5*(u[i,j,l]+u[i,j-1,l])*cu[i,j]
    2295 
    2296         ucov[iip1,j,l]=ucov[0,j,l]
     2310    for l in range(dz):
     2311        for i in range(dx+1):
     2312            ucov[l,0,i]=0.
     2313            ucov[l,dy,i]=0.
     2314        for j in range(1,dy):
     2315            for i in range(dx):
     2316                ucov[l,j,i] = 0.5*(u[l,j,i]+u[l,j-1,i])*cu[j,i]
     2317
     2318        ucov[l,j,dx]=ucov[l,j,0]
    22972319
    22982320    return ucov
     
    23052327    """
    23062328    fname = 'RAN1'
    2307     Nvals = 97
    23082329
    23092330    R = np.zeros((Nvals), dtype=np.float)
     
    23202341    IA3 = 4561
    23212342    IC3 = 51349
     2343    IFF = 0
    23222344
    23232345    if IDUM < 0 or IFF == 0:
     
    23582380  help="how as to b computed Exner pressure ('hybrid': hybrid coordinates, 'middle': middle layer)", 
    23592381  metavar="VALUE")
     2382parser.add_option("-q", "--NWaterSpecies", dest="nqtot",
     2383  help="Number of water species", metavar="VALUE")
    23602384parser.add_option("-t", "--time", dest="time",
    23612385  help="time of the initial conditions ([YYYY][MM][DD][HH][MI][SS] format)", metavar="VALUE")
     
    23962420dimy = int(opts.dims.split(',')[1])
    23972421dimz = int(opts.dims.split(',')[2])
     2422nqtot = int(opts.nqtot)
    23982423
    23992424ofile = 'iniaqua.nc'
     
    24732498# Vertical profile
    24742499tetajl =  np.zeros((dimz, dimy+1, dimx), dtype=np.float)
    2475 teta = np.zeros((dimy+1, dimx+1), dtype=np.float)
    2476 tetarappel = np.zeros((dimz, dimy+1, dimx+1), dtype=np.float)
     2500theta = np.zeros((dimy+1, dimx+1), dtype=np.float)
     2501thetarappel = np.zeros((dimz, dimy+1, dimx+1), dtype=np.float)
    24772502
    24782503for l in range (dimz):
     
    25012526#
    25022527#    tetarappel[iz,iy,0:dimx] = tetajl[iz,iy,dimx-1]
    2503 tetarappel = tetajl
     2528thetarappel = tetajl.copy()
    25042529
    25052530# 3. Initialize fields (if necessary)
     
    25102535# "Specify the initial dry mass to be equivalent to
    25112536#  a global mean surface pressure (101325 minus 245) Pa."
    2512     ps = np.ones((dimy, dimx), dtype=np.float)*101080. 
     2537    press = np.ones((dimy+1, dimx+1), dtype=np.float)*101080. 
    25132538else:
    25142539# use reference surface pressure
    2515     ps = np.ones((dimy, dimx), dtype=np.float)*preff
     2540    press = np.ones((dimy+1, dimx+1), dtype=np.float)*preff
    25162541       
    25172542# ground geopotential
    2518 phiss =  np.zeros((dimy, dimx), dtype=np.float)
    2519 
    2520 p = pression(dimx, dimy, dimz, ap, bp, ps)
    2521 
    2522 aire = inigeom(dimx, dimy)
     2543phiss =  np.zeros((dimy+1, dimx+1), dtype=np.float)
     2544
     2545pres = pression(dimx, dimy, dimz, ap, bp, press)
     2546
     2547aire, apolnorth, apolsouth, airesurge, rlatitudeu, rlatitudev, cuwind, cvwind =      \
     2548  inigeom(dimx, dimy)
    25232549
    25242550if opts.pexner == 'hybdrid':
    2525     pks, pk, pkf, alpha, beta = exner_hyb(dimx, dimy, dimz, ps, p, aire)
     2551    pks, pk, pkf, alpha, beta = exner_hyb(dimx, dimy, dimz, press, pres, aire,       \
     2552      apolnorth, apolsouth)
    25262553else:
    2527     pks, pk, pkf = exner_milieu(ip1jmp1, dimx, dimy, dimz, ps, p, beta)
    2528 
    2529 masse = massdair(p)
     2554    pks, pk, pkf = exner_milieu(ip1jmp1, dimx, dimy, dimz, press, pres, beta)
     2555
     2556masse = massdair(dimx,dimy,dimz,pres,airesurge)
    25302557
    25312558# bulk initialization of temperature
    2532 teta = tetarappel.copy()
     2559theta = thetarappel.copy()
    25332560
    25342561# geopotential
    2535 phis =  np.zeros((dimy, dimx), dtype=np.float)
    2536 phi =  np.zeros((dimz, dimy, dimx), dtype=np.float)
    2537 
    2538 phis, phi = geopot(ip1jmp1,teta,pk,pks)
     2562phisfc =  np.zeros((dimy+1, dimx+1), dtype=np.float)
     2563phiall =  np.zeros((dimz+1, dimy+1, dimx+1), dtype=np.float)
     2564
     2565phisfc, phiall = geopot(dimx,dimy,dimz,theta,pk,pks)
    25392566
    25402567# winds
     
    25422569vcov =  np.zeros((dimz, dimy, dimx), dtype=np.float)
    25432570
    2544 
    25452571if ok_geost:
    2546     ucov = ugeostr(phi)
     2572    ucov = ugeostr(dimx,dimy,dimz,phisfc,phiall,rlatitudeu,rlatitudev,cuwind)
    25472573
    25482574# bulk initialization of tracers
     2575print 'Lluis nqtot:',nqtot
    25492576q = np.zeros((dimz, dimy, dimx, nqtot), dtype=np.float)
    25502577
     
    25582585# add random perturbation to temperature
    25592586idum  = -1
    2560 zz = RAN1(idum)
     2587zz = RAN1(idum,97)
    25612588idum  = 0
    2562 for l in range(llm):
    2563     for ij in range(iip2,ip1jm):
    2564         teta[ij,l] = teta[ij,l]*(1.+0.005*RAN1(idum))
     2589for l in range(dimz):
     2590    for j in range(dimy):
     2591        for i in range(dimx):
     2592            theta[l,j,i] = theta[l,j,i]*(1.+0.005*RAN1(idum,97))
    25652593
    25662594# maintain periodicity in longitude
    2567 for l in range(llm):
    2568     for ij in range(0,ip1jmp1,iip1):
    2569         teta[ij+iim,l]=teta[ij,l]
     2595for l in range(dimz):
     2596    for j in range(1,dimy):
     2597        theta[l,j,dimx-1]=theta[l,j-1,dimx-1]
    25702598
    25712599ncf = NetCDFFile(ofile, 'w')
Note: See TracChangeset for help on using the changeset viewer.