Difference between revisions of "UKCA Chemistry and Aerosol Tutorial 10"

From UKCA
 
(33 intermediate revisions by 2 users not shown)
Line 3: Line 3:
 
==What you will learn in this Tutorial==
 
==What you will learn in this Tutorial==
   
In this tutorial you will learn about the Aerosol Optical Depth and how aerosol optical properties are diagnosed by RADAER GLOMAP-mode aerosol module and how it tracks different aerosol types within several size classes.
+
In this tutorial you will learn about the Aerosol Optical Depth and how the RADAER module diagnoses aerosol optical properties from the GLOMAP aerosol microphysics scheme included in UKCA.
  +
  +
'''Note:''' The GLOMAP aerosol tutorials use a slightly different base job. Please take a copy of <code>'''xjrnk'''</code> and work from that for these tasks. Example output from this job can be found on ARCHER in the directory
  +
  +
/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Base_Aerosol
   
 
==Task 10.1: What is the aerosol optical depth?==
 
==Task 10.1: What is the aerosol optical depth?==
Line 28: Line 32:
   
 
Mie theory describes the scattering and absorption of light by spherical particles.
 
Mie theory describes the scattering and absorption of light by spherical particles.
Essentially, the scattering efficiency can be parameterized in terms of two parameters: the (complex) refractive index of the particle and the Mie parameter, which describes the particle size dependence in relation to the wavelength of light under consideration.
+
Essentially, the scattering/absorption efficiency can be parameterized in terms of two parameters: the (complex) refractive index of the particle and the Mie parameter, which describes the particle size dependence in relation to the wavelength of light under consideration.
   
The Figure in the slide below shows the dependence on particle size of the scattering efficiency for mid-visible (550nm, green) light for two different types of particle (refractive index).
+
The Figure in the slide below shows the dependence on particle size of the extinction efficiency for mid-visible (550nm, green) light for two different types of particle (refractive index).
   
 
[[File:Slide_AOD_SizeDistribution_blankbackground.jpg]]
 
[[File:Slide_AOD_SizeDistribution_blankbackground.jpg]]
   
 
The aerosol scheme used for UK climate model simulations in CMIP5
 
The aerosol scheme used for UK climate model simulations in CMIP5
is called the Coupled Large‐scale Aerosol Simulator for Studies In Climate
+
was called the Coupled Large‐scale Aerosol Simulator for Studies In Climate
 
(CLASSIC). CLASSIC is a simpler scheme than the microphysical GLOMAP scheme
 
(CLASSIC). CLASSIC is a simpler scheme than the microphysical GLOMAP scheme
 
included in UKCA but has a comprehensive representation of the main aerosol
 
included in UKCA but has a comprehensive representation of the main aerosol
Line 43: Line 47:
 
(also called biogenic), and ammonium nitrate aerosols.
 
(also called biogenic), and ammonium nitrate aerosols.
   
However, the size distribution and refractive index for each of the transported aerosol types
+
However, the size distribution and refractive index for each of the CLASSIC transported aerosol types
 
was prescribed to have globally and temporally uniform values. Some variation in aerosol
 
was prescribed to have globally and temporally uniform values. Some variation in aerosol
 
properties was resolved by having fresh and aged sub-types for each aerosol type, which
 
properties was resolved by having fresh and aged sub-types for each aerosol type, which
Line 74: Line 78:
 
nucleation scavenging (rainout) and impaction scavenging (washout).
 
nucleation scavenging (rainout) and impaction scavenging (washout).
   
GLOMAP therefore simulates the evolution of particle composition across the
+
GLOMAP therefore simulates the evolution of particle number and composition across the
 
size spectrum over several different components as determined by the aerosol
 
size spectrum over several different components as determined by the aerosol
 
processes included.
 
processes included.
Line 86: Line 90:
 
process representations, but using log-normal modes as its size classes.
 
process representations, but using log-normal modes as its size classes.
 
Each size mode in GLOMAP-mode covers one of four size ranges, with additional
 
Each size mode in GLOMAP-mode covers one of four size ranges, with additional
separation among soluble and insoluble modes
+
separation among soluble and insoluble modes.
  +
 
