Retrieve a large number of model outputs using Globus within CyberGIS-Compute

This notebook demonstrates how to use Globus within CyberGIS-Compute to retrieve a large amount of outputs generated by a model executed on HPC, which is often needed for postprocessing work performed on CJW. A new “data transfer” job type is provided for moving data from HPC back to the CJW Jupyter environment. Under the hood, this new job type utilizes the Globus service (https://www.globus.org/) to perform a point-to-point data transfer between HPC and CJW.

In this demo, we will first prepare a 60-member ensemble SUMMA mode and submit it to the XSEDE Expanse HPC for execution using the CyberGIS-Compute. When the model run is finished, we won't use the regular "download" function in the Compute SDK to retrieve the results. Instead, we submit another Globus job to the Compute, which will hand it off to the Globus scheduler and monitor the process (just like talking Slurm scheduler on HPC in the case of regular model submission). Please refer to the example notebook below for more details.

Globus in CyberGIS-Compute

FYI, a deeper integration of Globus in the Compute is under active development, which will build automatic bi-directional data transfer between HPC and CJW Jupyter (or any accessible Globus endpoints) into regular model submission (eliminating the need to submit a separate “data transfer” job);

Create an ensemble SUMMA model

Get model template form HydroShare

For more info on this resource https://www.hydroshare.org/resource/13d6b84a9553410297a67fa366a56cb2/

In [1]:
resource_id = '13d6b84a9553410297a67fa366a56cb2'
In [2]:
import json
import os
from hs_restclient import HydroShare, HydroShareAuthBasic
auth = HydroShareAuthBasic("cybergis", "demo")
hs = HydroShare(auth=auth)
base_dir = "/home/jovyan/work"
download_dir = os.path.join(base_dir, 'Downloads')
!mkdir -p {download_dir}
hs.getResource(resource_id, destination=download_dir, unzip=True)
In [3]:
#Unzip model file
model_folder_name = "SummaModel_ReynoldsAspenStand_StomatalResistance"
content_folder = os.path.join(download_dir ,"{}/{}/data/contents".format(resource_id, resource_id))
file_manager_rel_path = "settings/summa_fileManager_riparianAspenSimpleResistance.txt"
import tempfile
workspace_dir = os.path.join(base_dir, 'workspace')
!mkdir -p {workspace_dir}
unzip_dir = tempfile.mkdtemp(dir=workspace_dir)
!cd {content_folder} && unzip -o {model_folder_name}.zip -d {unzip_dir}
print("Unzipping Done")
Archive:  SummaModel_ReynoldsAspenStand_StomatalResistance.zip
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/forcingData/
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/forcingData/forcing_above_aspen.nc  
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/
 extracting: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.cpg  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.dbf  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.prj  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.sbn  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.sbx  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.shp  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.shp.xml  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/Reynolds_Creek_watershed_wgs84.shx  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/gis/study_area.jpg  
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/validationData/
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/data/validationData/ReynoldsCreek_eddyFlux.nc  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/installTestCases_local.sh  
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/output/
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/GENPARM.TBL  
   creating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/dos2unix.sh  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/Model_Output.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zBasinModelVarMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zBasinParamMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zCategoryMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zForceMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zLocalAttributeMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zLocalModelIndexMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zLocalModelVarMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zLocalParamMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zModelIndexMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zParamMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/summa_zTimeMeta.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/meta/var_lookup.f90  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/MPTABLE.TBL  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/SOILPARM.TBL  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_fileManager_riparianAspenSimpleResistance.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zBasinParamInfo.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zDecisions_riparianAspenSimpleResistance.txt  
 extracting: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zForcingFileList_riparianAspen.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zForcingInfo_riparianAspen.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zInitialCond.nc  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zLocalAttributes_riparianAspen.nc  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zLocalParamInfo.txt  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_zParamTrial_riparianAspen.nc  
  inflating: /home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/VEGPARM.TBL  
Unzipping Done
In [4]:
model_source_folder_path = os.path.join(unzip_dir, model_folder_name)
!cd {model_source_folder_path} && chmod +x ./installTestCases_local.sh
!cd {model_source_folder_path} && ./installTestCases_local.sh
TestCases installed

Use pySUMMA to build ensembles

In [5]:
import pysumma as ps
import os

executable = "/usr/bin/summa.exe"
! {executable} --version

# path to the SUMMA filemanager file on Jupyter
file_manager = os.path.join(model_source_folder_path, file_manager_rel_path)
print(file_manager)
/bin/bash: /usr/bin/summa.exe: No such file or directory
/home/jovyan/work/workspace/tmpwgx81rjk/SummaModel_ReynoldsAspenStand_StomatalResistance/settings/summa_fileManager_riparianAspenSimpleResistance.txt
In [6]:
# Create pySUMMA Simulation Object
S = ps.Simulation(executable, file_manager)

# Configure the model
S.manager['simStartTime'].value  = "2006-07-01 00:00"
S.manager['simEndTime'].value = "2007-09-30 00:00"
# Save configiuration to disk
S.manager.write()
print(S.decisions)
soilCatTbl    ROSETTA              ! soil-category dataset
vegeParTbl    USGS                 ! vegetation-category dataset
soilStress    NoahType             ! choice of function for the soil moisture control on stomatal resistance
stomResist    simpleResistance     ! choice of function for stomatal resistance
num_method    itertive             ! choice of numerical method
fDerivMeth    analytic             ! choice of method to calculate flux derivatives
LAI_method    specified            ! choice of method to determine LAI and SAI
f_Richards    mixdform             ! form of Richards equation
groundwatr    noXplict             ! choice of groundwater parameterization
hc_profile    constant             ! choice of hydraulic conductivity profile
bcUpprTdyn    nrg_flux             ! type of upper boundary condition for thermodynamics
bcLowrTdyn    zeroFlux             ! type of lower boundary condition for thermodynamics
bcUpprSoiH    liq_flux             ! type of upper boundary condition for soil hydrology
bcLowrSoiH    drainage             ! type of lower boundary condition for soil hydrology
veg_traits    CM_QJRMS1988         ! choice of parameterization for vegetation roughness length and displacement height
canopyEmis    difTrans             ! choice of parameterization for canopy emissivity
snowIncept    lightSnow            ! choice of parameterization for snow interception
windPrfile    logBelowCanopy       ! choice of canopy wind profile
astability    louisinv             ! choice of stability function
canopySrad    BeersLaw             ! choice of method for canopy shortwave radiation
alb_method    varDecay             ! choice of albedo representation
compaction    anderson             ! choice of compaction routine
snowLayers    CLM_2010             ! choice of method to combine and sub-divide snow layers
thCondSnow    jrdn1991             ! choice of thermal conductivity representation for snow
thCondSoil    mixConstit           ! choice of thermal conductivity representation for soil
spatial_gw    localColumn          ! choice of method for spatial representation of groundwater
subRouting    timeDlay             ! choice of method for sub-grid routing
In [7]:
import numpy as np
import json
# create ensemble
# different parameterizations
# 0, 0.05, 0.1 .... 0.95, 1.0
l = list(map(lambda i: round(i*0.01, 2), range(0, 100, 5)))
param_options = {
    'rootDistExp': np.array(l)
}
# different parameterizations
decision_options = {
    "stomResist": ["BallBerry", "Jarvis", "simpleResistance"]
}

config = ps.ensemble.total_product(dec_conf=decision_options, param_trial_conf=param_options)

with open(os.path.join(model_source_folder_path, 'summa_options.json'), 'w') as outfile:
    json.dump(config, outfile)

# check ensemble parameters    
print("Number of ensemble runs: {}".format(len(config)))
print(json.dumps(config, indent=4, sort_keys=True)[:800])
print("...")
Number of ensemble runs: 60
{
    "++BallBerry++rootDistExp=0.0++": {
        "attributes": {},
        "decisions": {
            "stomResist": "BallBerry"
        },
        "parameters": {},
        "trial_parameters": {
            "rootDistExp": 0.0
        }
    },
    "++BallBerry++rootDistExp=0.05++": {
        "attributes": {},
        "decisions": {
            "stomResist": "BallBerry"
        },
        "parameters": {},
        "trial_parameters": {
            "rootDistExp": 0.05
        }
    },
    "++BallBerry++rootDistExp=0.1++": {
        "attributes": {},
        "decisions": {
            "stomResist": "BallBerry"
        },
        "parameters": {},
        "trial_parameters": {
            "rootDistExp": 0.1
        }
    },
    "++BallBerry++rootDistExp=0.15++": {
        "attributes": {},
   
...

Submit model to HPC using CyberGIS-Compute SDK

In [8]:
from job_supervisor_client import *

communitySummaSession = Session('summa', isJupyter=True)
In [9]:
communitySummaJob = communitySummaSession.job() # create new job
In [10]:
communitySummaJob.upload(model_source_folder_path)
Out[10]:
{'file': '1630438143mr8X'}
In [11]:
communitySummaJob.submit(payload={
    "node": 60,
    "machine": "expanse",
    "file_manager_rel_path": file_manager_rel_path
})
✅ job registered with ID: 1630438143BVJK
Out[11]:
<job_supervisor_client.Job.Job at 0x7fcaa27ac310>
In [12]:
communitySummaJob.events(liveOutput=True)
📮Job ID: 1630438143BVJK
📍Destination: summa

types message time
JOB_QUEUED job [1630438143BVJK] is queued, waiting for registration 2021-08-31T19:29:03.376Z
JOB_REGISTERED job [1630438143BVJK] is registered with the supervisor, waiting for initialization2021-08-31T19:29:10.507Z
SUMMA_HPC_CONNECTEDconnected to HPC 2021-08-31T19:29:38.104Z
SUMMA_HPC_SUBMITTEDsubmitted SUMMA job to HPC 2021-08-31T19:29:38.104Z
JOB_INITIALIZED initialized SUMMA job in HPC job queue with remote_id 5568313 2021-08-31T19:29:38.104Z
JOB_STATUS RUNNING 2021-08-31T19:29:44.771Z
JOB_STATUS RUNNING 2021-08-31T19:29:54.756Z
JOB_STATUS RUNNING 2021-08-31T19:30:07.756Z
JOB_STATUS RUNNING 2021-08-31T19:30:14.803Z
JOB_STATUS RUNNING 2021-08-31T19:30:24.806Z
JOB_STATUS RUNNING 2021-08-31T19:30:35.134Z
JOB_STATUS RUNNING 2021-08-31T19:30:44.838Z
JOB_STATUS RUNNING 2021-08-31T19:30:54.732Z
JOB_STATUS RUNNING 2021-08-31T19:31:06.282Z
JOB_STATUS RUNNING 2021-08-31T19:31:14.867Z
JOB_STATUS RUNNING 2021-08-31T19:31:24.742Z
JOB_STATUS RUNNING 2021-08-31T19:31:34.751Z
JOB_STATUS RUNNING 2021-08-31T19:31:44.743Z
JOB_STATUS RUNNING 2021-08-31T19:31:54.808Z
JOB_ENDED SUMMA job with remote_id 5568313 completed 2021-08-31T19:32:56.489Z

We will skip the regular "download' function

In [13]:
# job_dir = os.path.join(workspace_dir, "{}".format(communitySummaJob.id))
# !mkdir -p {job_dir}/output
# communitySummaJob.download(job_dir)

Submit a Globus job to retrieve the mode outputs

Check on the Job ID for the SUMMA model executed above
In [14]:
communitySummaJob.id
Out[14]:
'1630438143BVJK'
Prepare for a Globus job
In [15]:
summa_job_dir = os.path.join(workspace_dir, "{}".format(communitySummaJob.id))
globus_job_dir = os.path.join(summa_job_dir, "globus_{}".format(str(int(time.time()))))
globus_output_dir = os.path.join(globus_job_dir, "output")
!mkdir -p {globus_output_dir}
In [16]:
job_folder_name_hpc="SUMMA_{}".format(communitySummaJob.id)
jupyter_output_rel_path = globus_output_dir.replace("/home/jovyan/work/", "")
globus_job_json= dict(jupyter_user=os.environ["JUPYTERHUB_USER"], 
            hpc="expanse", 
            job_folder_name=job_folder_name_hpc, 
            jupyter_output_path=jupyter_output_rel_path)
globus_job_json_path = os.path.join(globus_job_dir, "globus.json")
with open(globus_job_json_path, 'w') as outfile:
    json.dump(globus_job_json, outfile)
In [17]:
! cat {globus_job_json_path}
{"jupyter_user": "drew", "hpc": "expanse", "job_folder_name": "SUMMA_1630438143BVJK", "jupyter_output_path": "workspace/1630438143BVJK/globus_1630438376/output"}
In [18]:
globus_session = Session("globus", isJupyter=True)
globus_job = globus_session.job()
globus_job.upload(globus_job_dir)
Out[18]:
{'file': '1630438378hSsf'}
Submit the Globus job and monitor progress
In [19]:
globus_job.submit()
# monitor job execution
globus_job.events(liveOutput=True)
📮Job ID: 1630438379KRBz
📍Destination: globus

types message time
JOB_QUEUED job [1630438379KRBz] is queued, waiting for registration 2021-08-31T19:32:58.551Z
JOB_REGISTERED job [1630438379KRBz] is registered with the supervisor, waiting for initialization 2021-08-31T19:33:00.516Z
JOB_INITIALIZED1630438379KRBz (Globus task id 47f7acb6-0a92-11ec-ab89-f9f234773e04; label 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK)2021-08-31T19:33:14.482Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:33:21.578Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:33:32.165Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:33:42.325Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:33:52.246Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:34:02.200Z
JOB_STATUS ACTIVE (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:34:11.958Z
JOB_ENDED SUCCEEDED (1630438379KRBz ; 47f7acb6-0a92-11ec-ab89-f9f234773e04 ; 1630438379KRBz_expanse_drew_SUMMA_1630438143BVJK) 2021-08-31T19:34:21.667Z
Check the data transferred back to CJW
In [20]:
!du {globus_output_dir} -h
5.4M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/data/forcingData
336K	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/data/gis
25M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/data/validationData
31M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/data
208K	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/settings/meta
368K	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/settings
684M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X/output
715M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output/1630438143mr8X
715M	/home/jovyan/work/workspace/1630438143BVJK/globus_1630438376/output
In [21]:
!ls {globus_output_dir}/1*/output -al
total 700380
drwxr-xr-x 2 jovyan 1000    12288 Aug 31 19:34  .
drwxr-xr-x 5 jovyan 1000     4096 Aug 31 19:34  ..
-rw-r--r-- 1 jovyan 1000       82 Aug 31 19:34  runinfo.txt
-rw-r--r-- 1 jovyan 1000    37700 Aug 31 19:34  slurm-5568313.out
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.05++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.0++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.15++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.1++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.25++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.2++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.35++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:33 'vegImpactsTranspire_++BallBerry++rootDistExp=0.3++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.45++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.4++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.55++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.5++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.65++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.6++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.75++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.7++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.85++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.8++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.95++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948349 Aug 31 19:34 'vegImpactsTranspire_++BallBerry++rootDistExp=0.9++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.05++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.0++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.15++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.1++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.25++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.2++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.35++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.3++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.45++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.4++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.55++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.5++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.65++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.6++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.75++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.7++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.85++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.8++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.95++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948346 Aug 31 19:34 'vegImpactsTranspire_++Jarvis++rootDistExp=0.9++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.05++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.0++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.15++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.1++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.25++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.2++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.35++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.3++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.45++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.4++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.55++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.5++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.65++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.6++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.75++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.7++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.85++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.8++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.95++_timestep.nc'
-rw-r--r-- 1 jovyan 1000 11948356 Aug 31 19:33 'vegImpactsTranspire_++simpleResistance++rootDistExp=0.9++_timestep.nc'

Done