Scope of this tutorial

Welcome to the first America's Water Model tutorial! In this tutorial, you are going to learn how to (0) install the model, (1) run the model in simulation and optimization mode with different configurations, (2) look at the results, and (3) make requests of and get updates from the modeling team.

Some terminology

We are going to use a bunch of terms in this tutorial, so it's important to clear up the confusion.

  • The model: A computer program that can provide information on how water is or could be supplied and consumed in the US.
  • Julia: The programming language used for the model. From the Julia website:

    Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments.

  • Jupyter Notebook: A program to make documents, like this one, that combine Julia programming and text.
  • Git: A program that saves all previous versions of the model, and lets the modeling team collaborate. All of these previous versions are stored on the website Github.
  • Terminal: A text interface to your computer, needed to use Git and Jupyter Notebook.
  • Mimi: The foundational code used by the model to provide its structure, developed by David Anthoff.
  • Simulation: A way to run the model, where inputs (or parameters) are used to determine the value of outputs (or variables).
  • Optimization: Another way to run the model, where constraints on outputs (or variables) are used to determine inputs (or parameters).

Installing the model

If you are an advanced user, you can follow the more succinct installation instructions and then skip to "What you just got" below.

Setting up your environment

You will need some basic software to use the America's Water Model.

Now it's time to download the model. First, decide where you want to put the model, and open a terminal to this location.

Aside: How to navigate to the model in the terminal

  1. Opening a terminal. Doing this is different by OS:
    • On Mac OS: Open the Terminal program.
    • On Windows: Open the PowerShell program.
    • On Linux: Open up a shell window.
  2. To change directory, type cd <directory>. <directory> can be any of the following:
    • The name of a subdirectory.
    • Two periods (..) to go to the parent directory.
    • A single period (.) to not go anywhere.
    • Any combination of the above, separated by slashes (/).
    • A tilde (~) to go back to your home directory.
    • A slash (/) to go to the root of the server.
    • Either of the previous two, combined with any of the first four, using slashes.
    • Use the tab key to auto-complete the name you have started to type.
    • If there are spaces in your directory or filename, consider the life choices that led to this moment.
  3. The model will be created in a new folder, when you download it. From then on, for anything from this tutorial, you will want to go into the docs subdirectory of that folder.

Downloading the model

In the directory where you want the model folder, paste the following command:

git clone https://github.com/AmericasWater/awash.git

What you just got

The model is organized into different folders. Here is what is in there:

  • configs/: Configuration files, that determine the basic operation of the model.
  • data/: Input data files. There is also a data/cache/ folder, with saved preparation files. You can delete this to force the model to reinitialize.
  • docs/: Documentation, including tutorials like this one.
  • prepare/: Some source data files and the scripts needed to prepare them for use in the model.
  • results/: The standard location for output results, along with code for post-processing.
  • src/: The main source code for the model. All the magic happens here.
  • test/: Automatic testing scripts, to make sure changes don't break how the model should work.

Opening the model

For the purposes of this tutorial, the main interface of the model is Jupyter Notebooks, and the existing tutorials in the docs/ subdirectory. To start the model, do the following:

  1. Open a terminal to the docs/ subdirectory of the model.
  2. Type/paste the following command: jupyter notebook.
  3. In the browser window that opens, find the item start.ipynb and click on it.
  4. Click the "" button, which will run the line below.

If this is the first time you're running the model, it is going to install some needed libraries and data.


In [1]:
include("../src/nui.jl")


┌──────────────────────────────────────────────────┐
    ▄▄    ▄▄      ▄▄    ▄▄       ▄▄▄▄    ▄▄    ▄▄ 
   ████   ██      ██   ████    ▄█▀▀▀▀█   ██    ██ 
   ████   ▀█▄  ▄█▀   ████    ██▄       ██    ██ 
  ██     ██ ██ ██     ██    ▀████▄   ████████ 
  ██████   ███▀▀███   ██████        ▀██  ██    ██ 
 ▄██  █▄  ███  ███  ▄█  ██▄  █▄▄▄▄▄█▀  ██    ██ 
 ▀▀    ▀▀  ▀▀▀  ▀▀▀  ▀▀    ▀▀   ▀▀▀▀▀    ▀▀    ▀▀ 
└──────────────────────────────────────────────────┘