GLOMAP has been developed to follow a flexible multi-component approach, with the
 
GLOMAP has been developed to follow a flexible multi-component approach, with the
 
same code able to be run with different levels of composition/size sophistication
 
same code able to be run with different levels of composition/size sophistication
with FORTRAN-90 modules providing alterative aerosol ''mode set-up'' arrays.
+
with FORTRAN-90 modules providing alternative aerosol ''mode set-up'' arrays.
 
The GLOMAP-mode aerosol scheme in UKCA not only simulates the dry aerosol mass, but also
 
The GLOMAP-mode aerosol scheme in UKCA not only simulates the dry aerosol mass, but also
 
the mass of water attached to the aerosol, and the aerosol number concentrations.
 
the mass of water attached to the aerosol, and the aerosol number concentrations.
Line 98: Line 103:
 
which are relevant for simulated aerosol-radiation interactions:
 
which are relevant for simulated aerosol-radiation interactions:
   
A) The mean radius of each size class (mode) varies in time and space as determined by transport and aerosol processes.
+
* The mean radius of each size class (mode) varies in time and space as determined by transport and aerosol processes.
   
B) There is a refractive index for each size class (mode) which varies according to its internally-mixed composition.
+
* There is a refractive index for each size class (mode) which varies according to its internally-mixed composition.
   
C) The amount of aerosol water in each soluble mode varies interactively consistent with its composition.
+
* The amount of aerosol water in each soluble mode varies interactively consistent with its composition.
   
 
RADAER relies on pre-computed look-up tables of monochromatic optical properties, covering all realistic combinations of modal radii and refractive indices. At runtime, remaining tasks are:
 
RADAER relies on pre-computed look-up tables of monochromatic optical properties, covering all realistic combinations of modal radii and refractive indices. At runtime, remaining tasks are:
   
A) to compute the modal refractive index out of the simulated chemical composition of each mode;
+
* To compute the modal refractive index out of the simulated chemical composition of each mode.
   
B) to obtain the monochromatic properties from the look-up tables at selected wavelengths within each shortwave and longwave wavebands;
+
* To obtain the monochromatic properties from the look-up tables at selected wavelengths within each shortwave and longwave waveband.
   
C) to integrate across each waveband to obtain the waveband-averaged optical properties, which can be used by the radiation code.
+
* To integrate across each waveband to obtain the waveband-averaged optical properties, which can be used by the radiation code.
   
As well as the providing the waveband-averaged scattering, extinction and asymetry parameters from GLOMAP, RADAER also diagnoses monochromatic Aerosol Optical Depth (AOD) for each of the GLOMAP modes.
+
As well as providing the waveband-averaged scattering, extinction and asymmetry parameters from GLOMAP, RADAER also diagnoses monochromatic Aerosol Optical Depth (AOD) for each of the GLOMAP modes.
 
One thing that is not included in the UMDP is the STASH section and item numbers for these GLOMAP Aerosol Optical Depth diagnostics.
 
   
 
==Task 10.3: Output daily-mean Aerosol Optical Depths from your UKCA model run==
 
==Task 10.3: Output daily-mean Aerosol Optical Depths from your UKCA model run==
  +
  +
In this task you will update your copy of the UKCA tutorial job (<code>'''xjrnk'''</code>) adding extra STASH requests to output daily-mean AODs from GLOMAP.
   
 
UM-UKCA diagnoses the AOD from each of the GLOMAP modes as a separate STASH item.
 
UM-UKCA diagnoses the AOD from each of the GLOMAP modes as a separate STASH item.
   
All of the GLOMAP AOD diagnostics are contained with STASH section 2.
+
All of the GLOMAP AOD diagnostics are contained with STASH section 2 (long-wave radiation) in items numbers near to those used for the AOD diagnostics from CLASSIC.
  +
 
Section 2 items 300-305 contain the AOD for the Aitken-soluble, accumulation-soluble, coarse-soluble, Aitken-insoluble, accumulation-insoluble and coarse-insoluble modes respectively.
  +
 
