Difference between revisions of "UKCA Chemistry and Aerosol vn10.4 Tutorial 12"

From UKCA
Line 52: Line 52:
 
==Task 12.2 Configure the UKCA tutorial job to run as a ''double-call'' job diagnosing aerosol radiative effects==
 
==Task 12.2 Configure the UKCA tutorial job to run as a ''double-call'' job diagnosing aerosol radiative effects==
   
In this task you will copy your copy of the standard tutorial job (<code>'''xjrnk'''</code>)
+
In this task you will copy the copy of the standard tutorial job you used in Task 12.1
  +
(<code>'''u-ai830'''</code>)
 
and configure it to run with ''double-call'' to the radiation scheme to diagnose the radiative
 
and configure it to run with ''double-call'' to the radiation scheme to diagnose the radiative
 
effects of the aerosol simulated by GLOMAP in UM-UKCA.
 
effects of the aerosol simulated by GLOMAP in UM-UKCA.
Line 61: Line 62:
 
UM which store the difference in the radiative fluxes between the two radiation calls.
 
UM which store the difference in the radiative fluxes between the two radiation calls.
   
In the UMUI go to Atmosphere --> Scientific Parameters and Sections --> Section by section choices
+
In the um ''app'' in the Rose GUI go to namelist --> UM Science Settings
and then choose ''Section 1: SW radiation''.
+
and then choose ''Section 1 - 2: Radiation''.
   
In the SW Radiation UMUI panel that opens, you see that at the top
+
In the ''General Options'' panel, you see that at the top there is an
there is an "Options for multiple calls to radiation" button-selector.
+
''i_rad_extra_call'' "Options for multiple calls to radiation" button-selector.
   
The UKCA tutorial job is set to "Timestepping scheme" which is the recommended way of running the model.
+
The UKCA tutorial job is set to "Single call" which is the standard way of running the UM
In this configuration the UM has a single call to the radiation scheme every radiation timestep (here 3 hours)
+
with a single call to the radiation scheme every radiation timestep (here one hour).
  +
You see there is a 2nd option there to select "Diagnose radiative forcings".
with a 2nd reduced-call being applied on other timesteps (for more details see Manners et al., QJRMS 2009).
 
  +
Selecting this option activates the ''double-call'' approach where the radiation scheme
The ''single-call'' option is the same as the Timestepping scheme but does not apply the reduced radiation
 
  +
is called twice on each radiation timestep once with the forcing agent and
call on interim timesteps.
 
  +
once without it.
   
The other option supported here is to select "Diagnose radiative forcings" which activates the ''double-call''
+
With this option, the idea is that the user can then isolate the difference is
approach where the radiation scheme is called twice on each radiation timestep with and without the forcing agent.
+
the radiative fluxes (i.e. the forcing) due to a particular forcing agent of
  +
interest. There are a host of additional settings that become available when
  +
you select this option setting exactly which forcings to isolate via the
  +
difference between the main call and the 2nd call.
   
By default, if one selects the ''Diagnose radiative forcings'' option, then the model diagnoses the radiative
+
The default approach for this ''Diagnose radiative forcings'' option, involves
  +
the model diagnosing the radiative forcing based on the flux-difference being
forcing based on the ''advancing call'' including the forcing agent as usual, and the species is set to zero
 
in the 2nd ''diagnostic call'' to the radiation.
+
between the ''advancing call'' including the radiative effects of the forcing
  +
agent (as usual), and the 2nd ''diagnostic call'' to the radiation setting
  +
that species concentration to zero (or not including its effects in the
  +
radiative transfer calculations).
   
  +
These additional settings for the diagnostic call are set in three of the
This operation is applied via the ''SLWForc'' panel which
 
  +
sub-panels of this ''Section 1 - 2: Radiation'' part of the Rose GUI.
is available after selecting the ''Gen2'' follow-on window. See that it is possible to individually select
 
  +
First it can be seen that there are "SW second call" and "LW second call"
each of the CLASSIC aerosol types to diagnose their radiative effects whereas for GLOMAP-mode it only
 
  +
panels that become active. There is also a separate ''Diagnostic forcing''
makes sense to diagnose the effects over all the types considered since the different types become internally
 
  +
panel for setting the precise arrangement for this second call to the
mixed within each size class. Note that the user needs to be very careful to specify exactly how the effects
 
  +
