Extract tracer profiles and compute total columns above a given station from GEOS-Chem outputs

This notebook allows to extract, from GEOS-Chem outputs, profiles of given chemical species above a station and then calculate the total columns. The purpose is to compare these extracted profiles with the profiles measured above a given station.

A proper comparison should account for the spatial domains of both model outputs and observations, which would require regridding operations. Since we want to compare partial and/or total columns, it is important that the used regridding scheme is conservative (both locally and globally over the entire vertical profile) so that the total mass of the tracer is preserved.

Issues

  • Observations made by sun tracking at ground stations have a time-dependent spatial domain orientation and observed profiles are generally not vertical.

    • A fixed vertical grid is often assumed, though (using elevation/altitude coordinates) ;
    • The horizontal extent of the spatial domain is more hard to define.
  • GEOS-Chem uses vertical grids (GEOS5) defined by hybrid coordinates. Elevation coordinates are time-dependent and are unknown unless we provide external data (i.e., elevation of the base levels of the GEOS-Chem vertical grids).

  • The overall extent of the model's vertical grid may differ from the extent of the vertical grid used for the observations. This would lead to undefined values if the extent of the latter grid is greater than the extent of the model's grid.

Strategy

  • Model outputs (source grid) are regridded onto an observation-compliant, destination grid.

    • The vertical destination grid corresponds to the grid defined for the observations at the station. Time-dependent elevation coordinates are first calculated for the model ouputs - using grid-box heights data and providing topography data regridded onto the GEOS-Chem horizontal grid - before conservative regridding.
    • If we assume that the horizontal coverage of the spatial domain of the observation data is small compared to the resolution of the model's horizontal grid, we can resonably rely on a nearest-neighbour interpolation scheme for the horizontal component and perform vertical regridding only. If we have a good approximation of the observations horizontal coverage (on average), a more accurate method would be to define a 3D destination grid and perform conservative regridding onto this 3D grid. Here, we perform nearest-neighbour interpolation and vertical regridding, which is a particular case of 3D regridding (see below).
  • In a conservative 3D regridding scheme, interpolation weights would be based on the true volumes of overlapping grid cells (see below). For vertical regridding, we can use only the height of the grid cells.

  • Regridded fields (tracer mixing-ratio) may have undefined values, for example for cells of the destination grid that don't overlap with the model source grid. For grid-cells that partially overlap the model grid, we apply a "mask tolerance", i.e., a relative overlapping volume threshold below which the value of the grid-cell will be set as undefined. This may introduce conservation errors, but since partially overlapping cells is likely to occur only at the top level of the model vertical grid, these errors can be neglected for species that usually have a low mixing-ratio at that level.

Notes

  • The units of carbon tracers in GEOS-Chem outputs are ppbC. These are converted to ppbv just after data loading.

1. Imports / Dependencies


In [1]:
%matplotlib inline

import os
import string

import numpy as np
import pandas as pd
import plotly
import matplotlib.pyplot as plt

import iris
import iris.pandas as ipandas
import iris.quickplot as iqplot

import pygchem.grid as gcgrid

2. Inputs

Warning: Beware of specified output directory and output filenames. Any existing file will be overwritten !!


In [2]:
# ### INPUT FILES (GEOS-Chem outputs) ###
in_dir = "/home/mahieu/geos.runs/run_2x2.5dc/ts_files/"
                                        # input main directory, which should contain GEOS-Chem ouput datafields.
in_files = ["ts.joch.200401*",]      
                                        # a list of one or several GEOS-Chem datafields file(s).
                                        #
                                        #   Each list item can be 
                                        #   (1) a the name of a file present in `in_dir` or 
                                        #   (2) an absolute path to a file or
                                        #   (3) any file-matching pattern using de wildcard character. 
                                        #
                                        #   Mixing CTM outputs and ND49 outputs (time series) may work, but 
                                        #   datafields must not overlap in time.
                                        #   All datafields contained in the files must use the same horizontal
                                        #   grid (or a subset of this grid)!

                      
# ### OUTPUT FILES ###
out_dir = "/home/bovy/temp/"      
                                        # path to save output files where extracted data will be written
out_profiles_basename = "*_profiles_2004_01"    
                                        # basename of output file for profiles
                                        #   (any wildcard "*" will be replaced by `station_name`)
out_columns_basename = "*_columns_2004_01"      
                                        # basename of output file for columns
out_format = "xlsx"                     # format of output file ("csv", "hdf5", "xls", "xlsx")


# ### TRACERS AND DIAGNOSTICS ###                                        
tracers = ["PAN", "CO", "ACET", "C3H8", "CH2O", "C2H6", "NH3"]  
                                        # a list of tracers/diagnostics for which profiles and columns
                                        #   will be extracted/computed
categories = ["IJ-AVG-$",]                
                                        # a list of diagnostic categories (should be "IJ-AVG-$" for tracers)

other_fields = ['PSURF_PEDGE-$', 'BXHEIGHT_BXHGHT-$', 'AIRDEN_TIME-SER', 'N(AIR)_BXHGHT-$', 'TMPU_DAO-3D-$']
                                        # additional fields names to load (format: 'diagnostic_category')
                                        # 
                                        #   Must at least include datafields required for columns calculation,
                                        #   i.e., 'PSURF_PEDGE-$', 'BXHEIGHT_BXHGHT-$', 'AIRDEN_TIME-SER',
                                        #   'N(AIR)_BXHGHT-$', 'TMPU_DAO-3D-$'


# ### STATION ###
station_name = "JungfrauJoch"           # name of the station
station_lat = 46.54806                  # lat [degrees_north]
station_lon = 7.98389                   # lon [degress_east]
station_pressure = 659.3                # default, fixed air pressure at the station [hPa],
                                        #   used for columns calculation using pressures.
station_altitude = 3580.                # elevation a.s.l at the station [meters],
                                        #   used for columns calculation using altitudes.

station_vertical_grid_file = '/home/bovy/Grids/NDACC_vertical_Jungfraujoch_39L_2x2.5.nc'
                                        # path to the file (CF-netCDF) that contains the altitude values
                                        #   of the vertical grid on which data will be regridded.

# ### SUPPLY ADDITIONAL INFO AND DATA ###
grid_model_name = 'GEOS57_47L'          # grid model name (see below for common names)
                                        #   all GEOS-Chem ouputs specified above must use this grid
grid_model_resolution = 2.5, 2          # grid horizontal resolution (lon, lat) [degrees]
                                        #   all GEOS-Chem ouputs specified above must use this resolution
    
imin, imax = 76, 77                     # (min, max) grid indices of the 3D region box of interest
jmin, jmax = 69, 70                     #   i: longitude, j: latitude, l: vertical levels
lmin, lmax = 1, 47                      # 
                                        #   Must match the extent that was defined for any ND49
                                        #   diagnostic output specified in `in_files`.
                                        #   Must emcompass the position of the station (see below).
                                        #
                                        #   Used either to define the coordinates of ND49 outputs or to
                                        #   extract a subset from the global CTM datafields.

global_topography_datafile = '/home/bovy/Grids/dem_GEOS57_2x2.5_awm.nc'
                                        # path to the file of global topography needed for resampling
                                        #   the tracer profiles on a vertical grid with fixed altitude values.
                                        #   The global topography grid must be compatible with the
                                        #   GEOS-Chem grid used by the output GEOS-Chem files.
  • Display the list of netCDF or bpch files in in_dir (UNIX only)

In [3]:
%cd $in_dir
!ls *.{nc,bpch} -all -h