The dimensions for each of these STASH items is 2D global in longitude and latitude but there is also a third dimension containing 6 pseudo levels for the 6 monochromatic AODs stored by the model (at 0.38, 0.44, 0.55, 0.67, 0.87, 1.02 micron wavelengths).
  +
 
Note that there is no nucleation mode AOD as those particles are too small to significantly scatter or absorb radiation at these wavelenghts.
  +
 
Note that although the absorption AOD in these 6 modes can usually be requested via STASH section 2 items 240 to 245, in the job here these are not available.
  +
 
There are also separate "stratospheric AOD" diagnostics in section 2 items 251 to 256 which can also be requested to store the AOD in levels above the tropopause.
  +
  +
To output AODs from GLOMAP, you need to add in some extra STASH requests for the section 2 items 300 to 305.
  +
  +
To output as a daily-mean select the usage profile "UPA" to output to the .pa files and the time profile "TDAYM" for daily-means.
  +
For AOD STASH requests, you need to select the domain profile DIAGAOT to output over the longitude, latitude and 6 wavelength pseudo-levels.
  +
  +
Section 34 items 106, 110, 116, 121 and 126 contain the OM mmr's in the Aitken-soluble, accumulation-soluble, coarse-soluble, Aitken-insoluble and nucleation-soluble modes respectively.
  +
  +
When requesting the OM mmr's you should use the DALLTH domain profile to request the variable on the full 3D model grid.
  +
  +
So now you should have an equivalent version of the UKCA tutorial job with extra daily-mean fields requested.
  +
  +
Since you specified the UPA usage profile in the job, these fields will be output to the so-called ''.pa files''.
  +
  +
These can be found in your /work/n02/n02/ directory on ARCHER.
  +
You should have a file like '''jobid'''a.pa19991201 for the daily-mean fields for the 1 day that the job was set to run for.
  +
  +
In the first instance you should use xconv to open the file although you can use convsh or other tools to extract required fields from the .pa file and then manipulate them in IDL or python.
  +
  +
As an example I have put below a jpeg showing a global map produced in IDL of the daily-mean AOD at 550nm (total over all modes) for 1st December 1999 from the UKCA tutorial job (worked solution <code>'''xjrnl'''</code>).
  +
  +
In preparation for the next task, you should also re-run the job adding also daily-mean STASH requests for the following mass mixing ratios (mmr's) for the Organic Matter (OM) in each mode (34106, 34110, 34116, 34121 and 34126).
   
  +
Once you have re-run the job with these extra fields available in the .pa file, you can use the cdo operator ''cdo add'' to sum up each of the OM mmrs to give a total OM mmr in a separate netCDF file.
Although this section contains mainly diagnostics associated with long-wave radiation, it is where the CLASSIC Aerosol Optical Depth diagnostics are stored, and there were plenty of spare item numbers there, which have accomodated also the GLOMAP AOD diagnostics.
 
   
  +
[[File:idl_dailyAOD550_xkwhg.jpg]]
Section 2 items 300-305 contain the AOD for the Aitken-soluble, accumulation-soluble, coarse-soluble, Aitken-insoluble, accumulation-insoluble and coarse-soluble modes respectively.
 
   
  +
===Worked Solution===
Note that there is no nucleation mode AOD as those particles are too small to significant scatter or absorb solar or terrestrial radiation.
 
   
  +
A worked soltion to '''Task 10.3''' is job <code>'''xjrnl'''</code>.
Diagnostics for the absorption AOD in these 6 modes can be requested via STASH section 2 items 240 to 245.
 
   
  +
You can use '''cdo''' as so to add the 5 separate netCDF files containing the OC mass-mixing ratios:
There are also separate "stratospheric AOD" diagnostics in section 2 items 254 to 259 which can also be requested to store the AOD in levels above the tropopause.
 
   
  +
$ cdo add xkvxm_aitken_sol_OCmmr.nc -add xkvxm_accum_sol_OCmmr.nc -add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc
The dimensions for each of these STASH items is 2D global in longitude and latitude but there is also a third dimension containing 6 pseudo levels for the 6 monochromatic AODs stored by the model.
 
  +
xkvxm_nuc_sol_OCmmr.nc xkvxm_OCmmr.nc
  +
cdo add: Started child process "add xkvxm_accum_sol_OCmmr.nc -add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc
  +
xkvxm_nuc_sol_OCmmr.nc (pipe1.1)".
  +
cdo(2) add: Started child process "add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc xkvxm_nuc_sol_OCmmr.nc (pipe2.1)".
  +
cdo(3) add: Started child process "add xkvxm_aitken_insol_OCmmr.nc xkvxm_nuc_sol_OCmmr.nc (pipe3.1)".
  +
cdo(4) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.23s )
  +
cdo(3) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.25s )
  +
cdo(2) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.27s )
  +
cdo add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.28s )
   
  +
When opening the output file (<code>xkvxm_OCmmr.nc</code> in the example above) the variable name is taken from the first file in the list.
The standard settings for these are to store AOD at 0.38, 0.44, 0.55, 0.67, 0.87, 1.02 micron wavelengths although any wavelength can be set by modifying the values set in the RADAER fortran code.
 
   
  +
Example output can be found on ARCHER in the directory
As an example I have attached here a .{{pdf|Idl_aodtracers_xjlub_vs_xjluc.pdf|pdf}} which compares the Aerosol Optical Depth (at 440nm) simulated in the UM-UKCA tutorial job comparing the jobs xjlub (top-left) and xjluc (top-right) which used the standard and 2-component OC configurations of GLOMAP.
 
   
  +
/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Task10.3
   
   

Latest revision as of 17:43, 7 January 2016

Back to UKCA Chemistry and Aerosol Tutorials

What you will learn in this Tutorial

In this tutorial you will learn about the Aerosol Optical Depth and how the RADAER module diagnoses aerosol optical properties from the GLOMAP aerosol microphysics scheme included in UKCA.

Note: The GLOMAP aerosol tutorials use a slightly different base job. Please take a copy of xjrnk and work from that for these tasks. Example output from this job can be found on ARCHER in the directory

/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Base_Aerosol

Task 10.1: What is the aerosol optical depth?

Aerosol particles affect the Earth's radiative balance by scattering and absorbing solar radiation and, where they are large enough, can also act similarly to a greenhouse gas by absorbing outgoing terrestrial long-wave radiation.

The aerosol optical depth (AOD), sometimes referred to as aerosol optical thickness (AOT), is often used in atmospheric science to indicate the overall strength of aerosol-radiation interactions at a particular wavelength.

The AOD is defined as the vertical integral of the monochromatic (single-wavelength) extinction (the sum of scattering plus absorption) through the atmospheric column. It is common also to refer to an absorption AOD which represents the integral of just the single-wavelength absorption.

The Unified Model (UM) radiation scheme divides the shortwave and longwave spectra into wavebands. To enable UKCA simulated gases or aerosols to interact with the UM radiation scheme, their optical properties need to be integrated across each of these wavebands. For aerosols, the radiation scheme requires the specific scattering and absorption coefficients, which describe the strength of aerosol scattering and absorption processes per unit aerosol mass (in m kg), and the asymmetry parameter, which describes in a simplified way the angular dependence of the scattering (dimensionless). The specific scattering and absorption coefficients, and the asymmetry parameter, are hereafter referred to as the aerosol optical properties.

Task 10.2: Understand the principles behind GLOMAP and how aerosol optical properties are derived via RADAER

Mie theory describes the scattering and absorption of light by spherical particles. Essentially, the scattering/absorption efficiency can be parameterized in terms of two parameters: the (complex) refractive index of the particle and the Mie parameter, which describes the particle size dependence in relation to the wavelength of light under consideration.

The Figure in the slide below shows the dependence on particle size of the extinction efficiency for mid-visible (550nm, green) light for two different types of particle (refractive index).

Slide AOD SizeDistribution blankbackground.jpg

The aerosol scheme used for UK climate model simulations in CMIP5 was called the Coupled Large‐scale Aerosol Simulator for Studies In Climate (CLASSIC). CLASSIC is a simpler scheme than the microphysical GLOMAP scheme included in UKCA but has a comprehensive representation of the main aerosol sources, tracking up to eight tropospheric aerosol species: ammonium sulphate, mineral dust, sea salt, fossil fuel black carbon, fossil fuel organic carbon, biomass burning aerosols, secondary organic (also called biogenic), and ammonium nitrate aerosols.

However, the size distribution and refractive index for each of the CLASSIC transported aerosol types was prescribed to have globally and temporally uniform values. Some variation in aerosol properties was resolved by having fresh and aged sub-types for each aerosol type, which then allow size and refractive index to vary from values near-source (fresh) to remote (aged).

With this approach, optical properties for each of the CLASSIC aerosol types is derived based on Mie calculations using the prescribed size distributions and refractive indices for each of the transported aerosol masses and assuming hygroscopic growth factors for the water associated with each.

The GLOMAP-mode aerosol scheme in UKCA simulates the evolution of size-resolved aerosol properties, including microphysical processes such as new particle formation, coagulation, condensation (gas-to-particle-transfer) and cloud processing.

Whereas CLASSIC simulated only the mass of several aerosol types, the transported tracers in GLOMAP are particle number and mass in different size classes spanning the particle size range from 3nm up to around 20 microns dry diameter.

Processes such as condensation and aqueous sulphate production grow particles by increasing the mass in a size class while conserving particle number.

As was as microphysical processes, GLOMAP also includes size-resolved representations of primary emissions (e.g. sea-salt, dust and carbonaceous particles) and of removal processes including particle dry deposition, sedimentation, nucleation scavenging (rainout) and impaction scavenging (washout).

GLOMAP therefore simulates the evolution of particle number and composition across the size spectrum over several different components as determined by the aerosol processes included.

The original version of GLOMAP (known as GLOMAP-bin) uses a two-moment sectional aerosol dynamics approach, with typically 20 bins spanning the size spectrum, but when tracking several aerosol types, becomes too expensive for running multi-decadal integrations as required in a climate model. For UKCA, a new computationally cheaper version of GLOMAP was developed (GLOMAP-mode), which has the same process representations, but using log-normal modes as its size classes. Each size mode in GLOMAP-mode covers one of four size ranges, with additional separation among soluble and insoluble modes.

GLOMAP has been developed to follow a flexible multi-component approach, with the same code able to be run with different levels of composition/size sophistication with FORTRAN-90 modules providing alternative aerosol mode set-up arrays. The GLOMAP-mode aerosol scheme in UKCA not only simulates the dry aerosol mass, but also the mass of water attached to the aerosol, and the aerosol number concentrations.

The calculation of aerosol optical properties from GLOMAP is carried out via the RADAER module within UKCA.

Compared to CLASSIC, the GLOMAP-mode scheme introduces three important changes which are relevant for simulated aerosol-radiation interactions:

  • The mean radius of each size class (mode) varies in time and space as determined by transport and aerosol processes.
  • There is a refractive index for each size class (mode) which varies according to its internally-mixed composition.
  • The amount of aerosol water in each soluble mode varies interactively consistent with its composition.

RADAER relies on pre-computed look-up tables of monochromatic optical properties, covering all realistic combinations of modal radii and refractive indices. At runtime, remaining tasks are:

  • To compute the modal refractive index out of the simulated chemical composition of each mode.
  • To obtain the monochromatic properties from the look-up tables at selected wavelengths within each shortwave and longwave waveband.
  • To integrate across each waveband to obtain the waveband-averaged optical properties, which can be used by the radiation code.

As well as providing the waveband-averaged scattering, extinction and asymmetry parameters from GLOMAP, RADAER also diagnoses monochromatic Aerosol Optical Depth (AOD) for each of the GLOMAP modes.

Task 10.3: Output daily-mean Aerosol Optical Depths from your UKCA model run

In this task you will update your copy of the UKCA tutorial job (xjrnk) adding extra STASH requests to output daily-mean AODs from GLOMAP.

UM-UKCA diagnoses the AOD from each of the GLOMAP modes as a separate STASH item.

All of the GLOMAP AOD diagnostics are contained with STASH section 2 (long-wave radiation) in items numbers near to those used for the AOD diagnostics from CLASSIC.

Section 2 items 300-305 contain the AOD for the Aitken-soluble, accumulation-soluble, coarse-soluble, Aitken-insoluble, accumulation-insoluble and coarse-insoluble modes respectively.

The dimensions for each of these STASH items is 2D global in longitude and latitude but there is also a third dimension containing 6 pseudo levels for the 6 monochromatic AODs stored by the model (at 0.38, 0.44, 0.55, 0.67, 0.87, 1.02 micron wavelengths).

Note that there is no nucleation mode AOD as those particles are too small to significantly scatter or absorb radiation at these wavelenghts.

Note that although the absorption AOD in these 6 modes can usually be requested via STASH section 2 items 240 to 245, in the job here these are not available.

There are also separate "stratospheric AOD" diagnostics in section 2 items 251 to 256 which can also be requested to store the AOD in levels above the tropopause.

To output AODs from GLOMAP, you need to add in some extra STASH requests for the section 2 items 300 to 305.

To output as a daily-mean select the usage profile "UPA" to output to the .pa files and the time profile "TDAYM" for daily-means. For AOD STASH requests, you need to select the domain profile DIAGAOT to output over the longitude, latitude and 6 wavelength pseudo-levels.

Section 34 items 106, 110, 116, 121 and 126 contain the OM mmr's in the Aitken-soluble, accumulation-soluble, coarse-soluble, Aitken-insoluble and nucleation-soluble modes respectively.

When requesting the OM mmr's you should use the DALLTH domain profile to request the variable on the full 3D model grid.

So now you should have an equivalent version of the UKCA tutorial job with extra daily-mean fields requested.

Since you specified the UPA usage profile in the job, these fields will be output to the so-called .pa files.

These can be found in your /work/n02/n02/ directory on ARCHER. You should have a file like jobida.pa19991201 for the daily-mean fields for the 1 day that the job was set to run for.

In the first instance you should use xconv to open the file although you can use convsh or other tools to extract required fields from the .pa file and then manipulate them in IDL or python.

As an example I have put below a jpeg showing a global map produced in IDL of the daily-mean AOD at 550nm (total over all modes) for 1st December 1999 from the UKCA tutorial job (worked solution xjrnl).

In preparation for the next task, you should also re-run the job adding also daily-mean STASH requests for the following mass mixing ratios (mmr's) for the Organic Matter (OM) in each mode (34106, 34110, 34116, 34121 and 34126).

Once you have re-run the job with these extra fields available in the .pa file, you can use the cdo operator cdo add to sum up each of the OM mmrs to give a total OM mmr in a separate netCDF file.

Idl dailyAOD550 xkwhg.jpg

Worked Solution

A worked soltion to Task 10.3 is job xjrnl.

You can use cdo as so to add the 5 separate netCDF files containing the OC mass-mixing ratios:

$ cdo add xkvxm_aitken_sol_OCmmr.nc -add xkvxm_accum_sol_OCmmr.nc -add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc 
xkvxm_nuc_sol_OCmmr.nc xkvxm_OCmmr.nc
cdo add: Started child process "add xkvxm_accum_sol_OCmmr.nc -add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc 
xkvxm_nuc_sol_OCmmr.nc (pipe1.1)".
cdo(2) add: Started child process "add xkvxm_coarse_sol_OCmmr.nc -add xkvxm_aitken_insol_OCmmr.nc xkvxm_nuc_sol_OCmmr.nc (pipe2.1)".
cdo(3) add: Started child process "add xkvxm_aitken_insol_OCmmr.nc xkvxm_nuc_sol_OCmmr.nc (pipe3.1)".
cdo(4) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.23s )
cdo(3) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.25s )
cdo(2) add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.27s )
cdo add: Processed 4732800 values from 2 variables over 2 timesteps ( 0.28s )

When opening the output file (xkvxm_OCmmr.nc in the example above) the variable name is taken from the first file in the list.

Example output can be found on ARCHER in the directory

/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Task10.3


Written by Graham Mann 2014