Welcome to AWASH, the America's Water Model, version 0.7.

Configuration parameters

The configuration file determines the general bounds of the model. The current configuration parameters are:

  • netset: The top-level decision of the world we are deciding.

    options: usa (full-country), three (3-counties), dummy (5-counties)

  • filterstate: Only include counties within this state (give as 2 digit FIPS).

    e.g., "10" for Delaware (3 counties), "08" for Colorado (64 counties)

  • startmonth and endmonth: First and last month of the simulation.

    e.g., 10/2000 - 9/2010

  • startweather: The weather entry to match to startmonth.

    e.g., 1 to use the first month in VIC_WBfor the first month in the simulation.

  • timestep: The number of months for each timestep of the model.

    The larger this number, the faster the model will run. Currently agriculture is calculated separately for each timestep.

Standard configuration sets

There are three configuration sets to know about:

  • complete.yml: A monthly run from 1949 - 2010. This is basically impossible on a laptop.
  • standard.yml: A 6-month timestep run from 2000 - 2010. This is about the maximum practical for a laptop.
  • standard-1year.yml: A 6-month timestep run for 10/2009 - 9/2010 (two timesteps). This is good for testing.
  • single.yml: A 12-month timestep run for 10/2009 - 9/2010 (one timestep). We will use this one here.

Here is what the single.yml configuration looks like:

# Only include counties within this state (give as 2 digit FIPS) # "10" for Delaware (3 counties), "08" for Colorado (64 counties) filterstate: null # Current options: usa (full-country), dummy (5-counties) netset: usa # First and last month of the simulation startmonth: 10/2009 endmonth: 9/2010 # First entry in VIC_WB to include startweather: 720 # Months per time step timestep: 12

Running a simulation

There are three steps for running a simulation:

  1. Select a configuration: Create or select a file in configs/.
  2. Prepare the model: Call prepsimulate("<config filename>");.
  3. Run the prepared model: Call runmodel();

In [2]:
prepsimulate("single.yml");


Loading from saved region network...
WARNING: imported binding for edges overwritten in module Main
Loading from saved water network...
Loading from saved region network...
Creating model...

This loaded up the model geography of the model, put together the sectors, and prepared all of the inputs. Now we can run the model.


In [3]:
runmodel();

Looking at the results of the model

There are lots of ways to see the results of the model, but they all require that you know which variables you want to look at. Start by identifying the component that you are interested, as a box in this image:

Let's consider the Agriculture component. Next, we need to know what variables are available within that component, which we do with the getvariables function.


In [4]:
getvariables(:Agriculture)


Out[4]:
namedims
1rainfedareas(3109,9,1)
2deficit_coeff(3109,9)
3precipitation(3109,1)
4water_demand(9,)
5logirrigatedyield(3109,9,1)
6irrigatedareas(3109,9,1)
7allagarea(3109,1)
8totalirrigation(3109,1)
9production(3109,9,1)
10cultivationcost(3109,9,1)
11water_deficit(3109,9,1)
12lograinfedyield(3109,9,1)
13totalareas(3109,9,1)

The : is important for both the component name and the variable names below.

Then to see the results, call getdata(<component>, <variable>).


In [5]:
getdata(:Agriculture, :production)


Out[5]:
3109x9x1 Array{Float64,3}:
[:, :, 1] =
     0.0            0.0          …      0.0              0.0        
     0.0            0.0                 0.0              0.0        
     0.0            0.0                 0.0              0.0        
     0.0            0.0                 0.0              0.0        
     0.0            0.0                 0.0              0.0        
     0.0        21570.7          …      0.0          33936.2        
     0.0        37424.6                 0.0              0.0        
     0.0            0.0                 0.0          32082.3        
     0.0        32438.7                 0.0           8336.67       
     0.0            0.0                 0.0              3.35729e5  
     0.0            0.0          …      0.0              0.0        
     0.0            9.73389e-23         0.0              0.0        
     0.0            0.0                 0.0              0.0        
     ⋮                           ⋱                                  
 54033.4        42940.9                 0.0              0.0        
     1.10014e5  15292.0                 0.0              0.0        
 30610.1         5819.68                0.0              0.0        
 78542.1        16184.3          …      0.0              0.0        
 40925.4        30863.0                 0.0              0.0        
 78652.4        28882.8                 0.0              0.0        
     0.0            0.0                 0.0              0.0        
 42416.2        26897.1                 0.0              0.0        
  5701.34       12085.1          …      0.0              0.0        
     0.0            0.0                 0.0              0.0        
 26212.3         3313.67            31500.0              0.0        
 10993.2         1075.5                 1.55547e-13      1.28253e-15