/mnt/raid_5_0/geos.out/mahieu_ulg/run_2x2.5dc/ts_files
ls: cannot access *.nc: No such file or directory
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200401310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200402290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200403310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 20 13:34 ts.joch.200404300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 00:10 ts.joch.200405010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 00:34 ts.joch.200405020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 00:58 ts.joch.200405030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 01:22 ts.joch.200405040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 01:43 ts.joch.200405050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 02:02 ts.joch.200405060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 02:20 ts.joch.200405070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 02:39 ts.joch.200405080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 02:57 ts.joch.200405090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 03:16 ts.joch.200405100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 03:34 ts.joch.200405110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 03:53 ts.joch.200405120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 04:12 ts.joch.200405130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 04:30 ts.joch.200405140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 04:49 ts.joch.200405150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 05:08 ts.joch.200405160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 05:26 ts.joch.200405170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 05:44 ts.joch.200405180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 06:03 ts.joch.200405190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 06:21 ts.joch.200405200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 06:40 ts.joch.200405210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 06:58 ts.joch.200405220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 07:16 ts.joch.200405230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 07:35 ts.joch.200405240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 07:53 ts.joch.200405250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 08:12 ts.joch.200405260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 08:35 ts.joch.200405270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 08:59 ts.joch.200405280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 09:23 ts.joch.200405290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 09:47 ts.joch.200405300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 10:12 ts.joch.200405310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 10:36 ts.joch.200406010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 11:00 ts.joch.200406020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 11:24 ts.joch.200406030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 11:49 ts.joch.200406040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 12:13 ts.joch.200406050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 12:37 ts.joch.200406060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 13:01 ts.joch.200406070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 13:26 ts.joch.200406080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 13:50 ts.joch.200406090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 14:14 ts.joch.200406100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 14:38 ts.joch.200406110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 15:02 ts.joch.200406120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 15:26 ts.joch.200406130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 15:51 ts.joch.200406140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 16:15 ts.joch.200406150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 16:39 ts.joch.200406160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 17:03 ts.joch.200406170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 17:27 ts.joch.200406180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 17:52 ts.joch.200406190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 18:16 ts.joch.200406200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 18:35 ts.joch.200406210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 18:54 ts.joch.200406220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 19:13 ts.joch.200406230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 19:31 ts.joch.200406240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 19:50 ts.joch.200406250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 20:09 ts.joch.200406260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 20:27 ts.joch.200406270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 20:46 ts.joch.200406280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 21:05 ts.joch.200406290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 21:23 ts.joch.200406300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 21:48 ts.joch.200407010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 22:13 ts.joch.200407020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 22:41 ts.joch.200407030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 23:09 ts.joch.200407040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  3 23:38 ts.joch.200407050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 00:06 ts.joch.200407060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 00:33 ts.joch.200407070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 01:02 ts.joch.200407080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 01:30 ts.joch.200407090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 01:58 ts.joch.200407100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 02:26 ts.joch.200407110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 02:54 ts.joch.200407120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 03:22 ts.joch.200407130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 03:50 ts.joch.200407140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 04:18 ts.joch.200407150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 04:46 ts.joch.200407160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 05:14 ts.joch.200407170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 05:42 ts.joch.200407180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 06:10 ts.joch.200407190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 06:38 ts.joch.200407200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 07:06 ts.joch.200407210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 07:35 ts.joch.200407220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 08:03 ts.joch.200407230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 08:31 ts.joch.200407240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 08:59 ts.joch.200407250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 09:26 ts.joch.200407260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 09:53 ts.joch.200407270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 10:21 ts.joch.200407280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 10:49 ts.joch.200407290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 11:16 ts.joch.200407300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 11:44 ts.joch.200407310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 12:12 ts.joch.200408010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 12:40 ts.joch.200408020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 13:08 ts.joch.200408030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 13:35 ts.joch.200408040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 14:04 ts.joch.200408050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 14:32 ts.joch.200408060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 14:59 ts.joch.200408070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 15:27 ts.joch.200408080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 15:55 ts.joch.200408090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 16:23 ts.joch.200408100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 16:51 ts.joch.200408110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 17:19 ts.joch.200408120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 17:47 ts.joch.200408130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 18:15 ts.joch.200408140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 18:42 ts.joch.200408150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 19:10 ts.joch.200408160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 19:38 ts.joch.200408170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 20:06 ts.joch.200408180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 20:34 ts.joch.200408190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 20:58 ts.joch.200408200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 21:23 ts.joch.200408210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 21:48 ts.joch.200408220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 22:12 ts.joch.200408230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 22:36 ts.joch.200408240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 23:00 ts.joch.200408250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 23:24 ts.joch.200408260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  4 23:52 ts.joch.200408270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 00:20 ts.joch.200408280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 00:48 ts.joch.200408290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 01:17 ts.joch.200408300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 01:45 ts.joch.200408310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 02:13 ts.joch.200409010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 02:39 ts.joch.200409020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 03:06 ts.joch.200409030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 03:33 ts.joch.200409040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 03:59 ts.joch.200409050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 04:26 ts.joch.200409060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 04:53 ts.joch.200409070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 05:20 ts.joch.200409080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 05:46 ts.joch.200409090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 06:13 ts.joch.200409100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 06:39 ts.joch.200409110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 07:06 ts.joch.200409120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 07:33 ts.joch.200409130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 07:59 ts.joch.200409140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 08:26 ts.joch.200409150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 08:53 ts.joch.200409160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 09:19 ts.joch.200409170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 09:46 ts.joch.200409180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 10:12 ts.joch.200409190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 10:41 ts.joch.200409200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 11:09 ts.joch.200409210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 11:38 ts.joch.200409220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 12:06 ts.joch.200409230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 12:34 ts.joch.200409240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 13:02 ts.joch.200409250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 13:31 ts.joch.200409260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 13:59 ts.joch.200409270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 14:27 ts.joch.200409280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 14:56 ts.joch.200409290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 15:24 ts.joch.200409300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 15:53 ts.joch.200410010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 16:22 ts.joch.200410020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 16:50 ts.joch.200410030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 17:18 ts.joch.200410040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 17:47 ts.joch.200410050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 18:15 ts.joch.200410060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 18:43 ts.joch.200410070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 19:12 ts.joch.200410080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 19:40 ts.joch.200410090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 20:07 ts.joch.200410100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 20:36 ts.joch.200410110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 21:04 ts.joch.200410120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 21:32 ts.joch.200410130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 21:59 ts.joch.200410140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 22:21 ts.joch.200410150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 22:43 ts.joch.200410160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 23:05 ts.joch.200410170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 23:27 ts.joch.200410180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  5 23:49 ts.joch.200410190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 00:16 ts.joch.200410200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 00:42 ts.joch.200410210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 01:09 ts.joch.200410220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 01:35 ts.joch.200410230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 02:02 ts.joch.200410240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 02:28 ts.joch.200410250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 02:54 ts.joch.200410260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 03:21 ts.joch.200410270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 03:47 ts.joch.200410280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 04:14 ts.joch.200410290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 04:41 ts.joch.200410300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 05:07 ts.joch.200410310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 05:32 ts.joch.200411010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 05:57 ts.joch.200411020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 06:21 ts.joch.200411030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 06:45 ts.joch.200411040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 07:09 ts.joch.200411050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 07:34 ts.joch.200411060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 07:58 ts.joch.200411070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 08:22 ts.joch.200411080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 08:46 ts.joch.200411090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 09:10 ts.joch.200411100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 09:34 ts.joch.200411110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 09:58 ts.joch.200411120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 10:21 ts.joch.200411130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 10:46 ts.joch.200411140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 11:11 ts.joch.200411150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 11:35 ts.joch.200411160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 12:00 ts.joch.200411170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 12:25 ts.joch.200411180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 12:50 ts.joch.200411190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 13:14 ts.joch.200411200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 13:39 ts.joch.200411210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 14:04 ts.joch.200411220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 14:26 ts.joch.200411230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 14:45 ts.joch.200411240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 15:03 ts.joch.200411250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 15:22 ts.joch.200411260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 15:40 ts.joch.200411270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 16:03 ts.joch.200411280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 16:27 ts.joch.200411290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 16:51 ts.joch.200411300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 17:16 ts.joch.200412010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 17:41 ts.joch.200412020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 18:05 ts.joch.200412030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 18:29 ts.joch.200412040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 18:54 ts.joch.200412050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 19:18 ts.joch.200412060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 19:42 ts.joch.200412070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 20:07 ts.joch.200412080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 20:31 ts.joch.200412090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 20:55 ts.joch.200412100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 21:20 ts.joch.200412110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 21:44 ts.joch.200412120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 22:08 ts.joch.200412130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 22:32 ts.joch.200412140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 22:58 ts.joch.200412150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 23:22 ts.joch.200412160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  6 23:47 ts.joch.200412170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 00:11 ts.joch.200412180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 00:36 ts.joch.200412190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 01:00 ts.joch.200412200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 01:24 ts.joch.200412210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 01:49 ts.joch.200412220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 02:13 ts.joch.200412230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 02:33 ts.joch.200412240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 02:51 ts.joch.200412250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 03:10 ts.joch.200412260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 03:29 ts.joch.200412270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 03:47 ts.joch.200412280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 04:07 ts.joch.200412290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 04:26 ts.joch.200412300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb  7 04:45 ts.joch.200412310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200501310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200502280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200503310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200504300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200505310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200506300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200507310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200508310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200509300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200510310300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200511300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512010300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512020300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512030300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512040300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512050300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512060300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512070300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512080300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512090300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512100300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512110300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512120300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512130300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512140300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512150300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512160300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512170300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512180300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512190300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512200300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512210300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512220300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512230300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512240300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512250300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512260300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512270300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512280300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512290300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512300300.bpch
-rw-r--r-- 1 mahieu mahieu 115K Feb 27 15:29 ts.joch.200512310300.bpch
  • Display the names of the supported GEOS-Chem grid models

In [4]:
gcgrid.CTMGrid.models


Out[4]:
['MERRA_NATIVE',
 'GEOS5_REDUCED',
 'GENERIC',
 'GEOS5_NATIVE',
 'GEOS_STRAT_46L',
 'GEOS4_30L',
 'GEOS',
 'GEOS_STRAT',
 'MERRA_47L',
 'GEOS5',
 'GEOS4',
 'GEOS3',
 'GEOS2',
 'GEOS1',
 'GEOS57_REDUCED',
 'GEOS5_47L',
 'GEOS57',
 'GEOS2_70L',
 'FVDAS',
 'MERRA',
 'GEOS57_47L',
 'GEOS3_30L',
 'GEOS3_REDUCED',
 'GEOS4_REDUCED',
 'MERRA_REDUCED',
 'GEOS57_NATIVE']
  • Get absolute paths from filenames

In [5]:
in_abspaths = [os.path.join(in_dir, fname) if not os.path.isabs(fname) else fname
               for fname in in_files]

3. Implementation of vertical regridding

The vertical regridding scheme implemented here is a simplified, 1-dimensional version of the scheme described below.

Conservative regridding scheme (3D spherical grids)

A regridding scheme can be written as follows:

$$\Phi_{dj} = \sum_i p_{ij} \Phi_{si}$$

where $\Phi$ is the field to be regridded (extensive quantity), $\Phi_{si}$ is the constant value of the field of in the $i^{th}$ cell of the source grid, $\Phi_{dj}$ is the constant value of the field of in the $j^{th}$ cell of the destination grid, and $p_{ij}$ are the coefficients of the sparse interpolation matrix.

For the conservative regridding scheme used here, $p_{ij}$ is given by:

$$p_{ij} = \frac{V_{si} \cap V_{dj}}{V_{si}}$$

where $V_{si}$ and $V_{dj}$ are the volumes of the $i^{th}$ cell of the source grid and the $j^{th}$ cell of the destination grid, repectively.

Note that the expression above is only valid for extensive quantities, i.e., quantities whose value changes with the grid cell size (such as number of molecules). For intensive quantities (i.e., grid-size independent quantities such as mixing-ratio) we have:

$$\Phi_{si} = F_{si} V_{si}$$$$F_{dj} = \sum_i f_{ij} F_{si}$$$$p_{ij} = f_{ij} \frac{V_{dj}}{V_{si}} \Leftrightarrow f_{ij} = \frac{V_{si} \cap V_{dj}}{V_{dj}}$$

where $F$ is the field to be regridded (intensive quantity, counterpart to $\Phi$).

Since the GEOS-Chem model's grid is defined by a geographic spherical coordinate system, and since we assume that the observational grid has the same system, the volumes of the grid cells can be calculated exactly from their corner coodinates. The true volume $V^T_i$ of a grid cell $i$ is given by:

$$V^T_i = \int_{\theta_{i,0}}^{\theta_{i,1}}\int_{\phi_{i,0}}^{\phi_{i,1}}\int_{\rho_{i,0}}^{\rho_{i,1}} \rho^{2} \sin{\left (\phi \right )}\, d\rho\, d\phi\, d\theta = \frac{1}{3} \left(\theta_{i,0} - \theta_{i,1}\right) \left(\rho_{i,0}^{3} \cos{\left (\phi_{i,0} \right )} - \rho_{i,0}^{3} \cos{\left (\phi_{i,1} \right )} - \rho_{i,1}^{3} \cos{\left (\phi_{i,0} \right )} + \rho_{i,1}^{3} \cos{\left (\phi_{i,1} \right )}\right)$$

where ($\phi_{i,0}$, $\phi_{i,1}$), ($\theta_{i,0}$, $\theta_{i,1}$) and ($\rho_{i,0}$, $\rho_{i,1}$) are latitude, longitude and elevation (+ earth radius) bounds of the grid cell $i$, respectively.

Notes about the implementation

  • Although ESMF (Earth System Modelling Framework) provides tools for conservative regridding, this notebook uses its own regridding implementation for the following reasons:
    • It seems that ESMF doesn't support conservative regridding on spherical 3D grids nor 1D vertical grids (it supports only 2D spherical grids or 2D/3D cartesian grids).
    • Implementation is simple here (vertical regridding only). Computational efficiency is not a priority (although it is quite fast as it uses numpy).
  • Regridding functions

In [6]:
def _compute_exchange_vertical(src_z_coord, dst_z_coord):
    """
    Compute the exchange vertical grid needed for
    vertical regridding.
    
    The cells of the exchange grid are defined by the
    intersections of the cells of the source grid and the
    the cells of the destination grid.
    
    Returns a :class:`iris.coords.DimCoord` object.
    
    """
    temp = np.concatenate((src_z_coord.bounds,
                           dst_z_coord.bounds))
    temp = np.sort(temp, kind='mergesort', axis=None)
    temp = np.unique(temp)
    
    exchange_z_bounds = np.column_stack((temp[:-1], temp[1:]))
    exchange_z_points = (exchange_z_bounds[:, 0] + exchange_z_bounds[:, 1]) / 2.
    
    exchange_z_coord = iris.coords.DimCoord(exchange_z_points,
                                            bounds=exchange_z_bounds,
                                            standard_name=src_z_coord.standard_name,
                                            units=src_z_coord.units)
    return exchange_z_coord


def _map_exchange_vertical(src_or_dst_data,
                           src_or_dst_z_coord,
                           exchange_z_coord):
    """
    Map on the exchange vertical grid data values given
    on the source (or the destination) vertical grid.
    
    Returns only the data (numpy array).
    
    If a cell of the exchange grid doesn't overlap any
    of the source (destination grid), value of that cell
    is set to `np.nan`.
    
    """
    points = exchange_z_coord.points
    bounds = src_or_dst_z_coord.bounds

    # 2-d boolean array (rows are exchange cells
    # and cols are source/destination grid cells)
    # True if exchange cell match with src or dst cell
    is_in_cell = ((points[:,np.newaxis] > bounds[:,0]) &
                  (points[:,np.newaxis] < bounds[:,1]))

    # a cell of the exchange should have only one
    # corresponding cell in the source/destination grid
    if is_in_cell.sum(axis=1).max() > 1:
        raise ValueError("source/destination grid is not "
                         "compatible with the exchange grid")

    # indices map between exchange grid (1st array)
    # and source or destination grid (2st array)
    map_indices = np.nonzero(is_in_cell)

    # assign data
    map_data = np.empty_like(points) * np.nan
    map_data[map_indices[0]] = src_or_dst_data[map_indices[1]]
    
    return map_data


def regrid_conservative_vertical(src_cube, dst_grid_cube,
                                 src_data_type='intensive',
                                 z_coord_name='altitude',
                                 overlap_tol=0.95):
    """
    Conservative regridding of a vertical profile.
    
    Parameters
    ----------
    src_cube : :class:`iris.cube.Cube`
        the original profile to be regridded
    dst_grid_cube : :class:`iris.cube.Cube`
        defines the destination grid
    src_data_type : ('intensive', 'extensive')
        specifies whether the data of `src_cube`
        is an intensive field (i.e., quantities
        whose value changes with the grid cell size)
        or an extensive field (i.e., grid-size
        independent quantities).
    z_coord_name : string
        name of the vertical coordinate to use
        for regridding (must be present in both
        `src_cube` and `dst_grid_cube`).
    overlap_top : float
        cell overlap tolerance, i.e., a threshold
        of - relative [0, 1] - overlapping height
        between a cell of the destination grid
        and cells of the source grid, under which
        the value of the destination cell is set
        to undefined.    
    
    Returns
    -------
    A new :class:`iris.cube.Cube` object
        a copy of `dst_grid_cube` with
        the regridded data of `src_cube`.
        Auxilliary / scalar coordinates and
        attributes of `src_cube` will be copied.
    
    Notes
    -----
    Both `src_cube` and `dst_grid_cube` must be
    1-dimensional and must have compatible
    vertical coordinates, i.e., 1-dimensional,
    with the same name `z_coord_name`, the same
    coordinate system, the same units
    and contiguous bounds.
    
    
    """
    # get or compute vertical coordinates of the source, destination
    # and exchange grids
    # TODO: check if vertical coordinates of src_cube and dst_cube
    # exist, are 1-dimensional and are compatibles (units,
    # coord system, contiguous bounds)
    src_z_coord = src_cube.coord(name=z_coord_name)
    dst_z_coord = dst_grid_cube.coord(name=z_coord_name)
    
    exchange_z_coord = _compute_exchange_vertical(src_z_coord,
                                                  dst_z_coord)
    
    # compute cell heights of each grid
    src_heights = src_z_coord.bounds[:,1] - src_z_coord.bounds[:,0]
    dst_heights = dst_z_coord.bounds[:,1] - dst_z_coord.bounds[:,0]
    exchange_heights = exchange_z_coord.bounds[:,1] - exchange_z_coord.bounds[:,0]
    
    # generate arbitray levels for the destination grid
    # (used for further aggregation - summing - of the exchange grid
    # cells onto the destination grid
    dst_levels = np.arange(1, dst_z_coord.points.size + 1)
    
    # map source data values, source heights and destination heights
    # (and destination levels) on the exchange grid
    src_heights_mapped = _map_exchange_vertical(src_heights,
                                                src_z_coord,
                                                exchange_z_coord)
    dst_heights_mapped = _map_exchange_vertical(dst_heights,
                                                dst_z_coord,
                                                exchange_z_coord)
    dst_levels_mapped = _map_exchange_vertical(dst_levels,
                                               dst_z_coord,
                                               exchange_z_coord)
    src_data_mapped = _map_exchange_vertical(src_cube.data,
                                             src_z_coord,
                                             exchange_z_coord)
    
    # compute interpolation weights and data values
    # on the exchange grid
    if src_data_type == 'intensive':
        exchange_iweights = exchange_heights / dst_heights_mapped
    elif src_data_type == 'extensive':
        exchange_iweights = exchange_heights / src_heights_mapped
    else:
        raise ValueError("invalid source data type: {}"
                         .format(src_data_type))
    
    exchange_data = exchange_iweights * src_data_mapped
    
    # finally get data values on the destination grid
    # (sum data of overlapping cells of the exchange grid
    # and apply the overlap tolerance)
    levels_mask = dst_levels[:,np.newaxis] == dst_levels_mapped[np.newaxis,:]
    
    dst_data = np.nansum((exchange_data[np.newaxis,:] * levels_mask),
                         axis=1)
    
    valid_heights = np.where(np.isnan(exchange_data), np.nan, exchange_heights)
    overlap_heights = np.nansum((valid_heights[np.newaxis,:] * levels_mask),
                                axis=1)
    overlap_heights_relative = overlap_heights / dst_heights
    nan_indices = np.nonzero(overlap_heights_relative < overlap_tol)
    dst_data[nan_indices] = np.nan
    
    # construct the cube of the regridded field
    # copy all scalar coordinates from the source cube
    dst_cube = dst_grid_cube.copy()
    dst_cube.data = np.array(dst_data)
    dst_cube.var_name = "_".join([src_cube.name(), "regridded"])
    dst_cube.long_name = "_".join([src_cube.name(), "regridded"])
    dst_cube.attributes.update(src_cube.attributes)
    dst_cube.attributes.update({'src_cube' : src_cube.name(),
                                'grid_cube' : dst_cube.name(),
                                'regrid_method' : 'first-order conservative'})
    dst_cube.units = src_cube.units
    
    for c in src_cube.coords():
        if c.points.size == 1 and not dst_cube.coords(coord=c):
            dst_cube.add_aux_coord(c)
    
    return dst_cube
  • Testing the regridding implementation 1: plot and show error using a fake profile