radiation. In this separate panel it is possible to individually (or multiply)
should be applied in the second radiation call and this is specified in the ''Call2'' follow-on window.
 
  +
select the CLASSIC aerosol types to diagnose their radiative effects.
  +
For GLOMAP-mode it's different in that it only makes sense to diagnose the
  +
effects over all the types considered since the different types are internally
  +
mixed within each size class. The user will likely only want to run these
  +
effects when the settings in the second radiation call match exactly with
  +
those in the first radiation call (so that the difference then indicates
  +
the forcing due to the forcing agent of interest rather than any difference
  +
in settings. If particular experiments as planned, as usual it is recommended
  +
to discuss with the relevant expert(s) within NCAS or the Met Office.
   
  +
As explained above, the default UM setting for the double-call is to set
We strongly recommend only making changes to the default settings after discussing with relevant experts
 
  +
the species mixing ratio to zero in the diagnostic call with the
within NCAS or the Met Office.
 
  +
difference then including any fast feedbacks from the forcing agent
 
  +
in the advancing call. However, it is often very useful to be able to
Although the default UM setting for the double-call is to set the species mixing ratio to zero in the diagnostic
 
call, it is often very useful to be able to suppress the fast feedbacks from the forcing agent in question by
+
suppress the fast feedbacks from the forcing agent in question by
reversing the operation of the double-call including the aerosol radiative effects only in the diagnostic call
+
reversing the operation of the double-call including the aerosol
  +
radiative effects only in the diagnostic call
 
and setting the species mixing ratio to zero in the advancing call.
 
and setting the species mixing ratio to zero in the advancing call.
   
With this ''double-call radiative forcing'' configuration, the difference in radiative fluxes between the two calls
+
With this ''diagnostic double-call radiative forcing'' configuration,
  +
the difference in radiative fluxes between the two calls then
provides the aerosol radiative perturbation with respect to an atmosphere containing no aerosols.
 
  +
provides the aerosol radiative perturbation with respect to an
  +
atmosphere containing no aerosols.
 
One can diagnose the present-day to pre-industrial aerosol radiative forcing by taking the difference between
 
One can diagnose the present-day to pre-industrial aerosol radiative forcing by taking the difference between
 
two parallel double-call simulations with aerosol and precursor emissions set to 1850 and 2000.
 
two parallel double-call simulations with aerosol and precursor emissions set to 1850 and 2000.
Line 107: Line 127:
 
disabled.
 
disabled.
   
To run UM-UKCA with this ''double-call radiative forcing'' configuration, you will need to add an extra FCM
+
Unfortunately, this ''diagnostic double-call'' configuration is not one of
  +
the supported configurations of the v10.4 release job. As a consequence,
branch to the job and also add an extra hand-edit in the UMUI to configure the double-call.
 
  +
to run UM-UKCA with this configuration, you will need to add an
  +
extra FCM branch to the job and also modify the metadata in the
  +
the Rose GUI to enable the option to run configured in this way.
  +
  +
First add the branch. In the fcm_make_um ''app'' go to ''env'' and
  +
then ''Sources''. There you should add an extra entry to add-in the
  +
code-changes from revision 32385 of the following FCM branch:
   
  +
branches/dev/grahammann/vn10.4_updates_for_dblcalaerforc@32385
So first, in the FCM panel, add an entry to point to revision 17632 of the following FCM branch:
 
fcm:um-br/dev/gmann/vn8.4_RADAERupdates_for_dblcalaerforc/src
 
   
  +
The code added in that branch applies a new switch C2C_AER_DIAGCAL
Then, in the hand-edits panel in the UMUI add the hand-edit to configure the double-call:
 
  +
which controls whether the setting of the forcing agent to zero is
~gmann/umui_jobs/hand_edits/vn8.4/c2c_dustADE_glomapADEandAIE1_v84.ed
 
  +
applied on the advancing call (C2C_AER_DIAGCAL will be .TRUE.
  +
because the GLOMAP aerosol is included only in the diagnostic call).
  +
To retain the standard operation of the double-call where the aerosol
  +
is included in the advancing call but set to zero in the diagnostic
  +
call, the C2C_AER_DIAGCAL needs to be set to .FALSE.
   
  +
We need to use new metadata to enable this switch -- and also to
One of the things the hand-edit sets is the value of a switch C2C_AER_DIAGCAL which controls whether the
 
  +
add in a new switch C2C_UKCA_I which controls whether the GLOMAP
setting of the forcing agent to zero is applied on the advancing call or the diagnostic call.
 
  +
indirect effects are included in the diagnostic call or not.
You see that the hand-edit sets C2C_AER_DIAGCAL to .TRUE. so that the forcing agent
 
is set to zero on the diagnostic call.
 
   
  +
Just like in the last task, this requires to point the Rose GUI
When the double-call forcing configuration is selected in the SW (or LW) radiation panels it
 
  +
to a new rose-meta.conf file within a separate directory outside
synchronises to the setting in the LW (or SW) panel and a submitted job adds a series of other ''C2C'' switches
 
  +
the FCM branch.
to the ''RADFCDIA'' namelist in the file CNTLATM according to the buttons selected in the ''SLWForc'' panel.
 
   
  +
In the Rose GUI click on the ''um'' word and you'll see that
In our ''double-call forcing'' job however, we will keep the ''SLWForc" UMUI panel unchanged with all
 
  +
there is already a separate metadata file specified in that
C2C switched set to be false.
 
  +
job which is set to point to:
   
  +
/home/grenville/meta/ga7_vn10.4
Instead we are using the above hand-edit to set the values of the C2C switches in CNTLATM.
 
   
  +
I have prepared a modified version of this that enables the extra
If you view the c2c_dustADE_glomapADEandAIE1_v84.ed hand-edit you see it changes the C2C_DUST_D,
 
C2C_UKCA_D and C2C_UKCA_I switches to be true so that the model is configured to diagnose the
+
C2C_AER_DIAGCAL and C2C_UKCA_I switches to be selected in the Rose GUI.
  +
So change the file path to instead point to this one:
flux-difference (forcing) based on including the direct radiative effects from the total of the
 
CLASSIC simulated dust combined with the direct and (1st) indirect effects from the GLOMAP
 
simulated aerosol properties.
 
   
  +
/home/gmann/meta/ga7_vn10.4_dblcalaerforc
Configuring the radiation scheme for the double-call requires more than just selecting the
 
''Diagnose radiative forcings'' option.
 
   
  +
After you have done this, there will be 2 additional buttons
You will need to update your job making also the following changes:
 
  +
available in the ''Diagnostic forcing'' panel to allow the user
  +
to select the C2C_AER_DIAGCAL and C2C_UKCA_I switches.
   
  +
We want to use this diagnostic call configuration and we want to
First, in the SW radiation window change the ''Number of times a day ot calculate increments (Diagnostic)''
 
  +
have the forcing be including both the direct and indirect effects
from 24 to 8. This reverts the diagnostic call to only be carried out on radiation timesteps (3 hourly)
 
  +
from the GLOMAP aerosol -- so set C2C_UKCA_D and C2C_UKCA_I to
rather than every hour as the reduced-radiation-call was applied in the timestepping configuration.
 
  +
be .TRUE. You should also set the C2C_DUST_D switch to be true
Make the same change in the ''Section 2: LW radiation window''.
 
  +
so that the model is then calculating the overall aerosol
  +
radiative effects (including both aerosol direct and indirect
  +
effects with the aerosol consisting of the total of the 6 CLASSIC
  +
dust bins plus the GLOMAP aerosol modes). All the other C2C
  +
switches in that panel should be set to .FALSE.
   
  +
You will also need to update your job to make sure all the settings
Second, in the "Gen2" follow-on window for the SW radiation, change the ''Diagnostic File'' to be the same
 
  +
are identical between the diagnostic call and prognostic call
shortwave spectral file as for the ''Prognostic File''. I.e. change ''spec_sw_cloud3_0'' to ''spec_sw_ga3_0''.
 
  +
(in terms of the methods for specifying the clouds and which
Do the same for the ''Gen2'' follow-on window under the LW radiation panel changing the ''Diagnostic File''
 
  +
other forcing agents are included or not).
from ''spec_lw_cloud3_0'' to ''spec_lw_ga3_0''.
 
   
  +
UP TO HERE.
Finally, in the ''Call2'' follow-on window (from the SW or LW Radiation panels) the radiation settings
 
for the double-call need to be set to match those used in the main model.
 
In order to achieve this, in the make the following changes:
 
* change the ''method for representing horizontal water content variability'' from ''Homogeneous'' to ''McICA''.
 
* change the ''option for overlapping clouds'' from ''Maximum-random'' to ''Exponential-random''.
 
* switch on the button to include SW absorption by O2
 
* switch on the buttons to include LW absorption by CFC113, CFC114, CFC11, CFC12, HCFC22, HCFC125, HFC134A, CH4 and N2O.
 
   
 
All that remains then is to add in the extra STASH requests for the double-call forcing diagnostics and
 
All that remains then is to add in the extra STASH requests for the double-call forcing diagnostics and

Revision as of 10:52, 6 January 2017

UKCA Chemistry and Aerosol Tutorials at vn10.4

What you will learn in this Tutorial

In this tutorial you will learn about how to quantify the radiative effects of aerosol simulated by GLOMAP-mode in UM-UKCA.

In the first task you will update your copy of the UKCA tutorial job to request radiative fluxes allowing the radiative flux perturbation (or effective radiative forcing) to be diagnosed based on difference in the fluxes between a pair of UM-UKCA jobs with some difference (e.g. pre-industrial and present-day emissions jobs).

The second task involves configuring a copy of the UKCA tutorial job to run in double-call configuration whereby the aerosol radiative effects can be diagnosed at each radiation timestep.

Task 12.1: Update your copy of the UKCA tutorial job to diagnose Top Of the Atmosphere (TOA) radiative fluxes

In this task you will add STASH requests for SW and LW outgoing radiative fluxes at the top of the atmosphere to enable the radiative forcing from a particular change to be diagnosed.

The user should note however that to illustrate the task we are adding these requests to the UKCA tutorial job which is just a 1-day simulation.

One would need to average the flux-difference between the pair of simulations over an appropriate timescale (e.g. multi-annual monthly-means) in order to diagnose an effective radiative forcing appropriately.

Noting the above caveat, proceed and add daily-mean STASH requests for section 1 item 208 (all-sky outgoing short wave flux at the top-of-the-atmosphere) and section 2 item 205 (all-sky outgoing long wave flux at the top-of-the-atmosphere) to the updated copy of the UKCA tutorial suite you produced in Task 10 after adding AOD and OM diags (the reference job for this is u-ai830).

The radiative fluxes are 2-dimensional diagnostics (longitude by latitude) so you should use the DIAG domain profile in this case. For daily-means use the TDAYM time profile. Again, since we require the daily-mean fluxes to be output to the .pa file you should request the diagnostics with the UPK usage profile.

The Figure below shows the daily-mean SW and LW all-sky TOA radiative flux fields from the UKCA tutorial job for 1st September 1999 (produced by gmann job u-ai902, which updated from u-ai830 by adding in the requests).

Ai902 SWandLWallskyTOAfluxes.jpg

Example Output

Example output for Task12.1 can be found on ARCHER in the following directory:

/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Task12.1

Task 12.2 Configure the UKCA tutorial job to run as a double-call job diagnosing aerosol radiative effects

In this task you will copy the copy of the standard tutorial job you used in Task 12.1 (u-ai830) and configure it to run with double-call to the radiation scheme to diagnose the radiative effects of the aerosol simulated by GLOMAP in UM-UKCA.

The UM has been coded to allow the user to diagnose radiative effects of a particular forcing agent by calling the radiation scheme twice with one of the calls setting the agent's concentration to zero. Special forcing STASH items are included within the UM which store the difference in the radiative fluxes between the two radiation calls.

In the um app in the Rose GUI go to namelist --> UM Science Settings and then choose Section 1 - 2: Radiation.

In the General Options panel, you see that at the top there is an i_rad_extra_call "Options for multiple calls to radiation" button-selector.

The UKCA tutorial job is set to "Single call" which is the standard way of running the UM with a single call to the radiation scheme every radiation timestep (here one hour). You see there is a 2nd option there to select "Diagnose radiative forcings". Selecting this option activates the double-call approach where the radiation scheme is called twice on each radiation timestep once with the forcing agent and once without it.

With this option, the idea is that the user can then isolate the difference is the radiative fluxes (i.e. the forcing) due to a particular forcing agent of interest. There are a host of additional settings that become available when you select this option setting exactly which forcings to isolate via the difference between the main call and the 2nd call.

The default approach for this Diagnose radiative forcings option, involves the model diagnosing the radiative forcing based on the flux-difference being between the advancing call including the radiative effects of the forcing agent (as usual), and the 2nd diagnostic call to the radiation setting that species concentration to zero (or not including its effects in the radiative transfer calculations).

These additional settings for the diagnostic call are set in three of the sub-panels of this Section 1 - 2: Radiation part of the Rose GUI. First it can be seen that there are "SW second call" and "LW second call" panels that become active. There is also a separate Diagnostic forcing panel for setting the precise arrangement for this second call to the radiation. In this separate panel it is possible to individually (or multiply) select the CLASSIC aerosol types to diagnose their radiative effects. For GLOMAP-mode it's different in that it only makes sense to diagnose the effects over all the types considered since the different types are internally mixed within each size class. The user will likely only want to run these effects when the settings in the second radiation call match exactly with those in the first radiation call (so that the difference then indicates the forcing due to the forcing agent of interest rather than any difference in settings. If particular experiments as planned, as usual it is recommended to discuss with the relevant expert(s) within NCAS or the Met Office.

As explained above, the default UM setting for the double-call is to set the species mixing ratio to zero in the diagnostic call with the difference then including any fast feedbacks from the forcing agent in the advancing call. However, it is often very useful to be able to suppress the fast feedbacks from the forcing agent in question by reversing the operation of the double-call including the aerosol radiative effects only in the diagnostic call and setting the species mixing ratio to zero in the advancing call.

With this diagnostic double-call radiative forcing configuration, the difference in radiative fluxes between the two calls then provides the aerosol radiative perturbation with respect to an atmosphere containing no aerosols. One can diagnose the present-day to pre-industrial aerosol radiative forcing by taking the difference between two parallel double-call simulations with aerosol and precursor emissions set to 1850 and 2000. All other forcing agents, such as greenhouse gases or land-use change, remain fixed at a reference time period.

Often nudging to meteorological re-analysis winds and temperatures is applied in tandem with the double-call configuration in which case the composition-climate model is being run in a similar way to an offline chemistry-transport model. This approach has been used extensively in aerosol forcing intercomparisons (e.g. the AeroCom direct forcing experiments, Myhre et al., 2013, ACP) with the radiative forcings diagnosed from each model with fast feedbacks disabled.

Unfortunately, this diagnostic double-call configuration is not one of the supported configurations of the v10.4 release job. As a consequence, to run UM-UKCA with this configuration, you will need to add an extra FCM branch to the job and also modify the metadata in the the Rose GUI to enable the option to run configured in this way.

First add the branch. In the fcm_make_um app go to env and then Sources. There you should add an extra entry to add-in the code-changes from revision 32385 of the following FCM branch:

branches/dev/grahammann/vn10.4_updates_for_dblcalaerforc@32385

The code added in that branch applies a new switch C2C_AER_DIAGCAL which controls whether the setting of the forcing agent to zero is applied on the advancing call (C2C_AER_DIAGCAL will be .TRUE. because the GLOMAP aerosol is included only in the diagnostic call). To retain the standard operation of the double-call where the aerosol is included in the advancing call but set to zero in the diagnostic call, the C2C_AER_DIAGCAL needs to be set to .FALSE.

We need to use new metadata to enable this switch -- and also to add in a new switch C2C_UKCA_I which controls whether the GLOMAP indirect effects are included in the diagnostic call or not.

Just like in the last task, this requires to point the Rose GUI to a new rose-meta.conf file within a separate directory outside the FCM branch.

In the Rose GUI click on the um word and you'll see that there is already a separate metadata file specified in that job which is set to point to:

/home/grenville/meta/ga7_vn10.4

I have prepared a modified version of this that enables the extra C2C_AER_DIAGCAL and C2C_UKCA_I switches to be selected in the Rose GUI. So change the file path to instead point to this one:

/home/gmann/meta/ga7_vn10.4_dblcalaerforc

After you have done this, there will be 2 additional buttons available in the Diagnostic forcing panel to allow the user to select the C2C_AER_DIAGCAL and C2C_UKCA_I switches.

We want to use this diagnostic call configuration and we want to have the forcing be including both the direct and indirect effects from the GLOMAP aerosol -- so set C2C_UKCA_D and C2C_UKCA_I to be .TRUE. You should also set the C2C_DUST_D switch to be true so that the model is then calculating the overall aerosol radiative effects (including both aerosol direct and indirect effects with the aerosol consisting of the total of the 6 CLASSIC dust bins plus the GLOMAP aerosol modes). All the other C2C switches in that panel should be set to .FALSE.

You will also need to update your job to make sure all the settings are identical between the diagnostic call and prognostic call (in terms of the methods for specifying the clouds and which other forcing agents are included or not).

UP TO HERE.

All that remains then is to add in the extra STASH requests for the double-call forcing diagnostics and to note a change to the operation of the Aerosol Optical Depth diagnostics.

The approach taken to index the STASH numbers for the radiative forcing items (the flux-difference between the two radiation calls) is to apply an offset of +200 to the item number to the corresponding item for the conventional radiative fluxes.

In task 12.1 we added STASH requests for the all-sky TOA outgoing SW and LW radiative fluxes which are referenced in STASH as section 1 item 208 and section 2 item 205.

To request the all-sky TOA outgoing SW and LW radiative forcings (between the two radiation calls) the corresponding item numbers are section 1 item 408 and section 2 item 405. Unfortunately however, at UM v8.4, section 2 item 405 is not available from the UMUI. In this task we will therefore request instead the clear-sky TOA outgoing SW and LW radiative forcing diagnostics (section 1 item 409 and section 2 item 406). Note also that one needs to request both the radiation flux and radiation forcing diagnostic in these runs so you should add 4 daily-mean STASH requests for section 1 items 209 and 409 and section 2 items 206 and 406.

Go to the STASH Specification of Diagnostic requirements window and add the daily-mean (TDAYM) requests for both of these flux-forcing pairs of diagnostics. As in Task 10.1, the domain profile should be set as DIAG and the usage profile as UPA.

Since we have now configured the model to run with GLOMAP aerosol set to zero in the advancing call, the conventional AOD diagnostics introduced in tutorial 10 (section 2 items 300 to 305) will now contain zero values when the model is run.

The UM therefore has a second set of AOD diagnostics giving the aerosol optical depth as calculated in the diagnostic call.

The approach for the double-call AOD diagnostics is the same as for the forcing diags, i.e. to apply an offset of +200 to the item number to find the corresponding AOD item in the diagnostic call.

The double-call GLOMAP AOD diagnostics are therefore found in section 2 items 500 to 505.

At v8.4 it is necessary to add an extra user-STASHmaster file to enable these STASH items to be requested in the job. In the User-STASHmaster files. Diags, Progs & Ancils window off the STASH panel you need to add in the following file

 ~gmann/stashfiles/dblecall_aods_only.stash

You will also need to add the hand-edit

~gmann/umui_jobs/hand_edits/vn8.4_nosulphateAOD.ed

which removes the CLASSIC sulphate AOD as it causes a crash in the double-call forcing configuration. You should also remove this STASH number (2-284) as well as the mineral dust optical depth (2-285) from the STASH requests panel. This causes a crash on ARCHER, but not on MONSooN.

If you view that file you see that as well as providing the STASH settings for the GLOMAP double-call AOD diagnostics for each mode, it also provides the information to the UMUI to allow double-call AOD diagnostics to be requested for each of the CLASSIC aerosol types.

Once you have have added the dblecall_aods_only.stash user-STASHmaster file you should proceed to the STASH Specification of Diagnostic requirements window and add daily-mean (TDAYM) requests for the double-call GLOMAP AODs (section 2 items 500 to 505) with usage profile UPA and domain profile DIAG_AOT.

The simulation will then output daily-mean SW and LW clear-sky forcings and double-call AOD diagnostics to the .pa file for your UM-UKCA job.

The Figure below shows daily-mean TOA SW-clearsky and LW-clearsky radiative effect fields for the double-call-modified version of the UKCA tutorial (gmann job xkwhi).

Idl dailyTOAradforcings SWclearsky LWclearsky xkwhi.jpg

Worked Solution

A worked solution to Task 12.2 can be found in job xjrnn. Sample output from a copy of this job can be found on ARCHER in the directory

/work/n02/n02/ukca/Tutorial/vn8.4/sample_output/Task12.2


Written by Graham Mann 2016