To save the data to a file, call savedata(<filename>, <component>, <variable>). The savedata function is best used on 2-D data (or less) and since production is of dimension COUNTY x CROP x TIME, we would like to drop one. We can do this with a fourth argument, which has the syntax for a Matlab index.


In [6]:
savedata("../results/agprod.csv", :Agriculture, :production, (:, :, 1))

Finally, we can plot it. This only works so far for results that describe nation-wide values, but it's a start.


In [7]:
mapdata(:Agriculture, :production, (:, 5, 1))


WARNING: RCall.jl Warning: package ‘ggplot2’ was built under R version 3.2.3
Need help? Try the ggplot2 mailing list:
http://groups.google.com/group/ggplot2.
WARNING: RCall.jl 
-----------------------------------------------------------
PBS Mapping 2.69.76 -- Copyright (C) 2003-2016 Fisheries and Oceans Canada

PBS Mapping comes with ABSOLUTELY NO WARRANTY;
for details see the file COPYING.
This is free software, and you are welcome to redistribute
it under certain conditions, as outlined in the above file.

A complete user guide 'PBSmapping-UG.pdf' is located at 
/Library/Frameworks/R.framework/Versions/3.2/Resources/library/PBSmapping/doc/PBSmapping-UG.pdf

Packaged on 2015-04-23
Pacific Biological Station, Nanaimo

All available PBS packages can be found at
http://code.google.com/p/pbs-software/

To see demos, type '.PBSfigs()'.
-----------------------------------------------------------


WARNING: RCall.jl Loading required package: maptools
Loading required package: sp
Warning: package ‘sp’ was built under R version 3.2.5
Checking rgeos availability: TRUE
Loading required package: foreign
Out[7]:
RCall.RObject{RCall.VecSxp}

In [4]:
using RCall

In [5]:
R"x = rnorm(100)"


Out[5]:
RCall.RObject{RCall.RealSxp}
  [1] -0.62122279  0.64831833 -0.48935885  0.92764611  1.02611765  1.59837396
  [7] -0.96725780 -0.49321665 -1.10164360 -1.33944063  1.31890750  0.25991008
 [13] -0.36737477  0.08100751  0.01820744  0.57968764 -0.83115791 -0.30559390
 [19]  0.82804637  0.87722282 -0.36368721  0.29606504 -0.01717716  0.18193819
 [25]  0.98784232 -0.04729326 -0.76462815 -0.23869830  0.87341128 -0.56540542
 [31]  0.24752053 -0.93169866 -0.01312905  1.17846349  0.26131608  1.81919341
 [37]  1.72917614  0.14759056  0.88830378 -1.09978466  0.01376463 -0.23974337
 [43]  0.20255462 -1.12002824 -0.17669488  0.34420994 -0.46455188  1.14323986
 [49]  0.18923975 -0.17559747 -0.38363851 -1.08267915  1.09002894  0.94087581
 [55] -0.43349359 -0.44734339  3.37063110  1.36829580 -0.44395899 -1.16338533
 [61] -0.97981821  0.20694984 -0.06456482  0.47541359  0.52327356  1.63704958
 [67]  0.32423036  0.49562667 -0.33220034  0.54913155 -0.37544318  0.26960028
 [73]  0.55244578  0.89318511 -0.02618433 -1.09897372  0.95858630  0.87128071
 [79] -0.45338845 -0.44877374  1.78908111 -0.36408830 -0.88978697 -0.99465919
 [85]  0.33044888 -0.37553791 -1.42606459 -0.65207303  0.44036986  0.75407073
 [91] -0.75762170 -0.52891009  0.30297497 -2.11217177 -0.73390772  1.09533811
 [97]  1.34026477  0.26010075  0.97643020  0.18347344

In [6]:
R"hist(x)"


Out[6]:
RCall.RObject{RCall.VecSxp}
$breaks
 [1] -2.5 -2.0 -1.5 -1.0 -0.5  0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5