In [7]:
bnds = np.column_stack((np.arange(0., 1002., 2)[:-1],
                        np.arange(0., 1002., 2)[1:]))
points = np.arange(1., 1000., 2)
src_alt_coord = iris.coords.DimCoord(points,
                                     bounds=bnds,
                                     standard_name='altitude',
                                     units='m')
src_cube = iris.cube.Cube(np.ones(points.size) * points**2,
                          dim_coords_and_dims=[(src_alt_coord, 0)])

bnds = np.column_stack((np.arange(0., 1002., 8.)[:-1],
                        np.arange(0., 1002., 8.)[1:]))
points = np.arange(2., 1000., 8.)
dst_alt_coord = iris.coords.DimCoord(points,
                                     bounds=bnds,
                                     standard_name='altitude',
                                     units='m')
dst_grid_cube = iris.cube.Cube(np.empty(points.size),
                               dim_coords_and_dims=[(dst_alt_coord, 0)])

result = regrid_conservative_vertical(src_cube, dst_grid_cube)

iqplot.plot(src_cube, src_cube.coord('altitude'))
iqplot.plot(result, result.coord('altitude'), '-+')

# check total mass conservation (should return around 1.0 with a very small error)
print (result.data[:] * 8.).sum() / (src_cube.data[:] * 2.).sum()


1.0
  • Testing the regridding implementation 2: computational efficiency

In [8]:
%timeit regrid_conservative_vertical(src_cube, dst_grid_cube)


10 loops, best of 3: 15.9 ms per loop

4. Load data

  • Preprocessing and callback functions

In [9]:
def gcgrid_2_coords(model_name, model_resolution,
                    region_box=None):
    """
    Get the X,Y,Z coordinates of the GEOS-Chem grid given
    by `model_name` and `model_resolution`.
    
    Parameters
    ----------
    model_name : string
        name of a GEOS-Chem grid model supported by pygchem
    model_resolution : (float, float)
        horizontal grid resolution (lon, lat), in degrees
    region_box: (int, int, int, int, int, int) or None
        grid indices of the 3D region box of interest
        (imin, imax, jmin, jmax, lmin, lmax).
        i: longitude, j: latitude, l: vertical levels
    
    Returns
    -------
    i_coord, j_coord, l_coord : :class:`iris.coords.DimCoord`
        Iris dimensional coordinates objects
        (longitude, latitude, model_level_number)
    
    """
    g = gcgrid.CTMGrid.from_model(model_name,
                                  resolution=model_resolution)
    
    lon_points, lat_points = g.lonlat_centers
    
    elon, elat = g.lonlat_edges
    lon_bounds = np.column_stack((elon[0:-1], elon[1:]))
    lat_bounds = np.column_stack((elat[0:-1], elat[1:]))
    
    levels = np.arange(1, g.Nlayers + 1)
    
    if region_box is not None:
        imin, imax, jmin, jmax, lmin, lmax = region_box
        
        lon_points = lon_points[imin-1:imax]
        lon_bounds = lon_bounds[imin-1:imax]
        
        lat_points = lat_points[jmin-1:jmax]
        lat_bounds = lat_bounds[jmin-1:jmax]
        
        levels = np.arange(lmin, lmax + 1)
    
    spherical_geocs = iris.coord_systems.GeogCS(
        iris.analysis.cartography.DEFAULT_SPHERICAL_EARTH_RADIUS
    )
    
    i_coord = iris.coords.DimCoord(lon_points,
                       bounds=lon_bounds,
                       standard_name="longitude",
                       var_name="longitude",
                       units="degrees_east",
                       coord_system=spherical_geocs)
    
    j_coord = iris.coords.DimCoord(lat_points,
                       bounds=lat_bounds,
                       standard_name="latitude",
                       var_name="latitude",
                       units="degrees_north",
                       coord_system=spherical_geocs)
    
    l_coord = iris.coords.DimCoord(levels,
                       standard_name="model_level_number",
                       var_name="model_level_number",
                       units="1")
    
    return i_coord, j_coord, l_coord   
    

def fix_nd49_pressure(pedges_cube):
    """
    GEOS-Chem Bug ?? PSURF_PEDGE-$ is missing one vertical level (e.g., using
    the GEOS5_47L model, it has 47 levels but should have 48 levels).
    
    Workaround: Add one level on top of the grid and assign low, arbitrary
    pressure values at that level.
    
    `pedges` must have 4-dimensions
    (time, longitude, latitude, model_level_number)
    
    Returns a new cube with one additional top level.
    
    Procedure:
    - extract the top level of the pressure cube (e.g., level 47 for GEOS5_47L)
    - duplicate the cube
    - replace the vertical coordinate value for the duplicated cube
      (e.g., assign 48 for GEOS5_47L)
    - assign new, arbitrary low pressures to the duplicated cube
      (e.g., press_at_level_48 = 0.1 * pressure_at_level_47)
    - re-assemble the cubes - split/slices and re-merge - to obtain a
      new cube with 48 levels
    """
    pedges_cube_slices = list(pedges_cube.slices(['time',
                                                  'longitude',
                                                  'latitude']))
    pedges_cube_top = pedges_cube_slices[-1]
    
    pedges_cube_overtop = pedges_cube_top.copy()
    
    l_coord = iris.coords.DimCoord(np.array([48]),
                                   standard_name='model_level_number')
    pedges_cube_overtop.replace_coord(l_coord)
    
    low_pressures = pedges_cube_top.data * 0.1
    pedges_cube_overtop.data = low_pressures
    
    pedges_cube_slices.append(pedges_cube_overtop)
    # works only with both concatenate and merge
    # (iris issue ? normally only merge is needed!)
    pedges_cube_new = iris.cube.CubeList(pedges_cube_slices).concatenate().merge()[0]
    pedges_cube_new.transpose(new_order=[1, 2, 3, 0])
    
    return pedges_cube_new


def assign_coord_nd49_or_subset_ctm(cube, field, filename):
    """
    A callback for GEOS-Chem datafields loading with Iris.
    
    If `cube` is loaded from a ND49 diagnostic file (i.e., some
    undefined dimension coordinates), generate the coordinates values
    from the grid indices of the 3D region box.
    (Else) If `cube` is loaded from a CTM file, extract a subset
    that correspond to the region box.
    """
    global i_coord, j_coord, l_coord
    
    cube_is_ctm = True
    
    if not cube.coords('longitude'):
        cube.add_dim_coord(i_coord, 0)
        cube_is_ctm = False
    if not cube.coords('latitude'):
        cube.add_dim_coord(j_coord, 1)
        cube_is_ctm = False
    if not cube.coords('model_level_number'):
        cube.add_dim_coord(l_coord, 2)
    
    if cube_is_ctm:
        lonlat_subset = iris.Constraint(longitude=i_coord.points,
                                        latitude=j_coord.points)
        cube = cube.extract(lonlat_subset)


def ppbC_2_ppbv(cube):
    """
    Convert to ppbv units for hydrocarbon tracers that
    have ppbC units.
    
    ppbC = parts per billion carbon
         = ppbv * number of carbon atoms in the tracer molecule
    """
    is_ppbC = cube.attributes.get('no_udunits2') == 'ppbC'
    is_hydrocarbon = cube.attributes.get('hydrocarbon')
    
    if is_hydrocarbon and is_ppbC:
        carbon_weight = cube.attributes.get('carbon_weight')
        cube.data = cube.data / carbon_weight
        cube.units = 'ppbv'
  • Import datafields as iris cubes (fields are automatically concatenated over time)

In [10]:
station_region_indices = (imin, imax, jmin, jmax, lmin, lmax)
i_coord, j_coord, l_coord = gcgrid_2_coords(grid_model_name,
                                            grid_model_resolution,
                                            region_box=station_region_indices)

tracers2load = iris.AttributeConstraint(category=lambda category: category in categories,
                                        name=lambda name: name in tracers)

all_cubes = iris.load(in_abspaths,
                      [tracers2load] + other_fields,
                      callback=assign_coord_nd49_or_subset_ctm)

tracer_cubes = all_cubes.extract(tracers2load)
other_cubes = all_cubes.extract(other_fields, strict=False)

# datafields required for columns and profiles calculation
pedges_cube = other_cubes.extract_strict('PSURF_PEDGE-$')
box_height_cube = other_cubes.extract_strict('BXHEIGHT_BXHGHT-$')
try:
    n_air_cube = other_cubes.extract_strict('N(AIR)_BXHGHT-$')
except iris.exceptions.ConstraintMismatchError:
    # ND49: air density datafields have a different name
    n_air_cube = other_cubes.extract_strict('AIRDEN_TIME-SER')
    # ND49: fix missing pressure level
    pedges_cube = fix_nd49_pressure(pedges_cube)

# convert units for hydrocarbon tracers 
for cube in tracer_cubes:
    ppbC_2_ppbv(cube)


/home/python/PythonEnvs/pygchem_py27_0/lib/python2.7/site-packages/Iris-1.6.2_dev-py2.7.egg/iris/fileformats/bpch_load_rules.py:95: UserWarning: Cube's horizontal grid doesn't correspond to the CTM horizontal grid. Coordinates not specified.
  warnings.warn("Cube's horizontal grid doesn't correspond to "
/home/python/PythonEnvs/pygchem_py27_0/lib/python2.7/site-packages/Iris-1.6.2_dev-py2.7.egg/iris/fileformats/bpch_load_rules.py:66: UserWarning: Unhandled units 'ppbC' recorded in cube attributes.
  format(units))
/home/python/PythonEnvs/pygchem_py27_0/lib/python2.7/site-packages/Iris-1.6.2_dev-py2.7.egg/iris/fileformats/bpch_load_rules.py:66: UserWarning: Unhandled units 'molec/cm3' recorded in cube attributes.
  format(units))
  • Print info about imported datafields (check dimensions and coordinates)

In [11]:
print tracer_cubes
print ''.join(np.repeat('-', 30))
print iris.cube.CubeList([pedges_cube, box_height_cube, n_air_cube])


0: PAN_IJ-AVG-$ / (ppbv)               (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
1: CO_IJ-AVG-$ / (ppbv)                (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
2: ACET_IJ-AVG-$ / (ppbv)              (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
3: C3H8_IJ-AVG-$ / (ppbv)              (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
4: CH2O_IJ-AVG-$ / (ppbv)              (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
5: C2H6_IJ-AVG-$ / (ppbv)              (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
6: NH3_IJ-AVG-$ / (ppbv)               (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
------------------------------
0: PSURF_PEDGE-$ / (hPa)               (time: 248; longitude: 2; latitude: 2; model_level_number: 48)
1: BXHEIGHT_BXHGHT-$ / (m)             (time: 248; longitude: 2; latitude: 2; model_level_number: 47)
2: AIRDEN_TIME-SER / (count/cm3)       (time: 248; longitude: 2; latitude: 2; model_level_number: 47)

5. Extract and regrid profiles above the station

  • Extract profiles above the station using nearest neighbours, i.e., find the GEOS-Chem horizontal grid box that the closest to the station horizontal position and extract all vertical layers at that grid-box

In [12]:
extract_method = iris.analysis.interpolate.extract_nearest_neighbour

station_coords = [('latitude', station_lat), ('longitude', station_lon)]

tracer_profiles = iris.cube.CubeList(extract_method(cube, station_coords)
                                     for cube in tracer_cubes)

pedges_profile, box_height_profile, n_air_profile = [
    extract_method(cube, station_coords)
    for cube in [pedges_cube, box_height_cube, n_air_cube]
]

all_profiles = tracer_profiles + [pedges_profile, box_height_profile, n_air_profile]
  • Print info about extracted profiles, which should have scalar longitude and latitude coordinates

In [13]:
print all_profiles
print ''.join(np.repeat('-', 30))
print all_profiles[0]


0: PAN_IJ-AVG-$ / (ppbv)               (time: 248; model_level_number: 47)
1: CO_IJ-AVG-$ / (ppbv)                (time: 248; model_level_number: 47)
2: ACET_IJ-AVG-$ / (ppbv)              (time: 248; model_level_number: 47)
3: C3H8_IJ-AVG-$ / (ppbv)              (time: 248; model_level_number: 47)
4: CH2O_IJ-AVG-$ / (ppbv)              (time: 248; model_level_number: 47)
5: C2H6_IJ-AVG-$ / (ppbv)              (time: 248; model_level_number: 47)
6: NH3_IJ-AVG-$ / (ppbv)               (time: 248; model_level_number: 47)
7: PSURF_PEDGE-$ / (hPa)               (time: 248; model_level_number: 48)
8: BXHEIGHT_BXHGHT-$ / (m)             (time: 248; model_level_number: 47)
9: AIRDEN_TIME-SER / (count/cm3)       (time: 248; model_level_number: 47)
------------------------------
PAN_IJ-AVG-$                                 (time: 248; model_level_number: 47)
     Dimension coordinates:
          time                                    x                        -
          model_level_number                      -                        x
     Auxiliary coordinates:
          air_pressure                            -                        x
          altitude                                -                        x
          atmosphere_hybrid_height_coordinate     -                        x
     Scalar coordinates:
          latitude: 46.0 degrees_north, bound=(45.0, 47.0) degrees_north
          longitude: 7.5 degrees_east, bound=(6.25, 8.75) degrees_east
     CF Attributes:
          scale_factor: 1000000000.0
     Attributes:
          carbon_weight: 1
          category: IJ-AVG-$
          center180: True
          chemical: True
          full_name: PAN tracer
          halfpolar: True
          hydrocarbon: False
          index: 3
          modelname: GEOS5_47L
          molecular_weight: 0.121
          name: PAN
          number: 3
          resolution: (2.5, 2.0)
  • Functions used to compute altitude values from grid-box heights and topography

In [14]:
def set_dim_order(cube, coord_names):
    """
    Set the dimensions of `cube` in the order
    defined by `coord_names`, i.e., a list that must
    contain all of the cube's coordinate names.
    
    Change the order of the cube dimensions in-place.
    
    Warning: calling this method will trigger any
    deferred loading, causing the cube’s data array
    to be loaded into memory.
    """
    ordered_dims = [cube.coord_dims(cube.coord(cn))[0]
                    for cn in coord_names]
    cube.transpose(new_order=ordered_dims)


def get_dim_from_coord1d(cube, coord_name):
    """
    Get from `cube` the dimension of the
    1-dimensional coordinate specified by
    `coord_name` (string).
    
    Returns the dimension number of the coordinate.
    Returns None if the coordinate is not dimensional.
    
    Raises :err:`iris.exceptions.CoordinateMultiDimError`
    if the coordinate is not 1-dimensional.
    """
    c = cube.coord(coord_name)
    cdims = cube.coord_dims(c)
    
    if len(cdims) > 1:
        raise iris.exceptions.CoordinateMultiDimError(
            "'{}' coordinate must be 1-dimensional"
            .format(coord_name)
        )
    
    elif not len(cdims):
        return None

    return cdims[0]


def get_altitude_coord(gridbox_heights, topography):
    """
    Compute the altitude (elevation a.s.l) coordinate
    from grid box heights and topography.
    
    Parameters
    ----------
    gridbox_heights : :class:`iris.cube.Cube`
        a 1-d, 2-d, 3-d or 4-d cube.
        The cube must have at least 'longitude',
        'latitude' and 'model_level_number' coordinates.
        'longitude' and 'latitude' can be either
        1-dimensional or scalar.
        'model_level_number' must be 1-dimensional and
        should include all vertical levels.
    topography : :class:`iris.cube.Cube`
        a 2D cube, which must have 'longitude' and
        'latitude' dimension coordinates. `topography`
        must at least cover the horizontal extent of
        `gridbox_heights` and have a compatible horizontal
        grid (i.e., coordinates points and bounds must match).
    
    Returns
    -------
    a :class:`iris.AuxCoord` object
        An auxilliary coordinate that contains
        space and time-dependent altitude values for
        the points and bounds of each grid cell.
        The coordinate has the same dimensions and
        the same units than the `gridbox_heights` cube.
        The coordinate also contains attributes of
        the `topography` cube.
    
    Examples
    --------
    >>> ctm_cubes = iris.load('ctm.bpch')
    >>> box_heights = ctm.extract_strict('BXHEIGHT_BXHGHT-$')
    >>> nox_tracer = ctm.extract_strict('NOx_IJ-AVG-$')
    >>> global_topography = iris.load_cube('dem_GEOS57_2x2.5_awm.nc')
    >>> altitude_coord = get_altitude_coord(box_heights,
    ...                                     global_topography)
    >>> nox_tracer.add_aux_coord(altitude_coord,
                                 data_dims=range(0, nox_tracer.ndim))
    
    """
    
    # extract the region of topography that cooresponds to
    # the extent of gridbox_heights
    gbh_lat = gridbox_heights.coord('latitude').points
    gbh_lon = gridbox_heights.coord('longitude').points

    subset = iris.Constraint(latitude=gbh_lat,
                             longitude=gbh_lon)
    topography_subset = topography.extract(subset)
    
    # ensure same units for gridbox_heights and topography
    topography_subset.convert_units(gridbox_heights.units)

    # ensure proper array broadcasting when computing altitude values    
    topo_lon_coord = topography_subset.coord('longitude')
    topo_lat_coord = topography_subset.coord('latitude')
    topo_dim_coords = topography_subset.dim_coords
    
    if topography_subset.ndim == 0:
        base_level_altitude = topography_subset.data
    
    else:
        gbh_lon_dim = get_dim_from_coord1d(gridbox_heights,
                                           'longitude')
        gbh_lat_dim = get_dim_from_coord1d(gridbox_heights,
                                           'latitude')
        
        if (topo_lon_coord in topo_dim_coords
            and topo_lat_coord in topo_dim_coords):
            
            set_dim_order(topography_subset, ['longitude', 'latitude']) 
            dim_map = (gbh_lon_dim, gbh_lat_dim)
        
        elif topo_lon_coord in topo_dim_coords:
            dim_map = (gbh_lon_dim,)
        else:
            dim_map = (gbh_lat_dim,)
        
        base_level_altitude = iris.util.broadcast_to_shape(
            topography_subset.data.copy(),
            gridbox_heights.shape,
            dim_map)
    
    level_dim = get_dim_from_coord1d(gridbox_heights,
                                     'model_level_number')
    
    # calculate altitude points and bounds values
    altitude_ubnd = np.cumsum(gridbox_heights.data, axis=level_dim) + base_level_altitude
    altitude_lbnd = altitude_ubnd - gridbox_heights.data
    altitude_lbnd[..., 1:] = altitude_ubnd[..., :-1]   # force contiguous bounds
    altitude_points = (altitude_lbnd + altitude_ubnd) / 2.
    
    altitude_bounds = np.concatenate((altitude_lbnd[...,np.newaxis],
                                      altitude_ubnd[...,np.newaxis]),
                                     axis=-1)
    
    # create and return the iris coordinate object
    altitude_coord = iris.coords.AuxCoord(altitude_points,
                                          bounds=altitude_bounds,
                                          standard_name='altitude',
                                          units=gridbox_heights.units,
                                          attributes=topography.attributes.copy())
    
    return altitude_coord
  • Assign a new altitude auxilliary coordinate to each extracted tracer profile (+ 'n_air' profile)

In [15]:
global_topography = iris.load_cube(global_topography_datafile)

altitude_coord = get_altitude_coord(box_height_profile,
                                    global_topography)

for cube in tracer_profiles + [n_air_profile]:
    if cube.coords('air_pressure'):
        cube.remove_coord('air_pressure')
    if cube.coords('altitude'):
        cube.remove_coord('altitude')
    cube.add_aux_coord(altitude_coord,
                       data_dims=range(0, box_height_profile.ndim))
  • Perform regridding for all extracted tracer profiles (load the grid used for observations at the station and perform regridding for each time slice of the tracer profiles cubes before re-merging). regrid also 'n_air'.

In [16]:
station_profile = extract_method(iris.load_cube(station_vertical_grid_file),
                                 station_coords)

def regrid_profile(profile_cube, station_profile):
    """
    Vertical regridding of one profile
    (slicing over time, regrid the slices, and re-merge).
    
    """
    rprof_timeslices = []
    
    for prof_timeslice in profile_cube.slices('model_level_number'):
        rprof = regrid_conservative_vertical(prof_timeslice, station_profile)
        rprof_timeslices.append(rprof)
    
    return iris.cube.CubeList(rprof_timeslices).merge()[0]
    

regridded_tracer_profiles = iris.cube.CubeList([regrid_profile(p, station_profile)
                                                for p in tracer_profiles])

regridded_n_air_profile = regrid_profile(n_air_profile, station_profile)

regridded_all_profiles = regridded_tracer_profiles + [regridded_n_air_profile]
  • Print info about regridded profiles

In [17]:
print regridded_all_profiles
print ''.join(np.repeat('-', 30))
print regridded_n_air_profile


0: PAN_IJ-AVG-$_regridded / (ppbv)     (time: 248; model_level_number: 39)
1: CO_IJ-AVG-$_regridded / (ppbv)      (time: 248; model_level_number: 39)
2: ACET_IJ-AVG-$_regridded / (ppbv)    (time: 248; model_level_number: 39)
3: C3H8_IJ-AVG-$_regridded / (ppbv)    (time: 248; model_level_number: 39)
4: CH2O_IJ-AVG-$_regridded / (ppbv)    (time: 248; model_level_number: 39)
5: C2H6_IJ-AVG-$_regridded / (ppbv)    (time: 248; model_level_number: 39)
6: NH3_IJ-AVG-$_regridded / (ppbv)     (time: 248; model_level_number: 39)
7: AIRDEN_TIME-SER_regridded / (count/cm3) (time: 248; model_level_number: 39)
------------------------------
AIRDEN_TIME-SER_regridded / (count/cm3) (time: 248; model_level_number: 39)
     Dimension coordinates:
          time                               x                        -
          model_level_number                 -                        x
     Auxiliary coordinates:
          altitude                           -                        x
     Scalar coordinates:
          latitude: 46.0 degrees, bound=(45.0, 47.0) degrees
          longitude: 7.5 degrees, bound=(6.25, 8.75) degrees
     CF Attributes:

     Attributes:
          Conventions: CF-1.5
          carbon_weight: 1
          category: TIME-SER
          center180: True
          chemical: False
          full_name: Air density
          grid_cube: AIRDEN_TIME-SER_regridded
          halfpolar: True
          hydrocarbon: False
          index: 22
          modelname: GEOS5_47L
          molecular_weight: 0.0
          name: AIRDEN
          no_udunits2: molec/cm3
          number: 19022
          regrid_method: first-order conservative
          resolution: (2.5, 2.0)
          src_cube: AIRDEN_TIME-SER

6. Compute total columns above the station

  • Routine to compute total or partial columns from a cube (returns a cube).

In [18]:
def compute_tracer_columns(mixing_ratio, n_air, z_coord,
                           cell_heights=None, weights=None,
                           units='count/cm2'):
    """
    Compute tracer total columns.

    Parameters
    ----------
    mixing_ratio : :class:`iris.cube.Cube` object
        Tracer mixing ratio.
    n_air : :class:`iris.cube.Cube` object
        Number density of air.
    z_coord : string or :class:`iris.coords.Coord` object
        (Name of) the vertical levels coordinate.
    cell_heights : :class:`iris.cube.Cube` object or None
        Grid cell heights. Must be provided if `z_coord`
        can't be used to compute the height of each cell.
    weights : :class:`iris.cube.Cube` object
        vertical cell weights.
    units : string or :class:iris.unit.`Unit` object
        Units in which the results are returned.

    Returns
    -------
    A :class:`iris.cube.Cube` object with the computed
    total columns values.

    Notes
    -----
    - This function computes total columns.
      To compute partial columns, define `weights`
      or reduce the cubes first.
    - Partial columns are first calculated for each grid cell
      as follows:
        pcol = `mixing_ratio` * `N_air` * `cell_heights`
      total columns are the sum of pcol over `z_coord`.
    - Aware of units (e.g., ppbv, ppmv for `mixing_ratio`...).
      specified in the input cubes metadata.
    - For output units, 'count' is used instead of 'molec' (the latter
      unit is not supported by udunits2), but the values are unchanged.
    
    """
    if not isinstance(z_coord, iris.coords.Coord):
        z_coord = mixing_ratio.coord(name=z_coord)
    
    if weights is None:
        weights = 1.
    
    if cell_heights is None:
        if not z_coord.has_bounds():
            raise iris.exceptions.CoordinateNotRegularError(
                'z_coord {} must have bounds'.format(z_coord.name)
            )
        if z_coord.units.symbol not in ['m', 'km']:
            raise iris.exceptions.CoordinateNotRegularError(
                "'m' or 'km' units required for z_coord, "
                "found {} ({})".format(z_coord.units.symbol, z_coord.name)
            )
            
        map_height_dim = mixing_ratio.coord_dims(z_coord)
        heights_data = z_coord.bounds[:,1] - z_coord.bounds[:,0]
        heights_data = iris.util.broadcast_to_shape(heights_data,
                                                    mixing_ratio.shape,
                                                    map_height_dim)
        cell_heights = mixing_ratio.copy()
        cell_heights.data = heights_data
        cell_heights.units = z_coord.units
    
    # avoid missing values (convert to zero)
    mixing_ratio = mixing_ratio.copy()
    n_air = n_air.copy()
    mixing_ratio.data = np.nan_to_num(mixing_ratio.data)
    n_air.data = np.nan_to_num(n_air.data)
    
    gridbox_partial_columns = mixing_ratio * n_air 
    gridbox_partial_columns *= cell_heights * weights
    
    total_columns = gridbox_partial_columns.collapsed(z_coord,
                                                      iris.analysis.SUM)
    total_columns.convert_units(units)
    total_columns.long_name = "_".join([mixing_ratio.name(), 'columns'])
    total_columns.attributes.update(mixing_ratio.attributes)
    
    return total_columns

In [19]:
columns = [compute_tracer_columns(p,
                                  regridded_n_air_profile,
                                  'altitude')
           for p in regridded_tracer_profiles]

tracer_columns = iris.cube.CubeList(columns)

print tracer_columns


0: PAN_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
1: CO_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
2: ACET_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
3: C3H8_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
4: CH2O_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
5: C2H6_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
6: NH3_IJ-AVG-$_regridded_columns / (count/cm2) (time: 248)
/home/python/PythonEnvs/pygchem_py27_0/lib/python2.7/site-packages/Iris-1.6.2_dev-py2.7.egg/iris/coords.py:913: UserWarning: Collapsing a non-contiguous coordinate. Metadata may not be fully descriptive for u'model_level_number'.
  warnings.warn(msg.format(self.name()))

6. Save extracted profiles and columns to disk

  • Iris util functions needed for export

In [20]:
def permute_dim_aux_coords(cube, dim_coord, aux_coord):
    """
    Permute a dimension coordinate with
    an auxilliary coordinate in a cube.
    
    Parameters
    ----------
    cube : :class:`iris.cube.Cube`
        the cube to process (changes will be made in-place).
    dim_coord : string or :class:`iris.coords.DimCoord`
        (name of) the dimension coordinate to permute.
    aux_coord : string or :class:`iris.coords.AuxCoord`
        (name of) the auxilliary coordinate to permute.
        must contain the same cube dimension than `dim_coord`
        and must satisfy the criteria required for dimensional
        coordinates (1D, numeric, and strictly monotonic). 
    """
    if not isinstance(dim_coord, iris.coords.DimCoord):
        dim_coord = cube.coord(name=dim_coord)
    if not isinstance(dim_coord, iris.coords.AuxCoord):
        aux_coord = cube.coord(name=aux_coord)
    
    if cube.coord_dims(aux_coord) != cube.coord_dims(dim_coord):
        raise iris.exceptions.CoordinateNotRegularError(
            "Cannot permute '{}' and '{}' coordinates"
            .format(dim_coord.name(), aux_coord.name())
        )
    else:
        dim = cube.coord_dims(dim_coord)[0]
    
    new_dim_coord = iris.coords.DimCoord.from_coord(aux_coord)
    new_aux_coord = iris.coords.AuxCoord.from_coord(dim_coord)
    
    cube.remove_coord(dim_coord)
    cube.remove_coord(aux_coord)
    cube.add_dim_coord(new_dim_coord, dim)
    cube.add_aux_coord(new_aux_coord, dim)
    

def remove_dim_aux_coords(cube, dimensions):
    """
    Remove in `cube` all auxilliary coordinates
    that contain `dimensions`.
    """
    for coord in cube.coords(dimensions=dimensions):
        if isinstance(coord, iris.coords.AuxCoord): 
            cube.remove_coord(coord)
  • Format filenames

In [21]:
out_profiles_basename = string.replace(out_profiles_basename, "*", station_name)
out_columns_basename = string.replace(out_columns_basename, "*", station_name)

out_profiles_basepath = os.path.join(out_dir, out_profiles_basename)
out_columns_basepath = os.path.join(out_dir, out_columns_basename)
  • Save profiles and columns (the cubes) to netCDF files

In [22]:
def fix_cube_attributes_vals(cube):
    """
    Iris issue ? when saving a cube to a netCDF file,
    a TypeError is raised (by netCDF4) if there are
    attributes with bool values.
    
    Convert it to int.
    """
    for key, val in cube.attributes.items():
        if type(val) == bool:
            cube.attributes[key] = int(val)

# make altitude as dimension coord
for profile_cube in regridded_tracer_profiles + [regridded_n_air_profile]:
    if isinstance(profile_cube.coord('altitude'), iris.coords.AuxCoord):
        permute_dim_aux_coords(profile_cube, 'model_level_number', 'altitude')

for cube in regridded_tracer_profiles + [regridded_n_air_profile]:
    fix_cube_attributes_vals(cube)

for cube in tracer_columns:
    fix_cube_attributes_vals(cube)


iris.save(regridded_tracer_profiles + [regridded_n_air_profile],
          '.'.join([out_profiles_basepath, 'nc']))
iris.save(tracer_columns,
          '.'.join([out_columns_basepath, 'nc']))
  • Create Pandas Series, DataFrame and/or Panel objects from the profiles and columns cubes.

In [23]:
dataframe_profiles = {}
for profile in regridded_tracer_profiles + [regridded_n_air_profile]:
    profile_cube = profile.copy()
    
    # there must be only one defined dimension coordinate for each
    # cube dimension (no auxilliary coordinate (convert iris to pandas)
    z_dim = profile_cube.coord_dims(profile_cube.coord(name='altitude'))
    remove_dim_aux_coords(profile_cube, z_dim)
    
    dataframe_units = profile_cube.units.format()
    if dataframe_units == 'unknown':
        dataframe_units = profile_cube.attributes['no_udunits2']
    dataframe_name = "{tracer} ({units})".format(
        tracer=profile_cube.attributes['name'],
        units=dataframe_units
    )
    
    # scalar time coordinate
    if profile_cube.ndim == 1:
        series = ipandas.as_series(profile)
        time_coord = profile_cube.coord('time')  
        date = time_coord.units.num2date(time_coord.points[0])
        dataframe_profiles[dataframe_name] = pd.DataFrame({date : series}).transpose()
    # dimensional time coordinate
    else:
        dataframe_profiles[dataframe_name] = ipandas.as_data_frame(profile_cube)
    
panel_profiles = pd.Panel(dataframe_profiles).transpose(0, 2, 1).astype(np.float64)


series_columns = {}
for column in tracer_columns:
    series_name = "{tracer} ({units})".format(
        tracer=column.attributes['name'],
        units='molec cm-2'
    )
    series_columns[series_name] = ipandas.as_series(column)
    time_coord = column.coord('time')  
    date = time_coord.units.num2date(time_coord.points)
    series_columns[series_name].index = date

dataframe_columns = pd.DataFrame(series_columns).astype(np.float64)
  • Show metadata and/or data about the created panda objects

In [24]:
panel_profiles


Out[24]:
<class 'pandas.core.panel.Panel'>
Dimensions: 8 (items) x 39 (major_axis) x 248 (minor_axis)
Items axis: ACET (1e-09 1) to PAN (1e-09 1)
Major_axis axis: 3903.0 to 92500.0
Minor_axis axis: 2004-01-01 03:00:00 to 2004-02-01 00:00:00

In [25]:
dataframe_columns


Out[25]:
ACET (molec cm-2) C2H6 (molec cm-2) C3H8 (molec cm-2) CH2O (molec cm-2) CO (molec cm-2) NH3 (molec cm-2) PAN (molec cm-2)
2004-01-01 03:00:00 3.802792e+15 7.090335e+15 1.565129e+15 9.168782e+14 1.017406e+18 2.692921e+16 1.065619e+15
2004-01-01 06:00:00 3.794582e+15 6.968276e+15 1.562333e+15 8.640113e+14 1.016817e+18 2.842347e+16 1.019549e+15
2004-01-01 09:00:00 4.049594e+15 7.209870e+15 1.638036e+15 8.826249e+14 1.044811e+18 2.731121e+16 9.579297e+14
2004-01-01 12:00:00 4.255884e+15 7.641897e+15 1.909310e+15 1.058128e+15 1.075285e+18 2.358122e+16 9.823413e+14
2004-01-01 15:00:00 4.260104e+15 7.969895e+15 2.072399e+15 1.329860e+15 1.083605e+18 2.417155e+16 1.023956e+15
2004-01-01 18:00:00 4.154040e+15 8.448607e+15 2.202868e+15 1.664887e+15 1.084522e+18 2.874561e+16 1.072167e+15
2004-01-01 21:00:00 4.026997e+15 8.820762e+15 2.272748e+15 3.022866e+15 1.077387e+18 3.302138e+16 1.104820e+15
2004-01-02 00:00:00 3.931910e+15 8.768195e+15 2.235282e+15 3.612384e+15 1.056829e+18 3.361582e+16 1.128010e+15
2004-01-02 03:00:00 3.886483e+15 8.799345e+15 2.217577e+15 3.050193e+15 1.055246e+18 3.234282e+16 1.157913e+15
2004-01-02 06:00:00 3.905075e+15 8.835873e+15 2.234031e+15 2.726341e+15 1.061619e+18 3.200519e+16 1.167453e+15
2004-01-02 09:00:00 3.945400e+15 8.895558e+15 2.258970e+15 2.400140e+15 1.071277e+18 3.207268e+16 1.187954e+15
2004-01-02 12:00:00 3.980871e+15 8.984225e+15 2.246042e+15 1.887166e+15 1.078793e+18 3.269833e+16 1.185247e+15
2004-01-02 15:00:00 4.036343e+15 9.074234e+15 2.232059e+15 1.611181e+15 1.087316e+18 3.271367e+16 1.185722e+15
2004-01-02 18:00:00 4.032636e+15 9.053899e+15 2.143075e+15 1.424153e+15 1.082448e+18 3.401711e+16 1.196978e+15
2004-01-02 21:00:00 4.079541e+15 9.100171e+15 2.086217e+15 1.150712e+15 1.089893e+18 3.622959e+16 1.212879e+15
2004-01-03 00:00:00 4.191594e+15 9.212647e+15 2.114761e+15 9.944943e+14 1.107577e+18 3.802056e+16 1.245042e+15
2004-01-03 03:00:00 4.308118e+15 9.235745e+15 2.133922e+15 9.163992e+14 1.121123e+18 3.849842e+16 1.255387e+15
2004-01-03 06:00:00 4.431019e+15 9.145898e+15 2.165035e+15 9.091304e+14 1.136124e+18 3.811355e+16 1.234198e+15
2004-01-03 09:00:00 4.473340e+15 8.949028e+15 2.131788e+15 9.312394e+14 1.135824e+18 3.644843e+16 1.203138e+15
2004-01-03 12:00:00 4.509167e+15 8.798358e+15 2.079776e+15 9.075723e+14 1.133354e+18 3.517720e+16 1.170781e+15
2004-01-03 15:00:00 4.489874e+15 8.814822e+15 2.036220e+15 9.027580e+14 1.137353e+18 3.427381e+16 1.174850e+15
2004-01-03 18:00:00 4.414155e+15 9.291457e+15 2.105686e+15 9.489392e+14 1.163017e+18 3.322881e+16 1.210389e+15
2004-01-03 21:00:00 4.280177e+15 9.655239e+15 2.133998e+15 1.002821e+15 1.170825e+18 3.266064e+16 1.238105e+15
2004-01-04 00:00:00 4.077001e+15 9.543034e+15 2.063190e+15 1.031883e+15 1.152677e+18 3.199098e+16 1.269715e+15
2004-01-04 03:00:00 3.992714e+15 9.137068e+15 1.979160e+15 1.031514e+15 1.130915e+18 3.131524e+16 1.288771e+15
2004-01-04 06:00:00 4.125483e+15 9.138597e+15 2.040873e+15 1.039761e+15 1.137132e+18 3.072835e+16 1.277453e+15
2004-01-04 09:00:00 4.351547e+15 9.715428e+15 2.288356e+15 1.070072e+15 1.178091e+18 3.067709e+16 1.264110e+15
2004-01-04 12:00:00 4.345545e+15 1.040473e+16 2.445603e+15 9.711068e+14 1.206180e+18 3.020581e+16 1.278942e+15
2004-01-04 15:00:00 4.256469e+15 1.048437e+16 2.418741e+15 9.055142e+14 1.205070e+18 2.989791e+16 1.298998e+15
2004-01-04 18:00:00 4.179626e+15 9.996087e+15 2.262860e+15 8.885302e+14 1.182240e+18 2.933337e+16 1.306914e+15
2004-01-04 21:00:00 4.244696e+15 9.753697e+15 2.246274e+15 9.412436e+14 1.176403e+18 2.865104e+16 1.306868e+15
2004-01-05 00:00:00 4.475024e+15 9.804095e+15 2.355806e+15 1.077178e+15 1.194787e+18 2.847710e+16 1.277867e+15
2004-01-05 03:00:00 4.507416e+15 9.320716e+15 2.251362e+15 1.144150e+15 1.177171e+18 2.830191e+16 1.187578e+15
2004-01-05 06:00:00 4.494739e+15 8.699759e+15 2.004430e+15 1.124812e+15 1.142914e+18 2.792157e+16 1.062668e+15
2004-01-05 09:00:00 4.473019e+15 8.324404e+15 1.816466e+15 1.061263e+15 1.123043e+18 2.764908e+16 9.950205e+14
2004-01-05 12:00:00 4.369560e+15 7.979333e+15 1.611029e+15 9.567380e+14 1.104224e+18 2.737763e+16 9.930126e+14
2004-01-05 15:00:00 4.226736e+15 7.892809e+15 1.442786e+15 9.417330e+14 1.089059e+18 2.707455e+16 9.959198e+14
2004-01-05 18:00:00 4.140156e+15 7.916648e+15 1.375566e+15 9.701650e+14 1.084260e+18 2.703989e+16 9.950265e+14
2004-01-05 21:00:00 4.110907e+15 7.871000e+15 1.350008e+15 9.967965e+14 1.078541e+18 2.745525e+16 1.004558e+15
2004-01-06 00:00:00 4.107507e+15 7.818077e+15 1.303507e+15 1.014245e+15 1.077065e+18 2.774910e+16 1.015820e+15
2004-01-06 03:00:00 4.100013e+15 7.724887e+15 1.242096e+15 1.013363e+15 1.074963e+18 2.833173e+16 1.029780e+15
2004-01-06 06:00:00 4.117478e+15 7.656994e+15 1.204442e+15 9.961872e+14 1.075056e+18 2.881718e+16 1.062499e+15
2004-01-06 09:00:00 4.138606e+15 7.634684e+15 1.211034e+15 9.674855e+14 1.075304e+18 2.887232e+16 1.097836e+15
2004-01-06 12:00:00 4.139331e+15 7.583204e+15 1.184498e+15 9.113868e+14 1.071703e+18 2.869245e+16 1.117278e+15
2004-01-06 15:00:00 4.130536e+15 7.569881e+15 1.205553e+15 9.206883e+14 1.067897e+18 2.882887e+16 1.098619e+15
2004-01-06 18:00:00 4.515202e+15 8.545840e+15 1.742435e+15 1.013108e+15 1.131001e+18 2.896969e+16 1.140260e+15
2004-01-06 21:00:00 5.286882e+15 1.051766e+16 2.186095e+15 1.133886e+15 1.231905e+18 2.919759e+16 1.291461e+15
2004-01-07 00:00:00 5.673864e+15 1.174240e+16 2.358111e+15 1.229329e+15 1.288844e+18 2.944533e+16 1.378999e+15
2004-01-07 03:00:00 5.852338e+15 1.228653e+16 2.361013e+15 1.291332e+15 1.316078e+18 2.965584e+16 1.404612e+15
2004-01-07 06:00:00 5.930547e+15 1.244798e+16 2.341519e+15 1.332862e+15 1.325045e+18 3.002278e+16 1.401843e+15
2004-01-07 09:00:00 5.892939e+15 1.210509e+16 2.273028e+15 1.334289e+15 1.306156e+18 3.030685e+16 1.371126e+15
2004-01-07 12:00:00 5.859622e+15 1.173421e+16 2.207678e+15 1.185570e+15 1.290020e+18 3.045667e+16 1.355369e+15
2004-01-07 15:00:00 5.800760e+15 1.107561e+16 2.126883e+15 1.139093e+15 1.263511e+18 3.064870e+16 1.339898e+15
2004-01-07 18:00:00 5.694921e+15 1.050830e+16 2.065154e+15 1.133035e+15 1.239027e+18 3.082940e+16 1.334429e+15
2004-01-07 21:00:00 5.433102e+15 9.839936e+15 1.965203e+15 1.085623e+15 1.203675e+18 3.108484e+16 1.324270e+15
2004-01-08 00:00:00 4.888682e+15 8.860601e+15 1.778350e+15 9.945535e+14 1.145910e+18 3.133345e+16 1.317835e+15
2004-01-08 03:00:00 4.450709e+15 8.090887e+15 1.565727e+15 9.567969e+14 1.098407e+18 3.154466e+16 1.293805e+15
2004-01-08 06:00:00 4.248669e+15 7.637399e+15 1.405754e+15 9.686967e+14 1.072867e+18 3.188316e+16 1.241114e+15
2004-01-08 09:00:00 4.272423e+15 7.675675e+15 1.419988e+15 1.001641e+15 1.075940e+18 3.214952e+16 1.206936e+15
2004-01-08 12:00:00 4.515372e+15 8.313730e+15 1.522346e+15 1.054322e+15 1.103269e+18 3.203450e+16 1.220033e+15
... ... ... ... ... ... ...

248 rows × 7 columns

  • Save pandas objects to files (using the chosen file format)

In [26]:
if out_format in ('hdf', 'hdf5'):
    panel_profiles.to_hdf('.'.join([out_profiles_basepath, 'hdf5']),
                          'profiles')
    dataframe_columns.to_hdf('.'.join([out_columns_basepath, 'hdf5']),
                            'columns')

elif out_format in ('xls', 'xlsx'):
    panel_profiles.to_excel('.'.join([out_profiles_basepath, out_format]),
                            'profiles')
    dataframe_columns.to_excel('.'.join([out_columns_basepath, out_format]),
                              'columns')

elif out_format == 'csv':
    panel_profiles.transpose(2, 0, 1).to_frame().to_csv(
        '.'.join([out_profiles_basepath, 'csv'])
    )
    dataframe_columns.to_csv('.'.join([out_columns_basepath, out_format]))
  • Check if file are created

In [27]:
!ls $out_dir -all -h


total 60M
drwxr-xr-x  3 bovy bovy 4.0K Apr 25 12:43 .
drwxr-xr-x 24 bovy bovy 4.0K Apr 29 13:37 ..
drwxr-xr-x  3 bovy bovy 4.0K Apr 25 11:07 frontend_server
-rw-r--r--  1 bovy bovy  45K Mar 28 16:21 gc_elev_4x5.nc
-rw-r--r--  1 bovy bovy 166K Apr 30 17:09 JungfrauJoch_columns_2004_01.nc
-rw-r--r--  1 bovy bovy  31K Apr 30 17:09 JungfrauJoch_columns_2004_01.xlsx
-rw-r--r--  1 bovy bovy 487K Mar 27 13:46 JungfrauJoch_columns.csv
-rw-r--r--  1 bovy bovy 191K Mar 27 13:45 JungfrauJoch_columns.hdf5
-rw-r--r--  1 bovy bovy 286K Mar 27 13:43 JungfrauJoch_columns.xlsx
-rw-r--r--  1 bovy bovy 798K Apr 30 17:09 JungfrauJoch_profiles_2004_01.nc
-rw-r--r--  1 bovy bovy 905K Apr 30 17:09 JungfrauJoch_profiles_2004_01.xlsx
-rw-r--r--  1 bovy bovy  29M Mar 27 13:46 JungfrauJoch_profiles.csv
-rw-r--r--  1 bovy bovy  12M Mar 27 13:45 JungfrauJoch_profiles.hdf5
-rw-r--r--  1 bovy bovy  17M Mar 27 13:43 JungfrauJoch_profiles.xlsx

7. Plotting

  • Global settings and plot related routines

In [28]:
#pylab.rcParams['figure.figsize'] = (12.0, 10.0)     # matplotlib default fig size
  • Compare original and regridded profiles (plots)

In [29]:
draw_n_prof = 10    # draw only the first N profiles.

originals = tracer_profiles + [n_air_profile]
regridded = regridded_tracer_profiles + [regridded_n_air_profile]

for profile_original, profile_regridded in zip(originals, regridded):
    
    ts_original = profile_original.slices('model_level_number')
    ts_regridded = profile_regridded.slices('model_level_number')

    plt.figure()

    inc = 0
    for p_original, p_regridded in zip(ts_original, ts_regridded):
        if inc > draw_n_prof:
            break

        ax = plt.subplot(121)
        iqplot.plot(p_original, p_original.coord('altitude'), '-+')

        ax2 = plt.subplot(122)
        iqplot.plot(p_regridded, p_regridded.coord('altitude'), '-+')

        ax2.set_xlim(ax.get_xlim())
        ymin = p_regridded.coord('altitude').points[0]
        ymax = p_regridded.coord('altitude').points[-1]
        ax.set_ylim([ymin, ymax])
        ax2.set_ylim([ymin, ymax])

        inc += 1


  • Plot tracer columns time series using matplotlib (static)

In [30]:
dataframe_columns.plot()


Out[30]:
<matplotlib.axes.AxesSubplot at 0x886e7d0>

In [30]: