Commit last-minute

This commit is contained in:
francesco-bufalini 2025-08-02 13:46:28 +02:00
parent b4a97a65ab
commit 0ba7189bfc
221 changed files with 139931 additions and 1 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
/bin/
.classpath
.project

View file

@ -1,2 +1,43 @@
# team-8
# BoneMeal
How to run:
- Download Llama 3.1-8B-Instruct
- Insert your HuggingFace token in server.py line 9:
```python
# Insert your HF token here:
login("<HF-token-here>")
```
## Environment Setup for PlantCV & Stable Diffusion
### Why two environments?
- **PlantCV 4.8** requires **NumPy ≥ 2.0**.
- **Stable Diffusion / Diffusers** (which uses Torch, Accelerate, ecc.) requires **NumPy < 2.0** instead.
These requirements are **incompatible in the same Python environment**, so the safest way to work is to have **two separate virtual environments**.
---
## Environment 1 PlantCV (image analysis)
This environment is used for everything AI-free. It requires Anaconda3, but the environment set-up is in the omonymous yamn file
### Create the environment
```bash
conda create -f env.yaml
conda activate myEnv
```
The required modules can be found in the file ```requirements_plantcv.txt".
## 🖼Environment 2 Stable Diffusion (image generation)
This environment is used to generate realistic images (future projections of the plant) based on the JSON produced by PlantCV.
### Create the environment
```bash
python -m venv env_sd
env_sd\Scripts\activate # Windows
source env_sd/bin/activate # Linux/Mac
```
The required modules can be found in the file ```requirements_stableDiff.txt```

Binary file not shown.

Binary file not shown.

BIN
baseImg.jpeg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
controlImg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

95
hydroshoot/.gitignore vendored Normal file
View file

@ -0,0 +1,95 @@
# {# pkglts, github
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# pkglts files
.pkglts/info.log*
# Packages
*.egg
*.egg-info
.eggs
.Python
*.pth
dist/
build/
env/
downloads/
eggs/
parts/
bin/
var/
sdist/
develop-eggs/
.installed.cfg
lib/
lib64/
# editors
.idea/
# Vim files
*.swp
*.*~
# Mr Developer
.mr.developer.cfg
.project
.pydevproject
.settings
# C extensions
*.so
*.dll
*.dylib
# Compiled Static libraries
*.lai
*.la
*.a
# Compiled Object files
*.os
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
.amlog
.sconsign.dblite
# Translations
*.mo
*.pot
# Django stuff:
*.log
# PyBuilder
target/
# jupyter notebooks
.ipynb_checkpoints/
# svn
.svn
# #}
# user custom filters
example/**/output/
**/*.pckl
doc/_build/
# Mac OS
.DS_Store
application_studies/

View file

View file

@ -0,0 +1,61 @@
{
"_pkglts": {
"auto_install": true,
"install_front_end": "stdout",
"use_prompts": false,
"version": 3
},
"base": {
"authors": [
[
"Rami Albasha",
"rami albasha at inra dot fr"
],
[
"Christian Fournier",
"@fournier-ch"
],
[
"Christophe Pradal",
"@pradal"
],
[
"Eric Lebon",
"eric dot lebon at inra dot fr"
]
],
"namespace": null,
"pkgname": "hydroshoot",
"url": null
},
"conda": {},
"data": {},
"doc": {
"description": "HydroShoot is an FSPM model to simulate gas-exchange on vine",
"keywords": []
},
"github": {
"owner": "{{ base.authors[0][0] }}",
"project": "{{ base.pkgname }}",
"url": "https://github.com/openalea-incubator/{{ github.project }}"
},
"license": {
"name": "cecill-c",
"organization": "INRA, CIRAD",
"project": "{{ base.pkgname }}",
"year": 2019
},
"pysetup": {
"intended_versions": [
"27"
],
"require": []
},
"test": {},
"travis": {},
"version": {
"major": 1,
"minor": 0,
"post": 0
}
}

View file

@ -0,0 +1,61 @@
{
".gitignore": {
"github": "MRdLys3vaDL9iwBuZQW4YB3oJ8OwaGJeAHqZDUpPSpGHl0pENcpfsckLl8SPhFIKnodXkYM41AsPFBz5QJQu0w=="
},
".travis.yml": {
"travis": "p39laCS5PHN7gbwAtgU28Z+UXHRifGIORlali3ZkK7OQKjjRhn1Dbwscp76SZeocjKUEBtl3fI1857Ri37wPWQ==",
"travis.addons": "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==",
"travis.after": "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==",
"travis.install": "e95/YtD9DDjev/b0KW6Z1BBd3l3Iqq45t3vSBVZf2L20obvaoginuBglogprMoRmskZK22c4h1dGgTh0NMjQOg==",
"travis.script": "STjpu3u3YoOeTz4mBIflZ58OodPdFRPFtLt6c8CUciNwe/fYhCTxlKTMB/S7VL1ippUsQVIfrFGl+OQ/ALWmPQ=="
},
"AUTHORS.rst": {
"doc": "DkU7oQmldfrfWCnkefErjQUIy4CWPgQKkf/92p+dvBQWx7qyplJ9Ic62obSpr2+hDfw7qN9EiQAPgnm8hzp2/A=="
},
"CONTRIBUTING.rst": {},
"HISTORY.rst": {},
"LICENSE": {
"license": "21ExMhSzB2uXQuU1VoH7++nrb4u6TbesqGtJDpM39OLPWft9SJ2tJ956R6foYmkI9VuJay7SUrhFLPxxMEHLxg=="
},
"MANIFEST.in": {
"pysetup": "nWIhyghfvxUWRjKYpFJPAIr4kSPE2OfU8Zr+1QkiAxzvB0aWoAYyG2V/UnieGhhocdlNaiXL6u8qeKHqUQcO3w=="
},
"README.rst": {
"doc": "LVozszxbm8Mm3f3ePQsmGYR6ID8vUGGE2K+wY6m//7J5q98O4Hn9iKMfAUxtn0OBc09SNmATLWK3c/sNFVrFiA=="
},
"conda_hydroshoot/bld.bat": {},
"conda_hydroshoot/build.sh": {},
"conda_hydroshoot/meta.yaml": {},
"doc/_static/nonempty.txt": {},
"doc/authors.rst": {},
"doc/contributing.rst": {},
"doc/history.rst": {},
"doc/index.rst": {},
"doc/installation.rst": {},
"doc/readme.rst": {},
"doc/usage.rst": {},
"dvlpt_requirements.txt": {
"pysetup": "lCbGKPjPfZaLiwclMKKn7EdCraYOyhNIZcfBdXCFnX8YV/uOTypLRFYBm7uxfWtnSe62wAlYDv/2EzakafsQtw=="
},
"requirements.txt": {
"pysetup": "/5djJXLbrvuFk7LIgtfgYR8RnQrY5BEmOB4zEd0PrKeswR/8sQkzj4yKy7Zl3LAdRzYjPDhWiRkS1oMCG4FX7Q=="
},
"setup.cfg": {
"pysetup": "1iCSDvs9xY0GOgde2dHQdpu5siqLRSbSiVZr6vEMin886x1NKrTLw0f1AJuSUwPfsoXa1a1EfRsDFadXx3Qy8A=="
},
"setup.py": {
"pysetup.call": "2wHuP94SpWKZpqOzExkQGTxnhGPgBHK3qOdPn0Ncstj5FkZ7FBGGM/inqAXaI4QLKQtTNlOUYRGSkYUWAUcf1w==",
"pysetup.kwds": "ZfhY2vTqq3hmvF38eWngpRtF0NPrBH4XtsIyoWye8A18pfhKuxmH9XNJ/cLgiv+qXE5FzAYKepw3Eo81QqyiuQ=="
},
"src/hydroshoot/__init__.py": {
"base": "gR33dW0qqYmsV9NSNB+DD8XmuxnC2t0mKjnMoU5728qh97fSER6MbX+3QKxpZDLByZToaAay4xhx8acxketJmA=="
},
"src/hydroshoot/data_access.py": {
"data": "KypmxgIOSMmeUkbZYMILEM6s9rROkCxyZWmurCgLa2kmxY7eU2wmtvoZOXRrgBQYmhgdOseihPikN/6h2LbGXQ=="
},
"src/hydroshoot/version.py": {
"version": "8tWEvNZfrOFEZfSGOYZLW6d6y+VuHZ9zlkxFZZp5JmnZwmwqllXDRnPUfWwZUZsQJ9yENNYTb08PQvtPlfSogA=="
},
"src/hydroshoot_data/__init__.py": {},
"test/__init__.py": {}
}

View file

View file

@ -0,0 +1,13 @@
version: 2
build:
os: "ubuntu-lts-latest"
tools:
python: "mambaforge-latest"
conda:
environment: doc/environment.yml
sphinx:
# Path to your Sphinx configuration file.
configuration: doc/conf.py

11
hydroshoot/AUTHORS.rst Normal file
View file

@ -0,0 +1,11 @@
Credits
=======
Development Lead
----------------
* Rami Albasha, <rami.albasha@itk.fr>
* Christian Fournier, <christian.fournier@inrae.fr>
* Christophe Pradal, <christophe.pradal@cirad.fr>
* Eric Lebon

15
hydroshoot/CITATION.bib Normal file
View file

@ -0,0 +1,15 @@
@article{10.1093/insilicoplants/diz007,
author = {Albasha, R and Fournier, C and Pradal, C and Chelle, M and Prieto, J A and Louarn, G and Simonneau, T and Lebon, E},
title = {HydroShoot: a functional-structural plant model for simulating hydraulic structure, gas and energy exchange dynamics of complex plant canopies under water deficit—application to grapevine (Vitis vinifera)},
journal = {in silico Plants},
volume = {1},
number = {1},
pages = {diz007},
year = {2019},
month = {06},
abstract = {This paper presents HydroShoot, a leaf-based functional-structural plant model (FSPM) that simulates gas exchange rates of complex plant canopies under water deficit conditions. HydroShoot is built assuming that simulating both the hydraulic structure of the shoot together with the energy budget of individual leaves is the asset for successfully scaling-up leaf to canopy gas exchange rates. HydroShoot includes three interacting modules: hydraulic, which calculates the distribution of xylem water potential across shoot hydraulic segments; energy, which calculates the complete energy budget of individual leaves; and exchange, which calculates net carbon assimilation and transpiration rates of individual leaves. HydroShoot was evaluated on virtual and real grapevines having strongly contrasted canopies, under well-watered and water deficit conditions. It captured accurately the impact of canopy architecture and soil water status on plant-scale gas exchange rates and leaf-scale temperature and water potential. Both shoot hydraulic structure and leaf energy budget simulations were, as postulated, required to adequately scaling-up leaf to canopy gas exchange rates. Notwithstanding, simulating shoot hydraulic structure was found more necessary to adequately performing this scaling task than simulating leaf energy budget. That is, the intra-canopy variability of leaf water potential was a better predictor of the reduction of whole plant gas exchange rates under water deficit than the intra-canopy variability of leaf temperature. We conclude that simulating the shoot hydraulic structure is a prerequisite if FSPMs are to be used to assess gas exchange rates of complex plant canopies as those of grapevines. Finally, HydroShoot is available through the OpenAlea platform (https://github.com/openalea/hydroshoot) as a set of reusable modules.},
issn = {2517-5025},
doi = {10.1093/insilicoplants/diz007},
url = {https://doi.org/10.1093/insilicoplants/diz007},
eprint = {https://academic.oup.com/insilicoplants/article-pdf/1/1/diz007/47414178/insilicoplants\_1\_1\_diz007.pdf},
}

120
hydroshoot/CONTRIBUTING.rst Normal file
View file

@ -0,0 +1,120 @@
============
Contributing
============
Contributions are welcome, and they are greatly appreciated! Every
little bit helps, and credit will always be given.
You can contribute in many ways:
Types of Contributions
----------------------
Report Bugs
~~~~~~~~~~~
Report bugs at issues_.
If you are reporting a bug, please include:
* Your operating system name and version.
* Any details about your local setup that might be helpful in troubleshooting.
* Detailed steps to reproduce the bug.
Fix Bugs
~~~~~~~~
Look through the GitHub issues for bugs. Anything tagged with "bug"
is open to whoever wants to implement it.
Implement Features
~~~~~~~~~~~~~~~~~~
Look through the GitHub issues for features. Anything tagged with "feature"
is open to whoever wants to implement it.
Write Documentation
~~~~~~~~~~~~~~~~~~~
pkglts could always use more documentation, whether as part of the
official pkglts docs, in docstrings, or even on the web in blog posts,
articles, and such.
Submit Feedback
~~~~~~~~~~~~~~~
The best way to send feedback is to file an issue at issues_.
If you are proposing a feature:
* Explain in detail how it would work.
* Keep the scope as narrow as possible, to make it easier to implement.
* Remember that this is a volunteer-driven project, and that contributions
are welcome :)
Get Started!
------------
Ready to contribute? Here's how to set up `hydroshoot` for local development.
1. Fork the `hydroshoot` repo on GitHub.
2. Clone your fork locally::
$ git clone git@github.com:your_name_here/hydroshoot.git
3. Install your local copy into a virtualenv. Assuming you have virtualenv_
installed, this is how you set up your fork for local development::
$ virtualenv dvlpt
$ dvlpt/script/activate
(dvlpt)$ python setup.py develop
4. Create a branch for local development (wip stands for work in progress)::
(dvlpt)$ git checkout -b wip_name-of-your-bugfix-or-feature
Now you can make your changes locally.
5. When you're done making changes, check that your changes pass flake8 and the
tests, including testing other Python versions with tox::
(dvlpt)$ cd hydroshoot
(dvlpt) hydroshoot$ flake8
(dvlpt) hydroshoot$ pytest
(dvlpt) hydroshoot$ tox
To get flake8 and tox, just pip install them into your virtualenv.
6. Commit your changes and push your branch to GitHub::
$ git add .
$ git commit -m "Your detailed description of your changes."
$ git push origin wip_name-of-your-bugfix-or-feature
7. Submit a pull request through the GitHub website.
Pull Request Guidelines
-----------------------
Before you submit a pull request, check that it meets these guidelines:
1. The pull request should include tests.
2. If the pull request adds functionality, the docs should be updated. Put
your new functionality into a function with a docstring, and add the
feature to the list in README.rst.
3. The pull request should work for Python 3.8 and up. Check
https://github.com/openalea/hydroshoot/actions
and make sure that the tests pass for all supported Python versions.
Tips
----
To run a subset of tests::
$ pytest test/test_XXX
.. _issues: https://github.com/openalea/hydroshoot/issues
.. _virtualenv: https://pypi.python.org/pypi/virtualenv

16
hydroshoot/HISTORY.rst Normal file
View file

@ -0,0 +1,16 @@
.. _changelog:
History
=======
creation
--------
HydroShoot was created by Rami ALBASHA during his postdoctoral research (July 2015 to December 2016)
under the supervision of Eric LEBON†, in close collaboration with Christian FOURNIER and Christophe PRADAL.
The model is partly based on prior developments led by Gaëtan LOUARN and Jorge PRIETO who developed the FSPM TOPVINE
(`Louarn et al., 2008 <https://academic.oup.com/aob/article/101/8/1167/159779>`_,
`Prieto et al., 2012 <https://onlinelibrary.wiley.com/doi/10.1111/j.1365-3040.2012.02491.x>`_).
The main difference between TOPVINE and HydroShoot is that the latter simulates explicitly the hydraulic network of the
shoot, which is coupled to both energy and gas exchange processes.

520
hydroshoot/LICENSE Normal file
View file

@ -0,0 +1,520 @@
{{# pkglts, license
CeCILL-C FREE SOFTWARE LICENSE AGREEMENT
Notice
This Agreement is a Free Software license agreement that is the result
of discussions between its authors in order to ensure compliance with
the two main principles guiding its drafting:
* firstly, compliance with the principles governing the distribution
of Free Software: access to source code, broad rights granted to
users,
* secondly, the election of a governing law, French law, with which
it is conformant, both as regards the law of torts and
intellectual property law, and the protection that it offers to
both authors and holders of the economic rights over software.
The authors of the CeCILL-C (for Ce[a] C[nrs] I[nria] L[ogiciel] L[ibre])
license are:
Commissariat a l'Energie Atomique - CEA, a public scientific, technical
and industrial research establishment, having its principal place of
business at 25 rue Leblanc, immeuble Le Ponant D, 75015 Paris, France.
Centre National de la Recherche Scientifique - CNRS, a public scientific
and technological establishment, having its principal place of business
at 3 rue Michel-Ange, 75794 Paris cedex 16, France.
Institut National de Recherche en Informatique et en Automatique -
INRIA, a public scientific and technological establishment, having its
principal place of business at Domaine de Voluceau, Rocquencourt, BP
105, 78153 Le Chesnay cedex, France.
Preamble
The purpose of this Free Software license agreement is to grant users
the right to modify and re-use the software governed by this license.
The exercising of this right is conditional upon the obligation to make
available to the community the modifications made to the source code of
the software so as to contribute to its evolution.
In consideration of access to the source code and the rights to copy,
modify and redistribute granted by the license, users are provided only
with a limited warranty and the software's author, the holder of the
economic rights, and the successive licensors only have limited liability.
In this respect, the risks associated with loading, using, modifying
and/or developing or reproducing the software by the user are brought to
the user's attention, given its Free Software status, which may make it
complicated to use, with the result that its use is reserved for
developers and experienced professionals having in-depth computer
knowledge. Users are therefore encouraged to load and test the
suitability of the software as regards their requirements in conditions
enabling the security of their systems and/or data to be ensured and,
more generally, to use and operate it in the same conditions of
security. This Agreement may be freely reproduced and published,
provided it is not altered, and that no provisions are either added or
removed herefrom.
This Agreement may apply to any or all software for which the holder of
the economic rights decides to submit the use thereof to its provisions.
Article 1 - DEFINITIONS
For the purpose of this Agreement, when the following expressions
commence with a capital letter, they shall have the following meaning:
Agreement: means this license agreement, and its possible subsequent
versions and annexes.
Software: means the software in its Object Code and/or Source Code form
and, where applicable, its documentation, "as is" when the Licensee
accepts the Agreement.
Initial Software: means the Software in its Source Code and possibly its
Object Code form and, where applicable, its documentation, "as is" when
it is first distributed under the terms and conditions of the Agreement.
Modified Software: means the Software modified by at least one
Integrated Contribution.
Source Code: means all the Software's instructions and program lines to
which access is required so as to modify the Software.
Object Code: means the binary files originating from the compilation of
the Source Code.
Holder: means the holder(s) of the economic rights over the Initial
Software.
Licensee: means the Software user(s) having accepted the Agreement.
Contributor: means a Licensee having made at least one Integrated
Contribution.
Licensor: means the Holder, or any other individual or legal entity, who
distributes the Software under the Agreement.
Integrated Contribution: means any or all modifications, corrections,
translations, adaptations and/or new functions integrated into the
Source Code by any or all Contributors.
Related Module: means a set of sources files including their
documentation that, without modification to the Source Code, enables
supplementary functions or services in addition to those offered by the
Software.
Derivative Software: means any combination of the Software, modified or
not, and of a Related Module.
Parties: mean both the Licensee and the Licensor.
These expressions may be used both in singular and plural form.
Article 2 - PURPOSE
The purpose of the Agreement is the grant by the Licensor to the
Licensee of a non-exclusive, transferable and worldwide license for the
Software as set forth in Article 5 hereinafter for the whole term of the
protection granted by the rights over said Software.
Article 3 - ACCEPTANCE
3.1 The Licensee shall be deemed as having accepted the terms and
conditions of this Agreement upon the occurrence of the first of the
following events:
* (i) loading the Software by any or all means, notably, by
downloading from a remote server, or by loading from a physical
medium;
* (ii) the first time the Licensee exercises any of the rights
granted hereunder.
3.2 One copy of the Agreement, containing a notice relating to the
characteristics of the Software, to the limited warranty, and to the
fact that its use is restricted to experienced users has been provided
to the Licensee prior to its acceptance as set forth in Article 3.1
hereinabove, and the Licensee hereby acknowledges that it has read and
understood it.
Article 4 - EFFECTIVE DATE AND TERM
4.1 EFFECTIVE DATE
The Agreement shall become effective on the date when it is accepted by
the Licensee as set forth in Article 3.1.
4.2 TERM
The Agreement shall remain in force for the entire legal term of
protection of the economic rights over the Software.
Article 5 - SCOPE OF RIGHTS GRANTED
The Licensor hereby grants to the Licensee, who accepts, the following
rights over the Software for any or all use, and for the term of the
Agreement, on the basis of the terms and conditions set forth hereinafter.
Besides, if the Licensor owns or comes to own one or more patents
protecting all or part of the functions of the Software or of its
components, the Licensor undertakes not to enforce the rights granted by
these patents against successive Licensees using, exploiting or
modifying the Software. If these patents are transferred, the Licensor
undertakes to have the transferees subscribe to the obligations set
forth in this paragraph.
5.1 RIGHT OF USE
The Licensee is authorized to use the Software, without any limitation
as to its fields of application, with it being hereinafter specified
that this comprises:
1. permanent or temporary reproduction of all or part of the Software
by any or all means and in any or all form.
2. loading, displaying, running, or storing the Software on any or
all medium.
3. entitlement to observe, study or test its operation so as to
determine the ideas and principles behind any or all constituent
elements of said Software. This shall apply when the Licensee
carries out any or all loading, displaying, running, transmission
or storage operation as regards the Software, that it is entitled
to carry out hereunder.
5.2 RIGHT OF MODIFICATION
The right of modification includes the right to translate, adapt,
arrange, or make any or all modifications to the Software, and the right
to reproduce the resulting software. It includes, in particular, the
right to create a Derivative Software.
The Licensee is authorized to make any or all modification to the
Software provided that it includes an explicit notice that it is the
author of said modification and indicates the date of the creation thereof.
5.3 RIGHT OF DISTRIBUTION
In particular, the right of distribution includes the right to publish,
transmit and communicate the Software to the general public on any or
all medium, and by any or all means, and the right to market, either in
consideration of a fee, or free of charge, one or more copies of the
Software by any means.
The Licensee is further authorized to distribute copies of the modified
or unmodified Software to third parties according to the terms and
conditions set forth hereinafter.
5.3.1 DISTRIBUTION OF SOFTWARE WITHOUT MODIFICATION
The Licensee is authorized to distribute true copies of the Software in
Source Code or Object Code form, provided that said distribution
complies with all the provisions of the Agreement and is accompanied by:
1. a copy of the Agreement,
2. a notice relating to the limitation of both the Licensor's
warranty and liability as set forth in Articles 8 and 9,
and that, in the event that only the Object Code of the Software is
redistributed, the Licensee allows effective access to the full Source
Code of the Software at a minimum during the entire period of its
distribution of the Software, it being understood that the additional
cost of acquiring the Source Code shall not exceed the cost of
transferring the data.
5.3.2 DISTRIBUTION OF MODIFIED SOFTWARE
When the Licensee makes an Integrated Contribution to the Software, the
terms and conditions for the distribution of the resulting Modified
Software become subject to all the provisions of this Agreement.
The Licensee is authorized to distribute the Modified Software, in
source code or object code form, provided that said distribution
complies with all the provisions of the Agreement and is accompanied by:
1. a copy of the Agreement,
2. a notice relating to the limitation of both the Licensor's
warranty and liability as set forth in Articles 8 and 9,
and that, in the event that only the object code of the Modified
Software is redistributed, the Licensee allows effective access to the
full source code of the Modified Software at a minimum during the entire
period of its distribution of the Modified Software, it being understood
that the additional cost of acquiring the source code shall not exceed
the cost of transferring the data.
5.3.3 DISTRIBUTION OF DERIVATIVE SOFTWARE
When the Licensee creates Derivative Software, this Derivative Software
may be distributed under a license agreement other than this Agreement,
subject to compliance with the requirement to include a notice
concerning the rights over the Software as defined in Article 6.4.
In the event the creation of the Derivative Software required modification
of the Source Code, the Licensee undertakes that:
1. the resulting Modified Software will be governed by this Agreement,
2. the Integrated Contributions in the resulting Modified Software
will be clearly identified and documented,
3. the Licensee will allow effective access to the source code of the
Modified Software, at a minimum during the entire period of
distribution of the Derivative Software, such that such
modifications may be carried over in a subsequent version of the
Software; it being understood that the additional cost of
purchasing the source code of the Modified Software shall not
exceed the cost of transferring the data.
5.3.4 COMPATIBILITY WITH THE CeCILL LICENSE
When a Modified Software contains an Integrated Contribution subject to
the CeCILL license agreement, or when a Derivative Software contains a
Related Module subject to the CeCILL license agreement, the provisions
set forth in the third item of Article 6.4 are optional.
Article 6 - INTELLECTUAL PROPERTY
6.1 OVER THE INITIAL SOFTWARE
The Holder owns the economic rights over the Initial Software. Any or
all use of the Initial Software is subject to compliance with the terms
and conditions under which the Holder has elected to distribute its work
and no one shall be entitled to modify the terms and conditions for the
distribution of said Initial Software.
The Holder undertakes that the Initial Software will remain ruled at
least by this Agreement, for the duration set forth in Article 4.2.
6.2 OVER THE INTEGRATED CONTRIBUTIONS
The Licensee who develops an Integrated Contribution is the owner of the
intellectual property rights over this Contribution as defined by
applicable law.
6.3 OVER THE RELATED MODULES
The Licensee who develops a Related Module is the owner of the
intellectual property rights over this Related Module as defined by
applicable law and is free to choose the type of agreement that shall
govern its distribution under the conditions defined in Article 5.3.3.
6.4 NOTICE OF RIGHTS
The Licensee expressly undertakes:
1. not to remove, or modify, in any manner, the intellectual property
notices attached to the Software;
2. to reproduce said notices, in an identical manner, in the copies
of the Software modified or not;
3. to ensure that use of the Software, its intellectual property
notices and the fact that it is governed by the Agreement is
indicated in a text that is easily accessible, specifically from
the interface of any Derivative Software.
The Licensee undertakes not to directly or indirectly infringe the
intellectual property rights of the Holder and/or Contributors on the
Software and to take, where applicable, vis-a-vis its staff, any and all
measures required to ensure respect of said intellectual property rights
of the Holder and/or Contributors.
Article 7 - RELATED SERVICES
7.1 Under no circumstances shall the Agreement oblige the Licensor to
provide technical assistance or maintenance services for the Software.
However, the Licensor is entitled to offer this type of services. The
terms and conditions of such technical assistance, and/or such
maintenance, shall be set forth in a separate instrument. Only the
Licensor offering said maintenance and/or technical assistance services
shall incur liability therefor.
7.2 Similarly, any Licensor is entitled to offer to its licensees, under
its sole responsibility, a warranty, that shall only be binding upon
itself, for the redistribution of the Software and/or the Modified
Software, under terms and conditions that it is free to decide. Said
warranty, and the financial terms and conditions of its application,
shall be subject of a separate instrument executed between the Licensor
and the Licensee.
Article 8 - LIABILITY
8.1 Subject to the provisions of Article 8.2, the Licensee shall be
entitled to claim compensation for any direct loss it may have suffered
from the Software as a result of a fault on the part of the relevant
Licensor, subject to providing evidence thereof.
8.2 The Licensor's liability is limited to the commitments made under
this Agreement and shall not be incurred as a result of in particular:
(i) loss due the Licensee's total or partial failure to fulfill its
obligations, (ii) direct or consequential loss that is suffered by the
Licensee due to the use or performance of the Software, and (iii) more
generally, any consequential loss. In particular the Parties expressly
agree that any or all pecuniary or business loss (i.e. loss of data,
loss of profits, operating loss, loss of customers or orders,
opportunity cost, any disturbance to business activities) or any or all
legal proceedings instituted against the Licensee by a third party,
shall constitute consequential loss and shall not provide entitlement to
any or all compensation from the Licensor.
Article 9 - WARRANTY
9.1 The Licensee acknowledges that the scientific and technical
state-of-the-art when the Software was distributed did not enable all
possible uses to be tested and verified, nor for the presence of
possible defects to be detected. In this respect, the Licensee's
attention has been drawn to the risks associated with loading, using,
modifying and/or developing and reproducing the Software which are
reserved for experienced users.
The Licensee shall be responsible for verifying, by any or all means,
the suitability of the product for its requirements, its good working
order, and for ensuring that it shall not cause damage to either persons
or properties.
9.2 The Licensor hereby represents, in good faith, that it is entitled
to grant all the rights over the Software (including in particular the
rights set forth in Article 5).
9.3 The Licensee acknowledges that the Software is supplied "as is" by
the Licensor without any other express or tacit warranty, other than
that provided for in Article 9.2 and, in particular, without any warranty
as to its commercial value, its secured, safe, innovative or relevant
nature.
Specifically, the Licensor does not warrant that the Software is free
from any error, that it will operate without interruption, that it will
be compatible with the Licensee's own equipment and software
configuration, nor that it will meet the Licensee's requirements.
9.4 The Licensor does not either expressly or tacitly warrant that the
Software does not infringe any third party intellectual property right
relating to a patent, software or any other property right. Therefore,
the Licensor disclaims any and all liability towards the Licensee
arising out of any or all proceedings for infringement that may be
instituted in respect of the use, modification and redistribution of the
Software. Nevertheless, should such proceedings be instituted against
the Licensee, the Licensor shall provide it with technical and legal
assistance for its defense. Such technical and legal assistance shall be
decided on a case-by-case basis between the relevant Licensor and the
Licensee pursuant to a memorandum of understanding. The Licensor
disclaims any and all liability as regards the Licensee's use of the
name of the Software. No warranty is given as regards the existence of
prior rights over the name of the Software or as regards the existence
of a trademark.
Article 10 - TERMINATION
10.1 In the event of a breach by the Licensee of its obligations
hereunder, the Licensor may automatically terminate this Agreement
thirty (30) days after notice has been sent to the Licensee and has
remained ineffective.
10.2 A Licensee whose Agreement is terminated shall no longer be
authorized to use, modify or distribute the Software. However, any
licenses that it may have granted prior to termination of the Agreement
shall remain valid subject to their having been granted in compliance
with the terms and conditions hereof.
Article 11 - MISCELLANEOUS
11.1 EXCUSABLE EVENTS
Neither Party shall be liable for any or all delay, or failure to
perform the Agreement, that may be attributable to an event of force
majeure, an act of God or an outside cause, such as defective
functioning or interruptions of the electricity or telecommunications
networks, network paralysis following a virus attack, intervention by
government authorities, natural disasters, water damage, earthquakes,
fire, explosions, strikes and labor unrest, war, etc.
11.2 Any failure by either Party, on one or more occasions, to invoke
one or more of the provisions hereof, shall under no circumstances be
interpreted as being a waiver by the interested Party of its right to
invoke said provision(s) subsequently.
11.3 The Agreement cancels and replaces any or all previous agreements,
whether written or oral, between the Parties and having the same
purpose, and constitutes the entirety of the agreement between said
Parties concerning said purpose. No supplement or modification to the
terms and conditions hereof shall be effective as between the Parties
unless it is made in writing and signed by their duly authorized
representatives.
11.4 In the event that one or more of the provisions hereof were to
conflict with a current or future applicable act or legislative text,
said act or legislative text shall prevail, and the Parties shall make
the necessary amendments so as to comply with said act or legislative
text. All other provisions shall remain effective. Similarly, invalidity
of a provision of the Agreement, for any reason whatsoever, shall not
cause the Agreement as a whole to be invalid.
11.5 LANGUAGE
The Agreement is drafted in both French and English and both versions
are deemed authentic.
Article 12 - NEW VERSIONS OF THE AGREEMENT
12.1 Any person is authorized to duplicate and distribute copies of this
Agreement.
12.2 So as to ensure coherence, the wording of this Agreement is
protected and may only be modified by the authors of the License, who
reserve the right to periodically publish updates or new versions of the
Agreement, each with a separate number. These subsequent versions may
address new issues encountered by Free Software.
12.3 Any Software distributed under a given version of the Agreement may
only be subsequently distributed under the same version of the Agreement
or a subsequent version.
Article 13 - GOVERNING LAW AND JURISDICTION
13.1 The Agreement is governed by French law. The Parties agree to
endeavor to seek an amicable solution to any disagreements or disputes
that may arise during the performance of the Agreement.
13.2 Failing an amicable solution within two (2) months as from their
occurrence, and unless emergency proceedings are necessary, the
disagreements or disputes shall be referred to the Paris Courts having
jurisdiction, by the more diligent Party.
Version 1.0 dated 2006-09-05.
#}

24
hydroshoot/MANIFEST.in Normal file
View file

@ -0,0 +1,24 @@
# {# pkglts, pysetup
include AUTHORS.rst
include CONTRIBUTING.rst
include HISTORY.rst
include README.rst
include LICENSE
include requirements.txt
include dvlpt_requirements.txt
recursive-include test *
recursive-include src/hydroshoot *
recursive-include src/hydroshoot_data *
recursive-exclude * __pycache__
recursive-exclude * *.py[co]
recursive-include doc *.rst
# #}

59
hydroshoot/README.rst Normal file
View file

@ -0,0 +1,59 @@
========================
HydroShoot
========================
.. {
.. image:: https://github.com/openalea/hydroshoot/actions/workflows/conda-package-build.yml/badge.svg
:alt: CI status
:target: https://github.com/openalea/hydroshoot/actions/workflows/conda-package-build.yml
.. image:: https://readthedocs.org/projects/hydroshoot/badge/?version=latest
:target: https://hydroshoot.readthedocs.io/en/latest/?badge=latest
:alt: Documentation Status
.. image:: https://anaconda.org/openalea3/openalea.hydroshoot/badges/version.svg
:target: https://anaconda.org/openalea3/openalea.hydroshoot
.. }
Brief Description
-----------------
HydroShoot is a functional-structural plant modelling package.
Hydroshoot is composed of 3 generic modules used to simulate:
- xylem water transport (*hydraulic*)
- leaves energy budget (*energy*)
- leaves gas exchange fluxes (*exchange*).
Hydroshoot provides a grapevine-specific module (*architecture*) which builds plant shoot structure for potted of trained grapevines.
Installation
------------
HydroShoot must temporarily be installed manually by cloning this repo locally then installing.
An installation procedure using conda will be possible in the future.
You can follow the following steps for installation:
``mamba create -n hydroshoot -c openalea3 -c conda-forge openalea.hydroshoot``
``mamba activate hydroshoot``
You're done !
Documentation
-------------
https://hydroshoot.readthedocs.io/
Citation
--------
R Albasha, C Fournier, C Pradal, M Chelle, J A Prieto, G Louarn, T Simonneau, E Lebon, HydroShoot: a functional-structural plant model for simulating hydraulic structure, gas and energy exchange dynamics of complex plant canopies under water deficit—application to grapevine (Vitis vinifera), in silico Plants, Volume 1, Issue 1, 2019, diz007, https://doi.org/10.1093/insilicoplants/diz007

View file

@ -0,0 +1,14 @@
channels:
- conda-forge
- openalea3
dependencies:
- openalea.mtg
- openalea.plantgl
- alinea.caribu
- alinea.astk
- numpy
- scipy
- sympy
- pandas
- jsonschema
- pvlib-python

View file

@ -0,0 +1,35 @@
package:
name: hydroshoot
version: "5.2.2"
source:
git_url: ../
build:
noarch: python
preserve_egg_dir: True
script: {{PYTHON}} -m pip install .
requirements:
build:
- python {{PY_VER}}
- setuptools
run:
- python
- numpy
- scipy
- sympy
- pandas
- jsonschema
- pvlib-python
- openalea.mtg
- openalea.plantgl
- alinea.caribu
- alinea.astk
about:
summary: "HydroShoot is an FSPM model to simulate gas-exchange on vine"
license: "cecill-c"
license_file: LICENSE

20
hydroshoot/doc/Makefile Normal file
View file

@ -0,0 +1,20 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SPHINXPROJ = HydroShoot
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

0
hydroshoot/doc/_static/nonempty.txt vendored Normal file
View file

108
hydroshoot/doc/_static/openalea_web.svg vendored Normal file
View file

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="155"
height="120"
id="svg2927"
sodipodi:version="0.32"
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
version="1.0"
sodipodi:docname="openalea_web.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:export-filename="/user/sdufour/home/Desktop/openalea_web.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs2929" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="172.17131"
inkscape:cy="109.52647"
inkscape:document-units="px"
inkscape:current-layer="layer1"
height="120px"
width="155px"
inkscape:window-width="1280"
inkscape:window-height="856"
inkscape:window-x="67"
inkscape:window-y="0"
showgrid="false"
inkscape:window-maximized="0" />
<metadata
id="metadata2932">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Calque 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-185.86928,-6.1859962)">
<g
id="g2560"
transform="matrix(0.2834217,-0.1203205,7.5894201e-2,0.2578017,509.42525,-317.08419)"
style="fill:#ffcc00;fill-opacity:1">
<path
id="path2562"
style="fill:#ffcc00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M -947.03012,1016.1588 C -947.03012,1016.1588 -995.62512,1044.715 -1000.0782,1042.4885 C -1004.5312,1040.262 -1008.9843,1032.1908 -1002.8613,1028.5727 C -996.73838,1024.9546 -1002.6748,1019.2367 -1004.2529,1017.9967 C -1008.1493,1014.9352 -1020.9519,1016.8834 -1024.2917,1024.9546 C -1027.6315,1033.0258 -1024.2917,1038.0355 -1019.0037,1036.9222 C -1013.7157,1035.8089 -1013.7157,1035.8089 -1013.7157,1035.8089 C -1013.7157,1035.8089 -1007.0361,1043.8801 -1009.5409,1048.0548 C -1012.0458,1052.2295 -1030.1363,1064.7538 -1034.3111,1064.1972 M -946.92758,1015.956 C -945.35319,1019.1048 -944.59798,1018.901 -934.62876,1032.6741 C -930.7868,1037.982 -932.17598,1036.3182 -926.4483,1030.8686 C -922.29642,1026.9183 -932.89439,1025.1035 -922.24637,1013.2358 C -915.12243,1005.2957 -895.55381,1024.9266 -902.20323,1035.5781 C -906.51941,1042.4921 -912.32963,1033.2871 -920.74946,1038.9154 C -926.51301,1042.7681 -928.75186,1043.1899 -925.92704,1046.8542 C -918.8712,1056.0069 -903.28713,1083.2098 -897.06367,1089.7322 C -899.62379,1098.8205 -907.02227,1112.2473 -915.2428,1123.7561 C -923.3295,1135.0775 -948.06504,1155.5519 -948.06504,1155.5519 C -948.06504,1155.5519 -976.35396,1108.662 -982.55427,1114.4748 C -988.75458,1120.2876 -992.62978,1124.5503 -984.87939,1131.1381 C -977.129,1137.726 -995.72994,1152.4517 -1003.0928,1145.0888 C -1006.0743,1142.1073 -1010.0028,1137.8486 -1013.5174,1133.8598 C -1018.6822,1127.9982 -1019.404,1119.5575 -1014.3309,1115.6373 C -1005.8054,1109.0495 -1003.4803,1119.125 -998.05505,1117.5749 C -993.80671,1116.3611 -984.49187,1110.9871 -989.1421,1105.1743 C -993.79234,1099.3615 -1033.3193,1064.4848 -1033.3193,1064.4848 L -1034.4182,1064.2251"
sodipodi:nodetypes="cssssscsccsssssscscssssssscc" />
</g>
<path
style="fill:#d40000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.28670228px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 281.91155,109.40107 C 282.22193,109.88269 286.50131,102.08552 286.34894,99.849991 C 286.19658,97.614512 287.75407,96.033228 289.18302,95.733295 C 290.61201,95.433371 290.31477,97.859709 291.44654,99.986133 C 292.57829,102.11253 296.77991,96.341807 298.37754,94.896878 C 299.97515,93.451919 299.50179,90.125967 297.75179,89.335397 C 296.00185,88.544906 293.86619,91.598313 292.82788,92.652509 C 291.78954,93.706706 288.92911,92.007467 292.07358,88.372351 C 295.21805,84.737285 297.02622,81.793118 297.02622,81.793118 L 297.35737,81.727856 C 297.35737,81.727856 311.20713,85.963218 312.96627,86.902244 C 314.72537,87.841232 312.49319,90.347436 311.38128,91.171546 C 309.96127,92.223942 308.53761,89.906221 306.62129,92.63034 C 305.48097,94.251368 306.32611,96.340541 308.23479,97.230273 C 309.53367,97.835699 310.97028,98.460919 312.0416,98.870813 C 314.68719,99.883095 318.8415,93.848698 316.14487,93.08283 C 313.44829,92.317029 314.22307,90.751839 315.53925,88.507256 C 316.85536,86.262693 328.43173,94.947243 328.43173,94.947243 C 328.43173,94.947243 324.80499,101.09485 317.90904,105.37103 C 311.01308,109.64721 300.7579,110.06725 299.57135,110.23381 C 298.38481,110.40036 290.26738,109.688 287.44717,109.7614 C 284.62694,109.83478 283.89533,110.70728 283.45601,110.89381 C 283.01668,111.08031 277.32841,121.13758 276.2025,123.18899 C 275.07661,125.2404 276.06097,127.74466 275.657,126.79223 C 275.2531,125.83986 275.15752,118.79991 276.10877,117.83413 C 277.06005,116.86834 281.91155,109.40107 281.91155,109.40107 z "
id="path2566"
sodipodi:nodetypes="csssssssscssssssscsssssssc" />
<path
style="fill:#88aa00;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.28670228px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 307.81825,45.861437 C 310.10485,48.086956 314.30376,50.413858 313.60643,52.308025 C 312.9091,54.202182 310.34336,55.291448 309.58254,53.559691 C 308.82175,51.827943 306.4553,51.462719 305.40136,53.850725 C 304.34742,56.238741 306.49447,60.121633 307.25339,60.141874 C 308.01234,60.162136 309.807,61.569142 311.12001,57.929626 C 312.43301,54.290149 314.79154,54.202143 315.38711,54.520059 C 315.98266,54.837927 317.47439,58.199981 318.15961,58.822338 C 318.84479,59.444656 319.04337,59.301271 322.91417,61.652484 C 324.4059,62.558632 323.88588,62.296796 325.09565,60.202755 C 325.97259,58.684814 322.83114,59.492081 324.94835,55.151393 C 326.36478,52.247242 333.40086,54.953651 332.32468,58.4997 C 331.62607,60.801434 329.28073,59.127451 327.32154,61.591565 C 325.98043,63.278244 325.37792,63.656407 326.45662,64.261151 C 329.15102,65.771761 337.82126,73.039022 337.86683,71.686052 L 335.79127,50.081513 C 335.79127,50.081513 334.95906,44.270601 333.87574,40.164429 C 332.79244,36.058267 330.93193,35.706566 330.25469,35.537468 C 329.57743,35.368399 327.60727,36.775562 326.74468,37.255868 C 325.88213,37.736203 314.42189,42.715536 313.52945,43.09442 C 312.63703,43.473275 307.81825,45.861437 307.81825,45.861437 z "
id="path2568"
sodipodi:nodetypes="csssssssssssssccssssc" />
<path
style="fill:#00aa88;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.28670228px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 297.05013,81.823602 C 295.82468,82.18241 290.99937,81.171306 288.27092,78.528163 C 285.66392,76.002623 283.79617,75.988301 284.6837,74.481518 C 285.5712,72.974695 286.61644,71.400917 287.9376,71.970056 C 289.13138,72.484371 290.38318,72.564412 291.15191,71.73558 C 291.89289,70.936725 292.13811,69.056812 290.92686,67.956709 C 289.71558,66.856548 289.14152,66.068267 288.15778,66.387838 C 286.53792,66.914089 285.8392,67.856417 286.17716,69.00446 C 286.51511,70.152455 285.49098,71.797979 284.25992,71.83631 C 283.02885,71.874642 280.58652,70.812783 280.24856,69.664798 C 279.91059,68.516813 280.27266,67.636651 280.27266,67.636651 C 279.7323,68.543539 279.47281,69.113359 279.07238,69.788905 C 276.75743,73.378543 275.60403,77.616748 275.37891,82.006 C 275.15383,86.395232 279.07571,99.144692 280.18867,102.35253 C 281.30158,105.56033 281.62512,108.94995 281.93547,109.43152 C 282.24587,109.91319 286.52521,102.11597 286.37288,99.880495 C 286.22051,97.644967 287.77801,96.063731 289.207,95.763798 C 290.63596,95.463855 290.33872,97.890193 291.47047,100.01661 C 292.60223,102.143 296.80386,96.372339 298.40148,94.927352 C 299.99909,93.482403 299.52571,90.156422 297.77573,89.365891 C 296.02577,88.575351 293.89013,91.628807 292.8518,92.682974 C 291.81345,93.73716 288.95304,92.037922 292.09751,88.402816 C 295.242,84.767769 297.05013,81.823602 297.05013,81.823602 z "
id="path2570"
sodipodi:nodetypes="csssssssssccsssssssssss" />
<text
xml:space="preserve"
style="font-size:3.96016073px;line-height:0.01%;stroke-width:0.33001339"
x="189.27823"
y="57.426498"
id="text29"
transform="scale(0.99102465,1.0090566)"><tspan
sodipodi:role="line"
x="189.27823"
y="57.426498"
id="tspan27"
style="stroke-width:0.33001339"><tspan
x="189.27823"
y="57.426498"
style="font-size:23.76096344px;line-height:1.25;stroke-width:0.33001339"
id="tspan25">OpenAlea</tspan></tspan></text>
<path
style="fill:#ff6600;fill-rule:evenodd;stroke:#000000;stroke-width:0.28670228px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 306.72134,28.623689 C 305.89594,32.437892 305.46648,36.840035 303.34894,36.652924 C 300.9837,36.443908 299.62451,34.864356 301.12129,33.057942 C 301.81755,32.217659 301.00897,30.130803 298.35487,30.108809 C 296.62962,30.094507 293.26018,33.697045 293.70235,34.85462 C 293.98706,35.599974 293.38627,37.6695 297.42976,37.123514 C 301.47324,36.577566 302.57048,38.736188 302.41459,39.396516 C 302.25873,40.056873 300.56287,42.824698 300.1242,43.702747 C 300.1242,43.702747 282.54038,39.880668 282.1814,38.628642 C 281.82241,37.376626 281.91428,34.758835 284.00758,35.248916 C 286.1009,35.738998 285.99261,34.511877 286.00074,33.705437 C 286.01386,32.403874 284.45702,30.407759 281.0614,30.275006 C 278.32389,30.167995 277.16322,32.74206 278.48935,33.536115 C 279.81552,34.330229 280.23726,34.458328 280.23726,34.458328 C 280.23726,34.458328 280.41266,37.327409 278.91097,37.623701 C 277.40931,37.919954 270.54694,37.025753 269.8438,36.13419 C 269.14064,35.242637 267.87097,30.406094 268.22921,28.468465 C 268.85496,25.083998 269.1237,21.565717 270.01548,21.556088 C 272.20002,21.532516 274.56908,21.673662 274.36087,23.075752 C 274.17268,24.342665 274.71921,25.486667 275.77054,25.767527 C 276.78385,26.038233 278.17494,25.95601 278.95039,24.403808 C 279.72584,22.851644 279.86801,21.727338 279.27166,21.026166 C 278.2897,19.871619 276.45106,19.896427 275.34789,20.648665 C 274.23595,21.4069 273.18207,20.991164 272.60813,20.039344 C 271.83766,18.761586 271.92917,16.528414 272.60216,15.362924 C 273.47578,13.849987 278.35777,14.593005 278.35777,14.593005 C 278.35777,14.593005 284.24115,15.657473 288.69151,17.290992 C 292.49524,18.687172 296.95572,21.030596 298.90537,22.467892 C 301.03309,24.036461 306.63531,28.492747 306.72134,28.623689 z "
id="path2564"
sodipodi:nodetypes="csssssssssssscssssssssssscssc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View file

@ -0,0 +1 @@
.. include:: ../AUTHORS.rst

166
hydroshoot/doc/conf.py Normal file
View file

@ -0,0 +1,166 @@
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
import os
import sys
sys.path.insert(0, os.path.abspath("..")) # to include the root of the package
# -- Project information -----------------------------------------------------
project = u'HydroShoot'
copyright = u'2021, Rami Albasha'
author = u'Rami Albasha'
# The short X.Y version
version = u''
# The full version, including alpha/beta/rc tags
release = u'1.0.0'
# -- General configuration ---------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
"sphinx.ext.autodoc", # support for automatic inclusion of docstring
"sphinx.ext.autosummary", # generates autodoc summaries
"sphinx.ext.doctest", # inclusion and testing of doctest code snippets
"sphinx.ext.intersphinx", # support for linking to other projects
#"sphinx.ext.imgmath", # support for math equations
"sphinx.ext.mathjax", # support for math equations
"sphinx.ext.ifconfig", # support for conditional content
"sphinx.ext.viewcode", # support for links to source code
"sphinx.ext.coverage", # includes doc coverage stats in the documentation
"sphinx.ext.todo", # support for todo items
"sphinx.ext.napoleon", # support for numpy and google style docstrings
"sphinx_favicon", # support for favicon
"nbsphinx", # for integrating jupyter notebooks
"myst_parser", # for parsing .md files
]
nbsphinx_allow_errors = True
# Add any paths that contain templates here, relative to this directory.
templates_path = ["_templates"]
autosummary_generate = True
exclude_patterns = ["_build", "_templates"]
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
source_suffix = {
".rst": "restructuredtext",
".md": "markdown",
}
# The master toctree document.
master_doc = "index"
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = "en"
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = "sphinx"
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = "pydata_sphinx_theme"
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
html_theme_options = {
"header_links_before_dropdown": 6,
"sidebarwidth": 200,
"collapse_navigation": "false",
"icon_links": [
{
"name": "GitHub",
"url": "https://github.com/openalea/hydroshoot",
"icon": "fa-brands fa-github",
},
],
"show_version_warning_banner": True,
"footer_start": ["copyright"],
"footer_center": ["sphinx-version"],
"secondary_sidebar_items": {
"**/*": ["page-toc", "edit-this-page", "sourcelink"],
"examples/no-sidebar": [],
},
}
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ["_static"]
html_logo = "_static/openalea_web.svg"
html_favicon = "_static/openalea_web.svg"
# If false, no module index is generated.
html_domain_indices = True
# If false, no index is generated.
html_use_index = True
# If true, the index is split into individual pages for each letter.
html_split_index = False
# If true, links to the reST sources are added to the pages.
html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = True
# Output file base name for HTML help builder.
htmlhelp_basename = "Hydroshoot_documentation"
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {}
latex_documents = [
(
master_doc,
"Hydroshoot.tex",
"Hydroshoot Documentation",
"INRAE / inria / CIRAD",
"manual",
),
]
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [(master_doc, "hydroshoot", "Hydroshoot Documentation", [author], 1)]
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(
master_doc,
"Hydroshoot",
"Hydroshoot Documentation",
author,
"Hydroshoot",
"One line description of project.",
"Miscellaneous",
),
]
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {"python": ("https://docs.python.org/", None)}

View file

@ -0,0 +1 @@
.. include:: ../CONTRIBUTING.rst

View file

@ -0,0 +1,10 @@
==========================
Ecophysiological processes
==========================
.. toctree::
:maxdepth: 2
hydraulic
exchange
energy

View file

@ -0,0 +1,55 @@
======================
Processes interactions
======================
Interactions among the physiological processes occur.
.. figure:: figs/ecophysio_solver_1.svg
:align: center
Solving the interactions between leaf's water potential, transpiration rate and temperature !
From the one hand. Leaf water potential (:math:`\Psi`) exerts a control on stomatal conductance to water vapor
(:math:`g_{s, \ H_2O}`) and, consequently, on transpiration flux (:math:`E`). However, the latter also determines how much
water will flow through the hydraulic segments to be withdrawn from the soil, which affects the distribution of
water potential across those segments (Ohm's law). Hence, we have a reciprocity between the distribution of water
potential across the shoot (hydraulic structure) and transpiration fluxes from individual leaves.
From the other hand, leaf temperature (:math:`T`) determines the rate of leaf photosynthesis (Arrhenius functions)
and stomatal conductance to both :math:`CO_2` (:math:`g_{s, \ CO_2}`) and water vapor (:math:`g_{s, \ H_2O}`).
This means that :math:`T` affects also the transpiration flux :math:`E` which also means that :math:`T` exerts a further
control on the hydraulic structure.
Putting it all together:
For a given initial temperature (:math:`T_0`) and soil water potential (:math:`\Psi_0`), a leaf can fix :math:`CO_2`
with a rate :math:`A_{n, \ 0}` while having a stomatal conductance rate of :math:`g_{s, \ H_2O, \ 0}`.
The corresponding water flux transpired by this leaf will be :math:`E_0`. Summed up across all leaves, plant
transpiration will withdraw water from the soil, reducing thus soil water potential and resulting in a new :math:`\Psi`
value (:math:`\Psi_1`).
:math:`\Psi_1`, will hence impose a new stomatal conductance :math:`g_{s, \ H_2O, \ 1}` and consequently a new
transpiration flux :math:`E_1`. Yet, this new :math:`E_1` means that leaf temperature is :math:`T_1`... **REWIND**!
HydroShoot resolve this interactions iteratively until reaching steady rate values of :math:`A_n,` and :math:`E` (
implying steady state distribution of water potential cross the shoot). :numref:`fig_2` shows how interactions between
the hydraulic, energy and gas-exchange processes is handled in HydroShoot.
.. _fig_2:
.. figure:: figs/ecophysio_solver_2.png
Schematic representation of the numerical resolution of HydroShoot. Meteorological inputs that are common
to all leaves are air temperature (:math:`T_{air}, \ K`), air relative humidity (:math:`RH, \ -`), air
:math:`CO_2` concentration :math:`[\mu mol\ {mol}^{-1}]`, wind speed (:math:`u, \ m \ s^{-1}`), and atmospheric
pressure (:math:`P_a, \ kPa`). Inputs per individual leaves are the absorbed photosynthetic photon flux density
(:math:`PPFD, \ \mu mol \ m^{-2} \ s^{-1}`) and :math:`{PPFD}_{10}` the absorbed :math:`PPFD` during the last
10 days. :math:`\Psi_u \ [MPa]` is xylem water potential at the nodes between each pair of hydraulic segments.
:math:`\Psi_{u, \ init} \ [MPa]` is initial :math:`\Psi_u`. :math:`\Psi_{soil} \ [MPa]` is soil water potential.
:math:`T_i \ [K]` is leaf temperature. :math:`T_{i, \ init} \ [K]` is initial :math:`T_i`.
:math:`K_{init} \ [kg \ s^{-1} \ m \ {MPa}^{-1}]` is initial hydraulic conductivity of each segment.
:math:`\epsilon_x \ [MPa]` is the maximum allowable error of the estimation of xylem water potential. Finally,
:math:`\epsilon_T \ [K]` is the maximum allowable error of the estimation of leaf temperature.
Circles inside module boxes indicate internal iteration loops. Symbols between curly brackets represent spatially
structured variables.

92
hydroshoot/doc/energy.rst Normal file
View file

@ -0,0 +1,92 @@
=============
Energy budget
=============
.. figure:: figs/energy_1.png
:align: center
The *energy* module computes the temperature of individual leaves based on a detailed energy balance model (see
Supporting Information S3 in **Albasha et al., 2019**).
Energy gain of each leaf comes from:
1. the absorbed shortwave;
2. thermal longwave radiation from the sky;
3. thermal longwave radiation from the sky;
4. thermal longwave radiation from the soil;
5. thermal longwave radiation from the neighbouring leaves.
Energy loss of each leaf is due to
1. thermal longwave radiation emitted by the leaf
2. latent heat due to transpiration (evaporative cooling)
Energy gain or loss may result from heat exchange between the each leaf and the surrounding air by thermal
conduction-convection.
The resulting leaf-scale energy balance equation writes:
.. math::
0 & = \alpha_{i, \ R_g} \cdot \Phi_{i, \ R_g} \\
& + \epsilon_{i, \ leaf} \cdot \sigma \cdot
\left(
k_{i, \ sky} \cdot \epsilon_{sky} \cdot T_{sky}^4
+ k_{i, \ soil} \cdot \epsilon_{soil} \cdot T_{soil}^4
+ \left[1 - \left(k_{sky} + k_{soil} \right) \right] \cdot T_i^4
\right) \\
& - 2 \cdot \epsilon_{i, \ leaf} \cdot \sigma \cdot T_i^4 \\
& - \lambda \cdot E_i \\
& - 2 \cdot K_{air} \cdot \frac{T_i - T_{air}}{\Delta x_i}
where
:math:`i` refers to leaf identifier,
:math:`j` refers to neighbouring leaves identifier,
:math:`\Omega` denotes the upper hemisphere surrounding the leaf :math:`i`,
:math:`\alpha_{R_g} \ [-]` is lumped leaf absorptance in the shortwave band,
:math:`\Phi_{R_g} \ [W \ m_{leaf}^{-2}]` flux density of shortwave global irradiance,
:math:`\epsilon_{leaf} \ [-]` emissivity-absorptivity coefficients of the leaf,
:math:`\epsilon_{sky} \ [-]` emissivity-absorptivity coefficients of the leaf,
:math:`\epsilon_{soil} \ [-]` emissivity-absorptivity coefficients of the soil,
:math:`\lambda \ [W \ s \ {mol}^{-1}]` is latent heat for vaporization,
:math:`\sigma \ [W \ m^{-2} \ K^{-4}]` the Stefan-Boltzmann constant,
:math:`k_{sky} \ [-]` form factor of the sky,
:math:`k_{soil} \ [-]` form factor of the soil,
:math:`T \ [K]` leaf temperature,
:math:`T_{air}` air temperature,
:math:`T_{sky} \ [K]` sky temperature,
:math:`T_{soil} \ [K]` soil temperature,
:math:`K_{air} \ [W \ m^{-1} \ K^{-1}]` the thermal conductivity of air,
:math:`E \ [mol \ m_{leaf}^{-2} \ s^{-1}]` transpiration flux, and
:math:`\Delta x_i \ [m]` thickness of the boundary layer.
.. note::
Only the forced convective heat transfer is currently considered in HydroShoot since forced convection dominates
free convection once wind speed exceeds roughly 0.1 :math:`m \ s^{-1}` **(Nobel 2005)**. This wind speed threshold
is generally exceeded during diurnal hours. However, under low wind conditions heat transfer may be underestimated.
Sky and soil form factors: the *Pirouette Cacahuete* issue!
-----------------------------------------------------------
You may notice once you do your first run something like this:
.. figure:: figs/energy_2.png
:align: center
This refers to the method used to calculate the lumped sky and soil form factors (respectively :math:`k_{sky}` and
:math:`k_{soil}`).
In order to reduce calculation costs, :math:`k_{sky}` and :math:`k_{soil}`) are obtained by flip flopping the canopy:
.. figure:: figs/energy_3.png
:align: center
At first, the canopy is turned downwards. A unit irradiance is emitted from each sky sector and irradiance that is
intercepted by a leaf :math:`i` is assumed equivalent to the form factor between that leaf and the "soil".
In the second step, the canopy is turned upwards again and similarly, a unit irradiance is emitted from each sky sector.
In this case, irradiance that is intercepted by a leaf :math:`i` is assumed equivalent to the form factor between that
leaf and the "sky".
This method is clearly not 100% precise. It may need further improvements in the future.

View file

@ -0,0 +1,18 @@
name: hydroshoot
channels:
- conda-forge
- openalea3
dependencies:
- openalea.mtg
- openalea.plantgl
- alinea.caribu
- alinea.astk
- numpy
- scipy
- sympy
- pandas
- jsonschema
- pvlib-python
- pip
- pip:
- -e ..[doc]

248
hydroshoot/doc/exchange.rst Normal file
View file

@ -0,0 +1,248 @@
============
Gas exchange
============
.. figure:: figs/exchange.png
:align: center
The *exchange* module computes the rates of net carbon assimilation of C3 plants (:math:`A_n`), stomatal conductance
to CO2 (:math:`g_{s, \ CO_2}`) and water vapor (:math:`g_{s, \ H_2O}`), and transpiration (:math:`E`) per unit leaf
surface area as a function of micrometeorological conditions and leaf water status.
:math:`A_n` and :math:`g_{s, \ CO_2}` are coupled based on the analytical solution proposed by **Yin et al. (2009)**
which also considers mesophyll conductance to CO2 diffusion :math:`g_m`. The solution is based on the following
equations (following **Evers et al. 2010** supporting information):
.. math::
\begin{array}{l}
A_n = \frac{(C_c - \Gamma) \cdot x_1}{C_c + x_2} - R_d \\
C_c = C_i - \frac{A_n}{g_m} \\
g_{s, CO_{2}} = g_{s0, CO_{2}} + m_0 \cdot \frac{A_n + R_d}{C_i - \Gamma} \cdot f_w \\
g_{s, CO_{2}} = \frac{A_n}{C_a - C_i - A_n \cdot r_{tb}}
\end{array}
where
:math:`A_n \ [\mu mol \ m^{-2} \ s^{-1}]` is net carbon assimilation rate,
:math:`R_d \ [\mu mol \ m^{-2} \ s^{-1}]` is mitochondrial respiration in the light,
:math:`\Gamma \ [\mu bar]` is :math:`CO_2` compensation point in the absence of mitochondrial respiration,
:math:`x_1 \ [\mu mol \ m^{-2} \ s^{-1}]` and :math:`x_2 \ [\mu bar]` are intermediate parameters,
:math:`g_m \ [\mu mol \ m^{-2} \ s^{-1} \ {\mu bar}^{-1}]` is mesophyll conductance for :math:`CO_2` diffusion,
:math:`g_{s, \ CO_2} \ [mol \ m^{-2} \ s^{-1} \ {\mu bar}^{-1}]` is stomatal conductance to :math:`CO_2`,
:math:`g_{s0, \ CO_2} \ [mol \ m^{-2} \ s^{-1} \ {\mu bar}^{-1}]` is the residual stomatal conductance to :math:`CO_2`,
:math:`m_0 \ [-]` is a shape parameter regulating the slope between :math:`A_n` and :math:`g_{s, \ CO_2}`,
:math:`f_w \ [-]` is a dimensionless function representing the response of stomatal conductance to soil or plant water status,
:math:`r_{tb} \ [m^2 \ s \ \mu bar \ {\mu mol}^{-1}]` is the combined turbulence and boundary layer resistance for :math:`CO_2`,
:math:`C_a \ [\mu bar]` is air :math:`CO_2` partial pressure,
:math:`C_i \ [\mu bar]` is intercellular :math:`CO_2` partial pressure, and
:math:`C_c \ [\mu bar]` is chloroplast :math:`CO_2` partial pressure.
Net carbon assimilation rate per unit leaf area
-----------------------------------------------
:math:`A_n` is given as:
.. math::
A_n = V_c \cdot \left(1 - \frac{\Gamma}{C_c} \right) - R_d
where
:math:`V_c \ [\mu mol \ m^{-2} \ s^{-1}]` is carboxylation rate,
:math:`\Gamma \ [\mu {mol}_{CO_2} \ {mol}_{CO_2}^{-1}]` :math:`CO_2` compensation point in the absence of mitochondrial
respiration,
:math:`C_c \ [\mu {mol}_{CO_2} \ {mol}^{-1}]` chloroplast :math:`CO_2` concentration, and
:math:`R_d \ [\mu mol \ m^{-2} \ s^{-1}]` is mitochondrial respiration rate in the light.
:math:`V_c` is given as:
.. math::
V_c = \min \left(W_c, W_j, W_p \right)
where
:math:`W_c`, :math:`W_j`, and :math:`W_p \ [\mu mol \ m^{-2} \ s^{-1}]` are respectively Rubisco-limited carboxylation
rate, RuBP-limited carboxylation rate, and Triose phosphates-limited carboxylation rate, given as:
.. math::
\begin{array}{l}
W_c = \frac{C_c \cdot V_{c, \max}}{C_c + K_c \cdot \left(1 + \frac{O}{K_o} \right)} \\
W_j = \frac{J}{4 + 8 \cdot \frac{\Gamma}{C_c}} \\
W_p = \frac{3 \cdot TPU}{\left(1 - \frac{\Gamma}{C_c} \right)}
\end{array}
where
:math:`V_{c, \ max} \ [\mu mol \ m^{-2} \ s^{-1}]` is the maximum carboxylation rate,
:math:`J \ [\mu mol \ m^{-2} \ s^{-1}]` electron transport rate,
:math:`TPU \ [\mu mol \ m^{-2} \ s^{-1}]` Triose phosphates transport rate,
:math:`K_c \ [\mu mol \ {mol}^{-1}]` Michaelis-Menten constant for the carboxylase,
:math:`K_o \ [mmol \ {mol}^{-1}]` Michaelis-Menten constant for the oxygenase, and
:math:`O \ [mmol \ {mol}^{-1}]` oxygen concentration.
Finally, :math:`J` is given as:
.. math::
J = \frac{\alpha \cdot {PPFD}}{\sqrt{1 + \frac{\alpha^2 \cdot {PPFD}^2}{J_{max}^2}}}
where
:math:`J_{max} \ [\mu mol \ m^{-2} \ s^{-1}]` is maximum electron transport rate, and
:math:`PPFD \ [\mu mol \ m^{-2} \ s{-1}]` is photosynthetic photon flux density.
The impact of leaf temperature on the photosynthesis parameters is accounted for using Arrhenius functions.
For :math:`V_{c, \ max}`, :math:`J_{max}`, :math:`TPU`, and :math:`R_d` temperature dependency writes:
.. math::
P = P^{25} \cdot \
\frac {\exp \left(c - \frac{\Delta H_a}{R \cdot T_{leaf}} \right)}
{1 + \exp \left(\frac {\Delta S \cdot T_{leaf} - \Delta H_d}
{R \cdot T_{leaf}} \right)}
where
:math:`P` denotes any of :math:`V_{c, \ max}`, :math:`J_{max}`, :math:`TPU`, and :math:`R_d` parameters,
:math:`P^{25}` is the value of :math:`P` at 25 \ :math:`^\circ C`,
:math:`c \ [-]` is a shape parameter,
:math:`\Delta H_a \ [kJ \ {mol}_{CO_2}^{-1}]` is activation energy of the Arrhenius functions,
:math:`\Delta H_d \ [kJ \ {mol}_{CO_2}^{-1}]` is deactivation energy of the Arrhenius functions,
:math:`\Delta S \ [kJ \ K^{-1} \ {mol}_{CO_2}^{-1}]` is entropy term,
:math:`R \ [kJ \ K^{-1} \ {mol}^{-1}]` is the ideal gas constant, and
:math:`T_{leaf} \ [K]` is leaf temperature.
Finally, for :math:`\Gamma`, :math:`K_c`, and :math:`K_o` temperature dependency writes:
.. math::
P = \exp \left(
c - \frac{\Delta H_a}{R \cdot T_{leaf}}
\right)
Variable intra-canopy photosynthetic capacities
-----------------------------------------------
Leaf photosynthetic traits (
:math:`V_{cmax}`, :math:`J_{max}`, :math:`TPU` and :math:`R_d`; cf. Appendix I in **Albasha et al., 2019**) are set
to vary as a function leaf nitrogen content per unit leaf surface area (:math:`N_a, \ g_N \ m^{-2}`) following
**Prieto et al. (2012)**:
.. math::
P^{25} = S_{N_a} \ N_a - b_{N_a}
where
:math:`P^{25} \ [\mu mol \ m^{-2} \ s^{-1}]` is the value at 25 :math:`^\circ C` for any of the rates
of :math:`V_{cmax}`, :math:`J_{max}`, :math:`TPU` or :math:`R_d`,
:math:`S_{N_a} \ [\mu mol \ g_N^{-1} \ s^{-1}]` and
:math:`b_{N_a} \ [\mu mol \ m^{-2} \ s^{-1}]`
are the slope and the intercept of the linear relationship with :math:`N_a` specific to each rate.
:math:`N_a` is calculated as the product of nitrogen content per unit leaf dry mass (
:math:`N_m, \ g_N \ g_{drymatter}^{-1}`) and leaf dry mass per area (:math:`LMA, \ g_{drymatter} \ m^{-2}`).
:math:`N_m` linearly varies with plant age, expressed as the thermal time cumulated since budburst, and :math:`LMA`
is determined by leaf exposure to light during the last past days **(Prieto et al., 2012)**, as expressed
respectively in the two following equations:
.. math::
\begin{array}{l}
N_m = a_N \cdot \sum_{i=budburst}^d {\left( \max{\left( 0, T_{air, \i} - T_b \right)} \right)} + b_N \\
LMA = a_M \cdot \ \ln{(PPFD_{10})} + b_M
\end{array}
where
:math:`T_{air, \ i} \ [^\circ C]` is the mean temperature of the day :math:`i`,
:math:`T_b \ [^\circ C]` is the base temperature (minimum required for growth), set to 10 :math:`\ ^\circ C` for
grapevine and used for the calculation of thermal time since budburst,
:math:`a_N \ [g_N \ g_{drymatter}^{-1} \ ^\circ C \ d^{-1}]` and
:math:`b_N \ [g_N \ g_{drymatter}^{-1}]` are the slope and intercept of the linear relationship between :math:`N_m`
and accumulated thermal time since budburst,
:math:`PPFD_{10} \ [mol_{photon} \ m^{-2} \ d^{-1}]` is the cumulative photosynthetic photon flux density irradiance
intercepted by the leaf (output of the energy module) averaged over the past 10 days,
:math:`a_M \ [g_{drymatter} \ mol_{photon}^{-1} \ d^{-1}]` and
:math:`b_M \ [g_{drymatter} \ m^{-2}]` are the slope and intercept of the linear relationship between :math:`LMA` and
the logarithm of :math:`PPFD_{10}`.
Photoinhibition
---------------
HydroShoot is provided with an empirical photoinhibition model which assumes that combined heat and water
stresses inhibit photosynthesis by reducing the electron transport rate (:math:`J`):
.. math::
\begin{array}{l}
\Delta H_d = \Delta H_{d, \max} - \max \left( 0, \left( \Delta H_{d, \max} - \Delta H_{d, T} \right) \cdot \min \left( 1, \frac{\Psi_{leaf} - \Psi_{leaf, \max}}{\Psi_{leaf, \min} - \Psi_{leaf, \max}} \right) \right) \\
\Delta H_{d, t} = \Delta H_{d, t1} - \left( \Delta H_{d, t1} - \Delta H_{d, t2} \right) \cdot \min \left( 1, \max \left( 0, \frac{T_{leaf} - T_{leaf1}}{T_{leaf2} - T_{leaf1}} \right) \right)
\end{array}
where
:math:`\Delta H_d \ [kJ \ mol^{-1}]` is calculated after accounting for the joint effects of leaf water potential
:math:`\Psi_{leaf} \ MPa` and temperature :math:`T_{leaf} \ [K]`,
:math:`\Delta H_{d, \ max} \ [kJ \ mol^{-1}]` is the value of :math:`\Delta H_d` without accounting for photoinhibition,
:math:`\Delta H_{d, \ T} \ [kJ mol^{-1}]` is the value of :math:`\Delta H_d` after accounting for the effect of
:math:`T_{leaf}`,
:math:`\Psi_{leaf, \ max}` and :math:`\Psi_{leaf, \ min} \ [MPa]` are leaf water potential values at which
photoinhibition starts and reaches its maximum effect, respectively, finally,
:math:`\Delta H_{d, \ T1}` and :math:`\Delta H_{d, \ T2} \ [kJ mol^{-1}]` are empirical thresholds corresponding to
leaf temperatures :math:`T_{leaf1}` and :math:`T_{leaf2}` which are temperatures at which photoinhibition starts and
reaches its maximum effect, respectively.
Transpiration rate per unit leaf area
-------------------------------------
The transpiration rate (:math:`E, \ mol \ m^{-2} s^{-1}`) is calculated as:
.. math::
E = \frac{1}{\frac{1}{g_{b, \ H_2O}} + \frac{1}{1.6 \cdot g_{s, \ CO_2}}} \left( \frac{VPD}{P_a} \right)
where
:math:`P_a \ [kPa]` is the atmospheric pressure and
:math:`g_{b, \ H_2O} \ [mol \ m^{-2} s^{-1}]` is the boundary layer conductance to water vapor derived from
**Nobel (2005)** as:
.. math::
g_{b, \ H_2O} = \frac{D_{H_2O} \cdot P_v}{R \cdot T_{leaf} \cdot \Delta x}
with
.. math::
D_{H_2O} = D_{H_2O, 0} \cdot \frac{P_a}{P_v} \cdot \left( \frac{T_{leaf}}{273} \right)^{1.8}
where
:math:`D_{H_2O}` is the diffusion coefficient of H2O in the air at 0 :math:`^\circ C` (:math:`2.13 \cdot {10}^{-5} \ m^2 s^{-1}`),
:math:`P_a \ [MPa]` is the ambient air pressure at 0 :math:`^\circ C`,
:math:`P_v \ [MPa]` is water vapor partial pressure, and
:math:`\Delta x \ [m]` is the thickness of the boundary layer defined following **Nobel (2005)** as:
.. math::
\Delta x = 0.004 \sqrt{\frac{l}{v}}
where
:math:`l \ [m]` is the mean length of the leaf in the downwind direction (set to 70% of blade length), and
:math:`v \ [m \ s^{-1}]` is wind speed in the vicinity of the leaf.
Finally, the impact of water stress on stomatal conductance (i.e. via the :math:`f_w` function) is calculated using
one of the following options:
.. math::
f_w =
\left\{
\begin{array}{cl}
\frac{1}{1+\left( \frac{VPD}{D_0} \right)} & (a) \\
\frac{1}{1+\left( \frac{\Psi_{leaf}}{\Psi_{crit, \ leaf}} \right)^n} & (b) \\
\frac{1}{1+\left( \frac{\Psi_{soil}}{\Psi_{crit, \ leaf}} \right)^n} & (c) \\
\end{array}
\right.
where
:math:`VPD \ [kPa]` is vapor pressure deficit (between the leaf and the air),
:math:`D_0 \ [kPa]` shape parameter,
:math:`\Psi_{leaf} \ [MPa]` leaf bulk xylem potential,
:math:`\Psi_{soil} \ [MPa]` soil bulk water potential (assumed equal to xylem potential at the base of the shoot), and
:math:`\Psi_{crit, leaf} \ [MPa]` leaf water potential at which stomatal conductance reduces to half its maximum value.
In case the option :math:`a` is used, stomatal conductance reduction is considered independent from the soil water
status (i.e. following **Leuning, 1995**). In contrast, Both options :math:`b` and `c` allow simulating stomatal
conductance as a function either of leaf water potential (i.e. regarding shoot hydraulic structure) or soil
water potential (i.e. disregarding the hydraulic structure of the shoot).

View file

@ -0,0 +1,913 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="svg64"
width="172.48"
height="198.39999"
viewBox="0 0 172.48 198.39999"
sodipodi:docname="ecophysio_solver_fig_1.jpg.svg"
inkscape:version="0.92.3 (unknown)">
<metadata
id="metadata70">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs68" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1301"
inkscape:window-height="744"
id="namedview66"
showgrid="false"
inkscape:zoom="0.75856857"
inkscape:cx="-400.23818"
inkscape:cy="53.545494"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1"
inkscape:current-layer="svg64" />
<image
width="172.48"
height="198.39999"
preserveAspectRatio="none"
xlink:href="data:image/jpeg;base64,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
3pY/+Z//2Q==
"
id="image72"
x="0"
y="0" />
<rect
style="fill:#ffffff"
id="rect86"
width="112.38272"
height="24.388039"
x="29.33156"
y="86.017273" />
<rect
style="fill:#ffffff"
id="rect88"
width="176.10524"
height="8.8983383"
x="-3.6252491"
y="189.50165" />
<rect
style="fill:#ffffff"
id="rect90"
width="6.591362"
height="2.9661129"
x="157.20398"
y="194.77475" />
<rect
style="fill:#ffffff"
id="rect92"
width="186.53554"
height="14.830564"
x="-6.591362"
y="190.1608" />
<rect
style="fill:#ffffff"
id="rect94"
width="15.703387"
height="193.78604"
x="172.48"
y="0" />
<rect
style="fill:#ffffff"
id="rect98"
width="44.705379"
height="193.12691"
x="172.48"
y="0" />
<rect
style="fill:#ffffff"
id="rect100"
width="28.672424"
height="199.05913"
x="168.4093"
y="-4.6139531" />
<rect
style="fill:#ffffff"
id="rect102"
width="305.8392"
height="46.139534"
x="-77.778069"
y="-42.843853" />
</svg>

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 KiB

View file

@ -0,0 +1 @@
.. include:: ../HISTORY.rst

View file

@ -0,0 +1,46 @@
===================
Hydraulic structure
===================
The *hydraulic* module computes the distribution of xylem water potential across plant segments by analogy to Ohms law
(:numref:`fig_1_hydraulic`)
.. _fig_1_hydraulic:
.. figure:: figs/hydraulic.png
Illustration of the variables required to calculate the hydraulic structure: water flux (:math:`F`),
hydraulic conductivity (:math:`K`), water pressure at upper (downstream) and lower (upstream) extremities
of the conducting element (respectively :math:`H_u` and :math:`H_l`), and the length of the segment (:math:`L`).
Water flux (:math:`F, \ kg \ s^{-1}`) across the hydraulic segment of length (:math:`L, \ m`)
is driven by the difference of xylem pressures across this segment (:math:`H_u - H_l, \ MPa`)
and regulated by segment's hydraulic conductivity (:math:`K, \ kgs^{-1} \ m \ MPa^{-1}`):
.. math::
F = - K \cdot \frac{H_u - H_l}{L}
The hydraulic conductivity varies with water potential as a result of xylem cavitation under water deficit
**(Tyree and Sperry, 1989)**. This relationship is described in HydroShoot as:
.. math::
K = K_{max} \cdot \frac{1} {\left( 1 + \left( \frac{\Psi}{\Psi_{crit, \ stem}} \right) ^{c_{x1}} \right)}
where
:math:`K_{max} \ [kg \ s^{-1} \ m \ MPa^{-1}]` is the maximum conductivity of the segment,
:math:`\Psi \ [MPa]` is the arithmetic mean of xylem potential of the segment,
:math:`\Psi_{crit, \ stem} \ [MPa]` and
:math:`c_{x1} \ [-]` are shape parameters.
:math:`K_{max}` is estimated empirically as proposed by **Tyree and Zimmermann (2002)** as:
.. math::
K_{max} = c_{x2} \cdot D^{c_{x3}}
where
:math:`D \ [m]` is the average diameter of the segment, and
:math:`c_{x2}` and
:math:`c_{x3}` are shape parameters, mostly given within the ranges of [2.5, 2.8] and [2.0, 5.0], respectively.
The last two equations apply to all conducting segments (not leaves blades). Water potential of the upper extremity
of the petiole is assumed equal to that of the lumped leaf water potential :math:`\Psi_{leaf} \ [MPa]`.

27
hydroshoot/doc/index.rst Normal file
View file

@ -0,0 +1,27 @@
.. HydroShoot documentation master file, created by
sphinx-quickstart on Thu May 30 13:38:38 2019.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to HydroShoot's documentation!
======================================
.. toctree::
:maxdepth: 3
:caption: Contents:
installation
overview
model_description
usage
Further reading
===============
.. toctree::
authors
history
contributing

View file

@ -0,0 +1,13 @@
============
Installation
============
HydroShoot can be installed automagically using the openalea3 channel from anaconda:
.. code::
mamba create -n hydroshoot -c openalea3 -c conda-forge openalea.hydroshoot
mamba activate hydroshoot
You're done !

36
hydroshoot/doc/make.bat Normal file
View file

@ -0,0 +1,36 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
set SPHINXPROJ=HydroShoot
if "%1" == "" goto help
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
:end
popd

View file

@ -0,0 +1,15 @@
=================
Model description
=================
All information in this section are taken from HydroShoot's paper
(`Albasha et al., 2019 <https://doi.org/10.1093/insilicoplants/diz007>`_).
Please refer to the this paper for a detailed description of model's formulae and evaluation.
.. toctree::
:maxdepth: 1
ecophysio
ecophysio_solver
refs

View file

@ -0,0 +1,53 @@
========
Overview
========
What is HydroShoot about?
=========================
HydrShoot is a functional-structural plant model that simulates the interactions between shoot's hydraulic structure,
gas-exchange and energy-budget, at the organ level.
.. |fig1| image:: figs/intro_canopy.png
:width: 300
.. |fig2| image:: figs/intro_irradiance.png
:width: 300
.. |fig3| image:: figs/intro_hydraulic.png
:width: 300
.. |fig4| image:: figs/intro_net_photosynthesis.png
:width: 300
.. |fig5| image:: figs/intro_transpiration.png
:width: 300
.. |fig6| image:: figs/intro_temperature.png
:width: 300
.. table::
:align: center
+--------+--------+
| |fig1| | |fig2| |
+--------+--------+
| |fig3| | |fig4| |
+--------+--------+
| |fig5| | |fig6| |
+--------+--------+
**Plant shoot is static** to HydroShoot. That is the model does not simulate plant growth nor its development.
Its usage would therefore be only sound only if shoot's structure can be assumed constant across a given span of time
(let's say a week or so for grapevine).
Why would you be interested in it?
==================================
HydroShoot may be useful for example if you would like to explore:
- how leaf net carbon assimilation rate (:math:`A_n`), transpiration rate (:math:`E`), temperature (:math:`T`) and
bulk water potential (:math:`\Psi_{leaf}`) interact across the canopy
- how soil water status impacts :math:`A_n`, :math:`E`, :math:`T`, and :math:`\Psi_{leaf}`
- how the structure of the shoot impacts :math:`A_n`, :math:`E`, :math:`T`, and :math:`\Psi_{leaf}`
- how soil water potential (:math:`\Psi_{soil}`) propagates across plant's shoot

32
hydroshoot/doc/refs.rst Normal file
View file

@ -0,0 +1,32 @@
==========
References
==========
Albasha R, Fournier C, Pradal C, Chelle M, Prieto J, Louarn G, Simonneau T, Lebon E. 2019.
HydroShoot: a functional-structural plant model for simulating hydraulic structure, gas and energy exchange
dynamics of complex plant canopies under water deficit - application to grapevine (Vitisvinifera L.)
in silico Plants, diz007, https://doi.org/10.1093/insilicoplants/diz007
Evers J, Vos J, Yin X, Romero P, van der Putten P, Struik P. 2010.
Simulation of wheat growth and development based on organ-level photosynthesis and assimilate allocation.
Journal of Experimental Botany 61: 22032216
Farquhar G, von Caemmerer S, Berry J. 1980.
A biochemical model of photosynthetic CO2 assimilation in leaves of C3 species.
Planta 149: 7890.
Leuning R. 1995.
A critical appraisal of a combined stomatal-photosynthesis model for C3 plants.
Plant, Cell and Environment 18: 339355.
Nobel P. 2005.
Temperature and energy budgets. In Nobel S, eds. Physicochemical and Environmental Plant Physiology.
Elsevier Academic Press.
Prieto J, Louarn G, Perez Peña J, Ojeda H, Simonneau T, Lebon E. 2012.
A leaf gas exchange model that accounts for intra-canopy variability by considering leaf nitrogen content and
local acclimation to radiation in grapevine (Vitis vinifera L.)
Plant, Cell and Environment 35: 13131328.
Tyree M, Sperry J. 1989.
Vulnerability of xylem to cavitation and embolism.
Annual review of plant physiology and plant molecular biology 40: 1938.
Tyree M, Zimmermann M. 2002.
Xylem structure and the ascent of sap, Springer Series in Wood Science.
Yin X, Struik P. 2009.
C3 and C4 photosynthesis models: An overview from the perspective of crop modelling.
NJAS - Wageningen Journal of Life Sciences 57: 2738.

152
hydroshoot/doc/usage.rst Normal file
View file

@ -0,0 +1,152 @@
=====
Usage
=====
.. figure:: figs/usage_fig_1.png
:align: center
Illustration of inputs and outputs of HydroShoot.
Three input files are required in order to run HydroShoot. The first contains all model parameters, the second
meteorological data, and the third (optional) soil predawn water potential data. The model returns an undetermined
number of files (:math:`\geq 3`) of two types of outputs.
Set the required files up
-------------------------
1. Model parameters
Almost all model parameters are setup in the **params.json** file.
*params.json* is a *JavaScript Object Notation (JSON)* file that contains the following sections:
* "simulation"
* "planting"
* "phenology"
* "mtg_api"
* "numerical_resolution"
* "irradiance"
* "energy"
* "hydraulic"
* "exchange"
* "soil"
Each of the above sections refers to its homonym process. An exhaustive and thoroughly detailed description
of all the parameters inside each section, their units and their expected values, are given in the
`params_schema.json` file (src/hydroshoot/). The reader is encouraged to refer to this file to know how exactly
to fill up the *params.json* file.
2. Meteorological data (time series)
Meteorological data must be provided using a .csv file whose name must be given in the
`params.json` file ("meteo" parameters).
This file must contain the following columns:
* `time`: a `datetime` string having the format YYYY-MM-DD HH:MM:SS
* `Tac`: air temperature :math:`[^\circ C]`
* `hs`: relative humidity (%)
* `u`: wind speed :math:`[m \ s^{-1}]`
* `Rg`: solar radiation (shortwave irradiance) given even in :math:`[W_{global} \ m_{ground}^{-2}]`,
:math:`[W_{PAR} \ m_{ground}^{-2}]` or :math:`[{\mu mol}_{PPFD} \ m_{ground}^{-2} \ s^{-1}]`.
The user must provide the unit of `Rg` in the `params.json` file ("E_type" parameter).
3. Soil predawn water potential data (time series)
There are two ways to supply predawn soil water potential (:math:`\Psi_{soil}`) to the model:
a. using an external file that must be named "psi_soil.input" (the user will be able to give other names to the file
in the future).
b. using the keyword argument "psi_soil" when calling the simulator:
.. code-block:: python
from hydroshoot import model
model.run(g, working_directory, psi_soil=-0.5)
In this case, the value given in the 'psi_soil' keyword overrides **all values** given in 'psi_soil.input' file.
HydroShoot will force soil water potential value **at each time step** to that given by the keyword 'psi_soil'.
Outputs
-------
The first output file is a *comma-separated values* (csv) file named "time_series.output" (only one file is returned)
that contains the following time-dependent outputs:
* **time**: datetime string (YYYY-MM-DD HH:MM:SS)
* **An**: net carbon assimilation flux of the whole plant :math:`[\mu mol \ s^{-1}]`
* **E**: tranpiration flux of the whole plant :math:`[g \ h^{-1}]`
* **Rg**: absorbed shortwave irradiance by the whole plant :math:`[W \ m_{ground}^{-2}]`
* **Tleaf**: median leaf temperature :math:`[^\circ C]`
The second type of outputs is a pickle (pckl) file in which is stored mtg data **for each simulated time step**. Note
that **pckl files do not contain geometry data**. Geometry is not currently stored as an output since the model expects
it as an input.
Run the model
-------------
Let's take the simple example provided in '~/example/potted_grapevine/'. We will use for this example **architecture**
and **display** modules provided with HydroShoot package (these packages may be removed in the future).
This example runs HydroShoot on a small potted grapevine canopy having two primary shoots.
Let's build the mock-up using the digitalization data provided in "grapevine_pot.csv" file:
.. code-block:: python
from os import getcwd
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
# Path for plant digitalization data.
g = architecture.vine_mtg('grapevine_pot.csv')
for v in traversal.iter_mtg2(grapevine_mtg, grapevine_mtg.root):
architecture.vine_phyto_modular(grapevine_mtg, v)
architecture.vine_mtg_properties(grapevine_mtg, v)
architecture.vine_mtg_geometry(grapevine_mtg, v)
architecture.vine_transform(grapevine_mtg, v)
Display now the scene using **display** module, you should be having something like :numref:`fig_mockup`:
.. code-block:: python
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(),
view_result=True)
.. _fig_mockup:
.. figure:: figs/usage_fig_2.png
Screen shot of the mock-up produced by the "potted_grapevine" example.
You're now ready to run the model using the meteorological data provided in "meteo.input", and forcing soil water
potential to a fixed value of -0.5 :math:`MPa`. Ensure first that the model will run over one hour only by setting
start and end dates of the simulation in the "params.json" file ("sdate": "2012-08-01 11:00:00",
"edate": "2012-08-01 11:00:00").
.. code-block:: python
model.run(g, str(getcwd()) + '/', scene, psi_soil=-0.2, gdd_since_budbreak=100.)
You should now have created the '/output/' folder where output files ("time_series.ouput", "mtg20120801110000.pckl")
are stored. "time_series.ouput" file should contain close values to those below:
.. code-block:: none
time;Rg;An;E;Tleaf
2012-08-01 11:00:00;69.83;7.99;179.17;26.05
.. figure:: figs/usage_fig_3.png
:align: center

View file

@ -0,0 +1,7 @@
* If you aim at running hydroshoot just to discover how it works, use the 'potted_grapevine' example (~1 min).
* The following examples are time-consuming (~45-90 mins each):
- 'gdc_can_1_grapevine'
- 'gdc_can_2_grapevine'
- 'gdc_can_3_grapevine'
- 'vsp_ww_grapevine'
- 'vsp_ws_1_grapevine'

Binary file not shown.

After

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 773 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 953 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 931 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 KiB

View file

@ -0,0 +1,995 @@
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
def plot_figure_6():
"""Generates figure 6 of the paper. This figure traces the hourly values of absorbed irradiance, leaf temeprature,
net plant carbon assimilation rate, and net plant transpiration rate.
"""
training_color = {'gdc': 'blue', 'vsp': 'red', 'lyre': 'green'}
beg_date = datetime(2009, 7, 29, 00, 00, 0, )
end_date = datetime(2009, 7, 29, 23, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='H')
meteo_df = pd.read_csv(example_pth / 'virtual_canopies' / 'gdc' / 'meteo.input',
sep=';', decimal='.', index_col='time') # all simus have the same meteo data
meteo_df.index = pd.DatetimeIndex(meteo_df.index)
meteo_df = meteo_df.loc[datet]
fig, axs = pyplot.subplots(nrows=2, ncols=2, sharex=True, figsize=(6.69, 6))
[ax.grid() for ax in axs.flatten()]
axs[1, 0].plot(datet, meteo_df['Tac'], 'k--')
for training in ('gdc', 'vsp', 'lyre'):
pth = example_pth / 'virtual_canopies' / training
sims_df = pd.read_csv(pth / 'output' / 'time_series.output', sep=';', decimal='.', index_col='time')
sims_df.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims_df.index]
axs[0, 0].plot(datet, sims_df['Rg'], label=training, color=training_color[training])
axs[0, 1].plot(datet, sims_df['An'], label=training, color=training_color[training])
axs[1, 0].plot(datet, sims_df['Tleaf'], label=training, color=training_color[training])
axs[1, 1].plot(datet, sims_df['E'], label=training, color=training_color[training])
# some layout
for iax, ax in enumerate(axs.flatten()):
ax.text(0.875, 0.9, ('(a)', '(b)', '(c)', '(d)')[iax],
transform=ax.transAxes, fontdict={'size': 11})
axs[0, 0].set(xlim=(beg_date, end_date), ylim=(0, 600),
ylabel='$\mathregular{\Phi_{R_g, plant}\/[W\/m^{-2}_{ground}]}$')
axs[1, 0].set(xlabel='hour', ylim=(10, 40),
ylabel='$\mathregular{Temperature\/[^\circ C]}$')
axs[0, 1].set(ylim=(-10, 35),
ylabel='$\mathregular{A_{n, plant}\/[\mu mol\/s^{-1}]}$')
axs[1, 1].set(xlabel='hour', ylim=(0, 400),
ylabel='$\mathregular{E_{plant}\/[g\/h^{-1}]}$')
for ax in axs[1, :]:
ax.set(xlim=(beg_date, end_date))
ax.set_xticklabels(datet, rotation=90)
ax.xaxis.set_major_locator(dates.HourLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('%H'))
axs[0, 0].legend(loc='upper left', prop={'size': 11})
handles, _ = axs[1, 0].get_legend_handles_labels()
axs[1, 0].legend(handles=[handles[0], ], labels=('$\mathregular{T_{air}}$',), loc='upper left',
prop={'size': 11})
axs[1, 0].set_xticks(axs[1, 0].get_xticks()[:-1:2])
fig.tight_layout()
fig.savefig('fig_6.png', dpi=600.)
pyplot.close(fig)
def plot_figure_7():
"""Generates figure 7 of the paper. This figure shows a snapshot at solar midday of water potential distribution
across three virtual canopies.
"""
training_color = {'gdc': 'blue', 'vsp': 'red', 'lyre': 'green'}
obs_date = datetime(2009, 7, 29, 14, 00, 0, )
fig, axs = pyplot.subplots(nrows=3, ncols=2, sharex=True, figsize=(6.69, 6),
gridspec_kw={'width_ratios': [0.8, 0.2]})
for i, training in enumerate(('vsp', 'gdc', 'lyre')):
pth = example_pth / 'virtual_canopies' / training
g, _ = mtg_load(pth / 'output' / f"mtg{obs_date.strftime('%Y%m%d%H%M%S')}")
axs[i, 0] = display.property_map(g, 'psi_head', color=training_color[training],
ax=axs[i, 0])
axs[i, 0].set(ylim=(0, 250), xlim=(-1.7, -1.2))
axs[i, 0].legend([training], prop={'size': 11})
axs[i, 0].xaxis.labelpad = 5
axs[i, 1].boxplot(g.property('psi_head').values(), vert=False, sym='')
# some layout
[ax.set_xlabel('') for ax in axs[:2, 0]]
for ax in axs[:, 1]:
ax.tick_params(axis='y', which='both', labelleft='off')
ax.set_xticklabels(np.arange(-1.7, -1.1, 0.1), rotation=90)
axs[2, 1].set_xlabel('$\mathregular{\Psi\/[MPa]}$')
fig.tight_layout()
fig.savefig('fig_7.png', dpi=600.)
pyplot.close(fig)
def plot_figure_8():
"""Generates figure 8 of the paper. This figure shows a snapshot at solar midday of leaf temperature distribution
across three virtual canopies.
"""
training_color = {'gdc': 'blue', 'vsp': 'red', 'lyre': 'green'}
obs_date = datetime(2009, 7, 29, 14, 00, 0, )
fig, axs = pyplot.subplots(nrows=3, ncols=2, sharex=True, figsize=(6.69, 6),
gridspec_kw={'width_ratios': [0.8, 0.2]})
for i, training in enumerate(('vsp', 'gdc', 'lyre')):
pth = example_pth / 'virtual_canopies' / training
g, _ = mtg_load(pth / 'output' / f"mtg{obs_date.strftime('%Y%m%d%H%M%S')}")
axs[i, 0] = display.property_map(g, 'Tlc', color=training_color[training],
ax=axs[i, 0])
axs[i, 0].set(ylim=(0, 250))
axs[i, 0].legend([training], prop={'size': 11})
axs[i, 0].xaxis.labelpad = 5
axs[i, 1].boxplot(g.property('Tlc').values(), vert=False, sym='')
# some layout
[ax.set_xlabel('') for ax in axs[:2, 0]]
for ax in axs[:, 1]:
ax.tick_params(axis='y', which='both', labelleft='off')
ax.set_xticklabels(range(32, 42), rotation=90)
axs[2, 1].set_xlabel('$\mathregular{T_{leaf}\/[^{\circ}C]}$')
fig.tight_layout()
fig.savefig('fig_8.png', dpi=600.)
pyplot.close(fig)
def plot_figure_9():
"""Generates figure 9 of the paper. This figure compares, simulated to observed xylem water potential.
"""
beg_date = datetime(2012, 8, 1, 00, 00, 0, )
end_date = datetime(2012, 8, 3, 00, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='D')
fig, axs = pyplot.subplots(nrows=3, ncols=3, sharex='all', sharey='all', figsize=(6.69, 6))
for it, training in enumerate(('gdc_can1_grapevine', 'gdc_can2_grapevine', 'gdc_can3_grapevine')):
pth = example_pth / training
for i_day, date in enumerate(datet):
ax = axs[it, i_day]
obs_date = date + pd.Timedelta(hours=13)
g, _ = mtg_load(pth / 'output' / f"mtg{obs_date.strftime('%Y%m%d%H%M%S')}")
ax = display.property_map(g, 'psi_head', ax=ax, prop2='Eabs', color='grey',
colormap='autumn', add_color_bar=False)
obs_df = pd.read_csv(pth / 'var.obs', sep=';', index_col='date')
obs_df.index = pd.DatetimeIndex(obs_df.index)
psi_leaf = obs_df.loc[date, 'psi_leaf']
ax.add_patch(patches.Rectangle((max(psi_leaf), 50),
min(psi_leaf) - max(psi_leaf), 250,
color='0.8', zorder=-1))
if i_day == 0:
ax.text(0.05, 0.075, 'Canopy%d' % (it + 1),
transform=ax.transAxes, fontdict={'size': 11})
if it == 0:
ax.text(0.675, 0.825, obs_date.strftime('%-d %b'),
transform=ax.transAxes, fontdict={'size': 11})
[axi.set_xticklabels(axi.get_xticks(), rotation=90) for axi in axs[2]]
for ax, axi in enumerate(axs):
if ax < 2:
[axi[i_day].set_xlabel('') for i_day in range(3)]
[axi[i_day].set_ylabel('') for i_day in (1, 2)]
[axi[i_day].legend_.remove() for i_day in range(3)]
fig.tight_layout()
fig.subplots_adjust(bottom=0.3)
cbar_ax = fig.add_axes([0.395, 0.1, 0.30, 0.04])
norm = colors.Normalize(0, vmax=2000)
cbar = colorbar.ColorbarBase(cbar_ax, cmap='autumn', orientation='horizontal', norm=norm)
cbar.ax.set_xticklabels(cbar.ax.get_xticklabels(), rotation=90)
cbar.set_label('$\mathregular{PPFD\/[\mu mol\/m^{-2}_{leaf}\/s^{-1}]}$', labelpad=-20, x=-0.4)
fig.savefig('fig_9.png', dpi=600.)
pyplot.close(fig)
def plot_figure_10():
"""Generates figure 10 of the paper. This figure compares, simulated to observed stomatal conductance rates.
"""
beg_date = datetime(2012, 8, 1, 00, 00, 0, )
end_date = datetime(2012, 8, 3, 00, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='D')
fig, axs = pyplot.subplots(nrows=3, ncols=3, sharex='all', sharey='all', figsize=(6.69, 6))
for it, training in enumerate(('gdc_can1_grapevine', 'gdc_can2_grapevine', 'gdc_can3_grapevine')):
pth = example_pth / training
for i_day, date in enumerate(datet):
ax = axs[it, i_day]
obs_date = date + pd.Timedelta(hours=13)
g, _ = mtg_load(pth / 'output' / f"mtg{obs_date.strftime('%Y%m%d%H%M%S')}")
ax = display.property_map(g, 'gs', ax=ax, prop2='Eabs', color='grey',
colormap='autumn', add_color_bar=False)
obs_df = pd.read_csv(pth / 'var.obs', sep=';', index_col='date')
obs_df.index = pd.DatetimeIndex(obs_df.index)
gs_leaf = obs_df.loc[date, 'gs'] / 1000.
ax.add_patch(patches.Rectangle((max(gs_leaf), 50),
min(gs_leaf) - max(gs_leaf), 250,
color='0.8', zorder=-1))
if i_day == 0:
ax.text(0.05, 0.075, 'Canopy%d' % (it + 1),
transform=ax.transAxes, fontdict={'size': 11})
if it == 0:
ax.text(0.675, 0.825, obs_date.strftime('%-d %b'),
transform=ax.transAxes, fontdict={'size': 11})
[axi.set_xticklabels(axi.get_xticks(), rotation=90) for axi in axs[2]]
for ax, axi in enumerate(axs):
if ax < 2:
[axi[i_day].set_xlabel('') for i_day in range(3)]
[axi[i_day].set_ylabel('') for i_day in (1, 2)]
[axi[i_day].legend_.remove() for i_day in range(3)]
fig.tight_layout()
fig.subplots_adjust(bottom=0.3)
cbar_ax = fig.add_axes([0.395, 0.1, 0.30, 0.04])
norm = colors.Normalize(0, vmax=2000)
cbar = colorbar.ColorbarBase(cbar_ax, cmap='autumn', orientation='horizontal', norm=norm)
cbar.ax.set_xticklabels(cbar.ax.get_xticklabels(), rotation=90)
cbar.set_label('$\mathregular{PPFD\/[\mu mol\/m^{-2}_{leaf}\/s^{-1}]}$', labelpad=-20, x=-0.4)
fig.savefig('fig_10.png', dpi=600.)
pyplot.close(fig)
def plot_figure_11():
"""Generates figure 11 of the paper. This figure compares simulated to observed leaf temperatures.
"""
fig, axs = pyplot.subplots(nrows=2, ncols=2, sharey='row', figsize=(6.69, 6))
for iax, training in enumerate(('vsp_ww_grapevine', 'vsp_ws_grapevine')):
pth = example_pth / training
axs[0, iax].grid()
axs[1, iax].grid()
# set dates ************************
beg_date = datetime(2009, 7, 29, 00, 00, 0, )
end_date = datetime(2009, 8, 1, 23, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='H')
# read observations
obs = pd.read_csv(pth / 'temp.obs', sep=';', decimal='.', index_col='date')
obs.index = [datetime.strptime(s, "%d/%m/%Y %H:%M") for s in obs.index]
# read simulations
sims = pd.read_csv(pth / 'output' / 'time_series.output',
sep=';', decimal='.', index_col='time')
sims.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims.index]
sims.index = pd.DatetimeIndex(sims.index)
# plot median simulated leaf temperature
axs[0, iax].plot(sims['Tleaf'], '-k', label='$\mathregular{T_{leaf}}$', linewidth=1)
# plot simulated temperature magnitude
med_sim = np.array([])
q1_sim = np.array([])
q3_sim = np.array([])
for date in datet:
g, _ = mtg_load(pth / 'output' / f"mtg{date.strftime('%Y%m%d%H%M%S')}")
leaf_temp_sim = g.property('Tlc').values()
q1_sim = np.append(q1_sim, min(leaf_temp_sim))
q3_sim = np.append(q3_sim, max(leaf_temp_sim))
med_sim = np.append(med_sim, np.median(leaf_temp_sim))
print(date)
axs[0, iax].fill_between(datet, q1_sim, q3_sim, color='red', alpha=0.5, zorder=0)
# plot observed temperature magnitude
med_obs = np.array([])
q1_obs = np.array([])
q3_obs = np.array([])
for row, date in enumerate(datet):
pos = date.toordinal() + date.hour / 24.
leaf_temp_obs = obs.loc[date, ['Tleaf%d' % d for d in (2, 3, 4, 5, 6, 8, 9, 10)]]
leaf_temp_obs = leaf_temp_obs[~np.isnan(leaf_temp_obs)]
axs[0, iax].boxplot(leaf_temp_obs, positions=[pos], widths=0.01)
q1_obs = np.append(q1_obs, min(leaf_temp_obs))
q3_obs = np.append(q3_obs, max(leaf_temp_obs))
med_obs = np.append(med_obs, np.median(leaf_temp_obs))
print(date)
# compare obs to sim temperature on 1:1 plot
axs[1, iax].plot((10, 50), (10, 50), 'k--')
axs[1, iax].errorbar(x=med_obs, y=med_sim,
xerr=(np.nan_to_num(med_obs - q1_obs), np.nan_to_num(q3_obs - med_obs)),
yerr=(np.nan_to_num(med_sim - q1_sim), np.nan_to_num(q3_sim - med_sim)),
fmt='ro', ecolor='0.5', capthick=1)
# plot MBE and RMSE results on it
diff_obs_sim = (med_sim - med_obs)[~np.isnan(med_sim - med_obs)]
bias = diff_obs_sim.mean()
rmse = np.sqrt(diff_obs_sim ** 2).mean()
axs[1, iax].text(0.50, 0.20, '$\mathregular{MBE\/=\/%.3f}$' % bias,
transform=axs[1, iax].transAxes, fontdict={'size': 11})
axs[1, iax].text(0.50, 0.10, '$\mathregular{RMSE\/=\/%.1f}$' % rmse,
transform=axs[1, iax].transAxes, fontdict={'size': 11})
# some layout
axs[0, 0].set_ylabel('$\mathregular{Temperature\/[^{\circ}C]}$')
axs[1, 0].set_ylabel('$\mathregular{T_{leaf, sim}\/[^{\circ}C]}$')
for ax_upper, ax_lower in zip(axs[0, :], axs[1, :]):
ax_upper.set(xlim=(beg_date, end_date), ylim=(5, 50), xlabel='')
ax_upper.set_xticklabels(datet, rotation=45)
ax_upper.xaxis.set_major_locator(dates.DayLocator())
ax_upper.xaxis.set_major_formatter(dates.DateFormatter('%-d %b'))
ax_lower.set(xlim=(10, 50), ylim=(10, 50),
xlabel='$\mathregular{T_{leaf, obs}\/[^{\circ}C]}$')
for iax, ax in enumerate(axs.flatten()):
ax.text(0.05, 0.875, ('(a)', '(c)', '(b)', '(d)')[iax],
transform=ax.transAxes, fontdict={'size': 11})
fig.tight_layout()
fig.savefig('fig_11.png', dpi=600.)
pyplot.close(fig)
def plot_figure_12():
"""Generates figure 12 of the paper. This figure compares, leaf-to-leaf, simulated to observed leaf and leaf-to-air
temperature.
"""
fig, axs = pyplot.subplots(ncols=3, figsize=(6.69, 2.7))
[ax.grid() for ax in axs]
daily_temp_obs = np.array([])
daily_temp_sim = np.array([])
daily_temp_air = np.array([])
for iax, training in enumerate(('vsp_ww_grapevine', 'vsp_ws_grapevine')):
pth = example_pth / training
# set dates ************************
beg_date = datetime(2009, 7, 29, 00, 00, 0, )
end_date = datetime(2009, 8, 1, 23, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='H')
# read observations
obs = pd.read_csv(pth / 'temp.obs', sep=';', decimal='.', index_col='date')
obs.index = [datetime.strptime(s, "%d/%m/%Y %H:%M") for s in obs.index]
# read simulations
sims = pd.read_csv(pth / 'output' / 'time_series.output',
sep=';', decimal='.', index_col='time')
sims.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims.index]
sims.index = pd.DatetimeIndex(sims.index)
# plot simulated temperature magnitude
med_sim = np.array([])
q_1_sim = np.array([])
q_3_sim = np.array([])
for date in datet:
g, _ = mtg_load(pth / 'output' / f"mtg{date.strftime('%Y%m%d%H%M%S')}")
leaf_temp_sim = g.property('Tlc').values()
q_1_sim = np.append(q_1_sim, min(leaf_temp_sim))
q_3_sim = np.append(q_3_sim, max(leaf_temp_sim))
med_sim = np.append(med_sim, np.median(leaf_temp_sim))
print(date)
# get observed temperature magnitude
med_obs = np.array([])
q1_obs = np.array([])
q3_obs = np.array([])
for row, date in enumerate(datet):
pos = date.toordinal() + date.hour / 24.
leaf_temp_obs = obs.loc[date, ['Tleaf%d' % d for d in (2, 3, 4, 5, 6, 8, 9, 10)]]
leaf_temp_obs = leaf_temp_obs[~np.isnan(leaf_temp_obs)]
q1_obs = np.append(q1_obs, min(leaf_temp_obs))
q3_obs = np.append(q3_obs, max(leaf_temp_obs))
med_obs = np.append(med_obs, np.median(leaf_temp_obs))
print(date)
# read meteo data
meteo_df = pd.read_csv(pth / 'meteo.input', sep=';', decimal='.', index_col='time')
meteo_df.index = pd.DatetimeIndex(meteo_df.index)
air_temperature = meteo_df.loc[datet, 'Tac']
daily_temp_obs = np.append(daily_temp_obs, q1_obs)
daily_temp_obs = np.append(daily_temp_obs, q3_obs)
daily_temp_sim = np.append(daily_temp_sim, q_1_sim)
daily_temp_sim = np.append(daily_temp_sim, q_3_sim)
daily_temp_air = np.append(daily_temp_air, air_temperature)
daily_temp_air = np.append(daily_temp_air, air_temperature)
# minimum temperature
axs[0].plot(q1_obs - air_temperature, q_1_sim - air_temperature,
['b^', 'r^'][iax], label=['WW', 'WD'][iax])
# maximum temperature
axs[0].plot(q3_obs - air_temperature, q_3_sim - air_temperature,
['bo', 'ro'][iax], label=['WW', 'WD'][iax])
axs[1].plot(q1_obs, q_1_sim, ['b^', 'r^'][iax], label=['WW', 'WD'][iax])
axs[1].plot(q3_obs, q_3_sim, ['bo', 'ro'][iax], label=['WW', 'WD'][iax])
axs[2].plot(q3_obs - q1_obs, q_3_sim - q_1_sim, ['bs', 'rs'][iax], label=['WW', 'WD'][iax])
# some layout
axs[0].plot((-8, 12), (-8, 12), 'k--')
axs[0].set(xlabel='$\mathregular{T_{leaf, obs}-T_{air}\/[^\circ C]}$',
ylabel='$\mathregular{T_{leaf, sim}-T_{air}\/[^\circ C]}$',
xlim=(-8, 12), ylim=(-8, 12))
axs[1].plot((10, 45), (10, 45), 'k--')
axs[1].set(xlabel='$\mathregular{T_{leaf, obs}\/[^\circ C]}$',
ylabel='$\mathregular{T_{leaf, sim}\/[^\circ C]}$')
axs[1].xaxis.set_major_locator(ticker.MultipleLocator(20))
axs[2].plot((-2, 14), (-2, 14), 'k--')
axs[2].set(xlabel='$\mathregular{\Delta T_{leaf, obs}\/[^\circ C]}$',
ylabel='$\mathregular{\Delta T_{leaf, sim}\/[^\circ C]}$')
axs[2].xaxis.set_major_locator(ticker.IndexLocator(base=2, offset=2))
axs[2].xaxis.set_major_locator(ticker.MultipleLocator(5))
for i in range(3):
if i == 0:
x, y = daily_temp_obs - daily_temp_air, daily_temp_sim - daily_temp_air
elif i == 1:
x, y = daily_temp_obs, daily_temp_sim
else:
x = np.array([])
x = np.append(x, daily_temp_obs[96:2 * 96] - daily_temp_obs[:96])
x = np.append(x, daily_temp_obs[3 * 96:4 * 96] - daily_temp_obs[2 * 96:3 * 96])
y = np.array([])
y = np.append(y, daily_temp_sim[96:2 * 96] - daily_temp_sim[:96])
y = np.append(y, daily_temp_sim[3 * 96:4 * 96] - daily_temp_sim[2 * 96:3 * 96])
diff_y_x = (y - x)[~np.isnan(y - x)]
bias = (diff_y_x).mean()
rmse = np.sqrt((diff_y_x ** 2).mean())
axs[i].text(0.05, -0.6, '$\mathregular{MBE\/=\/%.3f}$' % bias,
transform=axs[i].transAxes, fontdict={'size': 11})
axs[i].text(0.05, -0.7, '$\mathregular{RMSE\/=\/%.1f}$' % rmse,
transform=axs[i].transAxes, fontdict={'size': 11})
axs[i].text(0.05, 0.875, ['(a)', '(b)', '(c)'][i],
transform=axs[i].transAxes, fontdict={'size': 11})
fig.tight_layout()
fig.subplots_adjust(bottom=0.4)
fig.savefig('fig_12.png', dpi=600.)
pyplot.close(fig)
def plot_figure_13():
"""Generates figure 13 of the paper.
"""
# set dates
beg_date = datetime(2009, 7, 29, 00, 00, 0, )
end_date = datetime(2009, 8, 1, 23, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='H')
fig = pyplot.figure()
gs1 = gridspec.GridSpec(2, 2)
gs1.update(left=0.135, right=0.65, top=0.975, bottom=0.125, wspace=0.1, hspace=0.35)
ax1 = pyplot.subplot(gs1[0, 0])
ax2 = pyplot.subplot(gs1[0, 1], sharex=ax1)
ax3 = pyplot.subplot(gs1[1, 0], sharex=ax1)
ax4 = pyplot.subplot(gs1[1, 1], sharex=ax1)
gs2 = gridspec.GridSpec(2, 1)
gs2.update(left=0.67, right=0.865, top=0.975, bottom=0.125, hspace=0.35)
ax5 = pyplot.subplot(gs2[0])
ax6 = pyplot.subplot(gs2[1])
fig.set_figheight(6)
fig.set_figwidth(6.69)
axs = np.array([[ax1, ax2, ax5],
[ax3, ax4, ax6]])
[ax.grid() for ax in axs.flatten()]
for iax, training in enumerate(('vsp_ww_grapevine', 'vsp_ws_grapevine')):
pth = example_pth / training
# read observations
obs_tab = pd.read_csv(pth / 'gas.obs', sep=';', decimal='.', header=0)
obs_tab.time = pd.DatetimeIndex(obs_tab.time)
obs_tab = obs_tab.set_index(obs_tab.time)
axs[0, iax].plot(obs_tab['time'], obs_tab['An_plante'],
color='0.8', marker='o', markeredgecolor='none', label='$\mathregular{A_{n,\/obs}}$')
axs[1, iax].plot(obs_tab['time'], obs_tab['E_plante'],
color='0.8', marker='o', markeredgecolor='none', label='$\mathregular{E_{obs}}$')
# read simulations
sims = pd.read_csv(pth / 'output' / 'time_series.output',
sep=';', decimal='.', index_col='time')
sims.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims.index]
sims.index = pd.DatetimeIndex(sims.index)
axs[0, iax].plot(sims['An'],
'b-', label='$\mathregular{A_{n,\/sim}}$', linewidth=1)
axs[1, iax].plot(sims['E'],
'b-', label='$\mathregular{E_{sim}}$', linewidth=1)
sims['itime'] = sims.index
obs_tab['time'] = pd.DatetimeIndex(obs_tab.time)
time_group = []
for itime in obs_tab.time:
if itime.minute < 30:
time = itime - pd.Timedelta(minutes=itime.minute)
else:
time = itime + pd.Timedelta(minutes=60 - itime.minute)
time_group.append(time)
obs_tab['itime'] = time_group
obs_grouped = obs_tab.groupby('itime').aggregate(np.mean)
obs_grouped['itime'] = obs_grouped.index
m_df = pd.merge(obs_grouped, sims)
axs[0, 2].plot(m_df['An_plante'], m_df['An'], ('bo', 'ro')[iax])
axs[1, 2].plot(m_df['E_plante'], m_df['E'], ('bo', 'ro')[iax])
for egas, igas in enumerate(('An', 'E')):
x = m_df[igas + '_plante'].values
y = m_df[igas].values
xindex = np.isfinite(x)
yindex = np.isfinite(y)
xyindex = xindex * yindex
x, y = x[xyindex], y[xyindex]
bias = (y - x).mean()
rmse = np.sqrt(((x - y) ** 2).mean())
axs[egas, iax].text(0.25, 0.90,
'$\mathregular{MBE\/=\/%.1f}$' % bias,
transform=axs[egas, iax].transAxes,
fontdict={'size': 11})
axs[egas, iax].text(0.25, 0.8,
'$\mathregular{RMSE\/=\/%.1f}$' % rmse,
transform=axs[egas, iax].transAxes,
fontdict={'size': 11})
axs[0, 2].plot((-20, 50), (-20, 50), 'k--')
axs[1, 2].plot((-200, 1000), (-200, 1000), 'k--')
for i, ax in enumerate(axs.flatten()):
ax.text(0.05, 0.9, ('(a)', '(b)', '(e)', '(c)', '(d)', '(f)')[i],
transform=ax.transAxes, fontdict={'size': 11})
# some layout
axs[0, 0].set(
ylabel='$\mathregular{A_{n, plant}\/[\mu mol\/s^{-1}]}$',
xlim=(beg_date, end_date),
ylim=(-20, 50))
axs[1, 0].set(
ylabel='$\mathregular{E_{plant}\/[g\/h^{-1}]}$',
xlim=(beg_date, end_date),
ylim=(-200, 1000))
axs[0, 1].set(
xlim=(beg_date, end_date),
ylim=(-20, 50))
axs[1, 1].set(
xlim=(beg_date, end_date),
ylim=(-200, 1000))
axs[0, 2].set(
xlabel='$\mathregular{A_{n, plant, obs}\/[\mu mol\/s^{-1}]}$',
ylabel='$\mathregular{A_{n, plant, sim}\/[\mu mol\/s^{-1}]}$',
xlim=(-20, 50),
ylim=(-20, 50))
axs[1, 2].set(
xlabel='$\mathregular{E_{plant, obs}\/[g\/h^{-1}]}$',
ylabel='$\mathregular{E_{plant, sim}\/[g\/h^{-1}]}$',
xlim=(-200, 1000),
ylim=(-200, 1000))
axs[0, 1].get_yaxis().set_ticklabels('')
axs[1, 1].get_yaxis().set_ticklabels('')
axs[1, 1].get_yaxis().set_ticklabels('')
axs[0, 2].yaxis.tick_right()
axs[1, 2].yaxis.tick_right()
axs[0, 2].yaxis.set_label_position('right')
axs[1, 2].yaxis.set_label_position('right')
axs[0, 2].xaxis.set_major_locator(ticker.MultipleLocator(25))
axs[1, 2].xaxis.set_major_locator(ticker.MultipleLocator(500))
for ax in axs[:, :2].flatten():
ax.set_xticklabels(datet, rotation=90)
ax.xaxis.set_major_locator(dates.DayLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('%-d %b'))
fig.savefig('fig_13.png', dpi=600.)
pyplot.close(fig)
def plot_figure_14():
"""Generates figure 14 of the paper. This figure compares, simulated to observed plant transpiration rates.
"""
fig, axs = pyplot.subplots(nrows=3, ncols=4, sharey='row', figsize=(6.69, 6))
for i_treat, training in enumerate(('gdc_can1_grapevine', 'gdc_can2_grapevine', 'gdc_can3_grapevine')):
pth = example_pth / training
# read observations
obs_df = pd.read_csv(pth / 'sapflow.obs', sep=';', decimal='.', index_col='date')
obs_df.index = [datetime.strptime(s, "%d/%m/%Y %H:%M") for s in obs_df.index]
time_group = []
for itime in obs_df.index:
if itime.minute < 30:
time = itime - pd.Timedelta(minutes=itime.minute)
else:
time = itime + pd.Timedelta(minutes=60 - itime.minute)
time_group.append(time)
obs_df['itime'] = time_group
obs_grouped = obs_df.groupby('itime').aggregate(np.mean)
obs_grouped['itime'] = obs_grouped.index
# read simulations
sims = pd.read_csv(pth / 'output' / 'time_series.output',
sep=';', decimal='.', index_col='time')
sims.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims.index]
sims.index = pd.DatetimeIndex(sims.index)
sims['itime'] = sims.index
m_df = pd.merge(obs_grouped, sims)
x = m_df['west'].values + m_df['east'].values
y = m_df['sapWest'].values + m_df['sapEast'].values
x_index = np.isfinite(x)
y_index = np.isfinite(y)
xy_index = x_index * y_index
x, y = x[xy_index], y[xy_index]
for iax, ax in enumerate(axs[i_treat, :]):
ax.xaxis.grid(which='minor', zorder=0)
ax.yaxis.grid(which='major', zorder=0)
ax.plot(sims.index, sims.sapEast, c='r', linewidth=1)
ax.plot(sims.index, sims.sapWest, c='b', linewidth=1)
ax.plot(obs_df.index, obs_df['east'], label='East', color='red',
marker='o', markeredgecolor='none', alpha=0.1)
ax.plot(obs_df.index, obs_df['west'], label='West', color='blue',
marker='o', markeredgecolor='none', alpha=0.1)
x_t = x[iax * 24:iax * 24 + 23]
y_t = y[iax * 24:iax * 24 + 23]
x_index = np.isfinite(x_t)
y_index = np.isfinite(y_t)
xy_index = x_index * y_index
x_t, y_t = x_t[xy_index], y_t[xy_index]
bias = (y_t - x_t).mean()
rmse = np.sqrt(((x_t - y_t) ** 2).mean())
ax.text(0.45, 0.675,
'$\mathregular{MBE\/=\/%.1f}$' % bias,
transform=ax.transAxes, fontdict={'size': 7})
ax.text(0.45, 0.575,
'$\mathregular{RMSE\/=\/%.1f}$' % rmse,
transform=ax.transAxes, fontdict={'size': 7})
# some layout
for day in range(4):
day_sdate = datetime(2012, 8, 1, 00, 00, 0, ) + timedelta(days=day)
day_edate = day_sdate + timedelta(hours=23)
for can in range(3):
axs[can, day].set_xlim(day_sdate, day_edate)
axs[can, day].yaxis.set_major_locator(ticker.MultipleLocator(100))
if can != 2:
axs[can, day].xaxis.set_ticklabels('')
axs[can, day].xaxis.set_minor_locator(dates.HourLocator(interval=5))
else:
axs[can, day].set_xticklabels(pd.date_range(day_sdate, day_edate, freq='H'),
rotation=90)
axs[can, day].xaxis.set_major_locator(dates.DayLocator())
axs[can, day].xaxis.set_major_formatter(dates.DateFormatter('%-d %b'))
axs[can, day].xaxis.set_minor_locator(dates.HourLocator(interval=5))
axs[can, day].xaxis.set_minor_formatter(dates.DateFormatter('%H'))
axs[can, day].tick_params(axis='x', which='major', pad=15)
axs[1, 0].set_ylabel('$\mathregular{E\/[g\/h^{-1}]}$')
axs[0, 0].set_ylim(0, 800)
axs[1, 0].set_ylim(0, 450)
axs[2, 0].set_ylim(0, 500)
for can in range(3):
axs[can, 0].text(0.05, 0.85, 'Canopy%s' % str(can + 1),
transform=axs[can, 0].transAxes, fontdict={'size': 11})
fig.tight_layout()
fig.subplots_adjust(left=0.13, bottom=0.3)
h1, l1 = axs[2, 2].get_legend_handles_labels()
axs[2, 0].legend(h1, ('$\mathregular{SapEast_{sim}}$', '$\mathregular{SapWest_{sim}}$',
'$\mathregular{SapEast_{obs}}$', '$\mathregular{SapWest_{obs}}$'),
frameon=True, bbox_to_anchor=(-0.36, -1.2, 2, .102),
loc=3, ncol=8, prop={'size': 11})
fig.subplots_adjust(wspace=0.075)
fig.savefig('fig_14.png', dpi=600.)
pyplot.close(fig)
def plot_figure_15():
"""Generates figure 15 of the paper. This figure compares simulated to observed plant photosynthesis and
transpiration rates using 4 simulation parameters' sets (modularity test)
"""
# set dates
beg_date = datetime(2009, 7, 29, 00, 00, 0, )
end_date = datetime(2009, 8, 1, 23, 00, 0, )
datet = pd.date_range(beg_date, end_date, freq='H')
style = ('b-', 'k--', 'k-.', 'k-', 'k:')
vpd_air = np.vectorize(VPDa)
fig, axs = pyplot.subplots(nrows=2, ncols=2, sharey='row', sharex='all', figsize=(6.69, 6))
[ax.grid() for ax in axs.flatten()]
for i_treat, treat in enumerate(('ww', 'ws')):
pth = example_pth / ('vsp_%s_grapevine' % treat)
# read and plot observations
obs_df = pd.read_csv(pth / 'gas.obs', sep=';', decimal='.')
obs_df.time = pd.DatetimeIndex(obs_df.time)
obs_df = obs_df.set_index(obs_df.time)
axs[0, i_treat].plot(obs_df['time'], obs_df['An_plante'],
color='0.8', marker='o', markeredgecolor='none', label='$\mathregular{A_{n,\/obs}}$')
axs[1, i_treat].plot(obs_df['time'], obs_df['E_plante'],
color='0.8', marker='o', markeredgecolor='none', label='$\mathregular{E_{obs}}$')
# read and plot vpd
meteo_df = pd.read_csv(pth / 'meteo.input', sep=';', decimal='.', index_col='time')
meteo_df.index = pd.DatetimeIndex(meteo_df.index)
meteo_df['vpd'] = vpd_air(meteo_df.Tac, meteo_df.Tac, meteo_df.hs)
axt = axs[1, i_treat].twinx()
axt.plot(datet, meteo_df.loc[datet, 'vpd'], 'r-')
# read and plot simulations
for case in range(5):
if case == 0:
sim_pth = pth / 'output' / 'time_series.output'
else:
sim_pth = example_pth / 'modularity' / treat / ('sim_%d' % case) / 'output' / 'time_series.output'
sims = pd.read_csv(sim_pth, sep=';', decimal='.', index_col='time')
sims.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims.index]
sims.index = pd.DatetimeIndex(sims.index)
axs[0, i_treat].plot(sims['An'], style[case], label='sim0', linewidth=1)
axs[1, i_treat].plot(sims['E'], style[case], label='sim0', linewidth=1)
for i, ax in enumerate(axs.flatten()):
ax.text(0.05, 0.9, ('(a)', '(b)', '(c)', '(d)')[i], transform=ax.transAxes,
fontdict={'size': 11})
axs[0, 0].set(
ylabel='$\mathregular{A_{n, plant}\/[\mu mol\/s^{-1}]}$',
ylim=(-20, 50))
axs[1, 0].set(
ylabel='$\mathregular{E_{plant}\/[g\/h^{-1}]}$',
xlim=(beg_date, end_date),
ylim=(-200, 1600))
[ax.set_ylim(0, 5) for ax in fig.get_axes()[-2:]]
fig.get_axes()[-1].set(ylabel='VPD [kPa]')
for ax in axs[1, :].flatten():
ax.set_xticklabels(datet, rotation=90)
ax.xaxis.set_major_locator(dates.DayLocator())
ax.xaxis.set_major_formatter(dates.DateFormatter('%-d %b'))
fig.tight_layout()
fig.subplots_adjust(bottom=0.25)
h1, l1 = axs[1, 1].get_legend_handles_labels()
h2, l2 = fig.get_axes()[-1].get_legend_handles_labels()
axs[1, 0].legend(h1 + h2, ['obs'] + ['sim%d' % d for d in range(5)] + ['VPD'], frameon=True,
bbox_to_anchor=(0.15, -0.75, 2, .102), loc=3, ncol=4,
prop={'size': 11})
fig.savefig('fig_15.png', dpi=600.)
pyplot.close(fig)
def write_table_1():
"""Generates table 1 of the paper. This table compares simulated to observed plant photosynthesis and
transpiration rates using 4 simulation parameters' sets (modularity test)
"""
indices = [['ww'] * 5 + ['ws'] * 5,
['sim%d' % d for d in range(5)] * 2]
multiple_index = pd.MultiIndex.from_tuples(list(zip(*indices)), names=['treat', 'sim'])
df = pd.DataFrame(columns=('an_mbe', 'an_rmse', 'e_mbe', 'e_rmse'),
index=multiple_index)
for i_treat, treat in enumerate(('ww', 'ws')):
pth = example_pth / ('vsp_%s_grapevine' % treat)
# read observations
obs_df = pd.read_csv(pth / 'gas.obs', sep=';', decimal='.')
obs_df.time = pd.DatetimeIndex(obs_df.time)
obs_df = obs_df.set_index(obs_df.time)
# read simulations
for case in range(5):
if case == 0:
sim_pth = pth / 'output' / 'time_series.output'
else:
sim_pth = example_pth / 'modularity' / treat / ('sim_%d' % case) / 'output' / 'time_series.output'
sims_df = pd.read_csv(sim_pth, sep=';', decimal='.', index_col='time')
sims_df.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims_df.index]
sims_df.index = pd.DatetimeIndex(sims_df.index)
# match sims to obs
sims_df['itime'] = sims_df.index
obs_df['time'] = pd.DatetimeIndex(obs_df.time)
time_group = []
for itime in obs_df.index:
if itime.minute < 30:
time = itime - pd.Timedelta(minutes=itime.minute)
else:
time = itime + pd.Timedelta(minutes=60 - itime.minute)
time_group.append(time)
obs_df['itime'] = time_group
obs_grouped = obs_df.groupby('itime').aggregate(np.mean)
obs_grouped['itime'] = obs_grouped.index
m_df = pd.merge(obs_grouped, sims_df)
for gas in ('An', 'E'):
rate_obs = m_df['%s_plante' % gas].values
rate_sim = m_df[gas].values
x_index = np.isfinite(rate_obs)
y_index = np.isfinite(rate_sim)
xy_index = x_index * y_index
rate_obs, rate_sim = rate_obs[xy_index], rate_sim[xy_index]
bias = (rate_sim - rate_obs).mean()
rmse = np.sqrt(((rate_obs - rate_sim) ** 2).mean())
df.loc[(treat, 'sim%d' % case), '%s_mbe' % gas.lower()] = bias
df.loc[(treat, 'sim%d' % case), '%s_rmse' % gas.lower()] = rmse
print(df)
df.to_csv('table_1.csv')
def estimate_energy_balance_contribution():
"""Generates table 1 of the paper. This table compares simulated to observed plant photosynthesis and
transpiration rates using 4 simulation parameters' sets (modularity test)
"""
indices = [['ww'] * 4 + ['ws'] * 4,
['day%d' % d for d in range(1, 5)] * 2]
multiple_index = pd.MultiIndex.from_tuples(list(zip(*indices)), names=['treat', 'day'])
df = pd.DataFrame(columns=('e_obs', 'e_sim0', 'e_sim3'),
index=multiple_index)
for i_treat, treat in enumerate(('ww', 'ws')):
pth = example_pth / ('vsp_%s_grapevine' % treat)
# read observations
obs_df = pd.read_csv(pth / 'gas.obs', sep=';', decimal='.')
obs_df.time = pd.DatetimeIndex(obs_df.time)
obs_df = obs_df.set_index(obs_df.time)
# read simulations
for case in (0, 3):
if case == 0:
sim_pth = pth / 'output' / 'time_series.output'
else:
sim_pth = example_pth / 'modularity' / treat / ('sim_%d' % case) / 'output' / 'time_series.output'
sims_df = pd.read_csv(sim_pth, sep=';', decimal='.', index_col='time')
sims_df.index = [datetime.strptime(s, "%Y-%m-%d %H:%M:%S") for s in sims_df.index]
sims_df.index = pd.DatetimeIndex(sims_df.index)
# match sims to obs
sims_df['itime'] = sims_df.index
obs_df['time'] = pd.DatetimeIndex(obs_df.time)
time_group = []
for itime in obs_df.index:
if itime.minute < 30:
time = itime - pd.Timedelta(minutes=itime.minute)
else:
time = itime + pd.Timedelta(minutes=60 - itime.minute)
time_group.append(time)
obs_df['itime'] = time_group
obs_grouped = obs_df.groupby('itime').aggregate(np.mean)
obs_grouped['itime'] = obs_grouped.index
m_df = pd.merge(obs_grouped, sims_df)
rate_obs = m_df['E_plante'].values
rate_sim = m_df['E'].values
for day in range(4):
rate_obs_daily = rate_obs[day * 24: day * 24 + 24]
rate_sim_daily = rate_sim[day * 24: day * 24 + 24]
x_index = np.isfinite(rate_obs_daily)
y_index = np.isfinite(rate_sim_daily)
xy_index = x_index * y_index
rate_obs_daily, rate_sim_daily = rate_obs_daily[xy_index], rate_sim_daily[xy_index]
df.loc[(treat, 'day%d' % (day + 1)), 'e_obs'] = sum(rate_obs_daily)
df.loc[(treat, 'day%d' % (day + 1)), 'e_sim%d' % case] = sum(rate_sim_daily)
df['energy_effect'] = (df['e_sim3'] - df['e_sim0']) / df['e_sim0']
print(df)
if __name__ == '__main__':
import pandas as pd
import numpy as np
from pathlib import Path
from datetime import datetime, timedelta
from matplotlib import dates, pyplot, patches, colors, colorbar, rcParams, ticker, gridspec
from hydroshoot.architecture import mtg_load
from hydroshoot.utilities import vapor_pressure_deficit as VPDa
from hydroshoot import display
rcParams.update({'font.size': 11})
pyplot.style.use('seaborn-ticks')
example_pth = Path(__file__).parents[2] / 'example'
plot_figure_6()
plot_figure_7()
plot_figure_8()
plot_figure_9()
plot_figure_10()
plot_figure_11()
plot_figure_12()
plot_figure_13()
plot_figure_14()
plot_figure_15()
write_table_1()
estimate_energy_balance_contribution()

View file

@ -0,0 +1,11 @@
treat,sim,an_mbe,an_rmse,e_mbe,e_rmse
ww,sim0,-0.051909718477230367,5.4855457305525137,89.466239528284021,141.66446008942523
ww,sim1,1.259010978690791,7.4301344033772123,225.00334182464707,361.18357575613237
ww,sim2,1.2014013791105675,5.2713845531137755,170.15288191369015,247.4531022336021
ww,sim3,-0.25619092657093223,5.5829424838741728,109.17880562355603,154.60276044804414
ww,sim4,0.50396645797126982,5.3957488856738012,100.03530354699046,156.68214220659749
ws,sim0,1.010557860506649,3.7581259962191074,27.650360054899654,67.570546085109285
ws,sim1,3.0316942947008552,6.9534095582668689,193.89281738817965,315.4147399719518
ws,sim2,1.363692781794585,3.8564779052298519,35.407294393274391,71.131528719311277
ws,sim3,1.0450312828027237,3.8226861782122543,34.120378493320707,70.808298231510008
ws,sim4,3.1606701990475412,6.0690600845156348,127.39656220185651,196.01912731881146
1 treat sim an_mbe an_rmse e_mbe e_rmse
2 ww sim0 -0.051909718477230367 5.4855457305525137 89.466239528284021 141.66446008942523
3 ww sim1 1.259010978690791 7.4301344033772123 225.00334182464707 361.18357575613237
4 ww sim2 1.2014013791105675 5.2713845531137755 170.15288191369015 247.4531022336021
5 ww sim3 -0.25619092657093223 5.5829424838741728 109.17880562355603 154.60276044804414
6 ww sim4 0.50396645797126982 5.3957488856738012 100.03530354699046 156.68214220659749
7 ws sim0 1.010557860506649 3.7581259962191074 27.650360054899654 67.570546085109285
8 ws sim1 3.0316942947008552 6.9534095582668689 193.89281738817965 315.4147399719518
9 ws sim2 1.363692781794585 3.8564779052298519 35.407294393274391 71.131528719311277
10 ws sim3 1.0450312828027237 3.8226861782122543 34.120378493320707 70.808298231510008
11 ws sim4 3.1606701990475412 6.0690600845156348 127.39656220185651 196.01912731881146

View file

@ -0,0 +1,450 @@
Souche;tronc;element;sarment;rameau;rang;X;Y;Z;Diam
1;0;1;0;0;0;-2.54;0.68;2.45;7
1;0;2;0;0;0;-1.17;3.1;8.58;5.418
1;0;3;0;0;0;0.65;2.39;17.23;5.505
1;0;4;0;0;0;2.35;2.29;22.19;5.015
1;0;5;0;0;0;3.1;1.27;26.68;4.695
1;0;6;0;0;0;4.24;-0.15;29.71;5.181
1;0;7;0;0;0;5.45;-0.64;34.26;5.213
1;0;8;0;0;0;7.02;-1.95;37.46;4.959
1;0;9;0;0;0;7.09;-1.62;43.82;4.735
1;0;10;0;0;0;8.05;-2.43;47.76;5.115
1;0;11;0;0;0;7.65;-2.41;54.61;4.537
1;0;12;0;0;0;7.04;-4.1;60.76;4.989
1;0;13;0;0;0;6.05;-3.75;66.93;4.915
1;0;14;0;0;0;5.84;-4.78;73.23;5.553
1;0;15;0;0;0;4.46;-4.41;80.03;5.042
1;0;16;0;0;0;3.84;-4.82;85.91;4.863
1;0;17;0;0;0;2;-5;91.94;4.453
1;0;18;0;0;0;2.23;-5.81;99.85;4.696
1;0;19;0;0;0;0.5;-6.85;106.81;4.611
1;0;20;0;0;0;3.23;-7.2;113.39;5.136
1;0;21;0;0;0;3.22;-7.13;120.52;4.995
1;0;22;0;0;0;3.09;-5.81;128.12;5.311
1;0;23;0;0;0;3.6;-5.1;133.73;5.317
1;0;24;0;0;0;2.86;-5.61;140.07;5.583
1;0;25;0;0;0;3.69;-4.97;150.02;5.583
1;1;1;0;0;0;2.06;-1.27;150.44;3.376
1;1;2;0;0;0;2.24;7.04;152.73;2.857
1;1;3;0;0;0;3.16;18.04;157.83;2.858
1;1;4;0;0;0;2.66;29.59;160.43;3.125
1;1;5;0;0;0;6.82;43.34;160.16;2.943
1;1;6;0;0;0;11.51;53.29;156.43;4.061
1;1;6.A;0;0;0;9.57;56.84;147.54;2.38
1;1;6.A;1;0;0;8.28;59.02;146.66;2.312
1;1;6.A;1;1;0;6.33;59.41;146.35;1.609
1;1;6.A;1;1;1;5.36;60.53;147.36;1.224
1;1;6.A;1;1;2;3.12;63.29;148.2;0.977
1;1;6.A;1;1;3;0.08;67.63;149.96;0.907
1;1;6.A;1;1;4;-5.23;76.6;149.67;0.841
1;1;6.A;1;1;5;-10.62;85.12;148.46;0.758
1;1;6.A;1;1;6;-14.33;94.7;144.78;0.716
1;1;6.A;1;1;7;-18.79;107.07;141.12;0.638
1;1;6.A;1;1;8;-21.09;116.53;136.52;0.605
1;1;6.A;1;1;9;-24.34;123.6;134.76;0.586
1;1;6.A;1;1;10;-26.63;133.19;127.26;0.567
1;1;6.A;1;1;11;-30.63;140.47;122.96;0.509
1;1;6.A;1;1;12;-33.15;145.77;118.91;0.466
1;1;6.A;1;1.2_1;1;3.25;64.69;148.6;0.289
1;1;6.A;1;1.2_1;2;3;67.37;147.59;0.156
1;1;6.A;1;1.2_1;3;-0.56;67.34;144.64;0.12
1;1;6.A;1;1.7_1;1;-17.92;106.28;143.52;0.144
1;1;6.A;1;2;0;7.82;60.27;150.05;1.711
1;1;6.A;1;2;1;7.71;59.55;150.5;1.208
1;1;6.A;1;2;2;9.15;60.63;151.36;0.964
1;1;6.A;1;2;3;11;63.79;153.16;0.89
1;1;6.A;1;2;4;14.76;69.03;154.84;0.842
1;1;6.A;1;2;5;18.25;77.29;156.21;0.802
1;1;6.A;1;2;6;23.63;89.81;153.62;0.722
1;1;6.A;1;2;7;28.48;100.32;150.82;0.665
1;1;6.A;1;2;8;29.59;108.14;145.99;0.614
1;1;6.A;1;2;9;34.54;115.78;140.49;0.572
1;1;6.A;1;2;10;37.71;123.3;133.07;0.501
1;1;6.A;1;2;11;40.12;127.52;128.25;0.493
1;1;6.A;1;2;12;40.74;130.23;124.19;0.486
1;1;6.A;1;2;13;42.9;133.85;118.76;0.482
1;1;6.A;1;2;14;43;137.74;114.3;0.482
1;1;6.A;1;2;15;45.54;140.4;111.42;0.436
1;1;6.A;1;2;16;47.7;144.28;106.5;0.443
1;1;6.A;1;2;17;51.05;146.37;102.84;0.395
1;1;6.A;1;2.4_1;1;14.75;72.41;151.9;0.292
1;1;6.A;1;2.5_1;1;16.37;81.82;154.12;0.228
1;1;7;0;0;0;22.93;53.97;155;2.706
1;1;7.A;0;0;0;18.39;56.55;162.91;2.925
1;1;7.A;1;0;0;16.46;56.31;162.16;2.15
1;1;7.A;1;1;0;15.16;55.03;162.79;1.759
1;1;7.A;1;1;1;14.86;55.12;163.58;1.444
1;1;7.A;1;1;2;14.53;55.28;165.44;1.032
1;1;7.A;1;1;3;13.89;55.99;169.76;0.914
1;1;7.A;1;1;4;13.08;56.22;176.76;0.893
1;1;7.A;1;1;5;11.15;56.77;185.17;0.914
1;1;7.A;1;1;6;10.8;53.45;198.82;0.807
1;1;7.A;1;1;7;9.66;49.31;209.63;0.827
1;1;7.A;1;1;8;13.02;40.52;214.21;0.718
1;1;7.A;1;1;9;15.66;29.33;214.74;0.682
1;1;7.A;1;1;10;19.62;24.36;211.63;0.63
1;1;7.A;1;1;11;20.59;20.33;208.62;0.632
1;1;7.A;1;1;12;23.4;15.25;204.57;0.576
1;1;7.A;1;1;13;23.36;10.85;200.69;0.573
1;1;7.A;1;1;14;24.91;8.87;195.79;0.56
1;1;7.A;1;1;15;26.34;6.34;189.16;0.506
1;1;7.A;1;1;16;28.78;4.02;182.8;0.481
1;1;7.A;1;1;17;29.36;1.91;177.23;0.455
1;1;7.A;1;1;18;31.46;0.67;171.9;0.417
1;1;7.A;1;1;19;33.16;-2.85;168.59;0.395
1;1;7.A;1;1;20;35.28;-4.67;165.41;0.394
1;1;7.A;1;1;21;38.73;-8.73;162.38;0.365
1;1;7.A;1;1;22;42.74;-11.08;160.11;0.358
1;1;7.A;1;1.8_1;1;14.92;39.74;216.13;0.384
1;1;7.A;1;1.8_1;2;15.1;40.77;217.63;0.195
1;1;7.A;1;2;0;14.14;57.46;162.89;1.846
1;1;7.A;1;2;1;12.68;58.24;164.06;1.44
1;1;7.A;1;2;2;13.09;59.99;163.54;1.177
1;1;7.A;1;2;3;11.17;63.25;164.82;1.095
1;1;7.A;1;2;4;9.25;69.06;164.99;0.999
1;1;7.A;1;2;5;6.79;76.78;165;0.961
1;1;7.A;1;2;6;4.21;88.92;162.58;0.831
1;1;7.A;1;2;7;1.79;102.5;159.62;0.745
1;1;7.A;1;2;8;0.52;110.81;154.12;0.704
1;1;7.A;1;2;9;-0.27;122.63;148.69;0.582
1;1;7.A;1;2;10;-0.84;130.49;140.7;0.55
1;1;7.A;1;2;11;-1.62;139.63;131.94;0.538
1;1;7.A;1;2;12;-3.11;144.9;125.9;0.487
1;1;7.A;1;2;13;-5.99;150.35;121.87;0.434
1;1;7.A;1;1.5_1;1;6.02;81.87;166.08;0.255
1;1;7.A;1;1.6_1;1;3.89;88.07;161.15;0.139
1;1;8;0;0;0;34.86;48.79;157.52;3.695
1;1;8.A;0;0;0;37.18;47.17;163.06;3.983
1;1;8.A;1;0;0;37.66;48.44;163.5;2.384
1;1;8.A;1;1;0;36.59;49.53;162.8;1.576
1;1;8.A;1;1;1;37.2;50.03;163.08;1.417
1;1;8.A;1;1;2;38.81;51.69;164.96;0.907
1;1;8.A;1;1;3;40.02;54.69;167.87;0.867
1;1;8.A;1;1;4;43;60.01;173.3;0.857
1;1;8.A;1;1;5;44.96;65.88;177.84;0.885
1;1;8.A;1;1;6;50.37;73.34;183.93;0.749
1;1;8.A;1;1;7;53.93;83.72;186.65;0.667
1;1;8.A;1;1;8;57.63;90.79;188;0.594
1;1;8.A;1;1;9;59.42;100.04;186.15;0.574
1;1;8.A;1;1;10;62.56;105.26;184.66;0.522
1;1;8.A;1;1;11;63.56;109.8;182;0.505
1;1;8.A;1;1;12;67.22;114.67;179;0.502
1;1;8.A;1;1;13;69.9;119.34;177.17;0.459
1;1;8.A;1;1;14;74.9;121.09;175.95;0.47
1;1;8.A;1;1;15;80.7;126.81;174.77;0.409
1;1;8.A;1;1;16;86.94;128.14;174.46;0.381
1;1;8.A;1;1;17;91.93;129.46;175.67;0.349
1;1;8.A;1;1;18;97.72;129.45;177.55;0.344
1;1;8.A;1;1;19;101.67;130.38;180.05;0.317
1;1;8.A;1;1;20;104.93;130.1;183.2;0.249
1;1;8.A;1;1.5_1;1;40.63;68.85;182.28;0.553
1;1;8.A;1;1.5_1;2;38.49;70.95;186.5;0.513
1;1;8.A;1;1.5_1;3;36.27;71.79;190.88;0.414
1;1;8.A;1;1.5_1;4;34.92;73.16;195.54;0.442
1;1;8.A;1;1.5_1;5;32.73;73.4;199.03;0.416
1;1;8.A;1;1.5_1;6;31.84;75.5;203.69;0.432
1;1;8.A;1;1.5_1;7;29.89;76.29;207.05;0.347
1;1;8.A;1;1.5_1;8;29.97;78.88;210.82;0.303
1;1;8.A;1;1.5_1;9;29.24;81.25;214.7;0.29
1;1;8.A;1;1.5_1;10;29.39;84.51;218.05;0.242
1;1;8.A;1;1.6_1;1;48.26;72.35;188.02;0.387
1;1;8.A;1;1.6_1;2;46.86;72.41;191.24;0.289
1;1;8.A;1;1.6_1;3;44.83;72.38;196.37;0.262
1;1;8.A;1;2;0;33.93;50.53;164.54;1.441
1;1;8.A;1;2;1;33.24;51.05;165.25;1.217
1;1;8.A;1;2;2;32.53;50.67;166.89;1.103
1;1;8.A;1;2;3;30.72;48.8;167.77;1.017
1;1;8.A;1;2;4;28.03;49.25;171.18;1.007
1;1;8.A;1;2;5;24.19;50.22;176.47;0.974
1;1;8.A;1;2;6;19.05;50.17;182.7;0.959
1;1;8.A;1;2;7;10.67;52.75;189.45;0.906
1;1;8.A;1;2;8;2.99;56.21;195.12;0.886
1;1;8.A;1;2;9;-3.6;61.69;198.89;0.842
1;1;8.A;1;2;10;-13.06;68.4;201.11;0.789
1;1;8.A;1;2;11;-20.44;75.62;198.83;0.722
1;1;8.A;1;2;12;-29.04;81.35;194.83;0.653
1;1;8.A;1;2;13;-33.46;85.86;189.33;0.632
1;1;8.A;1;2;14;-38.27;87.44;185.44;0.625
1;1;8.A;1;2;15;-41.08;90.88;180.54;0.577
1;1;8.A;1;2;16;-45.71;92.06;175.81;0.573
1;1;8.A;1;2;17;-45.57;99.05;171.2;0.552
1;1;8.A;1;2;18;-53.24;102.56;166.93;0.543
1;1;8.A;1;2;19;-57.46;102.98;163.3;0.512
1;1;8.A;1;2;20;-64.06;103.59;160.67;0.514
1;1;8.A;1;2;21;-70.53;108.01;158.86;0.481
1;1;8.A;1;2;22;-76.76;110.13;157.55;0.451
1;1;8.A;1;2;23;-81.27;113.59;156.42;0.432
1;1;8.A;1;2;24;-87.86;113.46;153.94;0.387
1;1;8.A;1;2;25;-94.67;113.9;152.61;0.375
1;1;8.A;1;2;26;-99.56;114.52;150.61;0.345
1;1;8.A;1;2.3_1;1;30.5;50.98;169.61;0.067
1;1;8.A;1;2.4_1;1;28.59;48.53;173.55;0.248
1;1;8.A;1;2.5_1;1;24.85;51.62;179.41;0.302
1;1;8.A;1;2.6_1;1;19.85;46.46;185.84;0.509
1;1;8.A;1;2.6_1;2;21.15;42.09;191.47;0.419
1;1;8.A;1;2.6_1;3;22.88;39.63;195.11;0.391
1;1;8.A;1;2.6_1;4;23.34;37.99;197.66;0.406
1;1;8.A;1;2.6_1;5;24.22;35.25;202.22;0.35
1;1;8.A;1;2.6_1;6;22.43;34.49;205.94;0.356
1;1;8.A;1;2.6_1;7;20.45;33.36;209.82;0.326
1;1;8.A;1;2.8_1;1;3.45;57.22;197.96;0.403
1;1;8.A;1;2.8_1;2;3.43;56.09;201.06;0.371
1;1;8.A;1;2.8_1;3;3.75;54.06;203.69;0.357
1;1;8.A;1;2.8_1;4;2.33;51.21;206.18;0.334
1;1;8.A;1;2.8_1;5;1.36;48.66;209.71;0.291
1;1;8.A;1;2.8_1;6;1.22;44.82;213.33;0.291
1;1;8.A;1;2.9_1;1;-2.31;63.34;202.23;0.408
1;1;8.A;1;2.9_1;2;-1.25;64.09;204.83;0.309
1;1;8.A;1;2.9_1;3;1.17;63.86;208.13;0.346
1;1;8.A;1;2.9_1;4;3.29;65.79;211.73;0.275
1;1;8.A;1;2.9_1;5;5.11;66.89;213.82;0.214
1;1;8.A;1;2.9_1;6;5.26;69.77;215.66;0.151
1;1;8.A;1;2.11_1;1;-14.13;67.81;204.62;0.45
1;1;8.A;1;2.11_1;2;-14.13;66.22;207.19;0.367
1;1;8.A;1;2.11_1;3;-12.43;64.87;209.89;0.332
1;1;8.A;1;2.11_1;4;-14.47;64.47;212.94;0.217
1;1;8.A;1;2.11_1;5;-10.68;63.89;217.16;0.177
1;1;8.A;1;2.12_1;1;-21.02;77.47;200.51;0.44
1;1;8.A;1;2.12_1;2;-22.54;78.4;201.14;0.294
1;1;8.A;1;2.13_1;1;-31.2;81.62;197.44;0.248
1;1;9;0;0;0;47.16;52.26;161.24;3.035
1;1;9.A.1;0;0;0;48.63;50.87;156.69;3.207
1;1;9.A.2;0;0;0;45.9;47.98;156.33;2.533
1;1;9.A.3;0;0;0;42.5;54.01;153.8;2.215
1;1;9.A.3;1.1;0;0;42.67;56.06;153.41;1.75
1;1;9.A.3;1.1;G1;0;44.07;58.06;154.64;0.826
1;1;9.A.3;1.1;G1;1;45.09;58.89;154.18;0.777
1;1;9.A.3;1.1;G1;2;45.66;59.79;154.16;0.589
1;1;9.A.3;1.1;G1;3;45.43;63.12;153.97;0.539
1;1;9.A.3;1.1;G1;4;46.63;67.54;154.88;0.488
1;1;9.A.3;1.1;G1;5;45.9;73.58;155.48;0.455
1;1;9.A.3;1.1;G1;6;46.79;78.64;155.5;0.399
1;1;9.A.3;1.1;G1;7;46.39;81.79;156.9;0.375
1;1;9.A.3;1.1;G1;8;48.59;87.25;157.76;0.368
1;1;9.A.3;1.1;G1;9;48.85;94.5;160.03;0.338
1;1;9.A.3;1.1;G1;10;49.35;99.8;160.51;0.283
1;1;9.A.3;1.2;0;0;43.83;58.28;152.46;1.582
1;1;9.A.3;1.2;1;0;46.05;58.75;152.36;1.032
1;1;9.A.3;1.2;1;1;46.49;58.3;152.21;0.958
1;1;9.A.3;1.2;1;2;47.62;56.96;152.51;0.65
1;1;9.A.3;1.2;1;3;50.47;56.49;154.14;0.609
1;1;9.A.3;1.2;1;4;55.98;57.46;158.37;0.6
1;1;9.A.3;1.2;1;5;63.71;58.08;161.78;0.554
1;1;9.A.3;1.2;1;6;70.35;59.48;167.81;0.527
1;1;9.A.3;1.2;1;7;80.19;62.48;172.35;0.487
1;1;9.A.3;1.2;1;8;87.77;63.65;178.78;0.545
1;1;9.A.3;1.2;1;9;92.92;66.07;181.74;0.481
1;1;9.A.3;1.2;1;10;97.57;68.48;187.07;0.423
1;1;9.A.3;1.2;1;11;104.32;73.2;191.96;0.458
1;1;9.A.3;1.2;1;12;110.39;76.22;196.59;0.437
1;1;9.A.3;1.2;1;13;116.06;81.19;198.45;0.406
1;1;10RL;0;0;0;52.99;52.93;160.19;3.323
1;1;11;0;0;0;55.61;53.95;163.3;3.231
1;1;11.A;0;0;0;53.62;56.87;163.29;3.084
1;1;11.A;0;G1;0;52.24;56.5;164.69;1.299
1;1;11.A;0;G1;1;52.04;56.61;165.1;1.208
1;1;11.A;0;G1;2;52.03;56.58;166.2;0.869
1;1;11.A;0;G1;3;51.9;57.66;171.75;0.637
1;1;11.A;0;G1;4;51.97;58.31;177.78;0.772
1;1;11.A;0;G1;5;50.54;58.46;185.55;0.694
1;1;11.A;0;G1;6;47.75;54.95;194.41;0.615
1;1;11.A;0;G1;7;44.64;52.54;200.21;0.587
1;1;11.A;0;G1;8;42.56;49.83;204.51;0.603
1;1;11.A;0;G1;9;40;47.5;207.67;0.632
1;1;11.A;0;G1;10;37.85;41.98;211.43;0.558
1;1;11.A;0;G1;11;34.82;37.66;213.89;0.555
1;1;11.A;0;G1;12;33.21;32.03;213.3;0.554
1;1;11.A;0;G1;13;31.06;26.4;216.38;0.478
1;1;11.A;0;G1;14;28.22;21.77;219.86;0.531
1;1;11.A;0;G1;15;24.42;18.57;222.33;0.56
1;1;11.A;0;G1;16;20.21;14.5;225.56;0.608
1;1;11.A;0;G1;17;15.26;11.42;228.62;0.435
1;1;11.A;0;G1;18;9.94;8.34;229.42;0.437
1;1;11.A;0;G1;19;2.99;3.16;227.65;0.409
1;1;11.A;0;G1;20;-0.11;-0.25;227.94;0.376
1;1;11.A;0;G1;21;-5.38;-1.02;227.65;0.351
1;1;11.A;0;G1;22;-10.14;-3.84;226.91;0.239
1;1;11.A;1;0;0;54.9;60.8;164.1;1.602
1;1;11.A;1;1;0;53.21;63.88;165.47;1.778
1;1;11.A;1;1;1;53.8;65.23;165.7;1.479
1;1;11.A;1;1;2;55.51;66.58;167.12;1.21
1;1;11.A;1;1;3;58.11;68.79;171.04;1.072
1;1;11.A;1;1;4;63.56;70.57;174.68;1.034
1;1;11.A;1;1;5;68.93;74.46;179.93;0.945
1;1;11.A;1;1;6;81.71;79.49;185.82;0.844
1;1;11.A;1;1;7;90.51;84.35;190.5;0.797
1;1;11.A;1;1;8;101.43;86.7;192.41;0.745
1;1;11.A;1;1;9;111.2;92.1;192.36;0.677
1;1;11.A;1;1;10;119.97;95.02;190.95;0.601
1;1;11.A;1;1;11;129.12;98.53;184.91;0.526
1;1;11.A;1;1;12;134.33;102.55;180.87;0.531
1;1;11.A;1;1;13;136.68;105.16;175.61;0.569
1;1;11.A;1;1;14;140.62;107.38;169.4;0.527
1;1;11.A;1;1;15;144.14;109.31;165.22;0.535
1;1;11.A;1;1;16;148.73;109.36;160.74;0.487
1;1;11.A;1;1;17;153.31;111.42;155.89;0.48
1;1;11.A;1;1;18;157.25;112.57;152.24;0.453
1;1;11.A;1;1;19;160.87;114.56;148.57;0.478
1;1;11.A;1;1;20;165.8;114.43;144.53;0.425
1;1;11.A;1;1.4_1;1;66.32;68.73;177.11;0.428
1;1;11.A;1;1.5_1;1;68.27;74.36;182.97;0.498
1;1;11.A;1;1.5_1;2;67.05;76.56;185.94;0.359
1;1;11.A;1;1.5_1;3;66.28;78.5;189.45;0.337
1;1;11.A;1;1.5_1;4;64.71;81.12;194.65;0.251
1;1;11.A;1;1.7_1;1;90.43;83.66;194.16;0.318
1;1;11.A;1;1.7_1;2;88.29;83.46;197.27;0.309
1;1;11.A;1;1.7_1;3;86.64;83.56;201.52;0.252
1;1;11.A;1;1.7_1;4;86.18;84.45;206.01;0.203
1;1;11.A;1;1.9_1;1;111.65;93.67;194.07;0.306
1;1;11.A;1;1.10_1;1;121.12;93.12;193.36;0.184
1;1;11.A;1;1.12_1;1;135.15;102.31;182.6;0.2
1;1;11.A;1;1.12_1;2;134.26;102.62;184.38;0.171
1;1;11.A;1;1.16_1;1;149.25;108.69;162.9;0.096
1;1;12;0;0;0;60.91;53.07;164.82;2.246
1;1;12.A;0;0;0;66.52;55.27;163;2.564
1;1;12.A;1;0;0;68.32;55.25;162.32;2.204
1;1;12.A;1;1;0;69.59;55.56;161.77;1.394
1;1;12.A;1;1;1;70.36;55.42;161.58;1.253
1;1;12.A;1;1;2;72.19;54.96;161.49;0.91
1;1;12.A;1;1;3;74.6;55.56;163.24;0.75
1;1;12.A;1;1;4;78.74;57.78;167.05;0.692
1;1;12.A;1;1;5;84.06;63.04;171.19;0.632
1;1;12.A;1;1;6;91.28;71.87;180.69;0.606
1;1;12.A;1;1;7;97.78;80.49;186.83;0.525
1;1;12.A;1;1;8;101.74;82.92;191.15;0.486
1;1;12.A;1;1;9;106.22;90.63;192.38;0.462
1;1;12.A;1;1;10;111.12;95.48;192.67;0.477
1;1;12.A;1;1;11;115.24;102.34;191.69;0.462
1;1;12.A;1;1;12;120.17;105.93;191.32;0.442
1;1;12.A;1;1;13;124.03;111.64;190.13;0.426
1;1;12.A;1;1;14;127.71;116.14;189.15;0.382
1;1;12.A;1;1;15;129.95;121.93;187.44;0.367
1;1;12.A;1;1;16;134.18;127.13;186.69;0.32
1;1;12.A;1;2;0;68.99;54.94;164.02;1.627
1;1;12.A;1;2;1;70.4;52.38;164.28;1.341
1;1;12.A;1;2;2;70.81;53.01;168.28;1.168
1;1;12.A;1;2;3;70.23;52.91;173.19;1.044
1;1;12.A;1;2;4;68.57;53.37;179.56;0.99
1;1;12.A;1;2;5;66.42;52.1;188.19;0.945
1;1;12.A;1;2;6;60.88;49.08;201.6;0.893
1;1;12.A;1;2;7;55.04;44.89;210.11;0.844
1;1;12.A;1;2;8;49.31;42.55;214.85;0.761
1;1;12.A;1;2;9;43.15;34.09;217.24;0.715
1;1;12.A;1;2;10;34.65;29.26;215.98;0.674
1;1;12.A;1;2;11;30.51;24.43;214.34;0.651
1;1;12.A;1;2;12;26.4;23.59;211.63;0.635
1;1;12.A;1;2;13;22.76;19.67;207.7;0.573
1;1;12.A;1;2;14;18.38;18.14;204.05;0.532
1;1;12.A;1;2;15;16.89;14.74;200.81;0.507
1;1;12.A;1;2;16;13.44;11.34;195.81;0.469
1;1;12.A;1;2;17;11.38;7.51;190.57;0.513
1;1;12.A;1;2;18;9.3;5.74;186.3;0.473
1;1;12.A;1;2;19;7.1;3.34;181.2;0.425
1;1;12.A;1;2;20;4.23;2.77;177.41;0.411
1;1;12.A;1;2;21;3.04;0.31;173.31;0.375
1;1;12.A;1;2;22;0.86;-1.01;168.01;0.351
1;1;12.A;1;2.4_1;1;69.43;54.41;182.5;0.233
1;1;12.A;1;2.7_1;1;56.79;45.37;213.23;0.468
1;1;12.A;1;2.9_1;1;44.24;32.82;220.07;0.382
1;1;12.A;1;2.9_1;2;45.45;31.54;221.76;0.314
1;2;1;0;0;0;-0.13;-17.62;161.52;3.346
1;2;2;0;0;0;-4.82;-26.45;167.36;3.421
1;2;3;0;0;0;-8.53;-37.59;166.8;3.089
1;2;4;0;0;0;-13.42;-51.89;161.82;3.036
1;2;5;0;0;0;-17.16;-60.08;153.82;3.45
1;2;6;0;0;0;-31.21;-60.33;151.18;3.88
1;2;6.A;0;0;0;-27.79;-59.67;157.12;1.973
1;2;6.A;1;0;0;-27.88;-57.61;160.16;1.187
1;2;6.A;1;1;0;-27.45;-61.32;160.1;1.367
1;2;6.A;1;1;1;-27.79;-61.94;160.35;1.129
1;2;6.A;1;1;2;-28.06;-63.26;161.25;0.774
1;2;6.A;1;1;3;-27.82;-65.89;162.97;0.782
1;2;6.A;1;1;4;-25.35;-67.85;168.77;0.677
1;2;7;0;0;0;-47.29;-60.71;153.73;3.878
1;2;7.A;0;0;0;-48.83;-61.91;157.89;6.248
1;2;7.A;1;0;0;-48.96;-61.05;156.94;2.293
1;2;7.A;1;1;0;-48.45;-61.24;157.64;1.367
1;2;7.A;1;1;1;-47.91;-61.84;158.29;1.329
1;2;7.A;1;1;2;-48.39;-62.26;159.21;1.081
1;2;7.A;1;1;3;-48.2;-63.93;163.16;0.996
1;2;7.A;1;1;4;-49.21;-65.35;168.67;0.986
1;2;7.A;1;1;5;-49.49;-70.05;173.43;0.97
1;2;7.A;1;1;6;-52.16;-75.1;180.19;0.804
1;2;7.A;1;1;7;-55.13;-86.47;185.06;0.686
1;2;7.A;1;1;8;-59.34;-94.54;187.31;0.668
1;2;7.A;1;1;9;-62.21;-100.88;186.95;0.614
1;2;7.A;1;1;10;-61.15;-111.99;179.07;0.625
1;2;7.A;1;1;11;-65.97;-116.89;173.59;0.567
1;2;7.A;1;1;12;-70.04;-119.21;170.53;0.585
1;2;7.A;1;1;13;-71.31;-123.4;165.15;0.492
1;2;7.A;1;1;14;-74.82;-126.94;160.59;0.505
1;2;7.A;1;1;15;-77.01;-130.23;157.44;0.506
1;2;7.A;1;1;16;-79.84;-134.98;155.55;0.476
1;2;7.A;1;1;17;-80.36;-140.95;151.91;0.509
1;2;7.A;1;1.4_1;1;-49.52;-61.72;171.46;0.357
1;2;7.A;1;1.4_1;2;-49.48;-61.37;174.98;0.249
1;2;7.A;1;1.4_1;3;-50.41;-59.39;178.82;0.269
1;2;7.A;1;1.4_1;4;-50.07;-58.59;182.03;0.171
1;2;7.A;1;1.5_1;1;-46.33;-72;177.33;0.421
1;2;7.A;1;1.5_1;2;-45.46;-75.51;180.67;0.368
1;2;7.A;1;1.5_1;3;-44.27;-77.91;185.77;0.358
1;2;7.A;1;1.5_1;4;-42.59;-78.61;190.36;0.408
1;2;7.A;1;1.5_1;5;-38.59;-79.88;191.59;0.298
1;2;7.A;1;1.5_1;6;-34.84;-82.19;191.05;0.264
1;2;7.A;1;1.6_1;1;-49.04;-77.33;185.13;0.441
1;2;7.A;1;1.6_1;2;-49.44;-77.52;189.59;0.408
1;2;7.A;1;1.6_1;3;-49.76;-76.23;193.97;0.494
1;2;7.A;1;1.6_1;4;-50.68;-75.13;197.85;0.377
1;2;7.A;1;1.6_1;5;-52.29;-71.82;201.34;0.368
1;2;7.A;1;1.6_1;6;-53.82;-69.41;203.94;0.261
1;2;7.B;0;0;0;-38.07;-55.28;147.01;3.114
1;2;7.B;1;0;0;-35.68;-58.9;147.34;1.851
1;2;7.B;1;1;0;-36.71;-59.15;146.39;1.089
1;2;7.B;1;1;1;-36.96;-59.85;145.41;0.971
1;2;7.B;1;1;2;-35.23;-62.27;146.25;0.74
1;2;7.B;1;1;3;-32.55;-65.22;147.07;0.775
1;2;7.B;1;1;4;-27.57;-69.37;150.03;0.71
1;2;7.B;1;1;5;-19.45;-74.23;153.9;0.676
1;2;7.B;1;1;6;-11.56;-81.84;161.72;0.582
1;2;7.B;1;1;7;-4.94;-87.12;164.4;0.587
1;2;7.B;1;1;8;3.82;-91.19;168.39;0.507
1;2;7.B;1;1;9;10.01;-93.78;170.47;0.523
1;2;7.B;1;1;10;18.34;-95.08;172.27;0.499
1;2;7.B;1;1;11;22.89;-97.51;174.04;0.467
1;2;7.B;1;1;12;32.67;-98.78;176.59;0.45
1;2;8;0;0;0;-60.22;-65.33;150.43;3.307
1;2;8.A.1;0;0;0;-61.39;-61.5;146.79;4.037
1;2;8.A.2;0;0;0;-55.31;-63.57;144.43;2.249
1;2;8.A.2;0;G1;0;-57.15;-62.41;143.99;1.092
1;2;8.A.2;0;G1;1;-55.12;-65.26;142.19;0.578
1;2;8.A.2;0;G1;2;-52.5;-68.06;142.28;0.523
1;2;8.A.2;0;G1;3;-49.1;-72.65;139.99;0.493
1;2;8.A.2;0;G1;4;-45.31;-77.75;136.92;0.444
1;2;8.A.2;0;G1;5;-44.45;-83.32;131.43;0.434
1;2;8.A.2;0;G1;6;-40.02;-86.86;125.46;0.467
1;2;8.A.2;0;G1;7;-39.45;-89.49;121.57;0.443
1;2;8.A.2;0;G1;8;-36.84;-91.51;116.73;0.44
1;2;8.A.2;0;G1;9;-34.68;-96.22;111.93;0.401
1;2;8.A.2;0;G1;10;-31.57;-99.16;105.74;0.398
1;2;8.A.2;0;G1;11;-30.41;-103.54;99.7;0.384
1;2;8.A.3;0;0;0;-53.73;-60.2;142.03;2.215
1;2;8.A.4;0;0;0;-51.4;-61.81;143.85;1.572
1;2;8.A.4;1;0;0;-51.92;-63.89;146.01;1.678
1;2;8.A.4;1;G1;1;-53.44;-64.17;144.35;0.37
1;2;8.A.4;1;G1;0;-53.11;-62.36;143.9;0.582
1;2;8.A.4;1;1;0;-51.86;-65.13;147.68;1.412
1;2;8.A.4;1;1;1;-50.52;-66.09;147.41;1.219
1;2;8.A.4;1;1;2;-48.07;-66.27;149.65;0.973
1;2;8.A.4;1;1;3;-44.15;-67.3;153.68;0.949
1;2;8.A.4;1;1;4;-38.72;-68.04;158.64;0.915
1;2;8.A.4;1;1;5;-31.27;-70.58;166.79;0.866
1;2;8.A.4;1;1;6;-18.43;-73.71;177.83;0.756
1;2;8.A.4;1;1;7;-9.43;-81.1;183.28;0.649
1;2;8.A.4;1;1;8;-0.28;-85.9;183.24;0.564
1;2;8.A.4;1;1;9;6.85;-92.02;177.65;0.525
1;2;8.A.4;1;1;10;12.74;-93.24;172.58;0.55
1;2;8.A.4;1;1;11;15.28;-95.51;167.39;0.518
1;2;8.A.4;1;1;12;20.93;-97.03;162.14;0.468
1;2;8.A.4;1;1;13;25.02;-99.38;158.43;0.461
1;2;8.A.4;1;1;14;28.28;-101.85;154.97;0.45
1;2;8.A.4;1;1;15;31.84;-106.64;149.45;0.417

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
{
"simulation": {
"sdate": "2012-08-01 00:00:00",
"edate": "2012-08-04 23:00:00",
"latitude": 43.61,
"longitude": 3.87,
"elevation": 44.0,
"tzone": "Europe/Paris",
"output_index": "",
"unit_scene_length": "cm",
"hydraulic_structure": true,
"negligible_shoot_resistance": false,
"energy_budget": true
},
"planting": {
"spacing_between_rows": 3.6,
"spacing_on_row": 1,
"row_angle_with_south": 140.0
},
"phenology": {
"emdate": "2012-04-01 00:00:00",
"t_base": 10.0
},
"mtg_api": {
"collar_label": "inT",
"leaf_lbl_prefix": "L",
"stem_lbl_prefix": [
"in",
"Pet",
"cx"
]
},
"numerical_resolution": {
"max_iter": 100,
"psi_step": 1.0,
"psi_error_threshold": 0.05,
"t_step": 1.0,
"t_error_threshold": 0.02
},
"irradiance": {
"E_type": "Rg_Watt/m2",
"E_type2": "Eabs",
"opt_prop": {
"SW": {
"leaf": [
0.06,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
},
"LW": {
"leaf": [
0.04,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
}
},
"turtle_format": "soc",
"turtle_sectors": "46",
"icosphere_level": null
},
"energy": {
"solo": true,
"t_cloud": 2.0,
"t_sky": -20.0
},
"hydraulic": {
"psi_min": -3.0,
"Kx_dict": {
"a": 1.6,
"b": 2.0,
"min_kmax": 0.000111
},
"par_K_vul": {
"model": "misson",
"fifty_cent": -0.76,
"sig_slope": 1.0
}
},
"exchange": {
"rbt": 0.6667,
"Na_dict": {
"aN": -0.0008,
"bN": 3.3,
"aM": 6.471,
"bM": 56.635
},
"par_gs": {
"model": "misson",
"g0": 0.0,
"m0": 7.3,
"psi0": -0.65,
"D0": 1.0,
"n": 4.0
},
"par_photo": {
"alpha": 0.24,
"Kc25": 404.9,
"Ko25": 278.4,
"Tx25": 42.75,
"ds": 0.635,
"dHd": 200.0,
"RespT_Kc": {
"c": 38.05,
"deltaHa": 79.43
},
"RespT_Ko": {
"c": 20.30,
"deltaHa": 36.38
},
"RespT_Vcm": {
"c": 26.35,
"deltaHa": 65.33
},
"RespT_Jm": {
"c": 17.57,
"deltaHa": 43.54
},
"RespT_TPU": {
"c": 21.46,
"deltaHa": 53.1
},
"RespT_Rd": {
"c": 18.72,
"deltaHa": 46.39
},
"RespT_Tx": {
"c": 19.02,
"deltaHa": 37.83
}
},
"par_photo_N": {
"Vcm25_N": [
34.02,
-3.13
],
"Jm25_N": [
78.27,
-17.3
],
"Rd_N": [
0.42,
-0.01
],
"TPU25_N": [
6.24,
-1.92
]
}
},
"soil": {
"soil_class": "Sandy_Loam",
"soil_dimensions": {
"width": 3.6,
"length": 1.0,
"depth": 1.2
},
"rhyzo_coeff": 0.75
}
}

View file

@ -0,0 +1,7 @@
time;psi
2012-07-20;-0.17
2012-07-27;-0.13
2012-08-01;-0.19
2012-08-02;-0.38
2012-08-03;-0.61
2012-08-09;-0.19

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,38 @@
from pathlib import Path
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
if __name__ == '__main__':
path_project = Path(__file__).parent
# =============================================================================
# Construct the plant mock-up
# =============================================================================
g = architecture.vine_mtg(path_project / 'digit.input')
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_phyto_modular(g, v)
architecture.vine_petiole(g, v, pet_ins=90., pet_ins_cv=0.,
phyllo_angle=180)
architecture.vine_leaf(g, v, leaf_inc=-45., leaf_inc_cv=100., lim_max=12.5,
lim_min=5., order_lim_max=6., max_order=55,
rand_rot_angle=90., cordon_vector=None)
architecture.vine_mtg_properties(g, v)
architecture.vine_mtg_geometry(g, v)
architecture.vine_transform(g, v)
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(), view_result=True)
# =============================================================================
# Run HydroShoot
# =============================================================================
model.run(
g=g,
wd=path_project,
path_weather=path_project / 'meteo.input',
scene=scene)

View file

@ -0,0 +1,13 @@
date;psi_pd;psi_stem;psi_leaf;gs
2012-07-20 00:00;-0.19;-1.18;-1.27;52
2012-07-20 00:00;-0.16;-1.14;-1.38;107
2012-07-27 00:00;-0.14;-1.28;-1.45;159
2012-07-27 00:00;-0.11;-1.34;-1.41;159
2012-08-01 00:00;-0.23;-1;-1.31;264
2012-08-01 00:00;-0.14;-0.9;-1.34;171
2012-08-02 00:00;-0.47;-1.39;-1.42;32
2012-08-02 00:00;-0.29;-1.37;-1.47;26.8
2012-08-03 00:00;-0.63;-1.35;-1.2;4.7
2012-08-03 00:00;-0.58;-1.38;-1.54;7.4
2012-08-09 00:00;-0.2;-1.18;-1.67;129
2012-08-09 00:00;-0.17;-1.2;-1.6;93

View file

@ -0,0 +1,630 @@
Souche;tronc;element;sarment;rameau;rang;X;Y;Z;Diam
1;0;1;0;0;0;-2.96;0.29;11.65;6.237
1;0;2;0;0;0;-2.41;0.64;11.95;5.89
1;0;3;0;0;0;-0.75;1.97;14.65;4.669
1;0;4;0;0;0;1.85;0.82;22.74;5.049
1;0;5;0;0;0;4.65;-1.6;28.55;4.526
1;0;6;0;0;0;6.46;-2.72;35.14;4.187
1;0;7;0;0;0;7.82;-3.43;39.35;4.284
1;0;8;0;0;0;9.22;-3.23;44.32;4.355
1;0;9;0;0;0;12.13;-3.5;49.93;4.423
1;0;10;0;0;0;13.58;-2.3;54.26;4.483
1;0;11;0;0;0;15.44;-2.08;59.35;4.411
1;0;12;0;0;0;17.09;-1.33;65.25;4.307
1;0;13;0;0;0;18.96;-1;71.59;4.364
1;0;14;0;0;0;19.28;-0.07;75.54;4.466
1;0;15;0;0;0;18.43;0.38;80.55;4.575
1;0;16;0;0;0;18.8;-0.68;88.07;4.028
1;0;17;0;0;0;19.97;0.44;93.93;4.114
1;0;18;0;0;0;22.05;-1.17;101.87;4.227
1;0;19;0;0;0;23.45;-1.54;107.67;4.479
1;0;20;0;0;0;25.98;-2.21;113.08;4.423
1;0;21;0;0;0;30.27;-2.07;119.05;4.386
1;0;22;0;0;0;34;-2.87;124.06;4.508
1;0;23;0;0;0;34.76;-4.82;127.64;4.278
1;0;24;0;0;0;35.36;-6.29;132;3.936
1;0;25;0;0;0;37.16;-8.65;140.14;3.867
1;0;26;0;0;0;38.64;-12.09;149.39;4.5303
1;1;1;0;0;0;44.32;-9.91;155.66;3.336
1;1;2;0;0;0;45.98;-7.92;159.11;3.305
1;1;3;0;0;0;45.48;-5.91;161.84;2.799
1;1;4;0;0;0;45.55;0.18;166.58;2.795
1;1;4;0;G1;0;46.9;0.25;166.65;1.065
1;1;4;0;G1;1;47.02;-0.6;166.36;0.856
1;1;4;0;G1;2;49.44;-0.83;167.37;0.693
1;1;4;0;G1;3;52.36;-0.48;169.92;0.552
1;1;4;0;G1;4;54.93;0.1;173.57;0.451
1;1;4;0;G1;5;58.08;0.21;176.53;0.458
1;1;4;0;G1;6;59.84;1.6;179.84;0.456
1;1;4;0;G1;7;63.05;1.69;182.66;0.436
1;1;4;0;G1;8;65.58;2.64;185.86;0.413
1;1;4;0;G1;9;68.16;1.69;189.48;0.406
1;1;4;0;G1;10;70.83;1.96;192.85;0.374
1;1;4;0;G1;11;73.9;0.92;196.26;0.352
1;1;4;0;G1;12;76.75;1.19;198.62;0.333
1;1;4;0;G1;13;78.77;0.37;200.55;0.315
1;1;4;0;G1;14;82.43;0.41;203.83;0.22
1;1;5;0;0;0;45.42;6.25;169.14;3.016
1;1;6;0;0;0;45.09;14.28;169.32;3.197
1;1;7;0;0;0;44.17;24.65;167.2;3.65
1;1;8;0;0;0;45.1;32.76;164.29;4.228
1;1;9;0;0;0;43.71;37.79;159.15;4.531
1;1;10;0;0;0;48.03;43.29;155.46;3.631
1;1;10.a;0;0;0;44.14;50.1;154.94;2.594
1;1;10.a;1;0;0;42.92;50.46;154.86;2.328
1;1;10.a;1;1;0;43.24;50.43;153.03;1.539
1;1;10.a;1;1;1;43.92;51.06;153.15;0.77
1;1;10.a;1;1;2;44.28;52.93;155.33;0.557
1;1;10.a;1;1;3;44.06;56.13;160.6;0.53
1;1;10.a;1;1;4;45.23;57.33;167.73;0.475
1;1;10.a;1;1;5;45.43;59.44;172.92;0.419
1;1;10.a;1;1;6;46.42;60.28;177.54;0.396
1;1;10.a;1;1;7;47.25;62.98;181.21;0.379
1;1;10.a;1;1;8;48.93;63.4;187.56;0.348
1;1;10.a;1;1;9;50.9;66.78;192.71;0.333
1;1;10.a;1;1;10;54.54;66.93;197.33;0.245
1;1;10.a;1;2;0;41.62;52.26;153.16;1.934
1;1;10.a;1;2;1;40.84;52.63;153.19;1.615
1;1;10.a;1;2;2;39.46;52.85;153.92;1.34
1;1;10.a;1;2;3;35.97;54.14;155.77;1.078
1;1;10.a;1;2;4;31.35;57.35;158.31;1.07
1;1;10.a;1;2;5;25.12;63.86;159.78;1.021
1;1;10.a;1;2;6;16.52;72.81;159.96;0.925
1;1;10.a;1;2;7;9.47;83.82;157.22;0.832
1;1;10.a;1;2;8;4.1;93.07;156.24;0.768
1;1;10.a;1;2;9;-0.78;104.34;151.78;0.744
1;1;10.a;1;2;10;-5.2;112.55;148.64;0.756
1;1;10.a;1;2;11;-7.36;119.33;141.59;0.646
1;1;10.a;1;2;12;-10.96;127.69;134.18;0.619
1;1;10.a;1;2;13;-12;132.43;127.46;0.558
1;1;10.a;1;2;14;-14.24;136.55;123.67;0.592
1;1;10.a;1;2;15;-16.11;142.32;118.04;0.507
1;1;10.a;1;2;16;-19.46;147.38;115.26;0.485
1;1;10.a;1;2.4_1;1;32.09;58.17;161.3;0.27
1;1;10.a;1;2.4_1;2;30.68;65.85;158.08;0.159
1;1;10.a;1;2.5_1;1;15.8;75;164.3;0.271
1;1;10.a;1;2.5_1;2;13.29;73.77;166.35;0.225
1;1;10.a;1;2.6_1;1;15.6;74.83;164.25;0.268
1;1;10.a;1;2.6_1;2;13.01;74.08;166.47;0.21
1;1;10.a;1;2.8_1;1;4.66;94.27;162.66;0.342
1;1;10.a;1;2.10_1;1;-4.5;113.59;152.64;0.231
1;1;10.a;1;2.10_1;2;-4.94;112.88;154.53;0.168
1;1;11;0;0;0;51.46;45.21;155.15;3.748
1;1;12;0;0;0;56.24;45.29;152.77;4.524
1;1;12.a;0;0;0;55.16;56.2;148.66;3.707
1;1;12.a;1;0;0;54.05;57.37;150.71;2.48
1;1;12.a;1;G1;0;53.02;57.64;152.2;0.875
1;1;12.a;1;G1;1;52.85;59.46;154.43;0.578
1;1;12.a;1;G1;2;53.11;61.29;157.88;0.532
1;1;12.a;1;G1;3;54.32;63.78;163.11;0.539
1;1;12.a;1;G1;4;56.97;67.46;168.45;0.511
1;1;12.a;1;G1;5;60.87;70.22;173.17;0.39
1;1;12.a;1;G1;6;64.03;70.33;174.42;0.348
1;1;12.a;1;G1;7;68.25;71.71;174.99;0.298
1;1;12.a;1;1m;0;52.94;55.05;154.25;1.535
1;1;12.a;1;1m;1;53.34;54.9;154.85;1.42
1;1;12.a;1;1m;2;53.29;54.91;157.17;0.98
1;1;12.a;1;1m;3;53.62;54.85;160.27;0.909
1;1;12.a;1;1m;4;53.13;55.96;167.17;0.82
1;1;12.a;1;1m;5;53.43;56.59;176.47;0.77
1;1;12.a;1;1m;6;51.61;59.33;184.77;0.651
1;1;12.a;1;1m;7;48.87;59.89;190.12;0.57
1;1;12.a;1;1m;8;45.33;63.19;193.48;0.562
1;1;12.a;1;1m;9;41.87;65.58;197.63;0.489
1;1;12.a;1;1m;10;38.88;68.35;200.21;0.517
1;1;12.a;1;1m;11;34.95;69.18;203.34;0.526
1;1;12.a;1;1m;12;30.3;71.48;205.95;0.462
1;1;12.a;1;1m;13;26.03;72.51;208.26;0.474
1;1;12.a;1;1m;14;22.01;74.25;209.46;0.44
1;1;12.a;1;1m;15;15.73;74.98;211.34;0.395
1;1;12.a;1;1m;16;12.4;77.05;211.1;0.391
1;1;12.a;1;1m;17;8.27;77.4;211.13;0.417
1;1;12.a;1;2m;0;53.83;54.11;153.88;0.917
1;1;12.a;1;2m;1;53.39;51.8;154.82;0.664
1;1;12.a;1;2m;2;51.78;46.83;156.89;0.633
1;1;12.a;1;2m;3;51.52;40.53;158.71;0.588
1;1;12.a;1;2m;4;51.03;33.06;160.35;0.451
1;1;12.a;1;2m;5;51.49;28;161.14;0.409
1;1;12.a;1;2m;6;51.77;25.3;161;0.354
1;1;12.a;1;2m;7;50.89;20.53;163.55;0.374
1;1;12.a;1;2m;8;50.79;16.05;166.3;0.324
1;1;12.a;1;2m;9;49.19;13.74;169.55;0.29
1;1;12.a;1;3;0;52.65;47.09;156.97;1.391
1;1;12.a;1;3;1;54.98;47.18;157.31;1.084
1;1;12.a;1;3;2;59.02;46.59;158.99;0.879
1;1;12.a;1;3;3;65.28;45.73;162.01;0.882
1;1;12.a;1;3;4;73.66;41.98;165.42;0.901
1;1;12.a;1;3;5;83.7;36.53;169.91;0.83
1;1;12.a;1;3;6;93.31;29.37;171.8;0.922
1;1;12.a;1;3;7;102.12;24.75;174.31;0.696
1;1;12.a;1;3;8;108.51;19.45;175.03;0.742
1;1;12.a;1;3;9;115.29;15.91;176.3;0.67
1;1;12.a;1;3;10;123.16;11.09;175.95;0.618
1;1;12.a;1;3;11;128.11;7.09;176.96;0.574
1;1;12.a;1;3;12;132.83;3.98;176.57;0.56
1;1;12.a;1;3;13;139.31;-1.33;177.14;0.542
1;1;12.a;1;3;14;144.85;-7.05;176.26;0.538
1;1;12.a;1;3;15;150.68;-10.53;175.15;0.509
1;1;12.a;1;3;16;157.47;-18.45;172.6;0.493
1;1;12.a;1;3;17;163.9;-23.66;170.9;0.476
1;1;12.a;1;3;18;168.96;-29.21;168.34;0.422
1;1;12.a;1;3;19;175.71;-35.81;168.24;0.372
1;1;12.a;1;3;20;178.77;-41.93;169.34;0.418
1;1;12.a;1;3.4_1;1;72.79;39.25;166.27;0.406
1;1;12.a;1;3.4_1;2;71.44;37.66;169.77;0.298
1;1;12.a;1;3.4_1;3;70.72;40.51;174.42;0.252
1;1;12.a;1;3.6_1;1;92.74;25.8;172.37;0.432
1;1;12.a;1;3.6_1;2;91.97;22.6;175.25;0.295
1;1;12.a;1;3.6_1;3;93;18.74;179.21;0.227
1;1;12.a;1;3.7_1;1;101.89;25.86;179.51;0.376
1;1;12.a;1;3.7_1;2;102.41;26.55;184.6;0.329
1;1;12.a;1;3.7_1;3;103.31;27.11;190.22;0.25
1;1;13;0;0;0;58.28;40.63;153.55;3.552
1;1;14;0;0;0;62.94;41.87;151.52;4.649
1;1;14.a;0;0;0;62.44;41.56;155.53;2.342
1;1;14.a;1;0;0;62.95;43.21;156.24;2.162
1;1;14.a;1;1;0;63.28;46.76;156.58;1.557
1;1;14.a;1;1;1;62.63;48.28;156.1;1.492
1;1;14.a;1;1;2;62.18;51.28;157.58;1.285
1;1;14.a;1;1;3;62.7;54.84;158.21;1.091
1;1;14.a;1;1;4;66.21;61.71;158.36;1.011
1;1;14.a;1;1;5;70.35;69.98;159.08;0.995
1;1;14.a;1;1;6;77.53;81.62;154.57;0.832
1;1;14.a;1;1;7;83.9;90.1;148.4;0.778
1;1;14.a;1;1;8;88.34;96.32;141.96;0.749
1;1;14.a;1;1;9;96.6;102.49;133.99;0.679
1;1;14.a;1;1;10;101.98;109.45;128.13;0.684
1;1;14.a;1;1;11;111.31;114.61;119.36;0.643
1;1;15;0;0;0;66.04;42.76;151.4;3.206
1;1;15.a;0;0;0;70.27;44.71;149.78;2.234
1;1;15.a;1;0;0;66.72;44.44;147.09;1.638
1;1;15.a;1;1;0;66.48;44.73;147.93;1.386
1;1;15.a;1;1;1;65.89;43.88;148.43;0.888
1;1;15.a;1;1;2;63.8;42.9;147.71;0.656
1;1;15.a;1;1;3;59.78;42.81;147.8;0.621
1;1;15.a;1;1;4;51.82;41.54;148.7;0.532
1;1;15.a;1;1;5;45.4;40.42;152.27;0.453
1;1;15.a;1;1;6;35.78;42.11;155.68;0.42
1;1;15.a;1;1;7;33.26;34.8;148.72;0.315
1;1;15.a;1;2;0;65.71;48.3;149.83;1.593
1;1;15.a;1;2;1;65.89;49.93;150.03;1.132
1;1;15.a;1;2;2;65.86;53.4;151.4;0.941
1;1;15.a;1;2;3;65.15;58.86;152.67;1.003
1;1;15.a;1;2;4;66.68;67.66;155.42;0.909
1;1;15.a;1;2;5;71.43;79.63;157.42;0.841
1;1;15.a;1;2;6;80.62;89.22;156.4;0.776
1;1;15.a;1;2;7;87.54;97.55;156.02;0.737
1;1;15.a;1;2;8;98.06;105.61;152.18;0.677
1;1;15.a;1;2;9;106.11;112.69;148.04;0.638
1;1;15.a;1;2;10;112.88;116.29;141.49;0.557
1;1;15.a;1;2;11;118.05;123.79;135.61;0.529
1;1;15.a;1;2.5_1;1;70.52;80.57;161.58;0.242
1;1;16;0;0;0;69.59;42.86;153.13;2.428
1;1;17;0;0;0;75.99;42.25;153.79;2.263
1;1;18;0;0;0;84.34;40.51;155.75;2.134
1;1;18.a;0;0;0;85.17;41.83;157.81;3.787
1;1;18.a;1;0;0;85.47;43.56;155.77;1.928
1;1;18.a;1;1;0;86.21;45.12;155.79;1.525
1;1;18.a;1;1;1;87.3;45.87;155.6;1.279
1;1;18.a;1;1;2;87.54;47.74;156.71;0.944
1;1;18.a;1;1;3;89.5;50.53;158.74;0.899
1;1;18.a;1;1;4;90.7;55.61;164.38;0.856
1;1;18.a;1;1;5;94.16;62.84;170.28;0.805
1;1;18.a;1;1;6;95.89;74.1;177.68;0.695
1;1;18.a;1;1;7;98.37;81.14;181.14;0.659
1;1;18.a;1;1;8;99.28;90.06;181.81;0.599
1;1;18.a;1;1;9;101.58;99.89;180.88;0.542
1;1;18.a;1;1;10;102.03;106.03;177.34;0.498
1;1;18.a;1;1;11;102.65;111.44;174.56;0.5
1;1;18.a;1;1;12;102.64;116.76;171.68;0.495
1;1;18.a;1;1;13;104.31;122.33;169.58;0.459
1;1;18.a;1;1;14;105.35;127.07;167.79;0.483
1;1;18.a;1;1;15;109.72;131.79;165.07;0.412
1;1;18.a;1;1;16;114.09;135.33;162.95;0.387
1;1;18.a;1;1;17;116.59;138.59;160.7;0.35
1;1;18.a;1;1;18;119.03;143.51;158.14;0.336
1;1;18.a;1;1.6_1;1;93.18;74.71;179.39;0.449
1;1;18.a;1;1.6_1;2;90.47;76.42;184.03;0.406
1;1;18.a;1;1.6_1;3;86.72;76.07;191.05;0.433
1;1;18.a;1;1.6_1;4;85.32;76.84;195.69;0.428
1;1;18.a;1;1.6_1;5;83.63;76.69;199.37;0.4
1;1;18.a;1;1.6_1;6;82.92;77.59;203.56;0.367
1;1;18.a;1;1.6_1;7;81.56;77.34;206.99;0.353
1;1;18.a;1;1.6_1;8;81.15;78.97;210.33;0.274
1;1;18.a;1;1.6_1;9;80.2;78.07;214.21;0.253
1;1;18.a;1;1.6_1;10;78.86;75.09;215.39;0.195
1;1;18.a;1;1.6_1.4_1;1;88.63;79.34;200.12;0.179
1;1;18.a;1;1.6_1.6_1;1;84.38;78.76;207.95;0.167
1;1;18.a;1;1.6_1.7_1;1;80.18;75.18;208.62;0.159
1;1;18.a;1;2;0;88.82;44.97;155.6;1.476
1;1;18.a;1;2;1;90.31;44.55;155.98;1.065
1;1;18.a;1;2;2;92.34;43.89;158.08;0.957
1;1;18.a;1;2;3;96.71;42.35;161.93;0.86
1;1;18.a;1;2;4;101.74;38.61;166.99;0.837
1;1;18.a;1;2;5;108.67;34.4;172.89;0.77
1;1;18.a;1;2;6;118.21;24.19;179.05;0.702
1;1;18.a;1;2;7;126.98;17.36;181.84;0.635
1;1;18.a;1;2;8;130.79;11.15;181.92;0.629
1;1;18.a;1;2;9;138.28;4.86;180.81;0.615
1;1;18.a;1;2;10;141.41;-0.84;180;0.615
1;1;18.a;1;2;11;146.45;-4;179.1;0.56
1;1;18.a;1;2;12;152.12;-10.07;180.01;0.597
1;1;18.a;1;2;13;157.23;-13.32;180.24;0.487
1;1;18.a;1;2;14;162.06;-17.5;181.34;0.529
1;1;18.a;1;2;15;167.94;-22.67;181.98;0.47
1;1;18.a;1;2;16;171.57;-28.47;183.12;0.402
1;1;18.a;1;2;17;175.58;-32.33;183.93;0.325
1;1;18.a;1;2.6_1;1;117.33;23.88;182.04;0.29
1;1;19;0;0;0;95.92;35.45;155.89;1.62
1;1;19.a;0;0;0;98.88;36.52;151.8;2.243
1;1;19.a;1;0;0;100.61;38.56;154.63;2.232
1;1;19.a;1;1;0;101.89;38.69;156.78;1.621
1;1;19.a;1;1;1;102.63;39.93;156.95;1.323
1;1;19.a;1;1;2;104.38;40.62;158.25;1.072
1;1;19.a;1;1;3;107.79;41.41;162.26;0.987
1;1;19.a;1;1;4;114.33;41.01;167.74;0.973
1;1;19.a;1;1;5;124.26;39.39;174.22;0.894
1;1;19.a;1;1;6;135.59;36.16;180.9;0.787
1;1;19.a;1;1;7;144.75;34.57;187.94;0.783
1;1;19.a;1;1;8;154.95;28.6;196.39;0.723
1;1;19.a;1;1;9;162.15;23.86;205.62;0.69
1;1;19.a;1;1;10;167.39;16.66;210.47;0.706
1;1;19.a;1;1;11;174.39;7.79;215.58;0.697
1;1;19.a;1;1;12;178.74;0.42;215.8;0.726
1;1;19.a;1;1;13;183.1;-5.95;216.05;0.699
1;1;19.a;1;1;14;188.03;-12.81;214.88;0.699
1;1;19.a;1;1;15;193.94;-17.97;213.17;0.669
1;1;19.a;1;1;16;196.96;-22.05;208.81;0.615
1;1;19.a;1;1;17;203.17;-26.9;206.19;0.601
1;1;19.a;1;1;18;206.34;-31.12;201.6;0.563
1;1;19.a;1;1;19;210.44;-33.12;199.8;0.515
1;1;19.a;1;1;20;216.4;-37.72;195.34;0.559
1;1;19.a;1;1;21;219.02;-40.62;194.99;0.478
1;1;19.a;1;1;22;222.47;-44.72;194;0.468
1;1;19.a;1;1;23;226.97;-50.33;195.48;0.453
1;1;19.a;1;1;24;229.62;-55.28;197.92;0.425
1;1;19.a;1;1;25;234.12;-58.81;202.77;0.389
1;1;19.a;1;1;26;236.32;-62.58;208.62;0.381
1;1;19.a;1;1;27;240.57;-63.51;213.65;0.328
1;1;19.a;1;1.4_1;1;115.24;38.72;167.52;0.441
1;1;19.a;1;1.4_1;2;114.62;33.89;166.93;0.299
1;1;19.a;1;1.4_1;3;110.92;29.48;163.88;0.237
1;1;19.a;1;1.5_1;1;123.79;35.04;177.76;0.274
1;1;19.a;1;1.6_1;1;134.12;34.12;182.33;0.286
1;1;19.a;1;1.6_1;2;131.36;33.33;185.57;0.186
1;1;19.a;1;1.8_1;1;141.92;35.7;193.28;0.277
1;1;19.a;1;1.8_1;2;139.47;35.79;196.66;0.252
1;1;19.a;1;1.10_1;1;160.08;24.62;206.46;0.11
1;1;19.a;1;1.10_1;2;158.81;24.04;207.99;0.09
1;1;19.a;1;1.11_1;1;166.21;17.01;211.26;0.166
1;1;19.a;1;1.12_1;1;174.08;7.43;217.08;0.173
1;1;19.a;1;1.16_1;1;195.68;-19.01;215.88;0.455
1;1;19.a;1;1.16_1;2;196.21;-19.29;218.21;0.253
1;1;19.a;1;1.16_1;3;196.33;-21.06;222.81;0.17
1;1;19.a;1;1.16_1;4;195.85;-20.98;225.7;0.162
1;1;19.a;1;1.16_1;5;196.26;-20.64;226.88;0.106
1;2;1;0;0;0;40.49;-25.05;151.73;4.01
1;2;2;0;0;0;40.31;-28.94;153.87;3.029
1;2;2;0;G1;0;38.5;-30.6;153.98;0.953
1;2;2;0;G1;1;38.21;-31.22;154.02;0.917
1;2;2;0;G1;2;36.88;-31.72;154.63;0.54
1;2;2;0;G1;3;34.48;-34.87;157.1;0.501
1;2;2;0;G1;4;35.58;-34.55;161.2;0.448
1;2;2;0;G1;5;35.09;-36.11;164.24;0.445
1;2;2;0;G1;6;35.64;-36.21;167.64;0.429
1;2;2;0;G1;7;36.26;-36.75;172.54;0.386
1;2;2;0;G1;8;36.5;-36.74;177.45;0.351
1;2;2;0;G1;9;36.27;-38.18;181.18;0.334
1;2;2;0;G1;10;36.96;-38.43;185.59;0.333
1;2;2;0;G1;11;37.68;-39.94;189.76;0.237
1;2;3;0;0;0;42.33;-45.04;158.56;3.99
1;2;4;0;0;0;43.72;-52.31;156.93;4.222
1;2;5;0;0;0;44.36;-61.51;153.39;4.163
1;2;5.a.1;0;0;0;43.29;-69.6;148.23;5.559
1;2;5.a.1;1;0;0;45.07;-71.74;153.49;1.869
1;2;5.a.1;1;G1m;0;44.02;-68.62;151.47;1.164
1;2;5.a.1;1;G1m;1;43.43;-68.44;151.71;0.778
1;2;5.a.1;1;G1m;2;41.9;-67.96;153.53;0.668
1;2;5.a.1;1;G1m;3;37.83;-66.92;158.36;0.585
1;2;5.a.1;1;G1m;4;33.58;-65.39;163.97;0.581
1;2;5.a.1;1;G1m;5;27.99;-61.5;168.53;0.575
1;2;5.a.1;1;G1m;6;23.82;-59.98;172.65;0.561
1;2;5.a.1;1;G1m;7;19.56;-54.92;176.21;0.515
1;2;5.a.1;1;G1m;8;15.14;-52.33;180.41;0.533
1;2;5.a.1;1;G1m;9;12.89;-50.09;184.25;0.433
1;2;5.a.1;1;G1m;10;11.19;-49.75;188.9;0.466
1;2;5.a.1;1;G1m;11;11.2;-48.63;196.34;0.438
1;2;5.a.1;1;G1m;12;9.02;-49.35;200.4;0.391
1;2;5.a.1;1;G1m;13;6.86;-48.52;203.14;0.382
1;2;5.a.1;1;G1m;14;5.2;-49.55;205.74;0.385
1;2;5.a.1;1;G1m;15;3.16;-46.98;209.72;0.317
1;2;5.a.1;1;G1m;16;-0.43;-46.21;213.08;0.305
1;2;5.a.1;1;G1m;17;-0.44;-41.8;216.54;0.354
1;2;5.a.1;1;G2m;0;44.3;-67.28;152.07;0.801
1;2;5.a.1;1;G2m;1;46.37;-67.24;152.45;0.438
1;2;5.a.1;1;G2m;2;47.37;-63.2;153.84;0.409
1;2;5.a.1;1;G2m;3;47.95;-60.96;156.9;0.337
1;2;5.a.1;1;G2m;4;48.47;-60.07;160.36;0.304
1;2;5.a.1;1;G2m;5;47.85;-58.81;161.73;0.308
1;2;5.a.1;1;G2m;6;47.8;-59.6;165.35;0.245
1;2;5.a.1;1;1;0;43.19;-70.77;154.61;1.706
1;2;5.a.1;1;1;1;43.76;-71.76;155.21;1.711
1;2;5.a.1;1;1;2;41.36;-73.32;157.04;1.534
1;2;5.a.1;1;1;3;38.95;-76.05;160.73;0.971
1;2;5.a.1;1;1;4;35.83;-79.86;164.07;0.964
1;2;5.a.1;1;1;5;31.33;-84.84;169.19;0.931
1;2;5.a.1;1;1;6;23.46;-95.57;172.79;0.806
1;2;5.a.1;1;1;7;13.91;-103.28;174.18;0.738
1;2;5.a.1;1;1;8;8.14;-111.73;172.04;0.672
1;2;5.a.1;1;1;9;0.07;-121.77;167.64;0.616
1;2;5.a.1;1;1;10;-2.74;-127.14;160.99;0.586
1;2;5.a.1;1;1;11;-8.51;-131.75;155.4;0.578
1;2;5.a.1;1;1;12;-11.21;-136.77;150.42;0.559
1;2;5.a.1;1;1;13;-14.43;-139.29;145.18;0.566
1;2;5.a.1;1;1;14;-19.23;-144.94;139.87;0.573
1;2;5.a.1;1;1;15;-24.11;-145.81;135.17;0.486
1;2;5.a.1;1;1;16;-29.11;-149.08;131.57;0.46
1;2;5.a.1;1;1;17;-33.39;-149.91;125.89;0.414
1;2;5.a.1;1;1.4_1;1;37.84;-81.48;166.18;0.258
1;2;5.a.1;1;1.4_1;2;38.03;-80.9;169.56;0.152
1;2;5.a.1;1;1.5_1;1;32.83;-82.19;173.4;0.345
1;2;5.a.1;1;1.5_1;2;33.75;-81.57;177.11;0.255
1;2;5.a.1;1;1.5_1;3;34.84;-80.36;180.54;0.227
1;2;5.a.1;1;1.7_1;1;12.52;-106.67;179.53;0.306
1;2;5.a.1;1;1.9_1;1;-0.49;-119.69;170.93;0.25
1;2;5.a.1;1;1.10_1;1;-3.87;-126.5;162.29;0.113
1;2;5.a.1;1;1.12_1;1;-8.62;-131.91;155.71;0.146
1;2;5.a.1;1;1.12_1;2;-8.91;-132.74;156.7;0.117
1;2;5.b.1;0;0;0;35.2;-60.49;151.04;4.539
1;2;5.b.2;0;0;0;27.17;-64.68;148.97;2.444
1;2;5.b.2;1;0;0;25.29;-65.75;150.32;1.51
1;2;5.b.2;1;1;0;25.48;-67.77;151.99;1.266
1;2;5.b.2;1;1;1;26.06;-68.05;153.42;1.568
1;2;5.b.2;1;1;2;26.08;-67.81;154.51;1.147
1;2;5.b.2;1;1;3;25.47;-69.96;157.27;0.996
1;2;5.b.2;1;1;4;24.48;-73.55;162.29;0.96
1;2;5.b.2;1;1;5;23.2;-78.04;167.06;0.924
1;2;5.b.2;1;1;6;20.12;-88.2;173.45;0.79
1;2;5.b.2;1;1;7;17.5;-96.76;178.33;0.798
1;2;5.b.2;1;1;8;18.58;-105.9;181.59;0.835
1;2;5.b.2;1;1;9;16.67;-119.61;182.81;0.83
1;2;5.b.2;1;1;10;15.78;-128.33;181.24;0.684
1;2;5.b.2;1;1;11;13.01;-133.81;178.59;0.638
1;2;5.b.2;1;1;12;10.5;-140.08;175.66;0.612
1;2;5.b.2;1;1;13;7.66;-145.17;173.32;0.611
1;2;5.b.2;1;1;14;5.68;-151.17;170.96;0.614
1;2;5.b.2;1;1;15;3.67;-156.08;170.28;0.56
1;2;5.b.2;1;1;16;0.49;-162.88;168.89;0.509
1;2;5.b.2;1;1;17;-2.02;-168.02;169.61;0.523
1;2;5.b.2;1;1;18;-0.64;-175.34;167.86;0.422
1;2;5.b.2;1;1.4_1;1;23.55;-72.04;163.3;0.207
1;2;5.b.2;1;1.5_1;1;20.16;-79.18;166.23;0.226
1;2;5.b.2;1;1.5_1;2;20.16;-79.29;170.95;0.198
1;2;5.b.2;1;1.7_1;1;17.03;-94.18;178.11;0.212
1;2;5.b.2;1;1.14_1;1;6.51;-152.41;173.37;0.143
1;2;5.b.2;1;1.16_1;1;2.45;-164.3;171.14;0.156
1;2;5.b.2;1;1.17_1;1;-5.82;-164.32;172.57;0.156
1;2;6rl;0;0;0;29.3;-58.98;152.81;3.246
1;2;7;0;0;0;23.77;-58.66;152.05;3.128
1;2;8;0;0;0;14.08;-59.74;148.21;3.117
1;2;8.a.1;0;0;0;10.08;-62.22;147.61;4.162
1;2;8.a.1;0;G1;0;12.88;-62.13;145.68;1.503
1;2;8.a.1;0;G1;1;11.97;-62.44;145.3;1.338
1;2;8.a.1;0;G1;2;10.57;-63.23;144.57;0.991
1;2;8.a.1;0;G1;3;5.79;-65.76;142.05;0.713
1;2;8.a.1;0;G1;4;0.97;-70.34;138.56;0.787
1;2;8.a.1;0;G1;5;-5.13;-75.3;135.18;0.742
1;2;8.a.1;0;G1;6;-10.34;-82.41;129.66;0.703
1;2;8.a.1;0;G1;7;-18.06;-88.99;123.22;0.651
1;2;8.a.1;0;G1;8;-23.15;-95.7;115.68;0.637
1;2;8.a.1;0;G1;9;-28.51;-99.07;109.19;0.532
1;2;8.a.1;0;G1;10;-32.4;-101.67;104.16;0.519
1;2;8.a.1;0;G1;11;-36.21;-102.91;97.44;0.434
1;2;8.a.1;0;G1;12;-39.8;-103.08;91.13;0.458
1;2;8.a.1;0;G1;13;-44.82;-102.22;87.11;0.4
1;2;8.a.1;0;G1.7_1;1;-18.25;-89.94;124.3;0.156
1;2;8.a.1;0;G1.7_1;2;-18.9;-90.53;125.72;0.087
1;2;8.a.1;0;G1.7_1;3;-22.98;-90.6;121.95;0.073
1;2;8.a.1;0;G1.9_1;1;-35.81;-96.91;98.49;0.12
1;2;8.a.1;0;G2;0;11.34;-60.2;150.01;1.063
1;2;8.a.1;0;G2;1;10.86;-59;150.91;0.88
1;2;8.a.1;0;G2;2;10.51;-57.57;152.97;0.696
1;2;8.a.1;0;G2;3;10.04;-57.57;157.01;0.663
1;2;8.a.1;0;G2;4;9.07;-56.36;162.01;0.622
1;2;8.a.1;0;G2;5;6.74;-56.05;168.27;0.613
1;2;8.a.1;0;G2;6;5.5;-52.1;176.76;0.547
1;2;8.a.1;0;G2;7;2.66;-49.9;182.93;0.47
1;2;8.a.1;0;G2;8;0.97;-45.49;187.86;0.454
1;2;8.a.1;0;G2;9;-2.88;-40.5;192.01;0.435
1;2;8.a.1;0;G2;10;-4.4;-36.84;193.22;0.456
1;2;8.a.1;0;G2;11;-6.68;-32.56;195.55;0.47
1;2;8.a.1;0;G2;12;-8.42;-27.52;195.39;0.378
1;2;8.a.1;0;G2;13;-9.25;-24.19;197.42;0.403
1;2;8.a.1;0;G2;14;-8.54;-20.56;197.51;0.304
1;2;8.a.1;0;G2;15;-6.07;-18.49;200.95;0.276
1;2;8.a.1;0;G2;16;-4.55;-15.71;203.24;0.313
1;2;8.a.1;0;G2;17;-1.72;-16.53;204.43;0.31
1;2;8.a.1;0;G2.8_1;1;3.5;-51.85;185.14;0.14
1;2;8.a.2;0;0;0;7.34;-59.83;144.05;1.991
1;2;8.a.2;0;G1;0;7.91;-59.1;146.64;1.384
1;2;8.a.2;0;G1;1;7.4;-57.42;146.66;1.097
1;2;8.a.2;0;G1;2;7.84;-55.89;148.23;0.714
1;2;8.a.2;0;G1;3;7.99;-52.72;149.63;0.672
1;2;8.a.2;0;G1;4;7.63;-48.34;150.77;0.639
1;2;8.a.2;0;G1;5;6;-43.02;151.53;0.678
1;2;8.a.2;0;G1;6;2.71;-34.38;153.87;0.618
1;2;8.a.2;0;G1;7;2.68;-28.8;156.71;0.518
1;2;8.a.2;0;G1;8;0.32;-22.42;158.08;0.483
1;2;8.a.2;0;G1;9;-4.11;-16.75;163.11;0.409
1;2;8.a.2;0;G1;10;-4.91;-15.21;164.06;0.481
1;2;8.a.2;0;G1.4_1;1;4.88;-48.49;149.63;0.179
1;2;8.a.2;1;0;0;7.23;-61.96;142.95;1.971
1;2;8.a.2;1;1;0;6.76;-61.53;143.69;1.205
1;2;8.a.2;1;1;1;6.42;-62.51;143.23;1.213
1;2;8.a.2;1;1;2;4.56;-63.72;143.6;0.906
1;2;8.a.2;1;1;3;1.36;-65.59;147.2;0.77
1;2;8.a.2;1;1;4;-0.54;-70.69;149.21;0.697
1;2;8.a.2;1;1;5;-6.09;-74.51;155.14;0.73
1;2;8.a.2;1;1;6;-11.51;-84.81;160.54;0.758
1;2;8.a.2;1;1;7;-15.18;-91.81;164.63;0.596
1;2;8.a.2;1;1;8;-19.88;-96.23;162.99;0.562
1;2;8.a.2;1;1;9;-24.46;-103.37;161.33;0.529
1;2;8.a.2;1;1;10;-27.85;-106.99;163.35;0.476
1;2;8.a.2;1;1;11;-29.52;-111.21;161.67;0.498
1;2;8.a.2;1;1;12;-34.47;-114.15;161.99;0.447
1;2;8.a.2;1;1.11_1;1;-30.41;-105.16;164.8;0.17
1;2;8.a.2;1;2;0;4.66;-60.88;140.68;1.264
1;2;8.a.2;1;2;1;4.14;-61.4;140.96;1.314
1;2;8.a.2;1;2;2;2.05;-59.61;139.98;0.99
1;2;8.a.2;1;2;3;-1.34;-57.69;139.6;0.908
1;2;8.a.2;1;2;4;-7.03;-54.68;137.86;0.844
1;2;8.a.2;1;2;5;-14.33;-52.35;135.24;0.827
1;2;8.a.2;1;2;6;-22.6;-48.46;130.19;0.732
1;2;8.a.2;1;2;7;-32.17;-45.57;123.22;0.614
1;2;8.a.2;1;2;8;-40.02;-40.14;116.99;0.591
1;2;8.a.2;1;2;9;-39.81;-41.49;115.93;0.735
1;2;8.a.2;1;2;10;-50.31;-39.04;108.22;0.462
1;2;8.a.2;1;2;11;-56.11;-39.77;102.56;0.381
1;2;8.a.2;1;2.4_1;1;-7.47;-53.17;138.64;0.225
1;2;8.a.2;1;2.4_1;2;-6.69;-52.32;137.9;0.122
1;2;8.a.2;1;2.5_1;1;-14.58;-52.02;137.53;0.198
1;2;8.a.2;1;2.8_1;1;-40.08;-40.06;118.37;0.191
1;2;8.a.3;0;0;0;8.05;-60.22;151.45;2.436
1;2;9rl;0;0;0;0.72;-61.64;150.69;2.213
1;2;9rl.a;0;0;0;-0.82;-62.7;150.79;1.725
1;2;9rl.a;1;0;0;-4.11;-62.67;147.63;1.572
1;2;9rl.a;1;1;0;-4.62;-64.08;146.59;1.305
1;2;9rl.a;1;1;1;-4.95;-64.13;147.41;0.952
1;2;9rl.a;1;1;2;-5.6;-64.27;147.82;0.91
1;2;9rl.a;1;1;3;-6.44;-65.85;149.85;0.644
1;2;9rl.a;1;1;4;-8.43;-68.94;153.2;0.572
1;2;9rl.a;1;2;0;-7.47;-63.89;149.71;1.433
1;2;9rl.a;1;2;1;-7.13;-63.96;149.86;1.407
1;2;9rl.a;1;2;2;-7.81;-62.26;149.83;0.889
1;2;9rl.a;1;2;3;-9.13;-60.38;148.91;1.693
1;2;9rl.a;1;2;4;-9.07;-59.61;145.5;0.93
1;2;9rl.a;1;2;5;-10.07;-57.51;139.74;0.829
1;2;9rl.a;1;2;6;-12.92;-56.75;128.44;0.778
1;2;9rl.a;1;2;7;-17.86;-56.07;116.64;0.692
1;2;9rl.a;1;2;8;-20.41;-58.55;108.01;0.666
1;2;9rl.a;1;2;9;-25.85;-60.3;98.44;0.605
1;2;9rl.a;1;2;10;-28.13;-62.4;90.64;0.534
1;2;9rl.a;1;2;11;-32.54;-62.45;85.03;0.525
1;2;9rl.a;1;2;12;-37.51;-63.52;76.84;0.437
1;2;9rl.a;1;2.6_1;1;-12.5;-58.08;126.35;0.108
1;2;9rl.a;1;2.7_1;1;-19.85;-56.76;115.98;0.11
1;2;10;0;0;0;-8.58;-63.02;151.81;2.022
1;2;10;1;0;0;-9.68;-61.82;152.7;2.723
1;2;10;1;G1;0;-9.33;-61.65;152.61;1.538
1;2;10;1;G1;1;-8.52;-62.19;154.17;1.205
1;2;10;1;G1;2;-8.35;-62.02;155.41;0.859
1;2;10;1;G1;3;-6.87;-60.15;158.31;0.762
1;2;10;1;G1;4;-5.97;-57;164.58;0.656
1;2;10;1;G1;5;-5.22;-53.79;169.63;0.609
1;2;10;1;G1;6;-3.95;-53.06;176.9;0.575
1;2;10;1;G1;7;-3.02;-51.51;182.3;0.552
1;2;10;1;G1;8;-1.89;-50.09;187.02;0.467
1;2;10;1;G1;9;0.01;-48.35;191.96;0.412
1;2;10;1;G1;10;1.91;-46.76;196.64;0.445
1;2;10;1;G1;11;2.44;-44.58;201.13;0.475
1;2;10;1;G1;12;5.9;-45.41;205.81;0.443
1;2;10;1;G1;13;6.73;-44.21;210.42;0.397
1;2;10;1;G1;14;8.08;-45.48;213.35;0.413
1;2;10;1;G1;15;8.65;-44.43;218.49;0.372
1;2;10;1;G1;16;12.08;-41.65;223.44;0.31
1;2;10;1;G1.4_1;1;-7.36;-56.73;166.02;0.177
1;2;10;1;G1.5_1;1;-6.73;-51.41;169.96;0.138
1;2;10;1;G1.5_1;2;-7.9;-50.01;171.38;0.143
1;2;10;1;1;0;-12.18;-59.21;153.34;1.492
1;2;10;1;1;1;-12.46;-59.59;152.96;1.491
1;2;10;1;1;2;-14.37;-58.05;153.4;1.164
1;2;10;1;1;3;-16.02;-58.72;154.84;1.099
1;2;10;1;1;4;-20.77;-56.65;157.62;1.077
1;2;10;1;1;5;-26.82;-56.42;160.74;1.429
1;2;10;1;1;6;-36.11;-54.46;165.67;1.431
1;2;10;1;1;7;-47.99;-54.82;169.31;0.866
1;2;10;1;1;8;-56.22;-51.37;173.39;0.674
1;2;10;1;1;9;-64.33;-50.24;175.68;0.619
1;2;10;1;1;10;-71.64;-44.73;173.19;0.586
1;2;10;1;1;11;-73.78;-41.53;167.89;0.575
1;2;10;1;1;12;-71.4;-38.9;163.23;0.544
1;2;10;1;1;13;-73.39;-35.95;157.71;0.543
1;2;10;1;1;14;-74.92;-29.7;152.82;0.547
1;2;10;1;1;15;-79.26;-27.27;149.61;0.506
1;2;10;1;1;16;-82.69;-23.43;146.94;0.496
1;2;10;1;1;17;-89.52;-19.73;143.94;0.516
1;2;10;1;1;18;-93.88;-15.83;143.13;0.56
1;2;10;1;1;19;-99.17;-14.8;140.12;0.477
1;2;10;1;1;20;-106.21;-10.63;138.52;0.423
1;2;10;1;1;21;-113.34;-8.71;136.61;0.482
1;2;10;1;1;22;-120.1;-6.54;134.67;0.445
1;2;10;1;1;23;-131.38;-0.77;130.84;0.417
1;2;10;1;1;24;-139.17;2.6;129.81;0.358
1;2;10;1;1;25;-147.95;6.51;126.85;0.344
1;2;10;1;1;26;-158.65;8.91;126.2;0.328
1;2;10;1;1;27;-166.49;8.89;125.93;0.303
1;2;10;1;1.5_1;1;-26.66;-57.09;162.81;0.168
1;2;10;1;1.6_1;1;-36.16;-52.58;169.91;0.191
1;2;10;1;1.7_1;1;-47.15;-55.27;174.08;0.396
1;2;10;1;1.7_1;2;-45.26;-54.88;174.05;0.229
1;2;10;1;1.7_1;3;-41.92;-55.91;174.6;0.188
1;2;10;1;1.8_1;1;-55.04;-51.27;176.47;0.32
1;2;10;1;1.8_1;2;-54.45;-51.1;179.93;0.221
1;2;10;1;1.9_1;1;-65.77;-49.45;178.29;0.35
1;2;11;0;0;0;-17.81;-66.21;148.63;1.775
1;2;11.a;0;0;0;-22.79;-65.18;150.24;2.408
1;2;11.a;1;0;0;-22.58;-68.39;149.1;1.461
1;2;11.a;1;1;0;-22.55;-68.54;149.83;1.64
1;2;11.a;1;1;1;-22.14;-69.02;149.85;1.499
1;2;11.a;1;1;2;-20.7;-70.47;151.01;1.139
1;2;11.a;1;1;3;-19.82;-71.74;154;1.008
1;2;11.a;1;1;4;-18.45;-73.56;159.12;0.996
1;2;11.a;1;1;5;-16.04;-77.54;166.04;0.936
1;2;11.a;1;1;6;-12.09;-81.93;169.85;0.896
1;2;11.a;1;1;7;-5.91;-88.67;177.23;0.834
1;2;11.a;1;1;8;0.77;-96.12;180.7;0.802
1;2;11.a;1;1;9;6.36;-103.51;184.63;0.718
1;2;11.a;1;1;10;14.24;-112.7;185.64;0.608
1;2;11.a;1;1;11;22.56;-120.07;188.83;0.626
1;2;11.a;1;1;12;30.96;-128.39;182.44;0.57
1;2;11.a;1;1;13;38.19;-132.14;180.72;0.541
1;2;11.a;1;1;14;41.28;-135.1;177.16;0.523
1;2;11.a;1;1;15;48.48;-138.03;176.37;0.463
1;2;11.a;1;1;16;52.5;-141.83;172.82;0.465
1;2;11.a;1;1;17;58.76;-144.6;174.14;0.356
1;2;11.a;1;1.3_1;1;-22.08;-71.31;155.94;0.23
1;2;11.a;1;1.4_1;1;-16.94;-76.46;158.11;0.385
1;2;11.a;1;1.4_1;2;-16.43;-83.19;159.87;0.306
1;2;11.a;1;1.4_1;3;-19.58;-86.18;162;0.274
1;2;11.a;1;1.4_1;4;-20.77;-88.56;164.33;0.244
1;2;11.a;1;1.4_1;5;-21.94;-91.96;168.24;0.204
1;2;11.a;1;1.4_1;6;-20.65;-94.93;171.37;0.211
1;2;11.a;1;1.4_1;7;-21.06;-95.12;166.03;0.139
1;2;11.a;1;1.5_1;1;-18.3;-77.55;167.21;0.456
1;2;11.a;1;1.5_1;2;-21.09;-76.41;171.45;0.39
1;2;11.a;1;1.5_1;3;-24.34;-74.57;173.92;0.368
1;2;11.a;1;1.5_1;4;-26.53;-73.61;176.64;0.391
1;2;11.a;1;1.5_1;5;-29.39;-71.91;178.33;0.394
1;2;11.a;1;1.5_1;6;-30.26;-70.83;184.11;0.366
1;2;11.a;1;1.5_1;7;-33.13;-68.17;186.95;0.365
1;2;11.a;1;1.5_1;8;-33.17;-66.83;191.12;0.329
1;2;11.a;1;1.5_1;9;-35.98;-65.93;192.41;0.217
1;2;11.a;1;1.6_1;1;-12.74;-86.47;170.46;0.307
1;2;11.a;1;1.7_1;1;-6.82;-87.63;180.67;0.367
1;2;11.a;1;1.7_1;2;-6.68;-86.61;182.98;0.266
1;2;11.a;1;1.7_1;3;-7.1;-84.13;187.03;0.213
1;2;11.a;1;1.7_1;4;-7.05;-82.53;188.18;0.195
1;2;11.a;1;1.8_1;1;-0.94;-100.34;182.52;0.417
1;2;11.a;1;1.8_1;2;-2.18;-101.75;186.03;0.367
1;2;11.a;1;1.8_1;3;-3.88;-102.44;189.22;0.355
1;2;11.a;1;1.8_1;4;-5.61;-102.11;192.53;0.292
1;2;11.a;1;1.8_1;5;-8;-100.73;195.22;0.321
1;2;11.a;1;1.9_1;1;5.69;-102.83;187.57;0.364
1;2;11.a;1;1.9_1;2;5.65;-101.16;190.96;0.326
1;2;11.a;1;1.9_1;3;4.79;-99.18;195.13;0.285
1;2;11.a;1;1.11_1;1;21.82;-121.27;187.51;0.275
1;2;11.a;1;1.13_1;1;37.54;-132.64;181.87;0.283
1;2;11.a;1;1.13_1;2;37.33;-131;181.25;0.222
1;2;11.a;1;1.13_1;3;34.62;-127.96;181.16;0.161
1;2;11.a;1;1.14_1;1;39.67;-134.26;176.73;0.117
1;2;11.a;1;1.15_1;1;46.51;-137.37;176.76;0.108

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
{
"simulation": {
"sdate": "2012-08-01 00:00:00",
"edate": "2012-08-04 23:00:00",
"latitude": 43.61,
"longitude": 3.87,
"elevation": 44.0,
"tzone": "Europe/Paris",
"output_index": "",
"unit_scene_length": "cm",
"hydraulic_structure": true,
"negligible_shoot_resistance": false,
"energy_budget": true
},
"planting": {
"spacing_between_rows": 3.6,
"spacing_on_row": 1,
"row_angle_with_south": 140.0
},
"phenology": {
"emdate": "2012-04-01 00:00:00",
"t_base": 10.0
},
"mtg_api": {
"collar_label": "inT",
"leaf_lbl_prefix": "L",
"stem_lbl_prefix": [
"in",
"Pet",
"cx"
]
},
"numerical_resolution": {
"max_iter": 100,
"psi_step": 1.0,
"psi_error_threshold": 0.05,
"t_step": 1.0,
"t_error_threshold": 0.02
},
"irradiance": {
"E_type": "Rg_Watt/m2",
"E_type2": "Eabs",
"opt_prop": {
"SW": {
"leaf": [
0.06,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
},
"LW": {
"leaf": [
0.04,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
}
},
"turtle_format": "soc",
"turtle_sectors": "46",
"icosphere_level": null
},
"energy": {
"solo": true,
"t_cloud": 2.0,
"t_sky": -20.0
},
"hydraulic": {
"psi_min": -3.0,
"Kx_dict": {
"a": 1.6,
"b": 2.0,
"min_kmax": 0.000111
},
"par_K_vul": {
"model": "misson",
"fifty_cent": -0.76,
"sig_slope": 1.0
}
},
"exchange": {
"rbt": 0.6667,
"Na_dict": {
"aN": -0.0008,
"bN": 3.3,
"aM": 6.471,
"bM": 56.635
},
"par_gs": {
"model": "misson",
"g0": 0.0,
"m0": 7.3,
"psi0": -0.65,
"D0": 1.0,
"n": 4.0
},
"par_photo": {
"alpha": 0.24,
"Kc25": 404.9,
"Ko25": 278.4,
"Tx25": 42.75,
"ds": 0.635,
"dHd": 200.0,
"RespT_Kc": {
"c": 38.05,
"deltaHa": 79.43
},
"RespT_Ko": {
"c": 20.30,
"deltaHa": 36.38
},
"RespT_Vcm": {
"c": 26.35,
"deltaHa": 65.33
},
"RespT_Jm": {
"c": 17.57,
"deltaHa": 43.54
},
"RespT_TPU": {
"c": 21.46,
"deltaHa": 53.1
},
"RespT_Rd": {
"c": 18.72,
"deltaHa": 46.39
},
"RespT_Tx": {
"c": 19.02,
"deltaHa": 37.83
}
},
"par_photo_N": {
"Vcm25_N": [
34.02,
-3.13
],
"Jm25_N": [
78.27,
-17.3
],
"Rd_N": [
0.42,
-0.01
],
"TPU25_N": [
6.24,
-1.92
]
}
},
"soil": {
"soil_class": "Sandy_Loam",
"soil_dimensions": {
"width": 3.6,
"length": 1.0,
"depth": 1.2
},
"rhyzo_coeff": 0.75
}
}

View file

@ -0,0 +1,7 @@
time;psi
2012-07-20;-0.18
2012-07-27;-0.15
2012-08-01;-0.23
2012-08-02;-0.33
2012-08-03;-0.71
2012-08-09;-0.20

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,39 @@
from pathlib import Path
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
if __name__ == '__main__':
path_project = Path(__file__).parent
# =============================================================================
# Construct the plant mock-up
# =============================================================================
g = architecture.vine_mtg(path_project / 'digit.input')
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_phyto_modular(g, v)
architecture.vine_petiole(g, v, pet_ins=90., pet_ins_cv=0.,
phyllo_angle=180.)
architecture.vine_leaf(g, v, leaf_inc=-45., leaf_inc_cv=100.,
lim_max=12.0, lim_min=5., order_lim_max=6,
max_order=55, rand_rot_angle=90.,
cordon_vector=None)
architecture.vine_mtg_properties(g, v)
architecture.vine_mtg_geometry(g, v)
architecture.vine_transform(g, v)
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(), view_result=True)
# =============================================================================
# Run HydroShoot
# =============================================================================
model.run(
g=g,
wd=path_project,
path_weather=path_project / 'meteo.input',
scene=scene)

View file

@ -0,0 +1,13 @@
date;psi_pd;psi_stem;psi_leaf;gs
2012-07-20 00:00;-0.18;-1.12;-1.31;40
2012-07-20 00:00;-0.19;-1.23;-1.06;73
2012-07-27 00:00;-0.20;-1.42;-1.49;59
2012-07-27 00:00;-0.11;-1.29;-1.41;117
2012-08-01 00:00;-0.20;-1.14;-1.40;172
2012-08-01 00:00;-0.25;-1.10;-1.19;268
2012-08-02 00:00;-0.39;-1.44;-1.50;50
2012-08-02 00:00;-0.26;-1.47;-1.47;38
2012-08-03 00:00;-0.71;-1.56;-1.48;9.6
2012-08-03 00:00;-0.71;-1.40;-1.39;23.4
2012-08-09 00:00;-0.25;-1.39;-1.57;52
2012-08-09 00:00;-0.15;-1.26;-1.66;62

View file

@ -0,0 +1,605 @@
Souche;tronc;element;sarment;rameau;rang;X;Y;Z;Diam
1;0;1;0;0;0;-2.96;0.29;11.65;6.237
1;0;2;0;0;0;-2.41;0.64;11.95;5.89
1;0;3;0;0;0;-0.75;1.97;14.65;4.669
1;0;4;0;0;0;1.85;0.82;22.74;5.049
1;0;5;0;0;0;4.65;-1.6;28.55;4.526
1;0;6;0;0;0;6.46;-2.72;35.14;4.187
1;0;7;0;0;0;7.82;-3.43;39.35;4.284
1;0;8;0;0;0;9.22;-3.23;44.32;4.355
1;0;9;0;0;0;12.13;-3.5;49.93;4.423
1;0;10;0;0;0;13.58;-2.3;54.26;4.483
1;0;11;0;0;0;15.44;-2.08;59.35;4.411
1;0;12;0;0;0;17.09;-1.33;65.25;4.307
1;0;13;0;0;0;18.96;-1;71.59;4.364
1;0;14;0;0;0;19.28;-0.07;75.54;4.466
1;0;15;0;0;0;18.43;0.38;80.55;4.575
1;0;16;0;0;0;18.8;-0.68;88.07;4.028
1;0;17;0;0;0;19.97;0.44;93.93;4.114
1;0;18;0;0;0;22.05;-1.17;101.87;4.227
1;0;19;0;0;0;23.45;-1.54;107.67;4.479
1;0;20;0;0;0;25.98;-2.21;113.08;4.423
1;0;21;0;0;0;30.27;-2.07;119.05;4.386
1;0;22;0;0;0;34;-2.87;124.06;4.508
1;0;23;0;0;0;34.76;-4.82;127.64;4.278
1;0;24;0;0;0;35.36;-6.29;132;3.936
1;0;25;0;0;0;37.16;-8.65;140.14;3.867
1;0;26;0;0;0;38.64;-12.09;149.39;4.5303
1;1;1;0;0;0;44.32;-9.91;155.66;3.336
1;1;2;0;0;0;45.98;-7.92;159.11;3.305
1;1;3;0;0;0;45.48;-5.91;161.84;2.799
1;1;4;0;0;0;45.55;0.18;166.58;2.795
1;1;4;0;G1;0;46.9;0.25;166.65;1.065
1;1;4;0;G1;1;47.02;-0.6;166.36;0.856
1;1;4;0;G1;2;49.44;-0.83;167.37;0.693
1;1;4;0;G1;3;52.36;-0.48;169.92;0.552
1;1;4;0;G1;4;54.93;0.1;173.57;0.451
1;1;4;0;G1;5;58.08;0.21;176.53;0.458
1;1;4;0;G1;6;59.84;1.6;179.84;0.456
1;1;4;0;G1;7;63.05;1.69;182.66;0.436
1;1;4;0;G1;8;65.58;2.64;185.86;0.413
1;1;4;0;G1;9;68.16;1.69;189.48;0.406
1;1;4;0;G1;10;70.83;1.96;192.85;0.374
1;1;4;0;G1;11;73.9;0.92;196.26;0.352
1;1;4;0;G1;12;76.75;1.19;198.62;0.333
1;1;4;0;G1;13;78.77;0.37;200.55;0.315
1;1;4;0;G1;14;82.43;0.41;203.83;0.22
1;1;5;0;0;0;45.42;6.25;169.14;3.016
1;1;6;0;0;0;45.09;14.28;169.32;3.197
1;1;7;0;0;0;44.17;24.65;167.2;3.65
1;1;8;0;0;0;45.1;32.76;164.29;4.228
1;1;9;0;0;0;43.71;37.79;159.15;4.531
1;1;10;0;0;0;48.03;43.29;155.46;3.631
1;1;10.a;0;0;0;44.14;50.1;154.94;2.594
1;1;10.a;1;0;0;42.92;50.46;154.86;2.328
1;1;10.a;1;1;0;43.24;50.43;153.03;1.539
1;1;10.a;1;1;1;43.92;51.06;153.15;0.77
1;1;10.a;1;1;2;44.28;52.93;155.33;0.557
1;1;10.a;1;1;3;44.06;56.13;160.6;0.53
1;1;10.a;1;1;4;45.23;57.33;167.73;0.475
1;1;10.a;1;1;5;45.43;59.44;172.92;0.419
1;1;10.a;1;1;6;46.42;60.28;177.54;0.396
1;1;10.a;1;1;7;47.25;62.98;181.21;0.379
1;1;10.a;1;1;8;48.93;63.4;187.56;0.348
1;1;10.a;1;1;9;50.9;66.78;192.71;0.333
1;1;10.a;1;1;10;54.54;66.93;197.33;0.245
1;1;10.a;1;2;0;41.62;52.26;153.16;1.934
1;1;10.a;1;2;1;40.84;52.63;153.19;1.615
1;1;10.a;1;2;2;39.46;52.85;153.92;1.34
1;1;10.a;1;2;3;35.97;54.14;155.77;1.078
1;1;10.a;1;2;4;31.35;57.35;158.31;1.07
1;1;10.a;1;2;5;25.12;63.86;159.78;1.021
1;1;10.a;1;2;6;16.52;72.81;159.96;0.925
1;1;10.a;1;2;7;9.47;83.82;157.22;0.832
1;1;10.a;1;2;8;4.1;93.07;156.24;0.768
1;1;10.a;1;2;9;-0.78;104.34;151.78;0.744
1;1;10.a;1;2;10;-5.2;112.55;148.64;0.756
1;1;10.a;1;2;11;-7.36;119.33;141.59;0.646
1;1;10.a;1;2;12;-10.96;127.69;134.18;0.619
1;1;10.a;1;2;13;-12;132.43;127.46;0.558
1;1;10.a;1;2;14;-14.24;136.55;123.67;0.592
1;1;10.a;1;2;15;-16.11;142.32;118.04;0.507
1;1;10.a;1;2;16;-19.46;147.38;115.26;0.485
1;1;10.a;1;2.4_1;1;32.09;58.17;161.3;0.27
1;1;10.a;1;2.4_1;2;30.68;65.85;158.08;0.159
1;1;10.a;1;2.5_1;1;15.8;75;164.3;0.271
1;1;10.a;1;2.5_1;2;13.29;73.77;166.35;0.225
1;1;10.a;1;2.6_1;1;15.6;74.83;164.25;0.268
1;1;10.a;1;2.6_1;2;13.01;74.08;166.47;0.21
1;1;10.a;1;2.8_1;1;4.66;94.27;162.66;0.342
1;1;10.a;1;2.10_1;1;-4.5;113.59;152.64;0.231
1;1;10.a;1;2.10_1;2;-4.94;112.88;154.53;0.168
1;1;11;0;0;0;51.46;45.21;155.15;3.748
1;1;12;0;0;0;56.24;45.29;152.77;4.524
1;1;12.a;0;0;0;55.16;56.2;148.66;3.707
1;1;12.a;1;0;0;54.05;57.37;150.71;2.48
1;1;12.a;1;G1;0;53.02;57.64;152.2;0.875
1;1;12.a;1;G1;1;52.85;59.46;154.43;0.578
1;1;12.a;1;G1;2;53.11;61.29;157.88;0.532
1;1;12.a;1;G1;3;54.32;63.78;163.11;0.539
1;1;12.a;1;G1;4;56.97;67.46;168.45;0.511
1;1;12.a;1;G1;5;60.87;70.22;173.17;0.39
1;1;12.a;1;G1;6;64.03;70.33;174.42;0.348
1;1;12.a;1;G1;7;68.25;71.71;174.99;0.298
1;1;12.a;1;1m;0;52.94;55.05;154.25;1.535
1;1;12.a;1;1m;1;53.34;54.9;154.85;1.42
1;1;12.a;1;1m;2;53.29;54.91;157.17;0.98
1;1;12.a;1;1m;3;53.62;54.85;160.27;0.909
1;1;12.a;1;1m;4;53.13;55.96;167.17;0.82
1;1;12.a;1;1m;5;53.43;56.59;176.47;0.77
1;1;12.a;1;1m;6;51.61;59.33;184.77;0.651
1;1;12.a;1;1m;7;48.87;59.89;190.12;0.57
1;1;12.a;1;1m;8;45.33;63.19;193.48;0.562
1;1;12.a;1;1m;9;41.87;65.58;197.63;0.489
1;1;12.a;1;1m;10;38.88;68.35;200.21;0.517
1;1;12.a;1;1m;11;34.95;69.18;203.34;0.526
1;1;12.a;1;1m;12;30.3;71.48;205.95;0.462
1;1;12.a;1;1m;13;26.03;72.51;208.26;0.474
1;1;12.a;1;1m;14;22.01;74.25;209.46;0.44
1;1;12.a;1;1m;15;15.73;74.98;211.34;0.395
1;1;12.a;1;1m;16;12.4;77.05;211.1;0.391
1;1;12.a;1;1m;17;8.27;77.4;211.13;0.417
1;1;12.a;1;2m;0;53.83;54.11;153.88;0.917
1;1;12.a;1;2m;1;53.39;51.8;154.82;0.664
1;1;12.a;1;2m;2;51.78;46.83;156.89;0.633
1;1;12.a;1;2m;3;51.52;40.53;158.71;0.588
1;1;12.a;1;2m;4;51.03;33.06;160.35;0.451
1;1;12.a;1;2m;5;51.49;28;161.14;0.409
1;1;12.a;1;2m;6;51.77;25.3;161;0.354
1;1;12.a;1;2m;7;50.89;20.53;163.55;0.374
1;1;12.a;1;2m;8;50.79;16.05;166.3;0.324
1;1;12.a;1;2m;9;49.19;13.74;169.55;0.29
1;1;12.a;1;3;0;52.65;47.09;156.97;1.391
1;1;12.a;1;3;1;54.98;47.18;157.31;1.084
1;1;12.a;1;3;2;59.02;46.59;158.99;0.879
1;1;12.a;1;3;3;65.28;45.73;162.01;0.882
1;1;12.a;1;3;4;73.66;41.98;165.42;0.901
1;1;12.a;1;3;5;83.7;36.53;169.91;0.83
1;1;12.a;1;3;6;93.31;29.37;171.8;0.922
1;1;12.a;1;3;7;102.12;24.75;174.31;0.696
1;1;12.a;1;3;8;108.51;19.45;175.03;0.742
1;1;12.a;1;3;9;115.29;15.91;176.3;0.67
1;1;12.a;1;3;10;123.16;11.09;175.95;0.618
1;1;12.a;1;3;11;128.11;7.09;176.96;0.574
1;1;12.a;1;3;12;132.83;3.98;176.57;0.56
1;1;12.a;1;3;13;139.31;-1.33;177.14;0.542
1;1;12.a;1;3;14;144.85;-7.05;176.26;0.538
1;1;12.a;1;3;15;150.68;-10.53;175.15;0.509
1;1;12.a;1;3;16;157.47;-18.45;172.6;0.493
1;1;12.a;1;3;17;163.9;-23.66;170.9;0.476
1;1;12.a;1;3;18;168.96;-29.21;168.34;0.422
1;1;12.a;1;3;19;175.71;-35.81;168.24;0.372
1;1;12.a;1;3;20;178.77;-41.93;169.34;0.418
1;1;12.a;1;3.4_1;1;72.79;39.25;166.27;0.406
1;1;12.a;1;3.4_1;2;71.44;37.66;169.77;0.298
1;1;12.a;1;3.4_1;3;70.72;40.51;174.42;0.252
1;1;12.a;1;3.6_1;1;92.74;25.8;172.37;0.432
1;1;12.a;1;3.6_1;2;91.97;22.6;175.25;0.295
1;1;12.a;1;3.6_1;3;93;18.74;179.21;0.227
1;1;12.a;1;3.7_1;1;101.89;25.86;179.51;0.376
1;1;12.a;1;3.7_1;2;102.41;26.55;184.6;0.329
1;1;12.a;1;3.7_1;3;103.31;27.11;190.22;0.25
1;1;13;0;0;0;58.28;40.63;153.55;3.552
1;1;14;0;0;0;62.94;41.87;151.52;4.649
1;1;14.a;0;0;0;62.44;41.56;155.53;2.342
1;1;14.a;1;0;0;62.95;43.21;156.24;2.162
1;1;14.a;1;1;0;63.28;46.76;156.58;1.557
1;1;14.a;1;1;1;62.63;48.28;156.1;1.492
1;1;14.a;1;1;2;62.18;51.28;157.58;1.285
1;1;14.a;1;1;3;62.7;54.84;158.21;1.091
1;1;14.a;1;1;4;66.21;61.71;158.36;1.011
1;1;14.a;1;1;5;70.35;69.98;159.08;0.995
1;1;14.a;1;1;6;77.53;81.62;154.57;0.832
1;1;14.a;1;1;7;83.9;90.1;148.4;0.778
1;1;14.a;1;1;8;88.34;96.32;141.96;0.749
1;1;14.a;1;1;9;96.6;102.49;133.99;0.679
1;1;14.a;1;1;10;101.98;109.45;128.13;0.684
1;1;14.a;1;1;11;111.31;114.61;119.36;0.643
1;1;15;0;0;0;66.04;42.76;151.4;3.206
1;1;15.a;0;0;0;70.27;44.71;149.78;2.234
1;1;15.a;1;0;0;66.72;44.44;147.09;1.638
1;1;15.a;1;1;0;66.48;44.73;147.93;1.386
1;1;15.a;1;1;1;65.89;43.88;148.43;0.888
1;1;15.a;1;1;2;63.8;42.9;147.71;0.656
1;1;15.a;1;1;3;59.78;42.81;147.8;0.621
1;1;15.a;1;1;4;51.82;41.54;148.7;0.532
1;1;15.a;1;1;5;45.4;40.42;152.27;0.453
1;1;15.a;1;1;6;35.78;42.11;155.68;0.42
1;1;15.a;1;1;7;33.26;34.8;148.72;0.315
1;1;15.a;1;2;0;65.71;48.3;149.83;1.593
1;1;15.a;1;2;1;65.89;49.93;150.03;1.132
1;1;15.a;1;2;2;65.86;53.4;151.4;0.941
1;1;15.a;1;2;3;65.15;58.86;152.67;1.003
1;1;15.a;1;2;4;66.68;67.66;155.42;0.909
1;1;15.a;1;2;5;71.43;79.63;157.42;0.841
1;1;15.a;1;2;6;80.62;89.22;156.4;0.776
1;1;15.a;1;2;7;87.54;97.55;156.02;0.737
1;1;15.a;1;2;8;98.06;105.61;152.18;0.677
1;1;15.a;1;2;9;106.11;112.69;148.04;0.638
1;1;15.a;1;2;10;112.88;116.29;141.49;0.557
1;1;15.a;1;2;11;118.05;123.79;135.61;0.529
1;1;15.a;1;2.5_1;1;70.52;80.57;161.58;0.242
1;1;16;0;0;0;69.59;42.86;153.13;2.428
1;1;17;0;0;0;75.99;42.25;153.79;2.263
1;1;18;0;0;0;84.34;40.51;155.75;2.134
1;1;18.a;0;0;0;85.17;41.83;157.81;3.787
1;1;18.a;1;0;0;85.47;43.56;155.77;1.928
1;1;18.a;1;1;0;86.21;45.12;155.79;1.525
1;1;18.a;1;1;1;87.3;45.87;155.6;1.279
1;1;18.a;1;1;2;87.54;47.74;156.71;0.944
1;1;18.a;1;1;3;89.5;50.53;158.74;0.899
1;1;18.a;1;1;4;90.7;55.61;164.38;0.856
1;1;18.a;1;1;5;94.16;62.84;170.28;0.805
1;1;18.a;1;1;6;95.89;74.1;177.68;0.695
1;1;18.a;1;1;7;98.37;81.14;181.14;0.659
1;1;18.a;1;1;8;99.28;90.06;181.81;0.599
1;1;18.a;1;1;9;101.58;99.89;180.88;0.542
1;1;18.a;1;1;10;102.03;106.03;177.34;0.498
1;1;18.a;1;1;11;102.65;111.44;174.56;0.5
1;1;18.a;1;1;12;102.64;116.76;171.68;0.495
1;1;18.a;1;1;13;104.31;122.33;169.58;0.459
1;1;18.a;1;1;14;105.35;127.07;167.79;0.483
1;1;18.a;1;1;15;109.72;131.79;165.07;0.412
1;1;18.a;1;1;16;114.09;135.33;162.95;0.387
1;1;18.a;1;1;17;116.59;138.59;160.7;0.35
1;1;18.a;1;1;18;119.03;143.51;158.14;0.336
1;1;18.a;1;1.6_1;1;93.18;74.71;179.39;0.449
1;1;18.a;1;1.6_1;2;90.47;76.42;184.03;0.406
1;1;18.a;1;1.6_1;3;86.72;76.07;191.05;0.433
1;1;18.a;1;1.6_1;4;85.32;76.84;195.69;0.428
1;1;18.a;1;1.6_1;5;83.63;76.69;199.37;0.4
1;1;18.a;1;1.6_1;6;82.92;77.59;203.56;0.367
1;1;18.a;1;1.6_1;7;81.56;77.34;206.99;0.353
1;1;18.a;1;1.6_1;8;81.15;78.97;210.33;0.274
1;1;18.a;1;1.6_1;9;80.2;78.07;214.21;0.253
1;1;18.a;1;1.6_1;10;78.86;75.09;215.39;0.195
1;1;18.a;1;1.6_1.4_1;1;88.63;79.34;200.12;0.179
1;1;18.a;1;1.6_1.6_1;1;84.38;78.76;207.95;0.167
1;1;18.a;1;1.6_1.7_1;1;80.18;75.18;208.62;0.159
1;1;18.a;1;2;0;88.82;44.97;155.6;1.476
1;1;18.a;1;2;1;90.31;44.55;155.98;1.065
1;1;18.a;1;2;2;92.34;43.89;158.08;0.957
1;1;18.a;1;2;3;96.71;42.35;161.93;0.86
1;1;18.a;1;2;4;101.74;38.61;166.99;0.837
1;1;18.a;1;2;5;108.67;34.4;172.89;0.77
1;1;18.a;1;2;6;118.21;24.19;179.05;0.702
1;1;18.a;1;2;7;126.98;17.36;181.84;0.635
1;1;18.a;1;2;8;130.79;11.15;181.92;0.629
1;1;18.a;1;2;9;138.28;4.86;180.81;0.615
1;1;18.a;1;2;10;141.41;-0.84;180;0.615
1;1;18.a;1;2;11;146.45;-4;179.1;0.56
1;1;18.a;1;2;12;152.12;-10.07;180.01;0.597
1;1;18.a;1;2;13;157.23;-13.32;180.24;0.487
1;1;18.a;1;2;14;162.06;-17.5;181.34;0.529
1;1;18.a;1;2;15;167.94;-22.67;181.98;0.47
1;1;18.a;1;2;16;171.57;-28.47;183.12;0.402
1;1;18.a;1;2;17;175.58;-32.33;183.93;0.325
1;1;18.a;1;2.6_1;1;117.33;23.88;182.04;0.29
1;1;19;0;0;0;95.92;35.45;155.89;1.62
1;1;19.a;0;0;0;98.88;36.52;151.8;2.243
1;1;19.a;1;0;0;100.61;38.56;154.63;2.232
1;1;19.a;1;1;0;101.89;38.69;156.78;1.621
1;1;19.a;1;1;1;102.63;39.93;156.95;1.323
1;1;19.a;1;1;2;104.38;40.62;158.25;1.072
1;1;19.a;1;1;3;107.79;41.41;162.26;0.987
1;1;19.a;1;1;4;114.33;41.01;167.74;0.973
1;1;19.a;1;1;5;124.26;39.39;174.22;0.894
1;1;19.a;1;1;6;135.59;36.16;180.9;0.787
1;1;19.a;1;1;7;144.75;34.57;187.94;0.783
1;1;19.a;1;1;8;154.95;28.6;196.39;0.723
1;1;19.a;1;1;9;162.15;23.86;205.62;0.69
1;1;19.a;1;1;10;167.39;16.66;210.47;0.706
1;1;19.a;1;1;11;174.39;7.79;215.58;0.697
1;1;19.a;1;1;12;178.74;0.42;215.8;0.726
1;1;19.a;1;1;13;183.1;-5.95;216.05;0.699
1;1;19.a;1;1;14;188.03;-12.81;214.88;0.699
1;1;19.a;1;1;15;193.94;-17.97;213.17;0.669
1;1;19.a;1;1;16;196.96;-22.05;208.81;0.615
1;1;19.a;1;1;17;203.17;-26.9;206.19;0.601
1;1;19.a;1;1;18;206.34;-31.12;201.6;0.563
1;1;19.a;1;1;19;210.44;-33.12;199.8;0.515
1;1;19.a;1;1;20;216.4;-37.72;195.34;0.559
1;1;19.a;1;1;21;219.02;-40.62;194.99;0.478
1;1;19.a;1;1;22;222.47;-44.72;194;0.468
1;1;19.a;1;1;23;226.97;-50.33;195.48;0.453
1;1;19.a;1;1;24;229.62;-55.28;197.92;0.425
1;1;19.a;1;1;25;234.12;-58.81;202.77;0.389
1;1;19.a;1;1;26;236.32;-62.58;208.62;0.381
1;1;19.a;1;1;27;240.57;-63.51;213.65;0.328
1;1;19.a;1;1.4_1;1;115.24;38.72;167.52;0.441
1;1;19.a;1;1.4_1;2;114.62;33.89;166.93;0.299
1;1;19.a;1;1.4_1;3;110.92;29.48;163.88;0.237
1;1;19.a;1;1.5_1;1;123.79;35.04;177.76;0.274
1;1;19.a;1;1.6_1;1;134.12;34.12;182.33;0.286
1;1;19.a;1;1.6_1;2;131.36;33.33;185.57;0.186
1;1;19.a;1;1.8_1;1;141.92;35.7;193.28;0.277
1;1;19.a;1;1.8_1;2;139.47;35.79;196.66;0.252
1;1;19.a;1;1.10_1;1;160.08;24.62;206.46;0.11
1;1;19.a;1;1.10_1;2;158.81;24.04;207.99;0.09
1;1;19.a;1;1.11_1;1;166.21;17.01;211.26;0.166
1;1;19.a;1;1.12_1;1;174.08;7.43;217.08;0.173
1;1;19.a;1;1.16_1;1;195.68;-19.01;215.88;0.455
1;1;19.a;1;1.16_1;2;196.21;-19.29;218.21;0.253
1;1;19.a;1;1.16_1;3;196.33;-21.06;222.81;0.17
1;1;19.a;1;1.16_1;4;195.85;-20.98;225.7;0.162
1;1;19.a;1;1.16_1;5;196.26;-20.64;226.88;0.106
1;2;1;0;0;0;40.49;-25.05;151.73;4.01
1;2;2;0;0;0;40.31;-28.94;153.87;3.029
1;2;2;0;G1;0;38.5;-30.6;153.98;0.953
1;2;2;0;G1;1;38.21;-31.22;154.02;0.917
1;2;2;0;G1;2;36.88;-31.72;154.63;0.54
1;2;2;0;G1;3;34.48;-34.87;157.1;0.501
1;2;2;0;G1;4;35.58;-34.55;161.2;0.448
1;2;2;0;G1;5;35.09;-36.11;164.24;0.445
1;2;2;0;G1;6;35.64;-36.21;167.64;0.429
1;2;2;0;G1;7;36.26;-36.75;172.54;0.386
1;2;2;0;G1;8;36.5;-36.74;177.45;0.351
1;2;2;0;G1;9;36.27;-38.18;181.18;0.334
1;2;2;0;G1;10;36.96;-38.43;185.59;0.333
1;2;2;0;G1;11;37.68;-39.94;189.76;0.237
1;2;3;0;0;0;42.33;-45.04;158.56;3.99
1;2;4;0;0;0;43.72;-52.31;156.93;4.222
1;2;5;0;0;0;44.36;-61.51;153.39;4.163
1;2;5.a.1;0;0;0;43.29;-69.6;148.23;5.559
1;2;5.a.1;1;0;0;45.07;-71.74;153.49;1.869
1;2;5.a.1;1;1;0;43.19;-70.77;154.61;1.706
1;2;5.a.1;1;1;1;43.76;-71.76;155.21;1.711
1;2;5.a.1;1;1;2;41.36;-73.32;157.04;1.534
1;2;5.a.1;1;1;3;38.95;-76.05;160.73;0.971
1;2;5.a.1;1;1;4;35.83;-79.86;164.07;0.964
1;2;5.a.1;1;1;5;31.33;-84.84;169.19;0.931
1;2;5.a.1;1;1;6;23.46;-95.57;172.79;0.806
1;2;5.a.1;1;1;7;13.91;-103.28;174.18;0.738
1;2;5.a.1;1;1;8;8.14;-111.73;172.04;0.672
1;2;5.a.1;1;1;9;0.07;-121.77;167.64;0.616
1;2;5.a.1;1;1;10;-2.74;-127.14;160.99;0.586
1;2;5.a.1;1;1;11;-8.51;-131.75;155.4;0.578
1;2;5.a.1;1;1;12;-11.21;-136.77;150.42;0.559
1;2;5.a.1;1;1;13;-14.43;-139.29;145.18;0.566
1;2;5.a.1;1;1;14;-19.23;-144.94;139.87;0.573
1;2;5.a.1;1;1;15;-24.11;-145.81;135.17;0.486
1;2;5.a.1;1;1;16;-29.11;-149.08;131.57;0.46
1;2;5.a.1;1;1;17;-33.39;-149.91;125.89;0.414
1;2;5.a.1;1;1.4_1;1;37.84;-81.48;166.18;0.258
1;2;5.a.1;1;1.4_1;2;38.03;-80.9;169.56;0.152
1;2;5.a.1;1;1.5_1;1;32.83;-82.19;173.4;0.345
1;2;5.a.1;1;1.5_1;2;33.75;-81.57;177.11;0.255
1;2;5.a.1;1;1.5_1;3;34.84;-80.36;180.54;0.227
1;2;5.a.1;1;1.7_1;1;12.52;-106.67;179.53;0.306
1;2;5.a.1;1;1.9_1;1;-0.49;-119.69;170.93;0.25
1;2;5.a.1;1;1.10_1;1;-3.87;-126.5;162.29;0.113
1;2;5.a.1;1;1.12_1;1;-8.62;-131.91;155.71;0.146
1;2;5.a.1;1;1.12_1;2;-8.91;-132.74;156.7;0.117
1;2;5.b.1;0;0;0;35.2;-60.49;151.04;4.539
1;2;5.b.2;0;0;0;27.17;-64.68;148.97;2.444
1;2;5.b.2;1;0;0;25.29;-65.75;150.32;1.51
1;2;5.b.2;1;1;0;25.48;-67.77;151.99;1.266
1;2;5.b.2;1;1;1;26.06;-68.05;153.42;1.568
1;2;5.b.2;1;1;2;26.08;-67.81;154.51;1.147
1;2;5.b.2;1;1;3;25.47;-69.96;157.27;0.996
1;2;5.b.2;1;1;4;24.48;-73.55;162.29;0.96
1;2;5.b.2;1;1;5;23.2;-78.04;167.06;0.924
1;2;5.b.2;1;1;6;20.12;-88.2;173.45;0.79
1;2;5.b.2;1;1;7;17.5;-96.76;178.33;0.798
1;2;5.b.2;1;1;8;18.58;-105.9;181.59;0.835
1;2;5.b.2;1;1;9;16.67;-119.61;182.81;0.83
1;2;5.b.2;1;1;10;15.78;-128.33;181.24;0.684
1;2;5.b.2;1;1;11;13.01;-133.81;178.59;0.638
1;2;5.b.2;1;1;12;10.5;-140.08;175.66;0.612
1;2;5.b.2;1;1;13;7.66;-145.17;173.32;0.611
1;2;5.b.2;1;1;14;5.68;-151.17;170.96;0.614
1;2;5.b.2;1;1;15;3.67;-156.08;170.28;0.56
1;2;5.b.2;1;1;16;0.49;-162.88;168.89;0.509
1;2;5.b.2;1;1;17;-2.02;-168.02;169.61;0.523
1;2;5.b.2;1;1;18;-0.64;-175.34;167.86;0.422
1;2;5.b.2;1;1.4_1;1;23.55;-72.04;163.3;0.207
1;2;5.b.2;1;1.5_1;1;20.16;-79.18;166.23;0.226
1;2;5.b.2;1;1.5_1;2;20.16;-79.29;170.95;0.198
1;2;5.b.2;1;1.7_1;1;17.03;-94.18;178.11;0.212
1;2;5.b.2;1;1.14_1;1;6.51;-152.41;173.37;0.143
1;2;5.b.2;1;1.16_1;1;2.45;-164.3;171.14;0.156
1;2;5.b.2;1;1.17_1;1;-5.82;-164.32;172.57;0.156
1;2;6rl;0;0;0;29.3;-58.98;152.81;3.246
1;2;7;0;0;0;23.77;-58.66;152.05;3.128
1;2;8;0;0;0;14.08;-59.74;148.21;3.117
1;2;8.a.1;0;0;0;10.08;-62.22;147.61;4.162
1;2;8.a.1;0;G1;0;12.88;-62.13;145.68;1.503
1;2;8.a.1;0;G1;1;11.97;-62.44;145.3;1.338
1;2;8.a.1;0;G1;2;10.57;-63.23;144.57;0.991
1;2;8.a.1;0;G1;3;5.79;-65.76;142.05;0.713
1;2;8.a.1;0;G1;4;0.97;-70.34;138.56;0.787
1;2;8.a.1;0;G1;5;-5.13;-75.3;135.18;0.742
1;2;8.a.1;0;G1;6;-10.34;-82.41;129.66;0.703
1;2;8.a.1;0;G1;7;-18.06;-88.99;123.22;0.651
1;2;8.a.1;0;G1;8;-23.15;-95.7;115.68;0.637
1;2;8.a.1;0;G1;9;-28.51;-99.07;109.19;0.532
1;2;8.a.1;0;G1;10;-32.4;-101.67;104.16;0.519
1;2;8.a.1;0;G1;11;-36.21;-102.91;97.44;0.434
1;2;8.a.1;0;G1;12;-39.8;-103.08;91.13;0.458
1;2;8.a.1;0;G1;13;-44.82;-102.22;87.11;0.4
1;2;8.a.1;0;G1.7_1;1;-18.25;-89.94;124.3;0.156
1;2;8.a.1;0;G1.7_1;2;-18.9;-90.53;125.72;0.087
1;2;8.a.1;0;G1.7_1;3;-22.98;-90.6;121.95;0.073
1;2;8.a.1;0;G1.9_1;1;-35.81;-96.91;98.49;0.12
1;2;8.a.1;0;G2;0;11.34;-60.2;150.01;1.063
1;2;8.a.1;0;G2;1;10.86;-59;150.91;0.88
1;2;8.a.1;0;G2;2;10.51;-57.57;152.97;0.696
1;2;8.a.1;0;G2;3;10.04;-57.57;157.01;0.663
1;2;8.a.1;0;G2;4;9.07;-56.36;162.01;0.622
1;2;8.a.1;0;G2;5;6.74;-56.05;168.27;0.613
1;2;8.a.1;0;G2;6;5.5;-52.1;176.76;0.547
1;2;8.a.1;0;G2;7;2.66;-49.9;182.93;0.47
1;2;8.a.1;0;G2;8;0.97;-45.49;187.86;0.454
1;2;8.a.1;0;G2;9;-2.88;-40.5;192.01;0.435
1;2;8.a.1;0;G2;10;-4.4;-36.84;193.22;0.456
1;2;8.a.1;0;G2;11;-6.68;-32.56;195.55;0.47
1;2;8.a.1;0;G2;12;-8.42;-27.52;195.39;0.378
1;2;8.a.1;0;G2;13;-9.25;-24.19;197.42;0.403
1;2;8.a.1;0;G2;14;-8.54;-20.56;197.51;0.304
1;2;8.a.1;0;G2;15;-6.07;-18.49;200.95;0.276
1;2;8.a.1;0;G2;16;-4.55;-15.71;203.24;0.313
1;2;8.a.1;0;G2;17;-1.72;-16.53;204.43;0.31
1;2;8.a.1;0;G2.8_1;1;3.5;-51.85;185.14;0.14
1;2;8.a.2;0;0;0;7.34;-59.83;144.05;1.991
1;2;8.a.2;0;G1;0;7.91;-59.1;146.64;1.384
1;2;8.a.2;0;G1;1;7.4;-57.42;146.66;1.097
1;2;8.a.2;0;G1;2;7.84;-55.89;148.23;0.714
1;2;8.a.2;0;G1;3;7.99;-52.72;149.63;0.672
1;2;8.a.2;0;G1;4;7.63;-48.34;150.77;0.639
1;2;8.a.2;0;G1;5;6;-43.02;151.53;0.678
1;2;8.a.2;0;G1;6;2.71;-34.38;153.87;0.618
1;2;8.a.2;0;G1;7;2.68;-28.8;156.71;0.518
1;2;8.a.2;0;G1;8;0.32;-22.42;158.08;0.483
1;2;8.a.2;0;G1;9;-4.11;-16.75;163.11;0.409
1;2;8.a.2;0;G1;10;-4.91;-15.21;164.06;0.481
1;2;8.a.2;0;G1.4_1;1;4.88;-48.49;149.63;0.179
1;2;8.a.2;1;0;0;7.23;-61.96;142.95;1.971
1;2;8.a.2;1;1;0;6.76;-61.53;143.69;1.205
1;2;8.a.2;1;1;1;6.42;-62.51;143.23;1.213
1;2;8.a.2;1;1;2;4.56;-63.72;143.6;0.906
1;2;8.a.2;1;1;3;1.36;-65.59;147.2;0.77
1;2;8.a.2;1;1;4;-0.54;-70.69;149.21;0.697
1;2;8.a.2;1;1;5;-6.09;-74.51;155.14;0.73
1;2;8.a.2;1;1;6;-11.51;-84.81;160.54;0.758
1;2;8.a.2;1;1;7;-15.18;-91.81;164.63;0.596
1;2;8.a.2;1;1;8;-19.88;-96.23;162.99;0.562
1;2;8.a.2;1;1;9;-24.46;-103.37;161.33;0.529
1;2;8.a.2;1;1;10;-27.85;-106.99;163.35;0.476
1;2;8.a.2;1;1;11;-29.52;-111.21;161.67;0.498
1;2;8.a.2;1;1;12;-34.47;-114.15;161.99;0.447
1;2;8.a.2;1;1.11_1;1;-30.41;-105.16;164.8;0.17
1;2;8.a.2;1;2;0;4.66;-60.88;140.68;1.264
1;2;8.a.2;1;2;1;4.14;-61.4;140.96;1.314
1;2;8.a.2;1;2;2;2.05;-59.61;139.98;0.99
1;2;8.a.2;1;2;3;-1.34;-57.69;139.6;0.908
1;2;8.a.2;1;2;4;-7.03;-54.68;137.86;0.844
1;2;8.a.2;1;2;5;-14.33;-52.35;135.24;0.827
1;2;8.a.2;1;2;6;-22.6;-48.46;130.19;0.732
1;2;8.a.2;1;2;7;-32.17;-45.57;123.22;0.614
1;2;8.a.2;1;2;8;-40.02;-40.14;116.99;0.591
1;2;8.a.2;1;2;9;-39.81;-41.49;115.93;0.735
1;2;8.a.2;1;2;10;-50.31;-39.04;108.22;0.462
1;2;8.a.2;1;2;11;-56.11;-39.77;102.56;0.381
1;2;8.a.2;1;2.4_1;1;-7.47;-53.17;138.64;0.225
1;2;8.a.2;1;2.4_1;2;-6.69;-52.32;137.9;0.122
1;2;8.a.2;1;2.5_1;1;-14.58;-52.02;137.53;0.198
1;2;8.a.2;1;2.8_1;1;-40.08;-40.06;118.37;0.191
1;2;8.a.3;0;0;0;8.05;-60.22;151.45;2.436
1;2;9rl;0;0;0;0.72;-61.64;150.69;2.213
1;2;9rl.a;0;0;0;-0.82;-62.7;150.79;1.725
1;2;9rl.a;1;0;0;-4.11;-62.67;147.63;1.572
1;2;9rl.a;1;1;0;-4.62;-64.08;146.59;1.305
1;2;9rl.a;1;1;1;-4.95;-64.13;147.41;0.952
1;2;9rl.a;1;1;2;-5.6;-64.27;147.82;0.91
1;2;9rl.a;1;1;3;-6.44;-65.85;149.85;0.644
1;2;9rl.a;1;1;4;-8.43;-68.94;153.2;0.572
1;2;9rl.a;1;2;0;-7.47;-63.89;149.71;1.433
1;2;9rl.a;1;2;1;-7.13;-63.96;149.86;1.407
1;2;9rl.a;1;2;2;-7.81;-62.26;149.83;0.889
1;2;9rl.a;1;2;3;-9.13;-60.38;148.91;1.693
1;2;9rl.a;1;2;4;-9.07;-59.61;145.5;0.93
1;2;9rl.a;1;2;5;-10.07;-57.51;139.74;0.829
1;2;9rl.a;1;2;6;-12.92;-56.75;128.44;0.778
1;2;9rl.a;1;2;7;-17.86;-56.07;116.64;0.692
1;2;9rl.a;1;2;8;-20.41;-58.55;108.01;0.666
1;2;9rl.a;1;2;9;-25.85;-60.3;98.44;0.605
1;2;9rl.a;1;2;10;-28.13;-62.4;90.64;0.534
1;2;9rl.a;1;2;11;-32.54;-62.45;85.03;0.525
1;2;9rl.a;1;2;12;-37.51;-63.52;76.84;0.437
1;2;9rl.a;1;2.6_1;1;-12.5;-58.08;126.35;0.108
1;2;9rl.a;1;2.7_1;1;-19.85;-56.76;115.98;0.11
1;2;10;0;0;0;-8.58;-63.02;151.81;2.022
1;2;10;1;0;0;-9.68;-61.82;152.7;2.723
1;2;10;1;G1;0;-9.33;-61.65;152.61;1.538
1;2;10;1;G1;1;-8.52;-62.19;154.17;1.205
1;2;10;1;G1;2;-8.35;-62.02;155.41;0.859
1;2;10;1;G1;3;-6.87;-60.15;158.31;0.762
1;2;10;1;G1;4;-5.97;-57;164.58;0.656
1;2;10;1;G1;5;-5.22;-53.79;169.63;0.609
1;2;10;1;G1;6;-3.95;-53.06;176.9;0.575
1;2;10;1;G1;7;-3.02;-51.51;182.3;0.552
1;2;10;1;G1;8;-1.89;-50.09;187.02;0.467
1;2;10;1;G1;9;0.01;-48.35;191.96;0.412
1;2;10;1;G1;10;1.91;-46.76;196.64;0.445
1;2;10;1;G1;11;2.44;-44.58;201.13;0.475
1;2;10;1;G1;12;5.9;-45.41;205.81;0.443
1;2;10;1;G1;13;6.73;-44.21;210.42;0.397
1;2;10;1;G1;14;8.08;-45.48;213.35;0.413
1;2;10;1;G1;15;8.65;-44.43;218.49;0.372
1;2;10;1;G1;16;12.08;-41.65;223.44;0.31
1;2;10;1;G1.4_1;1;-7.36;-56.73;166.02;0.177
1;2;10;1;G1.5_1;1;-6.73;-51.41;169.96;0.138
1;2;10;1;G1.5_1;2;-7.9;-50.01;171.38;0.143
1;2;10;1;1;0;-12.18;-59.21;153.34;1.492
1;2;10;1;1;1;-12.46;-59.59;152.96;1.491
1;2;10;1;1;2;-14.37;-58.05;153.4;1.164
1;2;10;1;1;3;-16.02;-58.72;154.84;1.099
1;2;10;1;1;4;-20.77;-56.65;157.62;1.077
1;2;10;1;1;5;-26.82;-56.42;160.74;1.429
1;2;10;1;1;6;-36.11;-54.46;165.67;1.431
1;2;10;1;1;7;-47.99;-54.82;169.31;0.866
1;2;10;1;1;8;-56.22;-51.37;173.39;0.674
1;2;10;1;1;9;-64.33;-50.24;175.68;0.619
1;2;10;1;1;10;-71.64;-44.73;173.19;0.586
1;2;10;1;1;11;-73.78;-41.53;167.89;0.575
1;2;10;1;1;12;-71.4;-38.9;163.23;0.544
1;2;10;1;1;13;-73.39;-35.95;157.71;0.543
1;2;10;1;1;14;-74.92;-29.7;152.82;0.547
1;2;10;1;1;15;-79.26;-27.27;149.61;0.506
1;2;10;1;1;16;-82.69;-23.43;146.94;0.496
1;2;10;1;1;17;-89.52;-19.73;143.94;0.516
1;2;10;1;1;18;-93.88;-15.83;143.13;0.56
1;2;10;1;1;19;-99.17;-14.8;140.12;0.477
1;2;10;1;1;20;-106.21;-10.63;138.52;0.423
1;2;10;1;1;21;-113.34;-8.71;136.61;0.482
1;2;10;1;1;22;-120.1;-6.54;134.67;0.445
1;2;10;1;1;23;-131.38;-0.77;130.84;0.417
1;2;10;1;1;24;-139.17;2.6;129.81;0.358
1;2;10;1;1;25;-147.95;6.51;126.85;0.344
1;2;10;1;1;26;-158.65;8.91;126.2;0.328
1;2;10;1;1;27;-166.49;8.89;125.93;0.303
1;2;10;1;1.5_1;1;-26.66;-57.09;162.81;0.168
1;2;10;1;1.6_1;1;-36.16;-52.58;169.91;0.191
1;2;10;1;1.7_1;1;-47.15;-55.27;174.08;0.396
1;2;10;1;1.7_1;2;-45.26;-54.88;174.05;0.229
1;2;10;1;1.7_1;3;-41.92;-55.91;174.6;0.188
1;2;10;1;1.8_1;1;-55.04;-51.27;176.47;0.32
1;2;10;1;1.8_1;2;-54.45;-51.1;179.93;0.221
1;2;10;1;1.9_1;1;-65.77;-49.45;178.29;0.35
1;2;11;0;0;0;-17.81;-66.21;148.63;1.775
1;2;11.a;0;0;0;-22.79;-65.18;150.24;2.408
1;2;11.a;1;0;0;-22.58;-68.39;149.1;1.461
1;2;11.a;1;1;0;-22.55;-68.54;149.83;1.64
1;2;11.a;1;1;1;-22.14;-69.02;149.85;1.499
1;2;11.a;1;1;2;-20.7;-70.47;151.01;1.139
1;2;11.a;1;1;3;-19.82;-71.74;154;1.008
1;2;11.a;1;1;4;-18.45;-73.56;159.12;0.996
1;2;11.a;1;1;5;-16.04;-77.54;166.04;0.936
1;2;11.a;1;1;6;-12.09;-81.93;169.85;0.896
1;2;11.a;1;1;7;-5.91;-88.67;177.23;0.834
1;2;11.a;1;1;8;0.77;-96.12;180.7;0.802
1;2;11.a;1;1;9;6.36;-103.51;184.63;0.718
1;2;11.a;1;1;10;14.24;-112.7;185.64;0.608
1;2;11.a;1;1;11;22.56;-120.07;188.83;0.626
1;2;11.a;1;1;12;30.96;-128.39;182.44;0.57
1;2;11.a;1;1;13;38.19;-132.14;180.72;0.541
1;2;11.a;1;1;14;41.28;-135.1;177.16;0.523
1;2;11.a;1;1;15;48.48;-138.03;176.37;0.463
1;2;11.a;1;1;16;52.5;-141.83;172.82;0.465
1;2;11.a;1;1;17;58.76;-144.6;174.14;0.356
1;2;11.a;1;1.3_1;1;-22.08;-71.31;155.94;0.23
1;2;11.a;1;1.4_1;1;-16.94;-76.46;158.11;0.385
1;2;11.a;1;1.4_1;2;-16.43;-83.19;159.87;0.306
1;2;11.a;1;1.4_1;3;-19.58;-86.18;162;0.274
1;2;11.a;1;1.4_1;4;-20.77;-88.56;164.33;0.244
1;2;11.a;1;1.4_1;5;-21.94;-91.96;168.24;0.204
1;2;11.a;1;1.4_1;6;-20.65;-94.93;171.37;0.211
1;2;11.a;1;1.4_1;7;-21.06;-95.12;166.03;0.139
1;2;11.a;1;1.5_1;1;-18.3;-77.55;167.21;0.456
1;2;11.a;1;1.5_1;2;-21.09;-76.41;171.45;0.39
1;2;11.a;1;1.5_1;3;-24.34;-74.57;173.92;0.368
1;2;11.a;1;1.5_1;4;-26.53;-73.61;176.64;0.391
1;2;11.a;1;1.5_1;5;-29.39;-71.91;178.33;0.394
1;2;11.a;1;1.5_1;6;-30.26;-70.83;184.11;0.366
1;2;11.a;1;1.5_1;7;-33.13;-68.17;186.95;0.365
1;2;11.a;1;1.5_1;8;-33.17;-66.83;191.12;0.329
1;2;11.a;1;1.5_1;9;-35.98;-65.93;192.41;0.217
1;2;11.a;1;1.6_1;1;-12.74;-86.47;170.46;0.307
1;2;11.a;1;1.7_1;1;-6.82;-87.63;180.67;0.367
1;2;11.a;1;1.7_1;2;-6.68;-86.61;182.98;0.266
1;2;11.a;1;1.7_1;3;-7.1;-84.13;187.03;0.213
1;2;11.a;1;1.7_1;4;-7.05;-82.53;188.18;0.195
1;2;11.a;1;1.8_1;1;-0.94;-100.34;182.52;0.417
1;2;11.a;1;1.8_1;2;-2.18;-101.75;186.03;0.367
1;2;11.a;1;1.8_1;3;-3.88;-102.44;189.22;0.355
1;2;11.a;1;1.8_1;4;-5.61;-102.11;192.53;0.292
1;2;11.a;1;1.8_1;5;-8;-100.73;195.22;0.321
1;2;11.a;1;1.9_1;1;5.69;-102.83;187.57;0.364
1;2;11.a;1;1.9_1;2;5.65;-101.16;190.96;0.326
1;2;11.a;1;1.9_1;3;4.79;-99.18;195.13;0.285
1;2;11.a;1;1.11_1;1;21.82;-121.27;187.51;0.275
1;2;11.a;1;1.13_1;1;37.54;-132.64;181.87;0.283
1;2;11.a;1;1.13_1;2;37.33;-131;181.25;0.222
1;2;11.a;1;1.13_1;3;34.62;-127.96;181.16;0.161
1;2;11.a;1;1.14_1;1;39.67;-134.26;176.73;0.117
1;2;11.a;1;1.15_1;1;46.51;-137.37;176.76;0.108

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
{
"simulation": {
"sdate": "2012-08-01 00:00:00",
"edate": "2012-08-04 23:00:00",
"latitude": 43.61,
"longitude": 3.87,
"elevation": 44.0,
"tzone": "Europe/Paris",
"output_index": "",
"unit_scene_length": "cm",
"hydraulic_structure": true,
"negligible_shoot_resistance": false,
"energy_budget": true
},
"planting": {
"spacing_between_rows": 3.6,
"spacing_on_row": 1,
"row_angle_with_south": 140.0
},
"phenology": {
"emdate": "2012-04-01 00:00:00",
"t_base": 10.0
},
"mtg_api": {
"collar_label": "inT",
"leaf_lbl_prefix": "L",
"stem_lbl_prefix": [
"in",
"Pet",
"cx"
]
},
"numerical_resolution": {
"max_iter": 100,
"psi_step": 1.0,
"psi_error_threshold": 0.05,
"t_step": 1.0,
"t_error_threshold": 0.02
},
"irradiance": {
"E_type": "Rg_Watt/m2",
"E_type2": "Eabs",
"opt_prop": {
"SW": {
"leaf": [
0.06,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
},
"LW": {
"leaf": [
0.04,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
}
},
"turtle_format": "soc",
"turtle_sectors": "46",
"icosphere_level": null
},
"energy": {
"solo": true,
"t_cloud": 2.0,
"t_sky": -20.0
},
"hydraulic": {
"psi_min": -3.0,
"Kx_dict": {
"a": 1.6,
"b": 2.0,
"min_kmax": 0.000111
},
"par_K_vul": {
"model": "misson",
"fifty_cent": -0.76,
"sig_slope": 1.0
}
},
"exchange": {
"rbt": 0.6667,
"Na_dict": {
"aN": -0.0008,
"bN": 3.3,
"aM": 6.471,
"bM": 56.635
},
"par_gs": {
"model": "misson",
"g0": 0.0,
"m0": 7.3,
"psi0": -0.65,
"D0": 1.0,
"n": 4.0
},
"par_photo": {
"alpha": 0.24,
"Kc25": 404.9,
"Ko25": 278.4,
"Tx25": 42.75,
"ds": 0.635,
"dHd": 200.0,
"RespT_Kc": {
"c": 38.05,
"deltaHa": 79.43
},
"RespT_Ko": {
"c": 20.30,
"deltaHa": 36.38
},
"RespT_Vcm": {
"c": 26.35,
"deltaHa": 65.33
},
"RespT_Jm": {
"c": 17.57,
"deltaHa": 43.54
},
"RespT_TPU": {
"c": 21.46,
"deltaHa": 53.1
},
"RespT_Rd": {
"c": 18.72,
"deltaHa": 46.39
},
"RespT_Tx": {
"c": 19.02,
"deltaHa": 37.83
}
},
"par_photo_N": {
"Vcm25_N": [
34.02,
-3.13
],
"Jm25_N": [
78.27,
-17.3
],
"Rd_N": [
0.42,
-0.01
],
"TPU25_N": [
6.24,
-1.92
]
}
},
"soil": {
"soil_class": "Sandy_Loam",
"soil_dimensions": {
"width": 3.6,
"length": 1.0,
"depth": 1.2
},
"rhyzo_coeff": 0.75
}
}

View file

@ -0,0 +1,7 @@
time;psi
2012-07-20;-0.30
2012-07-27;-0.12
2012-08-01;-0.19
2012-08-02;-0.50
2012-08-03;-0.81
2012-08-09;-0.19

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,43 @@
from pathlib import Path
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
if __name__ == '__main__':
path_project = Path(__file__).parent
# =============================================================================
# Construct the plant mock-up
# =============================================================================
g = architecture.vine_mtg(path_project / 'digit.input')
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_phyto_modular(g, v)
architecture.vine_petiole(g, v, pet_ins=90., pet_ins_cv=0.,
phyllo_angle=180.)
architecture.vine_leaf(g, v, leaf_inc=-45., leaf_inc_cv=100.,
lim_max=12.5, lim_min=5., order_lim_max=2.25,
max_order=55, rand_rot_angle=90.,
cordon_vector=None)
architecture.vine_mtg_properties(g, v)
architecture.vine_mtg_geometry(g, v)
architecture.vine_transform(g, v)
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(), view_result=True)
# =============================================================================
# Run HydroShoot
# =============================================================================
# =============================================================================
# Run HydroShoot
# =============================================================================
model.run(
g=g,
wd=path_project,
path_weather=path_project / 'meteo.input',
scene=scene)

View file

@ -0,0 +1,13 @@
date;psi_pd;psi_stem;psi_leaf;gs
2012-07-20 00:00;-0.35;-1.15;-1.42;48
2012-07-20 00:00;-0.24;-1.30;-1.51;22.4
2012-07-27 00:00;-0.13;-1.41;-1.54;25.6
2012-07-27 00:00;-0.12;-1.51;-1.51;39
2012-08-01 00:00;-0.20;-1.23;-1.42;90
2012-08-01 00:00;-0.21;-1.22;-1.51;97
2012-08-02 00:00;-0.49;-1.50;-1.52;40
2012-08-02 00:00;-0.50;-1.50;-1.54;28.4
2012-08-03 00:00;-0.81;-1.13;-1.27;7.3
2012-08-03 00:00;-0.81;-1.58;-1.34;4.4
2012-08-09 00:00;-0.19;-1.18;-1.69;37.5
2012-08-09 00:00;-0.19;-1.37

View file

@ -0,0 +1,139 @@
Plant;TRONC;ELMNT;SAR;RAM;RANG;Xabs;Yabs;Zabs;DIAM
1;base;0;0;0;0;0;0;8.24;5.027026504
1;0;1;1;0;0;-7.736183096;-2.98559946;12.5;1.858933322
1;0;1;1;1;0;-9.536183096;-1.32559946;14.18;1.831591759
1;0;1;1;1;1;-9.536183096;-1.32559946;14.18;1.6
1;0;1;1;p;0;-13.1061831;-7.45559946;17.36;0.209001612
1;0;1;1;F1;0;-16.4461831;-5.29559946;19.74;0
1;0;1;1;F2;0;-19.3861831;-4.69559946;15.13;0
1;0;1;1;F3;0;-17.9561831;-9.74559946;9.28;0
1;0;1;1;F4;0;-12.4661831;-9.52559946;9.65;0
1;0;1;1;F5;0;-9.036183096;-10.46559946;14.91;0
1;0;1;1;1;1;-8.866183096;-2.10559946;17.43;1.79548726
1;0;1;1;p;0;-0.036183096;-2.75559946;16.99;0.197620639
1;0;1;1;F1;0;3.793816904;-6.32559946;19.18;0
1;0;1;1;F2;0;8.063816904;-6.85559946;12.78;0
1;0;1;1;F3;0;4.783816904;-3.05559946;7.46;0
1;0;1;1;F4;0;1.803816904;2.51440054;11.08;0
1;0;1;1;F5;0;-2.006183096;2.10440054;14.61;0
1;0;1;1;1;2;-10.3961831;-0.70559946;20.72;1.73464309
1;0;1;1;p;0;-10.6261831;6.38440054;22.73;0.178493207
1;0;1;1;F1;0;-16.9961831;6.94440054;24.68;0
1;0;1;1;F2;0;-17.7261831;11.04440054;19.13;0
1;0;1;1;F3;0;-14.7761831;13.98440054;18.43;0
1;0;1;1;F4;0;-6.986183096;9.97440054;16.78;0
1;0;1;1;F5;0;-4.156183096;5.90440054;20.97;0
1;0;1;1;1;3;-9.446183096;-2.07559946;23.91;1.680008518
1;0;1;1;p;0;-2.686183096;-1.64559946;28.66;0.193514664
1;0;1;1;F1;0;-5.886183096;-4.99559946;30.93;0
1;0;1;1;F2;0;-1.026183096;-8.81559946;30.73;0
1;0;1;1;F3;0;6.063816904;-6.86559946;26.08;0
1;0;1;1;F4;0;4.593816904;-1.04559946;24.53;0
1;0;1;1;F5;0;-0.676183096;5.09440054;25.89;0
1;0;1;1;1;4;-11.3361831;-1.19559946;29.13;1.636977784
1;0;1;1;p;0;-16.3861831;-0.70559946;38.02;0.209833705
1;0;1;1;F1;0;-13.4261831;-6.98559946;38.56;0
1;0;1;1;F2;0;-23.5561831;-8.10559946;37.7;0
1;0;1;1;F3;0;-27.3361831;-2.37559946;37.73;0
1;0;1;1;F4;0;-23.2761831;5.89440054;34.16;0
1;0;1;1;F5;0;-15.0561831;5.99440054;34.59;0
1;0;1;1;1;5;-7.916183096;-3.73559946;35.55;1.635438112
1;0;1;1;p;0;3.163816904;-2.72559946;38.81;0.217461669
1;0;1;1;F1;0;3.123816904;-9.23559946;44.24;0
1;0;1;1;F2;0;12.7438169;-7.37559946;42.16;0
1;0;1;1;F3;0;14.1738169;-3.28559946;34.85;0
1;0;1;1;F4;0;7.273816904;2.76440054;30.31;0
1;0;1;1;F5;0;3.833816904;4.13440054;36.02;0
1;0;1;1;1;6;-9.486183096;-2.13559946;44.69;1.603907774
1;0;1;1;1;7;-6.776183096;-5.78559946;52.72;1.585608101
1;0;1;1;p;0;6.333816904;-7.78559946;57.67;0.208406918
1;0;1;1;F1;0;8.983816904;-13.56559946;65.52;0
1;0;1;1;F2;0;15.3838169;-16.52559946;59.77;0
1;0;1;1;F3;0;20.0638169;-7.36559946;51.54;0
1;0;1;1;F4;0;14.8738169;-1.28559946;51.2;0
1;0;1;1;F5;0;7.583816904;1.57440054;56.1;0
1;0;1;1;1;8;-8.446183096;-1.79559946;59.15;1.568905803
1;0;1;1;p;0;1.653816904;6.97440054;61.07;0.240708417
1;0;1;1;F1;0;8.723816904;10.42440054;63.25;0
1;0;1;1;F2;0;7.643816904;17.60440054;59.83;0
1;0;1;1;F3;0;5.523816904;10.54440054;51.37;0
1;0;1;1;F4;0;8.113816904;8.08440054;51.26;0
1;0;1;1;F5;0;4.703816904;0.68440054;54.78;0
1;0;1;1;1;9;-7.496183096;-4.89559946;69.46;1.520511743
1;0;1;1;p;0;4.013816904;-9.02559946;75.41;0.173493123
1;0;1;1;F1;0;6.433816904;-15.15559946;79.58;0
1;0;1;1;F2;0;8.003816904;-19.92559946;70.73;0
1;0;1;1;F3;0;16.1238169;-13.48559946;71.47;0
1;0;1;1;F4;0;14.4738169;-8.72559946;71;0
1;0;1;1;F5;0;9.493816904;-3.12559946;71.55;0
1;0;1;1;1;10;-8.406183096;-0.08559946;77.81;1.468780376
1;0;1;1;p;0;-13.0761831;6.99440054;85.82;0.215624823
1;0;1;1;F1;0;-12.6661831;15.68440054;84.8;0
1;0;1;1;F2;0;-19.9361831;15.05440054;81.16;0
1;0;1;1;F3;0;-25.0261831;11.33440054;81.27;0
1;0;1;1;F4;0;-24.1461831;4.57440054;82.67;0
1;0;1;1;F5;0;-17.0261831;-0.42559946;85.92;0
1;0;1;1;1;11;-3.836183096;-3.62559946;83.53;1.425168568
1;0;1;1;p;0;4.453816904;-5.87559946;92.09;0.180726096
1;0;1;1;F1;0;9.723816904;-13.03559946;94.63;0
1;0;1;1;F2;0;16.0738169;-11.65559946;91.1;0
1;0;1;1;F3;0;15.4138169;-10.04559946;84.01;0
1;0;1;1;F4;0;11.6438169;0.30440054;86.02;0
1;0;1;1;F5;0;9.413816904;1.31440054;90.4;0
1;0;1;1;1;12;-5.726183096;-3.78559946;94.95;1.420065465
1;0;1;1;p;0;2.233816904;1.11440054;97.72;0.219485204
1;0;1;1;F1;0;3.423816904;8.58440054;97.66;0
1;0;1;1;F2;0;8.803816904;10.84440054;94.88;0
1;0;1;1;F3;0;8.853816904;3.87440054;89.84;0
1;0;1;1;F4;0;8.903816904;0.69440054;89.83;0
1;0;1;1;F5;0;6.893816904;-3.22559946;93.18;0
1;0;1;1;1;13;-2.556183096;-6.59559946;101.91;1.403556316
1;0;1;1;p;0;6.643816904;-8.72559946;106.64;0.194865889
1;0;1;1;F1;0;8.303816904;-15.23559946;108.93;0
1;0;1;1;F2;0;14.3238169;-15.89559946;104.57;0
1;0;1;1;F3;0;14.6238169;-13.84559946;99;0
1;0;1;1;F4;0;11.8138169;-2.68559946;102.94;0
1;0;1;1;F5;0;5.943816904;-3.03559946;108.99;0
1;0;1;1;1;14;-6.536183096;-3.71559946;111.18;1.393791926
1;0;1;1;p;0;2.093816904;-0.03559946;115.55;0.16605945
1;0;1;1;F1;0;4.073816904;7.64440054;120.68;0
1;0;1;1;F2;0;6.563816904;10.38440054;114.31;0
1;0;1;1;F3;0;11.0738169;3.91440054;115.31;0
1;0;1;1;F4;0;11.1438169;1.01440054;117.25;0
1;0;1;1;F5;0;7.933816904;-3.48559946;114.37;0
1;0;1;1;1;15;-5.756183096;-8.10559946;117.95;1.352865756
1;0;1;1;p;0;5.493816904;-11.98559946;121.07;0.179512051
1;0;1;1;F1;0;8.183816904;-19.17559946;123.43;0
1;0;1;1;F2;0;13.0038169;-21.00559946;115.98;0
1;0;1;1;F3;0;9.903816904;-14.77559946;109.93;0
1;0;1;1;F4;0;10.6138169;-6.23559946;114.05;0
1;0;1;1;F5;0;9.213816904;-5.58559946;120.34;0
1;0;1;1;1;16;-7.496183096;-5.32559946;127.67;1.336730249
1;0;1;1;p;0;-7.876183096;3.66440054;134.62;0.203908026
1;0;1;1;F1;0;-17.6761831;5.08440054;138.38;0
1;0;1;1;F2;0;-20.7961831;10.24440054;133.69;0
1;0;1;1;F3;0;-14.2161831;9.37440054;125.67;0
1;0;1;1;F4;0;-5.896183096;11.52440054;127.29;0
1;0;1;1;F5;0;-3.666183096;9.38440054;131.94;0
1;0;1;1;1;17;-1.826183096;-8.91559946;133.71;1.29017495
1;0;1;1;p;0;10.1438169;-8.14559946;139.21;0.232624324
1;0;1;1;F1;0;15.6738169;-1.66559946;140.88;0
1;0;1;1;F2;0;14.3538169;0.64440054;135.26;0
1;0;1;1;F3;0;17.2638169;-6.77559946;129.57;0
1;0;1;1;F4;0;18.1538169;-17.37559946;135.21;0
1;0;1;1;F5;0;14.7238169;-16.84559946;141.41;0
1;0;1;1;1;18;-5.016183096;-9.58559946;147.46;1.248837876
1;0;1;1;p;0;-5.576183096;-13.45559946;156.62;0.225569276
1;0;1;1;F1;0;-4.526183096;-7.89559946;156.91;0
1;0;1;1;F2;0;-10.2061831;-9.98559946;155.64;0
1;0;1;1;F3;0;-13.2961831;-14.78559946;158.05;0
1;0;1;1;F4;0;-14.2661831;-22.00559946;159.13;0
1;0;1;1;F5;0;-6.496183096;-23.48559946;159.53;0
1;0;1;1;1;19;-0.886183096;-11.70559946;155.26;1.211473224
1;0;1;1;1;20;-5.946183096;-15.56559946;162.31;1.174686103
1;0;1;1;p;0;-13.3061831;-15.57559946;170.12;0.216812196
1;0;1;1;F1;0;-19.0361831;-12.42559946;175.07;0
1;0;1;1;F2;0;-21.7761831;-9.19559946;170.17;0
1;0;1;1;F3;0;-24.0361831;-17.55559946;162.34;0
1;0;1;1;F4;0;-18.3761831;-26.65559946;163.93;0
1;0;1;1;F5;0;-15.6561831;-28.05559946;168.37;0
1 Plant TRONC ELMNT SAR RAM RANG Xabs Yabs Zabs DIAM
2 1 base 0 0 0 0 0 0 8.24 5.027026504
3 1 0 1 1 0 0 -7.736183096 -2.98559946 12.5 1.858933322
4 1 0 1 1 1 0 -9.536183096 -1.32559946 14.18 1.831591759
5 1 0 1 1 1 1 -9.536183096 -1.32559946 14.18 1.6
6 1 0 1 1 p 0 -13.1061831 -7.45559946 17.36 0.209001612
7 1 0 1 1 F1 0 -16.4461831 -5.29559946 19.74 0
8 1 0 1 1 F2 0 -19.3861831 -4.69559946 15.13 0
9 1 0 1 1 F3 0 -17.9561831 -9.74559946 9.28 0
10 1 0 1 1 F4 0 -12.4661831 -9.52559946 9.65 0
11 1 0 1 1 F5 0 -9.036183096 -10.46559946 14.91 0
12 1 0 1 1 1 1 -8.866183096 -2.10559946 17.43 1.79548726
13 1 0 1 1 p 0 -0.036183096 -2.75559946 16.99 0.197620639
14 1 0 1 1 F1 0 3.793816904 -6.32559946 19.18 0
15 1 0 1 1 F2 0 8.063816904 -6.85559946 12.78 0
16 1 0 1 1 F3 0 4.783816904 -3.05559946 7.46 0
17 1 0 1 1 F4 0 1.803816904 2.51440054 11.08 0
18 1 0 1 1 F5 0 -2.006183096 2.10440054 14.61 0
19 1 0 1 1 1 2 -10.3961831 -0.70559946 20.72 1.73464309
20 1 0 1 1 p 0 -10.6261831 6.38440054 22.73 0.178493207
21 1 0 1 1 F1 0 -16.9961831 6.94440054 24.68 0
22 1 0 1 1 F2 0 -17.7261831 11.04440054 19.13 0
23 1 0 1 1 F3 0 -14.7761831 13.98440054 18.43 0
24 1 0 1 1 F4 0 -6.986183096 9.97440054 16.78 0
25 1 0 1 1 F5 0 -4.156183096 5.90440054 20.97 0
26 1 0 1 1 1 3 -9.446183096 -2.07559946 23.91 1.680008518
27 1 0 1 1 p 0 -2.686183096 -1.64559946 28.66 0.193514664
28 1 0 1 1 F1 0 -5.886183096 -4.99559946 30.93 0
29 1 0 1 1 F2 0 -1.026183096 -8.81559946 30.73 0
30 1 0 1 1 F3 0 6.063816904 -6.86559946 26.08 0
31 1 0 1 1 F4 0 4.593816904 -1.04559946 24.53 0
32 1 0 1 1 F5 0 -0.676183096 5.09440054 25.89 0
33 1 0 1 1 1 4 -11.3361831 -1.19559946 29.13 1.636977784
34 1 0 1 1 p 0 -16.3861831 -0.70559946 38.02 0.209833705
35 1 0 1 1 F1 0 -13.4261831 -6.98559946 38.56 0
36 1 0 1 1 F2 0 -23.5561831 -8.10559946 37.7 0
37 1 0 1 1 F3 0 -27.3361831 -2.37559946 37.73 0
38 1 0 1 1 F4 0 -23.2761831 5.89440054 34.16 0
39 1 0 1 1 F5 0 -15.0561831 5.99440054 34.59 0
40 1 0 1 1 1 5 -7.916183096 -3.73559946 35.55 1.635438112
41 1 0 1 1 p 0 3.163816904 -2.72559946 38.81 0.217461669
42 1 0 1 1 F1 0 3.123816904 -9.23559946 44.24 0
43 1 0 1 1 F2 0 12.7438169 -7.37559946 42.16 0
44 1 0 1 1 F3 0 14.1738169 -3.28559946 34.85 0
45 1 0 1 1 F4 0 7.273816904 2.76440054 30.31 0
46 1 0 1 1 F5 0 3.833816904 4.13440054 36.02 0
47 1 0 1 1 1 6 -9.486183096 -2.13559946 44.69 1.603907774
48 1 0 1 1 1 7 -6.776183096 -5.78559946 52.72 1.585608101
49 1 0 1 1 p 0 6.333816904 -7.78559946 57.67 0.208406918
50 1 0 1 1 F1 0 8.983816904 -13.56559946 65.52 0
51 1 0 1 1 F2 0 15.3838169 -16.52559946 59.77 0
52 1 0 1 1 F3 0 20.0638169 -7.36559946 51.54 0
53 1 0 1 1 F4 0 14.8738169 -1.28559946 51.2 0
54 1 0 1 1 F5 0 7.583816904 1.57440054 56.1 0
55 1 0 1 1 1 8 -8.446183096 -1.79559946 59.15 1.568905803
56 1 0 1 1 p 0 1.653816904 6.97440054 61.07 0.240708417
57 1 0 1 1 F1 0 8.723816904 10.42440054 63.25 0
58 1 0 1 1 F2 0 7.643816904 17.60440054 59.83 0
59 1 0 1 1 F3 0 5.523816904 10.54440054 51.37 0
60 1 0 1 1 F4 0 8.113816904 8.08440054 51.26 0
61 1 0 1 1 F5 0 4.703816904 0.68440054 54.78 0
62 1 0 1 1 1 9 -7.496183096 -4.89559946 69.46 1.520511743
63 1 0 1 1 p 0 4.013816904 -9.02559946 75.41 0.173493123
64 1 0 1 1 F1 0 6.433816904 -15.15559946 79.58 0
65 1 0 1 1 F2 0 8.003816904 -19.92559946 70.73 0
66 1 0 1 1 F3 0 16.1238169 -13.48559946 71.47 0
67 1 0 1 1 F4 0 14.4738169 -8.72559946 71 0
68 1 0 1 1 F5 0 9.493816904 -3.12559946 71.55 0
69 1 0 1 1 1 10 -8.406183096 -0.08559946 77.81 1.468780376
70 1 0 1 1 p 0 -13.0761831 6.99440054 85.82 0.215624823
71 1 0 1 1 F1 0 -12.6661831 15.68440054 84.8 0
72 1 0 1 1 F2 0 -19.9361831 15.05440054 81.16 0
73 1 0 1 1 F3 0 -25.0261831 11.33440054 81.27 0
74 1 0 1 1 F4 0 -24.1461831 4.57440054 82.67 0
75 1 0 1 1 F5 0 -17.0261831 -0.42559946 85.92 0
76 1 0 1 1 1 11 -3.836183096 -3.62559946 83.53 1.425168568
77 1 0 1 1 p 0 4.453816904 -5.87559946 92.09 0.180726096
78 1 0 1 1 F1 0 9.723816904 -13.03559946 94.63 0
79 1 0 1 1 F2 0 16.0738169 -11.65559946 91.1 0
80 1 0 1 1 F3 0 15.4138169 -10.04559946 84.01 0
81 1 0 1 1 F4 0 11.6438169 0.30440054 86.02 0
82 1 0 1 1 F5 0 9.413816904 1.31440054 90.4 0
83 1 0 1 1 1 12 -5.726183096 -3.78559946 94.95 1.420065465
84 1 0 1 1 p 0 2.233816904 1.11440054 97.72 0.219485204
85 1 0 1 1 F1 0 3.423816904 8.58440054 97.66 0
86 1 0 1 1 F2 0 8.803816904 10.84440054 94.88 0
87 1 0 1 1 F3 0 8.853816904 3.87440054 89.84 0
88 1 0 1 1 F4 0 8.903816904 0.69440054 89.83 0
89 1 0 1 1 F5 0 6.893816904 -3.22559946 93.18 0
90 1 0 1 1 1 13 -2.556183096 -6.59559946 101.91 1.403556316
91 1 0 1 1 p 0 6.643816904 -8.72559946 106.64 0.194865889
92 1 0 1 1 F1 0 8.303816904 -15.23559946 108.93 0
93 1 0 1 1 F2 0 14.3238169 -15.89559946 104.57 0
94 1 0 1 1 F3 0 14.6238169 -13.84559946 99 0
95 1 0 1 1 F4 0 11.8138169 -2.68559946 102.94 0
96 1 0 1 1 F5 0 5.943816904 -3.03559946 108.99 0
97 1 0 1 1 1 14 -6.536183096 -3.71559946 111.18 1.393791926
98 1 0 1 1 p 0 2.093816904 -0.03559946 115.55 0.16605945
99 1 0 1 1 F1 0 4.073816904 7.64440054 120.68 0
100 1 0 1 1 F2 0 6.563816904 10.38440054 114.31 0
101 1 0 1 1 F3 0 11.0738169 3.91440054 115.31 0
102 1 0 1 1 F4 0 11.1438169 1.01440054 117.25 0
103 1 0 1 1 F5 0 7.933816904 -3.48559946 114.37 0
104 1 0 1 1 1 15 -5.756183096 -8.10559946 117.95 1.352865756
105 1 0 1 1 p 0 5.493816904 -11.98559946 121.07 0.179512051
106 1 0 1 1 F1 0 8.183816904 -19.17559946 123.43 0
107 1 0 1 1 F2 0 13.0038169 -21.00559946 115.98 0
108 1 0 1 1 F3 0 9.903816904 -14.77559946 109.93 0
109 1 0 1 1 F4 0 10.6138169 -6.23559946 114.05 0
110 1 0 1 1 F5 0 9.213816904 -5.58559946 120.34 0
111 1 0 1 1 1 16 -7.496183096 -5.32559946 127.67 1.336730249
112 1 0 1 1 p 0 -7.876183096 3.66440054 134.62 0.203908026
113 1 0 1 1 F1 0 -17.6761831 5.08440054 138.38 0
114 1 0 1 1 F2 0 -20.7961831 10.24440054 133.69 0
115 1 0 1 1 F3 0 -14.2161831 9.37440054 125.67 0
116 1 0 1 1 F4 0 -5.896183096 11.52440054 127.29 0
117 1 0 1 1 F5 0 -3.666183096 9.38440054 131.94 0
118 1 0 1 1 1 17 -1.826183096 -8.91559946 133.71 1.29017495
119 1 0 1 1 p 0 10.1438169 -8.14559946 139.21 0.232624324
120 1 0 1 1 F1 0 15.6738169 -1.66559946 140.88 0
121 1 0 1 1 F2 0 14.3538169 0.64440054 135.26 0
122 1 0 1 1 F3 0 17.2638169 -6.77559946 129.57 0
123 1 0 1 1 F4 0 18.1538169 -17.37559946 135.21 0
124 1 0 1 1 F5 0 14.7238169 -16.84559946 141.41 0
125 1 0 1 1 1 18 -5.016183096 -9.58559946 147.46 1.248837876
126 1 0 1 1 p 0 -5.576183096 -13.45559946 156.62 0.225569276
127 1 0 1 1 F1 0 -4.526183096 -7.89559946 156.91 0
128 1 0 1 1 F2 0 -10.2061831 -9.98559946 155.64 0
129 1 0 1 1 F3 0 -13.2961831 -14.78559946 158.05 0
130 1 0 1 1 F4 0 -14.2661831 -22.00559946 159.13 0
131 1 0 1 1 F5 0 -6.496183096 -23.48559946 159.53 0
132 1 0 1 1 1 19 -0.886183096 -11.70559946 155.26 1.211473224
133 1 0 1 1 1 20 -5.946183096 -15.56559946 162.31 1.174686103
134 1 0 1 1 p 0 -13.3061831 -15.57559946 170.12 0.216812196
135 1 0 1 1 F1 0 -19.0361831 -12.42559946 175.07 0
136 1 0 1 1 F2 0 -21.7761831 -9.19559946 170.17 0
137 1 0 1 1 F3 0 -24.0361831 -17.55559946 162.34 0
138 1 0 1 1 F4 0 -18.3761831 -26.65559946 163.93 0
139 1 0 1 1 F5 0 -15.6561831 -28.05559946 168.37 0

View file

@ -0,0 +1,47 @@
from pathlib import Path
from os import getcwd
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
# =============================================================================
# Construct the plant mock-up
# =============================================================================
if __name__ == '__main__':
g = architecture.vine_mtg(Path(__file__).parent / 'HSdanugue$5132.csv')
# Local Coordinates Correction
for v in traversal.iter_mtg2(g, g.root):
n = g.node(g.Trunk(v, Scale=1)[0])
theta = 180 if int(n.index()) < 200 else -90 if int(n.index()) < 300 else 0
architecture.vine_orientation(g, v, theta, local_rotation=True)
# Scene rotation
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_orientation(g, v, 90., local_rotation=False)
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_phyto_modular(g, v)
architecture.vine_mtg_properties(g, v)
architecture.vine_mtg_geometry(g, v)
architecture.vine_transform(g, v)
# Display of the plant mock-up (result in 'fig_01_plant_mock_up.png')
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(), view_result=True)
# =============================================================================
# Run HydroShoot
# =============================================================================
model.run(g, str(getcwd()) + '/', scene, psi_soil=-0.5, gdd_since_budbreak=1000.)
from pandas import read_csv
df = read_csv(r'C:\Users\albashar\Documents\dvp\grapesoil\grape_soil\example\data\benoit\data_meteo_with_low_WS.csv',
sep=';', decimal='.')

View file

@ -0,0 +1,123 @@
Plant_Nb;Tronc;Elmnt;Sar;Rameau;Row;X;Y;Z
8;BASE;0;0;0;0;0;0;0
8;0;1;0;0;0;0;0;5
8;0;2;0;0;0;0;0;10
8;0;3;0;0;0;0;0;15
8;0;4;0;0;0;0;0;20
8;0;5;0;0;0;0;0;25
8;0;6;0;0;0;0;0;30
8;0;7;0;0;0;0;0;35
8;0;8;0;0;0;0;0;40
8;0;9;0;0;0;0;0;45
8;1;1;0;0;0;4;2;49
8;1;1.a;0;0;0;6;5;50
8;1;1.a;1;0;0;8;6;52
8;1;1.a;1;1;0;8.41;6.2;53.19
8;1;1.a;1;1;1;7.42;7.6;55.05
8;1;1.a;1;1;2;4.81;8.73;61.1
8;1;1.a;1;1;3;1.11;8.87;70.62
8;1;1.a;1;1;4;-3.4;9.31;82.33
8;1;1.a;1;1;5;-9.59;5.34;94.08
8;1;1.a;1;1;6;-19.56;7.1;107.54
8;1;1.a;1;1;7;-31.79;7.71;120.16
8;1;1.a;1;1;8;-41.64;9.88;130.68
8;1;1.a;1;2;0;10.07;7.2;53.27
8;1;1.a;1;2;1;10.72;8.11;54.82
8;1;1.a;1;2;2;12.45;10.24;58.19
8;1;1.a;1;2;3;14.67;9.83;63.16
8;1;1.a;1;2;4;18.68;10.23;71.06
8;1;1.a;1;2;5;20.41;7.6;81.12
8;1;1.a;1;2;6;24.62;6.08;89.86
8;1;1.a;1;2;7;26.36;6.67;99.55
8;1;1.a;1;2;8;27.95;12.68;111.04
8;1;1.a;1;2;9;26.26;18.97;117.65
8;1;1.a;1;2;10;25.95;26.82;122.83
8;1;1.a;2;0;0;10;4;54
8;1;1.a;2;1;0;10.64;4.32;54.52
8;1;1.a;2;1;1;11.56;1.67;56.73
8;1;1.a;2;1;2;11.22;-2.05;62.4
8;1;1.a;2;1;3;11.61;-3.84;71.11
8;1;1.a;2;1;4;11.71;-1.8;83.07
8;1;1.a;2;1;5;14.28;4.49;96.38
8;1;1.a;2;1;6;13.57;4.88;108.18
8;1;1.a;2;1;7;15.55;0.48;123.92
8;2;1;0;0;0;1;2;49
8;2;1.a;0;0;0;1.1;3;50
8;2;1.a;1;0;0;1.2;3.8;50.5
8;2;1.a;1;1;0;1.29;3.9;50.86
8;2;1.a;1;1;1;1.64;5.19;51.5
8;2;1.a;1;1;2;2.4;8.52;55.62
8;2;1.a;1;1;3;5.57;11.78;62.85
8;2;1.a;1;1;4;12.32;13.92;73.82
8;2;1.a;1;1;5;18.46;12.2;82.8
8;2;1.a;1;1;6;22.11;10.6;89.62
8;2;1.a;1;1;7;26.93;3.4;95.42
8;2;1.a;1;1;8;31.28;-2.13;99.8
8;2;1.a;1;1;9;35.61;-8.04;102.67
8;2;1.a;1;1;10;40.84;-15.38;106.71
8;2;1.a;1;2;0;1.42;1.92;52.03
8;2;1.a;1;2;1;0.93;0.86;53.42
8;2;1.a;1;2;2;1.14;-0.09;58.02
8;2;1.a;1;2;3;2.4;-1.23;64.43
8;2;1.a;1;2;4;4.91;-0.77;72.53
8;2;1.a;1;2;5;10.36;0.85;82.74
8;2;1.a;1;2;6;13.55;2.52;91.17
8;2;1.a;1;2;7;18.58;2.97;100.06
8;2;1.a;1;2;8;23.01;2.3;112.8
8;2;1.a;1;2;9;26.89;1.14;120.6
8;2;1.b;0;0;0;1.43;0;51
8;2;1.b;1;0;0;1.44;0.05;51.1
8;2;1.b;1;1;0;1.45;0.09;51.12
8;2;1.b;1;1;1;1.2;-0.05;51.71
8;2;1.b;1;1;2;-0.96;-1.12;56.13
8;2;1.b;1;1;3;-4.99;-4.12;65.35
8;2;1.b;1;1;4;-7.27;-3.64;79.68
8;2;1.b;1;1;5;-6.02;0.34;90.43
8;2;1.b;1;1;6;1.81;4.48;97.34
8;2;1.b;1;1;7;12.38;3.8;103.99
8;2;1.b;1;1;8;20.76;0.75;107.55
8;2;1.b;1;1;9;25.75;-4.11;110.52
8;2;2;0;0;0;-10;3.5;55
8;2;2.a;0;0;0;-11;3.8;55
8;2;2.a;1;0;0;-12;4;56
8;2;2.a;1;1;0;-12.71;4.01;56.81
8;2;2.a;1;2;0;-12.72;6.24;55.56
8;2;2.a;1;2;1;-12.47;6.84;55.83
8;2;2.a;1;2;2;-11.67;9.06;57.38
8;2;2.a;1;2;3;-11.02;11.72;61.48
8;2;2.a;1;2;4;-9.75;12.17;67.31
8;2;2.a;1;2;5;-9.43;10.83;75.81
8;2;2.a;1;2;6;-6.44;6.43;87.13
8;2;2.a;1;2;7;-6.27;6.43;87.24
8;2;2.a;1;2;8;-0.52;5.56;95.39
8;2;2.a;1;2;9;5.08;5.72;103.16
8;2;2.a;1;2;10;14.45;10.9;109.95
8;2;2.a;1;2;11;20.55;14.27;115.06
8;2;2.a;1;2;12;27.62;19.03;119.15
8;2;2.a;1;2;13;33.66;20.31;128.17
8;2;2.b;0;0;0;-11;4.2;53
8;2;2.b;1;0;0;-12;4.3;54
8;2;3;0;0;0;-13;1;52
8;2;3.a;0;0;0;-14;1.4;53
8;2;3.a;1;0;0;-14.2;1.42;53.01
8;2;3.a;1;1M;0;-14.5;1.46;53.06
8;2;3.a;1;1M;1;-15.06;1.67;52.89
8;2;3.a;1;1M;2;-17.62;2.85;54.07
8;2;3.a;1;1M;3;-21.45;4.78;61.73
8;2;3.a;1;1M;4;-23.42;5.37;72.15
8;2;3.a;1;1M;5;-24.31;3.66;88.31
8;2;3.a;1;1M;6;-26.05;4.82;106.56
8;2;3.a;1;1M;7;-32.94;5.75;118.25
8;2;3.a;1;1M;8;-39.95;8.39;126.33
8;2;3.a;1;3;0;-12.69;-1.02;52.08
8;2;3.a;1;3;1;-14.2;-0.78;52.25
8;2;3.a;1;3;2;-20.72;-2.23;53.55
8;2;3.a;1;3;3;-27.49;-2.94;56.65
8;2;3.a;1;3;4;-36.07;-4.89;61.05
8;2;3.a;1;3;5;-41.12;-5.23;69.88
8;2;3.a;1;3;6;-42.22;-8.11;82.63
8;2;3.a;1;3;7;-37.93;-7.57;96.29
8;2;3.a;1;3;8;-33;-7.67;108.67
8;2;3.a;1;3;9;-24.07;-4.13;119.04
8;2;3.a;1;3;10;-20.9;-2.33;128.29
8;2;3.a;1;3;11;-18.5;0.01;136.76

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
{
"simulation": {
"sdate": "2009-07-29 00:00:00",
"edate": "2009-08-01 23:00:00",
"latitude": 43.61,
"longitude": 3.87,
"elevation": 44.0,
"tzone": "Europe/Paris",
"output_index": "",
"unit_scene_length": "cm",
"hydraulic_structure": false,
"negligible_shoot_resistance": true,
"energy_budget": true
},
"planting": {
"spacing_between_rows": 3.6,
"spacing_on_row": 1,
"row_angle_with_south": 140.0
},
"phenology": {
"emdate": "2009-04-01 00:00:00",
"t_base": 10.0
},
"mtg_api": {
"collar_label": "inT",
"leaf_lbl_prefix": "L",
"stem_lbl_prefix": [
"in",
"Pet",
"cx"
]
},
"numerical_resolution": {
"max_iter": 100,
"psi_step": 1.0,
"psi_error_threshold": 0.05,
"t_step": 1.0,
"t_error_threshold": 0.02
},
"irradiance": {
"E_type": "Rg_Watt/m2",
"E_type2": "Eabs",
"opt_prop": {
"SW": {
"leaf": [
0.06,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
},
"LW": {
"leaf": [
0.04,
0.07
],
"stem": [
0.13
],
"other": [
0.06,
0.07
]
}
},
"turtle_format": "soc",
"turtle_sectors": "46",
"icosphere_level": null
},
"energy": {
"solo": true,
"t_cloud": 2.0,
"t_sky": -20.0
},
"hydraulic": {
"psi_min": -3.0,
"Kx_dict": {
"a": 1.6,
"b": 2.0,
"min_kmax": 0.000111
},
"par_K_vul": {
"model": "misson",
"fifty_cent": -0.76,
"sig_slope": 1.0
}
},
"exchange": {
"rbt": 0.6667,
"Na_dict": {
"aN": -0.0008,
"bN": 3.3,
"aM": 6.471,
"bM": 56.635
},
"par_gs": {
"model": "misson",
"g0": 0.02,
"m0": 7.3,
"psi0": -0.65,
"D0": 5.0,
"n": 4.0
},
"par_photo": {
"alpha": 0.24,
"Kc25": 404.9,
"Ko25": 278.4,
"Tx25": 42.75,
"ds": 0.635,
"dHd": 200.0,
"RespT_Kc": {
"c": 38.05,
"deltaHa": 79.43
},
"RespT_Ko": {
"c": 20.30,
"deltaHa": 36.38
},
"RespT_Vcm": {
"c": 26.35,
"deltaHa": 65.33
},
"RespT_Jm": {
"c": 17.57,
"deltaHa": 43.54
},
"RespT_TPU": {
"c": 21.46,
"deltaHa": 53.1
},
"RespT_Rd": {
"c": 18.72,
"deltaHa": 46.39
},
"RespT_Tx": {
"c": 19.02,
"deltaHa": 37.83
}
},
"par_photo_N": {
"Vcm25_N": [
34.02,
-3.13
],
"Jm25_N": [
78.27,
-17.3
],
"Rd_N": [
0.42,
-0.01
],
"TPU25_N": [
6.24,
-1.92
]
}
},
"soil": {
"soil_class": "Sandy_Loam",
"soil_dimensions": {
"width": 3.6,
"length": 1.0,
"depth": 1.2
},
"rhyzo_coeff": 0.25
}
}

View file

@ -0,0 +1,14 @@
time;psi
2009-07-27;-0.09
2009-07-28;-0.38
2009-07-29;-0.19
2009-07-30;-0.30
2009-07-31;-0.37
2009-08-01;-0.50
2009-08-03;-0.32
2009-08-05;-0.39
2009-08-06;-0.47
2009-08-07;-0.40
2009-08-09;-0.55
2009-08-10;-0.34
2009-08-14;-0.83

View file

@ -0,0 +1,41 @@
from pathlib import Path
from openalea.mtg import traversal
from openalea.plantgl.all import Scene
from hydroshoot import architecture, display, model
if __name__ == '__main__':
path_project = Path(__file__).parent
# =============================================================================
# Construct the plant mock-up
# =============================================================================
g = architecture.vine_mtg(path_project / 'digit.input')
for v in traversal.iter_mtg2(g, g.root):
architecture.vine_phyto_modular(g, v)
architecture.vine_axeII(g, v, pruning_type='avg_field_model', N_max=6,
insert_angle=90, N_max_order=6)
architecture.vine_petiole(g, v, pet_ins=90., pet_ins_cv=0.,
phyllo_angle=180.)
architecture.vine_leaf(g, v, leaf_inc=-45., leaf_inc_cv=100.,
lim_max=12.5, lim_min=5., order_lim_max=6,
max_order=55, rand_rot_angle=90.,
cordon_vector=None)
architecture.vine_mtg_properties(g, v)
architecture.vine_mtg_geometry(g, v)
architecture.vine_transform(g, v)
scene = display.visu(g, def_elmnt_color_dict=True, scene=Scene(), view_result=True)
# =============================================================================
# Run HydroShoot
# =============================================================================
model.run(
g=g,
wd=path_project,
path_weather=path_project / 'meteo.input',
scene=scene)

View file

@ -0,0 +1,123 @@
Plant_Nb;Tronc;Elmnt;Sar;Rameau;Row;X;Y;Z
8;BASE;0;0;0;0;0;0;0
8;0;1;0;0;0;0;0;5
8;0;2;0;0;0;0;0;10
8;0;3;0;0;0;0;0;15
8;0;4;0;0;0;0;0;20
8;0;5;0;0;0;0;0;25
8;0;6;0;0;0;0;0;30
8;0;7;0;0;0;0;0;35
8;0;8;0;0;0;0;0;40
8;0;9;0;0;0;0;0;45
8;1;1;0;0;0;4;2;49
8;1;1.a;0;0;0;6;5;50
8;1;1.a;1;0;0;8;6;52
8;1;1.a;1;1;0;8.41;6.2;53.19
8;1;1.a;1;1;1;7.42;7.6;55.05
8;1;1.a;1;1;2;4.81;8.73;61.1
8;1;1.a;1;1;3;1.11;8.87;70.62
8;1;1.a;1;1;4;-3.4;9.31;82.33
8;1;1.a;1;1;5;-9.59;5.34;94.08
8;1;1.a;1;1;6;-19.56;7.1;107.54
8;1;1.a;1;1;7;-31.79;7.71;120.16
8;1;1.a;1;1;8;-41.64;9.88;130.68
8;1;1.a;1;2;0;10.07;7.2;53.27
8;1;1.a;1;2;1;10.72;8.11;54.82
8;1;1.a;1;2;2;12.45;10.24;58.19
8;1;1.a;1;2;3;14.67;9.83;63.16
8;1;1.a;1;2;4;18.68;10.23;71.06
8;1;1.a;1;2;5;20.41;7.6;81.12
8;1;1.a;1;2;6;24.62;6.08;89.86
8;1;1.a;1;2;7;26.36;6.67;99.55
8;1;1.a;1;2;8;27.95;12.68;111.04
8;1;1.a;1;2;9;26.26;18.97;117.65
8;1;1.a;1;2;10;25.95;26.82;122.83
8;1;1.a;2;0;0;10;4;54
8;1;1.a;2;1;0;10.64;4.32;54.52
8;1;1.a;2;1;1;11.56;1.67;56.73
8;1;1.a;2;1;2;11.22;-2.05;62.4
8;1;1.a;2;1;3;11.61;-3.84;71.11
8;1;1.a;2;1;4;11.71;-1.8;83.07
8;1;1.a;2;1;5;14.28;4.49;96.38
8;1;1.a;2;1;6;13.57;4.88;108.18
8;1;1.a;2;1;7;15.55;0.48;123.92
8;2;1;0;0;0;1;2;49
8;2;1.a;0;0;0;1.1;3;50
8;2;1.a;1;0;0;1.2;3.8;50.5
8;2;1.a;1;1;0;1.29;3.9;50.86
8;2;1.a;1;1;1;1.64;5.19;51.5
8;2;1.a;1;1;2;2.4;8.52;55.62
8;2;1.a;1;1;3;5.57;11.78;62.85
8;2;1.a;1;1;4;12.32;13.92;73.82
8;2;1.a;1;1;5;18.46;12.2;82.8
8;2;1.a;1;1;6;22.11;10.6;89.62
8;2;1.a;1;1;7;26.93;3.4;95.42
8;2;1.a;1;1;8;31.28;-2.13;99.8
8;2;1.a;1;1;9;35.61;-8.04;102.67
8;2;1.a;1;1;10;40.84;-15.38;106.71
8;2;1.a;1;2;0;1.42;1.92;52.03
8;2;1.a;1;2;1;0.93;0.86;53.42
8;2;1.a;1;2;2;1.14;-0.09;58.02
8;2;1.a;1;2;3;2.4;-1.23;64.43
8;2;1.a;1;2;4;4.91;-0.77;72.53
8;2;1.a;1;2;5;10.36;0.85;82.74
8;2;1.a;1;2;6;13.55;2.52;91.17
8;2;1.a;1;2;7;18.58;2.97;100.06
8;2;1.a;1;2;8;23.01;2.3;112.8
8;2;1.a;1;2;9;26.89;1.14;120.6
8;2;1.b;0;0;0;1.43;0;51
8;2;1.b;1;0;0;1.44;0.05;51.1
8;2;1.b;1;1;0;1.45;0.09;51.12
8;2;1.b;1;1;1;1.2;-0.05;51.71
8;2;1.b;1;1;2;-0.96;-1.12;56.13
8;2;1.b;1;1;3;-4.99;-4.12;65.35
8;2;1.b;1;1;4;-7.27;-3.64;79.68
8;2;1.b;1;1;5;-6.02;0.34;90.43
8;2;1.b;1;1;6;1.81;4.48;97.34
8;2;1.b;1;1;7;12.38;3.8;103.99
8;2;1.b;1;1;8;20.76;0.75;107.55
8;2;1.b;1;1;9;25.75;-4.11;110.52
8;2;2;0;0;0;-10;3.5;55
8;2;2.a;0;0;0;-11;3.8;55
8;2;2.a;1;0;0;-12;4;56
8;2;2.a;1;1;0;-12.71;4.01;56.81
8;2;2.a;1;2;0;-12.72;6.24;55.56
8;2;2.a;1;2;1;-12.47;6.84;55.83
8;2;2.a;1;2;2;-11.67;9.06;57.38
8;2;2.a;1;2;3;-11.02;11.72;61.48
8;2;2.a;1;2;4;-9.75;12.17;67.31
8;2;2.a;1;2;5;-9.43;10.83;75.81
8;2;2.a;1;2;6;-6.44;6.43;87.13
8;2;2.a;1;2;7;-6.27;6.43;87.24
8;2;2.a;1;2;8;-0.52;5.56;95.39
8;2;2.a;1;2;9;5.08;5.72;103.16
8;2;2.a;1;2;10;14.45;10.9;109.95
8;2;2.a;1;2;11;20.55;14.27;115.06
8;2;2.a;1;2;12;27.62;19.03;119.15
8;2;2.a;1;2;13;33.66;20.31;128.17
8;2;2.b;0;0;0;-11;4.2;53
8;2;2.b;1;0;0;-12;4.3;54
8;2;3;0;0;0;-13;1;52
8;2;3.a;0;0;0;-14;1.4;53
8;2;3.a;1;0;0;-14.2;1.42;53.01
8;2;3.a;1;1M;0;-14.5;1.46;53.06
8;2;3.a;1;1M;1;-15.06;1.67;52.89
8;2;3.a;1;1M;2;-17.62;2.85;54.07
8;2;3.a;1;1M;3;-21.45;4.78;61.73
8;2;3.a;1;1M;4;-23.42;5.37;72.15
8;2;3.a;1;1M;5;-24.31;3.66;88.31
8;2;3.a;1;1M;6;-26.05;4.82;106.56
8;2;3.a;1;1M;7;-32.94;5.75;118.25
8;2;3.a;1;1M;8;-39.95;8.39;126.33
8;2;3.a;1;3;0;-12.69;-1.02;52.08
8;2;3.a;1;3;1;-14.2;-0.78;52.25
8;2;3.a;1;3;2;-20.72;-2.23;53.55
8;2;3.a;1;3;3;-27.49;-2.94;56.65
8;2;3.a;1;3;4;-36.07;-4.89;61.05
8;2;3.a;1;3;5;-41.12;-5.23;69.88
8;2;3.a;1;3;6;-42.22;-8.11;82.63
8;2;3.a;1;3;7;-37.93;-7.57;96.29
8;2;3.a;1;3;8;-33;-7.67;108.67
8;2;3.a;1;3;9;-24.07;-4.13;119.04
8;2;3.a;1;3;10;-20.9;-2.33;128.29
8;2;3.a;1;3;11;-18.5;0.01;136.76

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more