$counts
 [1]  1  0  8 13 25 22 17  8  5  0  0  1

$density
 [1] 0.02 0.00 0.16 0.26 0.50 0.44 0.34 0.16 0.10 0.00 0.00 0.02

$mids
 [1] -2.25 -1.75 -1.25 -0.75 -0.25  0.25  0.75  1.25  1.75  2.25  2.75  3.25

$xname
[1] "x"

$equidist
[1] TRUE

attr(,"class")
[1] "histogram"

In [7]:
myjuliavar = [1, 2, 3]


Out[7]:
3-element Array{Int64,1}:
 1
 2
 3

In [8]:
myjuliavar


Out[8]:
3-element Array{Int64,1}:
 1
 2
 3

In [9]:
R"plot($myjuliavar)"


Out[9]:
RCall.RObject{RCall.NilSxp}
NULL

In [10]:
x = R"rnorm(100)"


Out[10]:
RCall.RObject{RCall.RealSxp}
  [1] -0.396211276 -1.102864069 -0.273230592 -0.498711128 -1.688747229
  [6] -0.625395697  0.788866194  0.503396481  0.806131966 -0.685962168
 [11]  1.409655399 -0.011001650  1.221350838  0.687594625  0.660120389
 [16]  0.323121302  1.121587552 -0.125611715  1.772632044 -1.576097599
 [21] -0.660744500 -0.429240447 -0.490280026  0.468150307  1.198544526
 [26] -0.583805903 -0.911470531 -0.929171990 -1.592459809  1.008367742
 [31]  1.042998949 -0.182158343 -0.198155519  0.064799689  1.055615930
 [36]  1.396022389  0.363787500 -0.265379634 -0.485115714  0.513091917
 [41] -0.340089246 -0.725946945  0.465066983  0.925172640 -0.499757044
 [46] -0.496244776 -0.946024643 -1.095053418 -1.131125050  1.549266436
 [51] -1.311331940  1.201508605 -0.271954598  2.534004825 -1.623282056
 [56]  0.001984485 -0.509082941  0.023470704 -0.710153768 -1.048219819
 [61]  0.950574020  0.223231617 -1.496654999 -0.660755363 -0.865973022
 [66] -1.125167386 -0.679917414 -1.014248154  1.170601061  1.133173229
 [71]  0.217915251 -0.863843341  0.858204953 -0.204352963 -0.521392645
 [76]  1.510171510  0.598071927  0.638948425  1.397193548 -0.639814179
 [81] -0.860441210 -1.249230094 -2.199530514 -2.121140727  1.295730250
 [86] -0.072618465 -0.489912051 -1.028861139 -0.160846995  0.781161860
 [91] -0.734598252  0.817520424 -1.157498298  0.815970762 -0.476418750
 [96]  0.162498461 -1.002618330  0.975990869 -0.457368921  0.461530679

In [11]:
x


Out[11]:
RCall.RObject{RCall.RealSxp}
  [1] -0.396211276 -1.102864069 -0.273230592 -0.498711128 -1.688747229
  [6] -0.625395697  0.788866194  0.503396481  0.806131966 -0.685962168
 [11]  1.409655399 -0.011001650  1.221350838  0.687594625  0.660120389
 [16]  0.323121302  1.121587552 -0.125611715  1.772632044 -1.576097599
 [21] -0.660744500 -0.429240447 -0.490280026  0.468150307  1.198544526
 [26] -0.583805903 -0.911470531 -0.929171990 -1.592459809  1.008367742
 [31]  1.042998949 -0.182158343 -0.198155519  0.064799689  1.055615930
 [36]  1.396022389  0.363787500 -0.265379634 -0.485115714  0.513091917
 [41] -0.340089246 -0.725946945  0.465066983  0.925172640 -0.499757044
 [46] -0.496244776 -0.946024643 -1.095053418 -1.131125050  1.549266436
 [51] -1.311331940  1.201508605 -0.271954598  2.534004825 -1.623282056
 [56]  0.001984485 -0.509082941  0.023470704 -0.710153768 -1.048219819
 [61]  0.950574020  0.223231617 -1.496654999 -0.660755363 -0.865973022
 [66] -1.125167386 -0.679917414 -1.014248154  1.170601061  1.133173229
 [71]  0.217915251 -0.863843341  0.858204953 -0.204352963 -0.521392645
 [76]  1.510171510  0.598071927  0.638948425  1.397193548 -0.639814179
 [81] -0.860441210 -1.249230094 -2.199530514 -2.121140727  1.295730250
 [86] -0.072618465 -0.489912051 -1.028861139 -0.160846995  0.781161860
 [91] -0.734598252  0.817520424 -1.157498298  0.815970762 -0.476418750
 [96]  0.162498461 -1.002618330  0.975990869 -0.457368921  0.461530679

In [12]:
Pkg.add("YAML")


INFO: Nothing to be done
INFO: METADATA is out-of-date — you may not have the latest version of YAML
INFO: Use `Pkg.update()` to get the latest versions of your packages

In [13]:
countyinfo = readtable("../data/county-info.csv")


Out[13]:
FIPSCountySTNeighboringUrbanPop_2010RuralPop_2010MedianHouseholdInc_2008_12Elevation_ftTotalArea_sqmiLandArea_sqmiWaterArea_sqmi
11001AutaugaAL-1677436972259693513316502292153773290.0604.39594.449.95
21003BaldwinAL-75038066338684180791052057706050706155.02027.311589.78437.53
31005BarbourAL-916236797133958242188441861331889220.0904.52884.8819.64
41007BibbAL-326321509383612395972521566336824224.0626.17622.583.59
51009BlountAL28181440521888282357605156245192870.0650.63644.785.85
61011BullockAL-75283648422130947955307560734500455.0625.14622.82.34
71013ButlerAL726380720519250973960261492130752445.0777.88776.831.05
81015CalhounAL4089652745186409211786173995540093565.0612.29605.876.42
91017ChambersAL1546726499117356153173991681632181745.0603.11596.536.58
101019CherokeeAL360684434412691572737072228236241589.0599.98553.746.28
111021ChiltonAL233621014620953822557853785840834580.0700.8692.857.95
121023ChoctawAL-624832084070423602101385935123350.0920.86913.57.36
131025ClarkeAL-248099468553645567162051962830954405.01252.571238.4614.11
141027ClayAL16527517716713060501393234556745.0606.0603.962.04
151029CleburneAL-6945485711834679467014972372441175.0561.01560.10.91
161031CoffeeAL6132202507106331951263752357344626195.0680.49678.971.52
171033ColbertAL1077010790105928141305372389140158536.0622.13592.6229.51
181035ConecuhAL109901013010390105325201070827064216.0852.72850.162.57
191037CoosaAL630888604850928918101153937425660.0666.35650.9315.42
201039CovingtonAL-7456065813052386533114612630435321260.01043.791030.4613.33
211041CrenshawAL406528719587668132701390637309594.0610.92608.842.08
221043CullmanAL6438249654864425607215175888939244802.0755.02734.8420.18
231045DaleAL3596880842466902597246792557245247470.0562.7561.151.55
241047DallasAL3774141952490839331238211999926178147.0993.8978.6915.11
251049DeKalbAL-701081407554769413701864091368531040.0778.69777.091.59
261051ElmoreAL4377449246493266349363304297355514290.0657.04618.4838.56
271053EscambiaAL395798097235139273113982243373107585.0953.14945.088.06
281055EtowahAL1525514402121635003652863914437660565.0548.63534.9913.64
291057FayetteAL-653145030915431694134081383333090365.0629.36627.661.7
301059FranklinAL776431289076370420593952230937235840.0646.52633.8212.7
&vellip&vellip&vellip&vellip&vellip&vellip&vellip&vellip&vellip&vellip&vellip&vellip

In [14]:
areas = countyinfo[:, :LandArea_sqmi]


Out[14]:
3229-element DataArrays.DataArray{Float64,1}:
  594.44
 1589.78
  884.88
  622.58
  644.78
  622.8 
  776.83
  605.87
  596.53
  553.7 
  692.85
  913.5 
 1238.46
    ⋮   
   23.24
   20.76
  113.53
   27.73
   45.86
   50.77
   35.64
   55.21
   68.19
   83.32
   19.69
   31.31

In [18]:
# The Brewery Component
# This is how we make beer

using Mimi

@defcomp Brewery begin
    region = Index()

    production = Parameter(index=[region, time], unit="liter")

    hopsdemand = Variable(index=[region, time], unit="MT")
    waterdemand = Variable(index=[region, time], unit="1000 m^3")
end

function run_timestep(c::Brewery, tt::Int64)
    v, p, d = getvpd(c)

    v.hopsdemand[:, tt] = .07 * p.production[:, tt]
    v.waterdemand[:, tt] = 2 * p.production[:, tt] / 1e6
end

function initbrewery(m::Model)
    brewery = addcomponent(m, Brewery)

    production = readtable("../data/county-info.csv")[:, :LandArea_sqmi]

    brewery[:production] = repeat(production, outer=[1, numsteps])
end


WARNING: replacing module _mimi_implementation_Brewery
Out[18]:
initbrewery (generic function with 1 method)

In [29]:
m = Model()
setindex(m, :time, [1]) # Single period
setindex(m, :region, length(dropna(readtable("../data/county-info.csv")[:LandArea_sqmi])))

In [31]:
initbrewery(m)


LoadError: MethodError: `convert` has no method matching convert(::Type{DataArrays.DataArray{Float64,1}}, ::Array{Float64,2}, ::BitArray{2})
This may have arisen from a call to the constructor DataArrays.DataArray{Float64,1}(...),
since type constructors fall back to convert methods.
Closest candidates are:
  call{T}(::Type{T}, ::Any)
  convert{S,T,N}(::Type{DataArrays.DataArray{S,N}}, !Matched::DataArrays.DataArray{T,N})
  convert{S,T,R<:Integer,N}(::Type{DataArrays.DataArray{S,N}}, !Matched::DataArrays.PooledDataArray{T,R<:Integer,N})
  ...
while loading In[31], in expression starting on line 1

 in call at essentials.jl:57
 in initbrewery at In[18]:27

In [32]:
brewery = addcomponent(m, Brewery)

    production = readtable("../data/county-info.csv")[:, :LandArea_sqmi]


Out[32]:
3229-element DataArrays.DataArray{Float64,1}:
  594.44
 1589.78
  884.88
  622.58
  644.78
  622.8 
  776.83
  605.87
  596.53
  553.7 
  692.85
  913.5 
 1238.46
    ⋮   
   23.24
   20.76
  113.53
   27.73
   45.86
   50.77
   35.64
   55.21
   68.19
   83.32
   19.69
   31.31

In [33]:
brewery[:production] = repeat(convert(Vector{Float64}, dropna(production)), outer=[1, numsteps])


Out[33]:
3225x1 Array{Float64,2}:
  594.44
 1589.78
  884.88
  622.58
  644.78
  622.8 
  776.83
  605.87
  596.53
  553.7 
  692.85
  913.5 
 1238.46
    ⋮   
   23.24
   20.76
  113.53
   27.73
   45.86
   50.77
   35.64
   55.21
   68.19
   83.32
   19.69
   31.31

In [30]:
function initbrewer(m::Model)
    brewery = addcomponent(m, Brewery)

    production = readtable("../data/county-info.csv")[:, :LandArea_sqmi]

    brewery[:production] = repeat(convert(Vector{Float64}, dropna(production)), outer=[1, numsteps])
end


Out[30]:
initbrewer (generic function with 1 method)

In [34]:
run(m)

In [35]:
m[:Brewery, :hopsdemand]


Out[35]:
3225x1 Array{Float64,2}:
  41.6108
 111.285 
  61.9416
  43.5806
  45.1346
  43.596 
  54.3781
  42.4109
  41.7571
  38.759 
  48.4995
  63.945 
  86.6922
   ⋮     
   1.6268
   1.4532
   7.9471
   1.9411
   3.2102
   3.5539
   2.4948
   3.8647
   4.7733
   5.8324
   1.3783
   2.1917

In [36]:
m[:Brewery, :waterdemand]


Out[36]:
3225x1 Array{Float64,2}:
 0.00118888
 0.00317956
 0.00176976
 0.00124516
 0.00128956
 0.0012456 
 0.00155366
 0.00121174
 0.00119306
 0.0011074 
 0.0013857 
 0.001827  
 0.00247692
 ⋮         
 4.648e-5  
 4.152e-5  
 0.00022706
 5.546e-5  
 9.172e-5  
 0.00010154
 7.128e-5  
 0.00011042
 0.00013638
 0.00016664
 3.938e-5  
 6.262e-5  

In [ ]: