diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea22d9d622839c96ae0b75c4c23342cd9171f29..9d58db8c2fb6affbfcdb442f029ae879525259d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [v0.5.0] - unreleased +## [v0.5.0] - 07-06-2024 This release doesn't add much new functionality, but represents a major restructuring of the code base. Specifically, it removes the Agents.jl dependency and changes the @@ -51,8 +51,6 @@ way the species definition macros work and are used. - Agents.jl dependency (including `AgentBasedModel` and functions for adding/moving/removing agents) -- `countanimals()` and `@countanimals()` - ### Fixed diff --git a/Project.toml b/Project.toml index d052e044ff500e8c5e0b4f47c14debcc56dbb942..cc9f1d5cd99a086dfa590f4a9d1908cd35f88ddf 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "Persefone" uuid = "039acd1d-2a07-4b33-b082-83a1ff0fd136" authors = ["Daniel Vedder <daniel.vedder@idiv.de>"] -version = "0.4.1" +version = "0.5.0" [deps] ArgParse = "c7e460c6-2fb9-53a9-8c5b-16f535851c63" diff --git a/docs/build/.documenter-siteinfo.json b/docs/build/.documenter-siteinfo.json index 47a2c504f9540290d5c1a4eee4829ca4c66d273b..a917ae8cf4363d421925c896c6e8bfee6f766a47 100644 --- a/docs/build/.documenter-siteinfo.json +++ b/docs/build/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.9.3","generation_timestamp":"2023-10-31T18:07:37","documenter_version":"1.1.2"}} \ No newline at end of file +{"documenter":{"julia_version":"1.10.3","generation_timestamp":"2024-06-07T12:55:27","documenter_version":"1.1.2"}} \ No newline at end of file diff --git a/docs/build/adapting.html b/docs/build/adapting.html index 07c69444d30e371af3cf5a1d0cb480dcf5cc0f02..1a10404ab3e6fcb146912f966458f6e56fa4eb89 100644 --- a/docs/build/adapting.html +++ b/docs/build/adapting.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Adapting Persefone · Persefone</title><meta name="title" content="Adapting Persefone · Persefone"/><meta property="og:title" content="Adapting Persefone · Persefone"/><meta property="twitter:title" content="Adapting Persefone · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li class="is-active"><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="adapting.html">Adapting Persefone</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="adapting.html">Adapting Persefone</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/adapting.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Adapting-Persefone"><a class="docs-heading-anchor" href="#Adapting-Persefone">Adapting Persefone</a><a id="Adapting-Persefone-1"></a><a class="docs-heading-anchor-permalink" href="#Adapting-Persefone" title="Permalink"></a></h1><p>A key development goal of Persefone is to be <a href="https://doi.org/10.1515/itit-2019-0040">FAIR</a>: <em>findable, accessible, interoperable, and reusable</em>. We aim to build a model that is both easy to use and easy to adapt to new situations.</p><p>There are multiple ways to adapt Persefone for a new modelling study:</p><h3 id="Changing-the-parameters"><a class="docs-heading-anchor" href="#Changing-the-parameters">Changing the parameters</a><a id="Changing-the-parameters-1"></a><a class="docs-heading-anchor-permalink" href="#Changing-the-parameters" title="Permalink"></a></h3><p>The simplest way to adapt Persefone is simply by changing the parameters. Copy <code>src/parameters.toml</code> to a new location, adjust it to your needs, and run the model using <code>julia run.jl -c <configfile></code>.</p><h3 id="Changing-the-region"><a class="docs-heading-anchor" href="#Changing-the-region">Changing the region</a><a id="Changing-the-region-1"></a><a class="docs-heading-anchor-permalink" href="#Changing-the-region" title="Permalink"></a></h3><p>To apply Persefone to a new region, you need to create new input maps of land cover and farmplots. How to do so is described <a href="gis.html">here</a>.</p><p><em>You may also need to change aspects of the <code>farm</code> submodel. This is not yet implemented.</em></p><h3 id="Adding-new-animal-species"><a class="docs-heading-anchor" href="#Adding-new-animal-species">Adding new animal species</a><a id="Adding-new-animal-species-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-animal-species" title="Permalink"></a></h3><p>To implement a new species to the <code>nature</code> submodel, add a new file to the <code>src/nature/species</code> directory and <code>include</code> it in <code>src/Persefone.jl</code>, as well as adding the name of the species to the <code>nature.targetspecies</code> parameter. In the new file, implement the species using the <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> syntax as described <a href="species-dsl.html">here</a>.</p><h3 id="Adding-new-crop-species"><a class="docs-heading-anchor" href="#Adding-new-crop-species">Adding new crop species</a><a id="Adding-new-crop-species-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-crop-species" title="Permalink"></a></h3><p><em>Crop growth is not yet implemented.</em></p><h3 id="Adding-new-farmer-behaviour"><a class="docs-heading-anchor" href="#Adding-new-farmer-behaviour">Adding new farmer behaviour</a><a id="Adding-new-farmer-behaviour-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-farmer-behaviour" title="Permalink"></a></h3><p><em>Farmer behaviour is not yet implemented.</em></p><h3 id="Adding-a-new-submodel"><a class="docs-heading-anchor" href="#Adding-a-new-submodel">Adding a new submodel</a><a id="Adding-a-new-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-a-new-submodel" title="Permalink"></a></h3><p>To add a new submodel in addition to the existing ones (<code>nature</code>, <code>crop</code>, and <code>farm</code>), you need to familiarise yourself with the <a href="architecture.html">software architecture</a>. In particular, you need to understand how initialisation and scheduling works in <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/simulation.jl"><code>src/core/simulation.jl</code></a>, and what information is stored in the <code>model</code> object.</p><p>If you want to add a new agent type, use Agents.jl's <a href="https://juliadynamics.github.io/Agents.jl/stable/tutorial/#Agents.@agent"><code>@agent</code></a> macro. (But be aware that Persefone already has three agent types and you may encounter <a href="https://juliadynamics.github.io/Agents.jl/stable/performance_tips/#Avoid-Unions-of-many-different-agent-types-(temporary!)-1">performance problems</a>.) Having implemented the new agent type, add it to the <code>model</code> objects type definition and scheduler, and write an initialisation function and a <code>stepagent!</code> function. (See <a href="simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a> and <a href="simulation.html#Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}"><code>stepsimulation!</code></a> for details.)</p><h3 id="Linking-to-another-model"><a class="docs-heading-anchor" href="#Linking-to-another-model">Linking to another model</a><a id="Linking-to-another-model-1"></a><a class="docs-heading-anchor-permalink" href="#Linking-to-another-model" title="Permalink"></a></h3><p>Persefone can also be used as a software library and be called from another application. For this purpose, it is set up as a <a href="https://pkgdocs.julialang.org/v1/">Julia package</a>, with a <a href="https://docs.julialang.org/en/v1/manual/modules/">module</a> exporting various model functions, types, and macros (see <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/Persephone.jl"><code>src/Persefone.jl</code></a>). Of particular interest are the functions <a href="simulation.html#Persefone.simulate"><code>simulate</code></a> (set up and run a complete simulation based on a config file), <a href="simulation.html#Persefone.initialise"><code>initialise</code></a> (create one or more <code>model</code> objects from a config file), <a href="simulation.html#Persefone.simulate!-Tuple{Agents.AgentBasedModel}"><code>simulate!</code></a> (do a simulation run with an existing <code>model</code> object), and <a href="simulation.html#Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}"><code>stepsimulation!</code></a> (update a <code>model</code> object by one time step).</p><p>To interface with Julia from another language, see the Julia docs <a href="https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/">here</a> and <a href="https://docs.julialang.org/en/v1/manual/embedding/">here</a>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="developing.html">« Developing Persefone</a><a class="docs-footer-nextpage" href="architecture.html">Source code architecture »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Adapting Persefone · Persefone.jl</title><meta name="title" content="Adapting Persefone · Persefone.jl"/><meta property="og:title" content="Adapting Persefone · Persefone.jl"/><meta property="twitter:title" content="Adapting Persefone · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li class="is-active"><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="adapting.html">Adapting Persefone</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="adapting.html">Adapting Persefone</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/adapting.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Adapting-Persefone"><a class="docs-heading-anchor" href="#Adapting-Persefone">Adapting Persefone</a><a id="Adapting-Persefone-1"></a><a class="docs-heading-anchor-permalink" href="#Adapting-Persefone" title="Permalink"></a></h1><p>A key development goal of Persefone is to be <a href="https://doi.org/10.1515/itit-2019-0040">FAIR</a>: <em>findable, accessible, interoperable, and reusable</em>. We aim to build a model that is both easy to use and easy to adapt to new situations.</p><p>There are multiple ways to adapt Persefone for a new modelling study:</p><h3 id="Changing-the-parameters"><a class="docs-heading-anchor" href="#Changing-the-parameters">Changing the parameters</a><a id="Changing-the-parameters-1"></a><a class="docs-heading-anchor-permalink" href="#Changing-the-parameters" title="Permalink"></a></h3><p>The simplest way to adapt Persefone is simply by changing the parameters. Copy <code>src/parameters.toml</code> to a new location, adjust it to your needs, and run the model using <code>julia run.jl -c <configfile></code>.</p><h3 id="Changing-the-region"><a class="docs-heading-anchor" href="#Changing-the-region">Changing the region</a><a id="Changing-the-region-1"></a><a class="docs-heading-anchor-permalink" href="#Changing-the-region" title="Permalink"></a></h3><p>To apply Persefone to a new region, you need to create new input maps of land cover and farmplots. How to do so is described <a href="gis.html">here</a>.</p><p><em>You may also need to change aspects of the <code>farm</code> submodel. This is not yet implemented.</em></p><h3 id="Adding-new-animal-species"><a class="docs-heading-anchor" href="#Adding-new-animal-species">Adding new animal species</a><a id="Adding-new-animal-species-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-animal-species" title="Permalink"></a></h3><p>To implement a new species to the <code>nature</code> submodel, add a new file to the <code>src/nature/species</code> directory and <code>include</code> it in <code>src/Persefone.jl</code>, as well as adding the name of the species to the <code>nature.targetspecies</code> parameter. In the new file, implement the species using the <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> syntax as described <a href="species-dsl.html">here</a>.</p><h3 id="Adding-new-crop-species"><a class="docs-heading-anchor" href="#Adding-new-crop-species">Adding new crop species</a><a id="Adding-new-crop-species-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-crop-species" title="Permalink"></a></h3><p><em>Crop growth is not yet implemented.</em></p><h3 id="Adding-new-farmer-behaviour"><a class="docs-heading-anchor" href="#Adding-new-farmer-behaviour">Adding new farmer behaviour</a><a id="Adding-new-farmer-behaviour-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-new-farmer-behaviour" title="Permalink"></a></h3><p><em>Farmer behaviour is not yet implemented.</em></p><h3 id="Adding-a-new-submodel"><a class="docs-heading-anchor" href="#Adding-a-new-submodel">Adding a new submodel</a><a id="Adding-a-new-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Adding-a-new-submodel" title="Permalink"></a></h3><p>To add a new submodel in addition to the existing ones (<code>nature</code>, <code>crop</code>, and <code>farm</code>), you need to familiarise yourself with the <a href="architecture.html">software architecture</a>. In particular, you need to understand how initialisation and scheduling works in <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/simulation.jl"><code>src/core/simulation.jl</code></a>, and what information is stored in the <code>model</code> object.</p><p>If you want to add a new agent type, create a subtype of <a href="simulation.html#Persefone.ModelAgent"><code>ModelAgent</code></a>, implement a <a href="@ref"><code>stepagent!</code></a> function for it and add it to <a href="simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a>.</p><h3 id="Linking-to-another-model"><a class="docs-heading-anchor" href="#Linking-to-another-model">Linking to another model</a><a id="Linking-to-another-model-1"></a><a class="docs-heading-anchor-permalink" href="#Linking-to-another-model" title="Permalink"></a></h3><p>Persefone can also be used as a software library and be called from another application. For this purpose, it is set up as a <a href="https://pkgdocs.julialang.org/v1/">Julia package</a>, with a <a href="https://docs.julialang.org/en/v1/manual/modules/">module</a> exporting various model functions, types, and macros (see <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/Persephone.jl"><code>src/Persefone.jl</code></a>). Of particular interest are the functions <a href="simulation.html#Persefone.simulate"><code>simulate</code></a> (set up and run a complete simulation based on a config file), <a href="simulation.html#Persefone.initialise"><code>initialise</code></a> (create one or more <code>model</code> objects from a config file), <a href="simulation.html#Persefone.simulate!-Tuple{SimulationModel}"><code>simulate!</code></a> (do a simulation run with an existing <code>model</code> object), and <a href="simulation.html#Persefone.stepsimulation!-Tuple{SimulationModel}"><code>stepsimulation!</code></a> (update a <code>model</code> object by one time step).</p><p>To interface with Julia from another language, see the Julia docs <a href="https://docs.julialang.org/en/v1/manual/calling-c-and-fortran-code/">here</a> and <a href="https://docs.julialang.org/en/v1/manual/embedding/">here</a>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="developing.html">« Developing Persefone</a><a class="docs-footer-nextpage" href="architecture.html">Source code architecture »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/architecture.html b/docs/build/architecture.html index a722fd071f187f198f558a5ce25af86a5bf0fccd..e47c41550c6899b6f63dd9a7d7835451d068e2c7 100644 --- a/docs/build/architecture.html +++ b/docs/build/architecture.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Source code architecture · Persefone</title><meta name="title" content="Source code architecture · Persefone"/><meta property="og:title" content="Source code architecture · Persefone"/><meta property="twitter:title" content="Source code architecture · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li class="is-active"><a class="tocitem" href="architecture.html">Source code architecture</a><ul class="internal"><li class="toplevel"><a class="tocitem" href="#Model-components"><span>Model components</span></a></li><li class="toplevel"><a class="tocitem" href="#Important-implementation-details"><span>Important implementation details</span></a></li></ul></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="architecture.html">Source code architecture</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="architecture.html">Source code architecture</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/architecture.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Source-code-architecture"><a class="docs-heading-anchor" href="#Source-code-architecture">Source code architecture</a><a id="Source-code-architecture-1"></a><a class="docs-heading-anchor-permalink" href="#Source-code-architecture" title="Permalink"></a></h1><h1 id="Model-components"><a class="docs-heading-anchor" href="#Model-components">Model components</a><a id="Model-components-1"></a><a class="docs-heading-anchor-permalink" href="#Model-components" title="Permalink"></a></h1><p><img src="assets/architecture.png" alt=""model architecture""/></p><p>Persefone is divided into four components, three of which are semi-independent submodels:</p><ol><li><p><code>core</code>: This is the foundation of the model software, which sets up and executes simulation runs. It also reads in the configuration file and landscape maps, and provides data output functionality. (Eventually, it will also provide weather data.)</p></li><li><p><code>nature</code>: This is an individual-based model of species in agricultural landscapes. It defines the <a href="nature.html#Persefone.Animal"><code>Animal</code></a> agent type, and a set of macros that can be used to rapidly create new species. It also includes ecological process functions that are useful for all species.</p></li><li><p><code>farm</code>: This is an agent-based model of farmer decision making. It is not yet implemented, but will provide the <a href="farm.html#Persefone.Farmer"><code>Farmer</code></a> agent type.</p></li><li><p><code>crop</code>: This is a mathematical growth model for various crops. It is not yet implemented, but already provides the agent type <a href="crops.html#Persefone.FarmPlot"><code>FarmPlot</code></a>, representing one field and its associated extent and crop type.</p></li></ol><p>Conceptually, <code>core</code> provides functionality that is needed by all of the submodels. Decisions made by <code>Farmer</code>s affect the <code>FarmPlot</code>s they own, and (directly or indirectly) the <code>Animal</code>s in the model landscape.</p><h1 id="Important-implementation-details"><a class="docs-heading-anchor" href="#Important-implementation-details">Important implementation details</a><a id="Important-implementation-details-1"></a><a class="docs-heading-anchor-permalink" href="#Important-implementation-details" title="Permalink"></a></h1><p><img src="assets/model_object.png" alt=""the model object""/></p><h3 id="The-model-object"><a class="docs-heading-anchor" href="#The-model-object">The <code>model</code> object</a><a id="The-model-object-1"></a><a class="docs-heading-anchor-permalink" href="#The-model-object" title="Permalink"></a></h3><p>A cursory reading of the source code will quickly show that most functions take an <code>AgentBasedModel</code> object as one of their arguments. This is the key data structure of <a href="https://juliadynamics.github.io/Agents.jl/stable/tutorial/#.-The-model-1">Agents.jl</a>, and holds all state that is in any way relevant to a simulation run. (Persefone has a strict "no global state" policy to avoid state-dependent bugs and allow parallelisation.) The model object gives access to all agent instances (via <code>model[id]</code>, where <code>id</code> is the unique identifier of this agent). It also stores the configuration (<code>model.settings</code>), the landscape (<code>model.landscape</code>, a matrix of <a href="simulation.html#Persefone.Pixel"><code>Pixel</code></a> objects that store the local land cover, amongst other things), and the current simulation date (<code>model.date</code>). (See <a href="simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a> for details.)</p><p>For more information about working with agent objects, see the <a href="https://juliadynamics.github.io/Agents.jl/stable/api/">Agents.jl API</a>.</p><h3 id="Model-configuration/the-@param-macro"><a class="docs-heading-anchor" href="#Model-configuration/the-@param-macro">Model configuration/the <code>@param</code> macro</a><a id="Model-configuration/the-@param-macro-1"></a><a class="docs-heading-anchor-permalink" href="#Model-configuration/the-@param-macro" title="Permalink"></a></h3><p>The model is configured via a <a href="https://toml.io/en/">TOML</a> file, the default version of which is at <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/parameters.toml"><code>src/parameters.toml</code></a>. An individual run can be configured using a user-defined configuration file, commandline arguments, or function calls (when Persefone is used as a package rather than an application). During a model run, the <a href="io.html#Persefone.@param-Tuple{Any}"><code>@param</code></a> macro can be used to access parameter values. Note that parameter names are prepended with the name of the component they are associated with. For example, the <code>outdir</code> parameter belongs to the <code>[core]</code> section of the TOML file, and must therefore be referenced as <code>@param(core.outdir)</code>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/input.jl"><code>src/core/input.jl</code></a> for details.)</p><div class="admonition is-info"><header class="admonition-header">@param and other macros</header><div class="admonition-body"><p>As <code>@param(parameter)</code> expands to <code>model.settings["parameter"]</code>, it can obviously only be used in a context where the <code>model</code> object is actually available. (This is the case for most functions in Persefone, but not for all.) Similarly, many of the <code>nature</code> macros depend on specific variables being available where they are called, and can therefore only be used in specific contexts (this is indicated in their documentation).</p></div></div><h3 id="Output-data"><a class="docs-heading-anchor" href="#Output-data">Output data</a><a id="Output-data-1"></a><a class="docs-heading-anchor-permalink" href="#Output-data" title="Permalink"></a></h3><p>Persefone can output model data into text files with a specified frequency (daily, monthly, yearly, or at the simulation end). Submodels can use <a href="io.html#Persefone.newdataoutput!"><code>Persefone.newdataoutput!</code></a> to plug into this system. For an example of how to use this, see <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/nature/ecologicaldata.jl"><code>src/nature/ecologicaldata.jl</code></a>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/output.jl"><code>src/core/output.jl</code></a> for details.)</p><h3 id="Farm-events"><a class="docs-heading-anchor" href="#Farm-events">Farm events</a><a id="Farm-events-1"></a><a class="docs-heading-anchor-permalink" href="#Farm-events" title="Permalink"></a></h3><p>The <a href="simulation.html#Persefone.FarmEvent"><code>FarmEvent</code></a> struct is used to communicate farming-related events between submodels. An event can be triggered with <a href="simulation.html#Persefone.createevent!"><code>createevent!</code></a> and affects all pixels within a <a href="crops.html#Persefone.FarmPlot"><code>FarmPlot</code></a>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/landscape.jl"><code>src/core/landscape.jl</code></a> for details.)</p><h3 id="Random-numbers-and-logging"><a class="docs-heading-anchor" href="#Random-numbers-and-logging">Random numbers and logging</a><a id="Random-numbers-and-logging-1"></a><a class="docs-heading-anchor-permalink" href="#Random-numbers-and-logging" title="Permalink"></a></h3><p>By default in Julia, the <a href="https://docs.julialang.org/en/v1/stdlib/Random/">random number generator</a> (RNG) and the <a href="https://docs.julialang.org/en/v1/stdlib/Logging/#Logging.global_logger">system logger</a> are two globally accessible variables. As Persefone needs to avoid all global data (since this would interfere with reproducibility in parallel runs), the <code>model</code> object stores a local logger and a local RNG. The local logger generally does not change the way the model uses <a href="https://docs.julialang.org/en/v1/stdlib/Logging/">log statements</a>, it is only relevant for some functions in <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/simulation.jl"><code>src/core/simulation.jl</code></a>.</p><div class="admonition is-info"><header class="admonition-header">Using the model RNG</header><div class="admonition-body"><p>Whenever you need to use a <a href="https://docs.julialang.org/en/v1/stdlib/Random/#Base.rand">random number</a>, you must use the <code>model.rng</code>. The easiest way to do this is with the <a href="io.html#Persefone.@rand-Tuple"><code>@rand</code></a> and <a href="io.html#Persefone.@shuffle!-Tuple{Any}"><code>@shuffle!</code></a> macros. (Note that these, too, require access to the <code>model</code> object.)</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="adapting.html">« Adapting Persefone</a><a class="docs-footer-nextpage" href="gis.html">Maps and weather data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Source code architecture · Persefone.jl</title><meta name="title" content="Source code architecture · Persefone.jl"/><meta property="og:title" content="Source code architecture · Persefone.jl"/><meta property="twitter:title" content="Source code architecture · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li class="is-active"><a class="tocitem" href="architecture.html">Source code architecture</a><ul class="internal"><li class="toplevel"><a class="tocitem" href="#Model-components"><span>Model components</span></a></li><li class="toplevel"><a class="tocitem" href="#Important-implementation-details"><span>Important implementation details</span></a></li></ul></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="architecture.html">Source code architecture</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="architecture.html">Source code architecture</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/architecture.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Source-code-architecture"><a class="docs-heading-anchor" href="#Source-code-architecture">Source code architecture</a><a id="Source-code-architecture-1"></a><a class="docs-heading-anchor-permalink" href="#Source-code-architecture" title="Permalink"></a></h1><h1 id="Model-components"><a class="docs-heading-anchor" href="#Model-components">Model components</a><a id="Model-components-1"></a><a class="docs-heading-anchor-permalink" href="#Model-components" title="Permalink"></a></h1><p><img src="assets/architecture.png" alt=""model architecture""/></p><p>Persefone is divided into four components, three of which are semi-independent submodels:</p><ol><li><p><code>core</code> and <code>world</code>: These two directories provide the foundation of the model software, which sets up and executes simulation runs. It also reads all input files (the configuration file, landscape maps, and weather data), and provides data output functionality.</p></li><li><p><code>nature</code>: This is an individual-based model of species in agricultural landscapes. It defines the <a href="nature.html#Persefone.Animal"><code>Animal</code></a> agent type, and a set of macros that can be used to rapidly create new species. It also includes ecological process functions that are useful for all species.</p></li><li><p><code>farm</code>: This is an agent-based model of farmer decision making. It is not yet implemented, but will provide the <a href="farm.html#Persefone.Farmer"><code>Farmer</code></a> agent type.</p></li><li><p><code>crop</code>: This is a mathematical growth model for various crops. It is not yet implemented, but already provides the agent type <a href="crops.html#Persefone.FarmPlot"><code>FarmPlot</code></a>, representing one field and its associated extent and crop type.</p></li></ol><p>Conceptually, <code>core</code> provides functionality that is needed by all of the submodels. Decisions made by <code>Farmer</code>s affect the <code>FarmPlot</code>s they own, and (directly or indirectly) the <code>Animal</code>s in the model landscape.</p><h1 id="Important-implementation-details"><a class="docs-heading-anchor" href="#Important-implementation-details">Important implementation details</a><a id="Important-implementation-details-1"></a><a class="docs-heading-anchor-permalink" href="#Important-implementation-details" title="Permalink"></a></h1><p><img src="assets/model_object.png" alt=""the model object""/></p><h3 id="The-model-object"><a class="docs-heading-anchor" href="#The-model-object">The <code>model</code> object</a><a id="The-model-object-1"></a><a class="docs-heading-anchor-permalink" href="#The-model-object" title="Permalink"></a></h3><p>A cursory reading of the source code will quickly show that most functions take an <code>SimulationModel</code> object as one of their arguments. The concrete type for this is <a href="simulation.html#Persefone.AgricultureModel"><code>AgricultureModel</code></a>, a struct that holds all state that is in any way relevant to a simulation run. (Persefone has a strict "no global state" policy to avoid state-dependent bugs and allow parallelisation.) The model object gives access to all agent instances. It also stores the configuration (<code>model.settings</code>), the landscape (<code>model.landscape</code>, a matrix of <a href="simulation.html#Persefone.Pixel"><code>Pixel</code></a> objects that store the local land cover, amongst other things), and the current simulation date (<code>model.date</code>). (See <a href="simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a> for details.)</p><h3 id="Model-configuration/the-@param-macro"><a class="docs-heading-anchor" href="#Model-configuration/the-@param-macro">Model configuration/the <code>@param</code> macro</a><a id="Model-configuration/the-@param-macro-1"></a><a class="docs-heading-anchor-permalink" href="#Model-configuration/the-@param-macro" title="Permalink"></a></h3><p>The model is configured via a <a href="https://toml.io/en/">TOML</a> file, the default version of which is at <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/parameters.toml"><code>src/parameters.toml</code></a>. An individual run can be configured using a user-defined configuration file, commandline arguments, or function calls (when Persefone is used as a package rather than an application). During a model run, the <a href="io.html#Persefone.@param-Tuple{Any}"><code>@param</code></a> macro can be used to access parameter values. Note that parameter names are prepended with the name of the component they are associated with. For example, the <code>outdir</code> parameter belongs to the <code>[core]</code> section of the TOML file, and must therefore be referenced as <code>@param(core.outdir)</code>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/input.jl"><code>src/core/input.jl</code></a> for details.)</p><div class="admonition is-info"><header class="admonition-header">@param and other macros</header><div class="admonition-body"><p>As <code>@param(parameter)</code> expands to <code>model.settings["parameter"]</code>, it can obviously only be used in a context where the <code>model</code> object is actually available. (This is the case for most functions in Persefone, but not for all.) Similarly, many of the <code>nature</code> macros depend on specific variables being available where they are called, and can therefore only be used in specific contexts (this is indicated in their documentation).</p></div></div><h3 id="Output-data"><a class="docs-heading-anchor" href="#Output-data">Output data</a><a id="Output-data-1"></a><a class="docs-heading-anchor-permalink" href="#Output-data" title="Permalink"></a></h3><p>Persefone can output model data into text files with a specified frequency (daily, monthly, yearly, or at the simulation end). Submodels can use <a href="io.html#Persefone.newdataoutput!"><code>Persefone.newdataoutput!</code></a> to plug into this system. For an example of how to use this, see <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/nature/ecologicaldata.jl"><code>src/nature/ecologicaldata.jl</code></a>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/output.jl"><code>src/core/output.jl</code></a> for details.)</p><h3 id="Farm-events"><a class="docs-heading-anchor" href="#Farm-events">Farm events</a><a id="Farm-events-1"></a><a class="docs-heading-anchor-permalink" href="#Farm-events" title="Permalink"></a></h3><p>The <a href="simulation.html#Persefone.FarmEvent"><code>FarmEvent</code></a> struct is used to communicate farming-related events between submodels. An event can be triggered with <a href="simulation.html#Persefone.createevent!"><code>createevent!</code></a> and affects all pixels within a <a href="crops.html#Persefone.FarmPlot"><code>FarmPlot</code></a>. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/landscape.jl"><code>src/core/landscape.jl</code></a> for details.)</p><h3 id="Random-numbers-and-logging"><a class="docs-heading-anchor" href="#Random-numbers-and-logging">Random numbers and logging</a><a id="Random-numbers-and-logging-1"></a><a class="docs-heading-anchor-permalink" href="#Random-numbers-and-logging" title="Permalink"></a></h3><p>By default in Julia, the <a href="https://docs.julialang.org/en/v1/stdlib/Random/">random number generator</a> (RNG) and the <a href="https://docs.julialang.org/en/v1/stdlib/Logging/#Logging.global_logger">system logger</a> are two globally accessible variables. As Persefone needs to avoid all global data (since this would interfere with reproducibility in parallel runs), the <code>model</code> object stores a local logger and a local RNG. The local logger generally does not change the way the model uses <a href="https://docs.julialang.org/en/v1/stdlib/Logging/">log statements</a>, it is only relevant for some functions in <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/src/core/simulation.jl"><code>src/core/simulation.jl</code></a>.</p><div class="admonition is-info"><header class="admonition-header">Using the model RNG</header><div class="admonition-body"><p>Whenever you need to use a <a href="https://docs.julialang.org/en/v1/stdlib/Random/#Base.rand">random number</a>, you must use the <code>model.rng</code>. The easiest way to do this is with the <a href="io.html#Persefone.@rand-Tuple"><code>@rand</code></a> and <a href="io.html#Persefone.@shuffle!-Tuple{Any}"><code>@shuffle!</code></a> macros. (Note that these, too, require access to the <code>model</code> object.)</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="adapting.html">« Adapting Persefone</a><a class="docs-footer-nextpage" href="gis.html">Maps and weather data »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/assets/architecture.png b/docs/build/assets/architecture.png index bf109d5137a8f8f832e6ffb12df40bf2fc5ec91e..ead154a03211bf85238b8108ff9ee66b1940ce9e 100644 Binary files a/docs/build/assets/architecture.png and b/docs/build/assets/architecture.png differ diff --git a/docs/build/assets/architecture.svg b/docs/build/assets/architecture.svg index be710384808f4ef0788aa55ca442dcacb13d02a6..5bca77162436a231811599578b1aa94b7a7a01d3 100644 --- a/docs/build/assets/architecture.svg +++ b/docs/build/assets/architecture.svg @@ -7,9 +7,9 @@ viewBox="0 0 100 80" version="1.1" id="svg5" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" sodipodi:docname="architecture.svg" - inkscape:export-filename="/home/xo30xoqa/Documents/Promotion/Persephone/docs/src/assets/architecture.png" + inkscape:export-filename="architecture.png" inkscape:export-xdpi="300" inkscape:export-ydpi="300" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -27,17 +27,19 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="1.8" - inkscape:cx="195.83333" - inkscape:cy="143.61111" + inkscape:cx="196.11111" + inkscape:cy="143.88889" inkscape:window-width="1920" inkscape:window-height="1016" inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1" width="100mm" height="160px" - units="px" /> + units="px" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> <defs id="defs2"> <clipPath @@ -131,7 +133,7 @@ y="30.08935">Farmer</tspan></text> <g id="g20748" - transform="translate(33.763864,-9.8749511)"> + transform="translate(19.055834,6.3281353)"> <path d="m 21.677551,59.233303 -2.098905,-0.66097 -0.360479,-0.90155 -0.06369,0.46667 -0.839494,-0.53621 0.327341,-0.37702 -0.488348,-1.21654 1.896754,1.47761 0.09433,0.75622 z m -10.380146,-0.99456 -0.02956,0.0295 -0.06769,-0.0377 z m 11.003754,2.62282 c -1.012697,-0.081 -2.045257,-0.39522 -3.118963,-0.99918 -0.992493,-0.55831 -2.047012,-0.9591 -3.128447,-1.20237 l 0.957754,-0.67304 -0.981868,-1.52118 0.663797,-0.80202 -0.414896,-0.99569 -1.880678,0.88504 1.901435,-1.81847 6.365701,5.31045 -0.09202,0.45942 0.296667,-0.0775 -0.337812,0.28281 -0.09917,0.49506 -0.04687,0.23415 0.350777,-0.12005 -0.409692,0.41407 z m 1.02212,-0.0641 -0.337812,-0.18804 0.369256,0.031 z M 9.1668722,59.590103 c 7.6798988,-1.92007 7.7635428,4.80676 13.6361228,3.33857 -5.668766,2.62662 -6.305185,-4.17874 -13.6361228,-3.33857 m 16.1832158,-0.80774 -4.950611,-4.50147 -1.382876,1.24456 -2.682723,-2.32323 -3.813033,3.81307 -0.01398,-0.0698 -0.375169,-0.14431 0.346897,0.019 -0.09935,-0.51182 -0.247546,-0.0906 h 0.229407 l -0.229407,-1.14518 -0.178376,0.8907 0.178376,-0.0472 -0.193497,0.12264 -0.103139,0.51486 0.296636,-0.0774 -0.33775,0.28278 -0.0992,0.49506 -0.0469,0.23415 0.350809,-0.12005 -0.409692,0.41416 -0.03825,0.19091 -0.02947,-0.14718 -0.06181,-0.30849 -0.375169,-0.14435 0.346897,0.019 -0.09935,-0.51181 -0.247546,-0.0906 h 0.229376 l -0.229376,-1.14518 -0.178407,0.89071 0.178407,-0.0472 -0.193528,0.12263 -0.103108,0.51486 0.296636,-0.0774 -0.337781,0.28272 -0.09917,0.49506 -0.0469,0.23418 0.350808,-0.12005 -0.409723,0.41413 -0.0874,0.43633 c -0.049,0.0135 -0.09793,0.0274 -0.14681,0.0415 l -0.4313108,-0.24012 0.4089528,0.0343 -0.08786,-0.43883 -0.06184,-0.30852 -0.3751378,-0.14432 0.3468658,0.019 -0.09932,-0.51181 -0.2475458,-0.0906 h 0.229407 l -0.229407,-1.14516 -0.178407,0.89071 0.178407,-0.0472 -0.193497,0.12266 -0.103139,0.51487 0.296636,-0.0775 -0.337781,0.28278 -0.09913,0.49506 -0.0469,0.23418 0.350777,-0.12008 -0.409692,0.41419 -0.107142,0.53476 c -0.429495,0.17702 -0.85092,0.38081 -1.2616899,0.61187 1.9391609,-0.60944 3.5902477,-0.96862 5.1902727,-0.89862 l 0.03813,-0.19048 0.204861,-0.20708 -0.175419,0.06 0.02347,-0.11705 0.04958,-0.24752 0.16889,-0.14139 -0.148318,0.0387 0.05155,-0.2574 0.09676,-0.0614 -0.08919,0.0236 0.08919,-0.44536 0.114688,0.57258 h -0.114688 l 0.123773,0.0453 0.04968,0.25589 -0.173449,-0.009 0.187554,0.0721 0.03092,0.15427 0.04395,0.21942 -0.204491,-0.0172 0.226296,0.12599 0.03536,0.17656 c 0.15306,0.0178 0.305906,0.04 0.458751,0.0664 l 0.40963,-0.41404 -0.350746,0.11999 0.04687,-0.23415 0.09917,-0.49506 0.337781,-0.28275 -0.296667,0.0775 0.103139,-0.51487 0.193528,-0.12263 -0.178407,0.0471 0.178407,-0.89071 0.229376,1.14518 h -0.229376 l 0.247546,0.0906 0.09932,0.51181 -0.346866,-0.019 0.375138,0.14429 0.06178,0.30852 0.08793,0.43886 -0.409015,-0.0343 0.452623,0.25198 0.03027,0.15106 c 0.979651,0.31108 1.981445,0.81316 3.059462,1.54764 2.787864,1.89965 7.202947,1.18072 9.286146,-1.49541 -0.892188,0.50193 -1.770456,0.89961 -2.649401,1.15427 l -0.01528,-0.0762 -0.226327,-0.12599 0.204553,0.0171 -0.04401,-0.2194 -0.03089,-0.15423 -0.187553,-0.0722 0.173448,0.01 -0.04971,-0.25598 -0.123742,-0.0453 h 0.114718 l -0.114718,-0.57254 -0.08922,0.44538 0.08922,-0.0236 -0.09676,0.0613 -0.05156,0.25755 0.148319,-0.0388 -0.168922,0.14139 -0.04955,0.24751 -0.02344,0.11703 0.175388,-0.06 -0.204892,0.20708 -0.05962,0.29784 h 3.08e-4 c -0.01799,0.004 -0.03603,0.007 -0.05402,0.0111 l -0.02063,-0.10326 -0.3594,-0.20015 0.324754,0.0272 -0.06982,-0.34844 -0.04906,-0.24502 -0.297929,-0.1146 0.275478,0.0151 -0.0789,-0.40649 -0.196577,-0.0719 h 0.182133 l -0.182133,-0.90937 -0.141666,0.70735 0.141666,-0.0374 -0.153708,0.0974 -0.08186,0.40886 0.235566,-0.0615 -0.268211,0.22455 -0.07878,0.39318 -0.0372,0.18592 0.278589,-0.0953 -0.325401,0.32884 -0.0027,0.0132 -0.06766,-0.33803 -0.06184,-0.30853 -0.375107,-0.14431 0.346866,0.019 -0.09935,-0.51178 -0.247515,-0.0906 h 0.229375 l -0.229375,-1.14521 -0.178407,0.89071 0.178407,-0.0472 -0.193559,0.12266 -0.01004,0.05 -1.648099,-1.56032 2.161145,0.25872 -2.005128,-1.13394 0.117521,0.4909 -1.085531,-0.94725 -0.554099,0.0383 -0.303319,-0.28718 1.770055,0.2351 -0.138278,-0.77439 z" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.031;stroke-miterlimit:4;stroke-dasharray:none" @@ -151,31 +153,26 @@ </g> <g id="g20758" - transform="translate(-17.191961,-9.9021151)"> + transform="translate(-17.191961,-11.392119)"> <g id="g1709" transform="matrix(0.03759233,0,0,0.03759233,20.02845,40.979859)"> - <path - d="M 575.833,400 H 424.167 C 411.067,400 400,411.066 400,424.167 v 151.667 c 0,13.1 11.067,24.166 24.167,24.166 H 575.833 C 588.933,600 600,588.934 600,575.842 V 424.167 C 600,411.067 588.933,400 575.833,400 Z m -151.666,8.333 h 151.666 c 8.584,0 15.834,7.25 15.834,15.833 V 450 H 408.333 v -25.833 c 0,-8.584 7.25,-15.834 15.834,-15.834 z M 575.833,591.667 H 424.167 c -8.583,0 -15.833,-7.25 -15.833,-15.834 v -117.5 h 183.333 v 117.5 c 0,8.584 -7.25,15.834 -15.834,15.834 z" - id="path1699" /> - - <path - d="m 462.5,434.167 h 0.833 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 H 462.5 c -2.3,0 -4.167,1.858 -4.167,4.167 0,2.308 1.867,4.167 4.167,4.167 z" - id="path1701" /> - - <path - d="m 537.5,434.167 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 h -0.833 c -2.3,0 -3.75,1.867 -3.75,4.167 0,2.3 2.283,4.167 4.583,4.167 z" - id="path1703" /> - - <path - d="m 536.016,483.6 -17.5,6.667 c -2.158,0.825 -3.233,3.225 -2.408,5.383 0.816,2.15 3.233,3.225 5.375,2.408 l 11.85,-4.517 v 68.125 c 0,2.3 1.867,4.166 4.167,4.166 2.3,0 4.167,-1.866 4.167,-4.166 V 487.5 c 0,-1.375 -0.675,-2.65 -1.809,-3.434 -1.125,-0.783 -2.566,-0.941 -3.842,-0.466 z" - id="path1705" /> - - <path - d="m 479.366,519.45 23.867,-29.325 c 1.017,-1.242 1.217,-2.967 0.533,-4.417 -0.691,-1.45 -2.158,-2.375 -3.767,-2.375 h -44.167 c -2.3,0 -4.167,1.867 -4.167,4.167 0,2.3 1.866,4.167 4.167,4.167 h 35.4 L 467.6,520.7 c -1.05,1.291 -1.233,3.083 -0.458,4.558 0.767,1.483 2.342,2.467 4.008,2.226 4.175,-0.275 16.15,0.149 21.725,6.066 2.684,2.842 3.667,6.684 2.992,11.733 -1.208,9.066 -7.458,12.108 -12.483,13.059 -10.2,1.934 -23.167,-3.009 -27.25,-10.367 -1.117,-2 -3.65,-2.725 -5.667,-1.616 -2.017,1.125 -2.742,3.649 -1.617,5.675 4.958,8.925 17.708,15.075 29.875,15.075 2.1,-0.009 4.183,-0.184 6.208,-0.566 10.767,-2.042 17.75,-9.384 19.191,-20.142 1.017,-7.608 -0.733,-13.851 -5.2,-18.575 -5.291,-5.618 -13.357,-7.668 -19.558,-8.376 z" - id="path1707" /> - -</g> + <path + d="M 575.833,400 H 424.167 C 411.067,400 400,411.066 400,424.167 v 151.667 c 0,13.1 11.067,24.166 24.167,24.166 H 575.833 C 588.933,600 600,588.934 600,575.842 V 424.167 C 600,411.067 588.933,400 575.833,400 Z m -151.666,8.333 h 151.666 c 8.584,0 15.834,7.25 15.834,15.833 V 450 H 408.333 v -25.833 c 0,-8.584 7.25,-15.834 15.834,-15.834 z M 575.833,591.667 H 424.167 c -8.583,0 -15.833,-7.25 -15.833,-15.834 v -117.5 h 183.333 v 117.5 c 0,8.584 -7.25,15.834 -15.834,15.834 z" + id="path1699" /> + <path + d="m 462.5,434.167 h 0.833 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 H 462.5 c -2.3,0 -4.167,1.858 -4.167,4.167 0,2.308 1.867,4.167 4.167,4.167 z" + id="path1701" /> + <path + d="m 537.5,434.167 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 h -0.833 c -2.3,0 -3.75,1.867 -3.75,4.167 0,2.3 2.283,4.167 4.583,4.167 z" + id="path1703" /> + <path + d="m 536.016,483.6 -17.5,6.667 c -2.158,0.825 -3.233,3.225 -2.408,5.383 0.816,2.15 3.233,3.225 5.375,2.408 l 11.85,-4.517 v 68.125 c 0,2.3 1.867,4.166 4.167,4.166 2.3,0 4.167,-1.866 4.167,-4.166 V 487.5 c 0,-1.375 -0.675,-2.65 -1.809,-3.434 -1.125,-0.783 -2.566,-0.941 -3.842,-0.466 z" + id="path1705" /> + <path + d="m 479.366,519.45 23.867,-29.325 c 1.017,-1.242 1.217,-2.967 0.533,-4.417 -0.691,-1.45 -2.158,-2.375 -3.767,-2.375 h -44.167 c -2.3,0 -4.167,1.867 -4.167,4.167 0,2.3 1.866,4.167 4.167,4.167 h 35.4 L 467.6,520.7 c -1.05,1.291 -1.233,3.083 -0.458,4.558 0.767,1.483 2.342,2.467 4.008,2.226 4.175,-0.275 16.15,0.149 21.725,6.066 2.684,2.842 3.667,6.684 2.992,11.733 -1.208,9.066 -7.458,12.108 -12.483,13.059 -10.2,1.934 -23.167,-3.009 -27.25,-10.367 -1.117,-2 -3.65,-2.725 -5.667,-1.616 -2.017,1.125 -2.742,3.649 -1.617,5.675 4.958,8.925 17.708,15.075 29.875,15.075 2.1,-0.009 4.183,-0.184 6.208,-0.566 10.767,-2.042 17.75,-9.384 19.191,-20.142 1.017,-7.608 -0.733,-13.851 -5.2,-18.575 -5.291,-5.618 -13.357,-7.668 -19.558,-8.376 z" + id="path1707" /> + </g> <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" @@ -190,7 +187,7 @@ </g> <g id="g20772" - transform="translate(24.875916,-9.0367501)"> + transform="translate(9.611018,6.3048519)"> <g id="g2810" transform="matrix(1.2503212,0,0,1.2503212,-11.47161,-11.896543)"> @@ -254,7 +251,7 @@ </g> <g id="g20786" - transform="translate(-37.205577,5.1853828)"> + transform="translate(-22.497547,-11.368835)"> <g id="g2298" transform="matrix(0.04783691,0,0,0.04783691,40.809767,46.207054)"> @@ -317,7 +314,8 @@ y="66.894287">output</tspan></text> </g> <g - id="g65798"> + id="g65798" + transform="translate(15.264898,-16.550337)"> <g id="g2299" transform="matrix(0.74874537,0,0,0.74874537,30.945366,-5.3407431)"> @@ -356,7 +354,7 @@ id="tspan26337" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.29167px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" x="6.9151421" - y="41.859329">core</tspan></text> + y="41.859329">core+world</tspan></text> <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" diff --git a/docs/build/assets/model_object.png b/docs/build/assets/model_object.png index d7d84bf9964495dd987ca937bc11fd8776a664cb..846bada21ddde03c725ed72f488a0183fb19d103 100644 Binary files a/docs/build/assets/model_object.png and b/docs/build/assets/model_object.png differ diff --git a/docs/build/assets/model_object.svg b/docs/build/assets/model_object.svg index 9379036a7a9689b47900fc44f9aaaff99d54e3c4..91038a823a0b9c0bf69822ded0e7df5b286e148b 100644 --- a/docs/build/assets/model_object.svg +++ b/docs/build/assets/model_object.svg @@ -7,9 +7,9 @@ viewBox="0 0 100 80" version="1.1" id="svg5" - inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + inkscape:version="1.3.2 (1:1.3.2+202311252150+091e20ef0f)" sodipodi:docname="model_object.svg" - inkscape:export-filename="/home/xo30xoqa/Documents/Promotion/Persephone/docs/src/assets/model_object.png" + inkscape:export-filename="model_object.png" inkscape:export-xdpi="300" inkscape:export-ydpi="300" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -27,17 +27,19 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="1.8" - inkscape:cx="163.61111" - inkscape:cy="143.61111" + inkscape:cx="163.88889" + inkscape:cy="143.88889" inkscape:window-width="1920" inkscape:window-height="1016" inkscape:window-x="0" - inkscape:window-y="27" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="layer1" width="100mm" height="160px" - units="px" /> + units="px" + inkscape:showpageshadow="2" + inkscape:deskcolor="#d1d1d1" /> <defs id="defs2"> <clipPath @@ -125,31 +127,26 @@ </g> <g id="g67104" - transform="translate(26.537875,21.497315)"> + transform="translate(26.537875,20.476418)"> <g id="g1709" transform="matrix(0.03759233,0,0,0.03759233,-30.306482,-10.182581)"> - <path - d="M 575.833,400 H 424.167 C 411.067,400 400,411.066 400,424.167 v 151.667 c 0,13.1 11.067,24.166 24.167,24.166 H 575.833 C 588.933,600 600,588.934 600,575.842 V 424.167 C 600,411.067 588.933,400 575.833,400 Z m -151.666,8.333 h 151.666 c 8.584,0 15.834,7.25 15.834,15.833 V 450 H 408.333 v -25.833 c 0,-8.584 7.25,-15.834 15.834,-15.834 z M 575.833,591.667 H 424.167 c -8.583,0 -15.833,-7.25 -15.833,-15.834 v -117.5 h 183.333 v 117.5 c 0,8.584 -7.25,15.834 -15.834,15.834 z" - id="path1699" /> - - <path - d="m 462.5,434.167 h 0.833 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 H 462.5 c -2.3,0 -4.167,1.858 -4.167,4.167 0,2.308 1.867,4.167 4.167,4.167 z" - id="path1701" /> - - <path - d="m 537.5,434.167 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 h -0.833 c -2.3,0 -3.75,1.867 -3.75,4.167 0,2.3 2.283,4.167 4.583,4.167 z" - id="path1703" /> - - <path - d="m 536.016,483.6 -17.5,6.667 c -2.158,0.825 -3.233,3.225 -2.408,5.383 0.816,2.15 3.233,3.225 5.375,2.408 l 11.85,-4.517 v 68.125 c 0,2.3 1.867,4.166 4.167,4.166 2.3,0 4.167,-1.866 4.167,-4.166 V 487.5 c 0,-1.375 -0.675,-2.65 -1.809,-3.434 -1.125,-0.783 -2.566,-0.941 -3.842,-0.466 z" - id="path1705" /> - - <path - d="m 479.366,519.45 23.867,-29.325 c 1.017,-1.242 1.217,-2.967 0.533,-4.417 -0.691,-1.45 -2.158,-2.375 -3.767,-2.375 h -44.167 c -2.3,0 -4.167,1.867 -4.167,4.167 0,2.3 1.866,4.167 4.167,4.167 h 35.4 L 467.6,520.7 c -1.05,1.291 -1.233,3.083 -0.458,4.558 0.767,1.483 2.342,2.467 4.008,2.226 4.175,-0.275 16.15,0.149 21.725,6.066 2.684,2.842 3.667,6.684 2.992,11.733 -1.208,9.066 -7.458,12.108 -12.483,13.059 -10.2,1.934 -23.167,-3.009 -27.25,-10.367 -1.117,-2 -3.65,-2.725 -5.667,-1.616 -2.017,1.125 -2.742,3.649 -1.617,5.675 4.958,8.925 17.708,15.075 29.875,15.075 2.1,-0.009 4.183,-0.184 6.208,-0.566 10.767,-2.042 17.75,-9.384 19.191,-20.142 1.017,-7.608 -0.733,-13.851 -5.2,-18.575 -5.291,-5.618 -13.357,-7.668 -19.558,-8.376 z" - id="path1707" /> - -</g> + <path + d="M 575.833,400 H 424.167 C 411.067,400 400,411.066 400,424.167 v 151.667 c 0,13.1 11.067,24.166 24.167,24.166 H 575.833 C 588.933,600 600,588.934 600,575.842 V 424.167 C 600,411.067 588.933,400 575.833,400 Z m -151.666,8.333 h 151.666 c 8.584,0 15.834,7.25 15.834,15.833 V 450 H 408.333 v -25.833 c 0,-8.584 7.25,-15.834 15.834,-15.834 z M 575.833,591.667 H 424.167 c -8.583,0 -15.833,-7.25 -15.833,-15.834 v -117.5 h 183.333 v 117.5 c 0,8.584 -7.25,15.834 -15.834,15.834 z" + id="path1699" /> + <path + d="m 462.5,434.167 h 0.833 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 H 462.5 c -2.3,0 -4.167,1.858 -4.167,4.167 0,2.308 1.867,4.167 4.167,4.167 z" + id="path1701" /> + <path + d="m 537.5,434.167 c 2.3,0 4.167,-1.867 4.167,-4.167 0,-2.3 -1.867,-4.167 -4.167,-4.167 h -0.833 c -2.3,0 -3.75,1.867 -3.75,4.167 0,2.3 2.283,4.167 4.583,4.167 z" + id="path1703" /> + <path + d="m 536.016,483.6 -17.5,6.667 c -2.158,0.825 -3.233,3.225 -2.408,5.383 0.816,2.15 3.233,3.225 5.375,2.408 l 11.85,-4.517 v 68.125 c 0,2.3 1.867,4.166 4.167,4.166 2.3,0 4.167,-1.866 4.167,-4.166 V 487.5 c 0,-1.375 -0.675,-2.65 -1.809,-3.434 -1.125,-0.783 -2.566,-0.941 -3.842,-0.466 z" + id="path1705" /> + <path + d="m 479.366,519.45 23.867,-29.325 c 1.017,-1.242 1.217,-2.967 0.533,-4.417 -0.691,-1.45 -2.158,-2.375 -3.767,-2.375 h -44.167 c -2.3,0 -4.167,1.867 -4.167,4.167 0,2.3 1.866,4.167 4.167,4.167 h 35.4 L 467.6,520.7 c -1.05,1.291 -1.233,3.083 -0.458,4.558 0.767,1.483 2.342,2.467 4.008,2.226 4.175,-0.275 16.15,0.149 21.725,6.066 2.684,2.842 3.667,6.684 2.992,11.733 -1.208,9.066 -7.458,12.108 -12.483,13.059 -10.2,1.934 -23.167,-3.009 -27.25,-10.367 -1.117,-2 -3.65,-2.725 -5.667,-1.616 -2.017,1.125 -2.742,3.649 -1.617,5.675 4.958,8.925 17.708,15.075 29.875,15.075 2.1,-0.009 4.183,-0.184 6.208,-0.566 10.767,-2.042 17.75,-9.384 19.191,-20.142 1.017,-7.608 -0.733,-13.851 -5.2,-18.575 -5.291,-5.618 -13.357,-7.668 -19.558,-8.376 z" + id="path1707" /> + </g> <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" @@ -164,7 +161,7 @@ </g> <g id="g69618" - transform="translate(43.57738,24.136259)"> + transform="translate(84.842902,24.136258)"> <g id="g2298" transform="matrix(0.04783691,0,0,0.04783691,-43.576989,31.272012)"> @@ -228,34 +225,38 @@ </g> <g id="g76635" - transform="translate(43.162525,5.2861854)"> + transform="translate(-6.3959161,5.2861852)"> <g - id="g2299" - transform="matrix(0.74874537,0,0,0.74874537,-6.96828,-6.6072202)"> - <rect - style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" - id="rect1783" - width="6.5330334" - height="6.5330334" - x="42.346821" - y="92.094666" /> - <path - style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="m 43.954613,94.209431 2.385742,2.385741 5.336779,-5.336779" - id="path1898" - sodipodi:nodetypes="ccc" /> - </g> - <text - xml:space="preserve" - style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" - x="20.208107" - y="70.786034" - id="text17157"><tspan - sodipodi:role="line" - id="tspan17155" - style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + id="g2" + transform="translate(4.9982594)"> + <g + id="g2299" + transform="matrix(0.74874537,0,0,0.74874537,-6.96828,-6.6072202)"> + <rect + style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect1783" + width="6.5330334" + height="6.5330334" + x="42.346821" + y="92.094666" /> + <path + style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 43.954613,94.209431 2.385742,2.385741 5.336779,-5.336779" + id="path1898" + sodipodi:nodetypes="ccc" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" x="20.208107" - y="70.786034">settings</tspan></text> + y="70.786034" + id="text17157"><tspan + sodipodi:role="line" + id="tspan17155" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="20.208107" + y="70.786034">settings</tspan></text> + </g> </g> <g id="g72496" @@ -292,22 +293,21 @@ y="68.529076">agents</tspan></text> </g> <g - id="g81155" - transform="translate(0,-1.9848942)"> + id="g1"> <text xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" x="43.218731" - y="55.738956" + y="53.754063" id="text26339"><tspan sodipodi:role="line" id="tspan26337" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.29167px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" x="43.218731" - y="55.738956">model</tspan></text> + y="53.754063">model</tspan></text> <g id="g69652" - transform="matrix(0.03465928,0,0,0.03465928,36.829475,23.859814)"> + transform="matrix(0.03465928,0,0,0.03465928,36.829475,21.87492)"> <path d="m 760,380 a 380,380 0 1 1 -760,0 380,380 0 1 1 760,0 z" fill="url(#sea)" @@ -323,17 +323,17 @@ xml:space="preserve" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.93889px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" x="32.382271" - y="60.07893" + y="58.094036" id="text75428"><tspan sodipodi:role="line" id="tspan75426" style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" x="32.382271" - y="60.07893">::AgentBasedModel</tspan></text> + y="58.094036">::SimulationModel</tspan></text> </g> <g id="g81435" - transform="translate(0,2.6027248)"> + transform="translate(0,1.0202776)"> <g id="g5042" transform="matrix(0.03318832,0,0,0.03318832,80.941666,18.331834)"> @@ -361,7 +361,7 @@ </g> <g id="g80986" - transform="translate(21.330012,-37.850443)"> + transform="translate(21.330012,-38.87134)"> <g id="g2091" transform="matrix(0.28429111,0,0,0.28429111,53.631813,58.093451)"> @@ -401,7 +401,7 @@ </g> <g id="g82065" - transform="translate(3.3894536,-1.2489369)"> + transform="translate(3.3894536,-2.8313841)"> <path id="path3924" sodipodi:nodetypes="cccccccccccssssccssssccssssccccccccccccssssccssssccsssssccssssccccccccccccssssccsssssccsssssccsssssccsssssccsssssccssssc" @@ -419,5 +419,69 @@ x="8.1108866" y="60.572594">rng</tspan></text> </g> + <g + id="g20772" + transform="translate(-6.8151277,9.1779317)"> + <g + id="g2810" + transform="matrix(1.2503212,0,0,1.2503212,-11.47161,-11.896543)"> + <path + d="m 49.989548,60.329899 h 5.689704 c 0.110127,0 0.21638,-0.04023 0.29922,-0.112792 0.304778,-0.266968 0.497239,-0.659004 0.497239,-1.096007 0,-0.804415 -0.652109,-1.456524 -1.456524,-1.456524 -0.01952,0 -0.03894,4.34e-4 -0.05828,0.0012 1e-6,-3.26e-4 1.1e-5,-7.12e-4 1.1e-5,-0.0012 0,-0.804416 -0.652109,-1.456524 -1.456524,-1.456524 -0.265307,0 -0.514021,0.07097 -0.728263,0.194905 -0.214241,-0.123937 -0.462956,-0.194905 -0.728262,-0.194905 -0.804416,0 -1.456524,0.652108 -1.456524,1.456524 0,4.34e-4 1e-5,9.25e-4 1e-5,0.0013 -0.7774,0.03059 -1.398279,0.670364 -1.398279,1.455263 0,0.437003 0.192462,0.82904 0.497238,1.096007 0.08284,0.07256 0.189094,0.112792 0.299222,0.112792 z" + id="path1457" + style="stroke-width:0.00284477" /> + <circle + style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="path2323" + cx="55.451946" + cy="57.113873" + r="1.9020891" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 55.451946,53.244022 v 1.416725" + id="path2438" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 57.663643,53.64691 -0.708362,1.226919" + id="path2771" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 59.276569,55.206144 -1.317334,0.521287" + id="path2773" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 59.503811,57.113872 -1.416724,10e-7" + id="path2775" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 53.431898,53.64691 0.708362,1.226919" + id="path2777" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 51.919701,55.206144 1.317334,0.521287" + id="path2779" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + d="m 57.807403,58.410821 1.317334,0.521287" + id="path2799" + sodipodi:nodetypes="cc" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:5.64444px;line-height:25%;font-family:'Latin Modern Mono Caps';-inkscape-font-specification:'Latin Modern Mono Caps, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="49.393562" + y="66.894287" + id="text17149"><tspan + sodipodi:role="line" + id="tspan17147" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:'Latin Modern Mono';-inkscape-font-specification:'Latin Modern Mono, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="49.393562" + y="66.894287">weather</tspan></text> + </g> </g> </svg> diff --git a/docs/build/assets/model_structure.pdf b/docs/build/assets/model_structure.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1d1ab62b68bafd692adbc076e0348255bf609ae9 Binary files /dev/null and b/docs/build/assets/model_structure.pdf differ diff --git a/docs/build/assets/model_structure.png b/docs/build/assets/model_structure.png new file mode 100644 index 0000000000000000000000000000000000000000..5888fd3f373f9a758ce0847e82b8c80d8dd4086f Binary files /dev/null and b/docs/build/assets/model_structure.png differ diff --git a/docs/build/assets/model_structure.svg b/docs/build/assets/model_structure.svg new file mode 100644 index 0000000000000000000000000000000000000000..7e0f4798d2c64f733862f593de1a22fbce1af85d --- /dev/null +++ b/docs/build/assets/model_structure.svg @@ -0,0 +1,2752 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + width="400mm" + height="400mm" + viewBox="0 0 400 400" + version="1.1" + id="svg5" + inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)" + sodipodi:docname="structure.svg" + inkscape:export-filename="/home/xo30xoqa/Documents/Promotion/Persefone/model/docs/model_structure.png" + inkscape:export-xdpi="300" + inkscape:export-ydpi="300" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <sodipodi:namedview + id="namedview7" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageshadow="2" + inkscape:pageopacity="0.0" + inkscape:pagecheckerboard="0" + inkscape:document-units="mm" + showgrid="false" + inkscape:zoom="0.38720869" + inkscape:cx="634.02502" + inkscape:cy="668.88994" + inkscape:window-width="1920" + inkscape:window-height="1043" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + inkscape:current-layer="layer1" + showguides="false" + width="160mm" + inkscape:snap-global="true" + inkscape:object-paths="false" + inkscape:snap-intersection-paths="false" /> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="DotM" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path36385" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow2Lend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Lend" + inkscape:isstock="true"> + <path + transform="scale(1.1) rotate(180) translate(1,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="stroke:context-stroke;fill-rule:evenodd;fill:context-stroke;stroke-width:0.62500000;stroke-linejoin:round;" + id="path36342" /> + </marker> + <marker + style="overflow:visible;" + id="marker36582" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Send" + inkscape:isstock="true"> + <path + transform="scale(0.2) rotate(180) translate(6,0)" + style="fill-rule:evenodd;fill:context-stroke;stroke:context-stroke;stroke-width:1.0pt;" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path36336" /> + </marker> + <marker + style="overflow:visible" + id="CurveOut" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="CurveOut" + inkscape:isstock="true"> + <path + transform="scale(0.6)" + style="fill:none;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="m -5.4129913,-5.0456926 c 2.76,0 4.99999999,2.24 4.99999999,5.00000002 0,2.75999998 -2.23999999,4.99999998 -4.99999999,4.99999998" + id="path4933" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Sstart" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Sstart" + inkscape:isstock="true"> + <path + transform="matrix(0.2,0,0,0.2,1.2,0)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path37360" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Send" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Send" + inkscape:isstock="true"> + <path + transform="matrix(-0.2,0,0,-0.2,-1.2,0)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path37363" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Mend" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Mend" + inkscape:isstock="true"> + <path + transform="matrix(-0.4,0,0,-0.4,-4,0)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path37357" /> + </marker> + <clipPath + id="clipPath3453" + clipPathUnits="userSpaceOnUse"> + <rect + id="rect3455" + style="fill:none;stroke:#ff0000;stroke-width:8.6;stroke-linecap:round;stroke-linejoin:round" + height="58.074001" + width="103.7" + y="43.592999" + x="-129.19" /> + </clipPath> + <clipPath + id="clipPath3453-7" + clipPathUnits="userSpaceOnUse"> + <rect + id="rect3455-2" + style="fill:none;stroke:#ff0000;stroke-width:8.6;stroke-linecap:round;stroke-linejoin:round" + height="58.074001" + width="103.7" + y="43.592999" + x="-129.19" /> + </clipPath> + <clipPath + id="clipPath6970" + clipPathUnits="userSpaceOnUse"> + <rect + id="rect6968" + style="fill:none;stroke:#ff0000;stroke-width:8.6;stroke-linecap:round;stroke-linejoin:round" + height="58.074001" + width="103.7" + y="43.592999" + x="-129.19" /> + </clipPath> + <marker + markerWidth="55.430588" + markerHeight="15.84155" + refX="27.715294" + refY="7.9207749" + orient="auto" + id="marker15694"> + <g + id="path14360" + transform="matrix(3.7795276,0,0,3.7795276,-476.02118,-786.94636)"> + <path + style="color:#000000;fill:#b3b3b3;fill-rule:evenodd;stroke-width:0.660198pt;-inkscape-stroke:none" + d="m 135.80092,212.40402 3.30099,-3.30099 -11.55347,3.30099 z" + id="path14364" + sodipodi:nodetypes="cccc" /> + <path + style="color:#000000;fill:#b3b3b3;fill-rule:evenodd;-inkscape-stroke:none" + d="m 140.61328,208.21289 -14.66601,4.19141 h 10.4746 z m -3.02344,1.7793 -2.41211,2.41211 h -6.02539 z" + id="path14366" + sodipodi:nodetypes="cccccccc" /> + </g> + </marker> + <marker + markerWidth="55.437996" + markerHeight="15.84155" + refX="27.718998" + refY="7.9207749" + orient="auto" + id="marker15711"> + <g + id="path14368" + transform="matrix(3.7795276,0,0,-3.7795276,-591.96113,802.78791)"> + <path + style="color:#000000;fill:#b3b3b3;fill-rule:evenodd;stroke-width:0.660198pt;-inkscape-stroke:none" + d="m 161.43709,212.40402 h 8.25248 l -11.55347,-3.30099 z" + id="path14372" + sodipodi:nodetypes="cccc" /> + <path + style="color:#000000;fill:#b3b3b3;fill-rule:evenodd;-inkscape-stroke:none" + d="m 156.62305,208.21289 4.1914,4.19141 h 10.47657 z m 3.02343,1.7793 8.43946,2.41211 h -6.02735 l -0.31054,-0.31055 z" + id="path14374" + sodipodi:nodetypes="ccccccccc" /> + </g> + </marker> + <marker + style="overflow:visible" + id="Arrow2Send" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Send" + inkscape:isstock="true"> + <path + transform="matrix(-0.3,0,0,-0.3,0.69,0)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round" + id="path5393" /> + </marker> + <marker + style="overflow:visible" + id="Arrow2Mend" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow2Mend" + inkscape:isstock="true"> + <path + transform="scale(-0.6)" + d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:0.625;stroke-linejoin:round" + id="path5387" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Lstart" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lstart" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,10,0)" + style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path5360" /> + </marker> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath3339"> + <path + id="path3341" + style="fill:#c4c4c3;stroke-width:3.05782;stroke-linecap:round;stroke-linejoin:round" + d="M 826.55876,670.19787 A 346.60782,346.60782 0 0 1 479.95094,1016.8057 346.60782,346.60782 0 0 1 133.34311,670.19787 346.60782,346.60782 0 0 1 479.95094,323.59006 346.60782,346.60782 0 0 1 826.55876,670.19787 Z" /> + </clipPath> + <clipPath + clipPathUnits="userSpaceOnUse" + id="clipPath2682"> + <path + d="M 0,660 H 660 V 0 H 0 Z" + id="path2680" + inkscape:connector-curvature="0" /> + </clipPath> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Background glow" + id="filter10443" + x="-0.075" + y="-0.047462495" + width="1.15" + height="1.094925"> + <feFlood + flood-opacity="0.698039" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood10433" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite10435" /> + <feGaussianBlur + in="composite1" + stdDeviation="2.5" + result="blur" + id="feGaussianBlur10437" /> + <feOffset + dx="0" + dy="0" + result="offset" + id="feOffset10439" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite10441" /> + </filter> + <filter + style="color-interpolation-filters:sRGB" + inkscape:label="Drop Shadow" + id="filter17455" + x="-0.0024175057" + y="-0.015541788" + width="1.0198325" + height="1.2948214"> + <feFlood + flood-opacity="0.2" + flood-color="rgb(0,0,0)" + result="flood" + id="feFlood17445" /> + <feComposite + in="flood" + in2="SourceGraphic" + operator="in" + result="composite1" + id="feComposite17447" /> + <feGaussianBlur + in="composite1" + stdDeviation="0" + result="blur" + id="feGaussianBlur17449" /> + <feOffset + dx="1" + dy="1" + result="offset" + id="feOffset17451" /> + <feComposite + in="SourceGraphic" + in2="offset" + operator="over" + result="composite2" + id="feComposite17453" /> + </filter> + <linearGradient + id="linearGradient28" + inkscape:collect="always"> + <stop + style="stop-color:#ffff00;stop-opacity:1" + offset="0" + id="stop28" /> + <stop + style="stop-color:#018900;stop-opacity:1" + offset="1" + id="stop29" /> + </linearGradient> + <filter + inkscape:label="Black Light" + inkscape:menu-tooltip="Light areas turn to black" + x="0" + y="0" + width="1" + height="1" + inkscape:menu="Color" + id="filter2984" + style="color-interpolation-filters:sRGB"> + <feColorMatrix + result="result2" + type="luminanceToAlpha" + id="feColorMatrix2986" /> + <feComposite + operator="arithmetic" + in="result2" + result="result4" + k3="2" + in2="SourceGraphic" + id="feComposite2988" + k1="0" + k2="0" + k4="0" /> + <feBlend + in="result4" + in2="result2" + mode="multiply" + result="result3" + id="feBlend2990" /> + <feComposite + in="result3" + in2="SourceGraphic" + operator="in" + id="feComposite2992" /> + </filter> + <filter + style="color-interpolation-filters:sRGB;" + inkscape:label="Drop Shadow" + id="filter21" + x="-0.040631821" + y="-0.040631821" + width="1.1151235" + height="1.0981936"> + <feFlood + result="flood" + in="SourceGraphic" + flood-opacity="0.498039" + flood-color="rgb(0,0,0)" + id="feFlood20" /> + <feGaussianBlur + result="blur" + in="SourceGraphic" + stdDeviation="1" + id="feGaussianBlur20" /> + <feOffset + result="offset" + in="blur" + dx="2.000000" + dy="1.000000" + id="feOffset20" /> + <feComposite + result="comp1" + operator="in" + in="flood" + in2="offset" + id="feComposite20" /> + <feComposite + result="comp2" + operator="over" + in="SourceGraphic" + in2="comp1" + id="feComposite21" /> + </filter> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient28" + id="linearGradient29" + x1="240.70584" + y1="189.45926" + x2="190.71454" + y2="117.66981" + gradientUnits="userSpaceOnUse" /> + </defs> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g2388" + transform="matrix(0.08739793,0,0,0.08739793,-35.282388,24.253508)" /> + <g + id="g4439" + transform="matrix(0.03027841,0,0,0.03027841,84.140629,53.861347)" /> + <g + style="overflow:visible" + id="g2213" + transform="matrix(0.02509707,0,0,0.02509707,129.10051,61.868007)" /> + <g + id="g27891" + transform="translate(-246.31015,76.392891)"> + <g + id="g20943" + transform="translate(44.50595,-1.783258)"> + <g + id="g132942" + transform="matrix(0.08739793,0,0,0.08739793,55.564035,-21.111939)"> + <rect + id="rect132926" + style="fill:#ffffff;stroke:#000000;stroke-width:3.1212;stroke-linecap:round;stroke-linejoin:round" + rx="10" + ry="10" + height="58.320999" + width="145.8" + y="448.85999" + x="547.29999" /> + <rect + id="rect132928" + style="fill:#ffffff;stroke:#000000;stroke-width:3.1212;stroke-linecap:round;stroke-linejoin:round" + height="39.464001" + width="87.325996" + y="498.72" + x="576.53998" /> + <path + id="path132930" + style="fill:none;stroke:#000000;stroke-width:4.0576;stroke-linecap:round" + d="M 561.88,468.75 H 677.2" /> + <rect + id="rect132932" + style="fill:#ffffff;stroke:#000000;stroke-width:3.1212;stroke-linecap:round;stroke-linejoin:round" + height="44.549" + width="87.482002" + y="404.06" + x="576.46002" /> + <path + id="path132934" + style="fill:none;stroke:#000000;stroke-width:2.0808" + d="m 587.07,527.07 h 66.27" /> + <path + id="path132936" + style="fill:none;stroke:#000000;stroke-width:2.0808" + d="m 587.07,520.44 h 66.27" /> + <path + id="path132938" + style="fill:none;stroke:#000000;stroke-width:2.0808" + d="m 587.07,513.81 h 66.27" /> + <path + id="path132940" + style="fill:none;stroke:#000000;stroke-width:2.0808" + d="m 587.07,507.19 h 66.27" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:25%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="100.25278" + y="31.726753" + id="text132946"><tspan + sodipodi:role="line" + id="tspan132944" + style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:4.23333px;font-family:Lato;-inkscape-font-specification:'Lato, Ultra-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#000000;stroke-width:0.264583" + x="100.25278" + y="31.726753">Input data</tspan></text> + </g> + <circle + style="fill:#000000;fill-opacity:0;stroke:#30123b;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle14316" + cx="154.50595" + cy="21.465382" + r="19.815086" /> + </g> + <path + style="opacity:1;fill:#999999;fill-opacity:0;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:3.301;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path22646" + sodipodi:type="arc" + sodipodi:cx="-64.889015" + sodipodi:cy="210.55891" + sodipodi:rx="38.048183" + sodipodi:ry="38.048183" + sodipodi:start="0" + sodipodi:end="6.2793942" + sodipodi:arc-type="arc" + sodipodi:open="true" + d="m -26.840832,210.55891 a 38.048183,38.048183 0 0 1 -38.012122,38.04817 38.048183,38.048183 0 0 1 -38.084176,-37.97604 38.048183,38.048183 0 0 1 37.939931,-38.12016 38.048183,38.048183 0 0 1 38.156094,37.90379" /> + <path + style="opacity:1;fill:#999999;fill-opacity:0;fill-rule:nonzero;stroke:#b3b3b3;stroke-width:3.301;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)" + id="path31328" + sodipodi:type="arc" + sodipodi:cx="95.128777" + sodipodi:cy="29.354258" + sodipodi:rx="14.241" + sodipodi:ry="14.241011" + sodipodi:start="0.65813965" + sodipodi:end="4.6174873" + sodipodi:arc-type="arc" + d="M 106.39528,38.064717 A 14.241,14.241011 0 0 1 89.489743,42.431246 14.241,14.241011 0 0 1 81.060958,27.140083 14.241,14.241011 0 0 1 93.779309,15.177328" + transform="rotate(103.23593)" + sodipodi:open="true" /> + <path + id="path28197" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#Arrow1Send)" + d="m -355.20843,90.862221 c 1.87903,12.303819 14.49353,15.232369 20.43437,15.243629 6.01653,0.0114 5.18509,-0.34585 10.63057,-1.38208" + sodipodi:nodetypes="csc" /> + <g + id="g28035" + transform="translate(-376.86892,47.991781)"> + <g + id="g13107" + transform="translate(1.5399969,-20.369444)"> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="20.002993" + y="45.974438" + id="text2055"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="20.002993" + y="45.974438" + id="tspan2053">Governments</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="20.002993" + y="50.470592" + id="tspan4431">set agricultural</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="20.002993" + y="54.966747" + id="tspan4433">policy</tspan></text> + <g + id="g4213" + transform="matrix(0.32385197,0,0,0.32385197,55.851641,0.216017)"> + <rect + id="rect2296" + style="fill:#ffffff;stroke:#000000;stroke-width:0.776942;stroke-linecap:round;stroke-linejoin:round" + height="30.248955" + width="22.790308" + y="86.29615" + x="-118.64338" /> + <rect + id="rect2294" + style="fill:#ffffff;stroke:#000000;stroke-width:0.776942;stroke-linecap:round;stroke-linejoin:round" + height="30.248955" + width="22.790308" + y="90.025475" + x="-121.54396" /> + <rect + id="rect2280" + style="fill:#ffffff;stroke:#000000;stroke-width:0.776942;stroke-linecap:round;stroke-linejoin:round" + height="30.248955" + width="22.790308" + y="93.340424" + x="-124.44454" /> + <path + id="path2284" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -121.0778,106.60024 h 16.05681" /> + <path + id="path2286" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -121.0778,110.74394 h 16.05681" /> + <path + id="path2288" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -121.0778,114.88763 h 16.05681" /> + <path + id="path2290" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -121.0778,119.03132 h 16.05681" /> + <path + id="path2282" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -115.65839,102.45655 h 10.6374" + sodipodi:nodetypes="cc" /> + <path + id="path2292" + style="fill:none;stroke:#000000;stroke-width:0.541477" + d="m -115.65839,98.312858 h 10.6374" + sodipodi:nodetypes="cc" /> + <text + xml:space="preserve" + style="font-size:3.52777px;line-height:1.25;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Normal';word-spacing:0px;stroke-width:0.264583" + x="-121.10752" + y="103.18294" + id="text2181"><tspan + sodipodi:role="line" + id="tspan2179" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.46667px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="-121.10752" + y="103.18294">§</tspan></text> + </g> + </g> + <circle + style="fill:#000000;fill-opacity:0;stroke:#4686fb;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle7800" + cx="21.465382" + cy="21.465382" + r="19.815086" /> + </g> + <path + id="path22813" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#Arrow1Send)" + d="m -300.11022,157.08969 c -2.68096,-5.30153 -4.08321,-11.15719 -4.09447,-17.09803 -0.0114,-6.01654 0.34584,-5.18509 1.38207,-10.63057" + sodipodi:nodetypes="csc" /> + <path + id="path23200" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-end:url(#Arrow1Send)" + d="m -232.17419,157.03273 c -6.45849,12.82488 -19.58704,20.92135 -33.94633,20.93496 -3.53682,0.003 0.0484,-0.15274 -3.1274,-0.17306" + sodipodi:nodetypes="csc" /> + <path + id="path23888" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Sstart)" + d="m -142.31918,149.96785 c 1.56664,-5.32811 1.7981,-6.86783 1.7981,-10.04835 l -5.3e-4,-0.14418 c -0.0225,-5.9435 -1.4372,-11.79906 -4.13055,-17.09732" + sodipodi:nodetypes="ccsc" /> + <path + id="path24054" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Sstart)" + d="m -175.158,102.16801 c -3.5194,-0.29632 0.0452,-0.30643 -3.5194,-0.29632 v 0 c -14.29246,0.0405 -27.35664,8.08731 -33.82324,20.83325" + sodipodi:nodetypes="cssc" /> + <path + id="path1607" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Sstart)" + d="m -235.35132,116.20144 c -1.99356,-2.91542 0.26608,-0.15853 -1.99356,-2.91542 v 0 c -9.06017,-11.05394 -23.5509,-16.097999 -37.51661,-13.0591" + sodipodi:nodetypes="cssc" /> + <path + id="path30702" + style="fill:#999999;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.301;stroke-linejoin:round;marker-end:url(#Arrow1Send)" + d="m -309.17432,86.475371 c -4.09718,-5.04959 -5.19243,-13.36034 -1.288,-18.56041 5.35663,-7.13416 15.36753,-6.89536 21.13198,-3.88598 7.67797,4.00836 4.98968,11.23097 4.33117,14.97385" + sodipodi:nodetypes="cssc" /> + <g + id="g44631" + transform="translate(-381.86892,42.991781)"> + <g + id="g44613" + transform="translate(0,1.8569878)"> + <g + id="g154575" + transform="matrix(0.02928298,0,0,0.02928298,78.79242,46.05055)"> + <g + id="g154559" + inkscape:label="Layer"> + <g + id="g154557"> + <path + d="M 166.5715,474.24796 H 395.04783 C 385.44806,429.13262 373.95891,354.91372 378.9045,336.72142 387.04982,305.86995 413.37165,282.583 423.26283,257.84337 473.58391,132.10494 412.09695,22.63846 273.03029,8.1144482 150.23528,-4.7116445 81.932348,65.015038 72.330536,137.05347 c -1.0175,7.713 0,15.42602 3.63671,23.43044 -16.869677,26.34112 -55.702196,65.19879 -59.046019,83.8266 -2.036815,11.20561 11.19801,15.1349 17.597755,19.06448 6.10863,2.03765 12.798038,0.58182 16.869666,5.53018 2.908719,3.63846 -1.0175,9.75058 -1.891186,14.26212 -0.145629,7.42189 -8.869916,11.06036 -7.998012,17.9 0.873708,5.82128 5.817515,8.14999 10.326118,11.78815 4.79974,3.78343 -12.217238,11.06006 -6.691157,17.75473 5.671644,6.54853 13.962828,14.11627 11.052459,23.43018 -4.217499,14.40739 -12.362812,29.39586 -5.671644,40.60234 6.691157,11.06035 15.99774,17.60887 30.395508,20.51894 22.541596,0 45.229356,0.43946 67.917096,0.43946 7.85245,6.83965 13.37852,28.96005 17.74362,58.64849 h -0.004 z" + id="path154555" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ccccccccccccccccccccc" /> + </g> + </g> + <path + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#cccccc;fill-opacity:1;fill-rule:nonzero;stroke:#090909;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:4.1;stroke-opacity:1;marker:none;enable-background:accumulate" + d="m 162.25124,62.055234 c 42.03173,-28.708405 104.13048,-33.737267 153.99839,-14.961791 40.11732,15.104338 84.04067,58.162547 89.31546,96.606517 5.47592,39.90986 -2.29083,82.42665 -20.05041,103.89757 -26.73388,19.0951 -9.72141,22.19264 -36.45528,29.16423 6.37967,15.1897 -30.987,42.22738 -24.60733,57.41708 -4.25312,-0.60759 -8.50623,-1.21517 -12.75935,-1.82276 -14.27832,-18.22764 16.10109,-50.12602 1.82277,-68.35366 -40.70391,-29.52874 -90.71533,4.63209 -150.37807,6.37967 C 132.70588,270.03156 108.63451,234.5524 104.80896,192.9146 98.074832,153.59088 120.33598,90.684086 162.25124,62.055234 Z" + id="path154561" + inkscape:connector-curvature="0" + sodipodi:nodetypes="ssscccccccs" /> + <g + id="g154565" + inkscape:label="#g4369" + transform="matrix(0.3138106,0,0,0.3138106,254.61602,130.98507)"> + <path + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:4.1;stroke-opacity:1;marker:none;enable-background:accumulate" + d="m 0,-217.03125 c -1.6782504,0 -3.3534511,0.0236 -5.03125,0.0625 -7.719137,11.79962 -11.418202,21.89432 -13.0625,28.75 -1.644299,6.85568 -1.28125,10.4375 -1.28125,10.4375 l 0.15625,1.25 c -5.715457,0.62266 -11.403116,1.51351 -17.03125,2.6875 l -0.25,-1.21875 c 0,0 -0.786408,-3.55048 -4.46875,-9.5625 -3.682341,-6.01202 -10.293631,-14.44449 -21.28125,-23.28125 -3.215422,0.96289 -6.426446,1.98277 -9.59375,3.09375 -3.695053,13.60745 -4.085949,24.34675 -3.53125,31.375 0.5547,7.02825 2.03125,10.34375 2.03125,10.34375 l 0.5,1.15625 c -5.24331,2.35836 -10.385108,4.95678 -15.375,7.8125 l -0.59375,-1.0625 c 0,0 -1.82757,-3.13888 -7.1875,-7.71875 -5.35993,-4.57986 -14.28819,-10.58485 -27.46875,-15.59375 -2.7605,1.90939 -5.48728,3.87089 -8.15625,5.90625 0.69073,14.08329 3.64435,24.42464 6.34375,30.9375 2.6994,6.51285 5.125,9.21875 5.125,9.21875 l 0.84375,0.9375 c -4.25791,3.86321 -8.32429,7.92959 -12.1875,12.1875 l -0.9375,-0.84375 c 0,0 -2.7059,-2.4256 -9.21875,-5.125 -6.51286,-2.6994 -16.85421,-5.65302 -30.9375,-6.34375 -2.03536,2.66897 -3.99686,5.39575 -5.90625,8.15625 5.0089,13.18056 11.01389,22.10882 15.59375,27.46875 4.57987,5.35993 7.71875,7.1875 7.71875,7.1875 l 1.0625,0.59375 c -2.85572,4.989892 -5.45414,10.13169 -7.8125,15.375 l -1.15625,-0.5 c 0,0 -3.3155,-1.47655 -10.34375,-2.03125 -7.02825,-0.554699 -17.76755,-0.163803 -31.375,3.53125 -1.11098,3.167304 -2.13086,6.378328 -3.09375,9.59375 8.83676,10.987619 17.26923,17.598909 23.28125,21.28125 6.01202,3.682342 9.5625,4.46875 9.5625,4.46875 l 1.21875,0.25 c -1.17399,5.628134 -2.06484,11.315793 -2.6875,17.03125 l -1.25,-0.15625 c 0,0 -3.58182,-0.363049 -10.4375,1.28125 -6.85568,1.644298 -16.95038,5.343363 -28.75,13.0625 -0.0779,3.3555978 -0.0779,6.7069022 0,10.0625 11.79962,7.719137 21.89432,11.418202 28.75,13.0625 6.85568,1.644299 10.4375,1.28125 10.4375,1.28125 l 1.25,-0.15625 c 0.62266,5.715457 1.51351,11.403116 2.6875,17.03125 l -1.21875,0.25 c 0,0 -3.55048,0.786408 -9.5625,4.46875 -6.01202,3.682341 -14.44449,10.293631 -23.28125,21.28125 0.96289,3.215422 1.98277,6.426446 3.09375,9.59375 13.60745,3.695053 24.34675,4.085949 31.375,3.53125 7.02825,-0.5547 10.34375,-2.03125 10.34375,-2.03125 l 1.15625,-0.5 c 2.35836,5.24331 4.95678,10.385108 7.8125,15.375 l -1.0625,0.59375 c 0,0 -3.13888,1.82757 -7.71875,7.1875 -4.57986,5.35993 -10.58485,14.28819 -15.59375,27.46875 1.90939,2.7605 3.87089,5.48728 5.90625,8.15625 14.08329,-0.69073 24.42464,-3.64435 30.9375,-6.34375 6.51285,-2.6994 9.21875,-5.125 9.21875,-5.125 l 0.9375,-0.84375 c 3.86321,4.25791 7.92959,8.32429 12.1875,12.1875 l -0.84375,0.9375 c 0,0 -2.4256,2.7059 -5.125,9.21875 -2.6994,6.51286 -5.65302,16.85421 -6.34375,30.9375 2.66897,2.03536 5.39575,3.99686 8.15625,5.90625 13.18056,-5.0089 22.10882,-11.01389 27.46875,-15.59375 5.35993,-4.57987 7.1875,-7.71875 7.1875,-7.71875 l 0.59375,-1.0625 c 4.989892,2.85572 10.13169,5.45414 15.375,7.8125 l -0.5,1.15625 c 0,0 -1.47655,3.3155 -2.03125,10.34375 -0.554699,7.02825 -0.163803,17.76755 3.53125,31.375 3.167304,1.11098 6.378328,2.13086 9.59375,3.09375 10.987619,-8.83676 17.598909,-17.26923 21.28125,-23.28125 3.682342,-6.01202 4.46875,-9.5625 4.46875,-9.5625 l 0.25,-1.21875 c 5.628134,1.17399 11.315793,2.06484 17.03125,2.6875 l -0.15625,1.25 c 0,0 -0.363049,3.58182 1.28125,10.4375 1.644298,6.85568 5.343363,16.95038 13.0625,28.75 3.3555978,0.0779 6.7069022,0.0779 10.0625,0 7.719137,-11.79962 11.418202,-21.89432 13.0625,-28.75 1.644299,-6.85568 1.28125,-10.4375 1.28125,-10.4375 l -0.15625,-1.25 c 5.715457,-0.62266 11.403116,-1.51351 17.03125,-2.6875 l 0.25,1.21875 c 0,0 0.786408,3.55048 4.46875,9.5625 3.682341,6.01202 10.293631,14.44449 21.28125,23.28125 3.215422,-0.96289 6.426446,-1.98277 9.59375,-3.09375 3.695053,-13.60745 4.085949,-24.34675 3.53125,-31.375 -0.5547,-7.02825 -2.03125,-10.34375 -2.03125,-10.34375 l -0.5,-1.15625 c 5.24331,-2.35836 10.385108,-4.95678 15.375,-7.8125 l 0.59375,1.0625 c 0,0 1.82757,3.13888 7.1875,7.71875 5.35993,4.57986 14.28819,10.58485 27.46875,15.59375 2.7605,-1.90939 5.48728,-3.87089 8.15625,-5.90625 -0.69073,-14.08329 -3.64435,-24.42464 -6.34375,-30.9375 -2.6994,-6.51285 -5.125,-9.21875 -5.125,-9.21875 L 119.3125,131.5 c 4.25791,-3.86321 8.32429,-7.92959 12.1875,-12.1875 l 0.9375,0.84375 c 0,0 2.7059,2.4256 9.21875,5.125 6.51286,2.6994 16.85421,5.65302 30.9375,6.34375 2.03536,-2.66897 3.99686,-5.39575 5.90625,-8.15625 C 173.4911,110.28819 167.48611,101.35993 162.90625,96 158.32638,90.64007 155.1875,88.8125 155.1875,88.8125 l -1.0625,-0.59375 c 2.85572,-4.989892 5.45414,-10.13169 7.8125,-15.375 l 1.15625,0.5 c 0,0 3.3155,1.47655 10.34375,2.03125 7.02825,0.554699 17.76755,0.163803 31.375,-3.53125 1.11098,-3.167304 2.13086,-6.378328 3.09375,-9.59375 C 199.06949,51.262381 190.63702,44.651091 184.625,40.96875 178.61298,37.286408 175.0625,36.5 175.0625,36.5 l -1.21875,-0.25 c 1.17399,-5.628134 2.06484,-11.315793 2.6875,-17.03125 l 1.25,0.15625 c 0,0 3.58182,0.363049 10.4375,-1.28125 6.85568,-1.644298 16.95038,-5.343363 28.75,-13.0625 0.0779,-3.3555978 0.0779,-6.7069022 0,-10.0625 -11.79962,-7.719137 -21.89432,-11.418202 -28.75,-13.0625 -6.85568,-1.644299 -10.4375,-1.28125 -10.4375,-1.28125 l -1.25,0.15625 c -0.62266,-5.715457 -1.51351,-11.403116 -2.6875,-17.03125 l 1.21875,-0.25 c 0,0 3.55048,-0.786408 9.5625,-4.46875 6.01202,-3.682341 14.44449,-10.293631 23.28125,-21.28125 -0.96289,-3.215422 -1.98277,-6.426446 -3.09375,-9.59375 -13.60745,-3.695053 -24.34675,-4.085949 -31.375,-3.53125 -7.02825,0.5547 -10.34375,2.03125 -10.34375,2.03125 l -1.15625,0.5 c -2.35836,-5.24331 -4.95678,-10.385108 -7.8125,-15.375 l 1.0625,-0.59375 c 0,0 3.13888,-1.82757 7.71875,-7.1875 4.57986,-5.35993 10.58485,-14.28819 15.59375,-27.46875 -1.90939,-2.7605 -3.87089,-5.48728 -5.90625,-8.15625 -14.08329,0.69073 -24.42464,3.64435 -30.9375,6.34375 -6.51285,2.6994 -9.21875,5.125 -9.21875,5.125 l -0.9375,0.84375 c -3.86321,-4.25791 -7.92959,-8.32429 -12.1875,-12.1875 l 0.84375,-0.9375 c 0,0 2.4256,-2.7059 5.125,-9.21875 2.6994,-6.51286 5.65302,-16.85421 6.34375,-30.9375 -2.66897,-2.03536 -5.39575,-3.99686 -8.15625,-5.90625 -13.18056,5.0089 -22.10882,11.01389 -27.46875,15.59375 -5.35993,4.57987 -7.1875,7.71875 -7.1875,7.71875 l -0.59375,1.0625 c -4.989892,-2.85572 -10.13169,-5.45414 -15.375,-7.8125 l 0.5,-1.15625 c 0,0 1.47655,-3.3155 2.03125,-10.34375 0.554699,-7.02825 0.163803,-17.76755 -3.53125,-31.375 -3.167304,-1.11098 -6.378328,-2.13086 -9.59375,-3.09375 -10.987619,8.83676 -17.598909,17.26923 -21.28125,23.28125 -3.682342,6.01202 -4.46875,9.5625 -4.46875,9.5625 l -0.25,1.21875 c -5.628134,-1.17399 -11.315793,-2.06484 -17.03125,-2.6875 l 0.15625,-1.25 c 0,0 0.363049,-3.58182 -1.28125,-10.4375 -1.644298,-6.85568 -5.343363,-16.95038 -13.0625,-28.75 -1.6777989,-0.0389 -3.3529996,-0.0625 -5.03125,-0.0625 z M 0,-140 c 80,0 140,60 140,140 0,80 -60,140 -140,140 -80,0 -140,-60 -140,-140 0,-80 60,-140 140,-140 z" + id="path154563" + inkscape:connector-curvature="0"> + <animateTransform + repeatCount="indefinite" + type="rotate" + fill="freeze" + dur="18000ms" + begin="0ms" + additive="sum" + attributeName="transform" + id="animateTransform4444" + values="0 0 0;720 0 0" /> + </path> + </g> + <g + id="g154569" + transform="matrix(0.3138106,0,0,0.3138106,254.61602,130.98507)"> + <path + inkscape:label="#path4359" + id="path154567" + d="m 169.17851,270.5663 c 0,0 -2.31809,1.98975 -7.90857,3.7957 -5.59047,1.80596 -14.46421,3.37748 -26.16349,2.28817 -1.60686,-2.40859 -3.13797,-4.86772 -4.59027,-7.37253 4.18516,-10.97926 9.5112,-18.2488 13.59878,-22.46858 4.08758,-4.21979 6.89604,-5.42194 6.89604,-5.42194 l 7.97044,-3.33242 c -2.56043,-6.12399 -4.50064,-12.5071 -5.78135,-19.02008 l -8.4767,1.66685 c 0,0 -3.0024,0.56412 -8.74687,-0.66711 -5.74448,-1.23124 -14.21511,-4.30713 -23.80234,-11.10014 -0.18729,-2.88933 -0.2837,-5.78455 -0.28903,-8.67993 9.11409,-7.41575 17.36134,-11.04833 23.01118,-12.65898 5.64984,-1.61065 8.68312,-1.24751 8.68312,-1.24751 l 8.56881,1.09925 c 0.8446,-6.58374 2.35588,-13.08178 4.50325,-19.36254 l -8.17446,-2.79482 c 0,0 -2.88222,-1.01265 -7.24146,-4.95117 -4.35924,-3.93852 -10.15708,-10.83764 -15.06336,-21.51417 1.28247,-2.59588 2.64658,-5.15141 4.08966,-7.66156 11.6009,-1.86517 20.55952,-0.88745 26.25775,0.5426 5.69824,1.43006 8.14356,3.26118 8.14356,3.26118 l 6.87118,5.23639 c 4.02332,-5.27939 8.58115,-10.15122 13.5812,-14.51683 l -5.68188,-6.50762 c 0,0 -1.98975,-2.31809 -3.7957,-7.90857 -1.80596,-5.59047 -3.37748,-14.464206 -2.28817,-26.16349 2.40859,-1.606865 4.86772,-3.137965 7.37253,-4.590275 10.97926,4.185161 18.2488,9.511201 22.46858,13.598781 4.21979,4.08758 5.42194,6.896044 5.42194,6.896044 l 3.33242,7.97044 c 6.12399,-2.56043 12.5071,-4.50064 19.02008,-5.78135 l -1.66685,-8.476702 c 0,0 -0.56412,-3.0024 0.66711,-8.746873 1.23124,-5.744472 4.30713,-14.215108 11.10014,-23.802332 2.88933,-0.187294 5.78455,-0.283701 8.67993,-0.289032 7.41575,9.114089 11.04833,17.361341 12.65898,23.011182 1.61065,5.649841 1.24751,8.683118 1.24751,8.683118 l -1.09925,8.568809 c 6.58374,0.8446 13.08178,2.35588 19.36254,4.50325 l 2.79482,-8.174465 c 0,0 1.01265,-2.882215 4.95117,-7.241457 3.93852,-4.359242 10.83764,-10.157081 21.51417,-15.063355 2.59588,1.282462 5.15141,2.64658 7.66156,4.089657 1.86517,11.600903 0.88745,20.55952 -0.5426,26.25775 -1.43006,5.69824 -3.26118,8.14356 -3.26118,8.14356 l -5.23639,6.87118 c 5.27939,4.02332 10.15122,8.58115 14.51683,13.5812 l 6.50762,-5.68188 c 0,0 2.31809,-1.98975 7.90857,-3.7957 5.59047,-1.80596 14.46421,-3.37748 26.16349,-2.28817 1.60686,2.40859 3.13797,4.86772 4.59027,7.37253 -4.18516,10.97926 -9.5112,18.2488 -13.59878,22.46858 -4.08758,4.21979 -6.89604,5.42194 -6.89604,5.42194 l -7.97044,3.33242 c 2.56043,6.12399 4.50064,12.5071 5.78135,19.02008 l 8.4767,-1.66685 c 0,0 3.0024,-0.56412 8.74687,0.66711 5.74448,1.23124 14.21511,4.30713 23.80234,11.10014 0.18729,2.88933 0.2837,5.78455 0.28903,8.67993 -9.11409,7.41575 -17.36134,11.04833 -23.01118,12.65898 -5.64984,1.61065 -8.68312,1.24751 -8.68312,1.24751 l -8.56881,-1.09925 c -0.8446,6.58374 -2.35588,13.08178 -4.50325,19.36254 l 8.17446,2.79482 c 0,0 2.88222,1.01265 7.24146,4.95117 4.35924,3.93852 10.15708,10.83764 15.06336,21.51417 -1.28247,2.59588 -2.64658,5.15141 -4.08966,7.66156 -11.6009,1.86517 -20.55952,0.88745 -26.25775,-0.5426 -5.69824,-1.43006 -8.14356,-3.26118 -8.14356,-3.26118 l -6.87118,-5.23639 c -4.02332,5.27939 -8.58115,10.15122 -13.5812,14.51683 l 5.68188,6.50762 c 0,0 1.98975,2.31809 3.7957,7.90857 1.80596,5.59047 3.37748,14.46421 2.28817,26.16349 -2.40859,1.60686 -4.86772,3.13797 -7.37253,4.59027 -10.97926,-4.18516 -18.2488,-9.5112 -22.46858,-13.59878 -4.21979,-4.08758 -5.42194,-6.89604 -5.42194,-6.89604 l -3.33242,-7.97044 c -6.12399,2.56043 -12.5071,4.50064 -19.02008,5.78135 l 1.66685,8.4767 c 0,0 0.56412,3.0024 -0.66711,8.74687 -1.23124,5.74448 -4.30713,14.21511 -11.10014,23.80234 -2.88933,0.18729 -5.78455,0.2837 -8.67993,0.28903 -7.41575,-9.11409 -11.04833,-17.36134 -12.65898,-23.01118 -1.61065,-5.64984 -1.24751,-8.68312 -1.24751,-8.68312 l 1.09925,-8.56881 c -6.58374,-0.8446 -13.08178,-2.35588 -19.36254,-4.50325 l -2.79482,8.17446 c 0,0 -1.01265,2.88222 -4.95117,7.24146 -3.93852,4.35924 -10.83764,10.15708 -21.51417,15.06336 -2.59588,-1.28247 -5.15141,-2.64658 -7.66156,-4.08966 -1.86517,-11.6009 -0.88745,-20.55952 0.5426,-26.25775 1.43006,-5.69824 3.26118,-8.14356 3.26118,-8.14356 l 5.23639,-6.87118 c -5.27939,-4.02332 -10.15122,-8.58115 -14.51683,-13.5812 l -6.50762,5.68188" + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:4.1;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0"> + <animateTransform + values="0 250 200;-720 250 200" + id="animateTransform4447" + attributeName="transform" + additive="sum" + begin="0ms" + dur="10800ms" + fill="freeze" + type="rotate" + repeatCount="indefinite" /> + </path> + </g> + <g + id="g154573" + transform="matrix(0.3138106,0,0,0.3138106,98.616015,132.98507)"> + <path + inkscape:label="#path4359" + id="path154571" + d="m 169.17851,270.5663 c 0,0 -2.31809,1.98975 -7.90857,3.7957 -5.59047,1.80596 -14.46421,3.37748 -26.16349,2.28817 -1.60686,-2.40859 -3.13797,-4.86772 -4.59027,-7.37253 4.18516,-10.97926 9.5112,-18.2488 13.59878,-22.46858 4.08758,-4.21979 6.89604,-5.42194 6.89604,-5.42194 l 7.97044,-3.33242 c -2.56043,-6.12399 -4.50064,-12.5071 -5.78135,-19.02008 l -8.4767,1.66685 c 0,0 -3.0024,0.56412 -8.74687,-0.66711 -5.74448,-1.23124 -14.21511,-4.30713 -23.80234,-11.10014 -0.18729,-2.88933 -0.2837,-5.78455 -0.28903,-8.67993 9.11409,-7.41575 17.36134,-11.04833 23.01118,-12.65898 5.64984,-1.61065 8.68312,-1.24751 8.68312,-1.24751 l 8.56881,1.09925 c 0.8446,-6.58374 2.35588,-13.08178 4.50325,-19.36254 l -8.17446,-2.79482 c 0,0 -2.88222,-1.01265 -7.24146,-4.95117 -4.35924,-3.93852 -10.15708,-10.83764 -15.06336,-21.51417 1.28247,-2.59588 2.64658,-5.15141 4.08966,-7.66156 11.6009,-1.86517 20.55952,-0.88745 26.25775,0.5426 5.69824,1.43006 8.14356,3.26118 8.14356,3.26118 l 6.87118,5.23639 c 4.02332,-5.27939 8.58115,-10.15122 13.5812,-14.51683 l -5.68188,-6.50762 c 0,0 -1.98975,-2.31809 -3.7957,-7.90857 -1.80596,-5.59047 -3.37748,-14.464206 -2.28817,-26.16349 2.40859,-1.606865 4.86772,-3.137965 7.37253,-4.590275 10.97926,4.185161 18.2488,9.511201 22.46858,13.598781 4.21979,4.08758 5.42194,6.896044 5.42194,6.896044 l 3.33242,7.97044 c 6.12399,-2.56043 12.5071,-4.50064 19.02008,-5.78135 l -1.66685,-8.476702 c 0,0 -0.56412,-3.0024 0.66711,-8.746873 1.23124,-5.744472 4.30713,-14.215108 11.10014,-23.802332 2.88933,-0.187294 5.78455,-0.283701 8.67993,-0.289032 7.41575,9.114089 11.04833,17.361341 12.65898,23.011182 1.61065,5.649841 1.24751,8.683118 1.24751,8.683118 l -1.09925,8.568809 c 6.58374,0.8446 13.08178,2.35588 19.36254,4.50325 l 2.79482,-8.174465 c 0,0 1.01265,-2.882215 4.95117,-7.241457 3.93852,-4.359242 10.83764,-10.157081 21.51417,-15.063355 2.59588,1.282462 5.15141,2.64658 7.66156,4.089657 1.86517,11.600903 0.88745,20.55952 -0.5426,26.25775 -1.43006,5.69824 -3.26118,8.14356 -3.26118,8.14356 l -5.23639,6.87118 c 5.27939,4.02332 10.15122,8.58115 14.51683,13.5812 l 6.50762,-5.68188 c 0,0 2.31809,-1.98975 7.90857,-3.7957 5.59047,-1.80596 14.46421,-3.37748 26.16349,-2.28817 1.60686,2.40859 3.13797,4.86772 4.59027,7.37253 -4.18516,10.97926 -9.5112,18.2488 -13.59878,22.46858 -4.08758,4.21979 -6.89604,5.42194 -6.89604,5.42194 l -7.97044,3.33242 c 2.56043,6.12399 4.50064,12.5071 5.78135,19.02008 l 8.4767,-1.66685 c 0,0 3.0024,-0.56412 8.74687,0.66711 5.74448,1.23124 14.21511,4.30713 23.80234,11.10014 0.18729,2.88933 0.2837,5.78455 0.28903,8.67993 -9.11409,7.41575 -17.36134,11.04833 -23.01118,12.65898 -5.64984,1.61065 -8.68312,1.24751 -8.68312,1.24751 l -8.56881,-1.09925 c -0.8446,6.58374 -2.35588,13.08178 -4.50325,19.36254 l 8.17446,2.79482 c 0,0 2.88222,1.01265 7.24146,4.95117 4.35924,3.93852 10.15708,10.83764 15.06336,21.51417 -1.28247,2.59588 -2.64658,5.15141 -4.08966,7.66156 -11.6009,1.86517 -20.55952,0.88745 -26.25775,-0.5426 -5.69824,-1.43006 -8.14356,-3.26118 -8.14356,-3.26118 l -6.87118,-5.23639 c -4.02332,5.27939 -8.58115,10.15122 -13.5812,14.51683 l 5.68188,6.50762 c 0,0 1.98975,2.31809 3.7957,7.90857 1.80596,5.59047 3.37748,14.46421 2.28817,26.16349 -2.40859,1.60686 -4.86772,3.13797 -7.37253,4.59027 -10.97926,-4.18516 -18.2488,-9.5112 -22.46858,-13.59878 -4.21979,-4.08758 -5.42194,-6.89604 -5.42194,-6.89604 l -3.33242,-7.97044 c -6.12399,2.56043 -12.5071,4.50064 -19.02008,5.78135 l 1.66685,8.4767 c 0,0 0.56412,3.0024 -0.66711,8.74687 -1.23124,5.74448 -4.30713,14.21511 -11.10014,23.80234 -2.88933,0.18729 -5.78455,0.2837 -8.67993,0.28903 -7.41575,-9.11409 -11.04833,-17.36134 -12.65898,-23.01118 -1.61065,-5.64984 -1.24751,-8.68312 -1.24751,-8.68312 l 1.09925,-8.56881 c -6.58374,-0.8446 -13.08178,-2.35588 -19.36254,-4.50325 l -2.79482,8.17446 c 0,0 -1.01265,2.88222 -4.95117,7.24146 -3.93852,4.35924 -10.83764,10.15708 -21.51417,15.06336 -2.59588,-1.28247 -5.15141,-2.64658 -7.66156,-4.08966 -1.86517,-11.6009 -0.88745,-20.55952 0.5426,-26.25775 1.43006,-5.69824 3.26118,-8.14356 3.26118,-8.14356 l 5.23639,-6.87118 c -5.27939,-4.02332 -10.15122,-8.58115 -14.51683,-13.5812 l -6.50762,5.68188" + style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dashoffset:4.1;stroke-opacity:1;marker:none;enable-background:accumulate" + inkscape:connector-curvature="0"> + <animateTransform + values="0 250 200;-720 250 200" + id="animateTransform4447-0" + attributeName="transform" + additive="sum" + begin="0ms" + dur="10800ms" + fill="freeze" + type="rotate" + repeatCount="indefinite" /> + </path> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="85.359886" + y="65.993126" + id="text154579"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke-width:0.264583" + x="85.359886" + y="65.993126" + id="tspan7085">Farmers take</tspan><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke-width:0.264583" + x="85.359886" + y="70.489281" + id="tspan7087">decisions</tspan></text> + </g> + <circle + style="fill:#000000;fill-opacity:0;stroke:#a2fc3c;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle7798" + cx="85.47728" + cy="60.238766" + r="19.815086" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-349.81116" + y="113.08743" + id="text2055-2"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-349.81116" + y="113.08743" + id="tspan4433-4">regulations and</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-349.81116" + y="117.58359" + id="tspan35895">subsidies</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-297.04868" + y="54.253963" + id="text36993"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-297.04868" + y="54.253963" + id="tspan36991">social factors,</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-297.04868" + y="58.750118" + id="tspan38097">norms, learning</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-251.20984" + y="95.548523" + id="text36999"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-251.20984" + y="95.548523" + id="tspan36997">management</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-193.36633" + y="90.94603" + id="text37005"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-193.36633" + y="90.94603" + id="tspan37003">crop choices and</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-193.36633" + y="95.442184" + id="tspan44547">agri-environment schemes</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-153.51918" + y="133.36227" + id="text37011"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-153.51918" + y="133.36227" + id="tspan37009">habitat</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-153.51918" + y="137.85843" + id="tspan46519">availability</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-193.00398" + y="166.01056" + id="text37017"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-193.00398" + y="166.01056" + id="tspan37015">ecosystem</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-193.00398" + y="170.50671" + id="tspan47679">services</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-195.98679" + y="184.15704" + id="text37023"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-195.98679" + y="184.15704" + id="tspan37021">chemical input,</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-195.98679" + y="188.6532" + id="tspan49055">mechanical disturbance</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-254.00766" + y="164.94455" + id="text37029"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-254.00766" + y="164.94455" + id="tspan37027">produce sold</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-323.51608" + y="143.017" + id="text37035"><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-323.51608" + y="143.017" + id="tspan37033">available capital,</tspan><tspan + sodipodi:role="line" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:3.88056px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-323.51608" + y="147.51315" + id="tspan39481">expected prices</tspan></text> + <rect + style="opacity:0.3;fill:#cccccc;fill-opacity:0;stroke-width:0.499999;stroke-linejoin:round;stroke-dasharray:2, 1" + id="rect1069" + width="112.82384" + height="160.54663" + x="-231.01744" + y="44.900829" /> + <rect + style="opacity:1;fill:#cccccc;fill-opacity:0;stroke:#b3b3b3;stroke-width:1.48806;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4.46419, 4.46419;stroke-dashoffset:0" + id="rect1071" + width="95.264816" + height="156.50888" + x="-218.96155" + y="44.737301" + ry="11.783684" /> + <rect + style="opacity:1;fill:#cccccc;fill-opacity:0;stroke:#b3b3b3;stroke-width:1.48764;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:4.46291, 4.46291;stroke-dashoffset:0" + id="rect1722" + width="154.29442" + height="156.51236" + x="-379.96906" + y="44.735607" + ry="11.783947" /> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0.264583px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-253.92432" + y="53.219448" + id="text1993"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:4.93889px;font-family:Lato;-inkscape-font-specification:'Lato, Ultra-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-253.79202" + y="53.219448" + id="tspan1991">human systems</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556px;line-height:50%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0.264583px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-188.12138" + y="53.219448" + id="text4367"><tspan + sodipodi:role="line" + style="font-style:normal;font-variant:normal;font-weight:800;font-stretch:normal;font-size:4.93889px;font-family:Lato;-inkscape-font-specification:'Lato, Ultra-Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#000000;stroke-width:0.264583" + x="-187.98909" + y="53.219448" + id="tspan4365">natural systems</tspan></text> + <path + id="path15947" + style="fill:none;fill-opacity:0;stroke:#b3b3b3;stroke-width:3.30099;stroke-linecap:round;stroke-linejoin:round;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)" + d="m -78.665424,140.21711 c 8.46291,11.49472 16.08168,14.41999 30.47954,14.40623 3.51245,-0.005 0.5249,-0.15813 3.07901,-0.4327" + sodipodi:nodetypes="ccc" /> + <path + id="path31596" + style="color:#000000;fill:#b3b3b3;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" + d="m -75.934688,117.7495 c 3.9968,7.71922 8.25223,14.01937 15.82665,17.76835 4.42209,2.01168 9.37372,2.82783 15.41559,2.9993 l -2.46445,3.05718 8.60103,-3.48971 c 0.20204,-0.0407 0.39466,-0.11886 0.56792,-0.23047 l 4.96559,-2.01435 c -8.37128,-0.69414 -18.42686,-0.20429 -25.72084,-3.32624 -2.89132,-1.3153 -5.50069,-3.19823 -8.10597,-5.88956 l 2.9869,0.45372 -7.4228,-5.73557 c -0.10047,-0.10078 -0.21354,-0.18815 -0.33642,-0.25993 z" + sodipodi:nodetypes="ccccccccccccc" /> + <g + id="path33241" + transform="translate(-400.87079,-49.678704)"> + <path + id="path35834" + style="color:#000000;fill:#b3b3b3;stroke-width:3.77953;stroke-linecap:round;stroke-linejoin:round;-inkscape-stroke:none" + d="m 708.8457,787.30273 7.07422,19 c 0.13115,0.70084 0.38156,1.37399 0.74024,1.99024 l 12.30078,33.04492 2.27929,-14.99805 c 2.73185,2.97426 5.4847,5.74337 8.26954,8.33399 14.2862,10.21974 34.29891,14.02879 52.72656,14.61328 -6.58445,-1.54863 -12.67391,-3.57498 -18.40821,-6.18359 -10.93447,-4.97424 -20.80534,-12.08002 -30.66015,-22.26172 l 11.30469,1.71679 -27.84571,-21.51562 c -0.48155,-0.52573 -1.04967,-0.96506 -1.67968,-1.29883 z m 105.37696,58.54688 9.09179,7.33008 c -3.68755,-0.15795 -7.22893,-0.38996 -10.64453,-0.69922 -17.18104,1.51791 -39.22137,0.9667 -58.08398,-5.8457 4.53027,3.00273 9.20074,5.60525 14.07422,7.82226 16.71333,7.60316 35.42837,10.68767 58.26367,11.33594 l -9.31445,11.55469 32.45898,-13.16602 c 0.79884,-0.15383 1.55984,-0.46226 2.24023,-0.9082 l 18.73243,-7.59961 -19.96094,-3.45117 c -0.68398,-0.24643 -1.40582,-0.37103 -2.13281,-0.36914 z" + transform="matrix(0.26458333,0,0,0.26458333,0.49033887,0.3744075)" /> + <g + id="g33580"> + <g + id="path33590" /> + <g + id="path33582" /> + </g> + </g> + <path + id="polygon11601" + style="fill:#000000;fill-rule:evenodd;stroke-width:0.0585165" + d="m 127.58337,-61.418776 c -0.0948,0.002 -0.18023,0.0393 -0.22704,0.13349 -0.10357,0.53635 -0.0287,1.18531 -0.0767,1.76831 -0.0409,0.49178 -0.0245,0.92035 -0.0205,1.48305 0.004,0.46948 -0.008,0.96634 -0.0164,1.38245 -0.009,0.43689 0.0234,0.86857 0.002,1.31142 0.0883,0.22002 0.0228,0.53074 0.0216,0.82099 -0.2838,-0.0849 -0.50675,0.0223 -0.77885,0.0234 -0.25689,7.6e-4 -0.5208,-0.0345 -0.7771,-0.0474 -0.13518,-0.007 -0.28556,0.0445 -0.40084,-0.031 -0.12991,0.0644 -0.32652,0.002 -0.46052,-0.005 -0.0907,-0.006 -0.17556,0.021 -0.26158,0.0181 -0.29375,-0.0105 -0.54947,-0.0802 -0.81572,-0.0936 -0.0556,-0.002 -0.11352,0.0245 -0.17379,0.0205 -0.47457,-0.0357 -0.99192,-0.0866 -1.43898,-0.048 -0.24256,-0.10123 -0.58219,-0.0164 -0.9509,-0.0105 -0.28474,0.004 -0.62935,-0.0878 -0.94727,-0.0697 -0.20252,0.0117 -0.47041,0.0398 -0.58879,-0.0404 -0.20141,0.0451 -0.39873,0.10943 -0.59798,0.17556 -0.22582,0.0755 -0.47744,0.13165 -0.6455,0.27443 -0.0774,0.0662 -0.18333,0.21359 -0.27432,0.33472 -0.15285,0.20364 -0.24501,0.39206 -0.28709,0.63432 v 0.002 c -0.26637,0.61326 -0.2656,1.25401 -0.38586,1.92755 -0.0694,0.38913 -0.16045,0.77358 -0.23588,1.12819 0.0297,0.19603 -0.0595,0.46404 -0.0878,0.71508 -0.0216,0.19134 -0.002,0.3078 -0.0896,0.38621 0.0209,0.31657 -0.11415,0.68815 -0.14265,0.98718 -0.036,0.37918 -0.0857,0.70453 -0.11885,1.07494 0.0588,0.0293 0.12442,0.0521 0.19932,0.0661 -0.006,0.47339 0.067,0.8678 0.30721,1.22358 -0.22242,0.41957 -0.32285,0.96669 -0.36755,1.49744 -0.0187,0.22295 0.0254,0.53367 0.0677,0.76598 0.0946,0.5208 0.31105,0.96319 0.61811,1.38099 0.18585,0.25221 0.39207,0.43654 0.6967,0.54831 0.0299,0.22587 0.10585,0.40961 0.14629,0.62554 0.44034,0.79934 0.88477,1.78124 1.83778,2.11011 0.0153,0.0919 0.122,0.10064 0.15178,0.17906 0.30213,0.1182 0.63632,0.15916 1.046,0.10475 0.5607,0.0691 1.02948,-0.10124 1.50123,-0.0662 0.28966,0.0216 0.41372,-0.0492 0.62731,-0.15917 0.13985,-0.0714 0.21709,-0.14278 0.32534,-0.20305 0.0691,-0.0386 0.15624,-0.048 0.21945,-0.0913 0.11703,-0.0796 0.19719,-0.20949 0.35695,-0.24285 0.0919,-0.21065 0.31891,-0.27561 0.38211,-0.51787 0.0732,-0.005 0.0573,-0.10767 0.12054,-0.12405 -0.014,-0.0463 0,-0.0328 0.004,-0.086 0.1937,-0.25221 0.32185,-0.50091 0.41138,-0.84673 0.20188,-0.42542 0.35812,-0.87717 0.29083,-1.39914 -0.0363,-0.28322 -0.0825,-0.58868 -0.12231,-0.85551 0.82919,-0.0538 1.57586,-0.43946 2.4302,-0.57054 0.37568,-0.0579 0.70045,-0.22646 1.06618,-0.30019 0.34056,-0.0684 0.66299,-0.16619 1.00356,-0.2446 0.0251,-0.0234 0.0503,-0.0468 0.0755,-0.0697 0.10065,0.15391 0.26976,0.2563 0.4494,0.26508 0.28381,-0.0614 0.39909,-0.32243 0.41372,-0.55942 l 0.34525,0.002 c 0.0111,0.0685 0.0328,0.1264 0.0351,0.20306 0.14396,0.0322 0.19019,0.045 0.32887,0.0129 0.13108,-0.1106 0.0854,-0.27445 0.0936,-0.48511 0.0533,-0.0357 0.12054,-0.0772 0.18784,-0.0199 -0.15742,0.22237 -0.10767,0.48569 -0.0328,0.74609 0.0656,0.22822 0.10826,0.33062 0.19604,0.51378 0.0925,0.19486 0.19194,0.37509 0.32359,0.48803 0.0656,0.009 0.12114,0.0281 0.20071,0.024 0.0398,0.16618 0.11001,0.3037 0.15215,0.46813 0.32593,0.29434 0.56117,0.67236 0.9544,0.90526 0.0603,-0.009 0.0942,-0.048 0.16092,-0.0515 0.19838,0.26508 0.41606,0.51143 0.87074,0.54186 0.34056,0.32477 0.89355,0.33296 1.40966,0.34876 0.28907,0.44355 0.62846,0.84264 1.08958,1.1282 0.0603,-0.0409 0.11294,-0.0404 0.17555,-0.0509 0.1539,0.26157 0.2996,0.50149 0.59102,0.66007 0.0556,0.0111 0.0848,-0.009 0.11703,-0.024 0.22411,0.18374 0.49447,0.33238 0.74433,0.42073 0.10475,0.0374 0.21124,0.0819 0.31248,0.11528 0.12815,0.0427 0.24753,0.0463 0.40025,0.0749 0.079,0.0152 0.14922,0.0649 0.22705,0.0807 0.17438,0.0351 0.38621,0.0685 0.55766,0.0673 0.37275,-7.6e-4 0.74667,0.0328 1.12469,-0.0234 0.11352,-0.017 0.21886,-0.093 0.33647,-0.11528 0.0977,-0.0187 0.22471,0.006 0.34583,0.002 0.17146,-0.006 0.30956,-0.0644 0.44766,-0.0386 0.22763,-0.0509 0.41605,-0.0661 0.6548,-0.11527 0.10591,-0.10533 0.23231,-0.18725 0.30195,-0.33238 0.14512,-0.0585 0.22294,-0.19017 0.35636,-0.25981 0.11644,-0.0608 0.25981,-0.11879 0.39674,-0.17028 0.12347,-0.0463 0.25864,-0.0363 0.39148,-0.0691 0.12522,-0.0316 0.23465,-0.11294 0.33998,-0.2013 0.28264,-0.23699 0.58458,-0.51495 0.505,-0.986 0.0714,0.008 0.0656,-0.0673 0.0895,-0.11119 0.11352,-0.1498 0.26683,-0.1024 0.43887,-0.13926 0.16853,-0.0357 0.36924,-0.30312 0.45117,-0.45702 0.15272,-0.28439 0.2563,-0.70746 0.22002,-1.08431 -0.11996,-0.0749 -0.14864,-0.21651 0,-0.3037 0.1065,0.0328 0.27678,-0.0492 0.36514,-0.12816 0.0884,-0.16326 0.0936,-0.33295 0.12289,-0.49914 0.0129,-0.0737 0.0433,-0.13576 0.0509,-0.19895 0.0153,-0.11997 -0.0205,-0.21184 -0.0293,-0.34584 -0.0111,-0.17204 0.0345,-0.40786 -0.0474,-0.56527 -0.0328,-0.0626 -0.13458,-0.0948 -0.13692,-0.16443 -0.005,-0.13342 0.2048,-0.20305 0.24284,-0.27796 0.0848,-0.62671 -0.0802,-1.23938 -0.35812,-1.68586 -0.055,-0.009 -0.0732,-0.0538 -0.11353,-0.0767 0.0345,-0.0632 0.0568,-0.13985 0.0825,-0.21242 -0.1615,-0.64836 -0.44648,-1.18437 -1.0334,-1.44243 -0.0252,-0.055 -0.0117,-0.13985 -0.0217,-0.17379 0.15273,0.0422 0.23758,-0.0948 0.33822,-0.15741 0.0608,-0.10942 0.0649,-0.28088 0.13167,-0.38387 0,-0.19018 0.0924,-0.3628 0.0673,-0.54538 -0.0263,-0.19135 -0.14512,-0.34583 -0.16442,-0.5243 -0.28966,-0.32594 -0.66066,-0.56118 -0.97255,-0.83387 0.16325,0.005 0.23173,0.0245 0.38738,0.0457 -0.0252,0.0638 -0.10533,0.079 -0.0492,0.15507 0.0901,-0.007 0.12405,-0.0732 0.16267,-0.13693 0.1299,0.004 0.33296,0.10299 0.34759,-0.0275 l 0.0105,-0.0363 c 7.6e-4,0.007 0.003,0.0146 0.004,0.0216 0.14278,-0.28205 0.0398,-0.59336 -0.079,-0.8245 -0.10826,-0.0433 -0.18199,-0.11879 -0.28146,-0.17029 0.0334,-0.0702 -0.003,-0.19251 0.0714,-0.28497 -0.008,0.0691 -0.0316,0.1738 0.002,0.25923 0.0907,-0.093 0.0649,-0.33471 0.13693,-0.48452 -0.0462,-0.0691 -0.0199,-0.32827 0.0971,-0.26859 -0.01,0.10826 -0.0568,0.24987 -0.0421,0.3435 -0.0392,0.14804 -0.16209,0.40025 -0.0363,0.48861 0.0854,-0.24987 0.14629,-0.60916 0.18257,-0.89999 -0.0667,-0.0533 -0.13927,-0.0369 -0.19895,-0.0509 0.0409,-0.24109 0.11762,-0.45351 0.0673,-0.57464 -0.37919,0.0269 -0.41488,0.46872 -0.45702,0.9035 0.0439,0.0474 0.0913,0.0907 0.15331,0.12054 -0.008,0.12523 -0.0263,0.28088 -0.062,0.44473 -0.64486,-0.1814 -1.32306,-0.0533 -2.01297,-0.0878 -0.0544,0.008 0.008,0.0492 -0.0462,0.0568 -0.45585,-0.21651 -1.09485,-0.29141 -1.54894,-0.46989 0.0129,0.0439 -0.0328,0.0234 -0.0585,0.0251 -0.48803,-0.093 -0.98424,-0.17145 -1.46467,-0.13517 -0.0778,0.006 -0.15331,0.0468 -0.23231,0.0474 -0.0374,5.8e-4 -0.072,-0.0293 -0.11293,-0.0328 -0.15566,-0.0123 -0.36691,0.0386 -0.54889,0.0474 -0.45643,0.0234 -0.80519,0.0936 -1.15395,0.17788 l -0.009,-0.30545 0.0439,-0.1065 c 0.0767,-0.0188 0.12931,-0.0638 0.21007,-0.0784 0.0614,0.0527 0.15507,0.0632 0.18842,-0.0199 -0.10591,-0.10123 -0.23113,-0.0556 -0.34934,-0.0205 l 0.0404,-0.0965 -0.0807,0.0439 -0.0767,0.009 c 0.0245,-0.0199 0.0509,-0.038 0.0807,-0.0527 -0.0316,-0.0123 -0.0644,-0.0117 -0.0989,-0.002 l 0.15332,-0.0509 c -0.009,0.0117 -0.0175,0.024 -0.0234,0.0387 0.41663,-0.007 0.47456,-0.40611 0.63431,-0.69342 0.021,-0.34525 -0.31949,-0.54831 -0.57229,-0.72971 -0.30136,-0.0697 -0.54303,-0.19076 -0.83211,-0.0948 0.0135,0.17028 -0.0854,0.52138 -0.11528,0.65831 0.0556,0.30897 0.0135,0.52841 0.10826,0.84089 -0.22411,-0.10767 -0.67352,0.038 -0.92163,-0.0105 0.0392,-0.12933 0.22645,-0.0614 0.2247,-0.20657 -0.002,-0.15741 -0.292,-0.16853 -0.41137,-0.14863 0.11118,-0.0702 0.15683,-0.19896 0.24343,-0.29258 0.10884,-0.11762 0.23933,-0.21769 0.34524,-0.34349 0.14747,-0.17556 0.26275,-0.39207 0.41547,-0.57406 0.0778,-0.0936 0.1738,-0.1773 0.25572,-0.2762 0.0808,-0.0977 0.14922,-0.22997 0.23055,-0.3072 0.0948,-0.0907 0.25865,-0.10007 0.27036,-0.26164 0.0608,0.008 0.11937,0.007 0.17379,0.008 -0.002,0.008 -0.005,0.017 -0.004,0.0293 0.0866,0.0805 0.17497,-0.0492 0.19369,-0.13717 0.31541,0.29025 0.62437,0.58751 1.09192,0.73848 0.10299,0.0866 0.2645,0.19955 0.39499,0.19077 0.072,-0.005 0.1065,-0.0807 0.17555,-0.0498 0.0761,-0.14395 0.0685,-0.31658 0.0345,-0.48803 -0.17672,-0.33869 -0.4102,-0.65539 -0.66358,-0.98027 -0.0299,-0.0278 -0.0971,-0.0211 -0.0825,-0.0897 -0.13692,-0.0444 -0.21475,-0.14185 -0.2762,-0.25601 -0.0316,-0.0172 -0.0726,-0.027 -0.10064,-0.0475 -0.11587,-0.10778 -0.21417,-0.24781 -0.32886,-0.36029 -0.21769,-0.21369 -0.51203,-0.33201 -0.69519,-0.57779 -0.062,-0.008 -0.0661,-0.005 -0.10064,-0.0183 -0.14396,-0.18743 -0.42073,-0.30481 -0.57229,-0.44256 -0.10943,-0.009 -0.21125,-0.01 -0.28849,0.0165 -0.0316,0.0662 -0.0919,0.0999 -0.10826,0.18287 0.0134,0.0198 0.0374,0.0291 0.0404,0.0585 -0.0913,0.55403 0.44649,0.93339 0.64895,1.30931 0.0854,0.0553 0.14805,0.13347 0.23816,0.18468 0.0146,0.055 -0.0995,0.10006 -0.0205,0.12803 0.006,0.003 0.0123,0.003 0.0188,0.004 -0.0123,0.0618 -0.0117,0.12628 -0.0111,0.16455 -0.0223,0.023 -0.0398,0.0515 -0.0474,0.0896 0.005,0.0286 0.0784,0.0654 0.0544,0.0749 -0.29551,-0.1086 -0.39908,-0.48095 -0.76247,-0.3511 -0.0105,0.23711 0.40201,0.32073 0.3786,0.56504 -0.006,0.0611 -0.12581,0.17491 -0.18315,0.23576 -0.22471,0.24109 -0.4418,0.51671 -0.66358,0.69108 -0.32126,0.46287 -0.71215,0.85025 -1.03692,1.30961 -0.0269,-0.005 -0.031,0.0158 -0.0568,0.0129 -0.0866,0.21417 -0.34642,0.31306 -0.38211,0.54478 l -0.031,0.0387 c -0.005,-0.009 -0.0105,-0.017 -0.0146,-0.0258 -0.0258,-0.0533 -0.0474,-0.11001 -0.0696,-0.16618 l 0.0223,-0.079 v -0.005 c 0.017,0.0193 0.0386,0.0363 0.0697,0.0492 -0.002,-0.10123 -0.0632,-0.23114 0.0422,-0.31424 0.13752,-0.0187 0.21008,-0.12405 0.38036,-0.14278 -0.0158,-0.021 -0.0322,-0.0334 -0.0497,-0.0422 l 0.0404,-0.0585 c 0.017,-0.0743 -0.0146,-0.21417 -0.0439,-0.29082 0.10006,-0.16443 0.24343,-0.3511 0.22646,-0.59394 -0.062,-0.0351 -0.0819,-0.10943 -0.10767,-0.1779 -0.20832,-0.29258 -0.6431,-0.39382 -1.12294,-0.33588 -0.15097,0.15331 -0.22528,0.56293 -0.11703,0.78061 v 0.13517 c -0.11118,-0.0907 -0.24226,-0.16853 -0.31424,-0.28731 -0.82333,-0.1972 -1.63436,-0.18492 -2.47057,-0.16443 -0.0743,-0.41723 -0.62495,-0.21827 -0.97138,-0.18667 -0.0269,0.0556 -0.0667,0.0989 -0.093,0.15565 -0.93627,-0.0509 -2.07676,-0.0275 -3.1839,-0.007 -0.0299,-1.18127 -0.003,-2.27794 0.0153,-3.32836 0.0188,-1.12282 -0.0901,-2.26788 0.0457,-3.38297 -0.0913,-0.0642 -0.22939,-0.11829 -0.35111,-0.11521 z m -0.0111,0.11338 c 6.7e-4,6.2e-4 7.6e-4,0.002 0.002,0.002 -0.007,0.002 -0.014,0.003 -0.0199,0.005 0.006,-0.002 0.0111,-0.005 0.0181,-0.008 z m -0.0638,0.0403 c 0,-3.4e-4 7.7e-4,3.2e-4 0.002,0 -0.008,0.009 -0.0152,0.0194 -0.0205,0.0311 0.005,-0.0117 0.0105,-0.0217 0.0188,-0.0311 z m -0.0316,0.0695 c -0.006,0.0272 -0.0105,0.0575 -0.0129,0.0896 -0.002,0.0321 -7.6e-4,0.0652 -0.004,0.0987 -0.008,0.14553 -0.0181,0.29684 -0.0258,0.44805 0.008,-0.15121 0.0152,-0.30252 0.024,-0.44805 0.002,-0.0335 0.004,-0.0666 0.005,-0.0987 0.002,-0.0321 0.006,-0.0624 0.0129,-0.0896 z m -0.062,1.08993 c -0.0129,0.29943 -0.024,0.5885 -0.031,0.8393 0.007,-0.25027 0.0188,-0.54052 0.031,-0.8393 z m 10.32291,2.2949 c 0.0123,-0.002 0.0123,0.006 0.0129,0.0146 0.22177,0.0812 0.38445,0.21816 0.53191,0.36761 0.12464,0.12604 0.37802,0.26929 0.55591,0.4425 -0.0421,0.0485 -0.002,0.16127 -0.0386,0.2432 -0.16794,0.0475 -0.27736,0.15916 -0.35812,0.30171 -0.35753,-0.33588 -0.73906,-0.7204 -0.73497,-1.3422 0.024,0.006 0.0281,-0.01 0.031,-0.0274 z m -0.11351,0.12804 c 0.008,0.0407 0.0164,0.0818 0.0216,0.13166 0.002,0.0166 0.005,0.0343 0.006,0.053 -6.6e-4,-7.6e-4 -7.6e-4,-0.002 -0.002,-0.004 -7.7e-4,-0.0173 -0.002,-0.0339 -0.004,-0.0494 -0.005,-0.0498 -0.014,-0.0909 -0.0217,-0.13166 z m -10.24392,0.0933 c 0,0.18152 -0.002,0.36222 -0.006,0.54128 0.004,-0.17906 0.006,-0.35976 0.006,-0.54128 z m 11.92802,0.73872 c 0.0363,0.0588 0.0772,0.11451 0.12054,0.16641 -0.0433,-0.0519 -0.0843,-0.10766 -0.12054,-0.16641 z m -11.93739,0.13166 c -6.6e-4,0.21195 0.004,0.40897 0.0111,0.59067 -0.008,-0.1817 -0.0117,-0.37872 -0.0111,-0.59067 z m 11.91165,0.14085 c 0.49271,0.39007 1.05974,0.84363 1.13054,1.51798 -0.34408,-0.28907 -0.64719,-0.55556 -0.95675,-0.89074 0.0252,-0.0674 -0.0444,-0.13494 -0.093,-0.17742 -0.0105,0.02 -0.0199,0.0354 -0.0293,0.0512 l -0.0328,-0.0932 0.0199,-0.0604 c 0.009,0.024 0.0181,0.0487 0.0293,0.0732 0.1106,-0.13751 0.0164,-0.30486 -0.0678,-0.42055 z m -1.2306,0.57235 c 0.0708,0.0535 0.14102,0.11071 0.21417,0.16455 l -0.0492,-0.002 z m 1.12644,0.14447 0.004,0.002 c 0.0264,0.12798 0.17555,0.18199 0.28674,0.28345 0.14628,0.13377 0.28438,0.3064 0.38035,0.38423 l 0.004,0.005 c -0.30955,-0.18023 -0.58868,-0.38984 -0.82801,-0.63455 z m -0.20831,0.0548 c -0.004,0.005 -0.008,0.007 -0.0181,0.005 z m -0.43127,0.17555 c -0.005,0.007 -0.01,0.0134 -0.0152,0.0201 0.004,-0.01 0.009,-0.0165 0.0152,-0.0201 z m -11.12402,0.18456 c 0.009,0.32243 0.009,0.63198 0.0111,0.93627 h -0.002 c -0.002,-0.30429 -6.6e-4,-0.61384 -0.009,-0.93627 z m 12.8643,0.39499 c 0.017,0.0135 0.0316,0.0293 0.0445,0.0457 z m -11.89526,0.59628 h 0.0316 0.0199 l -0.0199,0.002 z m 5.42742,0.0808 c 0.11001,-5.8e-4 0.21417,0.005 0.28907,0.0363 z m 5.44204,0.30663 c 0.003,0.004 0.005,0.006 0.008,0.009 0,0.002 -6.7e-4,0.005 0,0.008 l -0.002,-0.008 z m 6.87044,0.6074 c -6.7e-4,0.055 -0.006,0.10533 -0.0146,0.15331 0.008,-0.0479 0.014,-0.0983 0.0146,-0.15331 z m -9.3533,0.0146 c -0.0199,0.079 0.0614,0.086 0.0802,0.16268 -0.0134,0.0498 -0.0269,0.10006 -0.0404,0.1498 l -0.14805,0.008 c -0.0544,-0.0345 -0.1416,-0.0199 -0.20831,-0.002 0.10708,-0.10415 0.18491,-0.24049 0.31657,-0.31832 z m 0.18843,0.13868 c -0.006,7.6e-4 -0.0111,0.005 -0.0152,0.008 0.005,-0.004 0.008,-0.006 0.0152,-0.008 z m 9.13035,0.0954 c -0.014,0.055 -0.0304,0.10767 -0.0463,0.16267 0.0152,-0.0544 0.0328,-0.10825 0.0463,-0.16267 z m -0.055,0.20305 c -0.0187,0.0708 -0.0363,0.14454 -0.0439,0.22821 0.008,-0.0837 0.0252,-0.1574 0.0439,-0.22821 z m -5.31039,0.43888 c -0.17086,0 -0.34114,0.006 -0.50675,0.0181 0.16561,-0.0117 0.33589,-0.0181 0.50675,-0.0181 z m 0.25748,0.004 c 0.17262,0.005 0.34349,0.0152 0.51436,0.0293 -0.17028,-0.0135 -0.34232,-0.024 -0.51436,-0.0293 z m 1.32598,0.14278 c 0.0415,0.002 0.0808,7.6e-4 0.12055,0.005 -0.0398,-0.004 -0.079,-0.003 -0.12055,-0.005 z m 0.14981,0.0111 c 0.01,0.002 0.0217,0.002 0.0316,0.005 0.0111,0.004 0.0205,0.009 0.031,0.0146 -0.0105,-0.005 -0.0217,-0.009 -0.0334,-0.0129 -0.01,-0.003 -0.0193,-0.005 -0.0293,-0.007 z m 1.62383,0.57756 c 0.0492,0.0275 0.10066,0.0503 0.14805,0.0749 -0.0474,-0.0245 -0.0989,-0.0474 -0.14805,-0.0749 z m 0.3037,0.2013 c 0.0427,0.0193 0.0848,0.0398 0.1264,0.0603 -0.0415,-0.0205 -0.0837,-0.0392 -0.1264,-0.0585 0,-5.7e-4 6.7e-4,-7.6e-4 0,-0.002 z m 0.2487,0.12406 c 0.0808,0.0445 0.15741,0.0907 0.23407,0.13927 -0.0767,-0.0486 -0.15332,-0.0948 -0.23407,-0.13927 z m -26.9194,0.008 c -0.0312,0.13693 -0.0646,0.27327 -0.0896,0.41313 0.0248,-0.13986 0.0584,-0.2762 0.0896,-0.41313 z m 23.40138,0.13693 c 0.0983,0.0205 0.19896,0.0456 0.2961,0.0644 -0.0971,-0.0188 -0.19779,-0.0439 -0.2961,-0.0644 z m 0.67645,0.0515 c 0.014,0.007 0.031,0.0135 0.0492,0.0182 -0.0181,-0.005 -0.0351,-0.009 -0.0492,-0.0164 -0.0334,0.0164 -0.0697,0.0263 -0.11001,0.031 -0.0398,0.005 -0.0843,0.004 -0.12932,0 0.0451,0.004 0.0895,0.005 0.12932,0 0.0404,-0.005 0.0767,-0.0164 0.11001,-0.0328 z m 0.46638,0.0656 c 0.0223,0.004 0.0439,0.008 0.0638,0.0146 v 0.002 c -0.0193,-0.006 -0.0421,-0.0123 -0.0638,-0.0164 z m 0.32711,0.0258 c -0.0363,0.008 -0.0691,0.0205 -0.0989,0.0386 0.0299,-0.0181 0.0627,-0.0304 0.0989,-0.0386 z m -2.29678,0.0328 c 0.0573,0.006 0.11352,0.0158 0.16619,0.0293 -0.0527,-0.0135 -0.10884,-0.0228 -0.16619,-0.0293 z m 2.77428,0.0164 c 0.1258,0.0387 0.25337,0.0907 0.36748,0.14278 -0.11411,-0.0521 -0.24168,-0.10416 -0.36748,-0.14278 z m -3.20379,0.009 c -0.055,0.0129 -0.10708,0.0304 -0.15565,0.0509 0.0486,-0.0205 0.10064,-0.038 0.15565,-0.0509 z m 1.82455,0.0509 c 0,0.009 -6.6e-4,0.017 -0.002,0.0258 h -0.002 c 7.6e-4,-0.009 0.004,-0.017 0.004,-0.0258 z m 0.42834,0.0714 c 0.0269,0.004 0.0503,0.009 0.0732,0.0164 -0.0222,-0.007 -0.0468,-0.0129 -0.0732,-0.0164 z m 0.25572,0.0223 c 0.0111,0.0111 0.0205,0.0217 0.0293,0.0345 -0.008,-0.0123 -0.0187,-0.0234 -0.0293,-0.0345 z m -0.15156,0.005 c 0.031,0.0135 0.0585,0.0322 0.0843,0.0515 -0.0258,-0.0193 -0.0533,-0.038 -0.0843,-0.0515 z m -2.16687,0.0111 c -0.0492,0.0111 -0.10123,0.0293 -0.14805,0.0439 0.0468,-0.0146 0.0989,-0.0328 0.14805,-0.0439 z m -0.44824,0.0971 c -0.0105,0.0316 -0.01,0.0474 -0.0199,0.10241 0.01,-0.055 0.009,-0.0708 0.0199,-0.10241 z m 0.33472,0.11469 c 0.002,0.01 0.004,0.0193 0.004,0.0316 -6.6e-4,-5.8e-4 -7.6e-4,0 -0.002,0 6.6e-4,-0.0123 0,-0.0216 -0.002,-0.0316 z m -1.00415,0.0205 c -0.0778,0.0275 -0.15448,0.0608 -0.22821,0.0948 0.0737,-0.0339 0.15038,-0.0673 0.22821,-0.0948 z m 0.33647,0.0895 c -0.0614,0.006 -0.12288,0.0152 -0.18081,0.0275 0.0585,-0.0123 0.11878,-0.021 0.18081,-0.0275 z m -0.347,0.0784 c -0.0521,0.0216 -0.10065,0.048 -0.14453,0.0808 0.0444,-0.0334 0.0919,-0.0591 0.14453,-0.0808 z m 1.63437,0.0843 c 0.0117,0 0.0234,0.002 0.0351,0.004 -0.0234,-0.004 -0.0468,-0.002 -0.0697,0.002 0.0117,-0.002 0.0234,-0.005 0.0345,-0.006 z m -0.2721,0.0387 c 0.008,0.005 0.0169,0.009 0.031,0.0105 -0.014,-0.002 -0.0234,-0.005 -0.031,-0.0105 z m 3.81996,0.002 c 6.6e-4,0 7.6e-4,-5.7e-4 0.002,0 0.002,0.017 0.003,0.0304 0.005,0.0421 -0.002,-0.0123 -0.005,-0.0245 -0.007,-0.0421 z m 0.0129,0.0585 c 0.005,0.0146 0.0123,0.0281 0.0217,0.0404 -0.01,-0.0123 -0.0164,-0.0258 -0.0217,-0.0404 z m 0.39323,0.031 c 0.01,-5.7e-4 0.0205,-5.7e-4 0.031,0 -0.0304,-0.002 -0.0614,0.002 -0.0936,0.0111 0.0216,-0.006 0.0415,-0.01 0.0626,-0.0111 z m -4.28634,0.062 c -6.6e-4,0.004 -6.6e-4,0.007 0,0.0111 0.009,0.014 0.017,0.0293 0.0251,0.0439 -0.008,-0.0146 -0.0175,-0.0298 -0.0275,-0.0439 0,-0.004 0.002,-0.008 0.002,-0.0111 z m 3.85975,0.0187 c 0.021,0.005 0.0404,0.0129 0.0585,0.0199 -0.0188,-0.008 -0.0374,-0.0129 -0.0585,-0.0181 0,-5.7e-4 6.7e-4,-0.002 0,-0.002 z m 0.0608,0.0199 c 0.0374,0.0146 0.0702,0.0334 0.1024,0.0527 -0.0322,-0.0193 -0.0656,-0.038 -0.1024,-0.0527 z m 0.14629,0.0146 c 0.002,0.004 0.002,0.008 0.004,0.0129 -7.6e-4,-0.005 -0.002,-0.009 -0.004,-0.0129 z m -0.0422,0.038 c 0.0486,0.0299 0.093,0.0632 0.14044,0.0936 -0.0474,-0.0298 -0.0925,-0.0638 -0.14044,-0.0936 z m -5.89555,0.006 c -0.031,0.0556 -0.0696,0.10358 -0.1024,0.15742 0.0328,-0.0538 0.0708,-0.10182 0.1024,-0.15742 z m 1.91993,0.002 c 0.0146,0.0298 0.0263,0.0608 0.0363,0.0913 -0.01,-0.0304 -0.0216,-0.0614 -0.0363,-0.0913 z m 3.86034,0.0679 c 0,0 -6.6e-4,0.002 0,0.002 -0.0129,0.009 -0.0251,0.0199 -0.0369,0.031 0.0123,-0.0117 0.0228,-0.0228 0.0369,-0.0328 z m -3.26991,0.004 c 0.0199,0.0304 0.0322,0.0632 0.0422,0.0948 0.0105,0.0322 0.0199,0.0644 0.0369,0.0954 0.0105,0.0193 0.024,0.0374 0.038,0.055 -0.014,-0.0175 -0.0275,-0.0357 -0.038,-0.055 -0.017,-0.031 -0.0264,-0.0632 -0.0369,-0.0954 -0.01,-0.0316 -0.0216,-0.0638 -0.0422,-0.0948 z m 3.19852,0.0638 c 0,0 0.002,5.8e-4 0.002,0 -0.0205,0.0245 -0.0404,0.0515 -0.0568,0.079 0.0164,-0.0281 0.0345,-0.0538 0.055,-0.079 z m -3.72868,0.048 c 0.0123,0.0614 0.0158,0.12464 0.0129,0.18608 0.003,-0.0614 -6.6e-4,-0.12464 -0.0129,-0.18608 z m 3.58766,0.20481 c -0.0199,0.0422 -0.0421,0.0825 -0.0673,0.11879 0.0252,-0.0369 0.0468,-0.0767 0.0673,-0.11879 z m -5.72,0.0638 c -0.0339,5.7e-4 -0.0667,0.004 -0.0983,0.009 0.031,-0.005 0.065,-0.008 0.0983,-0.009 z m 0.0515,0 c 0.0345,7.6e-4 0.0697,0.005 0.10416,0.0111 -0.0345,-0.006 -0.0697,-0.01 -0.10416,-0.0111 z m 4.66319,0.0293 c 0.0445,0.0415 0.0942,0.0767 0.15156,0.10415 0.038,0.0181 0.0802,0.0328 0.12464,0.0439 -0.0444,-0.0111 -0.0866,-0.0258 -0.12464,-0.0439 -0.0573,-0.0275 -0.10709,-0.0626 -0.15156,-0.10415 z m -2.59873,0.0673 c -0.0169,0.0585 -0.0409,0.11469 -0.0696,0.16677 0.0287,-0.0521 0.0527,-0.10825 0.0696,-0.16677 z m 3.47999,0.024 c -0.0111,0.01 -0.0223,0.0193 -0.0351,0.0275 0.0129,-0.008 0.024,-0.0175 0.0351,-0.0275 z m 0.5758,0.28381 v 0.005 c -0.0164,0.0486 -0.0258,0.0965 -0.0275,0.14278 -7.6e-4,0.0316 6.6e-4,0.0626 0.006,0.093 0.005,0.0304 0.0129,0.0608 0.0234,0.0895 -0.0105,-0.0287 -0.0188,-0.0591 -0.0234,-0.0895 -0.005,-0.0304 -0.007,-0.0614 -0.006,-0.093 0.002,-0.048 0.01,-0.0977 0.0275,-0.14805 z m -5.33964,0.0562 c 0.0187,0.0351 0.0363,0.0626 0.0498,0.0749 -6.6e-4,0 -0.002,5.7e-4 -0.002,0 -0.0129,-0.0123 -0.0287,-0.0398 -0.0474,-0.0749 z m 6.63988,0.0275 c 0.0263,0.0363 0.0521,0.0702 0.0767,0.10416 0,0.005 -0.002,0.01 -0.004,0.0129 0.002,-0.003 0.002,-0.008 0.002,-0.0129 -0.024,-0.0334 -0.0492,-0.0691 -0.0749,-0.10416 z m -28.3788,0.11003 c -0.0729,0.36105 -0.14955,0.73321 -0.21761,1.13346 0.0681,-0.40025 0.14467,-0.77241 0.21761,-1.13346 z m 22.20004,0.0111 c 0.031,0.004 0.0644,0.008 0.0989,0.009 -0.0351,-7.6e-4 -0.0673,-0.004 -0.0989,-0.009 z m 6.16589,0.009 h 0.002 c -0.007,0.0193 -0.0152,0.0374 -0.0234,0.055 0.008,-0.0175 0.0146,-0.0357 0.0216,-0.055 z m 0.15565,0.093 c 0.0181,0.0404 0.0433,0.0819 0.0638,0.12464 -0.0205,-0.0439 -0.0457,-0.0837 -0.0638,-0.12464 z m 0.17205,0.0223 c 0.0158,0.0457 0.0334,0.0948 0.0456,0.14453 -0.0123,-0.0498 -0.0299,-0.0989 -0.0456,-0.14453 z m -7.19579,0.0603 c 0.0199,0.0433 0.0398,0.0848 0.0585,0.12054 -6.7e-4,0.0129 -0.003,0.0258 -0.006,0.0387 0.003,-0.0129 0.004,-0.0258 0.004,-0.0387 -0.0188,-0.0357 -0.0369,-0.0772 -0.0568,-0.12054 z m 7.08929,0.0439 c 0.0245,0.0509 0.0404,0.10415 0.0316,0.16618 0.008,-0.0608 -0.008,-0.11586 -0.0316,-0.16618 z m -1.41318,0.0585 c 0.01,0.0123 0.0217,0.0234 0.0328,0.0351 -0.0111,-0.0123 -0.0228,-0.0222 -0.0328,-0.0351 z m -2.52382,0.0732 c -6.7e-4,0.002 -6.7e-4,0.004 0,0.008 h -0.002 c -6.6e-4,-0.004 7.7e-4,-0.006 0.002,-0.008 z m 3.36646,0.0568 c -0.0299,0.0123 -0.0591,0.0234 -0.0895,0.031 0.0299,-0.008 0.0603,-0.0187 0.0895,-0.031 z m 0.59629,0.005 c -0.005,0.0188 -0.0117,0.0369 -0.0216,0.0568 0.01,-0.0199 0.0169,-0.038 0.0216,-0.0568 z m -4.40514,0.004 c -0.14219,0.0263 -0.2797,0.0597 -0.41312,0.0983 0.13342,-0.0387 0.27093,-0.072 0.41312,-0.0983 z m 4.33375,0.0621 c -0.006,-5.8e-4 -0.0129,5.7e-4 -0.0216,0.004 -0.0105,0.004 -0.021,0.008 -0.031,0.0146 -0.0304,0.021 -0.0608,0.0579 -0.0878,0.1024 0.0269,-0.0445 0.0573,-0.0813 0.0878,-0.1024 0.01,-0.007 0.0205,-0.0129 0.031,-0.0164 0.009,-0.003 0.0158,-0.002 0.0216,-0.002 z m -7.04541,0.0216 c -0.01,0.0304 -0.0188,0.0643 -0.024,0.0989 0.005,-0.0345 0.014,-0.0684 0.024,-0.0989 z m 3.27459,0.0205 c -0.0819,0.0205 -0.12113,0.0264 -0.17145,0.0216 0.0486,0.004 0.0884,-0.002 0.17145,-0.0216 z m 3.80182,0.0345 h 0.002 c 0.004,0.006 0.009,0.0152 0.0152,0.0258 -0.006,-0.0105 -0.0129,-0.0199 -0.017,-0.0258 z m -4.97918,0.024 c 7.6e-4,-5.8e-4 0.002,0 0.004,0 -0.0649,0.0223 -0.13049,0.0463 -0.19369,0.0714 0.0626,-0.0252 0.12581,-0.0492 0.19018,-0.0714 z m 0.5249,0.002 c -0.0673,0.014 -0.13166,0.0299 -0.19603,0.0474 0.0644,-0.0175 0.12873,-0.0334 0.19603,-0.0474 z m 4.25709,0.0656 c -0.0164,0.0334 -0.0316,0.0691 -0.0439,0.1065 0.0123,-0.0374 0.0275,-0.0732 0.0439,-0.1065 z m -4.97392,0.004 c -0.189,0.0755 -0.36924,0.16268 -0.54303,0.25923 0.17379,-0.0965 0.35403,-0.18374 0.54303,-0.25923 z m 5.21734,0.007 c 6.6e-4,0.0146 -6.6e-4,0.0293 -0.008,0.0439 h -0.002 c 0.006,-0.0146 0.01,-0.0293 0.009,-0.0439 z m -5.06578,0.0936 c -0.1182,0.045 -0.23348,0.0942 -0.34524,0.14395 0.11176,-0.0498 0.22704,-0.0989 0.34524,-0.14395 z m 2.5876,0.10006 c 0.0732,0.0328 0.14571,0.0691 0.21593,0.10825 -0.0702,-0.0398 -0.14219,-0.0755 -0.21593,-0.10825 z m -1.61798,0.0205 c 0.0205,-5.8e-4 0.0415,7.6e-4 0.062,0.002 -0.0404,-0.002 -0.0843,-7.6e-4 -0.12639,0.002 -0.0387,0.003 -0.0767,0.008 -0.11119,0.0146 0.0345,-0.007 0.072,-0.0117 0.11119,-0.0146 0.021,-0.002 0.0433,-0.004 0.0644,-0.004 z m -4.28459,0.10942 c 0.0433,0.031 0.0819,0.0656 0.12055,0.0919 0.0129,0.008 0.0251,0.0152 0.0386,0.0216 0.0181,0.009 0.0386,0.0193 0.0603,0.0275 -0.0216,-0.008 -0.0422,-0.0164 -0.0603,-0.0258 -0.0135,-0.006 -0.0258,-0.0152 -0.0386,-0.0234 -0.0386,-0.0263 -0.0772,-0.0608 -0.12055,-0.0919 z m 2.44658,0.0293 c -0.11293,0.0684 -0.22236,0.14219 -0.32945,0.21768 0.10709,-0.0755 0.21652,-0.14922 0.32945,-0.21768 z m 3.13064,0.0585 c 0.0135,0.005 0.0275,0.01 0.0422,0.0164 0.0433,0.0199 0.0843,0.0404 0.12405,0.0603 -0.0398,-0.0199 -0.0807,-0.0387 -0.12405,-0.0585 -0.0146,-0.006 -0.0287,-0.0129 -0.0422,-0.0181 z m 2.48872,0.004 c 0.008,0.0281 0.0223,0.0527 0.0404,0.0708 -0.0188,-0.0181 -0.0316,-0.0422 -0.0404,-0.0708 z m -7.4679,0.0767 c -0.0404,0.002 -0.0843,0.0117 -0.1264,0.0146 0.0427,-0.003 0.0854,-0.0123 0.1264,-0.0146 z m 8.42055,0 c 0.0363,0.0439 0.0696,0.0901 0.10064,0.13868 -0.031,-0.0486 -0.0644,-0.0948 -0.10064,-0.13868 z m -6.73644,0.13166 c -0.086,0.0579 -0.17086,0.11704 -0.2563,0.18257 0.0854,-0.0656 0.17028,-0.12464 0.2563,-0.18257 z m 0.5758,0.0456 c -0.0374,0.024 -0.0737,0.0503 -0.10767,0.0767 0.0339,-0.0263 0.0702,-0.0527 0.10767,-0.0767 z m -3.25118,0.0509 c 6.7e-4,0.0216 -0.004,0.0421 0.002,0.0644 -0.005,-0.0223 -7.7e-4,-0.0427 -0.002,-0.0644 z m 9.57274,0.0111 c 0.0234,0.0427 0.0439,0.086 0.0638,0.13166 -0.0193,-0.045 -0.0404,-0.0889 -0.0638,-0.13166 z m -29.5784,0.031 c -0.006,0.0444 -0.0151,0.0837 -0.022,0.12465 0.007,-0.0404 0.0157,-0.0802 0.022,-0.12465 z m 28.68602,0.008 c 6.6e-4,-5.7e-4 0.002,0 0.002,0 -0.006,0.008 -0.0135,0.0152 -0.0181,0.0234 0.005,-0.009 0.009,-0.0158 0.0164,-0.0234 z m -0.0164,0.0258 c -0.009,0.017 -0.014,0.0345 -0.0146,0.0544 6.6e-4,-0.0193 0.006,-0.0374 0.0146,-0.0544 z m -8.65695,0.005 c 0.003,0.006 0.007,0.0105 0.0111,0.0164 h -0.002 c -0.004,-0.006 -0.006,-0.0105 -0.009,-0.0164 z m 2.18735,0.005 c -0.1024,0.0813 -0.20188,0.16736 -0.30019,0.25279 -0.0708,0.14161 -0.14395,0.28673 -0.2212,0.43127 0.0772,-0.14454 0.1504,-0.28966 0.2212,-0.43127 l -0.002,-0.002 c 0.0983,-0.0854 0.19895,-0.16911 0.30194,-0.25045 z m 6.48949,0.17029 c 0.0216,0.0427 0.0515,0.086 0.0807,0.12405 -0.0293,-0.038 -0.0591,-0.0813 -0.0807,-0.12405 z m -8.32925,0.0363 c 0.0199,0.024 0.038,0.0492 0.0533,0.0772 0.0152,0.0275 0.0275,0.0591 0.038,0.0913 -0.0105,-0.0322 -0.0228,-0.0638 -0.038,-0.0913 -0.0152,-0.0281 -0.0334,-0.0533 -0.0533,-0.0772 z m 7.12791,0.10064 c 0.0386,0.0357 0.0767,0.0702 0.11352,0.10592 -0.0369,-0.0351 -0.0749,-0.0708 -0.11352,-0.10592 z m 2.24411,0.009 c 0,-5.8e-4 7.6e-4,0 0.002,0 0.005,0.0111 0.009,0.0216 0.0146,0.0328 -0.005,-0.0111 -0.0111,-0.0216 -0.0164,-0.0328 z m -0.7098,0.0456 c 0.0181,0.01 0.0369,0.0188 0.0568,0.0258 -0.0199,-0.007 -0.038,-0.0158 -0.0568,-0.0258 z m 0.73906,0.0164 c 0.0181,0.0445 0.0316,0.0884 0.0363,0.13167 -0.005,-0.0427 -0.0181,-0.0872 -0.0363,-0.13167 z m -6.0003,0.0585 c -0.0129,0.008 -0.0269,0.0164 -0.0415,0.024 -0.0269,0.0129 -0.055,0.0223 -0.086,0.0328 0.0304,-0.0105 0.0597,-0.0216 0.086,-0.0345 0.0146,-0.008 0.0287,-0.014 0.0415,-0.0223 z m -3.27693,0.0971 c 0.002,0.0187 0.004,0.0386 0.004,0.0585 l -0.002,0.002 c -6.7e-4,-0.0205 -6.7e-4,-0.0409 -0.002,-0.0603 z m 9.2901,0.11294 c -0.008,0.0146 -0.0158,0.0299 -0.0275,0.0445 -6.6e-4,0 -7.6e-4,-5.7e-4 -0.002,0 -0.0369,0.004 -0.072,0.0105 -0.10475,0.0216 0.0334,-0.0117 0.0673,-0.0181 0.10475,-0.0216 0.0111,-0.0146 0.021,-0.0299 0.0293,-0.0445 z m -7.33505,0.0445 c -0.009,0 -0.0175,0.003 -0.0258,0.005 0.009,-0.003 0.0164,-0.005 0.0258,-0.005 z m 0.0568,0.007 c 0.0796,0.0205 0.17322,0.0761 0.23056,0.0784 -0.0573,-0.002 -0.15097,-0.0579 -0.23056,-0.0784 z m 4.01951,0.086 c 0.0345,0.0392 0.0737,0.079 0.10943,0.1223 -0.0357,-0.0433 -0.0749,-0.0831 -0.10943,-0.1223 z m 3.18155,0.009 c 0,0.0158 0.005,0.0252 0.0111,0.0351 -0.006,-0.009 -0.0105,-0.0205 -0.0111,-0.0351 z m -3.53674,0.0936 c -0.008,0.004 -0.017,0.007 -0.0252,0.009 v -0.002 c 0.008,-0.002 0.0169,-0.004 0.0252,-0.007 z m 3.23538,0.0217 c -0.031,0.0462 -0.0556,0.0977 -0.0755,0.1539 0.0199,-0.0562 0.0445,-0.10767 0.0755,-0.1539 z m -29.36481,0.16502 c 0.0108,0.0708 0.0237,0.13517 0.0384,0.1972 -0.0147,-0.062 -0.0277,-0.1264 -0.0384,-0.1972 z m 21.39894,0.0363 c -0.0287,0.045 -0.0632,0.0884 -0.0971,0.13166 0.0339,-0.0433 0.0684,-0.0866 0.0971,-0.13166 z m 0.14278,0.0205 c -0.0223,0.0386 -0.0456,0.0732 -0.0696,0.10592 0.024,-0.0328 0.0474,-0.0673 0.0696,-0.10592 z m -1.25985,0.0181 c -0.0193,0.007 -0.0492,0.0269 -0.0825,0.0509 0.0345,-0.0245 0.0632,-0.0439 0.0825,-0.0509 z m 8.97469,0.0328 c -0.008,0.0409 -0.0134,0.0837 -0.0164,0.12815 0.003,-0.0445 0.008,-0.0872 0.0164,-0.12815 z m 0.7847,0.1539 c 0.0258,0.0603 0.0474,0.12347 0.0673,0.18783 -0.0199,-0.0644 -0.0415,-0.12756 -0.0673,-0.18783 z m -10.66815,0.004 c -0.12114,0.0287 -0.24168,0.0608 -0.3552,0.10065 0.11352,-0.0398 0.23406,-0.072 0.3552,-0.10065 z m 0.62904,0.0105 c -0.0111,0.008 -0.0205,0.0146 -0.0258,0.017 -0.014,0.005 -0.0263,0.01 -0.0404,0.0146 0.0134,-0.005 0.0269,-0.0111 0.0404,-0.0164 0.005,-0.002 0.0146,-0.007 0.0258,-0.0152 z m 9.32404,0.0714 c 0.003,0.002 0.006,0.002 0.0111,0.002 -6.6e-4,0 0,7.6e-4 0,0.002 -0.005,-5.7e-4 -0.008,-0.002 -0.0111,-0.004 z m -10.07422,0.0275 c 6.7e-4,5.8e-4 0,0.002 0,0.002 -0.0591,0.0245 -0.11937,0.0474 -0.17906,0.0714 -0.10942,0.045 -0.21534,0.0925 -0.31248,0.1498 v -0.002 c 0.0971,-0.0573 0.20364,-0.10357 0.31248,-0.14804 0.0597,-0.024 0.11996,-0.0492 0.17906,-0.0732 z m 10.02683,0.002 c -0.002,0.008 -0.006,0.0135 -0.0111,0.0188 0.004,-0.005 0.009,-0.0117 0.0111,-0.0188 z m -0.031,0.0275 h 0.002 c -0.0111,0.0521 -0.0175,0.10474 -0.0187,0.15565 7.6e-4,-0.0509 0.006,-0.10357 0.017,-0.15565 z m -8.11918,0.23991 c -0.0205,0.0614 -0.0521,0.1223 -0.0825,0.18082 0.0304,-0.0585 0.062,-0.11937 0.0825,-0.18082 z m 6.62526,0.0492 c 0.0199,0.093 0.0374,0.19076 0.0527,0.28907 -0.0152,-0.0983 -0.0328,-0.19603 -0.0527,-0.28907 z m 1.50446,0.0878 c 0.0134,0.0468 0.031,0.0913 0.0533,0.13342 -0.0223,-0.0421 -0.0398,-0.0866 -0.0533,-0.13342 z m -10.03911,0.0404 c 0.002,0.017 0.004,0.0339 0.0129,0.0439 -0.009,-0.01 -0.0111,-0.0269 -0.0129,-0.0439 z m 0.43185,0.009 c 0.0334,0.0164 0.0656,0.0351 0.0965,0.055 -0.0304,-0.0193 -0.0632,-0.0386 -0.0965,-0.055 z m 4.89842,0.0129 c 0.0223,0.002 0.0457,0.006 0.0697,0.0111 -0.024,-0.005 -0.0474,-0.01 -0.0697,-0.0111 z m -0.0398,0.002 c -0.0234,0.002 -0.0439,0.006 -0.062,0.0146 0.0175,-0.008 0.0392,-0.0129 0.062,-0.0146 z m -0.19428,0.008 c 0.0111,7.6e-4 0.0421,0.008 0.0772,0.009 -0.0351,-0.002 -0.0661,-0.008 -0.0772,-0.009 z m -0.21183,0.0421 c 0.0158,5.7e-4 0.0334,0.006 0.0533,0.0111 -0.0293,-0.008 -0.055,-0.0117 -0.0772,-0.009 0.008,-5.8e-4 0.0158,-0.002 0.024,-0.002 z m -0.15156,0.0275 c 0.004,0 0.006,0.002 0.009,0.004 -0.005,-0.002 -0.0117,-0.004 -0.0217,-0.002 0.005,-7.6e-4 0.009,-0.002 0.0129,-0.002 z m 0.0568,0.0129 c 0,-5.7e-4 7.6e-4,0 0.002,0 -0.005,0.006 -0.0105,0.0123 -0.0146,0.0199 0.004,-0.008 0.008,-0.014 0.0129,-0.0199 z m -0.32009,0.0562 c 0.005,0.009 0.004,0.0216 -0.0129,0.0369 0.017,-0.0152 0.0181,-0.0275 0.0129,-0.0369 z m -0.0697,0.002 c -0.007,0.007 -0.0111,0.0175 -0.0111,0.031 0,0.0193 0.008,0.0415 0.0223,0.0585 0.024,-0.0205 0.0328,-0.0158 0.0398,-0.008 -0.007,-0.008 -0.0164,-0.009 -0.0398,0.009 -6.6e-4,-5.8e-4 0,-0.002 0,-0.002 -0.014,-0.0164 -0.0223,-0.0398 -0.0223,-0.0585 0,-0.0135 0.004,-0.024 0.0111,-0.031 z m 5.77091,0.038 c 0.0152,0.0181 0.0322,0.0351 0.0498,0.0515 -0.0175,-0.0164 -0.0339,-0.0334 -0.0498,-0.0515 z m -29.22905,0.0387 c -0.0448,0.12639 -0.0874,0.25572 -0.12435,0.38737 0.0369,-0.13165 0.0795,-0.26098 0.12435,-0.38737 z m 23.58454,0.004 c 0,5.7e-4 7.6e-4,7.6e-4 0.002,0.002 -0.0369,0.024 -0.0527,0.0223 -0.0626,0.0146 0.0105,0.006 0.0258,0.006 0.0608,-0.0164 z m 0.004,0.008 c 0.005,0.01 0.01,0.0199 0.009,0.0363 7.6e-4,-0.0164 -0.004,-0.0264 -0.009,-0.0363 z m -23.36686,0.0216 c 0.008,-5.8e-4 0.0169,-7.6e-4 0.0255,0 -2.2e-4,5.7e-4 2.2e-4,7.6e-4 0,0.002 -0.009,-7.6e-4 -0.0176,-0.002 -0.0255,-0.002 z m 0,0 c -0.016,5.7e-4 -0.0306,0.004 -0.0439,0.0111 0.0133,-0.007 0.0279,-0.0105 0.0439,-0.0111 z m 24.90584,0.0422 c 0.0129,0.0287 0.0252,0.0603 0.0345,0.093 0.0199,0.0656 0.0322,0.13693 0.0404,0.21066 -0.008,-0.0737 -0.0205,-0.14512 -0.0404,-0.21066 -0.009,-0.0328 -0.021,-0.0644 -0.0345,-0.093 z m -0.95089,0.0603 c -0.0351,0.002 -0.0702,0.008 -0.10241,0.0164 0.0322,-0.009 0.0673,-0.014 0.10241,-0.0164 z m -4.38699,0.062 c 0.0234,0.0363 0.0444,0.0732 0.0638,0.11001 -0.0193,-0.0369 -0.0404,-0.0737 -0.0638,-0.11001 z m 10.24801,0.0293 c -0.004,0.0374 -0.008,0.0761 -0.0129,0.11352 h -0.002 c 0.005,-0.0374 0.0111,-0.0761 0.0146,-0.11352 z m -6.23026,0.0697 c 0.005,0 0.0105,7.6e-4 0.0164,0.002 -0.0123,-7.7e-4 -0.0205,-0.003 -0.0345,0.004 0.006,-0.002 0.0129,-0.005 0.0181,-0.005 z m -1.01878,0.0843 c -0.0193,0.0503 -0.0351,0.1024 -0.0492,0.15331 0.014,-0.0509 0.0299,-0.10299 0.0492,-0.15331 z m 1.82514,0.038 c 0.0105,0.0152 0.0188,0.0322 0.0258,0.0498 -0.007,-0.0175 -0.0152,-0.0345 -0.0258,-0.0498 z m 0.32535,0.0223 c 0.0158,0.0439 0.0281,0.0901 0.0345,0.13692 -0.006,-0.0468 -0.0187,-0.093 -0.0345,-0.13692 z m 4.97567,0.005 c -0.0123,0.0123 -0.024,0.0228 -0.0398,0.031 0.0146,-0.008 0.0281,-0.0193 0.0398,-0.031 z m -0.11879,0.024 c 0.0129,0 0.0258,5.7e-4 0.0387,0.002 -0.0258,-0.002 -0.0509,-0.002 -0.0749,0 0.0117,-5.8e-4 0.024,-0.002 0.0363,-0.002 z m -6.68904,0.0656 c 0.0158,-5.7e-4 0.0328,0.002 0.0509,0.006 -0.0181,-0.004 -0.0351,-0.006 -0.0509,-0.006 z m 6.70542,0 c 0.0123,0.0123 -0.021,0.0468 -0.038,0.0825 0.0169,-0.0357 0.0503,-0.0702 0.038,-0.0825 z m -6.72941,0.004 c -0.021,0.005 -0.0398,0.014 -0.0544,0.0275 0.0146,-0.0135 0.0334,-0.0228 0.0544,-0.0275 z m 1.49628,0.0509 c 0.008,0.0123 0.0175,0.024 0.0269,0.0351 -0.01,-0.0111 -0.0187,-0.0228 -0.0269,-0.0351 z m 0.63607,0.008 c 0,0.0708 -0.003,0.13868 -0.008,0.1972 -7.6e-4,0.0216 -0.005,0.0433 -0.007,0.0644 0.003,-0.0216 0.004,-0.0439 0.005,-0.0661 0.005,-0.0585 0.009,-0.12464 0.009,-0.19544 z m 1.75901,0.007 c 0.006,0.0263 0.009,0.0521 0.009,0.079 0,-0.0269 -0.004,-0.0527 -0.009,-0.079 z m 2.45594,0.0404 c 6.7e-4,-5.8e-4 0.002,0 0.002,0 -0.0153,0.0175 -0.0304,0.0369 -0.0439,0.0568 0.0135,-0.0199 0.0269,-0.0392 0.0421,-0.0568 z m -1.71688,0.0146 c 0.002,0.0977 7.7e-4,0.19251 -0.002,0.28497 0.003,-0.0925 0.004,-0.18726 0.002,-0.28497 z m -3.76905,0.0216 c 0.0281,5.8e-4 0.0527,0.004 0.0732,0.0111 -0.0205,-0.007 -0.0451,-0.0105 -0.0732,-0.0111 z m -23.08306,0.002 c -0.0244,0.11352 -0.0425,0.22119 -0.053,0.32711 0.0105,-0.10592 0.0286,-0.21359 0.053,-0.32711 z m 14.02234,0.0252 c 0.006,0.0111 0.009,0.024 0.0111,0.0386 -0.002,-0.0135 -0.008,-0.0258 -0.0129,-0.0369 0,-5.8e-4 7.6e-4,-7.6e-4 0.002,-0.002 z m 9.28952,0.0369 c -6.6e-4,0.008 7.6e-4,0.0188 0.005,0.0293 -0.004,-0.0105 -0.006,-0.021 -0.005,-0.0293 z m -3.511,0.0603 c -0.01,0.1065 -0.0135,0.21417 -0.0164,0.32359 0.003,-0.10942 0.006,-0.21709 0.0164,-0.32359 z m 9.16838,0 c 0.006,0.006 0.0123,0.0135 0.0188,0.0199 -0.006,-0.006 -0.0123,-0.0135 -0.0188,-0.0199 z m -6.47135,0.0673 c 6.6e-4,0 7.6e-4,5.7e-4 0.002,0 0,0.0205 -7.6e-4,0.0404 0,0.0608 -7.6e-4,-0.0205 -0.002,-0.0404 -0.002,-0.0608 z m 0.0808,0.009 c 0.007,0.0123 0.0129,0.0287 0.0164,0.0474 -0.004,-0.0187 -0.009,-0.0351 -0.0164,-0.0474 z m 3.6643,0.0222 c -6.6e-4,7.7e-4 -7.6e-4,0.004 -0.002,0.005 0,5.7e-4 -0.002,-5.8e-4 -0.002,0 7.7e-4,-0.002 0.004,-0.004 0.004,-0.005 z m -1.76252,0.009 c 0.006,0.0175 0.008,0.038 0.007,0.0585 7.7e-4,-0.0205 -7.6e-4,-0.0409 -0.007,-0.0585 z m -13.46994,0.008 c -0.0275,0.005 -0.055,0.0117 -0.0825,0.0146 -0.17496,0.0193 -0.34641,0.0351 -0.51553,0.0509 0.16912,-0.0158 0.34057,-0.0339 0.51553,-0.0527 0.0275,-0.004 0.055,-0.008 0.0825,-0.0129 z m -11.36158,0.0457 c -0.0185,0.1258 -0.0303,0.25513 -0.0365,0.38386 0.006,-0.12873 0.018,-0.25806 0.0365,-0.38386 z m 12.1422,0.0439 c 0.0386,-0.002 0.0772,7.7e-4 0.11703,0.009 -0.0392,-0.008 -0.079,-0.0105 -0.11703,-0.009 z m -0.12231,0.0164 c -0.0813,0.017 -0.16092,0.0427 -0.24342,0.0585 -0.0936,0.0181 -0.1896,0.0398 -0.28673,0.0638 0.0971,-0.024 0.1931,-0.0457 0.28673,-0.0638 0.0819,-0.0158 0.16209,-0.0415 0.24342,-0.0585 z m 12.81163,0.004 c 0.004,0.007 0.009,0.0129 0.0146,0.0181 -0.006,-0.005 -0.0111,-0.0105 -0.0146,-0.0181 z m -4.55902,0.008 c 0.002,0.0234 0.004,0.0462 0.004,0.0691 0,0.0164 -0.004,0.0322 -0.007,0.048 0.004,-0.0158 0.005,-0.0316 0.005,-0.048 6.7e-4,-0.0228 6.7e-4,-0.0457 -0.002,-0.0691 z m -13.10071,0.0146 c 0.0421,0.0463 0.0831,0.0925 0.12113,0.14219 -0.038,-0.0492 -0.0796,-0.096 -0.12113,-0.14219 z m 13.47404,0.009 c 0.006,0.0427 0.0129,0.079 0.0217,0.0901 -0.009,-0.0111 -0.0158,-0.0474 -0.0217,-0.0901 z m 1.5267,0.0111 c 0.003,0.0509 0.008,0.10241 0.0164,0.15156 -0.008,-0.0492 -0.0134,-0.10065 -0.0164,-0.15156 z m 5.02131,0.009 c -0.006,0.0884 -0.0152,0.17203 -0.0275,0.25045 0.0123,-0.0784 0.021,-0.16209 0.0275,-0.25045 z m -3.83635,0.0111 c 0.0351,0.0304 0.0743,0.0556 0.11879,0.0749 -0.0439,-0.0193 -0.0837,-0.045 -0.11879,-0.0749 z m -0.46989,0.0105 c 0.0129,0.0334 0.031,0.0614 0.0509,0.0825 -0.0205,-0.0216 -0.0374,-0.0486 -0.0509,-0.0825 z m -11.97776,0.0456 c -0.0732,0.0228 -0.15742,0.0398 -0.24695,0.0533 0.0901,-0.0135 0.17322,-0.0298 0.24695,-0.0533 z m 0.005,0.002 c 0.003,7.6e-4 0.005,0.003 0.008,0.005 -0.002,-0.002 -0.005,-0.004 -0.008,-0.005 z m 13.70226,0.005 c -0.014,0.0357 -0.0304,0.0697 -0.0474,0.1024 0.017,-0.0322 0.0334,-0.0673 0.0474,-0.1024 z m -25.2353,0.0199 c -0.008,0.0919 -0.0116,0.18549 -0.011,0.27795 6.6e-4,0.096 0.005,0.19135 0.0146,0.28556 -0.009,-0.0942 -0.014,-0.18959 -0.0146,-0.28556 -6.7e-4,-0.093 0.004,-0.1855 0.011,-0.27795 z m 7.71133,0.0386 c 0.0749,0.0983 0.1457,0.19955 0.21065,0.30721 -0.0649,-0.10766 -0.13576,-0.20949 -0.21065,-0.30721 z m 13.58522,0.0129 c 0.002,0.0485 0.009,0.0954 0.0181,0.14044 -0.009,-0.0451 -0.0158,-0.0919 -0.0181,-0.14044 z m -2.14523,0.0474 c -0.008,0.008 -0.0134,0.0175 -0.0181,0.0293 0.005,-0.0117 0.0105,-0.0216 0.0181,-0.0293 z m -0.16969,0.0223 c 0.014,-5.8e-4 0.0299,0 0.0457,0.002 -6.7e-4,5.7e-4 0,7.6e-4 0,0.002 -0.0316,-0.004 -0.0608,-0.003 -0.0878,0.002 0.0134,-0.002 0.0275,-0.005 0.0421,-0.005 z m -16.63745,0.0181 c -0.0748,0.11294 -0.14401,0.23055 -0.20843,0.34935 0.0644,-0.1188 0.13364,-0.23641 0.20843,-0.34935 z m 16.51808,0.0111 c -0.0474,0.0223 -0.0901,0.0556 -0.12992,0.093 0.0398,-0.0374 0.0825,-0.0714 0.12992,-0.093 z m 1.88364,0.0234 c -0.004,0.0743 -0.008,0.1498 -0.0164,0.22471 0.008,-0.0749 0.0129,-0.15039 0.0164,-0.22471 z m -18.54801,0.0146 c -0.003,0.006 -0.006,0.0123 -0.009,0.0181 -0.0906,0.13224 -0.18626,0.27795 -0.27427,0.43536 0.0918,-0.16385 0.18907,-0.31774 0.2834,-0.4535 z m 9.0613,0.004 c -0.0667,0.0146 -0.13635,0.0223 -0.20481,0.031 -0.0691,0.009 -0.13693,0.0193 -0.2013,0.0369 0.0644,-0.0175 0.13225,-0.0275 0.2013,-0.0369 0.0685,-0.009 0.1381,-0.0164 0.20481,-0.031 z m 13.84094,0.0275 c -0.0216,0.0287 -0.0451,0.0556 -0.0697,0.0807 0.0245,-0.0251 0.048,-0.0521 0.0697,-0.0807 z m -20.03668,0.0223 c -2.2e-4,0.0123 0.002,0.0246 0.004,0.0345 -0.002,-0.0105 -0.004,-0.021 -0.004,-0.0345 z m 18.38183,0.0802 c -0.009,0.0216 -0.0129,0.0433 -0.0164,0.0644 0.004,-0.021 0.007,-0.0427 0.0164,-0.0644 z m -12.72386,0.002 c -0.0146,0.007 -0.0281,0.0135 -0.0439,0.0164 -0.23172,0.0509 -0.3587,0.0702 -0.58165,0.10474 0.22295,-0.0345 0.34818,-0.0556 0.5799,-0.1065 0.0158,-0.004 0.031,-0.008 0.0457,-0.0146 z m -2.58059,0.008 h 0.002 c 0.002,0.014 0.004,0.0281 0.007,0.0439 0.0187,0.0778 0.0603,0.17086 0.10591,0.25045 -0.0457,-0.0796 -0.0872,-0.17262 -0.10591,-0.25045 -0.004,-0.0158 -0.007,-0.0299 -0.009,-0.0439 z m 16.85104,0.005 c -0.0258,0.024 -0.0515,0.0457 -0.0802,0.0661 0.0281,-0.0205 0.055,-0.0427 0.0802,-0.0661 z m 4.3671,0.0164 h 0.002 c -0.0123,0.0515 -0.017,0.10182 -0.0146,0.15039 -0.002,-0.0486 6.6e-4,-0.0989 0.0129,-0.15039 z m -14.21252,0.002 c 0.01,0.009 0.0175,0.0181 0.024,0.0293 -0.006,-0.0105 -0.0146,-0.0205 -0.024,-0.0293 z m -9.95836,0.0251 c 0.002,0.006 0.002,0.0123 -0.002,0.024 0.004,-0.01 0.003,-0.0181 0.002,-0.024 z m 18.75224,0.0129 h 0.002 c 0.004,0.0105 0.008,0.0205 0.0129,0.0293 -0.005,-0.009 -0.0111,-0.0188 -0.0152,-0.0293 z m -0.2212,0.0129 c 0.014,0.0117 0.0293,0.0223 0.0457,0.031 -0.0169,-0.009 -0.0316,-0.0193 -0.0457,-0.031 z m -15.74974,0.0216 c 0.0304,0.0556 0.0603,0.11236 0.0878,0.17029 0.0275,0.0585 0.0533,0.11762 0.0767,0.17906 -0.0234,-0.0614 -0.0492,-0.12054 -0.0767,-0.17906 -0.0275,-0.0579 -0.0573,-0.11469 -0.0878,-0.17029 z m 15.43727,0.0205 c -0.004,0.007 -0.008,0.0146 -0.0146,0.0216 -6.6e-4,0 -7.6e-4,5.8e-4 -0.002,0 0.006,-0.007 0.0123,-0.0146 0.0164,-0.0216 z m -15.81764,0.002 c 0.0158,0.0117 0.031,0.0252 0.0457,0.0386 -0.0146,-0.0135 -0.0299,-0.0269 -0.0457,-0.0386 z m 17.23139,0.009 c -0.062,0.0345 -0.12932,0.0649 -0.19954,0.0878 0.0708,-0.0228 0.13752,-0.0527 0.19954,-0.0878 z m -5.76973,0.0199 c 0.0105,-5.7e-4 0.021,5.8e-4 0.031,0.002 -0.0205,-0.002 -0.0415,-5.7e-4 -0.062,0.004 -0.0304,0.006 -0.0585,0.0193 -0.0878,0.0369 0.0287,-0.0175 0.0579,-0.0304 0.0878,-0.0369 0.01,-0.002 0.021,-0.005 0.031,-0.005 z m 1.83449,0.009 c 0.01,0.0767 0.0222,0.15038 0.0363,0.2212 -0.014,-0.0708 -0.0264,-0.14455 -0.0363,-0.2212 z m -1.95504,0.0328 c -0.0386,0.0234 -0.0755,0.0556 -0.11176,0.0895 0.0363,-0.0345 0.0726,-0.0661 0.11176,-0.0895 z m 4.49876,0.0111 c 6.6e-4,0.002 0.003,0.004 0.005,0.007 -0.002,-0.003 -0.005,-0.004 -0.005,-0.007 z m 0.48218,0 c 0.0181,0.0123 0.0415,0.0223 0.0644,0.0345 -0.0228,-0.0123 -0.0463,-0.0223 -0.0644,-0.0345 z m 3.02881,0.005 c -0.0175,0.0492 -0.0363,0.0983 -0.0568,0.14454 0.0205,-0.0462 0.0392,-0.0954 0.0568,-0.14454 z m -20.81377,0.0146 c 0.0421,0.0269 0.0813,0.0562 0.11703,0.0878 -0.0357,-0.0316 -0.0749,-0.0608 -0.11703,-0.0878 z m 9.80505,0 c -0.0158,0.0205 -0.0304,0.0439 -0.0439,0.0697 0.0135,-0.0263 0.0281,-0.0492 0.0439,-0.0697 z m 7.42634,0.0164 c 0.006,0.005 0.0129,0.0105 0.0199,0.0146 -0.008,-0.004 -0.0135,-0.009 -0.0199,-0.0146 z m 0.0913,0 c -0.004,0.002 -0.006,0.005 -0.009,0.008 0.004,-0.003 0.005,-0.005 0.009,-0.008 z m -8.27659,0.0205 c 0.002,-5.7e-4 0.005,0.002 0.008,0.004 -0.005,-0.003 -0.0111,-0.005 -0.0146,0 0.002,-0.002 0.005,-0.004 0.007,-0.004 z m -13.25752,0.0544 c -0.12242,0.21943 -0.23407,0.45818 -0.31272,0.7022 0.0783,-0.2446 0.19007,-0.48277 0.31272,-0.7022 z m 16.84927,0.0205 c 0,-5.7e-4 7.7e-4,0 0.002,0 -0.0345,0.0363 -0.0667,0.0732 -0.0971,0.10592 -0.0188,0.0199 -0.0369,0.0421 -0.055,0.0638 0.0181,-0.0216 0.0345,-0.0439 0.0533,-0.0638 0.0304,-0.0328 0.0626,-0.0697 0.0971,-0.10592 z m -15.63856,0.002 c -0.0366,0.0579 -0.0786,0.10885 -0.11885,0.16269 0.0402,-0.0538 0.0823,-0.10475 0.11885,-0.16269 z m 12.51846,0.038 c -0.006,0.017 -0.0105,0.0345 -0.0146,0.0515 0.004,0.008 0.004,0.0158 0.006,0.0234 -0.002,-0.008 -0.004,-0.0153 -0.008,-0.0234 0.004,-0.017 0.01,-0.0345 0.0164,-0.0515 z m -14.66193,0.0223 c 0.0171,0.0661 0.031,0.14102 0.0494,0.21417 -0.0184,-0.0732 -0.0323,-0.14805 -0.0494,-0.21417 z m 18.89912,0.0199 c 0.01,0.0111 0.0199,0.021 0.0293,0.0328 -0.009,-0.0117 -0.0193,-0.0216 -0.0293,-0.0328 z m 10.16375,0.0457 c -7.6e-4,0.0392 0.005,0.0907 0.002,0.14102 0.003,-0.0503 -0.003,-0.10181 -0.002,-0.14102 z m -23.5822,0.0223 c 0.0164,0.0158 0.031,0.0357 0.0398,0.0585 -0.009,-0.0228 -0.0234,-0.0427 -0.0398,-0.0585 z m 1.87253,0.0146 h 0.002 c 0.003,0.0181 0.005,0.0363 0.007,0.055 -0.002,-0.0188 -0.006,-0.0369 -0.009,-0.055 z m -1.69698,0.007 c 0.004,0.008 0.008,0.014 0.0129,0.0205 0.0216,0.0287 0.0468,0.0585 0.0732,0.0895 -0.0264,-0.031 -0.0533,-0.0608 -0.0755,-0.0895 -0.005,-0.006 -0.007,-0.0135 -0.0105,-0.0205 z m 17.57664,0.004 c 0.008,0.0175 0.0222,0.0334 0.0386,0.0474 -0.0164,-0.014 -0.0304,-0.0299 -0.0386,-0.0474 z m -4.25533,0.0164 c 0.0152,0.0269 0.0287,0.0568 0.0404,0.0878 -0.0117,-0.031 -0.0252,-0.0608 -0.0404,-0.0878 z m 10.06486,0.17379 c -0.008,0.0146 -0.0175,0.0263 -0.031,0.038 0.0123,-0.0111 0.024,-0.024 0.031,-0.038 z m -24.83621,0.009 c 0.0692,0.024 0.13348,0.0521 0.19205,0.086 -0.0585,-0.0339 -0.12282,-0.062 -0.19205,-0.086 z m 21.52651,0.0404 c 6.6e-4,-5.7e-4 0.002,5.8e-4 0.002,0 -0.006,0.008 -0.0129,0.0175 -0.0181,0.0258 0.005,-0.008 0.0105,-0.0175 0.0164,-0.0258 z m 3.23304,0.0199 c 7.6e-4,0.0228 -6.6e-4,0.0427 -0.004,0.0603 -0.003,0.0181 -0.009,0.0334 -0.0146,0.048 0.006,-0.0146 0.0111,-0.0299 0.0146,-0.048 0.003,-0.0175 0.005,-0.0374 0.004,-0.0603 z m -29.8306,0.0205 c 0.0294,0.0895 0.0624,0.17146 0.0969,0.2487 -0.0346,-0.0772 -0.0675,-0.15916 -0.0969,-0.2487 z m 5.34491,0.0603 c 0.0263,0.0193 0.0521,0.0398 0.0749,0.062 -0.0228,-0.0223 -0.0486,-0.0427 -0.0749,-0.062 z m -4.78169,0.0258 c 0.0156,0.0579 0.0337,0.11469 0.053,0.1697 -0.0193,-0.055 -0.0374,-0.11176 -0.053,-0.1697 z m 5.9886,0.0363 c 0.0234,0.055 0.0485,0.11528 0.0696,0.17556 -0.021,-0.0603 -0.0463,-0.11996 -0.0696,-0.17556 z m 22.91101,0.004 c -0.0275,0.004 -0.055,0.0105 -0.0808,0.0188 -0.0392,0.0117 -0.0749,0.0287 -0.10766,0.0492 0.0322,-0.0199 0.0691,-0.0374 0.10766,-0.0492 0.0264,-0.008 0.0527,-0.0146 0.0808,-0.0188 z m -22.62604,0.0334 c 0.002,0.0146 7.6e-4,0.031 0.002,0.0457 -7.7e-4,-0.0146 -6.7e-4,-0.031 -0.002,-0.0457 z m 1.31136,0.002 c 0.002,0.0111 0.002,0.0223 -0.005,0.0328 -0.004,0.005 -0.009,0.009 -0.0164,0.0146 0.006,-0.005 0.0129,-0.009 0.0164,-0.0146 0.008,-0.0105 0.008,-0.0216 0.005,-0.0328 z m 21.29478,0.0544 c 0.002,0.004 0.004,0.008 0.002,0.0129 0.002,-0.005 0,-0.009 -0.002,-0.0129 z m -25.03048,0.009 c -0.006,0.004 -0.013,0.009 -0.0182,0.0146 0.005,-0.006 0.0117,-0.0105 0.0182,-0.0146 z m 1.10268,0.008 c 0.0188,0.0263 0.0357,0.0544 0.0509,0.0837 -0.0146,-0.0293 -0.0328,-0.0579 -0.0509,-0.0837 z m 15.3296,0.007 c 0.0304,0.0755 0.0649,0.14688 0.10241,0.21593 -0.0374,-0.0691 -0.072,-0.14044 -0.10241,-0.21593 z m -17.82006,0.005 c -0.0247,0.0422 -0.0486,0.086 -0.0695,0.13225 0.021,-0.0463 0.0448,-0.0901 0.0695,-0.13225 z m -0.50108,0.0129 c -0.0193,0.0661 -0.0358,0.13459 -0.0512,0.20481 0.0153,-0.0697 0.0321,-0.13927 0.0512,-0.20481 z m 2.30046,0.0404 c 0.0154,-7.6e-4 0.0309,-5.7e-4 0.0475,0 -0.0835,-0.002 -0.15068,0.0181 -0.2103,0.0422 -0.0834,0.0334 -0.15133,0.0732 -0.2322,0.0697 0.0801,0.003 0.14933,-0.0363 0.2322,-0.0697 0.0477,-0.0193 0.101,-0.0374 0.16279,-0.0422 z m -2.49245,0.008 c -0.006,0.0743 -0.021,0.14688 -0.0384,0.21944 0.0174,-0.0726 0.0319,-0.14512 0.0384,-0.21944 z m 19.63466,0.004 c 0.009,7.6e-4 0.017,0.005 0.0269,0.009 -0.0182,-0.008 -0.0351,-0.01 -0.0509,-0.008 0.007,-7.6e-4 0.0158,-0.003 0.024,-0.002 z m -0.048,0.007 c -0.0223,0.008 -0.0427,0.0223 -0.0638,0.0316 0.021,-0.009 0.0415,-0.0234 0.0638,-0.0316 z m -20.46033,0.002 c -0.009,0.0304 -0.0162,0.0603 -0.0238,0.0913 -0.0178,0.072 -0.0349,0.14102 -0.0512,0.21007 0.0163,-0.0685 0.0318,-0.1381 0.0494,-0.21007 v -0.002 c 0.008,-0.0304 0.017,-0.0597 0.0256,-0.0895 z m 0.24506,0 c -0.0314,0.0983 -0.0631,0.1972 -0.0878,0.29609 0.0246,-0.0989 0.0563,-0.19778 0.0878,-0.29609 z m -1.05698,0.0181 c 0.0213,0.0533 0.0444,0.10533 0.0695,0.15507 -0.0251,-0.0498 -0.0482,-0.10182 -0.0695,-0.15507 z m 16.28985,0.0509 c 0.003,0.003 0.005,0.005 0.009,0.008 -0.004,-0.002 -0.006,-0.005 -0.009,-0.008 z m -15.58765,0.0188 c -0.006,0.0474 -0.0154,0.0948 -0.0238,0.1422 0.008,-0.0468 0.0156,-0.0936 0.022,-0.14044 4.4e-4,-7.7e-4 0.002,-7.7e-4 0.002,-0.002 z m 3.74875,0.007 c 0.0203,0.0111 0.0417,0.0216 0.0658,0.0293 -0.0242,-0.008 -0.0455,-0.0181 -0.0658,-0.0293 z m 24.24636,0.0129 c -0.008,0.0263 -0.0205,0.048 -0.0386,0.0638 0.0181,-0.0158 0.0304,-0.0374 0.0386,-0.0638 z m -3.04287,0.031 c -0.0205,0.0345 -0.0497,0.0656 -0.0807,0.0989 0.031,-0.0334 0.0603,-0.0644 0.0807,-0.0989 z m -0.59628,0.0216 c 0.0153,0.0111 0.0258,0.0175 0.0345,0.0188 -0.009,-7.6e-4 -0.0193,-0.008 -0.0345,-0.0188 z m 0.12815,0.006 h 0.002 c -6.7e-4,0.0146 -0.004,0.0251 -0.005,0.0328 0.002,-0.008 0.003,-0.0175 0.004,-0.0328 z m -10.02858,0.0146 c 0.008,0.0158 0.014,0.0345 0.0146,0.0568 -6.6e-4,-0.0223 -0.006,-0.0409 -0.0146,-0.0568 z m 13.5232,0.0404 c 0.005,0.007 0.0105,0.0135 0.0164,0.0199 -0.006,-0.006 -0.0117,-0.0129 -0.0164,-0.0199 z m -3.22602,0.0421 c 7.6e-4,0.004 0.002,0.008 0.002,0.014 0,0 -7.6e-4,5.8e-4 -0.002,0 6.6e-4,-0.006 7.6e-4,-0.01 0,-0.014 z m -0.31659,0.002 h 0.002 c 6.6e-4,0.005 7.6e-4,0.009 0.004,0.0123 -0.002,-0.004 -0.005,-0.008 -0.006,-0.0123 z m -25.61155,0.004 c 0.049,0.0825 0.0976,0.16503 0.14992,0.24519 -0.0523,-0.0802 -0.10088,-0.16268 -0.14992,-0.24519 z m 3.97914,0.0258 c -0.0226,0.0444 -0.0416,0.0919 -0.0549,0.14629 0.0133,-0.0538 0.0327,-0.1024 0.0549,-0.14629 z m 15.73921,0.0181 c -0.0228,-5.7e-4 -0.0422,0.004 -0.0568,0.0129 -0.008,0.004 -0.014,0.0105 -0.0205,0.0164 0.006,-0.006 0.0123,-0.0117 0.0205,-0.0164 0.0146,-0.009 0.0328,-0.0135 0.0568,-0.0129 z m -3.37056,0.0275 c -0.005,0.0275 -0.008,0.0533 -0.009,0.0802 6.6e-4,-0.0269 0.004,-0.0527 0.009,-0.0802 z m 4.54265,0 c 0.038,0.0656 0.0743,0.1305 0.10766,0.19545 -0.0334,-0.0649 -0.0696,-0.1299 -0.10766,-0.19545 z m -20.22101,0.0439 c 0.0465,0.0649 0.0979,0.12522 0.15361,0.17906 -0.0557,-0.0538 -0.10709,-0.1141 -0.15361,-0.17906 z m 0.75159,0.0105 c -0.0127,0.0656 -0.0203,0.12932 -0.022,0.19252 -6.6e-4,0.0258 6.6e-4,0.0538 0.004,0.0819 -0.003,-0.0281 -0.006,-0.0562 -0.005,-0.0819 0.002,-0.0632 0.0112,-0.12698 0.0238,-0.19252 z m 20.33453,0 c 0.0258,0.0515 0.0579,0.0966 0.093,0.13927 -0.0351,-0.0427 -0.0673,-0.0878 -0.093,-0.13927 z m -5.12782,0.0187 c -0.006,0.004 -0.0152,0.009 -0.0234,0.0105 v -0.002 c 0.008,-0.002 0.017,-0.005 0.0234,-0.009 z m 2.95685,0.0164 c -0.005,0.007 -0.009,0.0135 -0.014,0.0199 -6.7e-4,5.8e-4 -0.002,0 -0.002,0 0.006,-0.006 0.0117,-0.0129 0.0164,-0.0199 z m -14.98201,0.007 c 0.012,0 0.0248,0.002 0.0366,0.004 -0.0117,-0.002 -0.0245,-0.002 -0.0366,-0.002 -0.0155,0 -0.0303,0.002 -0.0457,0.005 -0.0309,0.007 -0.0614,0.0205 -0.0914,0.038 0.0301,-0.0175 0.0605,-0.031 0.0914,-0.038 0.0155,-0.004 0.0303,-0.007 0.0457,-0.008 z m 11.9684,0.0275 c 6.6e-4,0 0.002,5.8e-4 0.002,0 0.008,0.007 0.0117,0.0146 0.0164,0.0223 -0.005,-0.008 -0.0105,-0.0153 -0.0188,-0.0223 z m -11.82738,0.0129 c 0.0238,0.01 0.0487,0.0193 0.0749,0.0258 0.0262,0.006 0.0538,0.009 0.0841,0.005 -0.0303,0.004 -0.0579,7.6e-4 -0.0841,-0.005 -0.0262,-0.006 -0.0512,-0.0158 -0.0749,-0.0258 z m 11.85488,0.0328 c 0.004,0.0158 0.004,0.031 0,0.048 0.004,-0.017 0.004,-0.0322 0,-0.048 z m 2.83104,0.006 c -0.0907,0.0444 -0.17731,0.0942 -0.25806,0.1498 0.0807,-0.0562 0.16677,-0.10474 0.25806,-0.1498 z m -15.51978,0.0111 c -0.004,0.0304 -0.005,0.0626 -0.005,0.0966 h -0.002 c 2.2e-4,-0.0339 0.004,-0.0661 0.008,-0.0966 z m -1.35688,0.0269 c -0.002,5.8e-4 -0.005,0.002 -0.008,0.004 0.003,-0.002 0.005,-0.004 0.008,-0.004 z m 15.84923,0 c 0.0328,0.0726 0.0726,0.14162 0.10767,0.21242 -0.0357,-0.0708 -0.0743,-0.13927 -0.10767,-0.21242 z m 7.09865,0.0258 c 6.6e-4,0.004 0.002,0.008 0.004,0.0111 -0.002,-0.003 -0.003,-0.007 -0.004,-0.0111 z m -21.63828,0.0129 c 0.003,0 0.004,0.002 0.005,0.004 -0.002,-7.6e-4 -0.002,-7.6e-4 -0.005,-0.002 0,-5.7e-4 -6e-5,-7.6e-4 0,-0.002 z m 21.65642,0.0164 c 0.003,0.004 0.006,0.008 0.008,0.0129 -7.6e-4,-0.005 -0.005,-0.009 -0.008,-0.0129 z m -19.85703,0.006 c 0.003,0.0117 7.6e-4,0.0228 -0.002,0.0345 0.003,-0.0111 0.004,-0.0234 0.002,-0.0345 z m -1.77575,0.007 c 0.002,7.6e-4 0.005,0.004 0.008,0.004 -0.004,0 -0.005,-0.002 -0.008,-0.004 z m 21.55284,0.007 c -0.017,-5.7e-4 -0.0334,0.002 -0.0404,0.008 0.007,-0.006 0.0234,-0.008 0.0404,-0.008 z m 3.81997,0 c -0.008,0.0673 -0.0188,0.13284 -0.0328,0.19779 0.014,-0.0644 0.0252,-0.13108 0.0328,-0.19779 z m -29.026,0.002 c 0.0424,0.0568 0.0878,0.11001 0.13716,0.16092 -0.0494,-0.0509 -0.0948,-0.10416 -0.13716,-0.16092 z m 25.13991,0.0164 c 0.0111,5.8e-4 0.0316,0.0117 0.0345,0.0105 -0.003,7.6e-4 -0.0234,-0.01 -0.0345,-0.0105 z m -0.0345,0.009 c 0.004,-5.7e-4 0.008,0 0.0129,0 h 0.002 c -0.004,0.006 -0.008,0.0135 -0.0129,0.0188 0.005,-0.005 0.008,-0.0123 0.0111,-0.0188 -0.0105,-5.7e-4 -0.0175,0.002 -0.024,0.006 0.003,-0.002 0.007,-0.005 0.0111,-0.006 z m -21.07183,0.0334 c -0.0214,0.0345 -0.0396,0.072 -0.0549,0.10942 0.0153,-0.0374 0.0335,-0.0749 0.0549,-0.10942 z m 21.06072,0.004 c 0.008,0.006 0.024,0.005 0.0369,0.007 -0.0129,-0.002 -0.0287,-5.7e-4 -0.0369,-0.007 z m -24.18375,0.0146 c -0.005,0.0673 -0.009,0.1346 -0.009,0.2013 2.2e-4,-0.0667 0.004,-0.134 0.009,-0.2013 z m 17.91135,0.0474 c -0.0175,0.0158 -0.0357,0.0345 -0.0527,0.0515 0.0175,-0.0175 0.0339,-0.0351 0.0527,-0.0515 z m -17.64101,0.002 c 0.01,0.0591 0.0218,0.11879 0.0274,0.17731 -0.005,-0.0585 -0.0178,-0.11821 -0.0274,-0.17731 z m 19.91263,0.002 c 0.0369,0.0468 0.0732,0.096 0.11293,0.14278 -0.0398,-0.0468 -0.0761,-0.096 -0.11293,-0.14278 z m -20.90566,0.0825 c 0.0349,0.0316 0.0703,0.062 0.10972,0.0895 -0.0391,-0.0275 -0.0752,-0.0579 -0.10972,-0.0895 z m 21.69563,0.008 c 0.0275,0.006 0.0538,0.0135 0.0802,0.0234 -0.0258,-0.01 -0.0533,-0.0175 -0.0802,-0.0234 z m 3.02414,0.002 c 6.6e-4,0 0.002,-5.8e-4 0.002,0 -0.002,0.002 -0.006,0.006 -0.009,0.0123 0.003,-0.005 0.005,-0.01 0.007,-0.0123 z m -6.18814,0.009 c -0.048,0.0556 -0.0907,0.11703 -0.12581,0.18667 0.0351,-0.0697 0.0778,-0.13108 0.12581,-0.18667 z m -13.78066,0.002 c 0.006,0.007 0.0123,0.014 0.0181,0.0205 -7.6e-4,0.01 -0.003,0.021 -0.004,0.031 6.7e-4,-0.0105 6.7e-4,-0.0205 0.002,-0.031 -0.006,-0.006 -0.0105,-0.0135 -0.0164,-0.0205 z m 19.90677,0.0369 c -0.002,0.002 -0.004,0.004 -0.007,0.005 0.003,-0.002 0.005,-0.004 0.007,-0.005 z m -18.59365,0.0111 c 0.024,7.6e-4 0.048,0 0.0714,0.002 v 0.002 c -0.024,-7.6e-4 -0.048,-0.002 -0.0714,-0.004 z m 18.63929,0 c 7.6e-4,0.003 0.003,0.007 0.006,0.009 -0.004,-0.002 -0.005,-0.005 -0.006,-0.009 z m -20.29941,0.0439 c 6.6e-4,-5.7e-4 0.002,0 0.002,0 -0.004,0.004 -0.006,0.007 -0.008,0.0105 7.7e-4,-0.003 0.002,-0.007 0.005,-0.0105 z m -4.23151,0.0181 c 0.0417,0.0251 0.0862,0.048 0.13353,0.0673 -0.0479,-0.0199 -0.0915,-0.0421 -0.13353,-0.0673 z m 18.96289,0.0216 c -0.062,0.0304 -0.12288,0.0614 -0.17731,0.0808 0.0544,-0.0193 0.11528,-0.0503 0.17731,-0.0808 z m -18.41986,0.0146 c 0.002,0.0661 0.006,0.13225 0.0128,0.19779 -0.006,-0.0656 -0.0107,-0.13166 -0.0128,-0.19779 z m 5.3909,0 c -0.0105,0.01 -0.0234,0.0187 -0.0345,0.0275 0.0111,-0.009 0.0234,-0.017 0.0345,-0.0275 z m -1.83789,0.0732 c 0.0121,0.009 0.0276,0.0158 0.0439,0.0205 -0.0163,-0.005 -0.0318,-0.0111 -0.0439,-0.0205 z m 16.95519,0.008 c 6.7e-4,0 0.002,-5.7e-4 0.002,0 -0.002,0.0146 0.003,0.0275 0.0129,0.0422 -0.01,-0.0146 -0.017,-0.0275 -0.0146,-0.0422 z m -16.81065,0.007 c -1.2e-4,5.8e-4 1.8e-4,0.002 0,0.002 -0.0153,0.006 -0.0319,0.009 -0.0493,0.009 0.0174,-5.7e-4 0.0341,-0.005 0.0493,-0.0111 z m 17.75628,0.0223 c 0.0164,0.0105 0.0328,0.0193 0.0474,0.0275 v 0.002 c -0.0152,-0.008 -0.0304,-0.0181 -0.0474,-0.0293 z m -3.30267,0.007 c 6.6e-4,0 0.002,5.7e-4 0.002,0 -0.0498,0.0533 -0.0966,0.12405 -0.13517,0.2048 0.0386,-0.0807 0.0837,-0.15156 0.13341,-0.2048 z m -14.09139,0.008 c -0.005,7.6e-4 -0.0123,0.005 -0.0181,0.009 0,-5.7e-4 -6.7e-4,-0.002 0,-0.002 0.006,-0.004 0.0129,-0.006 0.0181,-0.007 z m 0.0293,0.005 c 0.009,0.004 0.0152,0.009 0.0234,0.0129 0.009,0.004 0.0175,0.006 0.0275,0.004 -0.01,0.003 -0.0188,5.7e-4 -0.0275,-0.004 -0.008,-0.004 -0.0146,-0.009 -0.0234,-0.0129 z m 19.19872,0.0474 c -0.003,0.007 -0.006,0.0105 -0.0111,0.0152 0.004,-0.005 0.008,-0.009 0.0111,-0.0152 z m -19.27947,0.004 c -0.0143,0.0275 -0.0265,0.0568 -0.0457,0.0784 0.019,-0.021 0.0317,-0.0509 0.0457,-0.0784 z m 13.61974,0.007 c -0.008,0.0269 -0.0153,0.0538 -0.0216,0.0825 h -0.002 c 0.006,-0.0287 0.0152,-0.0556 0.0234,-0.0825 z m 4.30273,0 c 0.0726,0.0117 0.15448,0.0175 0.23231,0.0258 -0.0778,-0.008 -0.15975,-0.014 -0.23231,-0.0258 z m 6.03306,0.004 c -0.0409,0.0872 -0.0884,0.16911 -0.14278,0.24459 0.0544,-0.0755 0.10182,-0.1574 0.14278,-0.24459 z m -5.24309,0.0562 c 0.003,0.01 0.009,0.0175 0.008,0.0223 7.6e-4,-0.005 -0.005,-0.0123 -0.008,-0.0223 z m -17.531,0.006 c 0.0146,-0.002 0.021,0.002 0.0223,0.007 -0.002,-0.004 -0.009,-0.009 -0.0223,-0.007 z m 17.70304,0.0146 c -7.6e-4,0.005 -0.004,0.008 -0.007,0.009 0.003,-0.002 0.006,-0.005 0.007,-0.009 z m -0.0527,0.004 c 0,-5.7e-4 7.7e-4,5.8e-4 0.002,0 -0.002,0.003 -0.005,0.007 -0.006,0.0111 -6.6e-4,0.004 -7.6e-4,0.008 -0.002,0.0129 -6.7e-4,-5.7e-4 -7.7e-4,0 -0.002,0 6.7e-4,-0.005 0.003,-0.009 0.004,-0.0129 7.7e-4,-0.004 0.002,-0.008 0.004,-0.0111 z m -2.41556,0.0275 c 0.0228,0.0281 0.0486,0.0556 0.0726,0.0819 0,0 -7.7e-4,5.8e-4 -0.002,0 -0.0245,-0.0263 -0.048,-0.0538 -0.0708,-0.0819 z m -17.47131,0.031 c -0.0151,0.005 -0.0291,0.006 -0.042,0.004 0.013,0.002 0.0269,0.002 0.042,-0.004 z m 0.17011,0.005 c 0.0334,0.0328 0.0676,0.0638 0.0987,0.0919 -0.0315,-0.0287 -0.065,-0.0591 -0.0987,-0.0919 z m 14.86673,0.048 c -0.0175,0.0427 -0.0328,0.0872 -0.0457,0.13342 -0.0129,0.0451 -0.0234,0.0925 -0.031,0.13869 0.008,-0.0468 0.0181,-0.0931 0.031,-0.13869 0.0129,-0.0463 0.0281,-0.0907 0.0457,-0.13342 z m -14.38397,0.0164 c -0.005,0.005 -0.0112,0.01 -0.0183,0.0146 0.007,-0.004 0.0131,-0.01 0.0183,-0.0146 z m 23.32063,0.031 c 0.0322,-7.6e-4 0.0656,0.002 0.0989,0.009 -0.0339,-0.007 -0.0661,-0.0105 -0.0989,-0.009 z m -27.04755,0.0111 c 0.0123,0.0649 0.0258,0.12522 0.0402,0.18257 0.0145,0.0573 0.0296,0.11293 0.0493,0.16443 -0.0197,-0.0515 -0.0349,-0.10708 -0.0493,-0.16443 -0.0145,-0.0573 -0.028,-0.11762 -0.0402,-0.18257 z m 27.30737,0.0638 c 0.0234,0.014 0.0462,0.0275 0.0656,0.0439 -0.0193,-0.0164 -0.0421,-0.0299 -0.0656,-0.0439 z m -0.44649,0.0199 c -0.005,0.008 -0.008,0.0158 -0.0129,0.024 h -0.002 c 0.005,-0.008 0.01,-0.0164 0.0146,-0.024 z m -26.367,0.0568 c 0.0253,0.14629 0.0581,0.28088 0.0987,0.41137 -0.0406,-0.13049 -0.0735,-0.26508 -0.0987,-0.41137 z m 27.08207,0.0954 c 0.0369,0.003 0.0743,0.0111 0.11528,0.0234 -0.0409,-0.0123 -0.0784,-0.0205 -0.11528,-0.0234 z m -26.38748,0.0421 c 0.019,0.0486 0.0405,0.096 0.064,0.14219 -0.0236,-0.0462 -0.045,-0.0936 -0.064,-0.14219 z m 26.13528,0.0328 c -0.0427,0.031 -0.0895,0.0632 -0.13166,0.10064 0.0421,-0.038 0.0884,-0.0697 0.13166,-0.10064 z m -21.79243,0.12817 c -0.0105,0.009 -0.0216,0.0187 -0.0328,0.0269 0.0117,-0.008 0.0223,-0.0175 0.0328,-0.0269 z m -5.23525,0.0732 c 0.0197,0.0603 0.042,0.12172 0.064,0.18081 0.0411,0.0538 0.0798,0.11294 0.11703,0.17556 0.0372,0.0626 0.0713,0.12932 0.10241,0.19778 -0.0311,-0.0685 -0.0652,-0.13517 -0.10241,-0.19778 -0.0373,-0.0626 -0.0778,-0.12172 -0.1189,-0.17556 -0.022,-0.0591 -0.0425,-0.12053 -0.0621,-0.18081 z m 19.16829,0.0123 c -0.006,0.0374 -0.0169,0.0708 -0.0293,0.10065 0.0123,-0.0299 0.0228,-0.0632 0.0293,-0.10065 z m -19.20457,0.12113 c 0.002,0.002 0.002,0.004 0.004,0.005 0.004,0.0205 0.008,0.0433 0.0146,0.0661 -0.008,-0.0245 -0.0146,-0.0498 -0.0183,-0.0714 z m 4.54446,0.004 c 0.002,0.024 -6.6e-4,0.048 0.002,0.0678 -0.002,-0.0199 6.6e-4,-0.0439 -0.002,-0.0678 z m 22.25036,0.0714 c -0.004,0.0802 -0.002,0.16502 -0.0164,0.24285 0.0146,-0.0784 0.0123,-0.1621 0.0164,-0.24285 z m -7.72419,0.0533 c -0.0316,0.0316 -0.0656,0.0608 -0.10006,0.0895 0.0345,-0.0287 0.0691,-0.0585 0.10006,-0.0895 z m -17.15941,0.0509 c 0.0608,0.0527 0.12762,0.0977 0.20112,0.13693 -0.0735,-0.0392 -0.14033,-0.0843 -0.20112,-0.13693 z m 16.99205,0.0954 c -0.0444,0.038 -0.0878,0.0802 -0.12054,0.13107 0.0334,-0.0515 0.0755,-0.0925 0.12054,-0.13107 z m -0.87014,0.0328 c 0.0281,0.0287 0.0573,0.0579 0.0878,0.086 0.0895,0.0831 0.18492,0.15974 0.28147,0.23758 -0.0966,-0.0778 -0.19194,-0.15449 -0.28147,-0.23758 -0.0304,-0.0281 -0.0591,-0.0568 -0.0878,-0.086 z m -15.84396,0.0474 c 0.077,0.0357 0.15811,0.0661 0.2432,0.093 -0.0851,-0.0269 -0.16619,-0.0573 -0.2432,-0.093 z m 0.59066,0.0457 c 0.0225,0.009 0.046,0.0164 0.0694,0.024 0.014,0.004 0.0279,0.008 0.0421,0.0105 -0.0142,-0.002 -0.0281,-0.005 -0.0421,-0.009 -0.0235,-0.007 -0.047,-0.0164 -0.0694,-0.0258 z m 16.0242,0.024 c 0.0228,0.0158 0.0497,0.0299 0.0772,0.0421 -0.0275,-0.0123 -0.0544,-0.0263 -0.0772,-0.0421 z m 0.65656,0.0216 c -0.0673,0.0497 -0.13401,0.10181 -0.19721,0.15565 v -0.002 c 0.0632,-0.0538 0.12991,-0.10416 0.19721,-0.1539 z m -17.981,0.008 c 0.0774,0.0778 0.15543,0.15214 0.2377,0.22294 -0.0827,-0.0708 -0.15999,-0.14512 -0.2377,-0.22294 z m 3.68655,0.0421 c -6.6e-4,0 6.6e-4,7.6e-4 0,0.002 -0.0146,0.0153 -0.0304,0.0263 -0.0457,0.038 0.0153,-0.0117 0.031,-0.0252 0.0457,-0.0398 z m -2.02795,0.002 c 0.0127,0.008 0.0262,0.0164 0.0384,0.0275 6e-5,5.7e-4 -6e-5,0.002 0,0.002 -0.0122,-0.0111 -0.0256,-0.0216 -0.0384,-0.0293 z m 23.57167,0.002 c -0.021,0.0357 -0.0433,0.0678 -0.0679,0.0971 -0.0169,0.0193 -0.0351,0.0363 -0.0533,0.0544 0.0181,-0.0175 0.0369,-0.0351 0.0533,-0.0544 0.0245,-0.0293 0.0468,-0.0614 0.0679,-0.0971 z m -23.94618,0.005 c 0.0553,0.0117 0.11382,0.0193 0.16637,0.0334 -0.0525,-0.014 -0.11101,-0.0216 -0.16637,-0.0334 z m 16.23076,0.006 c 0.038,0.0146 0.0749,0.0304 0.10591,0.0509 -0.031,-0.0205 -0.0678,-0.0363 -0.10591,-0.0509 z m 1.47754,0.004 c 0.0117,0.006 0.0216,0.014 0.031,0.024 -0.009,-0.009 -0.0199,-0.0181 -0.031,-0.024 z m -0.0802,0.005 c 0.0316,0.045 0.055,0.086 0.0714,0.12639 -0.0164,-0.0404 -0.0398,-0.0813 -0.0714,-0.12639 z m -19.06764,0.002 c 0.0579,0.0579 0.1165,0.11703 0.17736,0.17379 -0.0611,-0.0573 -0.11914,-0.11586 -0.17736,-0.17379 z m 17.81831,0.0755 c 0.007,0.006 0.0129,0.0123 0.0188,0.0199 -0.006,-0.008 -0.0123,-0.0135 -0.0188,-0.0199 z m -14.11889,0.009 c -0.017,0.0123 -0.0339,0.0263 -0.0509,0.0421 -0.0164,0.0146 -0.0334,0.0281 -0.0515,0.0421 0.0182,-0.014 0.0351,-0.0293 0.0515,-0.0439 0.0169,-0.0158 0.0339,-0.0281 0.0509,-0.0404 z m -1.61272,0.005 c 0.0248,-5.8e-4 0.0512,0.002 0.0768,0.004 -0.0256,-0.002 -0.052,-0.005 -0.0768,-0.004 z m -0.0366,0.006 c -0.0175,0.004 -0.0342,0.01 -0.0494,0.0216 0.0152,-0.0117 0.0319,-0.0175 0.0494,-0.0216 z m 1.79909,0.055 c -0.0439,0.0199 -0.0907,0.0533 -0.13692,0.0913 0.0462,-0.038 0.093,-0.0714 0.13692,-0.0913 z m -3.454,0.005 c 0.062,0.0533 0.12575,0.10416 0.19381,0.15155 -0.0677,-0.0468 -0.13213,-0.0989 -0.19381,-0.15155 z m 17.06345,0.031 c 0.005,0.002 0.0105,0.002 0.0164,0.002 v 0.002 c -0.006,5.7e-4 -0.0117,-0.002 -0.0164,-0.004 z m -18.35081,0.0275 c 0.009,0.0351 0.0178,0.0697 0.0238,0.10416 0.0432,0.0562 0.0861,0.11117 0.13166,0.16442 -0.0455,-0.0533 -0.0904,-0.10825 -0.13348,-0.16442 -0.006,-0.0345 -0.0132,-0.0691 -0.022,-0.10416 z m 18.32506,0.002 c -0.0386,0.002 -0.072,0.0175 -0.11177,0.0328 0.0404,-0.0153 0.072,-0.031 0.11177,-0.0328 z m 0.002,0 c 0.008,0 0.0158,-5.8e-4 0.024,0 0,5.7e-4 -6.6e-4,0.002 0,0.002 -0.009,-5.8e-4 -0.0158,-0.002 -0.024,-0.002 z m 1.7356,0.0258 c 0.005,0.038 0.006,0.0761 0.004,0.11527 -0.002,0.0386 -0.006,0.0784 -0.0111,0.12054 -0.003,0.0264 -0.01,0.0527 -0.0164,0.0784 -0.0129,0.0509 -0.031,0.10006 -0.0509,0.13927 0.0199,-0.0398 0.038,-0.0878 0.0509,-0.13927 0.006,-0.0258 0.0117,-0.0521 0.0146,-0.0784 0.005,-0.0421 0.0105,-0.0819 0.0129,-0.12054 0.002,-0.0392 0.002,-0.0772 -0.004,-0.11527 z m -15.68596,0.009 c -0.0603,0.0392 -0.12582,0.0761 -0.19428,0.11118 0.0684,-0.0351 0.134,-0.072 0.19428,-0.11118 z m 21.61428,0.0415 c 6.6e-4,0 0.002,5.7e-4 0.002,0 -0.0188,0.0205 -0.0369,0.0409 -0.055,0.0644 h -0.002 c 0.0181,-0.0234 0.0363,-0.0439 0.055,-0.0644 z m -0.72795,0.006 c 0.017,0.0181 0.0334,0.0357 0.0498,0.0544 -0.0164,-0.0181 -0.0328,-0.0369 -0.0498,-0.0544 z m 0.57639,0.0819 c -0.0281,0.0123 -0.0515,0.0293 -0.0732,0.0463 0.0216,-0.017 0.0451,-0.0339 0.0732,-0.0463 z m -21.47211,0.024 c -0.0386,0.0111 -0.0743,0.031 -0.11002,0.0533 -0.0527,0.0334 -0.10298,0.0743 -0.15682,0.11118 -0.0363,0.0251 -0.0749,0.0486 -0.11527,0.0661 0.0404,-0.0175 0.079,-0.0409 0.11527,-0.0661 0.0538,-0.0369 0.10416,-0.0778 0.15682,-0.11118 0.0357,-0.0223 0.0714,-0.0422 0.11002,-0.0533 z m 20.0238,0.005 c -0.0299,0.0223 -0.0579,0.048 -0.0825,0.0755 0.0246,-0.0275 0.0527,-0.0533 0.0825,-0.0755 z m 0.96904,0 c 0.031,0.0386 0.0626,0.0761 0.0948,0.11353 h -0.002 c -0.0322,-0.0374 -0.062,-0.0749 -0.093,-0.11353 z m -4.30273,0.0439 c -0.0538,0.007 -0.10533,0.0181 -0.1539,0.0369 0.0485,-0.0188 0.10006,-0.0299 0.1539,-0.0369 z m 4.62106,0.0369 c -0.0153,0.009 -0.0304,0.0193 -0.048,0.0258 0.0181,-0.007 0.0328,-0.0164 0.048,-0.0258 z m -24.22062,0.009 c 0.0691,0.0503 0.14132,0.0977 0.21581,0.14103 0.0745,0.0433 0.15156,0.0825 0.23219,0.11703 -0.0806,-0.0345 -0.15774,-0.0737 -0.23218,-0.11699 -0.0745,-0.0433 -0.1467,-0.0907 -0.2158,-0.14103 z m 0.40781,0.024 c 0.005,0.0111 0.004,0.0258 0.008,0.0386 -0.003,-0.0129 -0.003,-0.0275 -0.008,-0.0386 z m -1.33126,0.002 c 0.10984,0.13225 0.22243,0.25864 0.32728,0.39148 -0.10485,-0.13284 -0.21744,-0.25923 -0.32728,-0.39148 z m 24.9626,0 c 0.0275,0.004 0.0515,0.006 0.0732,0.004 -0.0211,0.002 -0.0463,5.8e-4 -0.0732,-0.004 z m -25.06324,0.006 c 0.0454,0.0363 0.087,0.0743 0.12615,0.11293 -0.0392,-0.0386 -0.0807,-0.0767 -0.12615,-0.11293 z m 24.92457,0.0129 c -0.15624,0.0351 -0.29493,0.0872 -0.4225,0.15331 0.12757,-0.0661 0.26684,-0.1182 0.4225,-0.15331 z m -3.73805,0.0123 c 0.0468,0.0228 0.0919,0.0492 0.12991,0.0772 -0.0386,-0.0287 -0.0825,-0.0538 -0.12991,-0.0772 z m -19.74175,0.0187 c 0.002,0.004 0.005,0.006 0.008,0.009 0.006,0.005 0.014,0.006 0.0274,0.004 0.0242,0.0129 0.0496,0.0258 0.0749,0.0369 -0.026,-0.0111 -0.0503,-0.0216 -0.0749,-0.0345 -0.0126,0.002 -0.0215,-7.6e-4 -0.0274,-0.006 -0.004,-0.002 -0.005,-0.005 -0.008,-0.009 z m 16.84342,0.002 c 0.007,0.0193 0.0164,0.0374 0.0275,0.0527 -0.0117,-0.0152 -0.0205,-0.0328 -0.0275,-0.0527 z m 2.00771,0.0216 c -0.0146,0.0123 -0.0304,0.0258 -0.0439,0.0404 -0.0129,0.0146 -0.024,0.0293 -0.0293,0.0457 0.005,-0.0158 0.017,-0.0316 0.0293,-0.0457 0.0135,-0.0146 0.0287,-0.028 0.0439,-0.0404 z m -20.43284,0.0422 c 0.0242,0.0258 0.0499,0.0521 0.075,0.0767 -0.0254,-0.0245 -0.0505,-0.0509 -0.075,-0.0767 z m 18.47253,0.0111 c 0.008,0.006 0.0153,0.0111 0.024,0.0164 v 0.002 c -0.009,-0.005 -0.0164,-0.0117 -0.024,-0.0181 z m -15.34949,0.0638 c -0.003,0.004 -0.008,0.006 -0.0146,0.009 0.006,-0.002 0.0113,-0.006 0.0146,-0.009 z m 0.26502,0.0146 c -0.0498,0.0158 -0.0983,0.0328 -0.14454,0.055 0.0462,-0.0223 0.0948,-0.0392 0.14454,-0.055 z m -1.26343,0.002 c 0.0623,0.008 0.12546,0.0117 0.19018,0.0146 -0.0647,-0.003 -0.12793,-0.007 -0.19018,-0.0146 z m 0.78628,0.004 c -0.13265,0.007 -0.26619,0.014 -0.39861,0.0146 0.13242,-5.7e-4 0.26596,-0.008 0.39861,-0.0146 z m 20.42406,0.002 c 0.1106,0.10533 0.1814,0.2569 0.19018,0.46053 7.6e-4,0.0339 0.002,0.0697 0,0.1065 -6.7e-4,-6.6e-4 -7.7e-4,-0.002 -0.002,-0.002 0.002,-0.0357 0.003,-0.0708 0.002,-0.10416 -0.009,-0.20304 -0.0807,-0.35578 -0.19018,-0.46052 z m -3.67601,0.009 c 0,5.8e-4 6.6e-4,0.002 0,0.002 -0.008,0.01 -0.0293,0.0199 -0.0509,0.0328 0.0216,-0.0129 0.0433,-0.0245 0.0509,-0.0351 z m -1.17911,0.0129 c 0.0281,0.0263 0.0573,0.0509 0.0895,0.0732 -0.0322,-0.0223 -0.0614,-0.0468 -0.0895,-0.0732 z m 1.08256,0.0568 c 0,0 0.002,5.8e-4 0.002,0 -0.004,0.005 -0.007,0.008 -0.009,0.0129 7.7e-4,-0.002 0.0181,0.038 0.0223,0.0714 -0.004,-0.0334 -0.021,-0.0732 -0.0223,-0.0714 0.002,-0.005 0.004,-0.008 0.008,-0.0129 z m -16.38466,0.005 c -0.0216,0.014 -0.0412,0.0304 -0.0604,0.048 0.0192,-0.0175 0.0387,-0.0339 0.0604,-0.048 z m 20.67275,0.0205 c -0.006,0.0386 -0.009,0.0802 -0.009,0.12054 6.7e-4,-0.0415 0.004,-0.0813 0.009,-0.12054 z m -0.5524,0.005 c 0.0153,0.0146 0.0293,0.0293 0.0421,0.0457 -0.0129,-0.0164 -0.0275,-0.0316 -0.0421,-0.0457 z m -4.56429,0.0111 c 0.007,7.6e-4 0.0129,0.005 0.0205,0.008 -0.0164,-0.006 -0.0316,-0.009 -0.0439,-0.006 0.007,-0.002 0.0152,-0.003 0.0234,-0.002 z m -15.73922,0.0164 c -0.11867,0.008 -0.22856,0.0223 -0.34378,0.031 0.11522,-0.009 0.22511,-0.0228 0.34378,-0.031 z m 21.35857,0.005 c -0.0439,0.0345 -0.0866,0.0697 -0.12757,0.10651 0.0409,-0.0369 0.0837,-0.0726 0.12757,-0.10651 z m -2.81406,0.006 c 0,5.8e-4 0.002,7.6e-4 0.002,0.002 0.004,0.0135 0.005,0.0263 0.008,0.0404 -0.002,-0.014 -0.005,-0.0287 -0.009,-0.0422 z m -1.87254,0.0199 c 0,0 0.002,5.8e-4 0.002,0 0.0392,0.0216 0.0778,0.0468 0.11703,0.0714 -0.0392,-0.0245 -0.0796,-0.048 -0.11879,-0.0697 z m 3.73044,0.10066 c 0.0111,0.038 0.0169,0.0737 0.024,0.11001 -0.007,-0.0363 -0.0129,-0.072 -0.024,-0.11001 z m -1.32599,0.086 c -0.0222,0.0409 -0.0428,0.0819 -0.0562,0.12465 0.0135,-0.0427 0.0339,-0.0837 0.0562,-0.12465 z m -0.51904,0.008 c 0.002,0.0444 0.01,0.0895 0.031,0.13517 -0.021,-0.0457 -0.0293,-0.0907 -0.031,-0.13517 z m 2.55073,0.002 c 6.7e-4,-6.6e-4 0.002,0 0.002,0 -0.0392,0.0392 -0.0778,0.0808 -0.11528,0.12231 0,-6.7e-4 -7.6e-4,-7.7e-4 -0.002,-0.002 0.0374,-0.0415 0.0761,-0.0813 0.11527,-0.12054 z m -4.13068,0.12757 c -0.005,0.0228 -7.7e-4,0.0433 0.007,0.0626 -0.008,-0.0187 -0.0111,-0.0404 -0.007,-0.0626 z m 1.59458,0.0258 c -0.0146,0.0199 -0.0252,0.0404 -0.031,0.062 0.006,-0.0216 0.0164,-0.0421 0.031,-0.062 z m 2.34242,0.0146 c -0.0228,0.0199 -0.0492,0.038 -0.0784,0.0533 0.0293,-0.0152 0.0556,-0.0334 0.0784,-0.0533 z m -2.37344,0.0492 c -0.008,0.0293 -0.009,0.0603 -0.008,0.0919 -0.002,-0.0316 -6.6e-4,-0.0626 0.008,-0.0919 z m -1.74438,0.0153 c 0.0146,0.0152 0.0299,0.0293 0.0474,0.0415 -0.0175,-0.0123 -0.0334,-0.0258 -0.0474,-0.0415 z m -18.68377,0.0105 c 0.0165,0.0193 0.0226,0.048 0.0366,0.0697 -0.0139,-0.0216 -0.02,-0.0503 -0.0366,-0.0697 z m 22.59152,0.0275 c -0.0948,0.0275 -0.19955,0.0444 -0.29493,0.0568 0.0954,-0.0123 0.20013,-0.0293 0.29493,-0.0568 z m -3.08676,0.21593 c 0.0579,0.008 0.11762,0.0129 0.17906,0.0164 -0.0614,-0.004 -0.12113,-0.008 -0.17906,-0.0164 z m 1.39504,0.0146 c 0.0334,-6.6e-4 0.0673,0.003 0.10591,0.0146 -0.0386,-0.0117 -0.0726,-0.0152 -0.10591,-0.0146 z m 0,0 c -0.0498,6.6e-4 -0.096,0.01 -0.15156,0.0181 0.0544,-0.008 0.1024,-0.0175 0.15156,-0.0181 z m -0.59043,0.002 c -0.10651,0 -0.22588,0.005 -0.34759,0.005 0.12288,-6.6e-4 0.24108,-0.005 0.34759,-0.005 z" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-323.69595" + y="284.64157" + id="text3713"><tspan + sodipodi:role="line" + id="tspan3711" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="284.64157">fields</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="293.46103" + id="tspan3715">production</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="302.28046" + id="tspan22628">crop rotation</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="311.09991" + id="tspan3717">tillage</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="319.91937" + id="tspan4643">sowing</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="328.73883" + id="tspan4645">fertiliser application</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="337.55826" + id="tspan6011">pesticide treatment</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="346.37772" + id="tspan6409">harvest</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-323.69595" + y="355.19717" + id="tspan19386">AECM</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-210.41441" + y="278.40933" + id="text9057"><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-210.41441" + y="278.40933" + id="tspan9055">height</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-210.41441" + y="287.22879" + id="tspan11276">biomass</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-210.41441" + y="296.04822" + id="tspan11278">transpiration</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-210.41441" + y="304.86768" + id="tspan11280">plant growth</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-210.41441" + y="313.68713" + id="tspan11282">yield calculation</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-84.352478" + y="282.58853" + id="text11374"><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="282.58853" + id="tspan11372">life phase</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="291.40799" + id="tspan13836">energy budget</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="300.22742" + id="tspan13838">foraging</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="309.04688" + id="tspan13840">mating</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="317.86633" + id="tspan13842">breeding</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-84.352478" + y="326.68579" + id="tspan13844">migration</tspan></text> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:7.05556px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="-388.5827" + y="281.0311" + id="text14158"><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-388.5827" + y="281.0311" + id="tspan14156">land cover</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-388.5827" + y="289.85056" + id="tspan17090">field borders</tspan><tspan + sodipodi:role="line" + style="font-size:7.05556px;stroke-width:0.264583" + x="-388.5827" + y="298.66998" + id="tspan17092">weather</tspan></text> + <g + id="g1000" + transform="matrix(0.96987284,0,0,0.88134486,308.80129,151.77374)" /> + <g + aria-label="PERSEFONE" + id="text2382" + style="font-size:10.5833px;line-height:25%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';letter-spacing:0.396875px;word-spacing:0px;stroke-width:0.264583" + transform="translate(311.52177,119.07252)" /> + <g + aria-label="agriculture and ecosystems" + id="text4130" + style="font-size:4.58611px;line-height:25%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';letter-spacing:0.079375px;word-spacing:0px;stroke-width:0.264583" + transform="translate(311.52177,119.07252)" /> + <g + aria-label="PERSEFONE" + id="text16844" + style="font-size:10.5833px;line-height:25%;font-family:Lato;-inkscape-font-specification:'Lato, Normal';letter-spacing:0.396875px;word-spacing:0px;stroke-width:0.264583" + transform="translate(311.52177,119.07252)" /> + <g + id="g72232" + transform="translate(0,-8.5600516)"> + <g + id="g39841" + transform="translate(-151.52177,-186.91635)"> + <rect + style="fill:url(#linearGradient29);fill-opacity:1;stroke:none;stroke-width:1.35918;stroke-linecap:round;stroke-linejoin:round;filter:url(#filter21)" + id="rect1" + width="59.067005" + height="59.067005" + x="180.4772" + y="123.90868" + rx="10.323345" + transform="rotate(44.999999,13.1312,434.61922)" /> + <path + id="path3" + style="fill:#ffffff;fill-opacity:1;stroke-width:1.58758;stroke-linecap:round;stroke-linejoin:round" + d="m 336.59828,352.61621 v 25.13439 21.77386 c 7.13198,0.1716 16.05896,-4.66427 16.05896,-21.77386 h 6.69055 c 4.48979,6e-5 8.63857,-2.39514 10.88357,-6.28334 2.2449,-3.88831 2.2449,-8.67889 0,-12.56719 -2.24486,-3.88841 -6.39367,-6.28381 -10.88357,-6.28386 h -6.69055 z m 19.66339,5.42034 c 1.29234,0.79242 0.13509,1.77783 1.86811,0.77618 1.34572,-0.77781 2.33192,5.55922 1.13636,6.64249 1.33458,0.19325 2.3335,1.22062 2.0376,2.17145 -1.22793,3.94582 -3.58083,3.6077 -5.39863,3.23236 0.0901,0.30539 0.54202,1.03974 -0.0155,0.99942 -2.18207,-0.15782 -2.39656,-1.62045 -3.30316,-1.79162 -0.0655,-0.0124 -0.12235,0.47022 -0.0165,0.77669 0.1766,0.51153 0.0422,0.72835 -0.14056,0.92036 -0.0908,0.0954 0.16978,-0.55566 0.0775,-0.62115 -0.13987,-0.0993 -0.0915,-0.83755 -0.16588,-0.89917 -0.0122,0.11043 -0.35269,-0.27724 -0.35864,-0.0289 -0.0102,0.42738 -0.0604,1.08446 -0.108,0.76946 -0.15726,-1.03967 -0.37453,-1.08898 -0.46199,-0.97461 -0.22255,0.29106 0.13723,1.74831 -0.12867,1.85673 -0.0841,0.034 0.0542,-0.29349 -0.077,-0.86248 -0.0564,-0.24452 0.0176,-0.51155 -0.0532,-0.85111 -0.0174,-0.0834 -0.37603,-0.47904 -0.41755,-0.53795 -0.0405,-0.0574 -0.4665,-0.0288 -0.57515,0.28577 -0.0742,0.21487 0.13508,0.69501 0.11472,0.90537 -0.0554,0.57209 0.0368,0.93225 -0.0599,0.9958 -0.0588,0.0386 -0.096,-0.30616 -0.13436,-0.89658 -0.0301,-0.4636 -0.14217,-1.08414 -0.1385,-1.13688 0.0296,-0.42489 -0.11269,-0.57107 -0.22531,-0.56844 -0.197,0.005 -0.56757,0.0169 -0.56275,0.25734 10e-4,0.0624 0.18792,0.35865 0.1695,0.82838 -0.0351,0.89372 0.18177,1.24437 0.10955,1.1777 -0.3265,-0.30137 -0.10325,-1.03243 -0.49661,-2.07636 -0.0692,-0.18353 0.72929,-0.46704 0.7059,-0.53433 -0.22573,-0.64936 -0.18789,-0.45131 -0.43201,-1.05472 -0.28169,0.011 -0.86203,-0.88043 -0.063,-1.65674 0,0 0.27228,0.25897 0.43046,0.15761 0.0611,-0.0392 -1.21761,-0.56878 -2.47323,-1.04231 -1.82343,-0.68767 -2.29082,-1.12086 -2.29082,-1.12086 -0.0164,-0.2863 2.29666,1.09707 3.86281,1.49551 0.50376,0.12816 1.17175,0.59678 1.1927,0.58498 0.23712,-0.13354 0.33244,-0.0765 0.55345,-0.0662 1.09222,-1.92452 3.01134,-6.15086 5.8384,-8.1132 z" /> + </g> + <g + id="g56565"> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8445" + width="66.677605" + height="3.5806408" + x="166.66121" + y="115.63167" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8345" + width="66.677605" + height="3.5806408" + x="166.66121" + y="101.67941" + ry="0" /> + <g + id="g34185" + transform="translate(151.73068,5.3367648)"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.527846;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10443)" + id="rect8019" + width="80" + height="126.71069" + x="8.2693253" + y="13.798009" + ry="9.3720064" + transform="matrix(1.0056526,0,0,0.92094317,-0.27284854,0.86420743)" /> + <g + id="g7995" + transform="translate(-57.13786,-16.374264)"> + <circle + style="fill:#000000;fill-opacity:0;stroke:#e4460a;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle4984" + cx="105.40719" + cy="59.768513" + r="19.815086" /> + <g + id="g139" + style="stroke:#000000;stroke-opacity:1" + transform="matrix(2.7840895,0,0,2.7840895,-32.557468,-158.16034)"> + <path + id="path5" + style="fill:none;stroke:#000000;stroke-width:0.163736;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" + d="m 46.122552,74.888534 0.969664,-0.969664 0.969664,0.969664 m 1.345106,-0.859877 0.298228,-0.298228 1.19307,1.19307 m -3.321232,-0.5198 1.102447,-1.102449 1.597766,1.597765" /> + <path + id="path106" + style="fill:none;stroke:#000000;stroke-width:0.2;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 47.636441,80.555318 v 1.048967 m 0.593577,-2.009393 a 0.59357607,0.96042615 0 0 1 -0.593576,0.960426 0.59357607,0.96042615 0 0 1 -0.593576,-0.960426 0.59357607,0.96042615 0 0 1 0.593576,-0.960426 0.59357607,0.96042615 0 0 1 0.593576,0.960426 z m 0.34009,0.530567 v 1.048967 m -0.561002,-2.32317 a 0.59357607,0.96042615 0 0 1 0.561004,-0.646649 0.59357607,0.96042615 0 0 1 0.593576,0.960426 v 0 a 0.59357607,0.96042615 0 0 1 -0.593576,0.960426 0.59357607,0.96042615 0 0 1 -0.374295,-0.215013 m 1.307962,-0.472982 v 1.048967 m -0.590819,-2.101843 a 0.59357607,0.96042615 0 0 1 0.59082,-0.867976 0.59357607,0.96042615 0 0 1 0.593576,0.960426 v 0 a 0.59357607,0.96042615 0 0 1 -0.593576,0.960426 0.59357607,0.96042615 0 0 1 -0.344194,-0.177955" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" + d="m 53.286988,75.310392 c 0,0 -2.643425,0.664484 -2.833973,1.596339 -0.218871,1.070365 1.114158,1.621144 0.956467,2.702218 -0.201601,1.382103 -4.316616,3.014463 -4.316616,3.014463" + id="path29" + sodipodi:nodetypes="cssc" /> + <g + id="g104" + transform="matrix(0.65014769,0,0,0.65014769,18.056903,25.720623)" + style="stroke:#000000;stroke-width:0.123049;stroke-dasharray:none;stroke-opacity:1"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1" + id="path95" + cx="51.38525" + cy="73.446442" + r="0.39077717" /> + <g + id="g97" + style="stroke:#000000;stroke-width:0.123049;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 51.973375,73.446439 h 0.408718" + id="path96" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 50.388409,73.446439 h 0.408718" + id="path97" /> + </g> + <g + id="g99" + transform="rotate(45,51.385251,73.446439)" + style="stroke:#000000;stroke-width:0.123049;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 51.973375,73.446439 h 0.408718" + id="path98" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 50.388409,73.446439 h 0.408718" + id="path99" /> + </g> + <g + id="g101" + transform="rotate(90,51.385251,73.446439)" + style="stroke:#000000;stroke-width:0.123049;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 51.973375,73.446439 h 0.408718" + id="path100" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 50.388409,73.446439 h 0.408718" + id="path101" /> + </g> + <g + id="g103" + transform="rotate(135,51.385251,73.446439)" + style="stroke:#000000;stroke-width:0.123049;stroke-dasharray:none;stroke-opacity:1"> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 51.973375,73.446439 h 0.408718" + id="path102" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.123049;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 50.388409,73.446439 h 0.408718" + id="path103" /> + </g> + </g> + <path + id="path139" + style="fill:none;stroke:#000000;stroke-width:0.15;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 47.992862,80.789053 h 0.259027 m -3.484762,-1.180104 h 1.957471 m 3.215209,-10e-7 1.058449,10e-7 m 0.812352,10e-7 2.531621,-10e-7 m -9.116836,1.180104 h 2.03725 m 1.635671,0 h 0.906985 m 1.304778,-2e-6 2.773886,2e-6 m -7.761411,1.180103 1.480028,-10e-7 m 1.792674,0 3.59155,10e-7 m -4.857247,1.180104 h 2.850242 m -6.317581,-4.720415 h 3.105905 m 2.605111,0 h 0.169754 m 0.963247,-10e-7 2.940903,10e-7 m -9.680011,-1.180104 h 5.266849 m 0.8015,10e-7 3.506753,-10e-7 m -9.116836,-1.180104 h 5.347789 m 1.672701,0 h 1.63808 m -2.607843,-1.180099 1.710684,-4e-6" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="34.556053" + y="77.85424" + id="text12969"><tspan + sodipodi:role="line" + id="tspan12967" + style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:10.5833px;font-family:Lato;-inkscape-font-specification:'Lato, Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="34.556053" + y="77.85424">World</tspan></text> + </g> + <g + id="g8241" + transform="translate(151.73068,5.3367648)" + style="filter:url(#filter17455)"> + <g + id="g1318"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect17161" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g1312" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="path25641" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle25723" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="33.537365" + y="93.490456" + id="text18909"><tspan + sodipodi:role="line" + id="tspan18907" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="33.537365" + y="93.490456">land cover</tspan></text> + </g> + <g + id="g8232" + transform="translate(151.73068,5.3367648)" + style="filter:url(#filter17455)"> + <g + id="g1497" + transform="translate(0,13.952261)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1489" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g1495" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle1491" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle1493" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="30.49572" + y="107.44907" + id="text1501"><tspan + sodipodi:role="line" + id="tspan1499" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="30.49572" + y="107.44907">field borders</tspan></text> + </g> + <g + id="g8223" + transform="translate(151.73068,5.3217356)" + style="filter:url(#filter17455)"> + <g + id="g1513" + transform="translate(0,27.919555)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect1505" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g1511" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle1507" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle1509" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="37.274326" + y="121.38937" + id="text1517"><tspan + sodipodi:role="line" + id="tspan1515" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="37.274326" + y="121.38937">weather</tspan></text> + </g> + </g> + <g + id="g57135" + transform="translate(0,35.567501)"> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35369" + width="66.677605" + height="3.5806408" + x="23.867941" + y="280.74765" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35367" + width="66.677605" + height="3.5806408" + x="23.867941" + y="266.79541" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35365" + width="66.677605" + height="3.5806408" + x="23.867941" + y="252.84314" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35363" + width="66.677605" + height="3.5806408" + x="23.867941" + y="238.89087" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35361" + width="66.677605" + height="3.5806408" + x="23.867941" + y="224.93861" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect17474" + width="66.677605" + height="3.5806408" + x="23.867941" + y="210.98634" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect35359" + width="66.677605" + height="3.5806408" + x="23.867941" + y="210.98634" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect8447" + width="66.677605" + height="3.5806408" + x="23.867941" + y="197.03409" + ry="0" /> + <g + id="g35592" + transform="translate(-81.897562,86.739178)"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.675224;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10443)" + id="rect25865" + width="80.113647" + height="207.05223" + x="99.047478" + y="12.585736" + ry="10.200363" + transform="matrix(1.0023947,0,0,0.97388901,-0.33310998,0.18075957)" /> + <g + id="g7973" + transform="translate(33.900599,-72.691201)"> + <circle + style="fill:none;fill-opacity:1;stroke:#4686fb;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle7802" + cx="105.20371" + cy="114.80763" + r="19.815086" /> + <path + id="path156" + style="fill:none;stroke:#000000;stroke-width:0.561578;stroke-linecap:round;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1" + d="m 95.753841,109.74455 h 18.899739 m -6.91315,7.50687 v 1.76833 0 m -5.07342,0 v 0 -1.75418 m 7.54468,1.93364 c -9.2e-4,0.0732 -0.004,1.81453 0,1.88481 0.0723,1.6512 1.24007,2.74666 2.78581,3.32758 m -12.8704,-5.21239 c 9.3e-4,0.0732 0.004,1.81453 0,1.88481 -0.0723,1.6512 -1.24006,2.74666 -2.785815,3.32758 m 2.854455,-3.32758 h 10.01595 m -16.901873,3.32758 c 0,0 1.665688,-3.25888 3.139715,-4.19667 1.653151,-1.05176 5.755288,-1.19518 5.755288,-1.19518 h 5.99779 c 0,0 4.1917,0.2004 5.75529,1.19518 1.56359,0.99477 3.13971,4.19667 3.13971,4.19667 M 99.658075,109.74355 c 0.27117,-2.25616 1.232725,-3.92651 2.764745,-4.41985 0.7812,-0.25158 1.84139,0.21654 2.76473,0.21654 0.79048,0 2.07182,-0.49236 2.76473,-0.31533 1.70386,0.43532 2.47381,2.09727 2.76475,4.5192 m 0,0 c 0.0236,0.59423 0,1.74785 0,2.34335 0,3.84846 -2.47563,5.66792 -5.52948,5.66792 -3.05385,0 -5.529475,-1.81946 -5.529475,-5.66792 0,-0.34933 -0.04152,-1.99853 0,-2.34391 m 2.546745,12.64843 h 5.99779 v 2.04048 h -5.99779 z m -8.895003,2.01962 h 23.787793" /> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="127.67702" + y="76.576424" + id="text25911"><tspan + sodipodi:role="line" + id="tspan25909" + style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:10.5833px;font-family:Lato;-inkscape-font-specification:'Lato, Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="127.67702" + y="76.576424">Farm</tspan></text> + </g> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8449" + width="66.677605" + height="3.5806408" + x="23.867941" + y="183.08182" + ry="0" /> + <g + id="g34862" + transform="translate(-79.85955,86.739178)" + style="filter:url(#filter17455)"> + <g + id="g8459" + transform="translate(88.79696)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8451" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8457" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8453" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8455" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="129.51299" + y="93.496811" + id="text8463"><tspan + sodipodi:role="line" + id="tspan8461" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="129.51299" + y="93.496811">fields</tspan></text> + </g> + <g + id="g34871" + transform="translate(-79.85955,86.739178)" + style="filter:url(#filter17455)"> + <g + id="g8475" + transform="translate(88.79696,13.952261)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8467" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8473" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8469" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8471" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="121.50405" + y="106.9379" + id="text8479"><tspan + sodipodi:role="line" + id="tspan8477" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="121.50405" + y="106.9379">production</tspan></text> + </g> + <g + id="g34880" + transform="translate(-79.85955,86.739178)" + style="filter:url(#filter17455)"> + <g + id="g8491" + transform="translate(88.79696,27.904526)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8483" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8489" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8485" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8487" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="120.1031" + y="120.83301" + id="text8495"><tspan + sodipodi:role="line" + id="tspan8493" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="120.1031" + y="120.83301">crop rotation</tspan></text> + </g> + <g + id="g34889" + transform="translate(-79.85955,84.862251)" + style="filter:url(#filter17455)"> + <g + id="g11124" + transform="translate(88.79696,43.733716)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11116" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11122" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11118" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11120" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="129.18018" + y="136.65109" + id="text11128"><tspan + sodipodi:role="line" + id="tspan11126" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="129.18018" + y="136.65109">tillage</tspan></text> + </g> + <g + id="g34898" + transform="translate(-79.85955,88.442893)" + style="filter:url(#filter17455)"> + <g + id="g11138" + transform="translate(88.79696,54.105336)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11130" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11136" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11132" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11134" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="127.90802" + y="147.00049" + id="text11142"><tspan + sodipodi:role="line" + id="tspan11140" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="127.90802" + y="147.00049">sowing</tspan></text> + </g> + <g + id="g34916" + transform="translate(-79.85955,92.023529)" + style="filter:url(#filter17455)"> + <g + id="g11152" + transform="translate(88.79696,64.476956)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11144" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11150" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11146" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11148" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="126.17818" + y="157.57689" + id="text11156"><tspan + sodipodi:role="line" + id="tspan11154" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="126.17818" + y="157.57689">fertiliser</tspan></text> + </g> + <g + id="g34925" + transform="translate(-79.85955,95.604179)" + style="filter:url(#filter17455)"> + <g + id="g11166" + transform="translate(88.79696,74.848576)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11158" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11164" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11160" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11162" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="124.17899" + y="167.79929" + id="text11170"><tspan + sodipodi:role="line" + id="tspan11168" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="124.17899" + y="167.79929">pesticides</tspan></text> + </g> + <g + id="g34907" + transform="translate(-79.85955,99.18483)" + style="filter:url(#filter17455)"> + <g + id="g11180" + transform="translate(88.79696,85.220196)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11172" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11178" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11174" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11176" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="127.24127" + y="178.69002" + id="text11184"><tspan + sodipodi:role="line" + id="tspan11182" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="127.24127" + y="178.69002">harvest</tspan></text> + </g> + <g + id="g34934" + transform="translate(-79.85955,102.76546)" + style="filter:url(#filter17455)"> + <g + id="g11194" + transform="translate(88.79696,95.591816)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect11186" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g11192" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11188" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle11190" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="128.89545" + y="189.02353" + id="text11198"><tspan + sodipodi:role="line" + id="tspan11196" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="128.89545" + y="189.02353">AECM</tspan></text> + </g> + </g> + <g + id="g56669" + transform="translate(0,4.7667479)"> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect34249" + width="66.677605" + height="3.5806408" + x="166.66119" + y="354.69925" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect34251" + width="66.677605" + height="3.5806408" + x="166.66119" + y="368.65152" + ry="0" /> + <g + id="g35798" + transform="translate(-26.831725,230.45208)"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.52723;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10443)" + id="rect25941" + width="80" + height="126.4156" + x="186.83173" + y="12.66773" + ry="9.3501816" + transform="matrix(0.99057751,0,0,1.1426998,2.1373194,-1.5158985)" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="213.38039" + y="76.576424" + id="text25987"><tspan + sodipodi:role="line" + id="tspan25985" + style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:10.5833px;font-family:Lato;-inkscape-font-specification:'Lato, Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="213.38039" + y="76.576424">Crops</tspan></text> + <g + id="g7969" + transform="translate(64.498012,-33.495354)"> + <circle + style="fill:#ffffff;fill-opacity:1;stroke:#faba39;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="path1384" + cx="162.33371" + cy="75.611786" + r="19.815086" /> + <path + style="fill:#000000;stroke-width:0.0357305" + d="m 159.6808,87.568553 c -0.35931,-0.06794 -0.45903,-0.136094 -0.49711,-0.339751 -0.0366,-0.195731 -0.0141,-1.832452 0.0309,-2.244329 0.0678,-0.62099 0.104,-0.925889 0.15512,-1.306403 0.0284,-0.211869 0.0644,-0.50581 0.0797,-0.653199 0.0594,-0.570042 0.2107,-1.38004 0.41908,-2.24433 0.11767,-0.488069 0.17247,-0.776208 0.20708,-1.088667 0.0112,-0.101331 0.0481,-0.304827 0.0818,-0.452217 0.0337,-0.147387 0.0848,-0.375497 0.11326,-0.50691 0.0285,-0.131413 0.0823,-0.309861 0.11941,-0.396552 0.0848,-0.19789 0.11969,-0.404129 0.0731,-0.43288 -0.0192,-0.01188 -0.0925,-0.0071 -0.16272,0.01064 -0.0703,0.01773 -0.18348,0.0464 -0.25159,0.06372 -0.0681,0.01731 -0.19623,0.07585 -0.28473,0.130089 -0.14769,0.09052 -0.1639,0.113572 -0.19738,0.280687 -0.0201,0.100136 -0.082,0.279866 -0.13774,0.399398 -0.0557,0.119532 -0.12722,0.300237 -0.15892,0.401566 -0.0316,0.101331 -0.0851,0.244533 -0.11877,0.318227 -0.0337,0.0737 -0.0771,0.216896 -0.0965,0.318225 -0.07,0.365055 -0.11107,0.556139 -0.16196,0.753694 -0.0284,0.110542 -0.0714,0.283891 -0.0954,0.385221 -0.0239,0.10133 -0.0749,0.302966 -0.11304,0.448083 -0.0382,0.145116 -0.0701,0.326002 -0.0709,0.401969 -6.6e-4,0.07596 -0.024,0.198419 -0.0514,0.272113 -0.0497,0.133394 -0.21871,0.867598 -0.29877,1.297796 -0.0231,0.124235 -0.0587,0.267434 -0.0791,0.318227 -0.0204,0.0508 -0.0508,0.197865 -0.0676,0.32683 -0.0372,0.2864 -0.2305,1.249425 -0.26045,1.297896 -0.0119,0.01927 -0.0255,0.200619 -0.0302,0.403 -0.008,0.343705 -0.0142,0.373577 -0.0936,0.453021 -0.12909,0.129082 -0.18939,0.05914 -0.18939,-0.219655 0,-0.119966 -0.0173,-0.275991 -0.0385,-0.346722 -0.0424,-0.141776 0.011,-0.668224 0.14255,-1.403306 0.16875,-0.942937 0.19494,-1.100286 0.21469,-1.28965 0.0115,-0.110542 0.034,-0.253743 0.0501,-0.318227 0.016,-0.06448 0.0782,-0.332998 0.13811,-0.5967 0.10482,-0.460954 0.10689,-0.48358 0.0532,-0.586206 -0.0307,-0.05871 -0.0639,-0.179187 -0.0738,-0.267724 -0.01,-0.08854 -0.0424,-0.216667 -0.0723,-0.28473 -0.0361,-0.08233 -0.0639,-0.291916 -0.083,-0.626211 -0.0157,-0.276355 -0.0443,-0.705959 -0.0632,-0.954678 -0.019,-0.248718 -0.0436,-0.731082 -0.0546,-1.07192 -0.0111,-0.340835 -0.0353,-0.638544 -0.0538,-0.661574 -0.0184,-0.02303 -0.084,-0.04187 -0.14557,-0.04187 -0.13811,0 -0.18138,0.06948 -0.18114,0.2909 2.5e-4,0.276734 -0.0703,1.022773 -0.11668,1.233235 -0.0259,0.117563 -0.0458,0.435395 -0.0479,0.765736 -0.002,0.310612 -0.0123,0.578876 -0.023,0.596141 -0.0224,0.03637 -0.0545,0.936038 -0.0618,1.736639 -0.003,0.303988 -0.0238,0.854184 -0.0466,1.222657 -0.0229,0.368472 -0.0374,0.923072 -0.0322,1.232445 0.01,0.601839 0.002,0.631902 -0.1556,0.601734 -0.0524,-0.01002 -0.0936,0.0081 -0.12711,0.05604 -0.0438,0.06263 -0.0545,0.06491 -0.0922,0.01961 -0.058,-0.06987 -0.0243,-2.083152 0.0491,-2.931499 0.0295,-0.340838 0.068,-0.99655 0.0856,-1.45714 0.0176,-0.46059 0.047,-0.973101 0.0654,-1.138914 0.0184,-0.165812 0.0476,-0.497438 0.065,-0.736944 0.0173,-0.239507 0.0626,-0.614082 0.10079,-0.832391 0.0382,-0.218308 0.0693,-0.463632 0.0693,-0.545163 0,-0.130108 -0.0109,-0.15243 -0.0901,-0.182514 -0.0496,-0.01885 -0.12762,-0.02979 -0.1734,-0.0243 -0.0714,0.0085 -0.089,0.03615 -0.12372,0.194217 -0.0651,0.296432 -0.10918,0.531421 -0.16337,0.870935 -0.0279,0.175024 -0.0751,0.470577 -0.1047,0.656787 -0.0408,0.255945 -0.0454,0.369587 -0.0188,0.465715 0.0265,0.09612 0.0234,0.172914 -0.0127,0.31464 -0.0719,0.282053 -0.15054,0.82063 -0.1512,1.035481 -3.3e-4,0.104734 -0.0242,0.295941 -0.053,0.424906 -0.0558,0.249637 -0.0837,0.480228 -0.16283,1.349978 -0.0274,0.30032 -0.0576,0.55878 -0.0672,0.574351 -0.03,0.0485 -0.0982,0.908617 -0.0956,1.204344 8.7e-4,0.154764 0.0121,0.374799 0.0237,0.488968 0.0201,0.196127 0.0156,0.214793 -0.0817,0.338316 -0.17895,0.227368 -0.37675,0.253438 -0.51536,0.06792 -0.0642,-0.08595 -0.069,-0.134635 -0.0646,-0.668147 0.007,-0.781085 0.0299,-1.377105 0.0563,-1.41977 0.037,-0.05967 0.1328,-0.733787 0.23626,-1.660346 0.0283,-0.253731 0.0732,-0.547671 0.0997,-0.6532 0.10227,-0.407134 0.12236,-0.516079 0.12236,-0.663517 0,-0.08385 0.0178,-0.185385 0.0396,-0.225627 0.0218,-0.04024 0.0669,-0.193758 0.10009,-0.341149 0.0332,-0.147387 0.0894,-0.388568 0.12485,-0.535958 0.0354,-0.147388 0.11176,-0.486551 0.16965,-0.753692 0.0578,-0.267142 0.12708,-0.562409 0.15375,-0.656146 0.0704,-0.247728 0.0647,-0.382276 -0.0165,-0.382276 -0.0357,0 -0.0768,0.01884 -0.0912,0.04187 -0.0656,0.104932 -0.65496,1.891196 -0.75981,2.302952 -0.0493,0.193448 -0.12091,0.457241 -0.15922,0.586206 -0.0383,0.128965 -0.14411,0.520885 -0.23512,0.870934 -0.091,0.350048 -0.2004,0.757043 -0.24306,0.904431 -0.0427,0.147389 -0.10418,0.388572 -0.13669,0.535959 -0.0325,0.14739 -0.0798,0.343349 -0.10492,0.435468 -0.0801,0.292791 -0.28181,1.478442 -0.28181,1.65647 0,0.09421 -0.0218,0.223567 -0.0486,0.287459 -0.0405,0.09694 -0.0657,0.116164 -0.15182,0.116164 -0.0568,0 -0.15178,-0.02024 -0.21106,-0.04496 -0.0593,-0.02473 -0.18569,-0.06362 -0.28089,-0.08642 -0.26696,-0.06394 -0.29589,-0.114506 -0.28565,-0.499327 0.008,-0.300095 0.15973,-1.182102 0.23946,-1.391811 0.0177,-0.0464 0.0702,-0.247189 0.11678,-0.446192 0.2333,-0.996605 0.41713,-1.587789 0.77391,-2.488911 0.062,-0.1566 0.18989,-0.495763 0.28421,-0.753693 0.24597,-0.672676 0.36563,-0.981549 0.45421,-1.172412 0.14907,-0.321189 0.21669,-0.52749 0.23719,-0.723655 0.019,-0.181702 0.0153,-0.197524 -0.0459,-0.197524 -0.0366,0 -0.0894,0.02638 -0.11721,0.05862 -0.14879,0.17224 -0.3696,0.543426 -0.45878,0.771219 -0.0557,0.142356 -0.1481,0.371882 -0.20526,0.510061 -0.0571,0.138175 -0.1325,0.371821 -0.16747,0.519209 -0.035,0.147389 -0.13211,0.471477 -0.21591,0.720196 -0.0838,0.248719 -0.21372,0.640639 -0.28872,0.870934 -0.5099,1.565696 -0.71497,2.175239 -0.76633,2.277744 -0.0323,0.06453 -0.0939,0.273949 -0.13681,0.46538 -0.0477,0.212865 -0.11031,0.395021 -0.16114,0.468965 -0.0712,0.103601 -0.0835,0.160415 -0.0857,0.39689 -0.003,0.344144 -0.0404,0.368507 -0.25145,0.165188 -0.15271,-0.147084 -0.48436,-0.389904 -0.68061,-0.498307 -0.0569,-0.03143 -0.16875,-0.121237 -0.24858,-0.199583 -0.13317,-0.130703 -0.14514,-0.156377 -0.14512,-0.311337 1e-5,-0.09289 0.0319,-0.251792 0.0709,-0.353122 0.039,-0.101331 0.0823,-0.267143 0.0964,-0.368473 0.0399,-0.287965 0.26651,-0.967184 0.50282,-1.507386 0.0765,-0.175023 0.18855,-0.45389 0.24885,-0.619703 0.0603,-0.165812 0.17015,-0.422068 0.24411,-0.569456 0.0739,-0.147389 0.14562,-0.305664 0.15924,-0.351725 0.0137,-0.04606 0.0701,-0.174186 0.12557,-0.284726 0.0554,-0.110543 0.12973,-0.291429 0.16509,-0.401971 0.0353,-0.110542 0.11469,-0.298965 0.17631,-0.418717 0.0616,-0.119754 0.14666,-0.300641 0.18897,-0.401971 0.0424,-0.10133 0.10768,-0.228815 0.14522,-0.2833 0.0376,-0.05448 0.11402,-0.18466 0.16991,-0.289279 0.0559,-0.104619 0.16072,-0.29214 0.23292,-0.416713 0.18843,-0.325171 0.22505,-0.445543 0.16867,-0.554579 -0.0462,-0.08929 -0.26446,-0.298489 -0.31145,-0.298489 -0.0766,0 -0.13857,0.0909 -0.42233,0.619702 -0.0396,0.0737 -0.11962,0.199585 -0.17795,0.279754 -0.0583,0.08017 -0.11587,0.17815 -0.12786,0.217733 -0.012,0.03958 -0.061,0.124117 -0.10873,0.187851 -0.15037,0.200495 -0.79896,1.517852 -0.83884,1.703753 -0.0209,0.09761 -0.0663,0.240638 -0.10098,0.317836 -0.0346,0.0772 -0.0734,0.178042 -0.0862,0.224103 -0.0129,0.04606 -0.0651,0.166649 -0.11623,0.267978 -0.1105,0.219082 -0.20168,0.461787 -0.302,0.803941 -0.0405,0.138176 -0.0952,0.300731 -0.12155,0.361232 -0.0264,0.0605 -0.0483,0.150945 -0.0487,0.200986 -4.4e-4,0.05004 -0.0395,0.181425 -0.0867,0.291966 -0.0472,0.110542 -0.099,0.261281 -0.11507,0.334975 -0.0308,0.14174 -0.16636,0.524896 -0.23988,0.678293 -0.0241,0.05023 -0.0699,0.09637 -0.10194,0.102532 -0.0931,0.01791 -0.23862,-0.108741 -0.34085,-0.296561 -0.0847,-0.15561 -0.0928,-0.197198 -0.077,-0.396061 0.0198,-0.249132 0.31486,-1.165803 0.47477,-1.475031 0.0265,-0.05125 0.10004,-0.250085 0.16343,-0.441847 0.15661,-0.473777 0.36363,-0.979517 0.49924,-1.219595 0.0208,-0.03685 0.10021,-0.187585 0.17644,-0.334974 0.0763,-0.147389 0.17108,-0.320304 0.2108,-0.384258 0.0397,-0.06395 0.10517,-0.199618 0.14546,-0.301476 0.0403,-0.101861 0.0924,-0.207824 0.11576,-0.235474 0.0234,-0.02765 0.11289,-0.178388 0.19893,-0.334975 0.086,-0.156584 0.19094,-0.322385 0.23315,-0.368445 0.0423,-0.04606 0.11045,-0.151575 0.15163,-0.234481 0.0411,-0.0829 0.12575,-0.220591 0.18792,-0.305966 0.0622,-0.08537 0.11304,-0.166655 0.11304,-0.180623 0,-0.01397 0.0653,-0.102394 0.14522,-0.196497 0.23119,-0.27237 0.39073,-0.523413 0.39073,-0.614815 0,-0.04646 -0.0144,-0.13898 -0.0322,-0.205598 -0.0177,-0.06662 -0.0403,-0.173938 -0.0502,-0.238487 -0.0128,-0.0827 -0.0678,-0.166799 -0.18646,-0.284729 -0.16582,-0.16483 -0.26714,-0.311443 -0.26714,-0.386583 0,-0.02659 0.0501,-0.0314 0.16387,-0.01577 0.0974,0.01339 0.17219,0.0091 0.18435,-0.01058 0.0364,-0.05904 -0.0131,-0.126135 -0.12327,-0.166735 -0.1436,-0.05293 -0.42131,-0.325025 -0.44552,-0.436527 -0.0107,-0.049 -0.0323,-0.126788 -0.0481,-0.17285 -0.0157,-0.04606 -0.039,-0.150738 -0.0516,-0.23262 -0.0126,-0.08188 -0.0517,-0.23262 -0.0869,-0.334974 -0.0558,-0.161907 -0.14095,-0.499139 -0.26291,-1.040285 -0.0187,-0.0829 -0.0571,-0.307836 -0.0856,-0.499848 -0.0283,-0.192012 -0.0585,-0.360427 -0.067,-0.374259 -0.0305,-0.04937 -0.0928,-0.379893 -0.19495,-1.035252 -0.10943,-0.70181 -0.19011,-1.167203 -0.24102,-1.390145 -0.0478,-0.209013 -0.13183,-0.619497 -0.21621,-1.055169 -0.016,-0.0829 -0.052,-0.25607 -0.0798,-0.384818 -0.0484,-0.22374 -0.0339,-0.318562 0.0417,-0.271878 0.0388,0.02396 0.20656,0.713245 0.20683,0.849934 4e-4,0.198637 0.0652,0.33882 0.18232,0.394387 0.062,0.02945 0.13926,0.08271 0.17149,0.118335 0.0516,0.05707 0.30672,0.153229 0.33247,0.125305 0.005,-0.0059 -0.003,-0.08595 -0.0188,-0.178064 -0.0828,-0.486199 -0.0994,-0.650759 -0.08,-0.794333 0.0137,-0.101892 -0.004,-0.30752 -0.0518,-0.579883 -0.0764,-0.441615 -0.0707,-0.624608 0.0174,-0.551512 0.10941,0.0908 0.20485,0.39272 0.26618,0.842033 0.0565,0.414208 0.0583,0.500207 0.0182,0.914965 -0.0427,0.442631 -0.042,0.459977 0.0221,0.524099 0.0747,0.0747 0.35316,0.169155 0.39961,0.135549 0.0607,-0.04393 0.28158,-0.769656 0.28158,-0.925078 0,-0.08604 0.015,-0.18427 0.0331,-0.218282 0.0319,-0.05969 -0.009,-0.41771 -0.10213,-0.906036 -0.0255,-0.132761 -0.025,-0.212521 0.002,-0.282155 0.0639,-0.168107 0.13053,-0.04215 0.16816,0.317901 0.0653,0.625231 0.0934,0.803916 0.13401,0.85282 0.0226,0.0273 0.0519,0.189218 0.0649,0.359787 0.013,0.170569 0.0394,0.340274 0.0587,0.377121 0.0192,0.03686 0.0535,0.149904 0.0761,0.251232 0.0226,0.101328 0.0616,0.259604 0.0864,0.351723 0.0249,0.09212 0.0618,0.325762 0.082,0.51921 0.0202,0.193447 0.0578,0.487388 0.0838,0.6532 0.0258,0.165813 0.0638,0.456302 0.0843,0.645526 0.0205,0.189229 0.0586,0.395149 0.0847,0.457596 0.0496,0.118701 0.13666,0.714888 0.18376,1.258449 0.0152,0.175024 0.0444,0.370986 0.065,0.435466 0.0205,0.06449 0.0437,0.253386 0.0514,0.419788 0.008,0.166398 0.0372,0.391904 0.0657,0.501124 0.0284,0.10922 0.0517,0.259476 0.0517,0.333907 3e-5,0.119506 0.0721,0.534966 0.12079,0.696408 0.01,0.03225 0.0414,0.05862 0.0703,0.05862 0.0444,0 0.0494,-0.03265 0.0322,-0.20936 -0.0113,-0.115147 -0.0368,-0.435467 -0.0567,-0.711819 -0.0199,-0.276356 -0.0577,-0.633014 -0.0841,-0.792571 -0.0725,-0.438727 -0.10468,-1.417346 -0.0477,-1.452545 0.0291,-0.01801 0.0573,-0.0065 0.0804,0.03288 0.0196,0.03332 0.0673,0.10004 0.10607,0.14824 0.0388,0.0482 0.0902,0.170536 0.11415,0.271864 0.024,0.101331 0.0639,0.232745 0.0886,0.292028 0.0247,0.05929 0.045,0.202487 0.045,0.318223 1e-5,0.11574 0.0223,0.317133 0.0495,0.447534 0.0317,0.151424 0.055,0.514563 0.0647,1.004927 0.0119,0.602791 0.0296,0.832625 0.0822,1.069303 0.0369,0.165809 0.0718,0.354236 0.0777,0.418717 0.007,0.07715 0.0278,0.11724 0.0609,0.11724 0.0432,0 0.0506,-0.118523 0.0531,-0.854184 0.004,-1.267262 -0.075,-2.297606 -0.19929,-2.591772 -0.0302,-0.07134 -0.0549,-0.216967 -0.0549,-0.32362 0,-0.206104 -0.009,-0.218596 -0.28313,-0.411173 -0.0475,-0.03333 -0.10851,-0.09439 -0.13559,-0.135737 -0.0721,-0.110085 -0.26937,-1.458351 -0.35106,-2.399754 -0.0183,-0.211872 -0.0637,-0.584437 -0.10078,-0.827913 -0.037,-0.243488 -0.0674,-0.515818 -0.0674,-0.605181 0,-0.08936 -0.0151,-0.244392 -0.0334,-0.344496 -0.0183,-0.100111 -0.0482,-0.370437 -0.0663,-0.60073 -0.0181,-0.230299 -0.0562,-0.56192 -0.0847,-0.736947 -0.0536,-0.32859 -0.11665,-1.344039 -0.0901,-1.450132 0.0243,-0.09743 0.0881,-0.04556 0.11788,0.09603 0.0152,0.07229 0.0555,0.244503 0.0896,0.382677 0.034,0.138181 0.0719,0.432118 0.0841,0.653201 0.0122,0.221083 0.043,0.495271 0.0685,0.609298 0.0256,0.114033 0.0563,0.332603 0.0686,0.485714 0.025,0.312534 0.0494,0.362131 0.17848,0.362131 0.0936,0 0.17409,-0.08327 0.28174,-0.291436 0.085,-0.164462 0.0697,-0.229252 -0.12413,-0.524092 -0.28516,-0.433768 -0.40196,-0.691861 -0.31309,-0.691861 0.0699,0 0.25594,0.187733 0.42313,0.427092 0.12691,0.181696 0.16019,0.209359 0.25193,0.209359 0.11346,0 0.0891,0.03227 0.36462,-0.483502 0.0584,-0.109327 0.12367,-0.204345 0.14506,-0.211153 0.0409,-0.01303 0.23195,0.257962 0.32711,0.463852 0.0747,0.161614 0.0811,0.377931 0.0135,0.454877 -0.0995,0.11317 -0.10235,0.197191 -0.0114,0.33128 0.0472,0.06955 0.0943,0.160378 0.10473,0.201845 0.0215,0.08561 0.10855,0.131962 0.15694,0.08357 0.0208,-0.02082 0.016,-0.340824 -0.0134,-0.897154 -0.057,-1.076999 -0.0593,-1.457804 -0.009,-1.474647 0.0614,-0.02062 0.0885,0.09005 0.21475,0.877831 0.0678,0.423111 0.13578,1.663249 0.12604,2.300067 -0.005,0.36228 0.002,0.670291 0.0157,0.684463 0.0525,0.05276 0.093,-0.04818 0.1228,-0.306682 0.0169,-0.14631 0.0529,-0.342513 0.0801,-0.435993 0.0271,-0.09348 0.0595,-0.387417 0.0719,-0.6532 0.0124,-0.265778 0.0506,-0.618901 0.0849,-0.784712 0.0343,-0.165817 0.0867,-0.542662 0.11652,-0.837437 0.0573,-0.565821 0.10004,-0.787192 0.15202,-0.787192 0.0173,0 0.0398,0.04143 0.0498,0.09212 0.0101,0.05067 0.0397,0.167486 0.0659,0.259605 0.0331,0.116592 0.0531,0.437262 0.0655,1.055168 0.0183,0.911143 -0.003,1.218335 -0.13205,1.909357 -0.0738,0.394905 -0.14425,0.825773 -0.16433,1.004929 -0.009,0.0829 -0.0269,0.199727 -0.0391,0.259605 -0.0179,0.08782 -0.0116,0.108866 0.033,0.108866 0.0727,0 0.11165,-0.106055 0.209,-0.569458 0.0445,-0.211873 0.10144,-0.475666 0.12649,-0.586204 0.025,-0.110545 0.0763,-0.336655 0.11373,-0.502466 0.0952,-0.421166 0.18947,-0.761519 0.2921,-1.055168 0.0484,-0.138174 0.10185,-0.38453 0.11899,-0.54746 0.0171,-0.162924 0.0688,-0.408194 0.11469,-0.545039 0.0459,-0.136845 0.0835,-0.276388 0.0835,-0.310098 0,-0.105655 0.0694,-0.266033 0.12424,-0.287077 0.0456,-0.01748 0.0488,0.0013 0.0239,0.13968 -0.0157,0.08791 -0.0303,0.295514 -0.0323,0.461324 -0.004,0.367394 -0.0922,0.964046 -0.20367,1.383596 -0.0738,0.277847 -0.0777,0.321467 -0.0358,0.401967 0.0258,0.04968 0.0785,0.150592 0.11712,0.224291 0.0939,0.179497 0.22419,0.474004 0.27732,0.626912 0.0237,0.06844 0.065,0.132787 0.0916,0.142986 0.053,0.02036 0.2861,-0.104562 0.48497,-0.259932 0.14014,-0.10949 0.34444,-0.406426 0.37925,-0.55127 0.0123,-0.05099 0.0479,-0.145447 0.0792,-0.209929 0.0314,-0.06448 0.0984,-0.290592 0.14902,-0.502465 0.0506,-0.211872 0.12083,-0.484268 0.15601,-0.605331 0.0352,-0.121057 0.0641,-0.24165 0.0642,-0.267977 4.9e-4,-0.121502 0.0735,-0.299101 0.123,-0.299101 0.0434,0 0.0491,0.02592 0.0319,0.142364 -0.0117,0.0783 -0.0343,0.23363 -0.0502,0.34519 -0.0436,0.30477 -0.13542,0.670127 -0.24364,0.969582 -0.1305,0.361116 -0.19538,0.620649 -0.23029,0.921184 -0.0563,0.484903 -0.0942,0.662135 -0.18084,0.845188 -0.0865,0.183006 -0.16677,0.53617 -0.20491,0.90246 -0.0137,0.132127 -0.0507,0.236747 -0.12138,0.343384 -0.12374,0.186814 -0.17918,0.555266 -0.0836,0.555266 0.0809,0 0.27984,-0.421263 0.37718,-0.798625 0.13111,-0.50829 0.16619,-0.635841 0.27322,-0.993492 0.0551,-0.184236 0.10961,-0.38773 0.12105,-0.452213 0.0115,-0.06448 0.0567,-0.245367 0.10067,-0.401968 0.0439,-0.156601 0.10995,-0.40532 0.14672,-0.55271 0.0368,-0.147391 0.13768,-0.509161 0.22426,-0.803936 0.0866,-0.294782 0.17962,-0.618869 0.20675,-0.720197 0.0506,-0.188956 0.0925,-0.261791 0.12206,-0.212278 0.0398,0.06663 -0.14089,0.908989 -0.26803,1.249309 -0.0512,0.137075 -0.0923,0.345747 -0.11221,0.56946 -0.0328,0.3689 -0.051,0.472695 -0.1485,0.849298 -0.10917,0.421364 0.0839,0.361254 0.30046,-0.09354 0.23062,-0.484419 0.31957,-0.684149 0.31957,-0.717631 0,-0.01898 0.0218,-0.08397 0.0485,-0.144471 0.0907,-0.205524 0.35344,-1.070132 0.35344,-1.162879 0,-0.05073 -0.0302,-0.179922 -0.067,-0.287024 -0.0369,-0.107095 -0.067,-0.252941 -0.067,-0.3241 0,-0.07116 -0.0378,-0.237656 -0.0841,-0.369998 -0.0998,-0.285572 -0.15515,-0.814868 -0.0827,-0.790727 0.0608,0.02023 0.14223,0.191849 0.32334,0.680889 0.0574,0.154996 0.13503,0.251226 0.20263,0.251226 0.0321,0 0.0404,0.0216 0.0261,0.067 -0.0149,0.04681 -0.006,0.067 0.0293,0.067 0.07,0 0.0794,-0.02075 0.19999,-0.442303 0.12826,-0.448423 0.21061,-0.527829 0.18002,-0.173567 -0.011,0.126856 -0.0444,0.325317 -0.0744,0.441027 -0.0805,0.310681 -0.067,0.348174 0.15087,0.418816 0.10132,0.03286 0.24752,0.06871 0.32487,0.07969 0.15879,0.02251 0.14998,0.03751 0.19989,-0.340412 0.0511,-0.386946 0.0318,-0.619411 -0.0697,-0.837437 -0.2435,-0.523137 -0.31575,-0.793051 -0.21761,-0.812806 0.0358,-0.0072 0.0885,0.05557 0.1611,0.191718 0.0593,0.11133 0.1566,0.266478 0.21613,0.344759 0.0595,0.07829 0.15212,0.245924 0.20575,0.372518 0.19801,0.467354 0.29349,0.500331 0.448,0.154748 0.0577,-0.129128 0.10498,-0.244974 0.10498,-0.257444 0,-0.01251 0.0287,-0.05381 0.0637,-0.09182 0.0351,-0.03803 0.14275,-0.219898 0.23932,-0.404128 0.0966,-0.184237 0.22993,-0.396103 0.29635,-0.470823 0.0664,-0.07471 0.18861,-0.228028 0.27152,-0.3407 0.14786,-0.200947 0.20937,-0.246833 0.29311,-0.218654 0.0597,0.02003 0.0519,0.192975 -0.0111,0.245158 -0.029,0.02415 -0.0914,0.12018 -0.13847,0.213457 -0.0868,0.17197 -0.16033,0.273658 -0.38651,0.534617 -0.0691,0.07971 -0.12561,0.154546 -0.12561,0.166309 0,0.01171 -0.0302,0.05152 -0.067,0.08837 -0.0369,0.03686 -0.067,0.102781 -0.067,0.14652 0,0.119696 -0.0912,0.354178 -0.18618,0.478717 -0.0464,0.06088 -0.10451,0.167676 -0.12911,0.237401 -0.0246,0.06972 -0.0757,0.184401 -0.11338,0.25484 -0.086,0.160475 -0.075,0.195862 0.2958,0.948112 0.14678,0.297806 0.26686,0.552966 0.26686,0.567032 0,0.04327 0.20092,0.591593 0.27118,0.740077 0.0782,0.165208 0.16428,0.480615 0.16428,0.601691 0,0.047 0.0225,0.132919 0.0501,0.190979 0.0276,0.05806 0.0786,0.203534 0.11357,0.323288 0.19609,0.67231 0.36604,1.162489 0.44136,1.272904 0.0314,0.04606 0.0882,0.181722 0.12612,0.301476 0.038,0.119751 0.11678,0.353397 0.17514,0.519211 l 0.10614,0.301476 -0.0551,0.257134 c -0.0635,0.296411 -0.04,0.451565 0.11604,0.76486 0.0505,0.101508 0.1178,0.28993 0.14948,0.418716 0.0831,0.338175 0.31352,0.719175 0.412,0.681442 0.0173,-0.0067 0.004,-0.136028 -0.0312,-0.29654 -0.0341,-0.156601 -0.0757,-0.378425 -0.0925,-0.492938 -0.0383,-0.261723 -0.092,-0.493052 -0.1889,-0.813465 -0.0905,-0.299069 -0.13178,-0.466903 -0.19853,-0.806285 -0.0274,-0.139468 -0.0882,-0.36558 -0.13496,-0.502462 -0.0468,-0.136887 -0.10788,-0.339325 -0.13573,-0.449869 -0.0278,-0.110539 -0.1091,-0.389406 -0.18058,-0.619704 -0.0715,-0.230293 -0.17102,-0.584529 -0.22122,-0.787188 -0.0502,-0.202663 -0.13276,-0.52675 -0.18347,-0.720196 -0.0507,-0.193447 -0.10203,-0.453916 -0.11402,-0.578808 -0.012,-0.124894 -0.0667,-0.373613 -0.12155,-0.552711 -0.0549,-0.179092 -0.12067,-0.393452 -0.14623,-0.47636 -0.0256,-0.0829 -0.0652,-0.233644 -0.0882,-0.334979 -0.0229,-0.101322 -0.0687,-0.261313 -0.10178,-0.35552 -0.0331,-0.09421 -0.0707,-0.265305 -0.0838,-0.380209 -0.0218,-0.192596 -0.0187,-0.207978 0.0391,-0.196857 0.0652,0.01257 0.0873,0.06659 0.14138,0.346381 0.0178,0.09212 0.073,0.27301 0.12286,0.401975 0.0497,0.128964 0.10177,0.302309 0.11555,0.385217 0.03,0.180676 0.15395,0.567981 0.24118,0.753691 0.0346,0.0737 0.0629,0.159481 0.0629,0.190638 -7e-5,0.03116 0.0173,0.0674 0.0385,0.08056 0.0432,0.02671 0.0177,-0.459395 -0.0401,-0.764427 -0.0177,-0.09301 -0.0321,-0.295658 -0.0321,-0.450321 0,-0.23005 0.01,-0.285048 0.0551,-0.302348 0.0671,-0.02573 0.1459,0.07134 0.1459,0.179681 0,0.04215 0.038,0.189997 0.0845,0.328544 0.0465,0.138548 0.0985,0.362039 0.1156,0.496652 0.05,0.394572 0.12911,0.535848 0.3693,0.659747 0.0644,0.03326 0.15467,0.100562 0.20042,0.149564 0.11878,0.127249 0.28566,0.223086 0.34726,0.199448 0.029,-0.01112 0.0836,-0.10553 0.12121,-0.209758 0.0377,-0.104228 0.0838,-0.216213 0.10248,-0.248856 0.0773,-0.134771 0.0706,-0.351939 -0.0281,-0.912072 -0.0552,-0.313202 -0.11739,-0.697587 -0.13824,-0.854188 -0.0209,-0.156601 -0.0537,-0.39575 -0.073,-0.53145 -0.0257,-0.18029 -0.025,-0.256881 0.003,-0.284452 0.0523,-0.05223 0.0913,0.01767 0.13756,0.246447 0.0483,0.23826 0.16789,0.642656 0.20429,0.690296 0.0364,0.04772 0.15318,0.383719 0.20817,0.599355 0.0235,0.09212 0.0685,0.216848 0.10008,0.27718 0.0316,0.06036 0.0872,0.256292 0.12359,0.435463 0.0364,0.179183 0.0835,0.363466 0.10461,0.409521 0.0211,0.04608 0.0708,0.180787 0.11044,0.299384 0.0909,0.271989 0.16528,0.314333 0.14305,0.08143 -0.009,-0.08969 -0.0424,-0.283667 -0.0753,-0.431051 -0.0329,-0.147391 -0.0632,-0.396109 -0.0674,-0.552711 -0.004,-0.174548 -0.0401,-0.407865 -0.0917,-0.602955 -0.15998,-0.605416 -0.2084,-0.885018 -0.20884,-1.205904 -4e-4,-0.300129 0.004,-0.318811 0.0715,-0.328479 0.0935,-0.01329 0.25629,0.157975 0.35999,0.378724 0.0433,0.09212 0.11767,0.348372 0.16531,0.569454 0.13515,0.627064 0.14947,0.691572 0.19647,0.884954 0.062,0.255192 0.12625,0.261947 0.13214,0.01388 0.008,-0.344987 -0.008,-0.685432 -0.0568,-1.218642 -0.0494,-0.536117 -0.0277,-1.078092 0.0517,-1.286823 0.0337,-0.0885 0.0392,-0.09068 0.0971,-0.03823 0.0715,0.06468 0.11722,0.446827 0.12479,1.04194 0.009,0.706227 0.0947,1.399102 0.19551,1.580596 0.0288,0.05184 0.15011,0.214871 0.26957,0.362262 0.11947,0.147383 0.27785,0.384798 0.35195,0.527581 0.15259,0.293989 0.20822,0.318804 0.39908,0.177992 0.11577,-0.08541 0.38206,-0.382652 0.4403,-0.491475 0.0406,-0.07593 0.11738,-0.0829 0.14416,-0.01309 0.0106,0.02762 0.0489,0.05027 0.085,0.05027 0.0546,0 0.0696,-0.03174 0.0894,-0.189984 0.0385,-0.308573 6.5e-4,-0.328479 -0.47113,-0.249328 -0.48399,0.08113 -0.58247,0.0846 -0.65065,0.02291 -0.0349,-0.03155 -0.0824,-0.105308 -0.1055,-0.163847 -0.0231,-0.05852 -0.0608,-0.129063 -0.0838,-0.156699 -0.0229,-0.02762 -0.0965,-0.22359 -0.1635,-0.435462 -0.067,-0.211873 -0.13623,-0.411394 -0.15382,-0.443389 -0.0452,-0.08232 -0.0396,-0.159566 0.0116,-0.159566 0.0554,0 0.32655,0.456225 0.42811,0.720195 0.0425,0.110538 0.0953,0.221378 0.1173,0.246304 0.0691,0.07837 0.17458,0.01015 0.3713,-0.240346 0.10386,-0.132244 0.23007,-0.285657 0.28045,-0.340936 0.0504,-0.05525 0.19802,-0.29181 0.32808,-0.52565 0.17516,-0.314936 0.24946,-0.487921 0.28658,-0.667261 0.0353,-0.170333 0.0755,-0.267466 0.13569,-0.327686 0.0856,-0.08557 0.0856,-0.08558 0.15255,-0.01859 0.0578,0.0578 0.0699,0.128735 0.0882,0.518365 0.0142,0.302361 0.009,0.495637 -0.0175,0.585386 -0.05,0.173253 -0.12874,0.795315 -0.15596,1.231845 -0.0117,0.188393 -0.0358,0.395292 -0.0534,0.45978 -0.0177,0.06448 -0.0451,0.237827 -0.061,0.385217 -0.016,0.147391 -0.0526,0.373501 -0.0815,0.502466 -0.0288,0.128964 -0.0527,0.31739 -0.0531,0.418712 -4.1e-4,0.101334 -0.0234,0.297294 -0.0513,0.435469 -0.0279,0.138181 -0.0663,0.340575 -0.0854,0.449771 -0.0191,0.109195 -0.04,0.207174 -0.0464,0.217734 -0.007,0.01055 -0.0212,0.185009 -0.0328,0.387668 -0.0231,0.404709 -0.0773,0.747002 -0.12887,0.812803 -0.0519,0.06623 -0.0752,0.510347 -0.0268,0.510347 0.0572,0 0.15945,-0.254027 0.18737,-0.465444 0.0131,-0.0994 0.052,-0.242594 0.0863,-0.318228 0.0357,-0.07847 0.0631,-0.21661 0.064,-0.321744 6.6e-4,-0.101331 0.017,-0.24453 0.0358,-0.318227 0.0823,-0.322394 0.16675,-0.722274 0.20152,-0.95468 0.0207,-0.138175 0.0595,-0.364284 0.0863,-0.502458 0.0268,-0.138175 0.0617,-0.341676 0.0776,-0.45222 0.0159,-0.110538 0.0443,-0.250755 0.0632,-0.311591 0.0388,-0.124671 0.0845,-0.60702 0.14266,-1.504004 0.0426,-0.657744 0.0736,-0.744121 0.18569,-0.518725 0.0544,0.109491 0.061,0.207984 0.0573,0.868811 -0.004,0.697286 -2.7e-4,0.745312 0.0563,0.745312 0.0425,0 0.0809,-0.05479 0.12978,-0.185487 0.0382,-0.102022 0.0694,-0.208534 0.0694,-0.236688 0,-0.02814 0.0144,-0.07823 0.0322,-0.111264 0.0177,-0.03306 0.0539,-0.20608 0.0804,-0.384537 0.0284,-0.190403 0.0831,-0.396495 0.13243,-0.498806 0.0463,-0.09589 0.11583,-0.308743 0.15456,-0.473009 0.0682,-0.289034 0.11254,-0.388032 0.17399,-0.388032 0.0929,0 0.004,0.516185 -0.29738,1.74187 -0.10347,0.419688 -0.0988,0.461554 0.0763,0.686696 0.32605,0.419242 0.35475,0.380621 0.61013,-0.820687 0.12164,-0.572223 0.12463,-0.603467 0.12534,-1.309556 4.1e-4,-0.562981 0.011,-0.735652 0.0467,-0.778814 0.0555,-0.06701 0.24915,-0.07343 0.30178,-0.01002 0.0208,0.025 0.0531,0.209647 0.0719,0.410346 0.0188,0.200693 0.0485,0.447802 0.066,0.54913 0.0175,0.101328 0.0497,0.331209 0.0716,0.510837 0.0362,0.297786 0.0459,0.3266 0.11063,0.3266 0.0552,0 0.092,-0.04831 0.16618,-0.218648 0.0524,-0.120265 0.1688,-0.31828 0.25869,-0.440051 0.0899,-0.121764 0.16342,-0.235451 0.16342,-0.25264 0,-0.01721 0.0339,-0.02645 0.0754,-0.02055 0.13822,0.01964 0.1219,0.163611 -0.0923,0.814645 -0.30672,0.93218 -0.35154,1.094777 -0.35154,1.275282 0,0.102442 -0.0164,0.217005 -0.0366,0.254584 -0.0466,0.08705 -0.009,0.29312 0.0577,0.318837 0.0898,0.0345 0.15158,-0.07474 0.25258,-0.446819 0.0543,-0.199901 0.12731,-0.423759 0.16232,-0.497451 0.0351,-0.0737 0.11727,-0.266622 0.18277,-0.428727 0.0655,-0.162099 0.19424,-0.441576 0.28607,-0.621061 0.0918,-0.179484 0.16698,-0.342526 0.16698,-0.362327 0,-0.04857 0.13107,-0.212514 0.16992,-0.212514 0.0518,0 0.0353,0.167852 -0.0496,0.502543 -0.18808,0.742059 -0.29672,1.140093 -0.38851,1.423558 -0.0537,0.165816 -0.13738,0.474828 -0.18595,0.686701 -0.0486,0.211872 -0.11701,0.451198 -0.15208,0.531843 -0.035,0.08064 -0.0637,0.176433 -0.0637,0.212867 0,0.03646 -0.0391,0.143804 -0.0868,0.238599 -0.0477,0.0948 -0.16181,0.398464 -0.25355,0.674815 -0.0917,0.276356 -0.21599,0.600443 -0.27609,0.720198 -0.0601,0.11975 -0.1185,0.295853 -0.1298,0.391338 -0.0139,0.1173 -0.0538,0.219422 -0.12288,0.314875 -0.0563,0.0777 -0.10234,0.156866 -0.10234,0.175918 0,0.01905 -0.028,0.09593 -0.0623,0.170838 -0.0343,0.0749 -0.10359,0.234172 -0.15412,0.353923 -0.0505,0.119754 -0.1205,0.279018 -0.15549,0.353927 -0.035,0.0749 -0.0637,0.149089 -0.0637,0.164857 0,0.04847 -0.16684,0.460677 -0.25177,0.622034 -0.0442,0.08396 -0.0909,0.218981 -0.10391,0.30006 -0.0221,0.138386 -0.16478,0.471705 -0.31493,0.735933 -0.0365,0.0642 -0.0664,0.165433 -0.0664,0.224972 0,0.05954 -0.0213,0.157757 -0.0472,0.218256 -0.25326,0.59024 -0.3557,0.874083 -0.37213,1.031185 -0.0218,0.208205 -0.0234,0.204989 0.19323,0.379087 0.0875,0.07033 0.15912,0.147053 0.15912,0.170513 0,0.02346 0.0499,0.07898 0.11087,0.123374 0.10404,0.07575 0.26496,0.24599 0.67267,0.711618 0.0941,0.107487 0.27373,0.309024 0.39911,0.447856 0.12539,0.138833 0.25147,0.311108 0.28016,0.382831 0.0288,0.07173 0.0959,0.16155 0.14938,0.199611 0.11239,0.08003 0.19666,0.226483 0.19666,0.341776 0,0.04411 0.0377,0.123996 0.0838,0.177526 0.0461,0.05353 0.11445,0.162303 0.15186,0.241716 0.0375,0.07942 0.12537,0.230153 0.19547,0.334975 0.0701,0.104823 0.14738,0.243345 0.17172,0.307828 0.0243,0.06449 0.057,0.131561 0.0725,0.149064 0.0155,0.01751 0.0281,0.05596 0.0281,0.08546 0,0.0295 0.0594,0.145075 0.13204,0.256834 0.0886,0.13642 0.15463,0.295482 0.2008,0.484 0.0554,0.226182 0.0888,0.297956 0.17186,0.369005 0.11329,0.09692 0.126,0.141309 0.28168,0.983713 0.0477,0.25793 0.10127,0.532166 0.1191,0.609413 0.0179,0.07724 0.031,0.182764 0.0291,0.234483 -0.002,0.06176 -0.02,0.02505 -0.052,-0.106952 -0.0761,-0.314041 -0.21193,-0.757167 -0.27723,-0.904432 -0.0327,-0.07369 -0.10052,-0.247043 -0.15076,-0.385221 -0.1389,-0.382039 -0.26773,-0.662897 -0.61062,-1.331298 -0.38865,-0.757579 -0.50937,-0.982745 -0.56136,-1.04702 -0.0604,-0.0747 -0.38794,-0.657195 -0.38854,-0.691016 -6.5e-4,-0.03657 -0.15773,-0.26078 -0.4182,-0.5969 -0.11054,-0.142646 -0.24314,-0.314445 -0.29467,-0.381777 -0.0515,-0.06733 -0.32267,-0.352298 -0.60255,-0.633259 -0.3965,-0.398034 -0.52815,-0.510835 -0.5962,-0.510835 -0.0941,0 -0.1982,0.09101 -0.1982,0.173255 0,0.06085 0.2805,0.429957 0.53596,0.705252 0.10132,0.109202 0.20491,0.238844 0.23018,0.288097 0.0253,0.04926 0.0732,0.119698 0.10668,0.156545 0.10868,0.119887 0.22463,0.294948 0.43927,0.663221 0.11596,0.19896 0.26725,0.430013 0.3362,0.513454 0.069,0.08343 0.13936,0.202367 0.15645,0.264286 0.017,0.06192 0.0702,0.163833 0.11796,0.226475 0.0477,0.06264 0.1044,0.165309 0.12581,0.228152 0.0214,0.06284 0.0855,0.182092 0.14235,0.264998 0.085,0.12405 0.72341,1.381979 0.72341,1.425607 0,0.0072 0.0431,0.107696 0.0959,0.223304 0.0528,0.115609 0.10708,0.247884 0.12072,0.293942 0.0137,0.04606 0.0591,0.144039 0.10085,0.217734 0.0418,0.0737 0.1103,0.228753 0.15219,0.344574 0.0657,0.181637 0.0709,0.228217 0.0378,0.338862 -0.0211,0.07055 -0.0384,0.158597 -0.0384,0.195656 0,0.09207 -0.0819,0.153004 -0.16861,0.125475 -0.05,-0.01587 -0.1244,-0.135554 -0.24876,-0.40023 -0.0976,-0.207672 -0.19629,-0.436144 -0.21936,-0.507711 -0.023,-0.07157 -0.0531,-0.145198 -0.0666,-0.163622 -0.0136,-0.01842 -0.0559,-0.116402 -0.094,-0.217733 -0.1207,-0.320717 -0.34378,-0.85002 -0.37351,-0.886279 -0.0158,-0.0192 -0.0774,-0.125345 -0.137,-0.235885 -0.0597,-0.110543 -0.12889,-0.224783 -0.15394,-0.25387 -0.025,-0.02909 -0.0456,-0.06796 -0.0456,-0.08639 0,-0.04225 -0.55666,-0.976314 -0.63567,-1.066631 -0.0323,-0.03685 -0.15422,-0.232807 -0.27108,-0.435466 -0.33052,-0.573177 -0.94398,-1.489492 -1.17716,-1.758309 -0.11893,-0.137105 -0.13087,-0.142567 -0.27587,-0.126223 -0.19001,0.02142 -0.32021,0.103785 -0.3194,0.202055 2.6e-4,0.04103 0.0456,0.14093 0.10049,0.222002 0.0549,0.08107 0.0999,0.162003 0.0999,0.179842 0,0.01784 0.0805,0.147468 0.17897,0.288062 0.0985,0.140596 0.19839,0.315921 0.2221,0.389616 0.0422,0.131307 0.10392,0.242559 0.4569,0.824271 0.0962,0.158569 0.24527,0.428291 0.33119,0.599381 0.14462,0.287964 0.29116,0.530807 0.44469,0.736935 0.0671,0.0901 0.19125,0.416852 0.22621,0.595382 0.0118,0.06032 0.0556,0.150761 0.0974,0.200984 0.0418,0.05022 0.10739,0.189632 0.14588,0.309795 0.0385,0.120162 0.11752,0.323659 0.17564,0.452215 0.0581,0.128556 0.15109,0.361866 0.2066,0.518467 0.0899,0.253677 0.22476,0.547098 0.48109,1.046812 0.12635,0.246322 0.11084,0.349013 -0.0877,0.580977 -0.35604,0.415963 -0.55788,0.540533 -0.7121,0.439484 -0.10867,-0.0712 -0.37547,-0.634948 -0.62168,-1.313581 -0.1802,-0.496713 -0.24931,-0.669442 -0.31416,-0.785151 -0.0355,-0.06336 -0.0944,-0.191488 -0.13094,-0.284729 -0.0865,-0.221093 -0.26396,-0.620124 -0.46766,-1.051992 -0.0899,-0.19058 -0.16344,-0.352145 -0.16344,-0.359035 0,-0.03663 -0.31621,-0.813409 -0.43619,-1.071515 -0.0766,-0.164882 -0.16746,-0.360081 -0.20181,-0.433776 -0.0343,-0.0737 -0.17036,-0.375171 -0.30222,-0.669949 -0.24511,-0.547967 -0.30789,-0.653201 -0.38964,-0.653201 -0.0353,0 -0.0414,0.03029 -0.0249,0.125616 0.044,0.255039 0.21836,0.829626 0.2921,0.963051 0.0204,0.03685 0.0478,0.134827 0.061,0.217734 0.0131,0.0829 0.047,0.218572 0.0751,0.301478 0.0588,0.172991 0.1195,0.41856 0.15743,0.636451 0.0144,0.0829 0.0709,0.286403 0.1255,0.452215 0.0546,0.165812 0.12957,0.406995 0.1666,0.53596 0.037,0.128965 0.0917,0.318714 0.12147,0.421662 0.0297,0.102949 0.0541,0.263266 0.0541,0.35626 0,0.107698 0.0411,0.282957 0.11299,0.48277 0.13498,0.374687 0.26947,0.808114 0.33641,1.084131 0.14844,0.612074 0.27316,1.070035 0.35944,1.31972 0.0819,0.237214 0.0905,0.291312 0.0545,0.345202 -0.1065,0.159486 -0.80083,0.338496 -1.24719,0.32155 l -0.26662,-0.01012 -0.14753,-0.28473 c -0.14185,-0.27372 -0.22508,-0.532368 -0.32512,-1.010294 -0.0257,-0.122708 -0.0906,-0.356352 -0.14422,-0.519211 -0.0537,-0.162858 -0.12273,-0.469455 -0.1535,-0.681326 -0.0308,-0.211873 -0.0918,-0.558571 -0.13559,-0.770442 -0.16177,-0.782608 -0.24559,-1.002793 -0.29969,-0.787227 -0.0227,0.09039 0.0255,0.671907 0.0817,0.98599 0.0179,0.100107 0.0326,0.259243 0.0326,0.353637 0,0.09439 0.0287,0.329036 0.0638,0.521433 0.035,0.192395 0.0883,0.530696 0.11831,0.751779 0.03,0.221082 0.0683,0.492412 0.0853,0.602954 0.017,0.110541 0.0396,0.352705 0.0503,0.53814 0.0249,0.429915 0.008,0.450587 -0.37211,0.457842 -0.15075,0.0029 -0.29517,-0.01208 -0.33698,-0.03488 -0.0403,-0.02196 -0.13483,-0.03992 -0.21019,-0.03992 -0.16833,0 -0.20083,0.06305 -0.17697,0.343298 0.0168,0.196896 -0.0202,0.293154 -0.11237,0.293154 -0.0844,0 -0.14125,-0.184368 -0.2123,-0.687585 -0.039,-0.275867 -0.092,-0.607091 -0.11781,-0.736056 -0.0258,-0.128966 -0.0644,-0.332464 -0.0858,-0.452218 -0.0776,-0.434813 -0.10744,-0.590217 -0.15443,-0.803937 -0.0607,-0.27627 -0.26681,-1.059854 -0.34795,-1.32315 -0.0341,-0.110543 -0.13679,-0.442167 -0.22828,-0.736944 -0.0915,-0.294779 -0.21381,-0.694236 -0.27181,-0.887684 -0.17612,-0.587341 -0.37605,-1.117459 -0.45476,-1.205908 -0.0481,-0.05403 -0.0815,-0.146133 -0.094,-0.259587 -0.0107,-0.09671 -0.044,-0.232378 -0.0739,-0.301478 -0.11977,-0.276568 -0.22044,-0.47221 -0.25941,-0.504174 -0.0705,-0.05779 -0.51683,-0.179662 -0.6163,-0.168269 -0.0901,0.01031 -0.0943,0.01843 -0.087,0.166194 0.005,0.104833 0.0557,0.251873 0.15513,0.452216 0.18123,0.365031 0.30488,0.747623 0.35578,1.100811 0.0399,0.276963 0.0642,0.373333 0.17328,0.686698 0.064,0.183897 0.1945,0.664415 0.34774,1.280423 0.0446,0.179161 0.0726,0.347778 0.0623,0.374704 -0.0103,0.02692 0.0201,0.161738 0.0677,0.299583 0.0476,0.137845 0.0865,0.275091 0.0865,0.304991 0,0.0299 0.0316,0.152161 0.0702,0.271687 0.0386,0.119529 0.0619,0.239005 0.0517,0.265499 -0.019,0.04942 -0.003,0.173653 0.11269,0.871085 0.0367,0.221084 0.0801,0.484876 0.0966,0.586206 0.0331,0.202939 0.1515,0.826002 0.20693,1.088667 0.0517,0.245146 0.10403,0.825437 0.0823,0.912806 -0.0607,0.24349 -0.25018,-0.123512 -0.35028,-0.678323 -0.0399,-0.221084 -0.0869,-0.474721 -0.10436,-0.563639 -0.0175,-0.08892 -0.0318,-0.218267 -0.0318,-0.287446 0,-0.06918 -0.0375,-0.312978 -0.0833,-0.541777 -0.0458,-0.228801 -0.0835,-0.460153 -0.0838,-0.514116 -2.7e-4,-0.05396 -0.015,-0.144406 -0.0327,-0.200984 -0.0385,-0.122642 -0.15501,-0.637851 -0.1975,-0.873313 -0.0433,-0.240123 -0.16436,-0.736893 -0.23669,-0.971426 -0.0341,-0.110541 -0.0811,-0.283891 -0.10457,-0.385221 -0.0234,-0.101329 -0.0715,-0.289753 -0.10667,-0.418717 -0.0352,-0.128967 -0.0926,-0.362611 -0.12762,-0.519212 -0.035,-0.1566 -0.0882,-0.367635 -0.11823,-0.468964 -0.0301,-0.10133 -0.0913,-0.319902 -0.13606,-0.485714 -0.11423,-0.423173 -0.40451,-1.333604 -0.50382,-1.5802 -0.0835,-0.207288 -0.16605,-0.285127 -0.2171,-0.204675 -0.0366,0.05761 -0.0348,0.136112 0.009,0.394732 0.0204,0.119752 0.0419,0.30064 0.0481,0.401969 0.0184,0.306648 0.0743,0.744665 0.11519,0.904432 0.0479,0.186988 0.11787,0.698215 0.18558,1.356646 0.0284,0.276355 0.0659,0.577831 0.0833,0.66995 0.0174,0.09212 0.0396,0.288077 0.0493,0.435466 0.01,0.14739 0.0335,0.350886 0.0528,0.452215 0.0851,0.446192 0.11181,0.607321 0.19405,1.172412 0.0174,0.119753 0.0239,0.274455 0.0144,0.343781 -0.0113,0.08295 0.007,0.186034 0.0515,0.301477 0.0409,0.104614 0.0831,0.330934 0.10448,0.56065 0.0196,0.211873 0.0587,0.460494 0.0866,0.552494 0.0279,0.092 0.0665,0.35579 0.0857,0.586205 0.0192,0.230415 0.0565,0.504016 0.0829,0.608005 0.0964,0.379551 0.0393,0.526194 -0.23441,0.601763 -0.17799,0.04914 -0.25284,-0.01295 -0.35125,-0.291413 -0.065,-0.183985 -0.0862,-0.331627 -0.1074,-0.749491 -0.0264,-0.52107 -0.0664,-0.905898 -0.12697,-1.222391 -0.0767,-0.400859 -0.11265,-0.753738 -0.10897,-1.069271 0.002,-0.185909 -0.0126,-0.398545 -0.0329,-0.472524 -0.0203,-0.07398 -0.0493,-0.44352 -0.0647,-0.821204 -0.0432,-1.065097 -0.11811,-2.195829 -0.14875,-2.245413 -0.0152,-0.02468 -0.0393,-0.194106 -0.0534,-0.3765 -0.0242,-0.312079 -0.12958,-1.215693 -0.19822,-1.699258 -0.0744,-0.524372 -0.0709,-0.514583 -0.20018,-0.546157 -0.18291,-0.04466 -0.19058,-0.0063 -0.15617,0.780639 0.0993,2.270719 0.11261,3.021688 0.0586,3.308851 -0.0303,0.161514 -0.0303,0.305362 -2e-5,0.619704 0.0216,0.225151 0.0425,0.756064 0.0463,1.179806 0.009,0.943813 0.0685,1.738371 0.18499,2.445316 0.0182,0.110542 0.0404,0.336649 0.0493,0.502462 0.009,0.165813 0.0263,0.401641 0.0385,0.524063 0.0275,0.275435 0.002,0.385863 -0.0957,0.415359 -0.0415,0.01249 -0.12516,0.04578 -0.18611,0.07397 -0.0649,0.03002 -0.1232,0.03889 -0.14068,0.0214 -0.0616,-0.06155 -0.26873,-0.962544 -0.3013,-1.310121 -0.0283,-0.302394 -0.0847,-1.471096 -0.0909,-1.885255 -6.6e-4,-0.06448 -0.0158,-0.441329 -0.033,-0.837438 -0.0362,-0.832519 -0.0316,-1.688868 0.0164,-3.08458 0.0222,-0.645095 0.0227,-1.048467 0.002,-1.155663 -0.0183,-0.09269 -0.0231,-0.355957 -0.0111,-0.602298 0.0275,-0.560715 -0.002,-0.852027 -0.0857,-0.852027 -0.0546,0 -0.0621,0.04825 -0.0793,0.510836 -0.0105,0.28096 -0.0325,0.736945 -0.0491,1.013299 -0.0669,1.117257 -0.10157,1.954267 -0.11664,2.813787 -0.009,0.497437 -0.0404,1.34911 -0.0705,1.892605 -0.03,0.543497 -0.0593,1.327338 -0.065,1.741869 -0.008,0.554199 -0.0247,0.811326 -0.0646,0.971426 -0.0298,0.119755 -0.0545,0.302738 -0.0548,0.406635 -6.5e-4,0.233879 -0.0499,0.295646 -0.31333,0.39243 -0.39621,0.14559 -0.47949,0.09853 -0.52488,-0.296603 -0.0568,-0.494884 -0.0391,-1.131891 0.0647,-2.311324 0.0203,-0.230295 0.0427,-0.690049 0.0499,-1.021673 0.0183,-0.837595 0.0791,-2.083568 0.11966,-2.451731 0.0186,-0.169343 0.0348,-0.402988 0.0359,-0.519212 0.002,-0.116224 0.0157,-0.286685 0.0326,-0.378804 0.0168,-0.09212 0.0453,-0.366823 0.0633,-0.610458 0.0181,-0.243634 0.0485,-0.47252 0.0679,-0.508635 0.0193,-0.03612 0.0351,-0.142888 0.0351,-0.237273 0,-0.09439 0.0157,-0.280032 0.0348,-0.412546 0.0191,-0.132514 0.0486,-0.338915 0.0656,-0.458667 0.017,-0.119755 0.0406,-0.283205 0.0525,-0.363224 0.0188,-0.12626 0.014,-0.143969 -0.0362,-0.133991 -0.0705,0.01403 -0.17894,0.269772 -0.18236,0.430219 -8.7e-4,0.06449 -0.0399,0.259647 -0.0856,0.433698 -0.0457,0.17405 -0.0831,0.358401 -0.0831,0.409666 0,0.05127 -0.0213,0.150041 -0.0475,0.219502 -0.0267,0.07109 -0.0567,0.323944 -0.0687,0.57851 -0.0117,0.248718 -0.035,0.520048 -0.0516,0.602954 -0.0167,0.0829 -0.0311,0.278866 -0.032,0.435466 -6.5e-4,0.156602 -0.0163,0.337487 -0.034,0.40197 -0.0474,0.171428 -0.10183,0.541392 -0.1331,0.904432 -0.015,0.175024 -0.0443,0.514186 -0.065,0.753692 -0.0206,0.239507 -0.0525,0.565303 -0.0709,0.723993 -0.0183,0.158688 -0.0335,0.430017 -0.0336,0.602954 -2.2e-4,0.17632 -0.0215,0.384091 -0.0485,0.473025 -0.0277,0.09109 -0.0489,0.304964 -0.05,0.502462 -8.7e-4,0.189127 -0.0192,0.509679 -0.0404,0.712338 -0.0212,0.202661 -0.0416,0.568678 -0.0453,0.813374 -0.006,0.402605 -0.0136,0.452122 -0.0781,0.520841 -0.0658,0.07 -0.0673,0.08171 -0.0197,0.149736 0.0284,0.04059 0.0424,0.08885 0.031,0.107237 -0.0299,0.04837 -0.35669,0.0348 -0.69294,-0.02878 z m -1.25551,-7.088644 c 0.0427,-0.04273 0.12972,-0.291322 0.2523,-0.721041 0.0183,-0.06449 0.073,-0.230203 0.12117,-0.368267 0.12532,-0.358572 0.14198,-0.687283 0.051,-1.005128 -0.0396,-0.138178 -0.11231,-0.409507 -0.16164,-0.602955 l -0.0897,-0.351723 -0.21773,-0.0086 c -0.11975,-0.0048 -0.23956,0.0055 -0.26624,0.02283 -0.0756,0.049 -0.0801,0.371684 -0.0177,1.258711 0.031,0.442167 0.0666,0.988232 0.079,1.213477 0.0137,0.249837 0.0385,0.425526 0.0635,0.45054 0.0226,0.02255 0.041,0.06814 0.041,0.101299 0,0.07294 0.0772,0.07874 0.14511,0.0109 z m 7.7335,-0.570691 c 0.0363,-0.880019 0.0854,-1.453949 0.15533,-1.814051 0.0966,-0.497437 0.14891,-0.873186 0.12667,-0.909167 -0.0269,-0.04355 -0.20981,-0.06802 -0.2628,-0.03515 -0.0237,0.01475 -0.0427,0.08993 -0.0427,0.169946 0,0.186092 -0.0458,0.205691 -0.1398,0.05975 -0.15798,-0.245409 -0.19047,-0.282588 -0.20306,-0.232368 -0.007,0.02647 -0.0409,0.146113 -0.0761,0.265867 -0.12394,0.421643 -0.20097,0.720831 -0.20086,0.78015 7e-5,0.03298 0.0303,0.119049 0.0671,0.191277 0.0369,0.07223 0.067,0.194235 0.067,0.271132 0,0.0769 0.0171,0.197081 0.0382,0.267075 0.0322,0.107407 0.0296,0.135825 -0.0168,0.182141 -0.0776,0.07756 -0.0702,0.135412 0.0644,0.507546 0.0656,0.181356 0.1598,0.454408 0.20935,0.606783 0.0645,0.198558 0.1043,0.274368 0.14032,0.267591 0.0412,-0.0077 0.0544,-0.111913 0.0737,-0.578524 z m -4.48406,-2.735469 c 0.0181,-0.02865 0.0234,-0.07673 0.0118,-0.106873 -0.0266,-0.06954 -0.34902,-0.07658 -0.44057,-0.0096 -0.0856,0.06255 -0.0351,0.125575 0.0935,0.116913 0.0585,-0.0039 0.13657,0.01025 0.17334,0.03153 0.0794,0.04594 0.11758,0.0384 0.16194,-0.03194 z m 1.51302,0.03901 c 0.0115,-0.01859 0.012,-0.06188 8.7e-4,-0.0962 -0.024,-0.0757 -0.22683,-0.110774 -0.40639,-0.07028 -0.1465,0.03305 -0.19701,0.07698 -0.16984,0.147777 0.016,0.04159 0.0757,0.05249 0.28721,0.05249 0.14687,0 0.27644,-0.01521 0.28793,-0.0338 z m -5.55953,-0.455705 c 0.31092,-0.518838 0.36642,-0.616179 0.53904,-0.945387 0.2236,-0.426445 0.44555,-0.762562 0.67954,-1.029056 0.0569,-0.0648 0.14291,-0.196415 0.19114,-0.292457 0.0483,-0.09604 0.13988,-0.259838 0.20367,-0.363984 0.14246,-0.232552 0.1398,-0.342097 -0.009,-0.356614 -0.18683,-0.01829 -0.27936,0.04402 -0.37009,0.249171 -0.046,0.104069 -0.12603,0.251111 -0.17779,0.326752 -0.0518,0.07564 -0.15196,0.25813 -0.22264,0.405515 -0.0707,0.14739 -0.1934,0.376212 -0.27265,0.508495 -0.0792,0.132283 -0.14414,0.252871 -0.14416,0.267978 -4e-5,0.01512 -0.0867,0.200818 -0.19262,0.41269 -0.1059,0.21187 -0.21931,0.463649 -0.25199,0.559507 -0.0327,0.09586 -0.0793,0.194149 -0.10357,0.218425 -0.0677,0.06769 -0.11433,0.172096 -0.0977,0.218616 0.0317,0.08811 0.10036,0.03402 0.22841,-0.179651 z m -0.94716,-0.02185 c 0.0326,-0.06937 0.0958,-0.238213 0.14056,-0.375207 0.13334,-0.40847 0.44725,-1.123289 0.49329,-1.123289 0.015,0 0.0274,0.04521 0.0274,0.100493 0,0.104724 0.0718,0.138756 0.12364,0.05862 0.07,-0.108166 0.35494,-0.93111 0.33075,-0.955291 -0.0323,-0.03228 -0.17604,0.02631 -0.24583,0.100148 -0.3901,0.412778 -0.51004,0.55975 -0.51004,0.625005 0,0.04089 -0.025,0.122593 -0.0554,0.181557 -0.0938,0.181365 -0.51399,1.397088 -0.51399,1.487203 0,0.10055 0.14899,0.03006 0.20973,-0.09924 z m 2.04625,0.05938 c 0.11455,-0.03475 0.20845,-0.09756 0.31865,-0.213101 0.2341,-0.24544 0.26362,-0.314574 0.19538,-0.457635 -0.0351,-0.07373 -0.0795,-0.116703 -0.12028,-0.116703 -0.13386,0 -0.50177,0.476736 -0.5881,0.762066 -0.0269,0.08868 -0.0181,0.08982 0.19435,0.02537 z m 7.65865,-0.109117 c -2.7e-4,-0.05067 -0.0451,-0.172813 -0.0995,-0.27144 -0.10152,-0.18418 -0.24156,-0.491772 -0.68849,-1.512298 -0.28998,-0.662144 -0.5804,-1.283629 -0.70442,-1.507386 -0.0459,-0.0829 -0.15901,-0.298584 -0.25124,-0.479288 l -0.1677,-0.328545 -0.12405,0.01031 c -0.0794,0.0066 -0.12757,0.02892 -0.13384,0.06199 -0.005,0.0284 0.12598,0.314045 0.29188,0.634735 0.1659,0.320693 0.31764,0.628975 0.3372,0.685075 0.0196,0.0561 0.0737,0.157022 0.12029,0.224274 0.0466,0.06725 0.10506,0.199303 0.12988,0.293455 0.0248,0.09415 0.10019,0.271284 0.16743,0.393625 0.0672,0.122341 0.13778,0.306324 0.15673,0.408851 0.0397,0.21477 0.15559,0.460644 0.26276,0.557497 0.0958,0.08657 0.15449,0.202562 0.2674,0.528393 0.11407,0.329178 0.16572,0.392864 0.31866,0.392864 0.10608,0 0.11751,-0.009 0.11697,-0.09212 z m 0.63706,0.03327 c 0,-0.03236 -0.0463,-0.194407 -0.10292,-0.360099 -0.0566,-0.165688 -0.11651,-0.369085 -0.1331,-0.45199 -0.075,-0.374242 -0.25583,-0.872819 -0.36874,-1.016356 -0.0918,-0.116666 -0.36725,-0.314004 -0.47668,-0.34147 -0.0822,-0.02061 -0.091,-0.01407 -0.091,0.06775 0,0.04981 0.0282,0.130591 0.0626,0.179492 0.0734,0.104291 0.23886,0.448794 0.23886,0.497466 0,0.01849 0.044,0.09437 0.0978,0.168632 0.0538,0.07426 0.12116,0.203834 0.14972,0.287942 0.0841,0.247635 0.38352,0.898999 0.44402,0.965854 0.0715,0.07902 0.17938,0.08069 0.17938,0.0028 z m -1.42478,-0.173795 c 0.04,-0.06468 -0.093,-0.480269 -0.18839,-0.58896 -0.0524,-0.05964 -0.0952,-0.131641 -0.0952,-0.160018 0,-0.02839 -0.0625,-0.173356 -0.13875,-0.32218 -0.12003,-0.234112 -0.15051,-0.270546 -0.2261,-0.270302 -0.0733,2.58e-4 -0.10467,0.034 -0.1946,0.209361 -0.17363,0.338616 -0.17353,0.341635 0.0188,0.538479 0.093,0.09518 0.2202,0.248429 0.28269,0.340545 0.084,0.123859 0.15208,0.182283 0.26119,0.224286 0.16967,0.06532 0.25255,0.07382 0.28039,0.02879 z m 2.67853,0.002 c 0.0262,-0.04234 -0.0334,-0.441417 -0.11563,-0.774334 -0.0387,-0.156601 -0.0925,-0.382708 -0.11966,-0.502463 -0.0832,-0.367309 -0.17913,-0.660179 -0.22992,-0.702327 -0.0702,-0.05824 -0.18202,-0.01026 -0.20686,0.08872 -0.0284,0.112965 0.0477,0.862108 0.10473,1.032328 0.0247,0.0737 0.0544,0.217602 0.0661,0.319795 0.0117,0.102198 0.0543,0.251745 0.0949,0.332335 0.0591,0.11747 0.10038,0.154653 0.2078,0.187525 0.17325,0.05301 0.17699,0.05336 0.19858,0.01843 z m -0.78498,-0.229999 c -4e-4,-0.204745 -0.0718,-0.504786 -0.20431,-0.858239 -0.14155,-0.377783 -0.1821,-0.456537 -0.23506,-0.456537 -0.037,0 -0.0357,0.275093 0.002,0.452215 0.0157,0.07369 0.0449,0.213061 0.0646,0.309704 0.0198,0.09664 0.0741,0.247262 0.12062,0.33471 0.0465,0.08744 0.0846,0.17494 0.0846,0.19443 0,0.04907 0.0714,0.115834 0.12394,0.115834 0.0252,0 0.0435,-0.03876 0.0433,-0.09212 z m -7.33203,-0.28481 c 0.32532,-0.315199 0.68314,-0.716936 0.71558,-0.803406 0.0359,-0.09562 0.25968,-0.384393 0.52378,-0.675859 0.1982,-0.218736 0.39257,-0.509036 0.54525,-0.814394 0.15095,-0.301869 0.15482,-0.383735 0.0205,-0.434425 -0.0552,-0.02085 -0.10068,-0.05809 -0.10089,-0.08271 -6.6e-4,-0.07258 -0.32176,-0.370433 -0.38564,-0.357696 -0.0323,0.0065 -0.0813,0.07616 -0.11203,0.159407 -0.0642,0.173782 -0.16124,0.237436 -0.12581,0.0825 0.0122,-0.05307 0.0436,-0.209544 0.0699,-0.347718 0.0264,-0.138179 0.0707,-0.315561 0.0986,-0.394186 0.0523,-0.146845 0.042,-0.243083 -0.0256,-0.241203 -0.0524,0.0017 -0.15552,0.08272 -0.15552,0.122559 0,0.01788 -0.098,0.144341 -0.21784,0.281036 -0.11981,0.136698 -0.22419,0.27869 -0.23196,0.315536 -0.008,0.03686 -0.0367,0.172509 -0.0643,0.301476 -0.0939,0.438872 -0.0973,0.48459 -0.0371,0.507657 0.0531,0.02041 0.39634,-0.05427 0.86053,-0.187252 0.12405,-0.03553 0.23289,-0.05271 0.24188,-0.03818 0.0211,0.03397 -0.0183,0.158838 -0.14852,0.47067 -0.15197,0.364152 -0.17283,0.38122 -0.43614,0.35683 -0.11975,-0.01111 -0.3073,-0.04355 -0.41677,-0.07212 -0.10948,-0.02855 -0.24138,-0.04265 -0.2931,-0.03128 l -0.0941,0.02066 v -0.234962 c 0,-0.129232 0.0129,-0.269863 0.0286,-0.312513 0.11553,-0.313382 0.0501,-0.344803 -0.17905,-0.08592 -0.24196,0.273388 -0.27749,0.364738 -0.29044,0.746581 l -0.0113,0.33371 0.17229,0.01 c 0.0972,0.0057 0.28937,-0.01989 0.44106,-0.05862 0.31969,-0.08163 0.34134,-0.08292 0.34134,-0.02044 0,0.101568 -0.17843,0.607035 -0.22835,0.646897 -0.0614,0.04902 -0.4331,0.05618 -0.55287,0.01067 -0.0451,-0.01717 -0.11826,-0.06736 -0.16243,-0.111526 -0.0442,-0.04417 -0.10525,-0.09426 -0.13574,-0.111326 -0.0355,-0.01985 -0.0678,-0.107908 -0.0898,-0.244631 -0.0396,-0.24613 -0.0427,-0.251455 -0.13156,-0.22327 -0.0933,0.02959 -0.11186,0.09393 -0.12623,0.437246 -0.007,0.165814 -0.0152,0.324091 -0.0183,0.351725 -0.0156,0.138283 0.005,0.16749 0.11757,0.16749 0.10981,0 0.41457,-0.04958 0.53216,-0.08657 0.0456,-0.01436 0.0586,0.0012 0.0586,0.06922 0,0.08196 -0.0824,0.281285 -0.1319,0.318821 -0.0368,0.02795 -0.20308,0.327647 -0.20308,0.366061 0,0.01973 0.0431,0.03589 0.0958,0.03589 0.0674,0 0.1395,-0.0423 0.24286,-0.142445 z m 9.51281,-0.08603 c 0.049,-0.05581 0.58618,-1.598864 0.62302,-1.789745 0.0149,-0.07709 0.007,-0.09212 -0.0531,-0.09212 -0.039,0 -0.12717,0.03016 -0.19591,0.067 -0.0687,0.03686 -0.14354,0.067 -0.16619,0.067 -0.064,0 -0.10034,0.09541 -0.14251,0.374339 -0.0214,0.141402 -0.0908,0.382014 -0.15418,0.534698 -0.0634,0.152679 -0.10694,0.304043 -0.0967,0.336369 0.0103,0.03233 6.5e-4,0.149114 -0.0209,0.259533 -0.05,0.254079 -0.0287,0.31882 0.0946,0.288359 0.0504,-0.01247 0.1008,-0.03292 0.1118,-0.04543 z m -0.85223,-0.441895 c 0.0215,-0.119523 0.0486,-0.397655 0.0603,-0.618068 0.0117,-0.220421 0.0358,-0.46601 0.0537,-0.545758 0.0178,-0.07975 0.0394,-0.411923 0.0478,-0.738159 0.009,-0.343331 0.0366,-0.691912 0.0659,-0.827636 0.0615,-0.284556 0.10227,-0.728358 0.0738,-0.802476 -0.0189,-0.04928 -0.0297,-0.04944 -0.12183,-0.0017 -0.0556,0.02876 -0.1011,0.0726 -0.1011,0.09744 0,0.02482 -0.0831,0.138362 -0.18481,0.252273 l -0.1848,0.207119 0.0217,0.492181 c 0.0119,0.270702 0.0186,0.647606 0.015,0.837573 -0.004,0.214802 0.007,0.362425 0.0306,0.390437 0.0205,0.02478 0.0363,0.13314 0.0351,0.240812 -0.002,0.107672 0.003,0.346508 0.008,0.530744 0.0237,0.757276 0.02,0.726039 0.0833,0.713856 0.0432,-0.0083 0.0686,-0.0679 0.0975,-0.228565 z m -4.63347,-0.09906 c -0.007,-0.133321 -0.0579,-0.178825 -0.40617,-0.359785 -0.13436,-0.06982 -0.31312,-0.18347 -0.39724,-0.252559 -0.23403,-0.192212 -0.30319,-0.166226 -0.18186,0.06833 0.10386,0.200779 0.36532,0.428811 0.63916,0.557437 0.30358,0.142597 0.35371,0.140652 0.34611,-0.01343 z m -7.96046,-0.160121 c 0.0292,-0.06909 0.0662,-0.223597 0.082,-0.343348 0.0158,-0.119755 0.0382,-0.287677 0.0496,-0.373156 0.016,-0.119996 -0.003,-0.235479 -0.0838,-0.506606 -0.0995,-0.334753 -0.1044,-0.378606 -0.1044,-0.937517 0,-0.478249 -0.009,-0.593961 -0.0498,-0.627708 -0.0404,-0.03353 -0.0531,-0.03116 -0.067,0.01264 -0.009,0.02972 -0.026,0.0804 -0.0367,0.112641 -0.0108,0.03225 -0.0253,0.254579 -0.0324,0.494084 -0.007,0.239506 -0.023,0.574569 -0.0356,0.74458 -0.0134,0.181678 -0.007,0.43025 0.0152,0.602953 0.0211,0.161613 0.0544,0.42873 0.0741,0.593596 0.0197,0.164862 0.0434,0.311835 0.0525,0.326601 0.0356,0.05755 0.0853,0.0215 0.13621,-0.09877 z m -1.79895,-0.131252 c 6.6e-4,-0.115128 -0.0352,-0.178602 -0.10131,-0.178602 -0.0776,0 -0.11037,0.100152 -0.0687,0.209797 0.0578,0.15213 0.16884,0.131762 0.16999,-0.0312 z m 9.93815,-0.203722 c 0.013,-0.05067 0.0246,-0.159951 0.0257,-0.242859 l 0.002,-0.150738 -0.21774,0.0093 c -0.28283,0.01203 -0.34872,-0.0063 -0.39597,-0.109938 -0.0214,-0.04704 -0.0661,-0.09639 -0.0994,-0.109668 -0.0705,-0.02819 -0.31277,-0.179023 -0.53657,-0.3341 -0.0865,-0.05993 -0.23525,-0.14783 -0.33058,-0.195328 -0.19139,-0.09537 -0.24291,-0.165492 -0.14113,-0.192109 0.0981,-0.02566 0.21087,0.01343 0.85041,0.294443 0.14401,0.06329 0.30655,0.09294 0.38059,0.06944 0.0533,-0.01692 0.0677,-0.0659 0.0869,-0.296884 0.0293,-0.352612 0.005,-0.458275 -0.10487,-0.458275 -0.15149,0 -0.2119,0.05763 -0.2119,0.202162 0,0.116154 -0.009,0.132491 -0.0754,0.130262 -0.1466,-0.005 -0.28892,-0.0834 -0.49081,-0.270529 -0.20101,-0.186326 -0.36596,-0.27699 -0.42632,-0.234337 -0.0169,0.01195 -0.0587,0.06692 -0.0929,0.122193 -0.0343,0.05528 -0.0994,0.140568 -0.14493,0.18955 -0.12326,0.132672 -0.0903,0.246716 0.19196,0.664635 0.0311,0.04607 0.0833,0.136505 0.11601,0.200986 0.0859,0.169435 0.21027,0.259369 0.4199,0.303614 0.1906,0.04023 0.5746,0.22326 0.83744,0.399159 0.19627,0.131348 0.32511,0.134613 0.35737,0.0091 z m -10.15663,-0.319981 c 0.0278,-0.04241 0.0602,-0.12532 0.072,-0.184235 0.0192,-0.09618 0.0134,-0.107114 -0.0573,-0.107114 -0.0485,0 -0.12083,0.04734 -0.18843,0.123328 -0.12624,0.141903 -0.13123,0.162287 -0.0511,0.208963 0.0949,0.05527 0.17087,0.04143 0.22484,-0.04094 z m 5.37957,-0.452848 c 0.20815,-0.327478 0.52432,-0.737737 0.70305,-0.912272 0.0859,-0.08393 0.23087,-0.264811 0.32207,-0.40197 0.0912,-0.13716 0.28248,-0.398172 0.42506,-0.58003 0.14258,-0.181853 0.32122,-0.423036 0.39699,-0.535957 0.0757,-0.11292 0.21724,-0.296872 0.31439,-0.408779 0.0971,-0.111907 0.23779,-0.295561 0.31255,-0.408121 0.0748,-0.112565 0.15119,-0.214084 0.16983,-0.225603 0.0187,-0.01151 0.0339,-0.06873 0.0339,-0.127125 0,-0.143214 -0.15818,-0.549075 -0.2238,-0.574259 -0.0615,-0.02358 -0.14467,0.03553 -0.14467,0.102795 0,0.06285 -0.18744,0.395562 -0.32766,0.581598 -0.0625,0.0829 -0.13562,0.203494 -0.16249,0.267979 -0.0834,0.200068 -0.50176,0.886915 -0.74476,1.222656 -0.0533,0.0737 -0.12117,0.181814 -0.15075,0.240263 -0.0296,0.05845 -0.11428,0.176192 -0.18824,0.261646 -0.0739,0.08545 -0.13447,0.167361 -0.13447,0.182019 0,0.04899 -0.33277,0.605675 -0.47337,0.791904 -0.23175,0.306955 -0.41602,0.655343 -0.38683,0.73139 0.0337,0.08793 0.1099,0.02679 0.25921,-0.208134 z m 8.60688,-0.523552 c 0,-0.395201 -0.0165,-0.795555 -0.0367,-0.889672 -0.0336,-0.156424 -0.0496,-0.177358 -0.18599,-0.243656 -0.10502,-0.05102 -0.15622,-0.06129 -0.17269,-0.03465 -0.0366,0.05921 -0.0196,1.058146 0.0202,1.18595 0.0196,0.0629 0.0459,0.197276 0.0586,0.298608 0.0354,0.283652 0.1057,0.392455 0.258,0.399323 0.0541,0.0024 0.0586,-0.05289 0.0586,-0.715901 z m -10.21846,0.479268 c 0.0428,-0.05793 0.119,-0.219967 0.16927,-0.360095 0.0503,-0.14013 0.13008,-0.352763 0.17734,-0.472514 0.21449,-0.543449 0.28883,-0.920578 0.19914,-1.010268 -0.0318,-0.03188 -0.0589,-0.02358 -0.1249,0.03846 -0.10708,0.100593 -0.15072,0.25873 -0.15095,0.547069 -1.7e-4,0.216382 -0.007,0.236766 -0.13094,0.385219 -0.14865,0.178213 -0.23006,0.392542 -0.26922,0.708816 -0.0376,0.303432 -0.004,0.345228 0.13026,0.163302 z m 9.44671,0.032 c 0.0402,-0.04318 0.0683,-0.118905 0.0683,-0.184236 0,-0.09028 -0.0131,-0.110924 -0.0702,-0.110924 -0.1209,0 -0.26479,0.127141 -0.26479,0.233971 0,0.147181 0.15372,0.182447 0.26668,0.06119 z m -13.79963,-0.01047 c 0.023,-0.02763 0.0487,-0.114316 0.0572,-0.192609 0.0154,-0.141326 0.0134,-0.144402 -0.28047,-0.42995 -0.16279,-0.15818 -0.32975,-0.305598 -0.371,-0.327594 -0.0412,-0.02198 -0.0985,-0.08537 -0.12718,-0.140849 l -0.0522,-0.100859 0.16068,0.02069 0.16067,0.02073 0.0957,-0.199037 c 0.10772,-0.223966 0.10137,-0.256008 -0.0849,-0.428414 -0.33027,-0.305679 -0.47223,-0.416174 -0.53469,-0.416174 -0.0624,0 -0.0674,0.01428 -0.0494,0.142365 0.011,0.0783 0.0326,0.262953 0.0481,0.410343 0.0155,0.14739 0.0444,0.320738 0.0643,0.385223 0.0199,0.06449 0.0506,0.169999 0.0683,0.234481 0.1073,0.391899 0.23104,0.748669 0.27489,0.792623 0.10363,0.103873 0.38808,0.276964 0.45703,0.278111 0.0392,7.85e-4 0.09,-0.02141 0.11298,-0.04908 z m 12.91799,-0.06723 c 0.0243,-0.06329 -0.0415,-0.16583 -0.31663,-0.49383 -0.24666,-0.294029 -0.3413,-0.332611 -0.3413,-0.139148 0,0.06625 0.0235,0.201264 0.0522,0.300016 0.0414,0.142634 0.0807,0.200523 0.19082,0.28151 0.15555,0.114388 0.38007,0.142228 0.4149,0.05145 z m -9.29862,-0.03409 c 0.0544,-0.02812 0.0988,-0.06579 0.0988,-0.08375 0,-0.01797 0.021,-0.03265 0.0465,-0.03265 0.0256,0 0.0811,-0.02804 0.12346,-0.06229 l 0.0769,-0.06229 -0.0884,-0.08844 c -0.061,-0.06097 -0.1239,-0.08845 -0.20255,-0.08845 -0.0628,0 -0.18174,-0.0093 -0.26443,-0.02061 -0.18866,-0.02587 -0.22857,0.04019 -0.12765,0.211237 0.0372,0.06308 0.0677,0.133414 0.0677,0.156308 0,0.05504 0.069,0.122029 0.12561,0.122029 0.0249,0 0.0897,-0.02299 0.14403,-0.05111 z m 1.32731,-0.04101 c 0.0651,-0.08172 0.4129,-0.806462 0.4129,-0.860412 0,-0.06809 -0.0883,-0.125734 -0.17402,-0.113587 -0.063,0.0089 -0.0914,0.05413 -0.1545,0.245429 -0.20558,0.623694 -0.24041,0.92442 -0.0844,0.72857 z m 8.38191,-0.629412 c 0.097,-0.14925 0.18827,-0.341643 0.2231,-0.470325 0.0745,-0.275437 0.0521,-0.305711 -0.1845,-0.248945 -0.13373,0.03208 -0.18215,0.06227 -0.22131,0.137977 -0.0379,0.07327 -0.0739,0.09692 -0.14777,0.09692 -0.0537,0 -0.10718,-0.0154 -0.11881,-0.03425 -0.0117,-0.01885 -0.1048,-0.09602 -0.20701,-0.171532 -0.10221,-0.07551 -0.27609,-0.22753 -0.38637,-0.33782 -0.16889,-0.168881 -0.20771,-0.193356 -0.246,-0.155061 -0.0383,0.0383 -0.0383,0.07995 2.8e-4,0.263932 0.10158,0.485575 0.0956,0.475152 0.42391,0.741242 0.27302,0.221295 0.59996,0.430423 0.67289,0.430423 0.0151,0 0.10134,-0.113655 0.19162,-0.252567 z m 3.28187,0.17103 c 0.0947,-0.04899 0.1919,-0.145096 0.16815,-0.16631 -0.007,-0.0065 -0.0999,-0.02226 -0.20588,-0.03513 -0.21322,-0.02587 -0.25258,0.0049 -0.21221,0.165792 0.0243,0.09676 0.1085,0.108767 0.24994,0.03561 z m -16.35585,-0.04459 c 0.0583,-0.03887 0.18084,-0.400009 0.18084,-0.532713 0,-0.120044 -3.2e-4,-0.120312 -0.12365,-0.100301 -0.15671,0.02542 -0.48184,0.188315 -0.52704,0.264032 -0.0274,0.04592 -0.0108,0.08238 0.082,0.179808 0.064,0.06722 0.16165,0.142454 0.21692,0.167196 0.11886,0.05322 0.12322,0.05377 0.17089,0.02198 z m 15.71886,-0.01881 c 0.0485,-0.05854 -0.063,-0.899327 -0.12196,-0.918981 -0.0769,-0.02563 -0.1144,0.160639 -0.0763,0.379299 0.0196,0.11242 0.0356,0.260688 0.0356,0.329476 0,0.129151 0.0481,0.25466 0.0976,0.25466 0.0155,0 0.0449,-0.02001 0.0651,-0.04445 z m -12.57349,-0.183505 0.16748,-0.09241 -0.009,-0.194157 c -0.009,-0.180531 -0.0939,-0.560869 -0.17307,-0.769214 -0.0343,-0.09046 -0.11415,-0.118997 -0.15371,-0.055 -0.0586,0.09491 -0.15089,0.511193 -0.17033,0.768849 -0.0338,0.448709 0.0293,0.512529 0.33854,0.341924 z m 6.27449,-0.403398 c 0.0134,-0.186975 -0.0793,-0.481898 -0.18186,-0.578217 -0.0439,-0.04125 -0.0798,-0.09467 -0.0798,-0.118696 0,-0.06043 0.13971,7.86e-4 0.33209,0.145236 0.0986,0.07407 0.18513,0.111116 0.25962,0.111116 0.0615,0 0.11174,-0.0066 0.11174,-0.0146 0,-0.04127 -0.66375,-0.683514 -0.72641,-0.702868 -0.0685,-0.02118 -0.20348,-0.228233 -0.45508,-0.698341 -0.11292,-0.210984 -0.18467,-0.2609 -0.24667,-0.171619 -0.14799,0.213077 -0.32532,0.451448 -0.39833,0.535439 -0.0465,0.05353 -0.0904,0.127471 -0.0976,0.164317 -0.007,0.03686 -0.0302,0.157439 -0.0512,0.267978 -0.021,0.110543 -0.0684,0.302755 -0.10536,0.427143 -0.037,0.124386 -0.0578,0.241209 -0.0464,0.259605 0.0296,0.04775 0.23671,0.04143 0.27602,-0.0084 0.0313,-0.03966 0.0579,-0.146832 0.19365,-0.778815 0.0743,-0.345661 0.0957,-0.386298 0.14998,-0.284762 0.0291,0.05428 0.0378,0.209762 0.0291,0.516195 l -0.0123,0.438515 h 0.18424 0.18423 l 0.0478,-0.159111 c 0.0503,-0.167369 0.12277,-0.206084 0.20359,-0.108694 0.065,0.07821 0.0454,0.340816 -0.0349,0.470809 -0.0804,0.130089 -0.0661,0.220721 0.0438,0.277981 0.0411,0.02141 0.11994,0.06813 0.17522,0.103797 0.16223,0.104712 0.23261,0.07771 0.24494,-0.09397 z m -5.5701,-0.03055 c 0.1622,-0.08278 0.23191,-0.156866 0.29925,-0.318031 0.0885,-0.211911 0.0731,-0.25099 -0.10426,-0.265103 -0.0857,-0.0068 -0.21005,0.0069 -0.27636,0.03039 -0.0677,0.02402 -0.17562,0.03405 -0.2461,0.02282 -0.17272,-0.02747 -0.18312,0.02258 -0.0761,0.365941 0.0873,0.28019 0.0898,0.283695 0.17954,0.25795 0.0501,-0.01436 0.15088,-0.05666 0.22404,-0.094 z m 12.33542,0.0068 c 0.0508,-0.03557 0.0743,-0.08611 0.0738,-0.159111 -8.7e-4,-0.255815 -0.1972,-1.172351 -0.26493,-1.240073 -0.0474,-0.04742 -0.10295,0.0066 -0.10295,0.100201 0,0.102134 -0.0833,0.44121 -0.15728,0.639791 -0.0525,0.141189 -0.0519,0.145666 0.057,0.385223 0.0606,0.133305 0.12487,0.261212 0.14281,0.284244 0.0447,0.05734 0.16175,0.05257 0.25147,-0.01026 z m -10.88915,-0.484324 c 0.004,-0.175313 -0.005,-0.337865 -0.0195,-0.361233 -0.0509,-0.0823 -0.13277,-0.0012 -0.17343,0.171683 -0.0224,0.09533 -0.063,0.229825 -0.0901,0.298874 -0.0711,0.180996 -0.04,0.232284 0.13344,0.219743 l 0.14267,-0.01031 z m 11.55157,0.173232 c 0.29726,-0.143792 0.35028,-0.191963 0.35999,-0.327118 0.006,-0.08412 -0.007,-0.09565 -0.12728,-0.117388 -0.0737,-0.01327 -0.17642,-0.04043 -0.22829,-0.06038 -0.11061,-0.04257 -0.25657,-0.04644 -0.31649,-0.0083 -0.0415,0.02631 -0.0836,0.588728 -0.0469,0.625426 0.0339,0.03393 0.0991,0.01356 0.35895,-0.112139 z m -11.00844,-0.0093 c 0.0889,-0.031 0.12813,-0.08113 0.22468,-0.287347 0.0644,-0.137385 0.11219,-0.274519 0.10637,-0.304745 -0.007,-0.03377 -0.0751,-0.07305 -0.17782,-0.101922 -0.092,-0.02583 -0.20725,-0.07529 -0.25614,-0.109913 -0.0489,-0.0346 -0.10543,-0.06295 -0.12562,-0.06295 -0.0404,0 -0.0541,0.842371 -0.0144,0.8821 0.0328,0.0328 0.12091,0.02731 0.2429,-0.01524 z m 6.89823,-0.266145 c 0.058,-0.09334 0.1055,-0.178216 0.1055,-0.188611 0,-0.01038 0.0515,-0.0905 0.1143,-0.178012 0.21585,-0.30045 0.27089,-0.471957 0.18047,-0.562381 -0.1,-0.09996 -0.27942,0.01 -0.44026,0.269655 -0.0314,0.05067 -0.0817,0.09212 -0.11195,0.09212 -0.16943,0 -0.52262,-0.340391 -0.84482,-0.814209 -0.15371,-0.226047 -0.2241,-0.205514 -0.21137,0.06166 0.0115,0.24178 0.0991,0.667815 0.16335,0.794607 0.0257,0.05077 0.10709,0.130383 0.18082,0.17693 0.0737,0.04654 0.2403,0.182126 0.37016,0.301291 0.29468,0.270433 0.35151,0.275835 0.4938,0.04696 z m -13.01438,-0.16526 c 0.0366,-0.06449 0.11751,-0.236539 0.17969,-0.382348 0.13604,-0.319002 0.11515,-0.374335 -0.0998,-0.264185 -0.0778,0.03982 -0.20546,0.08235 -0.28387,0.09448 -0.11408,0.01765 -0.16595,0.05058 -0.25961,0.164886 -0.17554,0.214237 -0.16005,0.294234 0.0843,0.435203 0.19657,0.113399 0.29454,0.100987 0.37924,-0.04803 z m 6.96414,-0.09212 c 0.0623,-0.105935 0.13458,-0.237829 0.16078,-0.293102 0.0262,-0.05528 0.0803,-0.154123 0.12012,-0.219675 0.0398,-0.06555 0.15207,-0.269046 0.24934,-0.452215 0.24776,-0.466599 0.25274,-0.475397 0.40542,-0.718255 0.0753,-0.119752 0.17495,-0.285564 0.22145,-0.368472 0.0464,-0.0829 0.11245,-0.186686 0.14652,-0.230623 0.0341,-0.04394 0.0624,-0.104235 0.0627,-0.133991 0.002,-0.11524 -0.15214,-0.60633 -0.19493,-0.622746 -0.096,-0.03686 -0.16926,0.04811 -0.20838,0.241937 -0.0213,0.105992 -0.0999,0.335917 -0.17449,0.510942 -0.0746,0.175024 -0.14728,0.363447 -0.16155,0.418716 -0.0517,0.200093 -0.21929,0.649112 -0.38853,1.040678 -0.0802,0.185476 -0.14576,0.350318 -0.14576,0.366311 0,0.016 -0.0329,0.06409 -0.073,0.106873 -0.121,0.128806 -0.249,0.546235 -0.16749,0.546235 0.0191,0 0.0857,-0.08668 0.14788,-0.192613 z m 3.55085,-0.05861 c 0.0409,-0.114324 0.11291,-0.216178 0.22696,-0.320885 0.13443,-0.123421 0.16709,-0.174588 0.16709,-0.261811 0,-0.1434 -0.0539,-0.237994 -0.13564,-0.237994 -0.0759,0 -0.43541,0.278754 -0.48081,0.372819 -0.0166,0.03445 -0.05,0.06265 -0.0742,0.06265 -0.0702,0 -0.48175,-0.236879 -0.48175,-0.27727 0,-0.05925 -0.14067,-0.191695 -0.20359,-0.191695 -0.0451,0 -0.0604,0.03513 -0.0695,0.159115 -0.007,0.08751 -0.007,0.193184 -6.5e-4,0.234822 0.0118,0.08337 0.22435,0.261718 0.5922,0.497013 0.30544,0.19538 0.37926,0.189482 0.46013,-0.03678 z m 3.94239,0.152018 c 0.0331,-0.01772 0.078,-0.07524 0.0998,-0.127832 0.0559,-0.134998 4e-4,-0.257527 -0.15468,-0.341186 -0.0698,-0.0377 -0.16723,-0.100658 -0.21647,-0.139946 -0.1313,-0.104804 -0.20948,-0.06319 -0.18295,0.0974 0.0464,0.281417 0.0903,0.375282 0.21477,0.459863 0.13813,0.09387 0.15423,0.09734 0.23953,0.0517 z m 3.58071,-0.01091 c 0.0533,-0.06422 0.46711,-1.355532 0.49326,-1.539238 0.0184,-0.129364 0.0125,-0.162589 -0.0318,-0.179608 -0.076,-0.02916 -0.15406,0.04552 -0.15406,0.147449 0,0.0834 -0.011,0.124912 -0.13461,0.509112 -0.15415,0.478975 -0.29299,1.013882 -0.27605,1.063545 0.0183,0.05379 0.058,0.05331 0.10328,-0.0012 z m -14.12613,-0.132732 c 0.25794,-0.211173 0.25976,-0.217577 0.13838,-0.48274 -0.0576,-0.125995 -0.12335,-0.303626 -0.14593,-0.394736 -0.15484,-0.62437 -0.28902,-0.640372 -0.41117,-0.04903 -0.0955,0.462157 -0.10191,0.611724 -0.0348,0.806651 0.0337,0.09816 0.0753,0.197317 0.0922,0.220348 0.0573,0.07828 0.18703,0.04222 0.36135,-0.100493 z m -1.92586,-0.01391 c 0.0646,-0.02984 0.16066,-0.133887 0.25122,-0.272162 0.22467,-0.34301 0.26094,-0.416876 0.26245,-0.534625 0.002,-0.154086 -0.1004,-0.144727 -0.2218,0.02029 -0.18246,0.247979 -0.49633,0.440316 -0.71855,0.440316 -0.14297,0 -0.15164,0.07639 -0.0282,0.248284 0.143,0.199123 0.20625,0.212738 0.45486,0.09791 z M 152.90475,71.7273 c 0.0543,-0.03887 0.15628,-0.404712 0.1264,-0.453542 -0.0719,-0.11744 -0.58466,-0.567513 -0.6136,-0.538567 -0.032,0.032 -0.0146,0.165071 0.0806,0.615773 0.0628,0.29765 0.0759,0.32144 0.19828,0.360765 0.13579,0.04365 0.16592,0.0459 0.20832,0.01556 z m 17.69192,-0.146972 c 0.0634,-0.05256 0.0548,-0.125678 -0.0346,-0.296624 -0.10981,-0.209865 -0.24601,-0.620919 -0.27185,-0.820421 -0.012,-0.09212 -0.0294,-0.193866 -0.0388,-0.226108 -0.0526,-0.180421 -0.24395,0.09648 -0.28352,0.410344 -0.0128,0.101331 -0.0505,0.25415 -0.0839,0.339602 l -0.0607,0.155361 0.10705,0.121921 c 0.0589,0.06706 0.13857,0.183723 0.1771,0.259256 l 0.0701,0.137336 0.18754,-0.02206 c 0.10315,-0.01211 0.20738,-0.0385 0.23162,-0.05862 z m -12.32763,-0.21543 c 0.15571,-0.127278 0.24395,-0.22758 0.27604,-0.313765 0.0719,-0.193162 0.0389,-0.235339 -0.18848,-0.240447 -0.10651,-0.0024 -0.29721,-0.0065 -0.42377,-0.009 -0.14904,-0.0032 -0.23544,0.0091 -0.2452,0.0346 -0.009,0.02161 0.0176,0.103421 0.0576,0.181802 0.04,0.07838 0.0954,0.219278 0.12323,0.313098 0.0461,0.155591 0.089,0.218937 0.14932,0.220321 0.0123,2.84e-4 0.12534,-0.08368 0.25123,-0.18657 z m 10.25753,0.122145 c 0.0324,-0.01729 0.0797,-0.0952 0.1055,-0.173108 l 0.0467,-0.141663 -0.13282,-0.103249 c -0.23004,-0.178798 -0.55547,-0.536373 -0.69343,-0.761911 -0.0648,-0.105879 -0.18086,-0.126713 -0.20288,-0.03641 -0.008,0.03225 -0.0173,0.145858 -0.0211,0.252482 -0.006,0.176781 0.007,0.217537 0.15203,0.462661 0.15665,0.265288 0.31022,0.432147 0.39773,0.432147 0.0247,0 0.059,-0.04146 0.0762,-0.09212 l 0.0313,-0.09211 0.026,0.117239 c 0.0353,0.159165 0.0977,0.19869 0.21471,0.136046 z m 2.59888,-0.119988 c 0.3048,-0.156088 0.30805,-0.15944 0.36761,-0.378963 0.0283,-0.104391 0.0658,-0.232356 0.0833,-0.284365 0.0571,-0.169822 0.0214,-0.195468 -0.26176,-0.187933 -0.34985,0.0093 -0.59671,0.05698 -0.62085,0.119896 -0.0205,0.05349 0.0353,0.467469 0.0708,0.524864 0.011,0.01792 0.0189,0.07898 0.0172,0.135663 -0.003,0.0975 0.0411,0.188768 0.0908,0.188768 0.0124,0 0.12625,-0.05307 0.25291,-0.11793 z m -15.96121,-0.132203 c 0.10441,-0.168957 0.0871,-0.301612 -0.0712,-0.544518 -0.14272,-0.219062 -0.24659,-0.310115 -0.27082,-0.237417 -0.007,0.02161 0.007,0.168471 0.03,0.326332 0.0237,0.157861 0.0435,0.334935 0.0439,0.393492 6.5e-4,0.120352 0.0789,0.218223 0.15175,0.19026 0.0267,-0.01026 0.0791,-0.06793 0.11627,-0.128149 z m 4.70665,0.102154 c 0.18082,-0.06293 0.20701,-0.114076 0.15901,-0.3105 -0.0217,-0.08867 -0.0436,-0.270304 -0.0488,-0.403626 -0.009,-0.224932 -0.0142,-0.240929 -0.0764,-0.221948 -0.0369,0.01127 -0.0692,0.02234 -0.0721,0.02466 -0.003,0.0024 -0.0428,0.109729 -0.0889,0.238695 -0.0462,0.128966 -0.11632,0.323144 -0.15595,0.431505 -0.0397,0.108362 -0.0642,0.217646 -0.0544,0.242854 0.0224,0.05853 0.16661,0.05782 0.3375,-0.0017 z m 0.58663,-0.220493 c 0.10772,-0.10772 0.091,-0.33888 -0.0391,-0.539655 -0.19453,-0.300221 -0.31694,-0.187852 -0.2852,0.261827 0.0108,0.153501 0.0288,0.293885 0.04,0.311959 0.0353,0.05711 0.21462,0.03561 0.28434,-0.03413 z m 5.82826,0.03365 c 0.0749,-0.04006 0.25442,-0.408883 0.30621,-0.629068 0.0205,-0.08705 0.0591,-0.221988 0.0858,-0.299852 0.0268,-0.07786 0.0391,-0.157002 0.0274,-0.175858 -0.0366,-0.05935 -0.19627,-0.03541 -0.33546,0.05033 -0.21133,0.130164 -0.29482,0.112316 -0.64072,-0.136967 -0.0392,-0.02823 -0.15978,-0.155859 -0.26798,-0.283583 -0.28704,-0.338852 -0.32639,-0.317072 -0.27484,0.152099 0.0396,0.359669 0.0899,0.461601 0.33259,0.673428 0.1031,0.08998 0.28948,0.280426 0.41417,0.423212 0.12469,0.142782 0.24105,0.259605 0.25859,0.259605 0.0176,0 0.0599,-0.01499 0.0941,-0.03333 z m -13.07129,-0.142525 c 0.0502,-0.06159 0.18433,-0.53821 0.22156,-0.787188 0.0258,-0.172815 -0.016,-0.184413 -0.16214,-0.04496 -0.12865,0.122747 -0.3341,0.237569 -0.42506,0.237569 -0.0631,0 -0.0671,-0.01195 -0.0424,-0.125614 0.0521,-0.239843 0.0334,-0.350995 -0.0718,-0.425571 -0.053,-0.0377 -0.17577,-0.141898 -0.27259,-0.231584 -0.30112,-0.278927 -0.33014,-0.200563 -0.18601,0.502474 l 0.0627,0.305917 0.21199,0.196547 c 0.11661,0.108101 0.25128,0.231581 0.29927,0.274399 0.15068,0.134424 0.30166,0.175032 0.36441,0.09801 z m 10.45139,-0.485712 c 0.16314,-0.517914 0.23214,-0.868945 0.18089,-0.920197 -0.11587,-0.115865 -0.44148,0.236189 -0.44148,0.47733 0,0.147755 -0.0224,0.174845 -0.10686,0.129609 -0.10467,-0.05602 -0.25924,-0.002 -0.33091,0.115472 -0.10063,0.165023 -0.0843,0.266956 0.0608,0.378048 0.26562,0.20355 0.32964,0.241186 0.41496,0.243961 0.0841,0.0028 0.0944,-0.017 0.22268,-0.424223 z m -8.17556,0.167489 c 0.012,-0.03225 0.096,-0.189441 0.18668,-0.349335 0.17982,-0.317112 0.21061,-0.33041 0.3274,-0.14143 0.0388,0.06265 0.098,0.113916 0.13182,0.113916 0.0518,0 0.0649,-0.03773 0.0836,-0.242854 0.0297,-0.325795 0.0105,-0.63617 -0.0403,-0.65294 -0.0223,-0.0074 -0.14549,0.08188 -0.27365,0.198335 -0.35899,0.326264 -0.49533,0.421724 -0.63634,0.44555 -0.0777,0.01311 -0.16579,0.05949 -0.2195,0.11556 l -0.0897,0.09363 0.10571,0.18047 c 0.14658,0.250297 0.19535,0.297714 0.30621,0.297714 0.0611,0 0.10433,-0.02141 0.11818,-0.05862 z m 2.29797,-0.01256 c 0.12474,-0.06425 0.22391,-0.171894 0.22391,-0.243044 0,-0.03746 -0.0678,-0.237592 -0.15074,-0.444798 -0.0829,-0.207203 -0.15073,-0.398213 -0.15073,-0.42446 0,-0.0669 -0.0824,-0.127791 -0.14189,-0.104937 -0.0489,0.01877 -0.23447,0.547282 -0.27823,0.792389 -0.0205,0.114819 -0.0104,0.135652 0.1404,0.290958 0.16849,0.173477 0.23328,0.197755 0.35728,0.133892 z m 10.80418,-0.07645 c 0.18402,-0.116166 0.28586,-0.251641 0.35544,-0.472855 0.0805,-0.25594 0.0527,-0.300699 -0.18695,-0.300699 -0.20124,0 -0.30925,-0.06154 -0.48251,-0.27488 -0.0549,-0.06757 -0.14671,-0.176564 -0.2041,-0.242212 -0.0574,-0.06565 -0.14755,-0.20819 -0.20038,-0.316751 -0.0528,-0.108575 -0.14049,-0.244236 -0.1948,-0.301485 l -0.0987,-0.104084 -0.0242,0.08375 c -0.0767,0.266039 -0.0224,0.467269 0.24642,0.91146 0.20863,0.344884 0.41555,0.745378 0.46023,0.890798 0.021,0.06812 0.044,0.142694 0.0512,0.165721 0.0206,0.06573 0.13885,0.04927 0.27831,-0.03873 z m 2.28912,-0.358679 c 0.14595,-0.08819 0.22812,-0.159496 0.22812,-0.197975 0,-0.08319 -0.16636,-0.427207 -0.27629,-0.571324 -0.05,-0.06554 -0.13655,-0.219881 -0.19236,-0.342967 -0.11711,-0.258302 -0.20073,-0.294329 -0.2667,-0.114924 -0.022,0.05989 -0.0611,0.154087 -0.0869,0.20936 -0.13018,0.279005 -0.12287,0.4082 0.0368,0.650144 0.0437,0.06616 0.10281,0.186831 0.1314,0.268147 0.0576,0.163559 0.10792,0.237372 0.16206,0.237372 0.0197,0 0.13841,-0.06202 0.26388,-0.137833 z m -15.92135,-0.133927 c 0.02,-0.05734 0.0893,-0.177976 0.15401,-0.268059 0.17802,-0.247783 0.16515,-0.327318 -0.12123,-0.74943 -0.1603,-0.236255 -0.25949,-0.352122 -0.30148,-0.352122 -0.0766,0 -0.0783,0.04902 -0.0152,0.452219 0.0259,0.16581 0.0576,0.437138 0.0704,0.60295 0.0128,0.165813 0.0372,0.327856 0.0543,0.360099 0.0479,0.09014 0.11885,0.06977 0.15908,-0.04566 z m 3.65064,-0.135571 c 0.12211,-0.113495 0.24032,-0.237854 0.26269,-0.276353 0.0451,-0.07757 0.0573,-0.252587 0.0179,-0.257158 -0.0138,-0.0017 -0.15325,-0.0164 -0.30984,-0.03285 -0.15661,-0.01648 -0.35343,-0.03906 -0.43737,-0.05019 -0.27999,-0.03713 -0.27894,0.0083 0.016,0.697281 0.0812,0.189695 0.17836,0.172286 0.45058,-0.08074 z m 4.17227,0.120263 c 0.12622,-0.126223 0.10193,-0.250669 -0.0887,-0.45421 -0.12485,-0.133347 -0.22332,-0.178558 -0.24813,-0.11392 -0.011,0.02867 -0.004,0.07138 0.0155,0.09493 0.0195,0.02354 0.051,0.111818 0.0699,0.196158 0.0734,0.327294 0.13412,0.394274 0.25135,0.277041 z m -2.2155,-0.140022 c 0.25948,-0.17328 0.26808,-0.203622 0.15456,-0.544438 -0.0522,-0.156538 -0.0953,-0.356223 -0.096,-0.443733 -8.7e-4,-0.137409 -0.0105,-0.159115 -0.0695,-0.159115 -0.0517,0 -0.0964,0.05872 -0.18424,0.241912 -0.0637,0.133049 -0.11593,0.259455 -0.11593,0.280898 0,0.02146 -0.0225,0.08217 -0.0501,0.134934 -0.0506,0.09709 -0.0721,0.548882 -0.0281,0.592826 0.055,0.05504 0.21625,0.01227 0.38927,-0.10328 z m 11.08467,-0.238271 c 0.1703,-0.128677 0.29483,-0.286863 0.29483,-0.374535 0,-0.03039 -0.0512,-0.03606 -0.19261,-0.02133 -0.10615,0.01107 -0.24735,0.0036 -0.31455,-0.01624 -0.0808,-0.02406 -0.16555,-0.02574 -0.25122,-0.0049 -0.12417,0.03016 -0.12899,0.03649 -0.1214,0.159577 0.004,0.07049 0.0475,0.195612 0.0957,0.278052 0.0817,0.139445 0.0957,0.148629 0.19973,0.131737 0.0616,-0.01 0.1918,-0.07854 0.28947,-0.152333 z m -18.62603,-0.15529 c 0.0125,-0.0737 0.0155,-0.16414 0.007,-0.200987 -0.0184,-0.07481 -0.2597,-0.265531 -0.42384,-0.335053 -0.0589,-0.02487 -0.19226,-0.121758 -0.29655,-0.215218 -0.28431,-0.2548 -0.33888,-0.222091 -0.26523,0.158964 0.036,0.186364 0.14679,0.302662 0.52183,0.547876 0.35204,0.23017 0.42453,0.237208 0.45743,0.04442 z m 12.99217,-0.02514 c 0.0364,-0.05988 0.0664,-0.139017 0.0666,-0.175863 1.1e-4,-0.03686 0.068,-0.201986 0.15087,-0.366985 0.1578,-0.314222 0.18099,-0.432903 0.1049,-0.536967 -0.0403,-0.05525 -0.0577,-0.05761 -0.14801,-0.02023 -0.0563,0.0233 -0.17708,0.116409 -0.26854,0.20691 -0.14468,0.143169 -0.18411,0.164554 -0.30335,0.164554 -0.12107,0 -0.14344,-0.0127 -0.19181,-0.108868 -0.12189,-0.24237 -0.40332,-0.461817 -0.46476,-0.362406 -0.0329,0.05308 0.17902,0.752715 0.24179,0.79849 0.0321,0.02337 0.16378,0.130234 0.29275,0.237485 0.377,0.313531 0.42005,0.327109 0.51958,0.163871 z m -2.9659,-0.03781 c 0.10751,-0.107503 0.26205,-0.425783 0.33372,-0.687286 0.0754,-0.275209 0.0884,-0.730466 0.0221,-0.771803 -0.0708,-0.04412 -0.12184,-0.01158 -0.22398,0.142763 -0.13287,0.200785 -0.4037,0.478567 -0.5093,0.52237 -0.0961,0.03987 -0.20768,0.255828 -0.20768,0.402028 0,0.09449 0.35854,0.471625 0.44838,0.471625 0.0314,0 0.093,-0.03585 0.13682,-0.0797 z m -4.82119,-0.377907 c 0.0713,-0.09411 0.0591,-0.186987 -0.0705,-0.540404 -0.0657,-0.17883 -0.12507,-0.342991 -0.1321,-0.364821 -0.007,-0.02179 -0.0425,-0.05557 -0.0789,-0.07505 -0.0614,-0.03286 -0.0702,-0.01689 -0.1233,0.223917 -0.0315,0.142606 -0.0778,0.346729 -0.10302,0.453594 -0.0398,0.16911 -0.0392,0.210374 0.005,0.318228 0.0813,0.197267 0.13262,0.218226 0.30698,0.125404 0.0819,-0.0436 0.16989,-0.106977 0.19557,-0.140865 z m -2.67502,0.01865 c 0.0518,-0.0756 0.13573,-0.186868 0.1864,-0.247272 0.0507,-0.06041 0.0922,-0.122917 0.0923,-0.138908 1e-4,-0.01598 0.0364,-0.0743 0.0808,-0.129566 l 0.0806,-0.100497 0.0871,0.08163 c 0.0537,0.05027 0.0989,0.06957 0.11768,0.05027 0.0417,-0.04281 0.0575,-0.69419 0.0172,-0.706922 -0.0424,-0.01342 -0.0869,0.02042 -0.17177,0.13115 -0.10928,0.142469 -0.56504,0.454308 -0.7546,0.516304 -0.16156,0.05282 -0.1726,0.05262 -0.2143,-0.0046 -0.0366,-0.05015 -0.0353,-0.07683 0.008,-0.160823 0.0637,-0.123171 0.0491,-0.160384 -0.20541,-0.523588 -0.19504,-0.278352 -0.26292,-0.3313 -0.3413,-0.266242 -0.0375,0.03116 -0.0434,0.09785 -0.0273,0.310432 0.0232,0.306577 0.0783,0.588967 0.11483,0.588967 0.043,0 0.43446,0.40187 0.53806,0.552442 0.15823,0.229987 0.2579,0.241962 0.39161,0.04707 z m 15.65023,-0.01643 c 0.10134,-0.09111 0.17111,-0.182168 0.17111,-0.223301 0,-0.03823 -0.0654,-0.176232 -0.14535,-0.306747 -0.15161,-0.247496 -0.29011,-0.529336 -0.29011,-0.59031 0,-0.07891 -0.10589,-0.233179 -0.15998,-0.233081 -0.0431,7.3e-5 -0.0814,0.07424 -0.15101,0.2931 -0.0513,0.161149 -0.0927,0.320205 -0.0921,0.35345 0.003,0.167368 0.37169,0.860727 0.45755,0.860727 0.0213,0 0.11578,-0.06923 0.2099,-0.153838 z m -2.3746,-0.09605 c 0.13813,-0.100595 0.28505,-0.20682 0.3265,-0.236052 0.0536,-0.03771 0.0754,-0.08691 0.0754,-0.169653 0,-0.09616 -0.0161,-0.122714 -0.0921,-0.152025 -0.11978,-0.04614 -0.30588,-0.02042 -0.48735,0.06741 -0.0798,0.03868 -0.1751,0.07026 -0.21173,0.07026 -0.12907,0 -0.36665,-0.318354 -0.54998,-0.736947 -0.10885,-0.24853 -0.21139,-0.38133 -0.27742,-0.359316 -0.0738,0.02461 -0.11839,0.254964 -0.099,0.511864 0.018,0.238181 0.0282,0.265974 0.13993,0.380085 0.0663,0.06771 0.19585,0.211592 0.28798,0.319728 0.49064,0.575947 0.50736,0.581686 0.88778,0.304646 z m -7.6099,-0.455067 c 0.16904,-0.111363 0.30706,-0.21311 0.30668,-0.226104 -0.007,-0.236753 -0.10053,-0.584319 -0.25268,-0.936428 -0.0664,-0.153746 -0.1653,-0.146088 -0.21613,0.01676 -0.0216,0.06909 -0.0831,0.241951 -0.13658,0.384137 -0.0728,0.193284 -0.0973,0.315865 -0.097,0.485715 4e-4,0.257117 0.0306,0.478416 0.0651,0.478416 0.0128,0 0.16154,-0.09112 0.33059,-0.202486 z m 1.1276,0.04765 c 0.0695,-0.166288 0.066,-0.185466 -0.0582,-0.323267 -0.0914,-0.101368 -0.121,-0.115906 -0.18424,-0.0904 -0.0983,0.0396 -0.10172,0.218058 -0.008,0.402355 0.0883,0.172997 0.1808,0.177186 0.25011,0.01132 z m 9.4764,-0.08132 c 0.10319,-0.111468 0.19706,-0.240255 0.20859,-0.286213 0.0115,-0.04595 0.008,-0.244929 -0.008,-0.442166 -0.0261,-0.322005 -0.036,-0.359505 -0.0961,-0.367354 -0.0531,-0.0069 -0.0891,0.03849 -0.17292,0.217731 -0.0583,0.124645 -0.17502,0.296504 -0.2596,0.382227 -0.17128,0.173593 -0.17419,0.182496 -0.10364,0.317756 0.0275,0.05276 0.0501,0.136323 0.0503,0.185671 2.7e-4,0.09555 0.0766,0.195004 0.14973,0.195004 0.0243,0 0.12868,-0.09119 0.23186,-0.202656 z m -9.13643,-0.717913 c 0.18687,-0.581479 0.22139,-0.847342 0.12746,-0.981451 -0.076,-0.108457 -0.15235,-0.05152 -0.24493,0.182548 -0.0424,0.107436 -0.11173,0.27824 -0.15384,0.379575 -0.0421,0.101328 -0.10404,0.263342 -0.1376,0.360023 -0.0601,0.173168 -0.06,0.177174 0.007,0.267983 0.0377,0.05073 0.10467,0.110767 0.14895,0.133474 0.10594,0.05433 0.13997,0.0083 0.25257,-0.342152 z m -7.2979,0.192 c 0.0932,-0.134287 0.4226,-0.749273 0.44859,-0.837438 0.0424,-0.14385 -0.17144,-0.06467 -0.44262,0.163847 -0.10882,0.09171 -0.20354,0.138148 -0.33117,0.162348 -0.0983,0.01865 -0.18423,0.03391 -0.19093,0.03391 -0.007,0 -0.0122,0.03764 -0.0122,0.08365 0,0.04857 0.0492,0.138103 0.11723,0.213418 0.0644,0.07137 0.11724,0.141355 0.11724,0.155514 0,0.04039 0.11131,0.114636 0.17359,0.115807 0.031,4e-4 0.085,-0.04039 0.12024,-0.09105 z m 6.51938,-0.569455 c 0.0253,-0.08376 0.0928,-0.468649 0.11161,-0.636745 0.0152,-0.135909 0.0107,-0.144863 -0.0963,-0.189342 -0.16034,-0.06668 -0.48382,-0.102447 -0.51213,-0.05662 -0.0507,0.08213 0.22296,0.849128 0.32653,0.914971 0.0694,0.04412 0.15193,0.02847 0.1703,-0.03227 z m -9.5144,5.744594 c -0.0578,-0.151877 -0.13129,-0.359044 -0.16323,-0.460375 -0.0319,-0.101328 -0.0921,-0.221921 -0.13366,-0.267979 -0.0416,-0.04606 -0.0859,-0.14404 -0.0985,-0.217733 -0.0469,-0.274026 -0.26467,-1.12649 -0.38442,-1.504691 -0.0624,-0.197293 -0.10978,-0.357564 -0.2827,-0.957372 -0.1645,-0.570682 -0.33615,-1.319051 -0.42256,-1.842364 -0.0197,-0.119748 -0.0425,-0.247998 -0.0505,-0.285001 -0.0213,-0.0985 0.0292,-0.161439 0.10939,-0.136002 0.0491,0.01558 0.0791,0.07049 0.10727,0.196196 0.0216,0.09601 0.0599,0.242402 0.0853,0.325304 0.0254,0.0829 0.0704,0.248719 0.0998,0.368474 0.0295,0.119754 0.0687,0.27049 0.0872,0.334971 0.0184,0.06448 0.0615,0.245375 0.0955,0.401969 0.12551,0.576651 0.20911,0.894474 0.30844,1.17241 0.056,0.156601 0.12939,0.423468 0.16317,0.593034 0.0337,0.169572 0.0759,0.335384 0.0936,0.368473 0.0177,0.03308 0.0644,0.218444 0.1038,0.411891 0.0748,0.367273 0.12298,0.562048 0.17416,0.703835 0.0167,0.04627 0.0431,0.159328 0.0587,0.251231 0.0156,0.0919 0.0615,0.291676 0.1021,0.443933 0.1015,0.380965 0.074,0.432926 -0.0529,0.0998 z m 6.30396,-5.314603 c -0.0128,-0.02075 -0.009,-0.0864 0.01,-0.145924 0.0182,-0.0595 0.0504,-0.213726 0.0717,-0.34269 0.0213,-0.128965 0.0589,-0.33246 0.0837,-0.452214 0.0247,-0.119754 0.0554,-0.327078 0.0681,-0.460723 0.0245,-0.258667 0.0653,-0.324819 0.13856,-0.224689 0.0795,0.108745 0.0557,0.545556 -0.0564,1.031754 -0.0839,0.363886 -0.11824,0.457549 -0.19681,0.536523 -0.0624,0.06277 -0.10321,0.08271 -0.1185,0.05793 z m 6.43466,-0.353844 c -0.0104,-0.02717 -0.036,-0.18171 -0.0568,-0.343344 -0.0208,-0.161641 -0.0658,-0.414478 -0.10025,-0.561868 -0.287,-1.229933 -0.29699,-1.291005 -0.24855,-1.518418 0.0251,-0.117784 0.0975,-0.171512 0.15436,-0.11461 0.0186,0.01872 0.0609,0.15448 0.0937,0.301746 0.0329,0.147261 0.0716,0.286934 0.086,0.310381 0.0144,0.02344 0.0384,0.172303 0.053,0.330782 0.0147,0.158486 0.0651,0.481558 0.11221,0.717951 0.0956,0.480007 0.10314,0.609188 0.0467,0.797345 -0.0395,0.131674 -0.10612,0.169653 -0.1405,0.08004 z m 3.37152,-1.212306 c -0.0118,-0.0307 0.0113,-0.39626 0.0515,-0.812308 0.0401,-0.416055 0.0766,-0.800159 0.0811,-0.853573 0.0115,-0.135176 0.11236,-0.19323 0.18048,-0.103868 0.0423,0.05544 0.0489,0.162087 0.0383,0.619706 -0.0126,0.547323 -0.0139,0.555885 -0.14024,0.879304 -0.12632,0.323393 -0.16965,0.37896 -0.21117,0.270739 z M 154.968,65.597758 c -0.0559,-0.279275 -0.033,-1.175493 0.0311,-1.216024 0.11638,-0.07356 0.14246,-0.0026 0.19663,0.537694 0.0246,0.245171 0.0274,0.421756 0.008,0.485714 -0.017,0.05525 -0.0484,0.164561 -0.0696,0.242861 -0.0545,0.20087 -0.1195,0.181173 -0.16585,-0.05027 z" + id="path30945" + inkscape:connector-curvature="0" /> + </g> + </g> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8499" + width="66.677605" + height="3.5806408" + x="166.66119" + y="340.74698" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8501" + width="66.677605" + height="3.5806408" + x="166.66119" + y="326.79474" + ry="0" /> + <g + id="g34238" + transform="translate(-25.292419,230.45208)" + style="filter:url(#filter17455)"> + <g + id="g8511" + transform="translate(177.02309)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8503" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8509" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8505" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8507" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="216.19765" + y="92.942772" + id="text8515"><tspan + sodipodi:role="line" + id="tspan8513" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="216.19765" + y="92.942772">height</tspan></text> + </g> + <g + id="g34229" + transform="translate(-25.29242,230.45208)" + style="filter:url(#filter17455)"> + <g + id="g34220"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8519" + width="66.677612" + height="10.371619" + x="191.95361" + y="99.923286" + ry="2.3121314" /> + <g + id="g8525" + transform="translate(176.96103,13.422319)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8521" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8523" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="213.70686" + y="107.44272" + id="text8531"><tspan + sodipodi:role="line" + id="tspan8529" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="213.70686" + y="107.44272">biomass</tspan></text> + </g> + <g + id="g34200" + transform="translate(-25.292419,230.45208)" + style="filter:url(#filter17455)"> + <g + id="g8543" + transform="translate(177.02309,27.904526)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8535" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8541" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8537" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8539" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="208.4743" + y="120.83301" + id="text8547"><tspan + sodipodi:role="line" + id="tspan8545" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="208.4743" + y="120.83301">transpiration</tspan></text> + </g> + <g + id="g34209" + transform="translate(-25.292419,234.03272)" + style="filter:url(#filter17455)"> + <g + id="g21073" + transform="translate(177.02309,38.276146)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect21065" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g21071" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle21067" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle21069" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="208.60863" + y="131.19351" + id="text21077"><tspan + sodipodi:role="line" + id="tspan21075" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="208.60863" + y="131.19351">plant growth</tspan></text> + </g> + <g + id="g34247" + transform="translate(-25.292419,237.61337)" + style="filter:url(#filter17455)"> + <g + id="g21087" + transform="translate(177.02309,48.647766)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect21079" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g21085" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle21081" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle21083" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="204.08267" + y="141.59848" + id="text21091"><tspan + sodipodi:role="line" + id="tspan21089" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="204.08267" + y="141.59848">yield calculation</tspan></text> + </g> + </g> + <g + id="g56957" + transform="translate(0,12.074611)"> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect37305" + width="66.677605" + height="3.5806408" + x="304.78629" + y="273.83401" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect34671" + width="66.677605" + height="3.5806408" + x="304.78629" + y="259.88174" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect34669" + width="66.677605" + height="3.5806408" + x="304.78629" + y="245.9295" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect34667" + width="66.677605" + height="3.5806408" + x="304.78629" + y="231.97723" + ry="0" /> + <rect + style="fill:#ffffff;stroke-width:0.3;filter:url(#filter17455)" + id="rect8551" + width="66.677605" + height="3.5806408" + x="304.78629" + y="218.02498" + ry="0" /> + <g + id="g56388"> + <rect + style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.52723;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter10443)" + id="rect26017" + width="80" + height="126.4156" + x="300.60556" + y="12.66773" + ry="7.4161873" + transform="matrix(0.977113,0,0,1.361129,5.3149711,104.02368)" + rx="10.506939" /> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="320.51187" + y="184.30649" + id="text26063"><tspan + sodipodi:role="line" + id="tspan26061" + style="font-style:normal;font-variant:normal;font-weight:300;font-stretch:normal;font-size:10.5833px;font-family:Lato;-inkscape-font-specification:'Lato, Light';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="320.51187" + y="184.30649">Animals</tspan></text> + <g + id="g56378"> + <circle + style="fill:none;fill-opacity:1;stroke:#73be00;stroke-width:3.30059;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + id="circle7796" + cx="338.12509" + cy="149.8465" + r="19.815086" /> + <g + id="g1765" + transform="translate(120.84971,43.219979)"> + <path + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="m 218.3413,95.498151 c -0.84186,-0.241835 -1.67036,-0.04535 -2.12655,0.235083 -1.34884,0.829188 -0.16201,0.744767 -2.24284,1.172073 -0.17652,0.06035 -0.43228,0.368389 -0.27002,0.395231 0.40947,0.06778 2.24355,0.4567 2.21591,1.504553 -0.53957,1.525929 -0.28523,2.019159 0.15509,3.249409 0.51988,1.38291 1.71541,2.90694 4.11749,3.35616 0.22641,0.0424 -1.02843,1.08932 -1.96174,1.78522 -0.16676,0.12434 -0.38656,0.0186 -0.53549,0.1258 -0.18641,0.13416 -0.0846,0.19609 -0.25441,0.27977 -0.66905,0.32964 -0.71954,0.28743 -0.72598,1.00791 0.12413,-0.45009 0.35763,-0.86372 0.63738,-0.57222 0.1442,0.15026 0.35856,-0.28523 0.57645,-0.41097 0.0766,-0.0442 0.44935,-0.14788 0.28985,-0.0948 -0.60809,0.20233 -0.68596,0.80125 -0.60993,0.87345 0.0284,0.027 0.23998,-0.75879 0.79049,-0.55924 0,0 3.34359,-2.64622 3.31168,-2.29632 -0.0464,0.50822 -2.08933,1.41394 -2.08933,1.41394 -0.0737,-0.12326 -1.34893,0.7909 -1.22039,0.88758 0.0715,0.0538 0.74135,-0.34356 1.29169,-0.34911 0.63122,-0.006 0.60762,-0.19149 0.6607,-0.17444 0.40392,0.12978 1.74386,0.44176 1.76945,0.37441 0.0746,-0.19633 -1.47347,-0.58934 -1.47347,-0.58934 0.25552,-0.62354 1.37983,-1.09313 1.80697,-1.36996 0.34246,-0.22196 0.39554,-0.45373 0.41146,-0.45644 2.33261,-0.39644 2.686,0.21683 4.78184,1.46183 1.52348,1.15993 2.8815,2.00663 2.97373,1.89848 0.0426,-0.0499 -1.17493,-1.01809 0.17154,-0.18874 0.0862,0.0531 0.11525,-0.10336 0.0152,-0.17894 -0.24217,-0.18293 -0.91801,-0.57955 -0.85625,-0.62722 0.0473,-0.0365 0.64131,0.37634 0.99347,0.53568 0.39159,0.17716 0.35661,-0.15679 0.35661,-0.15679 -1.36849,-1.10074 -3.70838,-2.9237 -3.18183,-2.84889 1.54705,0.21976 0.53916,-0.18428 -1.09917,-0.88307 -3.22126,-1.78867 -2.04092,-2.65099 -5.6801,-4.802077 -0.0529,-0.219374 -1.68314,-0.721079 -1.78492,-0.934175 -0.3281,-0.84666 -0.59158,-1.867596 -1.46824,-2.366171 -0.18711,-0.106409 0.88335,0.1221 -0.27518,-0.369267 -0.13577,-0.05758 1.01157,-0.138172 -0.0469,-0.237415 -0.13237,-0.01241 0.52713,0.05027 0.57568,-0.09097 z" + id="path1458-8" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscsccsssscsssssssssssssscssssscscccsssc" /> + <path + style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + d="m 209.64124,100.49578 c -1.62291,0.99511 -0.16922,2.23281 -2.34554,0.97495 -1.68995,-0.97676 -2.92832,6.98128 -1.42694,8.34164 -1.67596,0.2427 -2.93095,1.53227 -2.55936,2.72633 1.54203,4.95515 4.49696,4.531 6.77976,4.05964 -0.11321,0.38351 -0.68049,1.30572 0.0196,1.25509 2.74023,-0.1982 3.00936,-2.03542 4.14787,-2.25038 0.0823,-0.0155 0.15397,0.59087 0.0211,0.97574 -0.22178,0.64237 -0.053,0.9147 0.1765,1.15582 0.11398,0.11977 -0.2137,-0.69771 -0.0978,-0.77995 0.17565,-0.12466 0.11499,-1.05213 0.20843,-1.12951 0.0153,0.13867 0.44293,-0.3481 0.4504,-0.0363 0.0128,0.53671 0.0759,1.3621 0.13573,0.96653 0.19749,-1.30562 0.47046,-1.36767 0.58028,-1.22405 0.27949,0.36552 -0.17249,2.19567 0.16143,2.33182 0.10558,0.0427 -0.0677,-0.36892 0.097,-1.08345 0.0708,-0.30706 -0.0224,-0.64235 0.0666,-1.06876 0.0218,-0.10476 0.47203,-0.60176 0.52416,-0.67573 0.0508,-0.0721 0.58588,-0.0357 0.72232,0.35932 0.0932,0.26982 -0.16953,0.87286 -0.14395,1.13703 0.0696,0.71842 -0.0464,1.17024 0.0752,1.25004 0.0739,0.0486 0.12103,-0.38435 0.16923,-1.12579 0.0378,-0.58219 0.17839,-1.36135 0.17377,-1.42758 -0.0372,-0.53357 0.14145,-0.71707 0.28287,-0.71376 0.2474,0.006 0.71262,0.021 0.70658,0.32305 -0.002,0.0783 -0.236,0.45048 -0.21285,1.04036 0.044,1.12232 -0.22794,1.56262 -0.13725,1.47891 0.41002,-0.37845 0.12972,-1.2968 0.6237,-2.60778 0.0868,-0.23047 -0.91586,-0.58632 -0.88648,-0.67082 0.28347,-0.81546 0.23551,-0.5667 0.54208,-1.32445 0.35374,0.0138 1.08264,-1.10563 0.0793,-2.08053 0,0 -0.34175,0.32516 -0.54039,0.19787 -0.0767,-0.0492 1.52895,-0.71429 3.10576,-1.30895 2.28985,-0.86357 2.87692,-1.40731 2.87692,-1.40731 0.0206,-0.35953 -2.88421,1.37773 -4.85098,1.87809 -0.63261,0.16094 -1.47184,0.74932 -1.49816,0.7345 -0.29778,-0.1677 -0.41716,-0.096 -0.69469,-0.083 -1.37162,-2.4168 -3.7819,-7.72426 -7.33212,-10.18855 z" + id="path846-3" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cscscssssscssscssssssssssssssccssssscc" /> + </g> + </g> + </g> + <rect + style="fill:#ffffff;stroke-width:0.3" + id="rect8553" + width="66.677605" + height="3.5806408" + x="304.78629" + y="204.07271" + ry="0" /> + <g + id="g34565" + transform="translate(-2.8221361,107.73007)" + style="filter:url(#filter17455)"> + <g + id="g8563" + transform="translate(292.6779)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8555" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8561" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8557" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8559" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="327.39319" + y="92.984047" + id="text8567"><tspan + sodipodi:role="line" + id="tspan8565" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="327.39319" + y="92.984047">life phase</tspan></text> + </g> + <g + id="g34629" + transform="translate(-2.8221361,107.73007)" + style="filter:url(#filter17455)"> + <g + id="g8579" + transform="translate(292.6779,13.952261)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8571" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8577" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8573" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8575" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="320.57648" + y="106.89503" + id="text8583"><tspan + sodipodi:role="line" + id="tspan8581" + style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="320.57648" + y="106.89503">energy budget</tspan></text> + </g> + <g + id="g34638" + transform="translate(-2.8221361,107.73007)" + style="filter:url(#filter17455)"> + <g + id="g8595" + transform="translate(292.6779,27.904526)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect8587" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g8593" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8589" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle8591" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="330.07181" + y="120.79967" + id="text8599"><tspan + sodipodi:role="line" + id="tspan8597" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="330.07181" + y="120.79967">foraging</tspan></text> + </g> + <g + id="g34647" + transform="translate(-2.822143,111.31071)" + style="filter:url(#filter17455)"> + <g + id="g34614"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect29199" + width="66.677612" + height="10.371619" + x="307.60843" + y="124.24717" + ry="2.3121314" /> + <g + id="g29205" + transform="translate(292.61584,37.746204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29201" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29203" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="331.67465" + y="131.1713" + id="text29211"><tspan + sodipodi:role="line" + id="tspan29209" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="331.67465" + y="131.1713">mating</tspan></text> + </g> + <g + id="g34656" + transform="translate(-2.8221361,114.89136)" + style="filter:url(#filter17455)"> + <g + id="g29223" + transform="translate(292.6779,48.647766)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect29215" + width="66.677612" + height="10.371619" + x="14.930522" + y="85.971024" + ry="2.3121314" /> + <g + id="g29221" + transform="translate(-0.06205559,-0.52994204)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29217" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29219" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="329.4617" + y="141.56514" + id="text29227"><tspan + sodipodi:role="line" + id="tspan29225" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="329.4617" + y="141.56514">breeding</tspan></text> + </g> + <g + id="g34665" + transform="translate(-2.822143,118.19986)" + style="filter:url(#filter17455)"> + <g + id="g34620"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect29231" + width="66.677612" + height="10.371619" + x="307.60843" + y="145.26254" + ry="2.3121314" /> + <g + id="g29237" + transform="translate(292.61584,58.761573)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29233" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle29235" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="328.49728" + y="152.18666" + id="text29243"><tspan + sodipodi:role="line" + id="tspan29241" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="328.49728" + y="152.18666">migration</tspan></text> + </g> + <g + id="g38581" + style="filter:url(#filter17455)"> + <g + id="g37297" + transform="translate(-2.8221436,132.1521)"> + <rect + style="fill:#f9f9f9;fill-opacity:1;stroke:#1a1a1a;stroke-width:0.322387;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="rect37289" + width="66.677612" + height="10.371619" + x="307.60843" + y="145.26254" + ry="2.3121314" /> + <g + id="g37295" + transform="translate(292.61584,58.761573)"> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle37291" + cx="21.224688" + cy="91.686775" + r="2.2695131" /> + <circle + style="fill:#cccccc;fill-opacity:1;stroke:none;stroke-width:0.3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + id="circle37293" + cx="75.43808" + cy="91.686775" + r="2.2695131" /> + </g> + </g> + <text + xml:space="preserve" + style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="325.93628" + y="284.39432" + id="text37301"><tspan + sodipodi:role="line" + id="tspan37299" + style="font-style:italic;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.35px;font-family:Lato;-inkscape-font-specification:'Lato, Italic';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583" + x="325.93628" + y="284.39432">mortality</tspan></text> + </g> + </g> + <g + id="g62639"> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 84.417371,297.27678 h 34.892179 v -58.84451 h 129.77539 v 56.41741 h 61.7701" + id="path59085" + sodipodi:nodetypes="cccccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM)" + d="M 84.356102,255.31139 H 119.24283" + id="path59360" + sodipodi:nodetypes="cc" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 84.311748,269.23478 h 24.668232 v 99.22007 h 63.66461" + id="path59689" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM)" + d="M 84.430181,283.24299 H 108.8941" + id="path59964" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="M 172.8609,382.30737 H 132.14018 V 227.54509 H 84.450472" + id="path60196" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 172.88712,124.32732 h -27.13128 v 230.02604 h 27.11807" + id="path60661" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="M 172.88712,110.50782 H 132.14018 V 213.62556 H 84.516528" + id="path61774" + sodipodi:nodetypes="cccc" /> + <g + id="g65520"> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="M 84.371435,241.37669 H 112.938 l -1.6e-4,-144.847846 h 59.94928" + id="path61680" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM)" + d="M 84.599575,325.22808 H 112.938 v -83.63041" + id="path64873" + sodipodi:nodetypes="ccc" /> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 84.321184,311.20663 h 66.584406 v 15.21016 h 21.96832" + id="path64965" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 227.27244,326.43238 h 44.19755 v -88.86512 h 39.38505" + id="path66307" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 227.21906,124.54549 h 33.42877 V 280.9606 h 50.20721" + id="path66664" + sodipodi:nodetypes="cccc" /> + <g + id="g70637"> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#DotM);marker-end:url(#Arrow2Lend)" + d="m 227.21906,96.483403 h 54.4899 V 240.01898 h 29.14608" + id="path66859" + sodipodi:nodetypes="cccc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow2Lend)" + d="m 281.70896,240.01898 v 26.91811 h 29.14608" + id="path67886" + sodipodi:nodetypes="ccc" /> + </g> + </g> + </g> +</svg> diff --git a/docs/build/assets/screenshot.png b/docs/build/assets/screenshot.png index 6934cbfd02e40ebebd1cf1cbfdec3825a0572297..7903c81766bd9fc6bb082b4c4327ea359e3a79ac 100644 Binary files a/docs/build/assets/screenshot.png and b/docs/build/assets/screenshot.png differ diff --git a/docs/build/config.html b/docs/build/config.html index 4d34c8d42b35d4beebcbcc5a34f6741d1121e274..31d3d6c72a3c20ebbb1b129264515d4860eaaaca 100644 --- a/docs/build/config.html +++ b/docs/build/config.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Configuration · Persefone</title><meta name="title" content="Configuration · Persefone"/><meta property="og:title" content="Configuration · Persefone"/><meta property="twitter:title" content="Configuration · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li class="is-active"><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="config.html">Configuration</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="config.html">Configuration</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/config.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Configuration"><a class="docs-heading-anchor" href="#Configuration">Configuration</a><a id="Configuration-1"></a><a class="docs-heading-anchor-permalink" href="#Configuration" title="Permalink"></a></h1><p>Persefone requires three <a href="io.html">input</a> files: a configuration file and two map files. How to generate the map files is documented <a href="gis.html">elsewhere</a>. The configuration file defines parameter values and looks like this (see <code>src/parameters.toml</code> for the default):</p><pre><code class="language-TOML hljs">### Persefone.jl - a model of agricultural landscapes and ecosystems in Europe. +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Configuration · Persefone.jl</title><meta name="title" content="Configuration · Persefone.jl"/><meta property="og:title" content="Configuration · Persefone.jl"/><meta property="twitter:title" content="Configuration · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li class="is-active"><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="config.html">Configuration</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="config.html">Configuration</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/config.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Configuration"><a class="docs-heading-anchor" href="#Configuration">Configuration</a><a id="Configuration-1"></a><a class="docs-heading-anchor-permalink" href="#Configuration" title="Permalink"></a></h1><p>Persefone requires three <a href="io.html">input</a> files: a configuration file and two map files. How to generate the map files is documented <a href="gis.html">elsewhere</a>. The configuration file defines parameter values and looks like this (see <code>src/parameters.toml</code> for the default):</p><pre><code class="language-TOML hljs">### Persefone.jl - a model of agricultural landscapes and ecosystems in Europe. ### ### This is the default configuration file for Persefone, containing all model parameters. ### The syntax is described here: https://toml.io/en/ @@ -8,15 +8,15 @@ configfile = "src/parameters.toml" # location of the configuration file outdir = "results" # location and name of the output folder overwrite = "ask" # overwrite the output directory? (true/false/"ask") +logoutput = "both" # log output to screen/file/both csvoutput = true # save collected data in CSV files visualise = true # generate result graphs storedata = true # keep collected data in memory loglevel = "debug" # verbosity level: "debug", "info", "warn" processors = 2 # number of processors to use on parallel runs seed = 2 # seed value for the RNG (0 -> random value) -# dates to start and end the simulation -startdate = 2022-01-01 -enddate = 2022-12-31 +startdate = 2022-01-01 # first day of the simulation +enddate = 2022-12-31 # last day of the simulation [world] landcovermap = "data/regions/jena/landcover.tif" # location of the landcover map @@ -35,4 +35,4 @@ insectmodel = ["season", "habitat", "pesticides", [crop] cropmodel = "almass" # crop growth model to use, "almass" or "aquacrop" cropfile = "data/crops/almass/crop_data_general.csv" # file with general crop parameters -growthfile = "data/crops/almass/almass_crop_growth_curves.csv" # file with crop growth parameters </code></pre><div class="admonition is-info"><header class="admonition-header">Parameter scanning</header><div class="admonition-body"><p>You can set any parameter to a list of different values, e.g. <code>seed = [1,2,3]</code>. Persefone will then set up and run multiple simulations, one for every possible combination of parameters that you entered (i.e. do a full-factorial simulation experiment).</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="gui.html">« Graphical User Interface</a><a class="docs-footer-nextpage" href="developing.html">Developing Persefone »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +growthfile = "data/crops/almass/almass_crop_growth_curves.csv" # file with crop growth parameters </code></pre><div class="admonition is-info"><header class="admonition-header">Parameter scanning</header><div class="admonition-body"><p>You can set any parameter to a list of different values, e.g. <code>seed = [1,2,3]</code>. Persefone will then set up and run multiple simulations, one for every possible combination of parameters that you entered (i.e. do a full-factorial simulation experiment).</p></div></div></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="gui.html">« Graphical User Interface</a><a class="docs-footer-nextpage" href="developing.html">Developing Persefone »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/crops.html b/docs/build/crops.html index ab310ead99959109753c645a8eac8f68878539aa..364e13b814599d88d605e5908088dc5641110f7e 100644 --- a/docs/build/crops.html +++ b/docs/build/crops.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Crop submodel · Persefone</title><meta name="title" content="Crop submodel · Persefone"/><meta property="og:title" content="Crop submodel · Persefone"/><meta property="twitter:title" content="Crop submodel · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li class="is-active"><a class="tocitem" href="crops.html">Crop submodel</a><ul class="internal"><li><a class="tocitem" href="#farmplot.jl"><span>farmplot.jl</span></a></li><li><a class="tocitem" href="#crops.jl"><span>crops.jl</span></a></li></ul></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="crops.html">Crop submodel</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="crops.html">Crop submodel</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/crops.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Crop-submodel"><a class="docs-heading-anchor" href="#Crop-submodel">Crop submodel</a><a id="Crop-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Crop-submodel" title="Permalink"></a></h1><p>Eventually, the plan is to have Persefone include a reimplementation of the AquaCrop model, a well-established crop growth model developed by the FAO. Until then, we are using the crop growth submodel used in <a href="https://doi.org/10.1016/S0304-3800(03)00173-X">ALMaSS</a>.</p><h2 id="farmplot.jl"><a class="docs-heading-anchor" href="#farmplot.jl">farmplot.jl</a><a id="farmplot.jl-1"></a><a class="docs-heading-anchor-permalink" href="#farmplot.jl" title="Permalink"></a></h2><p>This file is responsible for the farm plots, i.e. the indidivual fields that farmers manage.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.FarmPlot" href="#Persefone.FarmPlot"><code>Persefone.FarmPlot</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">FarmPlot</code></pre><p>This represents one field, i.e. a collection of pixels with the same management. This is the spatial unit with which the crop growth model and the farm model work.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L8-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.averagefieldsize-Tuple{Agents.AgentBasedModel}" href="#Persefone.averagefieldsize-Tuple{Agents.AgentBasedModel}"><code>Persefone.averagefieldsize</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">averagefieldsize(model)</code></pre><p>Calculate the average field size in hectares for the model landscape.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L154-L158">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.cropheight-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.cropheight-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.cropheight</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">cropheight(model, position)</code></pre><p>Return the height of the crop at this position, or nothing if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L190-L195">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.cropname-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.cropname-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.cropname</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">cropname(model, position)</code></pre><p>Return the name of the crop at this position, or nothing if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L179-L184">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.croptype-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.croptype-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.croptype</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">croptype(model, position)</code></pre><p>Return the crop at this position, or nothing if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L169-L173">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.growcrop!-Tuple{FarmPlot, Agents.AgentBasedModel}" href="#Persefone.growcrop!-Tuple{FarmPlot, Agents.AgentBasedModel}"><code>Persefone.growcrop!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">growcrop!(farmplot, model)</code></pre><p>Apply the relevant crop growth model to update the plants on this farm plot. Currently only supports the ALMaSS crop growth model by Topping et al.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L114-L119">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.harvest!-Tuple{FarmPlot, Agents.AgentBasedModel}" href="#Persefone.harvest!-Tuple{FarmPlot, Agents.AgentBasedModel}"><code>Persefone.harvest!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">harvest!(farmplot, model)</code></pre><p>Harvest the crop on this farmplot.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initfields!-Tuple{Agents.AgentBasedModel}" href="#Persefone.initfields!-Tuple{Agents.AgentBasedModel}"><code>Persefone.initfields!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initfields!(model)</code></pre><p>Initialise the model with its farm plots.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L26-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.sow!-Tuple{String, FarmPlot, Agents.AgentBasedModel}" href="#Persefone.sow!-Tuple{String, FarmPlot, Agents.AgentBasedModel}"><code>Persefone.sow!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">sow!(cropname, farmplot, model)</code></pre><p>Sow the specified crop on this farmplot.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L84-L88">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{FarmPlot, Agents.AgentBasedModel}" href="#Persefone.stepagent!-Tuple{FarmPlot, Agents.AgentBasedModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(farmplot, model)</code></pre><p>Update a farm plot by one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/farmplot.jl#L61-L65">source</a></section></article><h2 id="crops.jl"><a class="docs-heading-anchor" href="#crops.jl">crops.jl</a><a id="crops.jl-1"></a><a class="docs-heading-anchor-permalink" href="#crops.jl" title="Permalink"></a></h2><p>This includes the types and functions needed for all crop growth model, which are also referenced by the other submodels.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.CropCurveParams" href="#Persefone.CropCurveParams"><code>Persefone.CropCurveParams</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">CropCurveParams</code></pre><p>The values in this struct define one crop growth curve.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L16-L20">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.CropType" href="#Persefone.CropType"><code>Persefone.CropType</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">CropType</code></pre><p>The type struct for all crops. Currently follows the crop growth model as implemented in ALMaSS.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L30-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.GrowthPhase" href="#Persefone.GrowthPhase"><code>Persefone.GrowthPhase</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">GrowthPhase</code></pre><p>ALMaSS crop growth curves are split into five phases, triggered by seasonal dates or agricultural events.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L8-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}" href="#Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}"><code>Base.tryparse</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">Base.tryparse(type, str)</code></pre><p>Extend <code>tryparse</code> to allow parsing GrowthPhase values. (Needed to read in the CSV parameter file.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L48-L53">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}" href="#Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}"><code>Persefone.buildgrowthcurve</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">buildgrowthcurve(data)</code></pre><p>Convert a list of rows from the crop growth data into a CropCurveParams object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L63-L67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.readcropparameters-Tuple{String, String}" href="#Persefone.readcropparameters-Tuple{String, String}"><code>Persefone.readcropparameters</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">readcropparameters(generalcropfile, cropgrowthfile)</code></pre><p>Parse a CSV file containing the required parameter values for each crop (as produced from the original ALMaSS file by <code>convert_almass_data.py</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/crop/crops.jl#L92-L97">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="species.html">« Species</a><a class="docs-footer-nextpage" href="farm.html">Farm submodel »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Crop submodel · Persefone.jl</title><meta name="title" content="Crop submodel · Persefone.jl"/><meta property="og:title" content="Crop submodel · Persefone.jl"/><meta property="twitter:title" content="Crop submodel · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li class="is-active"><a class="tocitem" href="crops.html">Crop submodel</a><ul class="internal"><li><a class="tocitem" href="#farmplot.jl"><span>farmplot.jl</span></a></li><li><a class="tocitem" href="#crops.jl"><span>crops.jl</span></a></li></ul></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="crops.html">Crop submodel</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="crops.html">Crop submodel</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/crops.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Crop-submodel"><a class="docs-heading-anchor" href="#Crop-submodel">Crop submodel</a><a id="Crop-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Crop-submodel" title="Permalink"></a></h1><p>Eventually, the plan is to have Persefone include a reimplementation of the AquaCrop model, a well-established crop growth model developed by the FAO. Until then, we are using the crop growth submodel used in <a href="https://doi.org/10.1016/S0304-3800(03)00173-X">ALMaSS</a>.</p><h2 id="farmplot.jl"><a class="docs-heading-anchor" href="#farmplot.jl">farmplot.jl</a><a id="farmplot.jl-1"></a><a class="docs-heading-anchor-permalink" href="#farmplot.jl" title="Permalink"></a></h2><p>This file is responsible for the farm plots, i.e. the indidivual fields that farmers manage.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.FarmPlot" href="#Persefone.FarmPlot"><code>Persefone.FarmPlot</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">FarmPlot</code></pre><p>This represents one field, i.e. a collection of pixels with the same management. This is the spatial unit with which the crop growth model and the farm model work.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L8-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.averagefieldsize-Tuple{SimulationModel}" href="#Persefone.averagefieldsize-Tuple{SimulationModel}"><code>Persefone.averagefieldsize</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">averagefieldsize(model)</code></pre><p>Calculate the average field size in hectares for the model landscape.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L156-L160">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.cropheight-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.cropheight-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.cropheight</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">cropheight(model, position)</code></pre><p>Return the height of the crop at this position, or nothing if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L191-L196">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.cropname-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.cropname-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.cropname</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">cropname(model, position)</code></pre><p>Return the name of the crop at this position, or an empty string if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L180-L185">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.croptype-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.croptype-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.croptype</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">croptype(model, position)</code></pre><p>Return the crop at this position, or nothing if there is no crop here (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L170-L174">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.growcrop!-Tuple{FarmPlot, SimulationModel}" href="#Persefone.growcrop!-Tuple{FarmPlot, SimulationModel}"><code>Persefone.growcrop!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">growcrop!(farmplot, model)</code></pre><p>Apply the relevant crop growth model to update the plants on this farm plot. Currently only supports the ALMaSS crop growth model by Topping et al.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L116-L121">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.harvest!-Tuple{FarmPlot, SimulationModel}" href="#Persefone.harvest!-Tuple{FarmPlot, SimulationModel}"><code>Persefone.harvest!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">harvest!(farmplot, model)</code></pre><p>Harvest the crop on this farmplot.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L98-L102">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initfields!-Tuple{SimulationModel}" href="#Persefone.initfields!-Tuple{SimulationModel}"><code>Persefone.initfields!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initfields!(model)</code></pre><p>Initialise the model with its farm plots.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L27-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.sow!-Tuple{String, FarmPlot, SimulationModel}" href="#Persefone.sow!-Tuple{String, FarmPlot, SimulationModel}"><code>Persefone.sow!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">sow!(cropname, farmplot, model)</code></pre><p>Sow the specified crop on this farmplot.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L86-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{FarmPlot, SimulationModel}" href="#Persefone.stepagent!-Tuple{FarmPlot, SimulationModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(farmplot, model)</code></pre><p>Update a farm plot by one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/farmplot.jl#L63-L67">source</a></section></article><h2 id="crops.jl"><a class="docs-heading-anchor" href="#crops.jl">crops.jl</a><a id="crops.jl-1"></a><a class="docs-heading-anchor-permalink" href="#crops.jl" title="Permalink"></a></h2><p>This includes the types and functions needed for all crop growth model, which are also referenced by the other submodels.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.CropCurveParams" href="#Persefone.CropCurveParams"><code>Persefone.CropCurveParams</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">CropCurveParams</code></pre><p>The values in this struct define one crop growth curve.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L16-L20">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.CropType" href="#Persefone.CropType"><code>Persefone.CropType</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">CropType</code></pre><p>The type struct for all crops. Currently follows the crop growth model as implemented in ALMaSS.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L30-L35">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.GrowthPhase" href="#Persefone.GrowthPhase"><code>Persefone.GrowthPhase</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">GrowthPhase</code></pre><p>ALMaSS crop growth curves are split into five phases, triggered by seasonal dates or agricultural events.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L8-L13">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}" href="#Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}"><code>Base.tryparse</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">Base.tryparse(type, str)</code></pre><p>Extend <code>tryparse</code> to allow parsing GrowthPhase values. (Needed to read in the CSV parameter file.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L50-L55">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}" href="#Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}"><code>Persefone.buildgrowthcurve</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">buildgrowthcurve(data)</code></pre><p>Convert a list of rows from the crop growth data into a CropCurveParams object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.readcropparameters-Tuple{String, String}" href="#Persefone.readcropparameters-Tuple{String, String}"><code>Persefone.readcropparameters</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">readcropparameters(generalcropfile, cropgrowthfile)</code></pre><p>Parse a CSV file containing the required parameter values for each crop (as produced from the original ALMaSS file by <code>convert_almass_data.py</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/crop/crops.jl#L94-L99">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="species.html">« Species</a><a class="docs-footer-nextpage" href="farm.html">Farm submodel »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/developing.html b/docs/build/developing.html index dbbc2689bc6dd303abe0d1d5773170acd627144a..14e2bd8d8366dac9de3a8ef3ca345de94f67e99e 100644 --- a/docs/build/developing.html +++ b/docs/build/developing.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Developing Persefone · Persefone</title><meta name="title" content="Developing Persefone · Persefone"/><meta property="og:title" content="Developing Persefone · Persefone"/><meta property="twitter:title" content="Developing Persefone · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li class="is-active"><a class="tocitem" href="developing.html">Developing Persefone</a><ul class="internal"><li><a class="tocitem" href="#Setting-up"><span>Setting up</span></a></li><li><a class="tocitem" href="#Development-workflow"><span>Development workflow</span></a></li><li><a class="tocitem" href="#Important-libraries"><span>Important libraries</span></a></li></ul></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="developing.html">Developing Persefone</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="developing.html">Developing Persefone</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/developing.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Developing-Persefone"><a class="docs-heading-anchor" href="#Developing-Persefone">Developing Persefone</a><a id="Developing-Persefone-1"></a><a class="docs-heading-anchor-permalink" href="#Developing-Persefone" title="Permalink"></a></h1><h2 id="Setting-up"><a class="docs-heading-anchor" href="#Setting-up">Setting up</a><a id="Setting-up-1"></a><a class="docs-heading-anchor-permalink" href="#Setting-up" title="Permalink"></a></h2><p>If you haven't worked with Julia before, here are detailed instructions for how to set up your development environment. The main development is currently done on Linux (and as the primary execution platform will be an HPC, Linux compatibility is important), but developing on Windows works too.</p><h3 id="Visual-Studio-Code-on-Windows"><a class="docs-heading-anchor" href="#Visual-Studio-Code-on-Windows">Visual Studio Code on Windows</a><a id="Visual-Studio-Code-on-Windows-1"></a><a class="docs-heading-anchor-permalink" href="#Visual-Studio-Code-on-Windows" title="Permalink"></a></h3><ol><li><p>Download and install <a href="https://julialang.org/downloads/">Julia</a>, <a href="https://git-scm.com/download/win">git</a> and <a href="https://code.visualstudio.com/">Visual Studio Code</a>.</p></li><li><p>Install the <a href="https://www.julia-vscode.org/">Julia extension for VS Code</a>: In VS Code, open the extensions pane (<code>Ctrl+Shift+X</code>). Search for and install Julia Language Support.</p></li><li><p>Clone the <a href="https://git.idiv.de/persefone/persefone-model.git">Gitlab repository</a>: In VS Code, open the source control pane (<code>Ctrl+Shift+G</code>). Click on <code>Clone</code> and enter the repo URL. Then select a folder on your computer to download the files into, and let VS Code open the project once it has been cloned.</p></li><li><p>Start a Julia REPL: In VS Code, bring up the command palette (<code>Ctrl+Shift+P</code>). Execute the command <code>Julia: Start REPL</code>. Then install all dependencies of Persefone by running <code>using Pkg; Pkg.activate("."); Pkg.instantiate()</code>. (This will take some time.)</p></li><li><p>Open the file <code>run.jl</code> and click <code>Execute</code> (triangular button in the top right). The source code will compile (this can take a lot of time the first time you do it) and run a default simulation.</p></li><li><p>Further steps: You may want to familiarise yourself with how to use <a href="https://code.visualstudio.com/docs/sourcecontrol/overview">git with VS Code</a>. You may also want to clone the Persefone Desktop <a href="https://git.idiv.de/persefone/persefone-desktop.git">repository</a> (repeat steps 3 to 5).</p></li></ol><h3 id="Emacs-on-Linux"><a class="docs-heading-anchor" href="#Emacs-on-Linux">Emacs on Linux</a><a id="Emacs-on-Linux-1"></a><a class="docs-heading-anchor-permalink" href="#Emacs-on-Linux" title="Permalink"></a></h3><p><em>You can of course also use VS Code on Linux. In that case, follow the instructions above.</em></p><p>Make sure you have git and Julia installed. Git should be in your distro's repos (e.g. <code>sudo apt install git</code>). To install Julia, <a href="https://julialang.org/downloads/">download</a> the binary and unpack it. For greater ease of use, copy the unpacked files to <code>/usr/local/lib/julia</code> (or similar) and create a symlink to the executable: <code>sudo ln -s /usr/local/lib/julia/bin/julia /usr/local/bin/julia</code>. Then go the to folder that you want to use for development and run <code>git clone https://git.idiv.de/persefone/persefone-model.git .</code> in your terminal.</p><p>There are a couple of addons that make working with Julia much nicer in Emacs:</p><ol><li><p><code>julia-mode</code> gives syntax highlighting. Install with <code>M-x package-install julia-mode</code>.</p></li><li><p><a href="https://github.com/gcv/julia-snail"><code>julia-snail</code></a> provides IDE-like features, especially a fully-functional REPL and the ability to evaluate code straight from inside a buffer. Note that the installation can be somewhat tricky. You first need to manually install all the dependencies of its dependency <a href="https://github.com/akermu/emacs-libvterm">vterm</a>, then install vterm itself with <code>M-x package-install vterm</code>, <em>before</em> you can do <code>M-x package-install julia-snail</code>. Then add it to your <code>init.el</code> with <code>(require 'julia-snail)</code> and <code>(add-hook 'julia-mode-hook #'julia-snail-mode)</code>.</p></li><li><p><a href="http://company-mode.github.io/"><code>company-mode</code></a> integrates with Snail to give code completion. Install with <code>M-x package-install company</code>, then add <code>(add-hook 'julia-mode-hook #'company-mode)</code> and <code>(global-set-key (kbd "C-<tab>") 'company-complete)</code> to your <code>init.el</code>.</p></li><li><p><a href="https://magit.vc/"><code>magit</code></a> is a great git interface for Emacs. Install with <code>M-x package-install magit</code> and add <code>(global-set-key (kbd "C-x g") 'magit-status)</code> to your <code>init.el</code>.</p></li></ol><h2 id="Development-workflow"><a class="docs-heading-anchor" href="#Development-workflow">Development workflow</a><a id="Development-workflow-1"></a><a class="docs-heading-anchor-permalink" href="#Development-workflow" title="Permalink"></a></h2><ol><li><p>Pull the current version from the master branch on Gitlab: <a href="https://git.idiv.de/persefone/persefone-model">https://git.idiv.de/persefone/persefone-model</a>.</p></li><li><p>If you are working on a new feature, create a new branch to avoid breaking the <code>master</code> branch. (The <code>master</code> branch on Github should always be in a runnable and error-free state.)</p></li><li><p>Implement your changes.</p></li><li><p>Run an example simulation and the test suite to make sure everything works without crashing (<code>make run</code> and <code>make test</code> on Linux, or execute <code>run.jl</code> and <code>test/runtests.jl</code> manually.)</p></li><li><p>Commit your work frequently, and try to keep each commit small. Don't forget to add relevant tests to the test suite.</p></li><li><p>Once your satisfied with your work, do another pull/merge from the <code>master</code> branch in case somebody else changed the branch in the meantime. Then merge your work into <code>master</code> and push to the Gitlab server.</p></li><li><p>Repeat :-)</p></li></ol><p>The Gitlab <a href="https://git.idiv.de/persefone/persefone-model/-/boards/373">issue tracker</a> can be used to create, discuss, and assign tasks, as well as to monitor progress towards milestones/releases. Once we have a first release, we will start using <a href="https://semver.org/">semantic versioning</a> and a <a href="https://keepachangelog.com/en/1.0.0/">changelog</a>.</p><h2 id="Important-libraries"><a class="docs-heading-anchor" href="#Important-libraries">Important libraries</a><a id="Important-libraries-1"></a><a class="docs-heading-anchor-permalink" href="#Important-libraries" title="Permalink"></a></h2><h3 id="Agents.jl"><a class="docs-heading-anchor" href="#Agents.jl">Agents.jl</a><a id="Agents.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Agents.jl" title="Permalink"></a></h3><p>Our model uses <a href="https://juliadynamics.github.io/Agents.jl/stable/">Agents.jl</a> as a framework. Their <a href="https://github.com/JuliaDynamics/Agents.jl">repository</a> can be used to inspect the source code or submit bug reports (the authors are quick to respond). Questions can be asked at the <a href="https://discourse.julialang.org/c/domain/models/21">Julia Discourse forum</a>.</p><p><em>Tutorial on collaborating on Julia packages: <a href="https://www.matecdev.com/posts/julia-package-collaboration.html">https://www.matecdev.com/posts/julia-package-collaboration.html</a>.</em></p><h3 id="Revise.jl"><a class="docs-heading-anchor" href="#Revise.jl">Revise.jl</a><a id="Revise.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Revise.jl" title="Permalink"></a></h3><p><a href="https://timholy.github.io/Revise.jl/stable/"><code>Revise.jl</code></a> allows one to reload code without restarting the Julia interpreter. Get it with <code>Pkg.add("Revise")</code>, then add <code>using Revise</code> to <code>.julia/config/startup.jl</code> to have it automatically available.</p><h3 id="Test"><a class="docs-heading-anchor" href="#Test">Test</a><a id="Test-1"></a><a class="docs-heading-anchor-permalink" href="#Test" title="Permalink"></a></h3><p>Persefone uses the inbuilt Julia <a href="https://docs.julialang.org/en/v1/stdlib/Test/">testing framework</a>. All new functions should have appropriate tests written for them in the appropriate file in the <code>test</code> directory. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/test/runtests.jl"><code>test/runtests.jl</code></a> for details.) There are three ways to run the test suite: in the terminal, executing <code>make test</code> or <code>cd test; julia runtests.jl</code>; or in the Julia REPL, <code>Pkg.activate("."); Pkg.test()</code>.</p><h3 id="Documenter.jl"><a class="docs-heading-anchor" href="#Documenter.jl">Documenter.jl</a><a id="Documenter.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Documenter.jl" title="Permalink"></a></h3><p>The HTML documentation is generated using <a href="https://documenter.juliadocs.org">Documenter.jl</a>. Therefore, all new functions should have docstrings attached. New files need to be integrated into the relevant documentation source files in <code>docs/src</code>, and if necessary into <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/docs/builddocs.jl"><code>docs/builddocs.jl</code></a>. To build the documentation, run <code>make docs</code>, or <code>cd docs; julia builddocs.jl</code> (if using the latter, don't forget to update the date and commit in <code>docs/src/index.md</code>).</p><h3 id="Graphics-and-user-interface"><a class="docs-heading-anchor" href="#Graphics-and-user-interface">Graphics and user interface</a><a id="Graphics-and-user-interface-1"></a><a class="docs-heading-anchor-permalink" href="#Graphics-and-user-interface" title="Permalink"></a></h3><p>Persefone uses <a href="https://makie.org/">Makie</a> as a plotting library to generate its output graphics. Additionally, Persefone Desktop uses <a href="https://github.com/JuliaGraphics/QML.jl">QML.jl</a> to create its graphical user interface.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="config.html">« Configuration</a><a class="docs-footer-nextpage" href="adapting.html">Adapting Persefone »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Developing Persefone · Persefone.jl</title><meta name="title" content="Developing Persefone · Persefone.jl"/><meta property="og:title" content="Developing Persefone · Persefone.jl"/><meta property="twitter:title" content="Developing Persefone · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li class="is-active"><a class="tocitem" href="developing.html">Developing Persefone</a><ul class="internal"><li><a class="tocitem" href="#Setting-up"><span>Setting up</span></a></li><li><a class="tocitem" href="#Development-workflow"><span>Development workflow</span></a></li><li><a class="tocitem" href="#Important-libraries"><span>Important libraries</span></a></li></ul></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="developing.html">Developing Persefone</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="developing.html">Developing Persefone</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/developing.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Developing-Persefone"><a class="docs-heading-anchor" href="#Developing-Persefone">Developing Persefone</a><a id="Developing-Persefone-1"></a><a class="docs-heading-anchor-permalink" href="#Developing-Persefone" title="Permalink"></a></h1><h2 id="Setting-up"><a class="docs-heading-anchor" href="#Setting-up">Setting up</a><a id="Setting-up-1"></a><a class="docs-heading-anchor-permalink" href="#Setting-up" title="Permalink"></a></h2><p>If you haven't worked with Julia before, here are detailed instructions for how to set up your development environment. The main development is currently done on Linux (and as the primary execution platform will be an HPC, Linux compatibility is important), but developing on Windows works too.</p><h3 id="Visual-Studio-Code-on-Windows"><a class="docs-heading-anchor" href="#Visual-Studio-Code-on-Windows">Visual Studio Code on Windows</a><a id="Visual-Studio-Code-on-Windows-1"></a><a class="docs-heading-anchor-permalink" href="#Visual-Studio-Code-on-Windows" title="Permalink"></a></h3><ol><li><p>Download and install <a href="https://julialang.org/downloads/">Julia</a>, <a href="https://git-scm.com/download/win">git</a> and <a href="https://code.visualstudio.com/">Visual Studio Code</a>.</p></li><li><p>Install the <a href="https://www.julia-vscode.org/">Julia extension for VS Code</a>: In VS Code, open the extensions pane (<code>Ctrl+Shift+X</code>). Search for and install Julia Language Support.</p></li><li><p>Clone the <a href="https://git.idiv.de/persefone/persefone-model.git">Gitlab repository</a>: In VS Code, open the source control pane (<code>Ctrl+Shift+G</code>). Click on <code>Clone</code> and enter the repo URL. Then select a folder on your computer to download the files into, and let VS Code open the project once it has been cloned.</p></li><li><p>Start a Julia REPL: In VS Code, bring up the command palette (<code>Ctrl+Shift+P</code>). Execute the command <code>Julia: Start REPL</code>. Then install all dependencies of Persefone by running <code>using Pkg; Pkg.activate("."); Pkg.instantiate()</code>. (This will take some time.)</p></li><li><p>Open the file <code>run.jl</code> and click <code>Execute</code> (triangular button in the top right). The source code will compile (this can take a lot of time the first time you do it) and run a default simulation.</p></li><li><p>Further steps: You may want to familiarise yourself with how to use <a href="https://code.visualstudio.com/docs/sourcecontrol/overview">git with VS Code</a>. You may also want to clone the Persefone Desktop <a href="https://git.idiv.de/persefone/persefone-desktop.git">repository</a> (repeat steps 3 to 5).</p></li></ol><h3 id="Emacs-on-Linux"><a class="docs-heading-anchor" href="#Emacs-on-Linux">Emacs on Linux</a><a id="Emacs-on-Linux-1"></a><a class="docs-heading-anchor-permalink" href="#Emacs-on-Linux" title="Permalink"></a></h3><p><em>You can of course also use VS Code on Linux. In that case, follow the instructions above.</em></p><p>Make sure you have git and Julia installed. Git should be in your distro's repos (e.g. <code>sudo apt install git</code>). To install Julia, <a href="https://julialang.org/downloads/">download</a> the binary and unpack it. For greater ease of use, copy the unpacked files to <code>/usr/local/lib/julia</code> (or similar) and create a symlink to the executable: <code>sudo ln -s /usr/local/lib/julia/bin/julia /usr/local/bin/julia</code>. Then go the to folder that you want to use for development and run <code>git clone https://git.idiv.de/persefone/persefone-model.git .</code> in your terminal.</p><p>There are a couple of addons that make working with Julia much nicer in Emacs:</p><ol><li><p><code>julia-mode</code> gives syntax highlighting. Install with <code>M-x package-install julia-mode</code>.</p></li><li><p><a href="https://github.com/gcv/julia-snail"><code>julia-snail</code></a> provides IDE-like features, especially a fully-functional REPL and the ability to evaluate code straight from inside a buffer. Note that the installation can be somewhat tricky. You first need to manually install all the dependencies of its dependency <a href="https://github.com/akermu/emacs-libvterm">vterm</a>, then install vterm itself with <code>M-x package-install vterm</code>, <em>before</em> you can do <code>M-x package-install julia-snail</code>. Then add it to your <code>init.el</code> with <code>(require 'julia-snail)</code> and <code>(add-hook 'julia-mode-hook #'julia-snail-mode)</code>.</p></li><li><p><a href="http://company-mode.github.io/"><code>company-mode</code></a> integrates with Snail to give code completion. Install with <code>M-x package-install company</code>, then add <code>(add-hook 'julia-mode-hook #'company-mode)</code> and <code>(global-set-key (kbd "C-<tab>") 'company-complete)</code> to your <code>init.el</code>.</p></li><li><p><a href="https://magit.vc/"><code>magit</code></a> is a great git interface for Emacs. Install with <code>M-x package-install magit</code> and add <code>(global-set-key (kbd "C-x g") 'magit-status)</code> to your <code>init.el</code>.</p></li></ol><h2 id="Development-workflow"><a class="docs-heading-anchor" href="#Development-workflow">Development workflow</a><a id="Development-workflow-1"></a><a class="docs-heading-anchor-permalink" href="#Development-workflow" title="Permalink"></a></h2><ol><li><p>Pull the current version from the master branch on Gitlab: <a href="https://git.idiv.de/persefone/persefone-model">https://git.idiv.de/persefone/persefone-model</a>.</p></li><li><p>If you are working on a new feature, create a new branch to avoid breaking the <code>master</code> branch. (The <code>master</code> branch on Github should always be in a runnable and error-free state.)</p></li><li><p>Implement your changes.</p></li><li><p>Run an example simulation and the test suite to make sure everything works without crashing (<code>make run</code> and <code>make test</code> on Linux, or execute <code>run.jl</code> and <code>test/runtests.jl</code> manually.)</p></li><li><p>Commit your work frequently, and try to keep each commit small. Don't forget to add relevant tests to the test suite.</p></li><li><p>Once your satisfied with your work, do another pull/merge from the <code>master</code> branch in case somebody else changed the branch in the meantime. Then merge your work into <code>master</code> and push to the Gitlab server.</p></li><li><p>Repeat :-)</p></li></ol><p>The Gitlab <a href="https://git.idiv.de/persefone/persefone-model/-/boards/373">issue tracker</a> can be used to create, discuss, and assign tasks, as well as to monitor progress towards milestones/releases. Once we have a first release, we will start using <a href="https://semver.org/">semantic versioning</a> and a <a href="https://keepachangelog.com/en/1.0.0/">changelog</a>.</p><h2 id="Important-libraries"><a class="docs-heading-anchor" href="#Important-libraries">Important libraries</a><a id="Important-libraries-1"></a><a class="docs-heading-anchor-permalink" href="#Important-libraries" title="Permalink"></a></h2><h3 id="Revise.jl"><a class="docs-heading-anchor" href="#Revise.jl">Revise.jl</a><a id="Revise.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Revise.jl" title="Permalink"></a></h3><p><a href="https://timholy.github.io/Revise.jl/stable/"><code>Revise.jl</code></a> allows one to reload code without restarting the Julia interpreter. Get it with <code>Pkg.add("Revise")</code>, then add <code>using Revise</code> to <code>.julia/config/startup.jl</code> to have it automatically available.</p><h3 id="Test"><a class="docs-heading-anchor" href="#Test">Test</a><a id="Test-1"></a><a class="docs-heading-anchor-permalink" href="#Test" title="Permalink"></a></h3><p>Persefone uses the inbuilt Julia <a href="https://docs.julialang.org/en/v1/stdlib/Test/">testing framework</a>. All new functions should have appropriate tests written for them in the appropriate file in the <code>test</code> directory. (See <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/test/runtests.jl"><code>test/runtests.jl</code></a> for details.) There are three ways to run the test suite: in the terminal, executing <code>make test</code> or <code>cd test; julia runtests.jl</code>; or in the Julia REPL, <code>Pkg.activate("."); Pkg.test()</code>.</p><h3 id="Documenter.jl"><a class="docs-heading-anchor" href="#Documenter.jl">Documenter.jl</a><a id="Documenter.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Documenter.jl" title="Permalink"></a></h3><p>The HTML documentation is generated using <a href="https://documenter.juliadocs.org">Documenter.jl</a>. Therefore, all new functions should have docstrings attached. New files need to be integrated into the relevant documentation source files in <code>docs/src</code>, and if necessary into <a href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master/docs/builddocs.jl"><code>docs/builddocs.jl</code></a>. To build the documentation, run <code>make docs</code>, or <code>cd docs; julia builddocs.jl</code> (if using the latter, don't forget to update the date and commit in <code>docs/src/index.md</code>).</p><h3 id="Graphics-and-user-interface"><a class="docs-heading-anchor" href="#Graphics-and-user-interface">Graphics and user interface</a><a id="Graphics-and-user-interface-1"></a><a class="docs-heading-anchor-permalink" href="#Graphics-and-user-interface" title="Permalink"></a></h3><p>Persefone uses <a href="https://makie.org/">Makie</a> as a plotting library to generate its output graphics. Additionally, Persefone Desktop uses <a href="https://github.com/JuliaGraphics/QML.jl">QML.jl</a> to create its graphical user interface.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="config.html">« Configuration</a><a class="docs-footer-nextpage" href="adapting.html">Adapting Persefone »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/energy.html b/docs/build/energy.html index 41a9d15aa95c541e1c308409aa9df192d4fe3d94..773842408b96390b69fd1516d436d8eef20f1279 100644 --- a/docs/build/energy.html +++ b/docs/build/energy.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Dynamic Energy Budgets · Persefone</title><meta name="title" content="Dynamic Energy Budgets · Persefone"/><meta property="og:title" content="Dynamic Energy Budgets · Persefone"/><meta property="twitter:title" content="Dynamic Energy Budgets · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li class="is-active"><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a><ul class="internal"><li><a class="tocitem" href="#energy.jl"><span>energy.jl</span></a></li></ul></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="energy.html">Dynamic Energy Budgets</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="energy.html">Dynamic Energy Budgets</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/energy.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Dynamic-Energy-Budgets"><a class="docs-heading-anchor" href="#Dynamic-Energy-Budgets">Dynamic Energy Budgets</a><a id="Dynamic-Energy-Budgets-1"></a><a class="docs-heading-anchor-permalink" href="#Dynamic-Energy-Budgets" title="Permalink"></a></h1><p>Persefone's nature module uses Kooijman's Dynamic Energy Budget theory to model energy flows within individuals.</p><p><img src="assets/deb.png" alt=""The standard model of the Dynamic Energy Budget theory""/></p><p><em>The standard model of the Dynamic Energy Budget theory. (Fig. 1 from Sousa et al. (2010).)</em></p><ul><li><p><a href="https://doi.org/10.1098/rstb.2010.0166">Sousa et al. (2010)</a>. Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428.</p></li><li><p><a href="https://www.researchgate.net/profile/Edgar-Meza-3/post/Is_there_a_toxicokinetic_model_for_daphnia_magna_or_other_zooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf">Kooijman, S. A. L. M. (2009)</a>. Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press.</p></li><li><p><a href="https://doi.org/10.1111/2041-210x.12002">Sibly et al. (2013)</a>. Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161.</p></li></ul><h2 id="energy.jl"><a class="docs-heading-anchor" href="#energy.jl">energy.jl</a><a id="energy.jl-1"></a><a class="docs-heading-anchor-permalink" href="#energy.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.DEBparameters" href="#Persefone.DEBparameters"><code>Persefone.DEBparameters</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">DEBparameters</code></pre><p>An immutable struct to save the parameter list for a species' Dynamic Energy Budget model. (See Sousa et al., 2010.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L9-L14">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.EnergyBudget" href="#Persefone.EnergyBudget"><code>Persefone.EnergyBudget</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">EnergyBudget</code></pre><p>This struct represents an individual's energy balance, as conceptualised by the Dynamic Energy Budget theory. Upon assimilation, energy is first stored as biomass in a reserve buffer, before being used for maintenance, growth, and reproduction. (Note that this is a simplified model form which ignores maturity as a separate buffer.)</p><p><strong>Sources:</strong></p><ul><li>Malishev & Kramer-Schadt (2021). Movement, models, and metabolism: Individual-based energy budget models as next-generation extensions for predicting animal movement outcomes across scales. Ecological Modelling, 441, 109413. https://doi.org/10.1016/j.ecolmodel.2020.109413</li><li>Marques et al. (2018). The AmP project: Comparing species on the basis of dynamic energy budget parameters. PLOS Computational Biology,14(5), e1006100. https://doi.org/10.1371/journal.pcbi.1006100</li><li>Sibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161. https://doi.org/10.1111/2041-210x.12002</li><li>Sousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428. https://doi.org/10.1098/rstb.2010.0166</li><li>Kooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press. https://www.researchgate.net/profile/Edgar-Meza-3/post/Is<em>there</em>a<em>toxicokinetic</em>model<em>for</em>daphnia<em>magna</em>or<em>other</em>zooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf</li><li><em>see also:</em> Brown et al. (2004). Toward a metabolic theory of ecology. Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L30-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}" href="#Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}"><code>Persefone.feed!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">feed!(quantity, energybudget)</code></pre><p>Consume a given quantity of food. Expands the energy reserve by an amount determined by the assimilation rate. Returns <code>true</code> if successful, <code>false</code> if the reserve is already full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L207-L213">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.growthrate-Tuple{Persefone.EnergyBudget}" href="#Persefone.growthrate-Tuple{Persefone.EnergyBudget}"><code>Persefone.growthrate</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">growthrate(energybudget)</code></pre><p>Calculate the specific growth rate r. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L115-L120">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.investmentratio-Tuple{Persefone.EnergyBudget}" href="#Persefone.investmentratio-Tuple{Persefone.EnergyBudget}"><code>Persefone.investmentratio</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">investmentratio(energybudget)</code></pre><p>Calculate the investment ratio g. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L99-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}" href="#Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}"><code>Persefone.maturitymaintenance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">maturitymaintenance(energybudget)</code></pre><p>Calculate the specific maturity maintenance k_J. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L71-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.mobilisation-Tuple{Persefone.EnergyBudget}" href="#Persefone.mobilisation-Tuple{Persefone.EnergyBudget}"><code>Persefone.mobilisation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">mobilisation(energybudget)</code></pre><p>Calculate the mobilisation rate J_EC. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L136-L141">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.reproduce!-Tuple{Persefone.EnergyBudget}" href="#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}"><code>Persefone.reproduce!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">reproduce!(energybudget)</code></pre><p>If there is sufficient energy in the <code>offspring</code> buffer of an adult, produce an embryo/egg, reducing the parent energy in the process. Returns the embryo's energy budget, or <code>nothing</code> if the conditions are not met.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L234-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}" href="#Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}"><code>Persefone.scaledreservedensity</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">scaledreservedensity(energybudget)</code></pre><p>Calculate the scaled reserve density e. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L85-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.update!-Tuple{Persefone.EnergyBudget}" href="#Persefone.update!-Tuple{Persefone.EnergyBudget}"><code>Persefone.update!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">update!(energybudget)</code></pre><p>Carry out a daily update of the energy budget. Mobilises reserves and allocates these to maintenance (prioritised), growth, and reproduction.</p><p>Return <code>true</code> if the individual has enough energy to survive, or <code>false</code> if the reserve is empty and it starves.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L154-L162">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}" href="#Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}"><code>Persefone.volumetriclength</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">volumetriclength(energybudget)</code></pre><p>Calculate the structural length in cm based on an individual's weight (assuming a density of 1 g/cm³ to calculate volume, see Kooijman 2009).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/energy.jl#L58-L63">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="nature.html">« Nature</a><a class="docs-footer-nextpage" href="species.html">Species »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Dynamic Energy Budgets · Persefone.jl</title><meta name="title" content="Dynamic Energy Budgets · Persefone.jl"/><meta property="og:title" content="Dynamic Energy Budgets · Persefone.jl"/><meta property="twitter:title" content="Dynamic Energy Budgets · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li class="is-active"><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a><ul class="internal"><li><a class="tocitem" href="#energy.jl"><span>energy.jl</span></a></li></ul></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="energy.html">Dynamic Energy Budgets</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="energy.html">Dynamic Energy Budgets</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/energy.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Dynamic-Energy-Budgets"><a class="docs-heading-anchor" href="#Dynamic-Energy-Budgets">Dynamic Energy Budgets</a><a id="Dynamic-Energy-Budgets-1"></a><a class="docs-heading-anchor-permalink" href="#Dynamic-Energy-Budgets" title="Permalink"></a></h1><p>Persefone's nature module uses Kooijman's Dynamic Energy Budget theory to model energy flows within individuals.</p><p><img src="assets/deb.png" alt=""The standard model of the Dynamic Energy Budget theory""/></p><p><em>The standard model of the Dynamic Energy Budget theory. (Fig. 1 from Sousa et al. (2010).)</em></p><ul><li><p><a href="https://doi.org/10.1098/rstb.2010.0166">Sousa et al. (2010)</a>. Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428.</p></li><li><p><a href="https://www.researchgate.net/profile/Edgar-Meza-3/post/Is_there_a_toxicokinetic_model_for_daphnia_magna_or_other_zooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf">Kooijman, S. A. L. M. (2009)</a>. Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press.</p></li><li><p><a href="https://doi.org/10.1111/2041-210x.12002">Sibly et al. (2013)</a>. Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161.</p></li></ul><h2 id="energy.jl"><a class="docs-heading-anchor" href="#energy.jl">energy.jl</a><a id="energy.jl-1"></a><a class="docs-heading-anchor-permalink" href="#energy.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.DEBparameters" href="#Persefone.DEBparameters"><code>Persefone.DEBparameters</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">DEBparameters</code></pre><p>An immutable struct to save the parameter list for a species' Dynamic Energy Budget model. (See Sousa et al., 2010.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L9-L14">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.EnergyBudget" href="#Persefone.EnergyBudget"><code>Persefone.EnergyBudget</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">EnergyBudget</code></pre><p>This struct represents an individual's energy balance, as conceptualised by the Dynamic Energy Budget theory. Upon assimilation, energy is first stored as biomass in a reserve buffer, before being used for maintenance, growth, and reproduction. (Note that this is a simplified model form which ignores maturity as a separate buffer.)</p><p><strong>Sources:</strong></p><ul><li>Malishev & Kramer-Schadt (2021). Movement, models, and metabolism: Individual-based energy budget models as next-generation extensions for predicting animal movement outcomes across scales. Ecological Modelling, 441, 109413. https://doi.org/10.1016/j.ecolmodel.2020.109413</li><li>Marques et al. (2018). The AmP project: Comparing species on the basis of dynamic energy budget parameters. PLOS Computational Biology,14(5), e1006100. https://doi.org/10.1371/journal.pcbi.1006100</li><li>Sibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161. https://doi.org/10.1111/2041-210x.12002</li><li>Sousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428. https://doi.org/10.1098/rstb.2010.0166</li><li>Kooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press. https://www.researchgate.net/profile/Edgar-Meza-3/post/Is<em>there</em>a<em>toxicokinetic</em>model<em>for</em>daphnia<em>magna</em>or<em>other</em>zooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf</li><li><em>see also:</em> Brown et al. (2004). Toward a metabolic theory of ecology. Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L30-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}" href="#Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}"><code>Persefone.feed!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">feed!(quantity, energybudget)</code></pre><p>Consume a given quantity of food. Expands the energy reserve by an amount determined by the assimilation rate. Returns <code>true</code> if successful, <code>false</code> if the reserve is already full.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L207-L213">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.growthrate-Tuple{Persefone.EnergyBudget}" href="#Persefone.growthrate-Tuple{Persefone.EnergyBudget}"><code>Persefone.growthrate</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">growthrate(energybudget)</code></pre><p>Calculate the specific growth rate r. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L115-L120">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.investmentratio-Tuple{Persefone.EnergyBudget}" href="#Persefone.investmentratio-Tuple{Persefone.EnergyBudget}"><code>Persefone.investmentratio</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">investmentratio(energybudget)</code></pre><p>Calculate the investment ratio g. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L99-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}" href="#Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}"><code>Persefone.maturitymaintenance</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">maturitymaintenance(energybudget)</code></pre><p>Calculate the specific maturity maintenance k_J. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L71-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.mobilisation-Tuple{Persefone.EnergyBudget}" href="#Persefone.mobilisation-Tuple{Persefone.EnergyBudget}"><code>Persefone.mobilisation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">mobilisation(energybudget)</code></pre><p>Calculate the mobilisation rate J_EC. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L136-L141">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.reproduce!-Tuple{Persefone.EnergyBudget}" href="#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}"><code>Persefone.reproduce!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">reproduce!(energybudget)</code></pre><p>If there is sufficient energy in the <code>offspring</code> buffer of an adult, produce an embryo/egg, reducing the parent energy in the process. Returns the embryo's energy budget, or <code>nothing</code> if the conditions are not met.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L234-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}" href="#Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}"><code>Persefone.scaledreservedensity</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">scaledreservedensity(energybudget)</code></pre><p>Calculate the scaled reserve density e. (Internal function.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L85-L90">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.update!-Tuple{Persefone.EnergyBudget}" href="#Persefone.update!-Tuple{Persefone.EnergyBudget}"><code>Persefone.update!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">update!(energybudget)</code></pre><p>Carry out a daily update of the energy budget. Mobilises reserves and allocates these to maintenance (prioritised), growth, and reproduction.</p><p>Return <code>true</code> if the individual has enough energy to survive, or <code>false</code> if the reserve is empty and it starves.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L154-L162">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}" href="#Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}"><code>Persefone.volumetriclength</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">volumetriclength(energybudget)</code></pre><p>Calculate the structural length in cm based on an individual's weight (assuming a density of 1 g/cm³ to calculate volume, see Kooijman 2009).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/energy.jl#L58-L63">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="nature.html">« Nature</a><a class="docs-footer-nextpage" href="species.html">Species »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/farm.html b/docs/build/farm.html index 490a8c868b5a65f025dc3f1819fdc9f59e7f55d6..23b88ca623295152c5120859f19947240c9df683 100644 --- a/docs/build/farm.html +++ b/docs/build/farm.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Farm submodel · Persefone</title><meta name="title" content="Farm submodel · Persefone"/><meta property="og:title" content="Farm submodel · Persefone"/><meta property="twitter:title" content="Farm submodel · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li class="is-active"><a class="tocitem" href="farm.html">Farm submodel</a><ul class="internal"><li><a class="tocitem" href="#farm.jl"><span>farm.jl</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="farm.html">Farm submodel</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="farm.html">Farm submodel</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/farm.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Farm-submodel"><a class="docs-heading-anchor" href="#Farm-submodel">Farm submodel</a><a id="Farm-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Farm-submodel" title="Permalink"></a></h1><p>Eventually, the aim is to create a full socio-economic farm decision model for Persefone. However, for the time being, we will restrict ourselves to a simple model that executes typical farm operations and crop rotations.</p><h2 id="farm.jl"><a class="docs-heading-anchor" href="#farm.jl">farm.jl</a><a id="farm.jl-1"></a><a class="docs-heading-anchor-permalink" href="#farm.jl" title="Permalink"></a></h2><p>This file is responsible for managing the farm module(s).</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Farmer" href="#Persefone.Farmer"><code>Persefone.Farmer</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Farmer</code></pre><p>This is the agent type for the farm ABM. (Not yet implemented.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/farm/farm.jl#L6-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initfarms!-Tuple{Agents.AgentBasedModel}" href="#Persefone.initfarms!-Tuple{Agents.AgentBasedModel}"><code>Persefone.initfarms!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initfarms!(model)</code></pre><p>Initialise the model with a set of farm agents.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/farm/farm.jl#L26-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{Farmer, Agents.AgentBasedModel}" href="#Persefone.stepagent!-Tuple{Farmer, Agents.AgentBasedModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(farmer, model)</code></pre><p>Update a farmer by one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/farm/farm.jl#L17-L21">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="crops.html">« Crop submodel</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Farm submodel · Persefone.jl</title><meta name="title" content="Farm submodel · Persefone.jl"/><meta property="og:title" content="Farm submodel · Persefone.jl"/><meta property="twitter:title" content="Farm submodel · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li class="is-active"><a class="tocitem" href="farm.html">Farm submodel</a><ul class="internal"><li><a class="tocitem" href="#farm.jl"><span>farm.jl</span></a></li></ul></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="farm.html">Farm submodel</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="farm.html">Farm submodel</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/farm.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Farm-submodel"><a class="docs-heading-anchor" href="#Farm-submodel">Farm submodel</a><a id="Farm-submodel-1"></a><a class="docs-heading-anchor-permalink" href="#Farm-submodel" title="Permalink"></a></h1><p>Eventually, the aim is to create a full socio-economic farm decision model for Persefone. However, for the time being, we will restrict ourselves to a simple model that executes typical farm operations and crop rotations.</p><h2 id="farm.jl"><a class="docs-heading-anchor" href="#farm.jl">farm.jl</a><a id="farm.jl-1"></a><a class="docs-heading-anchor-permalink" href="#farm.jl" title="Permalink"></a></h2><p>This file is responsible for managing the farm module(s).</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Farmer" href="#Persefone.Farmer"><code>Persefone.Farmer</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Farmer</code></pre><p>This is the agent type for the farm ABM. (Not yet implemented.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/farm/farm.jl#L6-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initfarms!-Tuple{SimulationModel}" href="#Persefone.initfarms!-Tuple{SimulationModel}"><code>Persefone.initfarms!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initfarms!(model)</code></pre><p>Initialise the model with a set of farm agents.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/farm/farm.jl#L29-L33">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{Farmer, SimulationModel}" href="#Persefone.stepagent!-Tuple{Farmer, SimulationModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(farmer, model)</code></pre><p>Update a farmer by one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/farm/farm.jl#L20-L24">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="crops.html">« Crop submodel</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/gis.html b/docs/build/gis.html index 98853d3171291f0c65d5ceaab2351304be9ea5ef..cc62ca3ec31539dff1081c77e9994db20ebe62a6 100644 --- a/docs/build/gis.html +++ b/docs/build/gis.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Maps and weather data · Persefone</title><meta name="title" content="Maps and weather data · Persefone"/><meta property="og:title" content="Maps and weather data · Persefone"/><meta property="twitter:title" content="Maps and weather data · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li class="is-active"><a class="tocitem" href="gis.html">Maps and weather data</a><ul class="internal"><li><a class="tocitem" href="#Land-cover-maps"><span>Land cover maps</span></a></li><li><a class="tocitem" href="#Field-ID-maps"><span>Field ID maps</span></a></li><li><a class="tocitem" href="#Weather-data"><span>Weather data</span></a></li></ul></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="gis.html">Maps and weather data</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="gis.html">Maps and weather data</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/gis.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Maps-and-weather-data"><a class="docs-heading-anchor" href="#Maps-and-weather-data">Maps and weather data</a><a id="Maps-and-weather-data-1"></a><a class="docs-heading-anchor-permalink" href="#Maps-and-weather-data" title="Permalink"></a></h1><p>Persefone currently requires two separate map input files: one for land cover, the other for field geometry. Additionally, a weather input file is needed. This documents describe how to obtain and process the data needed for each of these.</p><h2 id="Land-cover-maps"><a class="docs-heading-anchor" href="#Land-cover-maps">Land cover maps</a><a id="Land-cover-maps-1"></a><a class="docs-heading-anchor-permalink" href="#Land-cover-maps" title="Permalink"></a></h2><p>Land cover maps for Germany at 10m resolution can be obtained from <a href="https://data.mundialis.de/geonetwork/srv/eng/catalog.search#/metadata/9246503f-6adf-460b-a31e-73a649182d07">Mundialis</a>. These are generated annually from Sentinel data and comprise the following land cover classes:</p><pre><code class="nohighlight hljs">10: forest +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Maps and weather data · Persefone.jl</title><meta name="title" content="Maps and weather data · Persefone.jl"/><meta property="og:title" content="Maps and weather data · Persefone.jl"/><meta property="twitter:title" content="Maps and weather data · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li class="is-active"><a class="tocitem" href="gis.html">Maps and weather data</a><ul class="internal"><li><a class="tocitem" href="#Land-cover-maps"><span>Land cover maps</span></a></li><li><a class="tocitem" href="#Field-ID-maps"><span>Field ID maps</span></a></li><li><a class="tocitem" href="#Weather-data"><span>Weather data</span></a></li></ul></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="gis.html">Maps and weather data</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="gis.html">Maps and weather data</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/gis.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Maps-and-weather-data"><a class="docs-heading-anchor" href="#Maps-and-weather-data">Maps and weather data</a><a id="Maps-and-weather-data-1"></a><a class="docs-heading-anchor-permalink" href="#Maps-and-weather-data" title="Permalink"></a></h1><p>Persefone currently requires two separate map input files: one for land cover, the other for field geometry. Additionally, a weather input file is needed. This documents describe how to obtain and process the data needed for each of these.</p><h2 id="Land-cover-maps"><a class="docs-heading-anchor" href="#Land-cover-maps">Land cover maps</a><a id="Land-cover-maps-1"></a><a class="docs-heading-anchor-permalink" href="#Land-cover-maps" title="Permalink"></a></h2><p>Land cover maps for Germany at 10m resolution can be obtained from <a href="https://data.mundialis.de/geonetwork/srv/eng/catalog.search#/metadata/9246503f-6adf-460b-a31e-73a649182d07">Mundialis</a>. These are generated annually from Sentinel data and comprise the following land cover classes:</p><pre><code class="nohighlight hljs">10: forest 20: low vegetation 30: water 40: built-up @@ -26,4 +26,4 @@ weather = data %>% min_temperature=na_if(TNK, -999), TNK=NULL) ## replace with the desired file name -write.csv(weather, file="weather_jena.csv", row.names=FALSE)</code></pre><p><em>Note: for calculating the reference evapotranspiration ET_0 (needed for the AquaCrop model), use the <a href="https://www.fao.org/3/X0490E/x0490e06.htm#equation">FAO Penman-Monteith equation</a>.</em></p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="architecture.html">« Source code architecture</a><a class="docs-footer-nextpage" href="species-dsl.html">Defining new species »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +write.csv(weather, file="weather_jena.csv", row.names=FALSE)</code></pre><p><em>Note: for calculating the reference evapotranspiration ET_0 (needed for the AquaCrop model), use the <a href="https://www.fao.org/3/X0490E/x0490e06.htm#equation">FAO Penman-Monteith equation</a>.</em></p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="architecture.html">« Source code architecture</a><a class="docs-footer-nextpage" href="species-dsl.html">Defining new species »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/gui.html b/docs/build/gui.html index fbf875cd67d7700e9065b34bf9e38bbf623c9492..2ed93694c4d9d26e13131e373768572e1b5b0ccb 100644 --- a/docs/build/gui.html +++ b/docs/build/gui.html @@ -1,7 +1,7 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Graphical User Interface · Persefone</title><meta name="title" content="Graphical User Interface · Persefone"/><meta property="og:title" content="Graphical User Interface · Persefone"/><meta property="twitter:title" content="Graphical User Interface · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li class="is-active"><a class="tocitem" href="gui.html">Graphical User Interface</a><ul class="internal"><li><a class="tocitem" href="#Install-and-run"><span>Install and run</span></a></li><li><a class="tocitem" href="#User-interface"><span>User interface</span></a></li></ul></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="gui.html">Graphical User Interface</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="gui.html">Graphical User Interface</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/gui.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Graphical-User-Interface"><a class="docs-heading-anchor" href="#Graphical-User-Interface">Graphical User Interface</a><a id="Graphical-User-Interface-1"></a><a class="docs-heading-anchor-permalink" href="#Graphical-User-Interface" title="Permalink"></a></h1><p>Due to the computational demands of simulating many individuals at high temporal and spatial resolution, Persefone.jl is primarily designed to be run non-interactively on an HPC. However, to allow interactive exploratory simulations to be conducted while learning or developing the model, a graphical user interface is available as an additional package: <a href="https://git.idiv.de/persefone/persefone-desktop">Persefone Desktop</a>.</p><h2 id="Install-and-run"><a class="docs-heading-anchor" href="#Install-and-run">Install and run</a><a id="Install-and-run-1"></a><a class="docs-heading-anchor-permalink" href="#Install-and-run" title="Permalink"></a></h2><p><em>For more detailed installation instructions, see <a href="developing.html">here</a>.</em></p><p><strong>To install:</strong> Install <a href="https://julialang.org/downloads/">Julia</a> and download/clone the <a href="https://git.idiv.de/persefone/persefone-desktop">repository</a>. Open a Julia REPL in the downloaded folder and execute the following to install all dependencies:</p><pre><code class="language-julia hljs">using Pkg +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Graphical User Interface · Persefone.jl</title><meta name="title" content="Graphical User Interface · Persefone.jl"/><meta property="og:title" content="Graphical User Interface · Persefone.jl"/><meta property="twitter:title" content="Graphical User Interface · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li class="is-active"><a class="tocitem" href="gui.html">Graphical User Interface</a><ul class="internal"><li><a class="tocitem" href="#Install-and-run"><span>Install and run</span></a></li><li><a class="tocitem" href="#User-interface"><span>User interface</span></a></li></ul></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="gui.html">Graphical User Interface</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="gui.html">Graphical User Interface</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/gui.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Graphical-User-Interface"><a class="docs-heading-anchor" href="#Graphical-User-Interface">Graphical User Interface</a><a id="Graphical-User-Interface-1"></a><a class="docs-heading-anchor-permalink" href="#Graphical-User-Interface" title="Permalink"></a></h1><p>Due to the computational demands of simulating many individuals at high temporal and spatial resolution, Persefone.jl is primarily designed to be run non-interactively on an HPC. However, to allow interactive exploratory simulations to be conducted while learning or developing the model, a graphical user interface is available as an additional package: <a href="https://git.idiv.de/persefone/persefone-desktop">Persefone Desktop</a>.</p><h2 id="Install-and-run"><a class="docs-heading-anchor" href="#Install-and-run">Install and run</a><a id="Install-and-run-1"></a><a class="docs-heading-anchor-permalink" href="#Install-and-run" title="Permalink"></a></h2><p><em>For more detailed installation instructions, see <a href="developing.html">here</a>.</em></p><p><strong>To install:</strong> Install <a href="https://julialang.org/downloads/">Julia</a> and download/clone the <a href="https://git.idiv.de/persefone/persefone-desktop">repository</a>. Open a Julia REPL in the downloaded folder and execute the following to install all dependencies:</p><pre><code class="language-julia hljs">using Pkg Pkg.activate(".") Pkg.instantiate()</code></pre><p><strong>To run:</strong> Run <code>desktop.jl</code>. Alternatively, open a Julia REPL in this folder and run:</p><pre><code class="language-julia hljs">using Pkg Pkg.activate(".") using PersefoneDesktop -launch()</code></pre><p><em>Note:</em> Due to the necessary pre-compilation done by Julia, installing and launching the application can take quite a long time. (Start-up time with <code>desktop.jl</code> is currently about 2 minutes.) We will reduce this as much as possible in future releases.</p><h2 id="User-interface"><a class="docs-heading-anchor" href="#User-interface">User interface</a><a id="User-interface-1"></a><a class="docs-heading-anchor-permalink" href="#User-interface" title="Permalink"></a></h2><p><img src="assets/screenshot.png" alt="Persefone.jl Desktop screenshot"/></p><p>The main window component is the <strong>map view</strong>. This displays a land cover map of the simulated region: dark green are forests, light green grassland, yellow fields, red built-up areas and blue water. On it, little circles show the position of individual animals, with different species denoted by different colours.</p><h3 id="Control-bar"><a class="docs-heading-anchor" href="#Control-bar">Control bar</a><a id="Control-bar-1"></a><a class="docs-heading-anchor-permalink" href="#Control-bar" title="Permalink"></a></h3><ul><li><p><strong>Back button:</strong> Rewind the simulation by one day.</p></li><li><p><strong>Step button:</strong> Advance the simulation by one day.</p></li><li><p><strong>Run button:</strong> Run the simulation until the button is pressed again or the end date is reached.</p></li><li><p><strong>Progress bar:</strong> Shows the percentage of time elapsed between the start and end dates of the simulation.</p></li><li><p><strong>Speed slider:</strong> Set the time delay between each simulation step when running.</p></li><li><p><strong>Date:</strong> Shows the simulation date currently displayed on the map.</p></li></ul><h3 id="Menu-bar"><a class="docs-heading-anchor" href="#Menu-bar">Menu bar</a><a id="Menu-bar-1"></a><a class="docs-heading-anchor-permalink" href="#Menu-bar" title="Permalink"></a></h3><p><strong>Simulation:</strong></p><ul><li><p><strong>New simulation:</strong> Reset the model and start over.</p></li><li><p><strong>Configure simulation:</strong> Change the model settings (<em>not yet implemented</em>).</p></li><li><p><strong>Load saved state:</strong> Load a model object file saved by a previous simulation run.</p></li><li><p><strong>Save current state:</strong> Save a model object file for later use.</p></li><li><p><strong>Quit:</strong> Close the application.</p></li></ul><p><strong>Data:</strong></p><ul><li><p><strong>Show population graph:</strong> Show a window with a graph of population sizes over time in the current model run.</p></li><li><p><strong>Save simulation output:</strong> Save the model output data to file (saves both raw CSV data and generated graphics).</p></li></ul><p><strong>Help:</strong></p><ul><li><p><strong>Documentation:</strong> Open the Persefone.jl online documentation in a browser.</p></li><li><p><strong>Website:</strong> Open the main Persefone.jl website in a browser.</p></li><li><p><strong>About:</strong> Show a window with core information about the application.</p></li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="using.html">« The Persefone.jl Package</a><a class="docs-footer-nextpage" href="config.html">Configuration »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +launch()</code></pre><p><em>Note:</em> Due to the necessary pre-compilation done by Julia, installing and launching the application can take quite a long time. (Start-up time with <code>desktop.jl</code> is currently about 2 minutes.) We will reduce this as much as possible in future releases.</p><h2 id="User-interface"><a class="docs-heading-anchor" href="#User-interface">User interface</a><a id="User-interface-1"></a><a class="docs-heading-anchor-permalink" href="#User-interface" title="Permalink"></a></h2><p><img src="assets/screenshot.png" alt="Persefone.jl Desktop screenshot"/></p><p>The main window component is the <strong>map view</strong>. This displays a land cover map of the simulated region: dark green are forests, light green grassland, yellow fields, red built-up areas and blue water. On it, little circles show the position of individual animals, with different species denoted by different colours.</p><h3 id="Control-bar"><a class="docs-heading-anchor" href="#Control-bar">Control bar</a><a id="Control-bar-1"></a><a class="docs-heading-anchor-permalink" href="#Control-bar" title="Permalink"></a></h3><ul><li><p><strong>Back button:</strong> Rewind the simulation by one day.</p></li><li><p><strong>Step button:</strong> Advance the simulation by one day.</p></li><li><p><strong>Run button:</strong> Run the simulation until the button is pressed again or the end date is reached.</p></li><li><p><strong>Progress bar:</strong> Shows the percentage of time elapsed between the start and end dates of the simulation.</p></li><li><p><strong>Speed slider:</strong> Set the time delay between each simulation step when running.</p></li><li><p><strong>Date:</strong> Shows the simulation date currently displayed on the map.</p></li></ul><h3 id="Menu-bar"><a class="docs-heading-anchor" href="#Menu-bar">Menu bar</a><a id="Menu-bar-1"></a><a class="docs-heading-anchor-permalink" href="#Menu-bar" title="Permalink"></a></h3><p><strong>Simulation:</strong></p><ul><li><p><strong>New simulation:</strong> Reset the model and start over.</p></li><li><p><strong>Configure simulation:</strong> Change the model settings (<em>not yet implemented</em>).</p></li><li><p><strong>Load saved state:</strong> Load a model object file saved by a previous simulation run.</p></li><li><p><strong>Save current state:</strong> Save a model object file for later use.</p></li><li><p><strong>Quit:</strong> Close the application.</p></li></ul><p><strong>Data:</strong></p><ul><li><p><strong>Show population graph:</strong> Show a window with a graph of population sizes over time in the current model run.</p></li><li><p><strong>Save simulation output:</strong> Save the model output data to file (saves both raw CSV data and generated graphics).</p></li></ul><p><strong>Help:</strong></p><ul><li><p><strong>Documentation:</strong> Open the Persefone.jl online documentation in a browser.</p></li><li><p><strong>Website:</strong> Open the main Persefone.jl website in a browser.</p></li><li><p><strong>About:</strong> Show a window with core information about the application.</p></li></ul></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="using.html">« The Persefone.jl Package</a><a class="docs-footer-nextpage" href="config.html">Configuration »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/index.html b/docs/build/index.html index f78acaf812d3a7ed9c8b25be9f3ff6782a21816b..20a29f78711eb14d4b9490f01301ec1365dff1d2 100644 --- a/docs/build/index.html +++ b/docs/build/index.html @@ -1,42 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Introduction · Persefone</title><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.045/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.13.24/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><form class="docs-search" action="search.html"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li class="is-active"><a class="tocitem" href="index.html">Introduction</a><ul class="internal"><li><a class="tocitem" href="#Running-the-model"><span>Running the model</span></a></li><li><a class="tocitem" href="#Model-input"><span>Model input</span></a></li></ul></li><li><a class="tocitem" href="odd.html">Overview, Design, Details (ODD)</a></li><li><span class="tocitem">Developing</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input, Output, and Settings</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="index.html">Introduction</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="index.html">Introduction</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://git.idiv.de/xo30xoqa/persephone/-/blob/master//docs/src/index.md#" title="Edit source"><span class="docs-icon fa"></span><span class="docs-label is-hidden-touch">Edit source</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="Introduction"><a class="docs-heading-anchor" href="#Introduction">Introduction</a><a id="Introduction-1"></a><a class="docs-heading-anchor-permalink" href="#Introduction" title="Permalink"></a></h1><p>Persefone is an agent-based, socio-economic-ecological model of agricultural landscapes in Europe under the Common Agricultural Policy (CAP).</p><p>It's aim is to investigate how policy affects farmer decision-making, and how this in turn affects various animal species. It includes a farm submodel, a crop-growth submodel, and an ecological submodels.</p><h2 id="Running-the-model"><a class="docs-heading-anchor" href="#Running-the-model">Running the model</a><a id="Running-the-model-1"></a><a class="docs-heading-anchor-permalink" href="#Running-the-model" title="Permalink"></a></h2><p>To run a single experiment, execute <code>run.jl</code>:</p><pre><code class="nohighlight hljs">julia run.jl -c <CONFIG></code></pre><p>Other commandline arguments are:</p><pre><code class="nohighlight hljs">usage: run.jl [-c CONFIGFILE] [-s SEED] [-o OUTDIR] [-l LOGLEVEL] - [--version] [-h] - -optional arguments: - -c, --configfile CONFIGFILE - name of the configuration file - -s, --seed SEED inital random seed (type: Int64) - -o, --outdir OUTDIR location of the output directory - -l, --loglevel LOGLEVEL - verbosity: "debug", "info", or "quiet" - --version show version information and exit - -h, --help show this help message and exit</code></pre><h2 id="Model-input"><a class="docs-heading-anchor" href="#Model-input">Model input</a><a id="Model-input-1"></a><a class="docs-heading-anchor-permalink" href="#Model-input" title="Permalink"></a></h2><p>Persefone requires three input files: a configuration file and two map files. How to generate the map files is documented <a href="gis.html">elsewhere</a>. The <a href="io.html">configuration file</a> defines parameter values and looks like this (see <code>src/parameters.toml</code> for a complete list of parameters):</p><pre><code class="language-TOML hljs">### Persefone - a socio-economic-ecological model of European agricultural landscapes. -### -### This is the default configuration file for Persefone, containing all model parameters. -### The syntax is described here: https://toml.io/en/ - -[core] -configfile = "src/parameters.toml" # location of the configuration file -outdir = "results" # location and name of the output folder -overwrite = "ask" # overwrite the output directory? (true/false/"ask") -loglevel = "debug" # verbosity level: "debug", "info", "warn" -processors = 2 # number of processors to use on parallel runs -seed = 2 # seed value for the RNG (0 -> random value) -# dates to start and end the simulation -startdate = 2022-01-01 -enddate = 2022-12-31 - -[world] -landcovermap = "data/landcover_jena.tif" # location of the landcover map -farmfieldsmap = "data/fields_jena.tif" # location of the field geometry map - -[farm] -farmmodel = "FieldManager" # which version of the farm model to use (not yet implemented) - -[nature] -targetspecies = ["Wolpertinger", "Wyvern"] # list of target species to simulate -popoutfreq = "daily" # output frequency population-level data, daily/monthly/yearly/end/never -indoutfreq = "end" # output frequency individual-level data, daily/monthly/yearly/end/never - -[crop] -cropmodel = "linear" # crop growth model to use, "linear" or "aquacrop" (not yet implemented)</code></pre><div class="admonition is-info"><header class="admonition-header">Parameter scanning</header><div class="admonition-body"><p>You can set any parameter to a list of different values, e.g. <code>seed = [1,2,3]</code>. Persefone will then set up and run multiple simulations, one for every possible combination of parameters that you entered (i.e. do a full-factorial simulation experiment).</p></div></div><p><em>Last updated: 2023-07-27 (commit 1e6e7d6)</em></p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="odd.html">Overview, Design, Details (ODD) »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 0.27.23 on <span class="colophon-date" title="Thursday 27 July 2023 10:12">Thursday 27 July 2023</span>. Using Julia version 1.9.1.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Introduction · Persefone.jl</title><meta name="title" content="Introduction · Persefone.jl"/><meta property="og:title" content="Introduction · Persefone.jl"/><meta property="twitter:title" content="Introduction · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li class="is-active"><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="index.html">Introduction</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="index.html">Introduction</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/index.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><p><a href="https://persefone-model.eu"><img src="assets/persefonejl_logo_v3_splash.png" alt="Persefone.jl splash screen"/></a></p><h1 id="Introduction"><a class="docs-heading-anchor" href="#Introduction">Introduction</a><a id="Introduction-1"></a><a class="docs-heading-anchor-permalink" href="#Introduction" title="Permalink"></a></h1><p><a href="https://persefone-model.eu">Persefone.jl</a> models agricultural practice and how it impacts animal species at a landscape scale. It includes a farm submodel, a crop growth submodel, and individual-based models of multiple indicator species. Its aim is to investigate how changes in farm operations (e.g. through policy changes in the CAP) influence biodiversity.</p><p>The model is open-source software available on <a href="https://git.idiv.de/persefone/persefone-model">Gitlab</a>.</p><p><em>This documentation was last updated on 2024-06-07 for <strong>Persefone.jl v0.5.0</strong> (commit <a href="https://git.idiv.de/persefone/persefone-model/-/commit/2341a34">2341a34</a>).</em></p></article><nav class="docs-footer"><a class="docs-footer-nextpage" href="using.html">The Persefone.jl Package »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/io.html b/docs/build/io.html index 1e17a5645ed026f3fae0ac194100cb7205c0538d..8f2e0338b847f35af3b02d91fd9236c161538199 100644 --- a/docs/build/io.html +++ b/docs/build/io.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Input and Output · Persefone</title><meta name="title" content="Input and Output · Persefone"/><meta property="og:title" content="Input and Output · Persefone"/><meta property="twitter:title" content="Input and Output · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li class="is-active"><a class="tocitem" href="io.html">Input and Output</a><ul class="internal"><li><a class="tocitem" href="#input.jl"><span>input.jl</span></a></li><li><a class="tocitem" href="#output.jl"><span>output.jl</span></a></li><li><a class="tocitem" href="#makieplots.jl"><span>makieplots.jl</span></a></li></ul></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Core</a></li><li class="is-active"><a href="io.html">Input and Output</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="io.html">Input and Output</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/io.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Input-and-Output"><a class="docs-heading-anchor" href="#Input-and-Output">Input and Output</a><a id="Input-and-Output-1"></a><a class="docs-heading-anchor-permalink" href="#Input-and-Output" title="Permalink"></a></h1><p>These functions are responsible for reading in all model configurations (passed by config file or commandline), administrating them during a run, and printing or plotting any output.</p><h2 id="input.jl"><a class="docs-heading-anchor" href="#input.jl">input.jl</a><a id="input.jl-1"></a><a class="docs-heading-anchor-permalink" href="#input.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.PARAMFILE" href="#Persefone.PARAMFILE"><code>Persefone.PARAMFILE</code></a> — <span class="docstring-category">Constant</span></header><section><div><p>The file that stores all default parameters: <code>src/parameters.toml</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L9-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.flattenTOML-Tuple{Any}" href="#Persefone.flattenTOML-Tuple{Any}"><code>Persefone.flattenTOML</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">flattenTOML(dict)</code></pre><p>An internal utility function to convert the two-dimensional dict returned by <code>TOML.parsefile()</code> into a one-dimensional dict, so that instead of writing <code>settings["domain"]["param"]</code> one can use <code>settings["domain.param"]</code>. Can be reversed with <a href="io.html#Persefone.prepareTOML-Tuple{Any}"><code>prepareTOML</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L100-L107">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.getsettings" href="#Persefone.getsettings"><code>Persefone.getsettings</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">getsettings(configfile, seed=nothing)</code></pre><p>Combines all configuration options to produce a single settings dict. Precedence: commandline parameters - user config file - default values</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L37-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.loadmodelobject-Tuple{String}" href="#Persefone.loadmodelobject-Tuple{String}"><code>Persefone.loadmodelobject</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">loadmodelobject(fullfilename)</code></pre><p>Deserialise a model object that was previously saved with <code>[savemodelobject](@ref)</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L177-L181">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.parsecommandline-Tuple{}" href="#Persefone.parsecommandline-Tuple{}"><code>Persefone.parsecommandline</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">parsecommandline()</code></pre><p>Certain software parameters can be set via the commandline.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L140-L144">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}" href="#Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}"><code>Persefone.preprocessparameters</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">preprocessparameters(settings)</code></pre><p>Take the raw input parameters and process them (convert types, perform checks, etc.). This is a helper function for <a href="io.html#Persefone.getsettings"><code>getsettings</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L75-L80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@param-Tuple{Any}" href="#Persefone.@param-Tuple{Any}"><code>Persefone.@param</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@param(domainparam)</code></pre><p>Return a configuration parameter from the global settings. The argument should be in the form <code><domain>.<parameter></code>, for example <code>@param(core.outdir)</code>. Possible values for <code><domain></code> are <code>core</code>, <code>nature</code>, <code>farm</code>, or <code>crop</code>. For a full list of parameters, see <code>src/parameters.toml</code>.</p><p>Note: this macro only works in a context where the <code>model</code> object is available!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L19-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@rand-Tuple" href="#Persefone.@rand-Tuple"><code>Persefone.@rand</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@rand(args...)</code></pre><p>Return a random number or element from the sample, using the model RNG. This is a utility wrapper that can only be used a context where the <code>model</code> object is available.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L118-L124">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@shuffle!-Tuple{Any}" href="#Persefone.@shuffle!-Tuple{Any}"><code>Persefone.@shuffle!</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@shuffle!(collection)</code></pre><p>Shuffle the given collection in place, using the model RNG. This is a utility wrapper that can only be used a context where the <code>model</code> object is available.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/input.jl#L129-L135">source</a></section></article><h2 id="output.jl"><a class="docs-heading-anchor" href="#output.jl">output.jl</a><a id="output.jl-1"></a><a class="docs-heading-anchor-permalink" href="#output.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.DataOutput" href="#Persefone.DataOutput"><code>Persefone.DataOutput</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">DataOutput</code></pre><p>A struct for organising model output. This is used to collect model data in an in-memory dataframe or for CSV output. Submodels can register their own output functions using <a href="io.html#Persefone.newdataoutput!"><code>newdataoutput!</code></a>.</p><p>Struct fields: - name: a string identifier for the data collection (used as file name) - header: a list of column names - outputfunction: a function that takes a model object and returns data values to record (formatted as a vector of vectors) - frequency: how often to call the output function (daily/monthly/yearly/end/never) - plotfunction: a function that takes a model object and returns a Makie figure object (optional)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L122-L135">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.createdatadir-Tuple{String, Union{Bool, String}}" href="#Persefone.createdatadir-Tuple{String, Union{Bool, String}}"><code>Persefone.createdatadir</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">createdatadir(outdir, overwrite)</code></pre><p>Creates the output directory, dealing with possible conflicts.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L11-L15">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.modellogger-Tuple{String, String}" href="#Persefone.modellogger-Tuple{String, String}"><code>Persefone.modellogger</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">modellogger(loglevel, outdir)</code></pre><p>Create a logger object that writes output both to screen and to a logfile. This object is stored as <code>model.logger</code> and can then be used with <code>with_logger()</code>. Note: requires <a href="io.html#Persefone.createdatadir-Tuple{String, Union{Bool, String}}"><code>createdatadir</code></a> to be run first.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L32-L38">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.newdataoutput!" href="#Persefone.newdataoutput!"><code>Persefone.newdataoutput!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">newdataoutput!(model, name, header, outputfunction, frequency)</code></pre><p>Create and register a new data output. This function must be called by all submodels that want to have their output functions called regularly.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L144-L149">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.outputdata" href="#Persefone.outputdata"><code>Persefone.outputdata</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">outputdata(model, force=false)</code></pre><p>Cycle through all registered data outputs and activate them according to their configured frequency. If <code>force</code> is <code>true</code>, activate all outputs regardless of their configuration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L174-L180">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.prepareTOML-Tuple{Any}" href="#Persefone.prepareTOML-Tuple{Any}"><code>Persefone.prepareTOML</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">prepareTOML(dict)</code></pre><p>An internal utility function to re-convert the one-dimensional dict created by <a href="io.html#Persefone.flattenTOML-Tuple{Any}"><code>flattenTOML</code></a> into the two-dimensional dict needed by <code>TOML.print</code>, and convert any data types into TOML-compatible types where necessary.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L100-L106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.saveinputfiles-Tuple{Agents.AgentBasedModel}" href="#Persefone.saveinputfiles-Tuple{Agents.AgentBasedModel}"><code>Persefone.saveinputfiles</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">saveinputfiles(model)</code></pre><p>Copy all input files into the output directory, including the actual parameter settings used. This allows replicating a run in future.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L66-L71">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.savemodelobject-Tuple{Agents.AgentBasedModel, String}" href="#Persefone.savemodelobject-Tuple{Agents.AgentBasedModel, String}"><code>Persefone.savemodelobject</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">savemodelobject(model, filename)</code></pre><p>Serialise a model object and save it to file for later reference. Includes the current model and Julia versions for compatibility checking.</p><p>WARNING: produces large files (>100 MB) and takes a while to execute.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L228-L235">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.visualiseoutput" href="#Persefone.visualiseoutput"><code>Persefone.visualiseoutput</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">visualiseoutput(model)</code></pre><p>Cycle through all data outputs and call their respective plot functions, saving each figure as a PDF.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L212-L217">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.withtestlogger-Tuple{Agents.AgentBasedModel}" href="#Persefone.withtestlogger-Tuple{Agents.AgentBasedModel}"><code>Persefone.withtestlogger</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">withtestlogger(model)</code></pre><p>Replace the model logger with the currently active logger. This is intended to be used in the testsuite to circumvent a <a href="https://github.com/JuliaLang/julia/issues/48456">Julia issue</a>, where <code>@test_logs</code> doesn't work with local loggers.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/output.jl#L52-L58">source</a></section></article><h2 id="makieplots.jl"><a class="docs-heading-anchor" href="#makieplots.jl">makieplots.jl</a><a id="makieplots.jl-1"></a><a class="docs-heading-anchor-permalink" href="#makieplots.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.gettickmarks-Tuple{Any}" href="#Persefone.gettickmarks-Tuple{Any}"><code>Persefone.gettickmarks</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">gettickmarks(dates)</code></pre><p>Given a vector of dates, construct a selection to use as tick mark locations. Helper function for <code>[populationtrends](@ref)</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/analysis/makieplots.jl#L72-L77">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.populationtrends-Tuple{Agents.AgentBasedModel}" href="#Persefone.populationtrends-Tuple{Agents.AgentBasedModel}"><code>Persefone.populationtrends</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">populationtrends(model)</code></pre><p>Plot a line graph of population sizes of each species over time. Returns a Makie figure object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/analysis/makieplots.jl#L48-L53">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.visualisemap" href="#Persefone.visualisemap"><code>Persefone.visualisemap</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">visualisemap(model, date, landcovermap)</code></pre><p>Draw the model's land cover map and plot all individuals as points on it at the specified date. If no date is passed, use the last date for which data are available. Optionally, you can pass a landcover map image (this is needed to reduce the frequency of disk I/O for Persefone Desktop). Returns a Makie figure object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/analysis/makieplots.jl#L6-L14">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="simulation.html">« Simulation</a><a class="docs-footer-nextpage" href="nature.html">Nature »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Input and Output · Persefone.jl</title><meta name="title" content="Input and Output · Persefone.jl"/><meta property="og:title" content="Input and Output · Persefone.jl"/><meta property="twitter:title" content="Input and Output · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li class="is-active"><a class="tocitem" href="io.html">Input and Output</a><ul class="internal"><li><a class="tocitem" href="#input.jl"><span>input.jl</span></a></li><li><a class="tocitem" href="#output.jl"><span>output.jl</span></a></li><li><a class="tocitem" href="#makieplots.jl"><span>makieplots.jl</span></a></li></ul></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Core</a></li><li class="is-active"><a href="io.html">Input and Output</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="io.html">Input and Output</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/io.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Input-and-Output"><a class="docs-heading-anchor" href="#Input-and-Output">Input and Output</a><a id="Input-and-Output-1"></a><a class="docs-heading-anchor-permalink" href="#Input-and-Output" title="Permalink"></a></h1><p>These functions are responsible for reading in all model configurations (passed by config file or commandline), administrating them during a run, and printing or plotting any output.</p><h2 id="input.jl"><a class="docs-heading-anchor" href="#input.jl">input.jl</a><a id="input.jl-1"></a><a class="docs-heading-anchor-permalink" href="#input.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.PARAMFILE" href="#Persefone.PARAMFILE"><code>Persefone.PARAMFILE</code></a> — <span class="docstring-category">Constant</span></header><section><div><p>The file that stores all default parameters: <code>src/parameters.toml</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L9-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.flattenTOML-Tuple{Any}" href="#Persefone.flattenTOML-Tuple{Any}"><code>Persefone.flattenTOML</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">flattenTOML(dict)</code></pre><p>An internal utility function to convert the two-dimensional dict returned by <code>TOML.parsefile()</code> into a one-dimensional dict, so that instead of writing <code>settings["domain"]["param"]</code> one can use <code>settings["domain.param"]</code>. Can be reversed with <a href="io.html#Persefone.prepareTOML-Tuple{Any}"><code>prepareTOML</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L100-L107">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.getsettings" href="#Persefone.getsettings"><code>Persefone.getsettings</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">getsettings(configfile, seed=nothing)</code></pre><p>Combines all configuration options to produce a single settings dict. Precedence: commandline parameters - user config file - default values</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L37-L42">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.loadmodelobject-Tuple{String}" href="#Persefone.loadmodelobject-Tuple{String}"><code>Persefone.loadmodelobject</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">loadmodelobject(fullfilename)</code></pre><p>Deserialise a model object that was previously saved with <code>[savemodelobject](@ref)</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L188-L192">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.parsecommandline-Tuple{}" href="#Persefone.parsecommandline-Tuple{}"><code>Persefone.parsecommandline</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">parsecommandline()</code></pre><p>Certain software parameters can be set via the commandline.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L151-L155">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}" href="#Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}"><code>Persefone.preprocessparameters</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">preprocessparameters(settings)</code></pre><p>Take the raw input parameters and process them (convert types, perform checks, etc.). This is a helper function for <a href="io.html#Persefone.getsettings"><code>getsettings</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L75-L80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@chance-Tuple{Any}" href="#Persefone.@chance-Tuple{Any}"><code>Persefone.@chance</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@chance(odds)</code></pre><p>Return true if a random number is less than the odds (0.0 <= <code>odds</code> <= 1.0), using the model RNG. This is a utility wrapper that can only be used a context where the <code>model</code> object is available.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L140-L146">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@param-Tuple{Any}" href="#Persefone.@param-Tuple{Any}"><code>Persefone.@param</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@param(domainparam)</code></pre><p>Return a configuration parameter from the global settings. The argument should be in the form <code><domain>.<parameter></code>, for example <code>@param(core.outdir)</code>. Possible values for <code><domain></code> are <code>core</code>, <code>nature</code>, <code>farm</code>, or <code>crop</code>. For a full list of parameters, see <code>src/parameters.toml</code>.</p><p>Note: this macro only works in a context where the <code>model</code> object is available!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L19-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@rand-Tuple" href="#Persefone.@rand-Tuple"><code>Persefone.@rand</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@rand(args...)</code></pre><p>Return a random number or element from the sample, using the model RNG. This is a utility wrapper that can only be used a context where the <code>model</code> object is available.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L118-L124">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@shuffle!-Tuple{Any}" href="#Persefone.@shuffle!-Tuple{Any}"><code>Persefone.@shuffle!</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@shuffle!(collection)</code></pre><p>Shuffle the given collection in place, using the model RNG. This is a utility wrapper that can only be used a context where the <code>model</code> object is available.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/input.jl#L129-L135">source</a></section></article><h2 id="output.jl"><a class="docs-heading-anchor" href="#output.jl">output.jl</a><a id="output.jl-1"></a><a class="docs-heading-anchor-permalink" href="#output.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.DataOutput" href="#Persefone.DataOutput"><code>Persefone.DataOutput</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">DataOutput</code></pre><p>A struct for organising model output. This is used to collect model data in an in-memory dataframe or for CSV output. Submodels can register their own output functions using <a href="io.html#Persefone.newdataoutput!"><code>newdataoutput!</code></a>.</p><p>Struct fields: - name: a string identifier for the data collection (used as file name) - header: a list of column names - outputfunction: a function that takes a model object and returns data values to record (formatted as a vector of vectors) - frequency: how often to call the output function (daily/monthly/yearly/end/never) - plotfunction: a function that takes a model object and returns a Makie figure object (optional)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L129-L142">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.createdatadir-Tuple{String, Union{Bool, String}}" href="#Persefone.createdatadir-Tuple{String, Union{Bool, String}}"><code>Persefone.createdatadir</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">createdatadir(outdir, overwrite)</code></pre><p>Creates the output directory, dealing with possible conflicts.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L11-L15">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.modellogger" href="#Persefone.modellogger"><code>Persefone.modellogger</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">modellogger(loglevel, outdir, output="both")</code></pre><p>Create a logger object that writes output both to screen and to a logfile. This object is stored as <code>model.logger</code> and can then be used with <code>with_logger()</code>. Note: requires <a href="io.html#Persefone.createdatadir-Tuple{String, Union{Bool, String}}"><code>createdatadir</code></a> to be run first.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L32-L38">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.newdataoutput!" href="#Persefone.newdataoutput!"><code>Persefone.newdataoutput!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">newdataoutput!(model, name, header, outputfunction, frequency)</code></pre><p>Create and register a new data output. This function must be called by all submodels that want to have their output functions called regularly.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L151-L156">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.outputdata" href="#Persefone.outputdata"><code>Persefone.outputdata</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">outputdata(model, force=false)</code></pre><p>Cycle through all registered data outputs and activate them according to their configured frequency. If <code>force</code> is <code>true</code>, activate all outputs regardless of their configuration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L181-L187">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.prepareTOML-Tuple{Any}" href="#Persefone.prepareTOML-Tuple{Any}"><code>Persefone.prepareTOML</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">prepareTOML(dict)</code></pre><p>An internal utility function to re-convert the one-dimensional dict created by <a href="io.html#Persefone.flattenTOML-Tuple{Any}"><code>flattenTOML</code></a> into the two-dimensional dict needed by <code>TOML.print</code>, and convert any data types into TOML-compatible types where necessary.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L107-L113">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.saveinputfiles-Tuple{SimulationModel}" href="#Persefone.saveinputfiles-Tuple{SimulationModel}"><code>Persefone.saveinputfiles</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">saveinputfiles(model)</code></pre><p>Copy all input files into the output directory, including the actual parameter settings used. This allows replicating a run in future.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L73-L78">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.savemodelobject-Tuple{SimulationModel, String}" href="#Persefone.savemodelobject-Tuple{SimulationModel, String}"><code>Persefone.savemodelobject</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">savemodelobject(model, filename)</code></pre><p>Serialise a model object and save it to file for later reference. Includes the current model and Julia versions for compatibility checking.</p><p>WARNING: produces large files (>100 MB) and takes a while to execute.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L236-L243">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.visualiseoutput-Tuple{SimulationModel}" href="#Persefone.visualiseoutput-Tuple{SimulationModel}"><code>Persefone.visualiseoutput</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">visualiseoutput(model)</code></pre><p>Cycle through all data outputs and call their respective plot functions, saving each figure to file.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L219-L224">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.withtestlogger-Tuple{SimulationModel}" href="#Persefone.withtestlogger-Tuple{SimulationModel}"><code>Persefone.withtestlogger</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">withtestlogger(model)</code></pre><p>Replace the model logger with the currently active logger. This is intended to be used in the testsuite to circumvent a <a href="https://github.com/JuliaLang/julia/issues/48456">Julia issue</a>, where <code>@test_logs</code> doesn't work with local loggers.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/output.jl#L59-L65">source</a></section></article><h2 id="makieplots.jl"><a class="docs-heading-anchor" href="#makieplots.jl">makieplots.jl</a><a id="makieplots.jl-1"></a><a class="docs-heading-anchor-permalink" href="#makieplots.jl" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.gettickmarks-Tuple{Any}" href="#Persefone.gettickmarks-Tuple{Any}"><code>Persefone.gettickmarks</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">gettickmarks(dates)</code></pre><p>Given a vector of dates, construct a selection to use as tick mark locations. Helper function for <code>[populationtrends](@ref)</code></p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/analysis/makieplots.jl#L71-L76">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.populationtrends-Tuple{SimulationModel}" href="#Persefone.populationtrends-Tuple{SimulationModel}"><code>Persefone.populationtrends</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">populationtrends(model)</code></pre><p>Plot a line graph of population sizes of each species over time. Returns a Makie figure object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/analysis/makieplots.jl#L47-L52">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.visualisemap" href="#Persefone.visualisemap"><code>Persefone.visualisemap</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">visualisemap(model, date, landcovermap)</code></pre><p>Draw the model's land cover map and plot all individuals as points on it at the specified date. If no date is passed, use the last date for which data are available. Optionally, you can pass a landcover map image (this is needed to reduce the frequency of disk I/O for Persefone Desktop). Returns a Makie figure object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/analysis/makieplots.jl#L6-L14">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="simulation.html">« Simulation</a><a class="docs-footer-nextpage" href="nature.html">Nature »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/nature.html b/docs/build/nature.html index 5676a34672a72598537362e904434107ccafe674..99a6c0d329cef95dbf7e806da3f1d39475977b6a 100644 --- a/docs/build/nature.html +++ b/docs/build/nature.html @@ -1,16 +1,14 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Nature · Persefone</title><meta name="title" content="Nature · Persefone"/><meta property="og:title" content="Nature · Persefone"/><meta property="twitter:title" content="Nature · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li class="is-active"><a class="tocitem" href="nature.html">Nature</a><ul class="internal"><li><a class="tocitem" href="#nature.jl"><span>nature.jl</span></a></li><li><a class="tocitem" href="#populations.jl"><span>populations.jl</span></a></li><li><a class="tocitem" href="#insects.jl"><span>insects.jl</span></a></li><li><a class="tocitem" href="#ecologicaldata.jl"><span>ecologicaldata.jl</span></a></li></ul></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="nature.html">Nature</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="nature.html">Nature</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/nature.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Nature"><a class="docs-heading-anchor" href="#Nature">Nature</a><a id="Nature-1"></a><a class="docs-heading-anchor-permalink" href="#Nature" title="Permalink"></a></h1><h2 id="nature.jl"><a class="docs-heading-anchor" href="#nature.jl">nature.jl</a><a id="nature.jl-1"></a><a class="docs-heading-anchor-permalink" href="#nature.jl" title="Permalink"></a></h2><p>This file is responsible for managing the animal modules.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Animal" href="#Persefone.Animal"><code>Persefone.Animal</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Animal</code></pre><p>This is the generic agent type for all animals. Species are differentiated by trait dictionaries passed by them during initialisation. (Note that each trait variable can still be accessed as if it were a normal field name, i.e. the trait <code>phase</code> can be accessed and modified with <code>animal.phase</code>.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L12-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.animalid-Tuple{Animal}" href="#Persefone.animalid-Tuple{Animal}"><code>Persefone.animalid</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">animalid(animal)</code></pre><p>A small utility function to return a string with the species name and ID of an animal.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L57-L61">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initnature!-Tuple{Agents.AgentBasedModel}" href="#Persefone.initnature!-Tuple{Agents.AgentBasedModel}"><code>Persefone.initnature!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initnature!(model)</code></pre><p>Initialise the model with all simulated animal populations.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L76-L80">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{Animal, Agents.AgentBasedModel}" href="#Persefone.stepagent!-Tuple{Animal, Agents.AgentBasedModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(animal, model)</code></pre><p>Update an animal by one day, executing it's currently active phase function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L66-L70">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@countanimals-Tuple" href="#Persefone.@countanimals-Tuple"><code>Persefone.@countanimals</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@countanimals(species="", radius=0)</code></pre><p>Count the number of animals of the given species in this location. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L379-L385">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@cropheight-Tuple{}" href="#Persefone.@cropheight-Tuple{}"><code>Persefone.@cropheight</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@cropheight</code></pre><p>Return the height of the crop at this position, or 0 if there is no crop here. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L346-L352">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@cropname-Tuple{}" href="#Persefone.@cropname-Tuple{}"><code>Persefone.@cropname</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@cropname</code></pre><p>Return the name of the local croptype, or nothing if there is no crop here. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L335-L341">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@distanceto-Tuple{Any}" href="#Persefone.@distanceto-Tuple{Any}"><code>Persefone.@distanceto</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@distanceto(habitat)</code></pre><p>Calculate the distance to the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L357-L363">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@distancetoedge-Tuple{}" href="#Persefone.@distancetoedge-Tuple{}"><code>Persefone.@distancetoedge</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@distancetoedge</code></pre><p>Calculate the distance to the closest neighbouring habitat. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L368-L374">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@habitat-Tuple{Any}" href="#Persefone.@habitat-Tuple{Any}"><code>Persefone.@habitat</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@habitat</code></pre><p>Specify habitat suitability for spatial ecological processes.</p><p>This macro works by creating an anonymous function that takes in a model object and a position, and returns <code>true</code> or <code>false</code> depending on the conditions specified in the macro body.</p><p>Several utility macros can be used within the body of <code>@habitat</code> as a short-hand for common expressions: <a href="nature.html#Persefone.@landcover-Tuple{}"><code>@landcover</code></a>, <a href="nature.html#Persefone.@cropname-Tuple{}"><code>@cropname</code></a>, <a href="nature.html#Persefone.@cropheight-Tuple{}"><code>@cropheight</code></a>, <a href="nature.html#Persefone.@distanceto-Tuple{Any}"><code>@distanceto</code></a>, <a href="nature.html#Persefone.@distancetoedge-Tuple{}"><code>@distancetoedge</code></a>, <a href="nature.html#Persefone.@countanimals-Tuple"><code>@countanimals</code></a>. The variables <code>model</code> and <code>pos</code> can be used for checks that don't have a macro available.</p><p>Two example uses of <code>@habitat</code> might look like this:</p><pre><code class="language-julia hljs">movementhabitat = @habitat(@landcover() in (grass agriculture soil)) +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Nature · Persefone.jl</title><meta name="title" content="Nature · Persefone.jl"/><meta property="og:title" content="Nature · Persefone.jl"/><meta property="twitter:title" content="Nature · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li class="is-active"><a class="tocitem" href="nature.html">Nature</a><ul class="internal"><li><a class="tocitem" href="#nature.jl"><span>nature.jl</span></a></li><li><a class="tocitem" href="#macros.jl"><span>macros.jl</span></a></li><li><a class="tocitem" href="#populations.jl"><span>populations.jl</span></a></li><li><a class="tocitem" href="#insects.jl"><span>insects.jl</span></a></li><li><a class="tocitem" href="#ecologicaldata.jl"><span>ecologicaldata.jl</span></a></li></ul></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="nature.html">Nature</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="nature.html">Nature</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/nature.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Nature"><a class="docs-heading-anchor" href="#Nature">Nature</a><a id="Nature-1"></a><a class="docs-heading-anchor-permalink" href="#Nature" title="Permalink"></a></h1><h2 id="nature.jl"><a class="docs-heading-anchor" href="#nature.jl">nature.jl</a><a id="nature.jl-1"></a><a class="docs-heading-anchor-permalink" href="#nature.jl" title="Permalink"></a></h2><p>This file is responsible for managing the animal modules.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Animal" href="#Persefone.Animal"><code>Persefone.Animal</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Animal</code></pre><p>This is the generic agent type for all animals. Individual species are created using the <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> macro. In addition to user-defined, species-specific fields, all species contain the following fields:</p><ul><li><code>id</code> An integer unique identifier for this individual.</li><li><code>sex</code> male, female, or hermaphrodite.</li><li><code>parents</code> The IDs of the individual's parents.</li><li><code>pos</code> An (x, y) coordinate tuple.</li><li><code>age</code> The age of the individual in days.</li><li><code>phase</code> The update function to be called during the individual's current life phase.</li><li><code>energy</code> A <a href="@ref">DEBparameters</a> struct for calculating energy budgets.</li><li><code>offspring</code> A vector containing the IDs of an individual's children.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L12-L27">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.animalid-Tuple{Animal}" href="#Persefone.animalid-Tuple{Animal}"><code>Persefone.animalid</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">animalid(animal)</code></pre><p>A small utility function to return a string with the species name and ID of an animal.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L60-L64">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.create!-Tuple{Animal, SimulationModel}" href="#Persefone.create!-Tuple{Animal, SimulationModel}"><code>Persefone.create!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">create!(animal, model)</code></pre><p>The <code>create!</code> function is called for every individual at birth or at model initialisation. Species must use <a href="nature.html#Persefone.@create-Tuple{Any, Any}"><code>@create</code></a> to define a species-specific method. This is the fall- back method, in case none is implemented for a species.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L69-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initnature!-Tuple{SimulationModel}" href="#Persefone.initnature!-Tuple{SimulationModel}"><code>Persefone.initnature!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initnature!(model)</code></pre><p>Initialise the model with all simulated animal populations.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L90-L94">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.killallanimals!-Tuple{Any}" href="#Persefone.killallanimals!-Tuple{Any}"><code>Persefone.killallanimals!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">killallanimals!(model)</code></pre><p>Remove all animal individuals from the simulation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L127-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.speciesof-Tuple{Union{Animal, Type}}" href="#Persefone.speciesof-Tuple{Union{Animal, Type}}"><code>Persefone.speciesof</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">speciesof(animal)</code></pre><p>Return the species name of this animal as a string.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L30-L34">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.speciestype-Tuple{String}" href="#Persefone.speciestype-Tuple{String}"><code>Persefone.speciestype</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">speciestype(name)</code></pre><p>Return the Type of this species.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L42-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{Animal, SimulationModel}" href="#Persefone.stepagent!-Tuple{Animal, SimulationModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(animal, model)</code></pre><p>Update an animal by one day, executing it's currently active phase function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L80-L84">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.updatenature!-Tuple{SimulationModel}" href="#Persefone.updatenature!-Tuple{SimulationModel}"><code>Persefone.updatenature!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">updatenature!(model)</code></pre><p>Run processes that affect all animals.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/nature.jl#L105-L109">source</a></section></article><h2 id="macros.jl"><a class="docs-heading-anchor" href="#macros.jl">macros.jl</a><a id="macros.jl-1"></a><a class="docs-heading-anchor-permalink" href="#macros.jl" title="Permalink"></a></h2><p>This file contains all the macros that can be used in the species DSL.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@animal-Tuple{Any}" href="#Persefone.@animal-Tuple{Any}"><code>Persefone.@animal</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@animal(id)</code></pre><p>Return the animal object associated with this ID number. This can only be used in a context where the <code>model</code> object is available (e.g. nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L142-L148">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@countanimals-Tuple" href="#Persefone.@countanimals-Tuple"><code>Persefone.@countanimals</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@countanimals(radius=0, species="")</code></pre><p>Count the number of animals at or near this location, optionally filtering by species. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L386-L391">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@create-Tuple{Any, Any}" href="#Persefone.@create-Tuple{Any, Any}"><code>Persefone.@create</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@create(species, body)</code></pre><p>Define a special phase function (<a href="nature.html#Persefone.create!-Tuple{Animal, SimulationModel}"><code>create!</code></a>()) that will be called when an individual of this species is created, at the initialisation of the simulation or at birth.</p><p>As for <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>, the body of this macro has access to the variables <code>self</code> (the individual being created) and <code>model</code> (the simulation world), and can thus use all macros available in <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L121-L131">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@cropheight-Tuple{}" href="#Persefone.@cropheight-Tuple{}"><code>Persefone.@cropheight</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@cropheight</code></pre><p>Return the height of the crop at this position, or 0 if there is no crop here. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L307-L313">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@cropname-Tuple{}" href="#Persefone.@cropname-Tuple{}"><code>Persefone.@cropname</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@cropname</code></pre><p>Return the name of the local croptype, or an empty string if there is no crop here. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L296-L302">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@directionto-Tuple{Any}" href="#Persefone.@directionto-Tuple{Any}"><code>Persefone.@directionto</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@directionto</code></pre><p>Calculate the direction to an animal or the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L318-L324">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@distanceto-Tuple{Any}" href="#Persefone.@distanceto-Tuple{Any}"><code>Persefone.@distanceto</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@distanceto</code></pre><p>Calculate the distance to an animal or the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L329-L335">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@distancetoedge-Tuple{}" href="#Persefone.@distancetoedge-Tuple{}"><code>Persefone.@distancetoedge</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@distancetoedge</code></pre><p>Calculate the distance to the closest neighbouring habitat. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L340-L346">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@follow-Tuple{Any, Any}" href="#Persefone.@follow-Tuple{Any, Any}"><code>Persefone.@follow</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@follow(leader, distance)</code></pre><p>Move to a location within the given distance of the leading animal. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L433-L438">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@habitat-Tuple{Any}" href="#Persefone.@habitat-Tuple{Any}"><code>Persefone.@habitat</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@habitat</code></pre><p>Specify habitat suitability for spatial ecological processes.</p><p>This macro works by creating an anonymous function that takes in a model object and a position, and returns <code>true</code> or <code>false</code> depending on the conditions specified in the macro body.</p><p>Several utility macros can be used within the body of <code>@habitat</code> as a short-hand for common expressions: <a href="nature.html#Persefone.@landcover-Tuple{}"><code>@landcover</code></a>, <a href="nature.html#Persefone.@cropname-Tuple{}"><code>@cropname</code></a>, <a href="nature.html#Persefone.@cropheight-Tuple{}"><code>@cropheight</code></a>, <a href="nature.html#Persefone.@distanceto-Tuple{Any}"><code>@distanceto</code></a>, <a href="nature.html#Persefone.@distancetoedge-Tuple{}"><code>@distancetoedge</code></a>, <a href="nature.html#Persefone.@countanimals-Tuple"><code>@countanimals</code></a>. The variables <code>model</code> and <code>pos</code> can be used for checks that don't have a macro available.</p><p>Two example uses of <code>@habitat</code> might look like this:</p><pre><code class="language-julia hljs">movementhabitat = @habitat(@landcover() in (grass agriculture soil)) nestinghabitat = @habitat((@landcover() == grass || (@landcover() == agriculture && @cropname() != "maize" && @cropheight() < 10)) && - @distanceto(forest) > 20)</code></pre><p>For more complex habitat suitability checks, the use of this macro can be circumvented by directly creating an equivalent function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L280-L307">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@initialise-Tuple{Any, Vararg{Any}}" href="#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>Persefone.@initialise</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@initialise(habitatdescriptor; kwargs...)</code></pre><p>Call this macro within the body of <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a>. It passes the given habitat descriptor function and keyword arguments on to <a href="nature.html#Persefone.initpopulation-Tuple{Function}"><code>initpopulation</code></a> when setting up the simulation.</p><p>Note: if this macro is not used, the variable <code>initialise!</code> must be set manually in the species definition.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L152-L160">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@kill-Tuple" href="#Persefone.@kill-Tuple"><code>Persefone.@kill</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@kill</code></pre><p>Kill this animal (and immediately abort its current update). This is a thin wrapper around <a href="nature.html#Persefone.kill!"><code>kill!</code></a>, and passes on any arguments. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L245-L251">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@landcover-Tuple{}" href="#Persefone.@landcover-Tuple{}"><code>Persefone.@landcover</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@landcover</code></pre><p>Returns the local landcover. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L325-L330">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@neighbours-Tuple{Any}" href="#Persefone.@neighbours-Tuple{Any}"><code>Persefone.@neighbours</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@neighbours(radius)</code></pre><p>Return an iterator over all animals in the given radius around this animal, excluding itself. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L269-L274">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@phase-Tuple{Any, Any}" href="#Persefone.@phase-Tuple{Any, Any}"><code>Persefone.@phase</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@phase(name, body)</code></pre><p>This macro is designed to be used within a species definition block (i.e. within the body of a call to <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a>).</p><p>The idea behind this is that species show very different behaviour during different phases of their lives. Therefore, <code>@phase</code> can be used define the behaviour for one such phase, and the conditions under which the animal transitions to another phase.</p><p><code>@phase</code> works by creating a function that will be called by the model if the animal is in the relevant phase. When it is called, it has access to the following variables:</p><ul><li><code>animal</code> a reference to the animal itself. This provides access to <code>animal.age</code>, <code>animal.sex</code>, and <code>animal.<trait></code> (where <trait> is a variable that was defined in the top part of the species definition body).</li><li><code>pos</code> gives the animal's current position as a coordinate tuple.</li><li><code>model</code> a reference to the model world (an object of type <code>AgentBasedModel</code>). This allows access to <code>model.date</code> (the current simulation date) and <code>model.landscape</code> (a two-dimensional array of pixels containing geographic information).</li></ul><p>Several utility macros can be used within the body of <code>@phase</code> as a short-hand for common expressions: <a href="nature.html#Persefone.@trait-Tuple{Any}"><code>@trait</code></a>, <a href="nature.html#Persefone.@setphase-Tuple{Any}"><code>@setphase</code></a>, <a href="nature.html#Persefone.@respond-Tuple{Any, Any}"><code>@respond</code></a>, <a href="nature.html#Persefone.@kill-Tuple"><code>@kill</code></a>, <a href="nature.html#Persefone.@reproduce-Tuple"><code>@reproduce</code></a>, <a href="nature.html#Persefone.@neighbours-Tuple{Any}"><code>@neighbours</code></a>, <a href="io.html#Persefone.@rand-Tuple"><code>@rand</code></a>, <a href="io.html#Persefone.@shuffle!-Tuple{Any}"><code>@shuffle!</code></a>.</p><p>Note that the first phase that is defined in a species definition block will be the phase that animals are assigned at birth, unless the variable <code>phase</code> is explicitly defined by the user in the species definition block.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L165-L195">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@reproduce-Tuple" href="#Persefone.@reproduce-Tuple"><code>Persefone.@reproduce</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@reproduce</code></pre><p>Let this animal reproduce. This is a thin wrapper around <a href="energy.html#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}"><code>reproduce!</code></a>, and passes on any arguments. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L259-L264">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@respond-Tuple{Any, Any}" href="#Persefone.@respond-Tuple{Any, Any}"><code>Persefone.@respond</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@respond(eventname, body)</code></pre><p>Define how an animal responds to a landscape event that affects its current position. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L231-L236">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@setphase-Tuple{Any}" href="#Persefone.@setphase-Tuple{Any}"><code>Persefone.@setphase</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@setphase(newphase)</code></pre><p>Switch this animal over to a different phase. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L221-L225">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@species-Tuple{Any, Any}" href="#Persefone.@species-Tuple{Any, Any}"><code>Persefone.@species</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@species(name, body)</code></pre><p>A macro used to create new species definitions for the nature model. This is effectively a simple domain-specific language, establishing a custom syntax to describe species' biology:</p><pre><code class="language-julia hljs">@species name begin - - @initialise(@habitat(...)) - speciesvar1 = 3.14 + @distanceto(forest) > 20)</code></pre><p>For more complex habitat suitability checks, the use of this macro can be circumvented by directly creating an equivalent function.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L240-L267">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@here-Tuple{}" href="#Persefone.@here-Tuple{}"><code>Persefone.@here</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@here()</code></pre><p>Return the landscape pixel of this animal's current location. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L164-L169">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@isalive-Tuple{Any}" href="#Persefone.@isalive-Tuple{Any}"><code>Persefone.@isalive</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@isalive(id)</code></pre><p>Test whether the animal with the given ID is still alive. This can only be used in a context where the <code>model</code> object is available (e.g. nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L153-L159">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@kill-Tuple" href="#Persefone.@kill-Tuple"><code>Persefone.@kill</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@kill</code></pre><p>Kill this animal (and immediately abort its current update if it dies). This is a thin wrapper around <a href="nature.html#Persefone.kill!"><code>kill!</code></a>, and passes on any arguments. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L198-L204">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@killother-Tuple{Any, Vararg{Any}}" href="#Persefone.@killother-Tuple{Any, Vararg{Any}}"><code>Persefone.@killother</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@killother</code></pre><p>Kill another animal. This is a thin wrapper around <a href="nature.html#Persefone.kill!"><code>kill!</code></a>, and passes on any arguments. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L209-L214">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@landcover-Tuple{}" href="#Persefone.@landcover-Tuple{}"><code>Persefone.@landcover</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@landcover</code></pre><p>Returns the local landcover. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L286-L291">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@migrate-Tuple{Any}" href="#Persefone.@migrate-Tuple{Any}"><code>Persefone.@migrate</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@migrate(arrival)</code></pre><p>Remove this animal from the map and add it to the migrant species pool. It will be returned to its current location at the specified <code>arrival</code> date. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L229-L235">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@move-Tuple{Any}" href="#Persefone.@move-Tuple{Any}"><code>Persefone.@move</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@move(position)</code></pre><p>Move the current individual to a new position. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L409-L414">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@nearby_animals-Tuple" href="#Persefone.@nearby_animals-Tuple"><code>Persefone.@nearby_animals</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@nearby_animals(radius=0, species="")</code></pre><p>Return an iterator over all animals in the given radius around the current position. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> or <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L373-L378">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@neighbours-Tuple" href="#Persefone.@neighbours-Tuple"><code>Persefone.@neighbours</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@neighbours(radius=0, conspecifics=true)</code></pre><p>Return an iterator over all (by default conspecific) animals in the given radius around this animal, excluding itself. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L397-L402">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@phase-Tuple{Any, Any, Any}" href="#Persefone.@phase-Tuple{Any, Any, Any}"><code>Persefone.@phase</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@phase(name, body)</code></pre><p>Use this macro to describe a species' behaviour during a given phase of its life. The idea behind this is that species show very different behaviour at different times of their lives. Therefore, <code>@phase</code> can be used define the behaviour for one such phase, and the conditions under which the animal transitions to another phase.</p><p><code>@phase</code> works by creating a function that will be called by the model if the animal is in the relevant phase. When it is called, it has access to the following variables:</p><ul><li><code>self</code> a reference to the animal itself. This provides access to all the variables defined in the <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> definition, as well as all standard <a href="nature.html#Persefone.Animal"><code>Animal</code></a> variables (e.g. <code>self.age</code>, <code>self.sex</code>, <code>self.offspring</code>).</li><li><code>pos</code> gives the animal's current position as a coordinate tuple.</li><li><code>model</code> a reference to the model world (an object of type <a href="simulation.html#Persefone.SimulationModel"><code>SimulationModel</code></a>). This allows access, amongst others, to <code>model.date</code> (the current simulation date) and <code>model.landscape</code> (a two-dimensional array of pixels containing geographic information).</li></ul><p>Many macros are available to make the code within the body of <code>@phase</code> more succinct. Some of the most important of these are: <a href="nature.html#Persefone.@setphase-Tuple{Any}"><code>@setphase</code></a>, <a href="nature.html#Persefone.@respond-Tuple{Any, Any}"><code>@respond</code></a>, <a href="nature.html#Persefone.@kill-Tuple"><code>@kill</code></a>, <a href="nature.html#Persefone.@reproduce-Tuple"><code>@reproduce</code></a>, <a href="nature.html#Persefone.@neighbours-Tuple"><code>@neighbours</code></a>, <a href="nature.html#Persefone.@migrate-Tuple{Any}"><code>@migrate</code></a>, <a href="nature.html#Persefone.@move-Tuple{Any}"><code>@move</code></a>, <a href="io.html#Persefone.@rand-Tuple"><code>@rand</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L86-L110">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@populate-Tuple{Any, Any}" href="#Persefone.@populate-Tuple{Any, Any}"><code>Persefone.@populate</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@populate(species, params)</code></pre><p>Set the parameters that are used to initialise this species' population. For parameter options, see <a href="nature.html#Persefone.PopInitParams"><code>PopInitParams</code></a>.</p><pre><code class="language-julia hljs">@populate <species> begin + <parameter> = <value> ... - - @phase phase1 begin - ... - end -end</code></pre><p>The definition body (enclosed in the begin/end block) has two sections. First comes a call to <a href="nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>@initialise</code></a>, and optionally a list of species-specific parameters, which are assigned just like normal variables. Second come one or more phase definitions, that describe the behaviour of the species during various parts of its life cycle. (See the documentation to <a href="nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>@initialise</code></a> and <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> for details).</p><p>Code in a species definition block can access the rest of the model using the <code>model</code> variable (an object of type <code>AgentBasedModel</code>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L99-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@trait-Tuple{Any}" href="#Persefone.@trait-Tuple{Any}"><code>Persefone.@trait</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@trait(traitname)</code></pre><p>A utility macro to quickly access an animal's trait value. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/nature.jl#L207-L212">source</a></section></article><h2 id="populations.jl"><a class="docs-heading-anchor" href="#populations.jl">populations.jl</a><a id="populations.jl-1"></a><a class="docs-heading-anchor-permalink" href="#populations.jl" title="Permalink"></a></h2><p>This file contains a set of utility functions for species, including initialisation, reproduction, and mortality.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.countanimals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.countanimals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.countanimals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">countanimals(pos, model; species="", radius=0)</code></pre><p>Count the number of animals in this location (optionally supplying a species name and radius).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L137-L141">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initpopulation-Tuple{Function}" href="#Persefone.initpopulation-Tuple{Function}"><code>Persefone.initpopulation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initpopulation(habitatdescriptor; popsize=-1, pairs=false, asexual=false)</code></pre><p>Creates a function that initialises individuals at random locations across the landscape. This can be used to create the <code>initialise!</code> variable in a species definition block.</p><ul><li><p><code>habitatdescriptor</code> is a function that determines whether a given location is suitable or not (create this using <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>).</p></li><li><p><code>phase</code> determines which life phase individuals will be assigned to. If this is <code>nothing</code>, the species' default post-natal life stage will be used (although note that this is probably not what you want).</p></li><li><p><code>popsize</code> determines the number of individuals that will be created. If this is zero or negative, one individual will be created in every suitable location in the landscape. If <code>popsize</code> is greater than the number of suitable locations, multiple individuals will be created in one place. (Maximum population density can be set in the habitat descriptor using the <a href="nature.html#Persefone.@countanimals-Tuple"><code>@countanimals</code></a> macro.)</p></li><li><p>If <code>pairs</code> is true, a male and a female individual will be created in each selected location, otherwise, only one individual will be created at a time.</p></li><li><p>If <code>asexual</code> is true, all created individuals are assigned the sex <code>hermaphrodite</code>, otherwise, they are randomly assigned male of female. (If <code>pairs</code> is true, <code>asexual</code> is ignored.)</p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L7-L32">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initrandompopulation-Tuple{Int64}" href="#Persefone.initrandompopulation-Tuple{Int64}"><code>Persefone.initrandompopulation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initrandompopulation(popsize; kwargs...)</code></pre><p>A simplified version of <a href="nature.html#Persefone.initpopulation-Tuple{Function}"><code>initpopulation</code></a>. Creates a function that initialises <code>popsize</code> individuals, spread at random across the landscape.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L70-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.kill!" href="#Persefone.kill!"><code>Persefone.kill!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">kill(animal, model, probability=1.0, cause="")</code></pre><p>Kill this animal, optionally with a given percentage probability. Returns true if the animal dies, false if not.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L99-L104">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nearby_animals-Tuple{Animal, Agents.AgentBasedModel, Int64}" href="#Persefone.nearby_animals-Tuple{Animal, Agents.AgentBasedModel, Int64}"><code>Persefone.nearby_animals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">nearby_animals(animal, model, radius)</code></pre><p>Return an iterator over all animals in the given radius around this animal, excluding itself.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L126-L130">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Int64}" href="#Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Int64}"><code>Persefone.nearby_animals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">nearby_animals(pos, model, radius)</code></pre><p>Return an iterator over all animals in the given radius around this position.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L115-L119">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.reproduce!" href="#Persefone.reproduce!"><code>Persefone.reproduce!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">reproduce!(animal, model, n=1)</code></pre><p>Produce one or more offspring for the given animal at its current location.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/populations.jl#L84-L88">source</a></section></article><h2 id="insects.jl"><a class="docs-heading-anchor" href="#insects.jl">insects.jl</a><a id="insects.jl-1"></a><a class="docs-heading-anchor-permalink" href="#insects.jl" title="Permalink"></a></h2><p>This file contains the insect submodel, which calculates the likely insect biomass in a given location at a given time.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.insectbiomass-Tuple{Pixel, Agents.AgentBasedModel}" href="#Persefone.insectbiomass-Tuple{Pixel, Agents.AgentBasedModel}"><code>Persefone.insectbiomass</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">insectbiomass(pixel, model)</code></pre><p>Calculate the insect biomass in this location, using the factors configured in the <code>nature.insectmodel</code> settings (any combination of: "season", "habitat", "weather", "pesticides"). Returns a float value in g/m².</p><p><strong>Biological note:</strong> this is a very approximate calculation! Insect biomass varies wildly in time and space and is hard to measure. This calculation is based on the idea of a parabolic seasonal development of insect abundance, modified by habitat suitability, weather, and pesticide application. Although it is based on empirical studies, it can only deliver a rough, order-of-magnitude estimation of likely insect biomass in a given location.</p><p><strong>Sources:</strong></p><ul><li>Odderskær et al. (1997). Skylark Reproduction in Pesticide Treated and Untreated Fields (32; Pesticides Research). Danish Environmental Protection Agency.</li><li>Grüebler et al. (2008). A predictive model of the density of airborne insects in agricultural environments. Agriculture, Ecosystems & Environment, 123(1), 75–80. https://doi.org/10.1016/j.agee.2007.05.001</li><li>Paquette et al. (2013). Seasonal patterns in Tree Swallow prey (Diptera) abundance are affected by agricultural intensification. Ecological Applications, 23(1), 122–133. https://doi.org/10.1890/12-0068.1</li><li>Püttmanns et al. (2022). Habitat use and foraging parameters of breeding Skylarks indicate no seasonal decrease in food availability in heterogeneous farmland. Ecology and Evolution, 12(1), e8461. https://doi.org/10.1002/ece3.8461</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/insects.jl#L6-L26">source</a></section></article><h2 id="ecologicaldata.jl"><a class="docs-heading-anchor" href="#ecologicaldata.jl">ecologicaldata.jl</a><a id="ecologicaldata.jl-1"></a><a class="docs-heading-anchor-permalink" href="#ecologicaldata.jl" title="Permalink"></a></h2><p>This file contains a set of life-history related utility functions needed by species.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initecologicaldata-Tuple{Agents.AgentBasedModel}" href="#Persefone.initecologicaldata-Tuple{Agents.AgentBasedModel}"><code>Persefone.initecologicaldata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initecologicaldata()</code></pre><p>Create output files for each data group collected by the nature model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/ecologicaldata.jl#L6-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.saveindividualdata-Tuple{Agents.AgentBasedModel}" href="#Persefone.saveindividualdata-Tuple{Agents.AgentBasedModel}"><code>Persefone.saveindividualdata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">saveindividualdata(model)</code></pre><p>Return a comma-separated set of lines (to be printed to <code>individuals.csv</code>), listing all properties of all animal individuals in the model. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter <code>nature.indoutfreq</code>. WARNING: Produces very big files!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/ecologicaldata.jl#L39-L46">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.savepopulationdata-Tuple{Agents.AgentBasedModel}" href="#Persefone.savepopulationdata-Tuple{Agents.AgentBasedModel}"><code>Persefone.savepopulationdata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">savepopulationdata(model)</code></pre><p>Return a comma-separated set of lines (to be printed to <code>populations.csv</code>), giving the current date and population size for each animal species. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter <code>nature.popoutfreq</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/nature/ecologicaldata.jl#L18-L25">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="io.html">« Input and Output</a><a class="docs-footer-nextpage" href="energy.html">Dynamic Energy Budgets »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +end </code></pre></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L60-L72">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@randomdirection-Tuple" href="#Persefone.@randomdirection-Tuple"><code>Persefone.@randomdirection</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@randomdirection(range=1)</code></pre><p>Return a random direction tuple that can be passed to <a href="nature.html#Persefone.@walk-Tuple"><code>@walk</code></a>. This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L363-L368">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@randompixel-Tuple" href="#Persefone.@randompixel-Tuple"><code>Persefone.@randompixel</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@randompixel(range, habitatdescriptor)</code></pre><p>Find a random pixel within a given <code>range</code> of the animal's location that matches the habitatdescriptor (create this using <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>). This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L351-L358">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@reproduce-Tuple" href="#Persefone.@reproduce-Tuple"><code>Persefone.@reproduce</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@reproduce</code></pre><p>Let this animal reproduce. This is a thin wrapper around <a href="energy.html#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}"><code>reproduce!</code></a>, and passes on any arguments. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L219-L224">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@respond-Tuple{Any, Any}" href="#Persefone.@respond-Tuple{Any, Any}"><code>Persefone.@respond</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@respond(eventname, body)</code></pre><p>Define how an animal responds to a landscape event that affects its current position. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L184-L189">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@setphase-Tuple{Any}" href="#Persefone.@setphase-Tuple{Any}"><code>Persefone.@setphase</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@setphase(newphase)</code></pre><p>Switch this animal over to a different phase. This can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L174-L179">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@species-Tuple{Any, Any}" href="#Persefone.@species-Tuple{Any, Any}"><code>Persefone.@species</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@species(name, body)</code></pre><p>A macro used to add new species types to the nature model. Use this to define species-specific variables and parameters.</p><p>The macro works by creating a keyword-defined mutable struct that contains the standard fields described for the <a href="nature.html#Persefone.Animal"><code>Animal</code></a> type, as well as any new fields that the user adds:</p><pre><code class="language-julia hljs">@species <name> begin + <var1> = <value> + <var2> = <value> + ... +end</code></pre><p>To complete the species definition, the <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>, <a href="nature.html#Persefone.@create-Tuple{Any, Any}"><code>@create</code></a>, and <a href="nature.html#Persefone.@populate-Tuple{Any, Any}"><code>@populate</code></a> macros also need to be used.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L16-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.@walk-Tuple" href="#Persefone.@walk-Tuple"><code>Persefone.@walk</code></a> — <span class="docstring-category">Macro</span></header><section><div><pre><code class="language-julia hljs">@walk(direction, speed)</code></pre><p>Walk the animal in a given direction, which is specified by a tuple of coordinates relative to the animal's current position (i.e. <code>(2, -3)</code> increments the X coordinate by 2 and decrements the Y coordinate by 3.) This is a utility wrapper that can only be used nested within <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/macros.jl#L419-L426">source</a></section></article><h2 id="populations.jl"><a class="docs-heading-anchor" href="#populations.jl">populations.jl</a><a id="populations.jl-1"></a><a class="docs-heading-anchor-permalink" href="#populations.jl" title="Permalink"></a></h2><p>This file contains a set of utility functions for species, including initialisation, reproduction, and mortality.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.PopInitParams" href="#Persefone.PopInitParams"><code>Persefone.PopInitParams</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">PopInitParams</code></pre><p>A set of parameters used by <a href="@ref"><code>initpopulation</code></a> to initialise the population of a species at the start of a simulation. Define these parameters for each species using <a href="nature.html#Persefone.@populate-Tuple{Any, Any}"><code>@populate</code></a>.</p><ul><li><p><code>initphase</code> determines which life phase individuals will be assigned to at model initialisation (required).</p></li><li><p><code>birthphase</code> determines which life phase individuals will be assigned to at birth (required).</p></li><li><p><code>habitat</code> is a function that determines whether a given location is suitable or not (create this using <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>). By default, every cell will be occupied.</p></li><li><p><code>popsize</code> determines the number of individuals that will be created, dispersed over the suitable locations in the landscape. If this is zero or negative, one individual will be created in every suitable location. If it is greater than the number of suitable locations, multiple individuals will be created per location. Alternately, use <code>popdensity</code>.</p></li><li><p><code>popdensity</code>: if this is greater than zero, the chance of creating an individual (or pair of individuals) at a suitable location is 1/popdensity. Use this as an alternative to <code>popsize</code>.</p></li><li><p>If <code>pairs</code> is true, a male and a female individual will be created in each selected location, otherwise, only one individual will be created at a time. (default: false)</p></li><li><p>If <code>asexual</code> is true, all created individuals are assigned the sex <code>hermaphrodite</code>, otherwise, they are randomly assigned <code>male</code> or <code>female</code>. If <code>pairs</code> is true, <code>asexual</code> is ignored. (default: false)</p></li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L7-L37">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.countanimals-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.countanimals-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.countanimals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">countanimals(pos, model; radius=0, species="")</code></pre><p>Return the number of animals in the given radius around this position, optionally filtering by species.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L235-L240">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}" href="#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}"><code>Persefone.directionto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">directionto(pos, model, animal)</code></pre><p>Calculate the direction from the given position to the animal.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L258-L262">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}" href="#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}"><code>Persefone.distanceto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distanceto(pos, model, animal)</code></pre><p>Calculate the distance from the given position to the animal.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L268-L272">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.followanimal!" href="#Persefone.followanimal!"><code>Persefone.followanimal!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">followanimal!(follower, leader, model, distance=0)</code></pre><p>Move the follower animal to a location near the leading animal.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L278-L282">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initpopulation!-Tuple{String, SimulationModel}" href="#Persefone.initpopulation!-Tuple{String, SimulationModel}"><code>Persefone.initpopulation!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initpopulation!(speciesname, model)</code></pre><p>Initialise the population of the given species, based on the parameters stored in <a href="nature.html#Persefone.PopInitParams"><code>PopInitParams</code></a>. Define these using <a href="nature.html#Persefone.@populate-Tuple{Any, Any}"><code>@populate</code></a>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L57-L62">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initpopulation!-Tuple{Type, Persefone.PopInitParams, SimulationModel}" href="#Persefone.initpopulation!-Tuple{Type, Persefone.PopInitParams, SimulationModel}"><code>Persefone.initpopulation!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initpopulation!(speciestype, popinitparams, model)</code></pre><p>Initialise the population of the given species, based on the given initialisation parameters. This is an internal function called by initpopulation!(), and was split off from it to allow better testing.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L69-L75">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.isalive-Tuple{Int64, SimulationModel}" href="#Persefone.isalive-Tuple{Int64, SimulationModel}"><code>Persefone.isalive</code></a> — <span class="docstring-category">Method</span></header><section><div><p>isalive(id, model)</p><p>Test whether the animal with the given ID is still alive.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L191-L195">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.kill!" href="#Persefone.kill!"><code>Persefone.kill!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">kill!(animal, model, probability=1.0, cause="")</code></pre><p>Kill this animal, optionally with a given percentage probability. Returns true if the animal dies, false if not.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L153-L158">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.migrate!-Tuple{Animal, SimulationModel, Dates.Date}" href="#Persefone.migrate!-Tuple{Animal, SimulationModel, Dates.Date}"><code>Persefone.migrate!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">migrate!(animal, model, arrival)</code></pre><p>Remove this animal from the map and add it to the migrant species pool. It will be returned to its current location at the specified <code>arrival</code> date.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L171-L176">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.move!-Tuple{Animal, SimulationModel, Tuple{Int64, Int64}}" href="#Persefone.move!-Tuple{Animal, SimulationModel, Tuple{Int64, Int64}}"><code>Persefone.move!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">move!(animal, model, position)</code></pre><p>Move the animal to the given position, making sure that this is in-bounds. If the position is out of bounds, the animal stops at the map edge.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L291-L296">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.nearby_animals</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">nearby_animals(pos, model; radius= 0, species="")</code></pre><p>Return a list of animals in the given radius around this position, optionally filtering by species.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L219-L223">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nearby_ids-Tuple{Tuple{Int64, Int64}, SimulationModel, Int64}" href="#Persefone.nearby_ids-Tuple{Tuple{Int64, Int64}, SimulationModel, Int64}"><code>Persefone.nearby_ids</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">nearby_ids(pos, model, radius)</code></pre><p>Return a list of IDs of the animals within a given radius of the position.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L200-L204">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.neighbours" href="#Persefone.neighbours"><code>Persefone.neighbours</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">neighbours(animal, model, radius=0, conspecifics=true)</code></pre><p>Return a list of animals in the given radius around this animal, excluding itself. By default, only return conspecific animals.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L246-L251">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.populationparameters-Tuple{Type}" href="#Persefone.populationparameters-Tuple{Type}"><code>Persefone.populationparameters</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">populationparameters(type)</code></pre><p>A function that returns a <a href="nature.html#Persefone.PopInitParams"><code>PopInitParams</code></a> object for the given species type. Parametric methods for each species are defined with <a href="nature.html#Persefone.@populate-Tuple{Any, Any}"><code>@populate</code></a>. This is the catch-all method, which throws an error if no species-specific function is defined.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L48-L54">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.reproduce!" href="#Persefone.reproduce!"><code>Persefone.reproduce!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">reproduce!(animal, model, mate, n=1)</code></pre><p>Produce one or more offspring for the given animal at its current location. The <code>mate</code> argument gives the ID of the reproductive partner.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L127-L132">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.walk!" href="#Persefone.walk!"><code>Persefone.walk!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">walk!(animal, model, direction, speed=-1)</code></pre><p>Let the animal move in the given direction, where the direction is defined by an (x, y) tuple to specify the shift in coordinates. If speed >= 0, walk no more than the given number of cells.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L336-L342">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.walk!" href="#Persefone.walk!"><code>Persefone.walk!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">walk!(animal, model, direction, steps=1)</code></pre><p>Let the animal move a given number of step in the given direction ("north", "northeast", "east", "southeast", "south", "southwest", "west", "northwest", "random").</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/populations.jl#L305-L310">source</a></section></article><h2 id="insects.jl"><a class="docs-heading-anchor" href="#insects.jl">insects.jl</a><a id="insects.jl-1"></a><a class="docs-heading-anchor-permalink" href="#insects.jl" title="Permalink"></a></h2><p>This file contains the insect submodel, which calculates the likely insect biomass in a given location at a given time.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.insectbiomass-Tuple{Pixel, SimulationModel}" href="#Persefone.insectbiomass-Tuple{Pixel, SimulationModel}"><code>Persefone.insectbiomass</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">insectbiomass(pixel, model)</code></pre><p>Calculate the insect biomass in this location, using the factors configured in the <code>nature.insectmodel</code> settings (any combination of: "season", "habitat", "weather", "pesticides"). Returns a float value in g/m².</p><p><strong>Biological note:</strong> this is a very approximate calculation! Insect biomass varies wildly in time and space and is hard to measure. This calculation is based on the idea of a parabolic seasonal development of insect abundance, modified by habitat suitability, weather, and pesticide application. Although it is based on empirical studies, it can only deliver a rough, order-of-magnitude estimation of likely insect biomass in a given location.</p><p><strong>Sources:</strong></p><ul><li>Odderskær et al. (1997). Skylark Reproduction in Pesticide Treated and Untreated Fields (32; Pesticides Research). Danish Environmental Protection Agency.</li><li>Grüebler et al. (2008). A predictive model of the density of airborne insects in agricultural environments. Agriculture, Ecosystems & Environment, 123(1), 75–80. https://doi.org/10.1016/j.agee.2007.05.001</li><li>Paquette et al. (2013). Seasonal patterns in Tree Swallow prey (Diptera) abundance are affected by agricultural intensification. Ecological Applications, 23(1), 122–133. https://doi.org/10.1890/12-0068.1</li><li>Püttmanns et al. (2022). Habitat use and foraging parameters of breeding Skylarks indicate no seasonal decrease in food availability in heterogeneous farmland. Ecology and Evolution, 12(1), e8461. https://doi.org/10.1002/ece3.8461</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/insects.jl#L6-L26">source</a></section></article><h2 id="ecologicaldata.jl"><a class="docs-heading-anchor" href="#ecologicaldata.jl">ecologicaldata.jl</a><a id="ecologicaldata.jl-1"></a><a class="docs-heading-anchor-permalink" href="#ecologicaldata.jl" title="Permalink"></a></h2><p>This file contains a set of life-history related utility functions needed by species.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initecologicaldata-Tuple{SimulationModel}" href="#Persefone.initecologicaldata-Tuple{SimulationModel}"><code>Persefone.initecologicaldata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initecologicaldata()</code></pre><p>Create output files for each data group collected by the nature model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/ecologicaldata.jl#L6-L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.saveindividualdata-Tuple{SimulationModel}" href="#Persefone.saveindividualdata-Tuple{SimulationModel}"><code>Persefone.saveindividualdata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">saveindividualdata(model)</code></pre><p>Return a comma-separated set of lines (to be printed to <code>individuals.csv</code>), listing all properties of all animal individuals in the model. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter <code>nature.indoutfreq</code>. WARNING: Produces very big files!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/ecologicaldata.jl#L42-L49">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.savepopulationdata-Tuple{SimulationModel}" href="#Persefone.savepopulationdata-Tuple{SimulationModel}"><code>Persefone.savepopulationdata</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">savepopulationdata(model)</code></pre><p>Return a comma-separated set of lines (to be printed to <code>populations.csv</code>), giving the current date and population size for each animal species. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter <code>nature.popoutfreq</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/ecologicaldata.jl#L18-L25">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="io.html">« Input and Output</a><a class="docs-footer-nextpage" href="energy.html">Dynamic Energy Budgets »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/odd.html b/docs/build/odd.html index e4d341d5928e9bf5b56396aea4ea06f48f4a1c99..a6e42952ae0bf550294c942c3e40ce59bfb66dee 100644 --- a/docs/build/odd.html +++ b/docs/build/odd.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Overview, Design, Details (ODD) · Persefone</title><meta name="title" content="Overview, Design, Details (ODD) · Persefone"/><meta property="og:title" content="Overview, Design, Details (ODD) · Persefone"/><meta property="twitter:title" content="Overview, Design, Details (ODD) · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="odd.html">Overview, Design, Details (ODD)</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="odd.html">Overview, Design, Details (ODD)</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/odd.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Overview,-Design,-Details-(ODD)"><a class="docs-heading-anchor" href="#Overview,-Design,-Details-(ODD)">Overview, Design, Details (ODD)</a><a id="Overview,-Design,-Details-(ODD)-1"></a><a class="docs-heading-anchor-permalink" href="#Overview,-Design,-Details-(ODD)" title="Permalink"></a></h1><p><em>TODO</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Overview, Design, Details (ODD) · Persefone.jl</title><meta name="title" content="Overview, Design, Details (ODD) · Persefone.jl"/><meta property="og:title" content="Overview, Design, Details (ODD) · Persefone.jl"/><meta property="twitter:title" content="Overview, Design, Details (ODD) · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href="odd.html">Overview, Design, Details (ODD)</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="odd.html">Overview, Design, Details (ODD)</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/odd.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Overview,-Design,-Details-(ODD)"><a class="docs-heading-anchor" href="#Overview,-Design,-Details-(ODD)">Overview, Design, Details (ODD)</a><a id="Overview,-Design,-Details-(ODD)-1"></a><a class="docs-heading-anchor-permalink" href="#Overview,-Design,-Details-(ODD)" title="Permalink"></a></h1><p><em>TODO</em></p></article><nav class="docs-footer"><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/search_index.js b/docs/build/search_index.js index 6289ba1cf9dadf7be5e02d63473676bf1b0ea88a..ca4d5ef5a868f890de573bb3daabf287a213cd98 100644 --- a/docs/build/search_index.js +++ b/docs/build/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"energy.html#Dynamic-Energy-Budgets","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"","category":"section"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Persefone's nature module uses Kooijman's Dynamic Energy Budget theory to model energy flows within individuals.","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"(Image: \"The standard model of the Dynamic Energy Budget theory\")","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"The standard model of the Dynamic Energy Budget theory. (Fig. 1 from Sousa et al. (2010).)","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Sousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428.\nKooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press.\nSibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161.","category":"page"},{"location":"energy.html#energy.jl","page":"Dynamic Energy Budgets","title":"energy.jl","text":"","category":"section"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Modules = [Persefone]\nPages = [\"nature/energy.jl\"]","category":"page"},{"location":"energy.html#Persefone.DEBparameters","page":"Dynamic Energy Budgets","title":"Persefone.DEBparameters","text":"DEBparameters\n\nAn immutable struct to save the parameter list for a species' Dynamic Energy Budget model. (See Sousa et al., 2010.)\n\n\n\n\n\n","category":"type"},{"location":"energy.html#Persefone.EnergyBudget","page":"Dynamic Energy Budgets","title":"Persefone.EnergyBudget","text":"EnergyBudget\n\nThis struct represents an individual's energy balance, as conceptualised by the Dynamic Energy Budget theory. Upon assimilation, energy is first stored as biomass in a reserve buffer, before being used for maintenance, growth, and reproduction. (Note that this is a simplified model form which ignores maturity as a separate buffer.)\n\nSources:\n\nMalishev & Kramer-Schadt (2021). Movement, models, and metabolism: Individual-based energy budget models as next-generation extensions for predicting animal movement outcomes across scales. Ecological Modelling, 441, 109413. https://doi.org/10.1016/j.ecolmodel.2020.109413\nMarques et al. (2018). The AmP project: Comparing species on the basis of dynamic energy budget parameters. PLOS Computational Biology,14(5), e1006100. https://doi.org/10.1371/journal.pcbi.1006100\nSibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161. https://doi.org/10.1111/2041-210x.12002\nSousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428. https://doi.org/10.1098/rstb.2010.0166\nKooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press. https://www.researchgate.net/profile/Edgar-Meza-3/post/Isthereatoxicokineticmodelfordaphniamagnaorotherzooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf\nsee also: Brown et al. (2004). Toward a metabolic theory of ecology. Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000\n\n\n\n\n\n","category":"type"},{"location":"energy.html#Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.feed!","text":"feed!(quantity, energybudget)\n\nConsume a given quantity of food. Expands the energy reserve by an amount determined by the assimilation rate. Returns true if successful, false if the reserve is already full.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.growthrate-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.growthrate","text":"growthrate(energybudget)\n\nCalculate the specific growth rate r. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.investmentratio-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.investmentratio","text":"investmentratio(energybudget)\n\nCalculate the investment ratio g. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.maturitymaintenance","text":"maturitymaintenance(energybudget)\n\nCalculate the specific maturity maintenance k_J. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.mobilisation-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.mobilisation","text":"mobilisation(energybudget)\n\nCalculate the mobilisation rate J_EC. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.reproduce!","text":"reproduce!(energybudget)\n\nIf there is sufficient energy in the offspring buffer of an adult, produce an embryo/egg, reducing the parent energy in the process. Returns the embryo's energy budget, or nothing if the conditions are not met.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.scaledreservedensity","text":"scaledreservedensity(energybudget)\n\nCalculate the scaled reserve density e. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.update!-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.update!","text":"update!(energybudget)\n\nCarry out a daily update of the energy budget. Mobilises reserves and allocates these to maintenance (prioritised), growth, and reproduction.\n\nReturn true if the individual has enough energy to survive, or false if the reserve is empty and it starves.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.volumetriclength","text":"volumetriclength(energybudget)\n\nCalculate the structural length in cm based on an individual's weight (assuming a density of 1 g/cm³ to calculate volume, see Kooijman 2009).\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Nature","page":"Nature","title":"Nature","text":"","category":"section"},{"location":"nature.html#nature.jl","page":"Nature","title":"nature.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file is responsible for managing the animal modules.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/nature.jl\"]","category":"page"},{"location":"nature.html#Persefone.Animal","page":"Nature","title":"Persefone.Animal","text":"Animal\n\nThis is the generic agent type for all animals. Species are differentiated by trait dictionaries passed by them during initialisation. (Note that each trait variable can still be accessed as if it were a normal field name, i.e. the trait phase can be accessed and modified with animal.phase.)\n\n\n\n\n\n","category":"type"},{"location":"nature.html#Persefone.animalid-Tuple{Animal}","page":"Nature","title":"Persefone.animalid","text":"animalid(animal)\n\nA small utility function to return a string with the species name and ID of an animal.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.initnature!-Tuple{Agents.AgentBasedModel}","page":"Nature","title":"Persefone.initnature!","text":"initnature!(model)\n\nInitialise the model with all simulated animal populations.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.stepagent!-Tuple{Animal, Agents.AgentBasedModel}","page":"Nature","title":"Persefone.stepagent!","text":"stepagent!(animal, model)\n\nUpdate an animal by one day, executing it's currently active phase function.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.@countanimals-Tuple","page":"Nature","title":"Persefone.@countanimals","text":"@countanimals(species=\"\", radius=0)\n\nCount the number of animals of the given species in this location. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@cropheight-Tuple{}","page":"Nature","title":"Persefone.@cropheight","text":"@cropheight\n\nReturn the height of the crop at this position, or 0 if there is no crop here. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@cropname-Tuple{}","page":"Nature","title":"Persefone.@cropname","text":"@cropname\n\nReturn the name of the local croptype, or nothing if there is no crop here. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@distanceto-Tuple{Any}","page":"Nature","title":"Persefone.@distanceto","text":"@distanceto(habitat)\n\nCalculate the distance to the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@distancetoedge-Tuple{}","page":"Nature","title":"Persefone.@distancetoedge","text":"@distancetoedge\n\nCalculate the distance to the closest neighbouring habitat. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@habitat-Tuple{Any}","page":"Nature","title":"Persefone.@habitat","text":"@habitat\n\nSpecify habitat suitability for spatial ecological processes.\n\nThis macro works by creating an anonymous function that takes in a model object and a position, and returns true or false depending on the conditions specified in the macro body.\n\nSeveral utility macros can be used within the body of @habitat as a short-hand for common expressions: @landcover, @cropname, @cropheight, @distanceto, @distancetoedge, @countanimals. The variables model and pos can be used for checks that don't have a macro available.\n\nTwo example uses of @habitat might look like this:\n\nmovementhabitat = @habitat(@landcover() in (grass agriculture soil))\n\nnestinghabitat = @habitat((@landcover() == grass || \n (@landcover() == agriculture && @cropname() != \"maize\" &&\n @cropheight() < 10)) &&\n @distanceto(forest) > 20)\n\nFor more complex habitat suitability checks, the use of this macro can be circumvented by directly creating an equivalent function.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}","page":"Nature","title":"Persefone.@initialise","text":"@initialise(habitatdescriptor; kwargs...)\n\nCall this macro within the body of @species. It passes the given habitat descriptor function and keyword arguments on to initpopulation when setting up the simulation.\n\nNote: if this macro is not used, the variable initialise! must be set manually in the species definition.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@kill-Tuple","page":"Nature","title":"Persefone.@kill","text":"@kill\n\nKill this animal (and immediately abort its current update). This is a thin wrapper around kill!, and passes on any arguments. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@landcover-Tuple{}","page":"Nature","title":"Persefone.@landcover","text":"@landcover\n\nReturns the local landcover. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@neighbours-Tuple{Any}","page":"Nature","title":"Persefone.@neighbours","text":"@neighbours(radius)\n\nReturn an iterator over all animals in the given radius around this animal, excluding itself. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@phase-Tuple{Any, Any}","page":"Nature","title":"Persefone.@phase","text":"@phase(name, body)\n\nThis macro is designed to be used within a species definition block (i.e. within the body of a call to @species).\n\nThe idea behind this is that species show very different behaviour during different phases of their lives. Therefore, @phase can be used define the behaviour for one such phase, and the conditions under which the animal transitions to another phase.\n\n@phase works by creating a function that will be called by the model if the animal is in the relevant phase. When it is called, it has access to the following variables:\n\nanimal a reference to the animal itself. This provides access to animal.age, animal.sex, and animal.<trait> (where <trait> is a variable that was defined in the top part of the species definition body).\npos gives the animal's current position as a coordinate tuple.\nmodel a reference to the model world (an object of type AgentBasedModel). This allows access to model.date (the current simulation date) and model.landscape (a two-dimensional array of pixels containing geographic information).\n\nSeveral utility macros can be used within the body of @phase as a short-hand for common expressions: @trait, @setphase, @respond, @kill, @reproduce, @neighbours, @rand, @shuffle!.\n\nNote that the first phase that is defined in a species definition block will be the phase that animals are assigned at birth, unless the variable phase is explicitly defined by the user in the species definition block.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@reproduce-Tuple","page":"Nature","title":"Persefone.@reproduce","text":"@reproduce\n\nLet this animal reproduce. This is a thin wrapper around reproduce!, and passes on any arguments. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@respond-Tuple{Any, Any}","page":"Nature","title":"Persefone.@respond","text":"@respond(eventname, body)\n\nDefine how an animal responds to a landscape event that affects its current position. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@setphase-Tuple{Any}","page":"Nature","title":"Persefone.@setphase","text":"@setphase(newphase)\n\nSwitch this animal over to a different phase. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@species-Tuple{Any, Any}","page":"Nature","title":"Persefone.@species","text":"@species(name, body)\n\nA macro used to create new species definitions for the nature model. This is effectively a simple domain-specific language, establishing a custom syntax to describe species' biology:\n\n@species name begin\n\n @initialise(@habitat(...))\n speciesvar1 = 3.14\n ...\n\n @phase phase1 begin\n ...\n end\nend\n\nThe definition body (enclosed in the begin/end block) has two sections. First comes a call to @initialise, and optionally a list of species-specific parameters, which are assigned just like normal variables. Second come one or more phase definitions, that describe the behaviour of the species during various parts of its life cycle. (See the documentation to @initialise and @phase for details).\n\nCode in a species definition block can access the rest of the model using the model variable (an object of type AgentBasedModel).\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@trait-Tuple{Any}","page":"Nature","title":"Persefone.@trait","text":"@trait(traitname)\n\nA utility macro to quickly access an animal's trait value. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#populations.jl","page":"Nature","title":"populations.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains a set of utility functions for species, including initialisation, reproduction, and mortality.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/populations.jl\"]","category":"page"},{"location":"nature.html#Persefone.countanimals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Nature","title":"Persefone.countanimals","text":"countanimals(pos, model; species=\"\", radius=0)\n\nCount the number of animals in this location (optionally supplying a species name and radius).\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.initpopulation-Tuple{Function}","page":"Nature","title":"Persefone.initpopulation","text":"initpopulation(habitatdescriptor; popsize=-1, pairs=false, asexual=false)\n\nCreates a function that initialises individuals at random locations across the landscape. This can be used to create the initialise! variable in a species definition block.\n\nhabitatdescriptor is a function that determines whether a given location is suitable or not (create this using @habitat).\nphase determines which life phase individuals will be assigned to. If this is nothing, the species' default post-natal life stage will be used (although note that this is probably not what you want).\npopsize determines the number of individuals that will be created. If this is zero or negative, one individual will be created in every suitable location in the landscape. If popsize is greater than the number of suitable locations, multiple individuals will be created in one place. (Maximum population density can be set in the habitat descriptor using the @countanimals macro.)\nIf pairs is true, a male and a female individual will be created in each selected location, otherwise, only one individual will be created at a time.\nIf asexual is true, all created individuals are assigned the sex hermaphrodite, otherwise, they are randomly assigned male of female. (If pairs is true, asexual is ignored.)\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.initrandompopulation-Tuple{Int64}","page":"Nature","title":"Persefone.initrandompopulation","text":"initrandompopulation(popsize; kwargs...)\n\nA simplified version of initpopulation. Creates a function that initialises popsize individuals, spread at random across the landscape.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.kill!","page":"Nature","title":"Persefone.kill!","text":"kill(animal, model, probability=1.0, cause=\"\")\n\nKill this animal, optionally with a given percentage probability. Returns true if the animal dies, false if not.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.nearby_animals-Tuple{Animal, Agents.AgentBasedModel, Int64}","page":"Nature","title":"Persefone.nearby_animals","text":"nearby_animals(animal, model, radius)\n\nReturn an iterator over all animals in the given radius around this animal, excluding itself.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Int64}","page":"Nature","title":"Persefone.nearby_animals","text":"nearby_animals(pos, model, radius)\n\nReturn an iterator over all animals in the given radius around this position.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.reproduce!","page":"Nature","title":"Persefone.reproduce!","text":"reproduce!(animal, model, n=1)\n\nProduce one or more offspring for the given animal at its current location.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#insects.jl","page":"Nature","title":"insects.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains the insect submodel, which calculates the likely insect biomass in a given location at a given time.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/insects.jl\"]","category":"page"},{"location":"nature.html#Persefone.insectbiomass-Tuple{Pixel, Agents.AgentBasedModel}","page":"Nature","title":"Persefone.insectbiomass","text":"insectbiomass(pixel, model)\n\nCalculate the insect biomass in this location, using the factors configured in the nature.insectmodel settings (any combination of: \"season\", \"habitat\", \"weather\", \"pesticides\"). Returns a float value in g/m².\n\nBiological note: this is a very approximate calculation! Insect biomass varies wildly in time and space and is hard to measure. This calculation is based on the idea of a parabolic seasonal development of insect abundance, modified by habitat suitability, weather, and pesticide application. Although it is based on empirical studies, it can only deliver a rough, order-of-magnitude estimation of likely insect biomass in a given location.\n\nSources:\n\nOdderskær et al. (1997). Skylark Reproduction in Pesticide Treated and Untreated Fields (32; Pesticides Research). Danish Environmental Protection Agency.\nGrüebler et al. (2008). A predictive model of the density of airborne insects in agricultural environments. Agriculture, Ecosystems & Environment, 123(1), 75–80. https://doi.org/10.1016/j.agee.2007.05.001\nPaquette et al. (2013). Seasonal patterns in Tree Swallow prey (Diptera) abundance are affected by agricultural intensification. Ecological Applications, 23(1), 122–133. https://doi.org/10.1890/12-0068.1\nPüttmanns et al. (2022). Habitat use and foraging parameters of breeding Skylarks indicate no seasonal decrease in food availability in heterogeneous farmland. Ecology and Evolution, 12(1), e8461. https://doi.org/10.1002/ece3.8461\n\n\n\n\n\n","category":"method"},{"location":"nature.html#ecologicaldata.jl","page":"Nature","title":"ecologicaldata.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains a set of life-history related utility functions needed by species.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/ecologicaldata.jl\"]","category":"page"},{"location":"nature.html#Persefone.initecologicaldata-Tuple{Agents.AgentBasedModel}","page":"Nature","title":"Persefone.initecologicaldata","text":"initecologicaldata()\n\nCreate output files for each data group collected by the nature model.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.saveindividualdata-Tuple{Agents.AgentBasedModel}","page":"Nature","title":"Persefone.saveindividualdata","text":"saveindividualdata(model)\n\nReturn a comma-separated set of lines (to be printed to individuals.csv), listing all properties of all animal individuals in the model. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter nature.indoutfreq. WARNING: Produces very big files!\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.savepopulationdata-Tuple{Agents.AgentBasedModel}","page":"Nature","title":"Persefone.savepopulationdata","text":"savepopulationdata(model)\n\nReturn a comma-separated set of lines (to be printed to populations.csv), giving the current date and population size for each animal species. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter nature.popoutfreq.\n\n\n\n\n\n","category":"method"},{"location":"gui.html#Graphical-User-Interface","page":"Graphical User Interface","title":"Graphical User Interface","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Due to the computational demands of simulating many individuals at high temporal and spatial resolution, Persefone.jl is primarily designed to be run non-interactively on an HPC. However, to allow interactive exploratory simulations to be conducted while learning or developing the model, a graphical user interface is available as an additional package: Persefone Desktop.","category":"page"},{"location":"gui.html#Install-and-run","page":"Graphical User Interface","title":"Install and run","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"For more detailed installation instructions, see here.","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"To install: Install Julia and download/clone the repository. Open a Julia REPL in the downloaded folder and execute the following to install all dependencies:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"using Pkg\nPkg.activate(\".\")\nPkg.instantiate()","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"To run: Run desktop.jl. Alternatively, open a Julia REPL in this folder and run:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"using Pkg\nPkg.activate(\".\")\nusing PersefoneDesktop\nlaunch()","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Note: Due to the necessary pre-compilation done by Julia, installing and launching the application can take quite a long time. (Start-up time with desktop.jl is currently about 2 minutes.) We will reduce this as much as possible in future releases.","category":"page"},{"location":"gui.html#User-interface","page":"Graphical User Interface","title":"User interface","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"(Image: Persefone.jl Desktop screenshot)","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"The main window component is the map view. This displays a land cover map of the simulated region: dark green are forests, light green grassland, yellow fields, red built-up areas and blue water. On it, little circles show the position of individual animals, with different species denoted by different colours.","category":"page"},{"location":"gui.html#Control-bar","page":"Graphical User Interface","title":"Control bar","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Back button: Rewind the simulation by one day.\nStep button: Advance the simulation by one day.\nRun button: Run the simulation until the button is pressed again or the end date is reached.\nProgress bar: Shows the percentage of time elapsed between the start and end dates of the simulation.\nSpeed slider: Set the time delay between each simulation step when running.\nDate: Shows the simulation date currently displayed on the map.","category":"page"},{"location":"gui.html#Menu-bar","page":"Graphical User Interface","title":"Menu bar","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Simulation:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"New simulation: Reset the model and start over.\nConfigure simulation: Change the model settings (not yet implemented).\nLoad saved state: Load a model object file saved by a previous simulation run.\nSave current state: Save a model object file for later use.\nQuit: Close the application.","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Data:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Show population graph: Show a window with a graph of population sizes over time in the current model run.\nSave simulation output: Save the model output data to file (saves both raw CSV data and generated graphics).","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Help:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Documentation: Open the Persefone.jl online documentation in a browser.\nWebsite: Open the main Persefone.jl website in a browser.\nAbout: Show a window with core information about the application.","category":"page"},{"location":"io.html#Input-and-Output","page":"Input and Output","title":"Input and Output","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"These functions are responsible for reading in all model configurations (passed by config file or commandline), administrating them during a run, and printing or plotting any output.","category":"page"},{"location":"io.html#input.jl","page":"Input and Output","title":"input.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"core/input.jl\"]","category":"page"},{"location":"io.html#Persefone.PARAMFILE","page":"Input and Output","title":"Persefone.PARAMFILE","text":"The file that stores all default parameters: src/parameters.toml\n\n\n\n\n\n","category":"constant"},{"location":"io.html#Persefone.flattenTOML-Tuple{Any}","page":"Input and Output","title":"Persefone.flattenTOML","text":"flattenTOML(dict)\n\nAn internal utility function to convert the two-dimensional dict returned by TOML.parsefile() into a one-dimensional dict, so that instead of writing settings[\"domain\"][\"param\"] one can use settings[\"domain.param\"]. Can be reversed with prepareTOML.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.getsettings","page":"Input and Output","title":"Persefone.getsettings","text":"getsettings(configfile, seed=nothing)\n\nCombines all configuration options to produce a single settings dict. Precedence: commandline parameters - user config file - default values\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.loadmodelobject-Tuple{String}","page":"Input and Output","title":"Persefone.loadmodelobject","text":"loadmodelobject(fullfilename)\n\nDeserialise a model object that was previously saved with [savemodelobject](@ref).\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.parsecommandline-Tuple{}","page":"Input and Output","title":"Persefone.parsecommandline","text":"parsecommandline()\n\nCertain software parameters can be set via the commandline.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}","page":"Input and Output","title":"Persefone.preprocessparameters","text":"preprocessparameters(settings)\n\nTake the raw input parameters and process them (convert types, perform checks, etc.). This is a helper function for getsettings.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.@param-Tuple{Any}","page":"Input and Output","title":"Persefone.@param","text":"@param(domainparam)\n\nReturn a configuration parameter from the global settings. The argument should be in the form <domain>.<parameter>, for example @param(core.outdir). Possible values for <domain> are core, nature, farm, or crop. For a full list of parameters, see src/parameters.toml.\n\nNote: this macro only works in a context where the model object is available!\n\n\n\n\n\n","category":"macro"},{"location":"io.html#Persefone.@rand-Tuple","page":"Input and Output","title":"Persefone.@rand","text":"@rand(args...)\n\nReturn a random number or element from the sample, using the model RNG. This is a utility wrapper that can only be used a context where the model object is available.\n\n\n\n\n\n","category":"macro"},{"location":"io.html#Persefone.@shuffle!-Tuple{Any}","page":"Input and Output","title":"Persefone.@shuffle!","text":"@shuffle!(collection)\n\nShuffle the given collection in place, using the model RNG. This is a utility wrapper that can only be used a context where the model object is available.\n\n\n\n\n\n","category":"macro"},{"location":"io.html#output.jl","page":"Input and Output","title":"output.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"core/output.jl\"]","category":"page"},{"location":"io.html#Persefone.DataOutput","page":"Input and Output","title":"Persefone.DataOutput","text":"DataOutput\n\nA struct for organising model output. This is used to collect model data in an in-memory dataframe or for CSV output. Submodels can register their own output functions using newdataoutput!.\n\nStruct fields: - name: a string identifier for the data collection (used as file name) - header: a list of column names - outputfunction: a function that takes a model object and returns data values to record (formatted as a vector of vectors) - frequency: how often to call the output function (daily/monthly/yearly/end/never) - plotfunction: a function that takes a model object and returns a Makie figure object (optional)\n\n\n\n\n\n","category":"type"},{"location":"io.html#Persefone.createdatadir-Tuple{String, Union{Bool, String}}","page":"Input and Output","title":"Persefone.createdatadir","text":"createdatadir(outdir, overwrite)\n\nCreates the output directory, dealing with possible conflicts.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.modellogger-Tuple{String, String}","page":"Input and Output","title":"Persefone.modellogger","text":"modellogger(loglevel, outdir)\n\nCreate a logger object that writes output both to screen and to a logfile. This object is stored as model.logger and can then be used with with_logger(). Note: requires createdatadir to be run first.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.newdataoutput!","page":"Input and Output","title":"Persefone.newdataoutput!","text":"newdataoutput!(model, name, header, outputfunction, frequency)\n\nCreate and register a new data output. This function must be called by all submodels that want to have their output functions called regularly.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.outputdata","page":"Input and Output","title":"Persefone.outputdata","text":"outputdata(model, force=false)\n\nCycle through all registered data outputs and activate them according to their configured frequency. If force is true, activate all outputs regardless of their configuration.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.prepareTOML-Tuple{Any}","page":"Input and Output","title":"Persefone.prepareTOML","text":"prepareTOML(dict)\n\nAn internal utility function to re-convert the one-dimensional dict created by flattenTOML into the two-dimensional dict needed by TOML.print, and convert any data types into TOML-compatible types where necessary.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.saveinputfiles-Tuple{Agents.AgentBasedModel}","page":"Input and Output","title":"Persefone.saveinputfiles","text":"saveinputfiles(model)\n\nCopy all input files into the output directory, including the actual parameter settings used. This allows replicating a run in future.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.savemodelobject-Tuple{Agents.AgentBasedModel, String}","page":"Input and Output","title":"Persefone.savemodelobject","text":"savemodelobject(model, filename)\n\nSerialise a model object and save it to file for later reference. Includes the current model and Julia versions for compatibility checking.\n\nWARNING: produces large files (>100 MB) and takes a while to execute.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.visualiseoutput","page":"Input and Output","title":"Persefone.visualiseoutput","text":"visualiseoutput(model)\n\nCycle through all data outputs and call their respective plot functions, saving each figure as a PDF.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.withtestlogger-Tuple{Agents.AgentBasedModel}","page":"Input and Output","title":"Persefone.withtestlogger","text":"withtestlogger(model)\n\nReplace the model logger with the currently active logger. This is intended to be used in the testsuite to circumvent a Julia issue, where @test_logs doesn't work with local loggers.\n\n\n\n\n\n","category":"method"},{"location":"io.html#makieplots.jl","page":"Input and Output","title":"makieplots.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"analysis/makieplots.jl\"]","category":"page"},{"location":"io.html#Persefone.gettickmarks-Tuple{Any}","page":"Input and Output","title":"Persefone.gettickmarks","text":"gettickmarks(dates)\n\nGiven a vector of dates, construct a selection to use as tick mark locations. Helper function for [populationtrends](@ref)\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.populationtrends-Tuple{Agents.AgentBasedModel}","page":"Input and Output","title":"Persefone.populationtrends","text":"populationtrends(model)\n\nPlot a line graph of population sizes of each species over time. Returns a Makie figure object.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.visualisemap","page":"Input and Output","title":"Persefone.visualisemap","text":"visualisemap(model, date, landcovermap)\n\nDraw the model's land cover map and plot all individuals as points on it at the specified date. If no date is passed, use the last date for which data are available. Optionally, you can pass a landcover map image (this is needed to reduce the frequency of disk I/O for Persefone Desktop). Returns a Makie figure object.\n\n\n\n\n\n","category":"function"},{"location":"config.html#Configuration","page":"Configuration","title":"Configuration","text":"","category":"section"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"Persefone requires three input files: a configuration file and two map files. How to generate the map files is documented elsewhere. The configuration file defines parameter values and looks like this (see src/parameters.toml for the default):","category":"page"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"### Persefone.jl - a model of agricultural landscapes and ecosystems in Europe.\n###\n### This is the default configuration file for Persefone, containing all model parameters.\n### The syntax is described here: https://toml.io/en/\n\n[core]\nconfigfile = \"src/parameters.toml\" # location of the configuration file\noutdir = \"results\" # location and name of the output folder\noverwrite = \"ask\" # overwrite the output directory? (true/false/\"ask\")\ncsvoutput = true # save collected data in CSV files\nvisualise = true # generate result graphs\nstoredata = true # keep collected data in memory\nloglevel = \"debug\" # verbosity level: \"debug\", \"info\", \"warn\"\nprocessors = 2 # number of processors to use on parallel runs\nseed = 2 # seed value for the RNG (0 -> random value)\n# dates to start and end the simulation\nstartdate = 2022-01-01\nenddate = 2022-12-31\n\n[world]\nlandcovermap = \"data/regions/jena/landcover.tif\" # location of the landcover map\nfarmfieldsmap = \"data/regions/jena/fields.tif\" # location of the field geometry map\nweatherfile = \"data/regions/jena/weather.csv\" # location of the weather data file\n\t\n[farm]\nfarmmodel = \"FieldManager\" # which version of the farm model to use (not yet implemented)\n\n[nature]\ntargetspecies = [\"Wolpertinger\", \"Wyvern\"] # list of target species to simulate\npopoutfreq = \"daily\" # output frequency population-level data, daily/monthly/yearly/end/never\nindoutfreq = \"end\" # output frequency individual-level data, daily/monthly/yearly/end/never\ninsectmodel = [\"season\", \"habitat\", \"pesticides\", \"weather\"] # factors affecting insect growth\n\t\n[crop]\ncropmodel = \"almass\" # crop growth model to use, \"almass\" or \"aquacrop\"\ncropfile = \"data/crops/almass/crop_data_general.csv\" # file with general crop parameters\ngrowthfile = \"data/crops/almass/almass_crop_growth_curves.csv\" # file with crop growth parameters\t","category":"page"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"info: Parameter scanning\nYou can set any parameter to a list of different values, e.g. seed = [1,2,3]. Persefone will then set up and run multiple simulations, one for every possible combination of parameters that you entered (i.e. do a full-factorial simulation experiment).","category":"page"},{"location":"using.html#The-Persefone.jl-Package","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"This page describes how to run Persefone.jl as a command line application or Julia package, which is the default mode. To use the model with a graphical user interface, see here.","category":"page"},{"location":"using.html#Installation","page":"The Persefone.jl Package","title":"Installation","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"For more detailed installation instructions, see here.","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"Install the latest version of the Julia programming language (1.9+). The recommended editors are VSCode or Emacs. To install the package dependencies, open a Julia REPL in this folder and run:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"using Pkg\nPkg.activate(\".\")\nPkg.instantiate()","category":"page"},{"location":"using.html#Running-from-the-command-line","page":"The Persefone.jl Package","title":"Running from the command line","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"This is the normal mode of operation. Simply execute run.jl in a terminal, typically like so (in Linux):","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"> julia run.jl -c <config>","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"where <config> specifies the configuration file to use. The recommended workflow is to copy scr/parameters.toml to a location of your choice and edit the copy to suit your requirements. The adapted config file can then be passed to run.jl. (If no configuration file is specified, Persefone will run with its default settings.)","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"The full list of commandline arguments is:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"usage: run.jl [-c CONFIGFILE] [-s SEED] [-o OUTDIR] [-l LOGLEVEL] \n [--version] [-h]\n\noptional arguments:\n -c, --configfile CONFIGFILE\n name of the configuration file\n -s, --seed SEED inital random seed (type: Int64)\n -o, --outdir OUTDIR location of the output directory\n -l, --loglevel LOGLEVEL\n verbosity: \"debug\", \"info\", or \"quiet\"\n --version show version information and exit\n -h, --help show this help message and exit","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"To run the test suite, switch to the test directory and execute runtests.jl.","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"If you are on Linux or MacOS, you can also use make:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"> make run # run a simulation with default values\n> make test # run the test suite\n> make profile # run and profile a default simulation\n> make docs # build the documentation\n> make release # create a release","category":"page"},{"location":"using.html#Running-from-within-Julia","page":"The Persefone.jl Package","title":"Running from within Julia","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"To use the model from within Julia (either inside an interactive REPL or if you want to import it from your own software), do the following:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"using Pkg\nPkg.activate(\".\") # assuming you're in the Persefone root folder\nusing Persefone","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"You can then access all Persefone functions, such as simulate, initialise, stepsimulation!, simulate!, or visualiseoutput. (See src/Persefone.jl for a list of exported functions.)","category":"page"},{"location":"architecture.html#Source-code-architecture","page":"Source code architecture","title":"Source code architecture","text":"","category":"section"},{"location":"architecture.html#Model-components","page":"Source code architecture","title":"Model components","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"(Image: \"model architecture\")","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Persefone is divided into four components, three of which are semi-independent submodels:","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"core: This is the foundation of the model software, which sets up and executes simulation runs. It also reads in the configuration file and landscape maps, and provides data output functionality. (Eventually, it will also provide weather data.)\nnature: This is an individual-based model of species in agricultural landscapes. It defines the Animal agent type, and a set of macros that can be used to rapidly create new species. It also includes ecological process functions that are useful for all species.\nfarm: This is an agent-based model of farmer decision making. It is not yet implemented, but will provide the Farmer agent type.\ncrop: This is a mathematical growth model for various crops. It is not yet implemented, but already provides the agent type FarmPlot, representing one field and its associated extent and crop type.","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Conceptually, core provides functionality that is needed by all of the submodels. Decisions made by Farmers affect the FarmPlots they own, and (directly or indirectly) the Animals in the model landscape.","category":"page"},{"location":"architecture.html#Important-implementation-details","page":"Source code architecture","title":"Important implementation details","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"(Image: \"the model object\")","category":"page"},{"location":"architecture.html#The-model-object","page":"Source code architecture","title":"The model object","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"A cursory reading of the source code will quickly show that most functions take an AgentBasedModel object as one of their arguments. This is the key data structure of Agents.jl, and holds all state that is in any way relevant to a simulation run. (Persefone has a strict \"no global state\" policy to avoid state-dependent bugs and allow parallelisation.) The model object gives access to all agent instances (via model[id], where id is the unique identifier of this agent). It also stores the configuration (model.settings), the landscape (model.landscape, a matrix of Pixel objects that store the local land cover, amongst other things), and the current simulation date (model.date). (See Persefone.initmodel for details.)","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"For more information about working with agent objects, see the Agents.jl API.","category":"page"},{"location":"architecture.html#Model-configuration/the-@param-macro","page":"Source code architecture","title":"Model configuration/the @param macro","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"The model is configured via a TOML file, the default version of which is at src/parameters.toml. An individual run can be configured using a user-defined configuration file, commandline arguments, or function calls (when Persefone is used as a package rather than an application). During a model run, the @param macro can be used to access parameter values. Note that parameter names are prepended with the name of the component they are associated with. For example, the outdir parameter belongs to the [core] section of the TOML file, and must therefore be referenced as @param(core.outdir). (See src/core/input.jl for details.)","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"info: @param and other macros\nAs @param(parameter) expands to model.settings[\"parameter\"], it can obviously only be used in a context where the model object is actually available. (This is the case for most functions in Persefone, but not for all.) Similarly, many of the nature macros depend on specific variables being available where they are called, and can therefore only be used in specific contexts (this is indicated in their documentation).","category":"page"},{"location":"architecture.html#Output-data","page":"Source code architecture","title":"Output data","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Persefone can output model data into text files with a specified frequency (daily, monthly, yearly, or at the simulation end). Submodels can use Persefone.newdataoutput! to plug into this system. For an example of how to use this, see src/nature/ecologicaldata.jl. (See src/core/output.jl for details.)","category":"page"},{"location":"architecture.html#Farm-events","page":"Source code architecture","title":"Farm events","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"The FarmEvent struct is used to communicate farming-related events between submodels. An event can be triggered with createevent! and affects all pixels within a FarmPlot. (See src/core/landscape.jl for details.)","category":"page"},{"location":"architecture.html#Random-numbers-and-logging","page":"Source code architecture","title":"Random numbers and logging","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"By default in Julia, the random number generator (RNG) and the system logger are two globally accessible variables. As Persefone needs to avoid all global data (since this would interfere with reproducibility in parallel runs), the model object stores a local logger and a local RNG. The local logger generally does not change the way the model uses log statements, it is only relevant for some functions in src/core/simulation.jl.","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"info: Using the model RNG\nWhenever you need to use a random number, you must use the model.rng. The easiest way to do this is with the @rand and @shuffle! macros. (Note that these, too, require access to the model object.)","category":"page"},{"location":"species.html#Species","page":"Species","title":"Species","text":"","category":"section"},{"location":"species.html","page":"Species","title":"Species","text":"The ecological submodel in Persefone simulates a range of species in agricultural landscapes.","category":"page"},{"location":"species.html#Skylark","page":"Species","title":"Skylark","text":"","category":"section"},{"location":"species.html","page":"Species","title":"Species","text":"Modules = [Persefone]\nPages = [\"nature/species/skylark.jl\"]","category":"page"},{"location":"species-dsl.html#Defining-new-species","page":"Defining new species","title":"Defining new species","text":"","category":"section"},{"location":"species-dsl.html#The-Persefone-species-DSL","page":"Defining new species","title":"The Persefone species DSL","text":"","category":"section"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"In order to make implementing new species as easy as possible, Persefone includes a domain-specific language (DSL) built from a collection of macros and functions.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Here is an example of what this looks like, using a hypothetical mermaid species:","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"@species Mermaid begin\n ageofmaturity = 2\n pesticidemortality = 1.0\n @initialise(@habitat(@landcover() == water), pairs=true)\n\t\n @phase life begin\n @debug \"$(animalid(animal)) is swimming happily in its pond.\"\n @respond pesticide @kill(@trait(pesticidemortality), \"poisoning\")\n @respond harvest @setphase(drought)\n @debug \"Animal: $animal\"\n if @trait(sex) == female && @countanimals() < 3 &&\n @trait(age) >= @trait(ageofmaturity) && @landcover() == water\n @reproduce()\n end\n end\n\t\n @phase drought begin\n n = sum(1 for a in @neighbours(0))\n @debug \"$(animalid(animal)) is experiencing drought with $n neighbour(s).\"\n @respond sowing @setphase(life)\n end\nend","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The two most important macros are @species and @phase, followed by @initialise, @trait, @respond, and @habitat. Other macros provide convenience wrappers for common functions. (See src/nature/nature.jl for details.)","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The top-level macro is @species. This takes two arguments: a species name and a definition block (enclosed in begin and end tags). At the start of the definition block, species-specific variables can be defined that should be available throughout a species' lifetime. Code in this section has access to the model object and can thus reference the current model state. In this section, the user also has to call the @initialise macro. This wraps the Persefone.initpopulation function, and takes a habitat descriptor (see @habitat below) and several options to specify how the species' population should be distributed in the landscape during model initialisation.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Following this section, each species must define one or more @phase blocks. The concept behind this is that species show different behaviours at different phases of their lifecycle. Each @phase block defines the behaviour in one of these phases. (Technically, it defines a function that will be called daily, so long as the species' phase variable is set to the name of this phase.) Code in this section has access to the model object as well as an animal object, which is the currently active animal agent. Properties of the animal agent, regardless of whether they were defined by the user or by Persefone, can be accessed using the @trait macro. Within a phase block, @respond can be used to define the species' response to a FarmEvent that affects the species' current location, while a variety of other macros provide wrappers to ecological process functions from src/nature/populations.jl.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Another important macro is @habitat. This defines a \"habitat descriptor\", i.e. a predicate function that tests whether or not a given landscape pixel is suitable for a specified purpose. Such habitat descriptors are used as arguments to various functions, for example for population initialisation or movement. The argument to @habitat consists of a logical expression, which has access to the animal's current position (the pos tuple variable) and the model. Various macros are available to easily reference information about the current location, such as @landcover or @distancetoedge.","category":"page"},{"location":"species-dsl.html#Implementation-details","page":"Defining new species","title":"Implementation details","text":"","category":"section"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Due to a known performance problem with multi-agent models, the underlying implementation of species is rather complicated (see src/nature/nature.jl for details.)","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Rather than creating a new type/struct for each species, all Animal agents have the same type. Instead, they are differentiated by a traits dict, which stores both species-specific parameters and run-time variables. Note that due to a redefinition of the getproperty()/setproperty!() methods, variables from the trait dict can be accessed and modified just like normal struct fields (i.e. although phase is defined in the dict, not the struct, animal.phase = \"newphase\" works just fine - one does not have to use animal.traits[\"phase\"] = \"newphase\".)","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Under the hood, the @species macro generates a function (with the name of the species), which in turn creates the trait dict when called. Thus, adding a new animal agent to the model involves instantiating an Animal object, then calling the relevant species function and attaching the returned dict to the agent object.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Similarly, the @phase macro too works by defining a new function, which is stored in the species' trait dict. These functions take an animal object and the model object as input, and define what the species does during its daily update.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Once again, @habitat creates a function that takes model and pos as input and returns a boolean response. Functions that require a habitat descriptor thus take in this (anonymous) function and call it internally.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Finally, the @initialise macro is a wrapper around Persefone.initpopulation, which (yet again) creates a function that specifies how a species' population is to be initialised at the beginning of a simulation run. This function is stored in the species trait dict and accessed during model setup.","category":"page"},{"location":"developing.html#Developing-Persefone","page":"Developing Persefone","title":"Developing Persefone","text":"","category":"section"},{"location":"developing.html#Setting-up","page":"Developing Persefone","title":"Setting up","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"If you haven't worked with Julia before, here are detailed instructions for how to set up your development environment. The main development is currently done on Linux (and as the primary execution platform will be an HPC, Linux compatibility is important), but developing on Windows works too.","category":"page"},{"location":"developing.html#Visual-Studio-Code-on-Windows","page":"Developing Persefone","title":"Visual Studio Code on Windows","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Download and install Julia, git and Visual Studio Code.\nInstall the Julia extension for VS Code: In VS Code, open the extensions pane (Ctrl+Shift+X). Search for and install Julia Language Support.\nClone the Gitlab repository: In VS Code, open the source control pane (Ctrl+Shift+G). Click on Clone and enter the repo URL. Then select a folder on your computer to download the files into, and let VS Code open the project once it has been cloned.\nStart a Julia REPL: In VS Code, bring up the command palette (Ctrl+Shift+P). Execute the command Julia: Start REPL. Then install all dependencies of Persefone by running using Pkg; Pkg.activate(\".\"); Pkg.instantiate(). (This will take some time.)\nOpen the file run.jl and click Execute (triangular button in the top right). The source code will compile (this can take a lot of time the first time you do it) and run a default simulation.\nFurther steps: You may want to familiarise yourself with how to use git with VS Code. You may also want to clone the Persefone Desktop repository (repeat steps 3 to 5).","category":"page"},{"location":"developing.html#Emacs-on-Linux","page":"Developing Persefone","title":"Emacs on Linux","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"You can of course also use VS Code on Linux. In that case, follow the instructions above.","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Make sure you have git and Julia installed. Git should be in your distro's repos (e.g. sudo apt install git). To install Julia, download the binary and unpack it. For greater ease of use, copy the unpacked files to /usr/local/lib/julia (or similar) and create a symlink to the executable: sudo ln -s /usr/local/lib/julia/bin/julia /usr/local/bin/julia. Then go the to folder that you want to use for development and run git clone https://git.idiv.de/persefone/persefone-model.git . in your terminal.","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"There are a couple of addons that make working with Julia much nicer in Emacs:","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"julia-mode gives syntax highlighting. Install with M-x package-install julia-mode.\njulia-snail provides IDE-like features, especially a fully-functional REPL and the ability to evaluate code straight from inside a buffer. Note that the installation can be somewhat tricky. You first need to manually install all the dependencies of its dependency vterm, then install vterm itself with M-x package-install vterm, before you can do M-x package-install julia-snail. Then add it to your init.el with (require 'julia-snail) and (add-hook 'julia-mode-hook #'julia-snail-mode).\ncompany-mode integrates with Snail to give code completion. Install with M-x package-install company, then add (add-hook 'julia-mode-hook #'company-mode) and (global-set-key (kbd \"C-<tab>\") 'company-complete) to your init.el.\nmagit is a great git interface for Emacs. Install with M-x package-install magit and add (global-set-key (kbd \"C-x g\") 'magit-status) to your init.el.","category":"page"},{"location":"developing.html#Development-workflow","page":"Developing Persefone","title":"Development workflow","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Pull the current version from the master branch on Gitlab: https://git.idiv.de/persefone/persefone-model.\nIf you are working on a new feature, create a new branch to avoid breaking the master branch. (The master branch on Github should always be in a runnable and error-free state.)\nImplement your changes.\nRun an example simulation and the test suite to make sure everything works without crashing (make run and make test on Linux, or execute run.jl and test/runtests.jl manually.)\nCommit your work frequently, and try to keep each commit small. Don't forget to add relevant tests to the test suite.\nOnce your satisfied with your work, do another pull/merge from the master branch in case somebody else changed the branch in the meantime. Then merge your work into master and push to the Gitlab server.\nRepeat :-)","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"The Gitlab issue tracker can be used to create, discuss, and assign tasks, as well as to monitor progress towards milestones/releases. Once we have a first release, we will start using semantic versioning and a changelog.","category":"page"},{"location":"developing.html#Important-libraries","page":"Developing Persefone","title":"Important libraries","text":"","category":"section"},{"location":"developing.html#Agents.jl","page":"Developing Persefone","title":"Agents.jl","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Our model uses Agents.jl as a framework. Their repository can be used to inspect the source code or submit bug reports (the authors are quick to respond). Questions can be asked at the Julia Discourse forum.","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Tutorial on collaborating on Julia packages: https://www.matecdev.com/posts/julia-package-collaboration.html.","category":"page"},{"location":"developing.html#Revise.jl","page":"Developing Persefone","title":"Revise.jl","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Revise.jl allows one to reload code without restarting the Julia interpreter. Get it with Pkg.add(\"Revise\"), then add using Revise to .julia/config/startup.jl to have it automatically available.","category":"page"},{"location":"developing.html#Test","page":"Developing Persefone","title":"Test","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Persefone uses the inbuilt Julia testing framework. All new functions should have appropriate tests written for them in the appropriate file in the test directory. (See test/runtests.jl for details.) There are three ways to run the test suite: in the terminal, executing make test or cd test; julia runtests.jl; or in the Julia REPL, Pkg.activate(\".\"); Pkg.test().","category":"page"},{"location":"developing.html#Documenter.jl","page":"Developing Persefone","title":"Documenter.jl","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"The HTML documentation is generated using Documenter.jl. Therefore, all new functions should have docstrings attached. New files need to be integrated into the relevant documentation source files in docs/src, and if necessary into docs/builddocs.jl. To build the documentation, run make docs, or cd docs; julia builddocs.jl (if using the latter, don't forget to update the date and commit in docs/src/index.md).","category":"page"},{"location":"developing.html#Graphics-and-user-interface","page":"Developing Persefone","title":"Graphics and user interface","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Persefone uses Makie as a plotting library to generate its output graphics. Additionally, Persefone Desktop uses QML.jl to create its graphical user interface.","category":"page"},{"location":"simulation.html#Simulation","page":"Simulation","title":"Simulation","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"The core and world directories hold source files that are important for all submodels, including scheduling, landscape, weather, and input/output functions.","category":"page"},{"location":"simulation.html#simulation.jl","page":"Simulation","title":"simulation.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file includes the basal functions for initialising and running simulations.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"core/simulation.jl\"]","category":"page"},{"location":"simulation.html#Persefone.finalise!-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.finalise!","text":"finalise!(model)\n\nWrap up the simulation. Currently doesn't do anything except print some information.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.initialise","page":"Simulation","title":"Persefone.initialise","text":"initialise(config=PARAMFILE, seed=nothing)\n\nInitialise the model: read in parameters, create the output data directory, and instantiate the AgentBasedModel object(s). Optionally allows specifying the configuration file and overriding the seed parameter. This returns a single model object, unless the config file contains multiple values for one or more parameters, in which case it creates a full-factorial simulation experiment and returns a vector of model objects.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}","page":"Simulation","title":"Persefone.initmodel","text":"initmodel(settings)\n\nInitialise a model object using a ready-made settings dict. This is a helper function for initialise().\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}","page":"Simulation","title":"Persefone.paramscan","text":"paramscan(settings)\n\nCreate a list of settings dicts, covering all possible parameter combinations given by the input settings (i.e. a full-factorial experiment). This is a helper function for initialise().\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.simulate","page":"Simulation","title":"Persefone.simulate","text":"simulate(config=PARAMFILE, seed=nothing)\n\nInitialise one or more model objects and carry out a full simulation experiment, optionally specifying a configuration file and a seed for the RNG.\n\nThis is the default way to run a Persefone simulation.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.simulate!-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.simulate!","text":"simulate!(model)\n\nCarry out a complete simulation run using a pre-initialised model object.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.stepsimulation!","text":"stepsimulation!(model)\n\nExecute one update of the model.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#landscape.jl","page":"Simulation","title":"landscape.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file manages the landscape maps that underlie the model.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"world/landscape.jl\"]","category":"page"},{"location":"simulation.html#Persefone.EventType","page":"Simulation","title":"Persefone.EventType","text":"The types of landscape event that can be simulated\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.FarmEvent","page":"Simulation","title":"Persefone.FarmEvent","text":"FarmEvent\n\nA data structure to define a landscape event, giving its type, spatial extent, and duration.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.LandCover","page":"Simulation","title":"Persefone.LandCover","text":"The land cover classes encoded in the Mundialis Sentinel data.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.Pixel","page":"Simulation","title":"Persefone.Pixel","text":"Pixel\n\nA pixel is a simple data structure to combine land use and ownership information in a single object. The model landscape consists of a matrix of pixels. (Note: further landscape information may be added here in future.)\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.createevent!","page":"Simulation","title":"Persefone.createevent!","text":"createevent!(model, pixels, name, duration=1)\n\nAdd a farm event to the specified pixels (a vector of position tuples) for a given duration.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Function}","page":"Simulation","title":"Persefone.distanceto","text":"distanceto(pos, model, habitatdescriptor)\n\nCalculate the distance from the given location to the closest location matching the habitat descriptor function. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Persefone.LandCover}","page":"Simulation","title":"Persefone.distanceto","text":"distanceto(pos, model, habitattype)\n\nCalculate the distance from the given location to the closest habitat of the specified type. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.distancetoedge","text":"distancetoedge(pos, model)\n\nCalculate the distance from the given location to the closest neighbouring habitat. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.farmplot-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.farmplot","text":"farmplot(position, model)\n\nReturn the farm plot at this position, or nothing if there is none (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.initlandscape-Tuple{String, String}","page":"Simulation","title":"Persefone.initlandscape","text":"initlandscape(landcovermap, farmfieldsmap)\n\nInitialise the model landscape based on the map files specified in the configuration. Returns a matrix of pixels.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.landcover-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.landcover","text":"landcover(position, model)\n\nReturn the land cover class at this position (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.updateevents!-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.updateevents!","text":"updateevents!(model)\n\nCycle through the list of events, removing those that have expired.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#weather.jl","page":"Simulation","title":"weather.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file reads in weather data and makes it available to the model.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"world/weather.jl\"]","category":"page"},{"location":"simulation.html#Persefone.Weather","page":"Simulation","title":"Persefone.Weather","text":"Weather\n\nA single weather datum, combining the observations from one day.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}","page":"Simulation","title":"Persefone.initweather","text":"initweather(weatherfile, startdate, enddate)\n\nLoad a weather file, extract the values that are relevant to this model run (specified by start and end dates), and return a dictionary of Weather objects mapped to dates.\n\nNote: This requires a weather file in the format produced by data/extract_weather_data.R.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.maxtemp-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.maxtemp","text":"maxtemp(model)\n\nReturn today's maximum temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.meantemp-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.meantemp","text":"meantemp(model)\n\nReturn today's mean temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.mintemp-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.mintemp","text":"mintemp(model)\n\nReturn today's minimum temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.precipitation-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.precipitation","text":"precipitation(model)\n\nReturn today's total precipitation in mm.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.sunshine-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.sunshine","text":"sunshine(model)\n\nReturn today's sunshine duration in hours.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.vapourpressure-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.vapourpressure","text":"vapourpressure(model)\n\nReturn today's average vapour pressure in hPa.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.windspeed-Tuple{Agents.AgentBasedModel}","page":"Simulation","title":"Persefone.windspeed","text":"windspeed(model)\n\nReturn today's average windspeed in m/s.\n\n\n\n\n\n","category":"method"},{"location":"farm.html#Farm-submodel","page":"Farm submodel","title":"Farm submodel","text":"","category":"section"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"Eventually, the aim is to create a full socio-economic farm decision model for Persefone. However, for the time being, we will restrict ourselves to a simple model that executes typical farm operations and crop rotations.","category":"page"},{"location":"farm.html#farm.jl","page":"Farm submodel","title":"farm.jl","text":"","category":"section"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"This file is responsible for managing the farm module(s).","category":"page"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"Modules = [Persefone]\nPages = [\"farm/farm.jl\"]","category":"page"},{"location":"farm.html#Persefone.Farmer","page":"Farm submodel","title":"Persefone.Farmer","text":"Farmer\n\nThis is the agent type for the farm ABM. (Not yet implemented.)\n\n\n\n\n\n","category":"type"},{"location":"farm.html#Persefone.initfarms!-Tuple{Agents.AgentBasedModel}","page":"Farm submodel","title":"Persefone.initfarms!","text":"initfarms!(model)\n\nInitialise the model with a set of farm agents.\n\n\n\n\n\n","category":"method"},{"location":"farm.html#Persefone.stepagent!-Tuple{Farmer, Agents.AgentBasedModel}","page":"Farm submodel","title":"Persefone.stepagent!","text":"stepagent!(farmer, model)\n\nUpdate a farmer by one day.\n\n\n\n\n\n","category":"method"},{"location":"adapting.html#Adapting-Persefone","page":"Adapting Persefone","title":"Adapting Persefone","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"A key development goal of Persefone is to be FAIR: findable, accessible, interoperable, and reusable. We aim to build a model that is both easy to use and easy to adapt to new situations.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"There are multiple ways to adapt Persefone for a new modelling study:","category":"page"},{"location":"adapting.html#Changing-the-parameters","page":"Adapting Persefone","title":"Changing the parameters","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"The simplest way to adapt Persefone is simply by changing the parameters. Copy src/parameters.toml to a new location, adjust it to your needs, and run the model using julia run.jl -c <configfile>.","category":"page"},{"location":"adapting.html#Changing-the-region","page":"Adapting Persefone","title":"Changing the region","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To apply Persefone to a new region, you need to create new input maps of land cover and farmplots. How to do so is described here.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"You may also need to change aspects of the farm submodel. This is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-new-animal-species","page":"Adapting Persefone","title":"Adding new animal species","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To implement a new species to the nature submodel, add a new file to the src/nature/species directory and include it in src/Persefone.jl, as well as adding the name of the species to the nature.targetspecies parameter. In the new file, implement the species using the @species syntax as described here.","category":"page"},{"location":"adapting.html#Adding-new-crop-species","page":"Adapting Persefone","title":"Adding new crop species","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Crop growth is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-new-farmer-behaviour","page":"Adapting Persefone","title":"Adding new farmer behaviour","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Farmer behaviour is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-a-new-submodel","page":"Adapting Persefone","title":"Adding a new submodel","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To add a new submodel in addition to the existing ones (nature, crop, and farm), you need to familiarise yourself with the software architecture. In particular, you need to understand how initialisation and scheduling works in src/core/simulation.jl, and what information is stored in the model object.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"If you want to add a new agent type, use Agents.jl's @agent macro. (But be aware that Persefone already has three agent types and you may encounter performance problems.) Having implemented the new agent type, add it to the model objects type definition and scheduler, and write an initialisation function and a stepagent! function. (See Persefone.initmodel and stepsimulation! for details.)","category":"page"},{"location":"adapting.html#Linking-to-another-model","page":"Adapting Persefone","title":"Linking to another model","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Persefone can also be used as a software library and be called from another application. For this purpose, it is set up as a Julia package, with a module exporting various model functions, types, and macros (see src/Persefone.jl). Of particular interest are the functions simulate (set up and run a complete simulation based on a config file), initialise (create one or more model objects from a config file), simulate! (do a simulation run with an existing model object), and stepsimulation! (update a model object by one time step).","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To interface with Julia from another language, see the Julia docs here and here.","category":"page"},{"location":"odd.html#Overview,-Design,-Details-(ODD)","page":"Overview, Design, Details (ODD)","title":"Overview, Design, Details (ODD)","text":"","category":"section"},{"location":"odd.html","page":"Overview, Design, Details (ODD)","title":"Overview, Design, Details (ODD)","text":"TODO","category":"page"},{"location":"gis.html#Maps-and-weather-data","page":"Maps and weather data","title":"Maps and weather data","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Persefone currently requires two separate map input files: one for land cover, the other for field geometry. Additionally, a weather input file is needed. This documents describe how to obtain and process the data needed for each of these.","category":"page"},{"location":"gis.html#Land-cover-maps","page":"Maps and weather data","title":"Land cover maps","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Land cover maps for Germany at 10m resolution can be obtained from Mundialis. These are generated annually from Sentinel data and comprise the following land cover classes:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"10: forest\n20: low vegetation\n30: water\n40: built-up\n50: bare soil\n60: agriculture","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"To create a Persefone map input file, you need to crop the national Mundialis map to the extent that you want to simulate (suggestion: approx. 10x10km is a reasonable size).","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"To do so, download the Mundialis map and import it into QGIS. Then create a new vector layer and create a rectangle feature to delimit the extent of your region. Then go to Raster -> Extraction -> Clip Raster by Extent. Select the Mundialis map as the input layer, set the clipping extent by choosing your region vector layer under Calculate from Layer and specify the output file name before clicking Run. This will generate a TIF file that you can pass to Persefone as the landcovermap parameter.","category":"page"},{"location":"gis.html#Field-ID-maps","page":"Maps and weather data","title":"Field ID maps","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"In addition to the land cover data explained above, Persefone also needs information about agricultural field boundaries in order to assign these to the farming agents. Unfortunately, getting this is rather more complicated.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"In the EU, every country runs a Land Parcel Information System (LPIS) to administer CAP payments. In Germany, this is called InVeKoS and is run by the Länder. For example, you can view and download the InVeKoS data for Thüringen here. This gives you a vector layer which can be loaded into QGIS. However, it needs to be converted to a raster layer and cropped to your region extent before it can be used in Persefone.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"The first thing to do is to make sure that the vector layer has a numeric (!) field with a unique identifier for each field block (check the attribute table). The Thüringen data has the FBI (\"Feldblockident\") field, but this is a string value and therefore not usable by the rasteriser. So, we set the vector layer to edit mode, open the field calculator, enter the information for a new field (call it \"FID\" and set it to a 32-bit integer), and enter @row_number in the expression field. Then save the layer and close the calculator.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Secondly, you need to filter out all non-field/non-grassland plot types. (LPIS also has data on forests and various landscape elements that are not relevant to our use case.) Assuming you're working with the Thüringen InVeKoS data (other data sets may have a different structure), right-click on the layer name in QGIS' layer overview and click on \"Filter...\". Then, enter this expression in the query builder: \"BNK\" = 'AL' OR \"BNK\" = 'GL' and click \"OK\". This will select only field and grassland plots.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Next, open the rasteriser (Raster -> Conversion -> Rasterize). Select your FID field as the \"Field to use for a burn-in value\", and your land cover map (as created above - this ensures the two layers match) as the output extent. Make sure the \"fixed value to burn\" is \"Not set\". Then choose \"Georeferenced units\" as the \"Out raster size units\" and set horizontal and vertical resolution to 10.0. In the advanced parameters, set the output data type to UInt32. Finally, enter an output file name and run. The resulting TIF file can be passed to Persefone as the farmfieldmap parameter.","category":"page"},{"location":"gis.html#Weather-data","page":"Maps and weather data","title":"Weather data","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Currently, Persefone uses historical weather data from the closes weather station as its weather input. (In future, this may be changed to a more detailed raster input, which could then also provide future weather predictions under climate change.) Weather data can be downloaded from the German weather service (DWD). The relevant data are in the folder daily/kl/historical.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"The description of this data set and the list of weather stations can be found in the Persefone repository, in the docs folder (or downloaded from the link above). Using the list of weather stations, select the one closest to the area of study. Note that not all stations were continuously in operation; make sure that the selected station covers the years of interest.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Region Jena: station number 02444 (\"Jena (Sternwarte)\")\nRegion Eichsfeld:\nRegion Thüringer Becken:\nRegion Hohenlohe:\nRegion Bodensee:\nRegion Nördlicher Oberrhein:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"From the link above, download the ZIP file associated with the station number. Check the included meta-data if there is any important missing data, or other relevant information (e.g. the station moved position).","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Then use data/extract_weather_data.R to process the data into the format needed by Persefone:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"library(tidyverse)\n\n## replace this with the correct file name\nweatherfile = \"produkt_klima_tag_18210101_20221231_02444.txt\"\n\ndata = read.table(weatherfile, sep=\";\", header=T)\n\nweather = data %>%\n ## drop values before 2000 to save space\n filter(MESS_DATUM>=20000101) %>%\n ## select relevant variables and convert place-holder values to NA\n select(MESS_DATUM, FM, RSK, SDK, VPM, TMK, TXK, TNK) %>%\n mutate(date=MESS_DATUM, MESS_DATUM=NULL,\n mean_windspeed=na_if(FM, -999), FM=NULL,\n precipitation=na_if(RSK, -999), RSK=NULL,\n sunshine_hours=na_if(SDK, -999), SDK=NULL,\n mean_vapour_pressure=na_if(VPM, -999), VPM=NULL,\n mean_temperature=na_if(TMK, -999), TMK=NULL,\n max_temperature=na_if(TXK, -999), TXK=NULL,\n min_temperature=na_if(TNK, -999), TNK=NULL)\n\n## replace with the desired file name\nwrite.csv(weather, file=\"weather_jena.csv\", row.names=FALSE)","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Note: for calculating the reference evapotranspiration ET_0 (needed for the AquaCrop model), use the FAO Penman-Monteith equation.","category":"page"},{"location":"crops.html#Crop-submodel","page":"Crop submodel","title":"Crop submodel","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Eventually, the plan is to have Persefone include a reimplementation of the AquaCrop model, a well-established crop growth model developed by the FAO. Until then, we are using the crop growth submodel used in ALMaSS.","category":"page"},{"location":"crops.html#farmplot.jl","page":"Crop submodel","title":"farmplot.jl","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"This file is responsible for the farm plots, i.e. the indidivual fields that farmers manage.","category":"page"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Modules = [Persefone]\nPages = [\"crop/farmplot.jl\"]","category":"page"},{"location":"crops.html#Persefone.FarmPlot","page":"Crop submodel","title":"Persefone.FarmPlot","text":"FarmPlot\n\nThis represents one field, i.e. a collection of pixels with the same management. This is the spatial unit with which the crop growth model and the farm model work.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.averagefieldsize-Tuple{Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.averagefieldsize","text":"averagefieldsize(model)\n\nCalculate the average field size in hectares for the model landscape.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.cropheight-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.cropheight","text":"cropheight(model, position)\n\nReturn the height of the crop at this position, or nothing if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.cropname-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.cropname","text":"cropname(model, position)\n\nReturn the name of the crop at this position, or nothing if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.croptype-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.croptype","text":"croptype(model, position)\n\nReturn the crop at this position, or nothing if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.growcrop!-Tuple{FarmPlot, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.growcrop!","text":"growcrop!(farmplot, model)\n\nApply the relevant crop growth model to update the plants on this farm plot. Currently only supports the ALMaSS crop growth model by Topping et al.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.harvest!-Tuple{FarmPlot, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.harvest!","text":"harvest!(farmplot, model)\n\nHarvest the crop on this farmplot.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.initfields!-Tuple{Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.initfields!","text":"initfields!(model)\n\nInitialise the model with its farm plots.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.sow!-Tuple{String, FarmPlot, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.sow!","text":"sow!(cropname, farmplot, model)\n\nSow the specified crop on this farmplot.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.stepagent!-Tuple{FarmPlot, Agents.AgentBasedModel}","page":"Crop submodel","title":"Persefone.stepagent!","text":"stepagent!(farmplot, model)\n\nUpdate a farm plot by one day.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#crops.jl","page":"Crop submodel","title":"crops.jl","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"This includes the types and functions needed for all crop growth model, which are also referenced by the other submodels.","category":"page"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Modules = [Persefone]\nPages = [\"crop/crops.jl\"]","category":"page"},{"location":"crops.html#Persefone.CropCurveParams","page":"Crop submodel","title":"Persefone.CropCurveParams","text":"CropCurveParams\n\nThe values in this struct define one crop growth curve.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.CropType","page":"Crop submodel","title":"Persefone.CropType","text":"CropType\n\nThe type struct for all crops. Currently follows the crop growth model as implemented in ALMaSS.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.GrowthPhase","page":"Crop submodel","title":"Persefone.GrowthPhase","text":"GrowthPhase\n\nALMaSS crop growth curves are split into five phases, triggered by seasonal dates or agricultural events.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}","page":"Crop submodel","title":"Base.tryparse","text":"Base.tryparse(type, str)\n\nExtend tryparse to allow parsing GrowthPhase values. (Needed to read in the CSV parameter file.)\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}","page":"Crop submodel","title":"Persefone.buildgrowthcurve","text":"buildgrowthcurve(data)\n\nConvert a list of rows from the crop growth data into a CropCurveParams object.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.readcropparameters-Tuple{String, String}","page":"Crop submodel","title":"Persefone.readcropparameters","text":"readcropparameters(generalcropfile, cropgrowthfile)\n\nParse a CSV file containing the required parameter values for each crop (as produced from the original ALMaSS file by convert_almass_data.py).\n\n\n\n\n\n","category":"method"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"CurrentModule = Persefone","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"(Image: Persefone.jl splash screen)","category":"page"},{"location":"index.html#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Persefone.jl models agricultural practice and how it impacts animal species at a landscape scale. It includes a farm submodel, a crop growth submodel, and individual-based models of multiple indicator species. Its aim is to investigate how changes in farm operations (e.g. through policy changes in the CAP) influence biodiversity.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"The model is open-source software available on Gitlab.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Last updated: 2023-10-27 (commit b27fb1b)","category":"page"}] +[{"location":"energy.html#Dynamic-Energy-Budgets","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"","category":"section"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Persefone's nature module uses Kooijman's Dynamic Energy Budget theory to model energy flows within individuals.","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"(Image: \"The standard model of the Dynamic Energy Budget theory\")","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"The standard model of the Dynamic Energy Budget theory. (Fig. 1 from Sousa et al. (2010).)","category":"page"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Sousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428.\nKooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press.\nSibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161.","category":"page"},{"location":"energy.html#energy.jl","page":"Dynamic Energy Budgets","title":"energy.jl","text":"","category":"section"},{"location":"energy.html","page":"Dynamic Energy Budgets","title":"Dynamic Energy Budgets","text":"Modules = [Persefone]\nPages = [\"nature/energy.jl\"]","category":"page"},{"location":"energy.html#Persefone.DEBparameters","page":"Dynamic Energy Budgets","title":"Persefone.DEBparameters","text":"DEBparameters\n\nAn immutable struct to save the parameter list for a species' Dynamic Energy Budget model. (See Sousa et al., 2010.)\n\n\n\n\n\n","category":"type"},{"location":"energy.html#Persefone.EnergyBudget","page":"Dynamic Energy Budgets","title":"Persefone.EnergyBudget","text":"EnergyBudget\n\nThis struct represents an individual's energy balance, as conceptualised by the Dynamic Energy Budget theory. Upon assimilation, energy is first stored as biomass in a reserve buffer, before being used for maintenance, growth, and reproduction. (Note that this is a simplified model form which ignores maturity as a separate buffer.)\n\nSources:\n\nMalishev & Kramer-Schadt (2021). Movement, models, and metabolism: Individual-based energy budget models as next-generation extensions for predicting animal movement outcomes across scales. Ecological Modelling, 441, 109413. https://doi.org/10.1016/j.ecolmodel.2020.109413\nMarques et al. (2018). The AmP project: Comparing species on the basis of dynamic energy budget parameters. PLOS Computational Biology,14(5), e1006100. https://doi.org/10.1371/journal.pcbi.1006100\nSibly et al. (2013). Representing the acquisition and use of energy by individuals in agent-based models of animal populations. Methods in Ecology and Evolution, 4(2), 151–161. https://doi.org/10.1111/2041-210x.12002\nSousa et al. (2010). Dynamic energy budget theory restores coherence in biology. Philosophical Transactions of the Royal Society B: Biological Sciences, 365(1557), 3413–3428. https://doi.org/10.1098/rstb.2010.0166\nKooijman, S. A. L. M. (2009). Dynamic energy and mass budgets in biological systems (3rd ed). Cambridge University Press. https://www.researchgate.net/profile/Edgar-Meza-3/post/Isthereatoxicokineticmodelfordaphniamagnaorotherzooplankton/attachment/59d62cf579197b807798b396/AS%3A348547653357569%401460111644286/download/Dynamic+Energy+Budget+theory+-+Kooijman.pdf\nsee also: Brown et al. (2004). Toward a metabolic theory of ecology. Ecology, 85(7), 1771–1789. https://doi.org/10.1890/03-9000\n\n\n\n\n\n","category":"type"},{"location":"energy.html#Persefone.feed!-Tuple{Float64, Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.feed!","text":"feed!(quantity, energybudget)\n\nConsume a given quantity of food. Expands the energy reserve by an amount determined by the assimilation rate. Returns true if successful, false if the reserve is already full.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.growthrate-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.growthrate","text":"growthrate(energybudget)\n\nCalculate the specific growth rate r. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.investmentratio-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.investmentratio","text":"investmentratio(energybudget)\n\nCalculate the investment ratio g. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.maturitymaintenance-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.maturitymaintenance","text":"maturitymaintenance(energybudget)\n\nCalculate the specific maturity maintenance k_J. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.mobilisation-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.mobilisation","text":"mobilisation(energybudget)\n\nCalculate the mobilisation rate J_EC. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.reproduce!-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.reproduce!","text":"reproduce!(energybudget)\n\nIf there is sufficient energy in the offspring buffer of an adult, produce an embryo/egg, reducing the parent energy in the process. Returns the embryo's energy budget, or nothing if the conditions are not met.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.scaledreservedensity-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.scaledreservedensity","text":"scaledreservedensity(energybudget)\n\nCalculate the scaled reserve density e. (Internal function.)\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.update!-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.update!","text":"update!(energybudget)\n\nCarry out a daily update of the energy budget. Mobilises reserves and allocates these to maintenance (prioritised), growth, and reproduction.\n\nReturn true if the individual has enough energy to survive, or false if the reserve is empty and it starves.\n\n\n\n\n\n","category":"method"},{"location":"energy.html#Persefone.volumetriclength-Tuple{Persefone.EnergyBudget}","page":"Dynamic Energy Budgets","title":"Persefone.volumetriclength","text":"volumetriclength(energybudget)\n\nCalculate the structural length in cm based on an individual's weight (assuming a density of 1 g/cm³ to calculate volume, see Kooijman 2009).\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Nature","page":"Nature","title":"Nature","text":"","category":"section"},{"location":"nature.html#nature.jl","page":"Nature","title":"nature.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file is responsible for managing the animal modules.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/nature.jl\"]","category":"page"},{"location":"nature.html#Persefone.Animal","page":"Nature","title":"Persefone.Animal","text":"Animal\n\nThis is the generic agent type for all animals. Individual species are created using the @species macro. In addition to user-defined, species-specific fields, all species contain the following fields:\n\nid An integer unique identifier for this individual.\nsex male, female, or hermaphrodite.\nparents The IDs of the individual's parents.\npos An (x, y) coordinate tuple.\nage The age of the individual in days.\nphase The update function to be called during the individual's current life phase.\nenergy A DEBparameters struct for calculating energy budgets.\noffspring A vector containing the IDs of an individual's children.\n\n\n\n\n\n","category":"type"},{"location":"nature.html#Persefone.animalid-Tuple{Animal}","page":"Nature","title":"Persefone.animalid","text":"animalid(animal)\n\nA small utility function to return a string with the species name and ID of an animal.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.create!-Tuple{Animal, SimulationModel}","page":"Nature","title":"Persefone.create!","text":"create!(animal, model)\n\nThe create! function is called for every individual at birth or at model initialisation. Species must use @create to define a species-specific method. This is the fall- back method, in case none is implemented for a species.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.initnature!-Tuple{SimulationModel}","page":"Nature","title":"Persefone.initnature!","text":"initnature!(model)\n\nInitialise the model with all simulated animal populations.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.killallanimals!-Tuple{Any}","page":"Nature","title":"Persefone.killallanimals!","text":"killallanimals!(model)\n\nRemove all animal individuals from the simulation.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.speciesof-Tuple{Union{Animal, Type}}","page":"Nature","title":"Persefone.speciesof","text":"speciesof(animal)\n\nReturn the species name of this animal as a string.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.speciestype-Tuple{String}","page":"Nature","title":"Persefone.speciestype","text":"speciestype(name)\n\nReturn the Type of this species.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.stepagent!-Tuple{Animal, SimulationModel}","page":"Nature","title":"Persefone.stepagent!","text":"stepagent!(animal, model)\n\nUpdate an animal by one day, executing it's currently active phase function.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.updatenature!-Tuple{SimulationModel}","page":"Nature","title":"Persefone.updatenature!","text":"updatenature!(model)\n\nRun processes that affect all animals.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#macros.jl","page":"Nature","title":"macros.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains all the macros that can be used in the species DSL.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/macros.jl\"]","category":"page"},{"location":"nature.html#Persefone.@animal-Tuple{Any}","page":"Nature","title":"Persefone.@animal","text":"@animal(id)\n\nReturn the animal object associated with this ID number. This can only be used in a context where the model object is available (e.g. nested within @phase).\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@countanimals-Tuple","page":"Nature","title":"Persefone.@countanimals","text":"@countanimals(radius=0, species=\"\")\n\nCount the number of animals at or near this location, optionally filtering by species. This can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@create-Tuple{Any, Any}","page":"Nature","title":"Persefone.@create","text":"@create(species, body)\n\nDefine a special phase function (create!()) that will be called when an individual of this species is created, at the initialisation of the simulation or at birth.\n\nAs for @phase, the body of this macro has access to the variables self (the individual being created) and model (the simulation world), and can thus use all macros available in @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@cropheight-Tuple{}","page":"Nature","title":"Persefone.@cropheight","text":"@cropheight\n\nReturn the height of the crop at this position, or 0 if there is no crop here. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@cropname-Tuple{}","page":"Nature","title":"Persefone.@cropname","text":"@cropname\n\nReturn the name of the local croptype, or an empty string if there is no crop here. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@directionto-Tuple{Any}","page":"Nature","title":"Persefone.@directionto","text":"@directionto\n\nCalculate the direction to an animal or the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@distanceto-Tuple{Any}","page":"Nature","title":"Persefone.@distanceto","text":"@distanceto\n\nCalculate the distance to an animal or the closest habitat of the specified type or descriptor. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@distancetoedge-Tuple{}","page":"Nature","title":"Persefone.@distancetoedge","text":"@distancetoedge\n\nCalculate the distance to the closest neighbouring habitat. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@follow-Tuple{Any, Any}","page":"Nature","title":"Persefone.@follow","text":"@follow(leader, distance)\n\nMove to a location within the given distance of the leading animal. This is a utility wrapper that can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@habitat-Tuple{Any}","page":"Nature","title":"Persefone.@habitat","text":"@habitat\n\nSpecify habitat suitability for spatial ecological processes.\n\nThis macro works by creating an anonymous function that takes in a model object and a position, and returns true or false depending on the conditions specified in the macro body.\n\nSeveral utility macros can be used within the body of @habitat as a short-hand for common expressions: @landcover, @cropname, @cropheight, @distanceto, @distancetoedge, @countanimals. The variables model and pos can be used for checks that don't have a macro available.\n\nTwo example uses of @habitat might look like this:\n\nmovementhabitat = @habitat(@landcover() in (grass agriculture soil))\n\nnestinghabitat = @habitat((@landcover() == grass || \n (@landcover() == agriculture && @cropname() != \"maize\" &&\n @cropheight() < 10)) &&\n @distanceto(forest) > 20)\n\nFor more complex habitat suitability checks, the use of this macro can be circumvented by directly creating an equivalent function.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@here-Tuple{}","page":"Nature","title":"Persefone.@here","text":"@here()\n\nReturn the landscape pixel of this animal's current location. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@isalive-Tuple{Any}","page":"Nature","title":"Persefone.@isalive","text":"@isalive(id)\n\nTest whether the animal with the given ID is still alive. This can only be used in a context where the model object is available (e.g. nested within @phase).\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@kill-Tuple","page":"Nature","title":"Persefone.@kill","text":"@kill\n\nKill this animal (and immediately abort its current update if it dies). This is a thin wrapper around kill!, and passes on any arguments. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@killother-Tuple{Any, Vararg{Any}}","page":"Nature","title":"Persefone.@killother","text":"@killother\n\nKill another animal. This is a thin wrapper around kill!, and passes on any arguments. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@landcover-Tuple{}","page":"Nature","title":"Persefone.@landcover","text":"@landcover\n\nReturns the local landcover. This is a utility wrapper that can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@migrate-Tuple{Any}","page":"Nature","title":"Persefone.@migrate","text":"@migrate(arrival)\n\nRemove this animal from the map and add it to the migrant species pool. It will be returned to its current location at the specified arrival date. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@move-Tuple{Any}","page":"Nature","title":"Persefone.@move","text":"@move(position)\n\nMove the current individual to a new position. This is a utility wrapper that can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@nearby_animals-Tuple","page":"Nature","title":"Persefone.@nearby_animals","text":"@nearby_animals(radius=0, species=\"\")\n\nReturn an iterator over all animals in the given radius around the current position. This can only be used nested within @phase or @habitat.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@neighbours-Tuple","page":"Nature","title":"Persefone.@neighbours","text":"@neighbours(radius=0, conspecifics=true)\n\nReturn an iterator over all (by default conspecific) animals in the given radius around this animal, excluding itself. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@phase-Tuple{Any, Any, Any}","page":"Nature","title":"Persefone.@phase","text":"@phase(name, body)\n\nUse this macro to describe a species' behaviour during a given phase of its life. The idea behind this is that species show very different behaviour at different times of their lives. Therefore, @phase can be used define the behaviour for one such phase, and the conditions under which the animal transitions to another phase.\n\n@phase works by creating a function that will be called by the model if the animal is in the relevant phase. When it is called, it has access to the following variables:\n\nself a reference to the animal itself. This provides access to all the variables defined in the @species definition, as well as all standard Animal variables (e.g. self.age, self.sex, self.offspring).\npos gives the animal's current position as a coordinate tuple.\nmodel a reference to the model world (an object of type SimulationModel). This allows access, amongst others, to model.date (the current simulation date) and model.landscape (a two-dimensional array of pixels containing geographic information).\n\nMany macros are available to make the code within the body of @phase more succinct. Some of the most important of these are: @setphase, @respond, @kill, @reproduce, @neighbours, @migrate, @move, @rand.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@populate-Tuple{Any, Any}","page":"Nature","title":"Persefone.@populate","text":"@populate(species, params)\n\nSet the parameters that are used to initialise this species' population. For parameter options, see PopInitParams.\n\n@populate <species> begin\n <parameter> = <value>\n ...\nend \n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@randomdirection-Tuple","page":"Nature","title":"Persefone.@randomdirection","text":"@randomdirection(range=1)\n\nReturn a random direction tuple that can be passed to @walk. This is a utility wrapper that can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@randompixel-Tuple","page":"Nature","title":"Persefone.@randompixel","text":"@randompixel(range, habitatdescriptor)\n\nFind a random pixel within a given range of the animal's location that matches the habitatdescriptor (create this using @habitat). This is a utility wrapper that can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@reproduce-Tuple","page":"Nature","title":"Persefone.@reproduce","text":"@reproduce\n\nLet this animal reproduce. This is a thin wrapper around reproduce!, and passes on any arguments. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@respond-Tuple{Any, Any}","page":"Nature","title":"Persefone.@respond","text":"@respond(eventname, body)\n\nDefine how an animal responds to a landscape event that affects its current position. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@setphase-Tuple{Any}","page":"Nature","title":"Persefone.@setphase","text":"@setphase(newphase)\n\nSwitch this animal over to a different phase. This can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@species-Tuple{Any, Any}","page":"Nature","title":"Persefone.@species","text":"@species(name, body)\n\nA macro used to add new species types to the nature model. Use this to define species-specific variables and parameters.\n\nThe macro works by creating a keyword-defined mutable struct that contains the standard fields described for the Animal type, as well as any new fields that the user adds:\n\n@species <name> begin\n <var1> = <value>\n <var2> = <value>\n ...\nend\n\nTo complete the species definition, the @phase, @create, and @populate macros also need to be used.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#Persefone.@walk-Tuple","page":"Nature","title":"Persefone.@walk","text":"@walk(direction, speed)\n\nWalk the animal in a given direction, which is specified by a tuple of coordinates relative to the animal's current position (i.e. (2, -3) increments the X coordinate by 2 and decrements the Y coordinate by 3.) This is a utility wrapper that can only be used nested within @phase.\n\n\n\n\n\n","category":"macro"},{"location":"nature.html#populations.jl","page":"Nature","title":"populations.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains a set of utility functions for species, including initialisation, reproduction, and mortality.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/populations.jl\"]","category":"page"},{"location":"nature.html#Persefone.PopInitParams","page":"Nature","title":"Persefone.PopInitParams","text":"PopInitParams\n\nA set of parameters used by initpopulation to initialise the population of a species at the start of a simulation. Define these parameters for each species using @populate.\n\ninitphase determines which life phase individuals will be assigned to at model initialisation (required).\nbirthphase determines which life phase individuals will be assigned to at birth (required).\nhabitat is a function that determines whether a given location is suitable or not (create this using @habitat). By default, every cell will be occupied.\npopsize determines the number of individuals that will be created, dispersed over the suitable locations in the landscape. If this is zero or negative, one individual will be created in every suitable location. If it is greater than the number of suitable locations, multiple individuals will be created per location. Alternately, use popdensity.\npopdensity: if this is greater than zero, the chance of creating an individual (or pair of individuals) at a suitable location is 1/popdensity. Use this as an alternative to popsize.\nIf pairs is true, a male and a female individual will be created in each selected location, otherwise, only one individual will be created at a time. (default: false)\nIf asexual is true, all created individuals are assigned the sex hermaphrodite, otherwise, they are randomly assigned male or female. If pairs is true, asexual is ignored. (default: false)\n\n\n\n\n\n","category":"type"},{"location":"nature.html#Persefone.countanimals-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Nature","title":"Persefone.countanimals","text":"countanimals(pos, model; radius=0, species=\"\")\n\nReturn the number of animals in the given radius around this position, optionally filtering by species.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}","page":"Nature","title":"Persefone.directionto","text":"directionto(pos, model, animal)\n\nCalculate the direction from the given position to the animal.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Animal}","page":"Nature","title":"Persefone.distanceto","text":"distanceto(pos, model, animal)\n\nCalculate the distance from the given position to the animal.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.followanimal!","page":"Nature","title":"Persefone.followanimal!","text":"followanimal!(follower, leader, model, distance=0)\n\nMove the follower animal to a location near the leading animal.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.initpopulation!-Tuple{String, SimulationModel}","page":"Nature","title":"Persefone.initpopulation!","text":"initpopulation!(speciesname, model)\n\nInitialise the population of the given species, based on the parameters stored in PopInitParams. Define these using @populate.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.initpopulation!-Tuple{Type, Persefone.PopInitParams, SimulationModel}","page":"Nature","title":"Persefone.initpopulation!","text":"initpopulation!(speciestype, popinitparams, model)\n\nInitialise the population of the given species, based on the given initialisation parameters. This is an internal function called by initpopulation!(), and was split off from it to allow better testing.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.isalive-Tuple{Int64, SimulationModel}","page":"Nature","title":"Persefone.isalive","text":"isalive(id, model)\n\nTest whether the animal with the given ID is still alive.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.kill!","page":"Nature","title":"Persefone.kill!","text":"kill!(animal, model, probability=1.0, cause=\"\")\n\nKill this animal, optionally with a given percentage probability. Returns true if the animal dies, false if not.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.migrate!-Tuple{Animal, SimulationModel, Dates.Date}","page":"Nature","title":"Persefone.migrate!","text":"migrate!(animal, model, arrival)\n\nRemove this animal from the map and add it to the migrant species pool. It will be returned to its current location at the specified arrival date.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.move!-Tuple{Animal, SimulationModel, Tuple{Int64, Int64}}","page":"Nature","title":"Persefone.move!","text":"move!(animal, model, position)\n\nMove the animal to the given position, making sure that this is in-bounds. If the position is out of bounds, the animal stops at the map edge.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.nearby_animals-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Nature","title":"Persefone.nearby_animals","text":"nearby_animals(pos, model; radius= 0, species=\"\")\n\nReturn a list of animals in the given radius around this position, optionally filtering by species.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.nearby_ids-Tuple{Tuple{Int64, Int64}, SimulationModel, Int64}","page":"Nature","title":"Persefone.nearby_ids","text":"nearby_ids(pos, model, radius)\n\nReturn a list of IDs of the animals within a given radius of the position.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.neighbours","page":"Nature","title":"Persefone.neighbours","text":"neighbours(animal, model, radius=0, conspecifics=true)\n\nReturn a list of animals in the given radius around this animal, excluding itself. By default, only return conspecific animals.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.populationparameters-Tuple{Type}","page":"Nature","title":"Persefone.populationparameters","text":"populationparameters(type)\n\nA function that returns a PopInitParams object for the given species type. Parametric methods for each species are defined with @populate. This is the catch-all method, which throws an error if no species-specific function is defined.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.reproduce!","page":"Nature","title":"Persefone.reproduce!","text":"reproduce!(animal, model, mate, n=1)\n\nProduce one or more offspring for the given animal at its current location. The mate argument gives the ID of the reproductive partner.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.walk!","page":"Nature","title":"Persefone.walk!","text":"walk!(animal, model, direction, speed=-1)\n\nLet the animal move in the given direction, where the direction is defined by an (x, y) tuple to specify the shift in coordinates. If speed >= 0, walk no more than the given number of cells.\n\n\n\n\n\n","category":"function"},{"location":"nature.html#Persefone.walk!-2","page":"Nature","title":"Persefone.walk!","text":"walk!(animal, model, direction, steps=1)\n\nLet the animal move a given number of step in the given direction (\"north\", \"northeast\", \"east\", \"southeast\", \"south\", \"southwest\", \"west\", \"northwest\", \"random\").\n\n\n\n\n\n","category":"function"},{"location":"nature.html#insects.jl","page":"Nature","title":"insects.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains the insect submodel, which calculates the likely insect biomass in a given location at a given time.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/insects.jl\"]","category":"page"},{"location":"nature.html#Persefone.insectbiomass-Tuple{Pixel, SimulationModel}","page":"Nature","title":"Persefone.insectbiomass","text":"insectbiomass(pixel, model)\n\nCalculate the insect biomass in this location, using the factors configured in the nature.insectmodel settings (any combination of: \"season\", \"habitat\", \"weather\", \"pesticides\"). Returns a float value in g/m².\n\nBiological note: this is a very approximate calculation! Insect biomass varies wildly in time and space and is hard to measure. This calculation is based on the idea of a parabolic seasonal development of insect abundance, modified by habitat suitability, weather, and pesticide application. Although it is based on empirical studies, it can only deliver a rough, order-of-magnitude estimation of likely insect biomass in a given location.\n\nSources:\n\nOdderskær et al. (1997). Skylark Reproduction in Pesticide Treated and Untreated Fields (32; Pesticides Research). Danish Environmental Protection Agency.\nGrüebler et al. (2008). A predictive model of the density of airborne insects in agricultural environments. Agriculture, Ecosystems & Environment, 123(1), 75–80. https://doi.org/10.1016/j.agee.2007.05.001\nPaquette et al. (2013). Seasonal patterns in Tree Swallow prey (Diptera) abundance are affected by agricultural intensification. Ecological Applications, 23(1), 122–133. https://doi.org/10.1890/12-0068.1\nPüttmanns et al. (2022). Habitat use and foraging parameters of breeding Skylarks indicate no seasonal decrease in food availability in heterogeneous farmland. Ecology and Evolution, 12(1), e8461. https://doi.org/10.1002/ece3.8461\n\n\n\n\n\n","category":"method"},{"location":"nature.html#ecologicaldata.jl","page":"Nature","title":"ecologicaldata.jl","text":"","category":"section"},{"location":"nature.html","page":"Nature","title":"Nature","text":"This file contains a set of life-history related utility functions needed by species.","category":"page"},{"location":"nature.html","page":"Nature","title":"Nature","text":"Modules = [Persefone]\nPages = [\"nature/ecologicaldata.jl\"]","category":"page"},{"location":"nature.html#Persefone.initecologicaldata-Tuple{SimulationModel}","page":"Nature","title":"Persefone.initecologicaldata","text":"initecologicaldata()\n\nCreate output files for each data group collected by the nature model.\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.saveindividualdata-Tuple{SimulationModel}","page":"Nature","title":"Persefone.saveindividualdata","text":"saveindividualdata(model)\n\nReturn a comma-separated set of lines (to be printed to individuals.csv), listing all properties of all animal individuals in the model. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter nature.indoutfreq. WARNING: Produces very big files!\n\n\n\n\n\n","category":"method"},{"location":"nature.html#Persefone.savepopulationdata-Tuple{SimulationModel}","page":"Nature","title":"Persefone.savepopulationdata","text":"savepopulationdata(model)\n\nReturn a comma-separated set of lines (to be printed to populations.csv), giving the current date and population size for each animal species. May be called never, daily, monthly, yearly, or at the end of a simulation, depending on the parameter nature.popoutfreq.\n\n\n\n\n\n","category":"method"},{"location":"gui.html#Graphical-User-Interface","page":"Graphical User Interface","title":"Graphical User Interface","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Due to the computational demands of simulating many individuals at high temporal and spatial resolution, Persefone.jl is primarily designed to be run non-interactively on an HPC. However, to allow interactive exploratory simulations to be conducted while learning or developing the model, a graphical user interface is available as an additional package: Persefone Desktop.","category":"page"},{"location":"gui.html#Install-and-run","page":"Graphical User Interface","title":"Install and run","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"For more detailed installation instructions, see here.","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"To install: Install Julia and download/clone the repository. Open a Julia REPL in the downloaded folder and execute the following to install all dependencies:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"using Pkg\nPkg.activate(\".\")\nPkg.instantiate()","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"To run: Run desktop.jl. Alternatively, open a Julia REPL in this folder and run:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"using Pkg\nPkg.activate(\".\")\nusing PersefoneDesktop\nlaunch()","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Note: Due to the necessary pre-compilation done by Julia, installing and launching the application can take quite a long time. (Start-up time with desktop.jl is currently about 2 minutes.) We will reduce this as much as possible in future releases.","category":"page"},{"location":"gui.html#User-interface","page":"Graphical User Interface","title":"User interface","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"(Image: Persefone.jl Desktop screenshot)","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"The main window component is the map view. This displays a land cover map of the simulated region: dark green are forests, light green grassland, yellow fields, red built-up areas and blue water. On it, little circles show the position of individual animals, with different species denoted by different colours.","category":"page"},{"location":"gui.html#Control-bar","page":"Graphical User Interface","title":"Control bar","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Back button: Rewind the simulation by one day.\nStep button: Advance the simulation by one day.\nRun button: Run the simulation until the button is pressed again or the end date is reached.\nProgress bar: Shows the percentage of time elapsed between the start and end dates of the simulation.\nSpeed slider: Set the time delay between each simulation step when running.\nDate: Shows the simulation date currently displayed on the map.","category":"page"},{"location":"gui.html#Menu-bar","page":"Graphical User Interface","title":"Menu bar","text":"","category":"section"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Simulation:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"New simulation: Reset the model and start over.\nConfigure simulation: Change the model settings (not yet implemented).\nLoad saved state: Load a model object file saved by a previous simulation run.\nSave current state: Save a model object file for later use.\nQuit: Close the application.","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Data:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Show population graph: Show a window with a graph of population sizes over time in the current model run.\nSave simulation output: Save the model output data to file (saves both raw CSV data and generated graphics).","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Help:","category":"page"},{"location":"gui.html","page":"Graphical User Interface","title":"Graphical User Interface","text":"Documentation: Open the Persefone.jl online documentation in a browser.\nWebsite: Open the main Persefone.jl website in a browser.\nAbout: Show a window with core information about the application.","category":"page"},{"location":"io.html#Input-and-Output","page":"Input and Output","title":"Input and Output","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"These functions are responsible for reading in all model configurations (passed by config file or commandline), administrating them during a run, and printing or plotting any output.","category":"page"},{"location":"io.html#input.jl","page":"Input and Output","title":"input.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"core/input.jl\"]","category":"page"},{"location":"io.html#Persefone.PARAMFILE","page":"Input and Output","title":"Persefone.PARAMFILE","text":"The file that stores all default parameters: src/parameters.toml\n\n\n\n\n\n","category":"constant"},{"location":"io.html#Persefone.flattenTOML-Tuple{Any}","page":"Input and Output","title":"Persefone.flattenTOML","text":"flattenTOML(dict)\n\nAn internal utility function to convert the two-dimensional dict returned by TOML.parsefile() into a one-dimensional dict, so that instead of writing settings[\"domain\"][\"param\"] one can use settings[\"domain.param\"]. Can be reversed with prepareTOML.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.getsettings","page":"Input and Output","title":"Persefone.getsettings","text":"getsettings(configfile, seed=nothing)\n\nCombines all configuration options to produce a single settings dict. Precedence: commandline parameters - user config file - default values\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.loadmodelobject-Tuple{String}","page":"Input and Output","title":"Persefone.loadmodelobject","text":"loadmodelobject(fullfilename)\n\nDeserialise a model object that was previously saved with [savemodelobject](@ref).\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.parsecommandline-Tuple{}","page":"Input and Output","title":"Persefone.parsecommandline","text":"parsecommandline()\n\nCertain software parameters can be set via the commandline.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.preprocessparameters-Tuple{Dict{String, Any}, String}","page":"Input and Output","title":"Persefone.preprocessparameters","text":"preprocessparameters(settings)\n\nTake the raw input parameters and process them (convert types, perform checks, etc.). This is a helper function for getsettings.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.@chance-Tuple{Any}","page":"Input and Output","title":"Persefone.@chance","text":"@chance(odds)\n\nReturn true if a random number is less than the odds (0.0 <= odds <= 1.0), using the model RNG. This is a utility wrapper that can only be used a context where the model object is available.\n\n\n\n\n\n","category":"macro"},{"location":"io.html#Persefone.@param-Tuple{Any}","page":"Input and Output","title":"Persefone.@param","text":"@param(domainparam)\n\nReturn a configuration parameter from the global settings. The argument should be in the form <domain>.<parameter>, for example @param(core.outdir). Possible values for <domain> are core, nature, farm, or crop. For a full list of parameters, see src/parameters.toml.\n\nNote: this macro only works in a context where the model object is available!\n\n\n\n\n\n","category":"macro"},{"location":"io.html#Persefone.@rand-Tuple","page":"Input and Output","title":"Persefone.@rand","text":"@rand(args...)\n\nReturn a random number or element from the sample, using the model RNG. This is a utility wrapper that can only be used a context where the model object is available.\n\n\n\n\n\n","category":"macro"},{"location":"io.html#Persefone.@shuffle!-Tuple{Any}","page":"Input and Output","title":"Persefone.@shuffle!","text":"@shuffle!(collection)\n\nShuffle the given collection in place, using the model RNG. This is a utility wrapper that can only be used a context where the model object is available.\n\n\n\n\n\n","category":"macro"},{"location":"io.html#output.jl","page":"Input and Output","title":"output.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"core/output.jl\"]","category":"page"},{"location":"io.html#Persefone.DataOutput","page":"Input and Output","title":"Persefone.DataOutput","text":"DataOutput\n\nA struct for organising model output. This is used to collect model data in an in-memory dataframe or for CSV output. Submodels can register their own output functions using newdataoutput!.\n\nStruct fields: - name: a string identifier for the data collection (used as file name) - header: a list of column names - outputfunction: a function that takes a model object and returns data values to record (formatted as a vector of vectors) - frequency: how often to call the output function (daily/monthly/yearly/end/never) - plotfunction: a function that takes a model object and returns a Makie figure object (optional)\n\n\n\n\n\n","category":"type"},{"location":"io.html#Persefone.createdatadir-Tuple{String, Union{Bool, String}}","page":"Input and Output","title":"Persefone.createdatadir","text":"createdatadir(outdir, overwrite)\n\nCreates the output directory, dealing with possible conflicts.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.modellogger","page":"Input and Output","title":"Persefone.modellogger","text":"modellogger(loglevel, outdir, output=\"both\")\n\nCreate a logger object that writes output both to screen and to a logfile. This object is stored as model.logger and can then be used with with_logger(). Note: requires createdatadir to be run first.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.newdataoutput!","page":"Input and Output","title":"Persefone.newdataoutput!","text":"newdataoutput!(model, name, header, outputfunction, frequency)\n\nCreate and register a new data output. This function must be called by all submodels that want to have their output functions called regularly.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.outputdata","page":"Input and Output","title":"Persefone.outputdata","text":"outputdata(model, force=false)\n\nCycle through all registered data outputs and activate them according to their configured frequency. If force is true, activate all outputs regardless of their configuration.\n\n\n\n\n\n","category":"function"},{"location":"io.html#Persefone.prepareTOML-Tuple{Any}","page":"Input and Output","title":"Persefone.prepareTOML","text":"prepareTOML(dict)\n\nAn internal utility function to re-convert the one-dimensional dict created by flattenTOML into the two-dimensional dict needed by TOML.print, and convert any data types into TOML-compatible types where necessary.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.saveinputfiles-Tuple{SimulationModel}","page":"Input and Output","title":"Persefone.saveinputfiles","text":"saveinputfiles(model)\n\nCopy all input files into the output directory, including the actual parameter settings used. This allows replicating a run in future.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.savemodelobject-Tuple{SimulationModel, String}","page":"Input and Output","title":"Persefone.savemodelobject","text":"savemodelobject(model, filename)\n\nSerialise a model object and save it to file for later reference. Includes the current model and Julia versions for compatibility checking.\n\nWARNING: produces large files (>100 MB) and takes a while to execute.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.visualiseoutput-Tuple{SimulationModel}","page":"Input and Output","title":"Persefone.visualiseoutput","text":"visualiseoutput(model)\n\nCycle through all data outputs and call their respective plot functions, saving each figure to file.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.withtestlogger-Tuple{SimulationModel}","page":"Input and Output","title":"Persefone.withtestlogger","text":"withtestlogger(model)\n\nReplace the model logger with the currently active logger. This is intended to be used in the testsuite to circumvent a Julia issue, where @test_logs doesn't work with local loggers.\n\n\n\n\n\n","category":"method"},{"location":"io.html#makieplots.jl","page":"Input and Output","title":"makieplots.jl","text":"","category":"section"},{"location":"io.html","page":"Input and Output","title":"Input and Output","text":"Modules = [Persefone]\nPages = [\"analysis/makieplots.jl\"]","category":"page"},{"location":"io.html#Persefone.gettickmarks-Tuple{Any}","page":"Input and Output","title":"Persefone.gettickmarks","text":"gettickmarks(dates)\n\nGiven a vector of dates, construct a selection to use as tick mark locations. Helper function for [populationtrends](@ref)\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.populationtrends-Tuple{SimulationModel}","page":"Input and Output","title":"Persefone.populationtrends","text":"populationtrends(model)\n\nPlot a line graph of population sizes of each species over time. Returns a Makie figure object.\n\n\n\n\n\n","category":"method"},{"location":"io.html#Persefone.visualisemap","page":"Input and Output","title":"Persefone.visualisemap","text":"visualisemap(model, date, landcovermap)\n\nDraw the model's land cover map and plot all individuals as points on it at the specified date. If no date is passed, use the last date for which data are available. Optionally, you can pass a landcover map image (this is needed to reduce the frequency of disk I/O for Persefone Desktop). Returns a Makie figure object.\n\n\n\n\n\n","category":"function"},{"location":"config.html#Configuration","page":"Configuration","title":"Configuration","text":"","category":"section"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"Persefone requires three input files: a configuration file and two map files. How to generate the map files is documented elsewhere. The configuration file defines parameter values and looks like this (see src/parameters.toml for the default):","category":"page"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"### Persefone.jl - a model of agricultural landscapes and ecosystems in Europe.\n###\n### This is the default configuration file for Persefone, containing all model parameters.\n### The syntax is described here: https://toml.io/en/\n\n[core]\nconfigfile = \"src/parameters.toml\" # location of the configuration file\noutdir = \"results\" # location and name of the output folder\noverwrite = \"ask\" # overwrite the output directory? (true/false/\"ask\")\nlogoutput = \"both\" # log output to screen/file/both\ncsvoutput = true # save collected data in CSV files\nvisualise = true # generate result graphs\nstoredata = true # keep collected data in memory\nloglevel = \"debug\" # verbosity level: \"debug\", \"info\", \"warn\"\nprocessors = 2 # number of processors to use on parallel runs\nseed = 2 # seed value for the RNG (0 -> random value)\nstartdate = 2022-01-01 # first day of the simulation\nenddate = 2022-12-31 # last day of the simulation\n\n[world]\nlandcovermap = \"data/regions/jena/landcover.tif\" # location of the landcover map\nfarmfieldsmap = \"data/regions/jena/fields.tif\" # location of the field geometry map\nweatherfile = \"data/regions/jena/weather.csv\" # location of the weather data file\n\t\n[farm]\nfarmmodel = \"FieldManager\" # which version of the farm model to use (not yet implemented)\n\n[nature]\ntargetspecies = [\"Wolpertinger\", \"Wyvern\"] # list of target species to simulate\npopoutfreq = \"daily\" # output frequency population-level data, daily/monthly/yearly/end/never\nindoutfreq = \"end\" # output frequency individual-level data, daily/monthly/yearly/end/never\ninsectmodel = [\"season\", \"habitat\", \"pesticides\", \"weather\"] # factors affecting insect growth\n\t\n[crop]\ncropmodel = \"almass\" # crop growth model to use, \"almass\" or \"aquacrop\"\ncropfile = \"data/crops/almass/crop_data_general.csv\" # file with general crop parameters\ngrowthfile = \"data/crops/almass/almass_crop_growth_curves.csv\" # file with crop growth parameters\t","category":"page"},{"location":"config.html","page":"Configuration","title":"Configuration","text":"info: Parameter scanning\nYou can set any parameter to a list of different values, e.g. seed = [1,2,3]. Persefone will then set up and run multiple simulations, one for every possible combination of parameters that you entered (i.e. do a full-factorial simulation experiment).","category":"page"},{"location":"using.html#The-Persefone.jl-Package","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"This page describes how to run Persefone.jl as a command line application or Julia package, which is the default mode. To use the model with a graphical user interface, see here.","category":"page"},{"location":"using.html#Installation","page":"The Persefone.jl Package","title":"Installation","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"For more detailed installation instructions, see here.","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"Install the latest version of the Julia programming language (1.10+). The recommended editors are VSCode or Emacs. To install the package dependencies, open a Julia REPL in this folder and run:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"using Pkg\nPkg.activate(\".\")\nPkg.instantiate()","category":"page"},{"location":"using.html#Running-from-the-command-line","page":"The Persefone.jl Package","title":"Running from the command line","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"This is the normal mode of operation. Simply execute run.jl in a terminal, typically like so (in Linux):","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"> julia run.jl -c <config>","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"where <config> specifies the configuration file to use. The recommended workflow is to copy scr/parameters.toml to a location of your choice and edit the copy to suit your requirements. The adapted config file can then be passed to run.jl. (If no configuration file is specified, Persefone will run with its default settings.)","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"The full list of commandline arguments is:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"usage: run.jl [-c CONFIGFILE] [-s SEED] [-o OUTDIR] [-l LOGLEVEL] \n [--version] [-h]\n\noptional arguments:\n -c, --configfile CONFIGFILE\n name of the configuration file\n -s, --seed SEED inital random seed (type: Int64)\n -o, --outdir OUTDIR location of the output directory\n -l, --loglevel LOGLEVEL\n verbosity: \"debug\", \"info\", or \"quiet\"\n --version show version information and exit\n -h, --help show this help message and exit","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"To run the test suite, switch to the test directory and execute runtests.jl.","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"If you are on Linux or MacOS, you can also use make:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"> make run # run a simulation with default values\n> make test # run the test suite\n> make profile # run and profile a default simulation\n> make docs # build the documentation\n> make release # create a release","category":"page"},{"location":"using.html#Running-from-within-Julia","page":"The Persefone.jl Package","title":"Running from within Julia","text":"","category":"section"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"To use the model from within Julia (either inside an interactive REPL or if you want to import it from your own software), do the following:","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"using Pkg\nPkg.activate(\".\") # assuming you're in the Persefone root folder\nusing Persefone","category":"page"},{"location":"using.html","page":"The Persefone.jl Package","title":"The Persefone.jl Package","text":"You can then access all Persefone functions, such as simulate, initialise, stepsimulation!, simulate!, or visualiseoutput. (See src/Persefone.jl for a list of exported functions.)","category":"page"},{"location":"architecture.html#Source-code-architecture","page":"Source code architecture","title":"Source code architecture","text":"","category":"section"},{"location":"architecture.html#Model-components","page":"Source code architecture","title":"Model components","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"(Image: \"model architecture\")","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Persefone is divided into four components, three of which are semi-independent submodels:","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"core and world: These two directories provide the foundation of the model software, which sets up and executes simulation runs. It also reads all input files (the configuration file, landscape maps, and weather data), and provides data output functionality.\nnature: This is an individual-based model of species in agricultural landscapes. It defines the Animal agent type, and a set of macros that can be used to rapidly create new species. It also includes ecological process functions that are useful for all species.\nfarm: This is an agent-based model of farmer decision making. It is not yet implemented, but will provide the Farmer agent type.\ncrop: This is a mathematical growth model for various crops. It is not yet implemented, but already provides the agent type FarmPlot, representing one field and its associated extent and crop type.","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Conceptually, core provides functionality that is needed by all of the submodels. Decisions made by Farmers affect the FarmPlots they own, and (directly or indirectly) the Animals in the model landscape.","category":"page"},{"location":"architecture.html#Important-implementation-details","page":"Source code architecture","title":"Important implementation details","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"(Image: \"the model object\")","category":"page"},{"location":"architecture.html#The-model-object","page":"Source code architecture","title":"The model object","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"A cursory reading of the source code will quickly show that most functions take an SimulationModel object as one of their arguments. The concrete type for this is AgricultureModel, a struct that holds all state that is in any way relevant to a simulation run. (Persefone has a strict \"no global state\" policy to avoid state-dependent bugs and allow parallelisation.) The model object gives access to all agent instances. It also stores the configuration (model.settings), the landscape (model.landscape, a matrix of Pixel objects that store the local land cover, amongst other things), and the current simulation date (model.date). (See Persefone.initmodel for details.)","category":"page"},{"location":"architecture.html#Model-configuration/the-@param-macro","page":"Source code architecture","title":"Model configuration/the @param macro","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"The model is configured via a TOML file, the default version of which is at src/parameters.toml. An individual run can be configured using a user-defined configuration file, commandline arguments, or function calls (when Persefone is used as a package rather than an application). During a model run, the @param macro can be used to access parameter values. Note that parameter names are prepended with the name of the component they are associated with. For example, the outdir parameter belongs to the [core] section of the TOML file, and must therefore be referenced as @param(core.outdir). (See src/core/input.jl for details.)","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"info: @param and other macros\nAs @param(parameter) expands to model.settings[\"parameter\"], it can obviously only be used in a context where the model object is actually available. (This is the case for most functions in Persefone, but not for all.) Similarly, many of the nature macros depend on specific variables being available where they are called, and can therefore only be used in specific contexts (this is indicated in their documentation).","category":"page"},{"location":"architecture.html#Output-data","page":"Source code architecture","title":"Output data","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"Persefone can output model data into text files with a specified frequency (daily, monthly, yearly, or at the simulation end). Submodels can use Persefone.newdataoutput! to plug into this system. For an example of how to use this, see src/nature/ecologicaldata.jl. (See src/core/output.jl for details.)","category":"page"},{"location":"architecture.html#Farm-events","page":"Source code architecture","title":"Farm events","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"The FarmEvent struct is used to communicate farming-related events between submodels. An event can be triggered with createevent! and affects all pixels within a FarmPlot. (See src/core/landscape.jl for details.)","category":"page"},{"location":"architecture.html#Random-numbers-and-logging","page":"Source code architecture","title":"Random numbers and logging","text":"","category":"section"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"By default in Julia, the random number generator (RNG) and the system logger are two globally accessible variables. As Persefone needs to avoid all global data (since this would interfere with reproducibility in parallel runs), the model object stores a local logger and a local RNG. The local logger generally does not change the way the model uses log statements, it is only relevant for some functions in src/core/simulation.jl.","category":"page"},{"location":"architecture.html","page":"Source code architecture","title":"Source code architecture","text":"info: Using the model RNG\nWhenever you need to use a random number, you must use the model.rng. The easiest way to do this is with the @rand and @shuffle! macros. (Note that these, too, require access to the model object.)","category":"page"},{"location":"species.html#Species","page":"Species","title":"Species","text":"","category":"section"},{"location":"species.html","page":"Species","title":"Species","text":"The ecological submodel in Persefone simulates a range of species in agricultural landscapes.","category":"page"},{"location":"species.html#Skylark","page":"Species","title":"Skylark","text":"","category":"section"},{"location":"species.html","page":"Species","title":"Species","text":"Modules = [Persefone]\nPages = [\"nature/species/skylark.jl\"]","category":"page"},{"location":"species.html#Persefone.Skylark","page":"Species","title":"Persefone.Skylark","text":"Skylark\n\nAlauda arvensis is a common and charismatic species of agricultural landscapes. At the moment, this implementation is still in development.\n\nSources: - Bauer, H.-G., Bezzel, E., & Fiedler, W. (Eds.). (2012). Das Kompendium der Vögel Mitteleuropas: Ein umfassendes Handbuch zu Biologie, Gefährdung und Schutz (Einbändige Sonderausg. der 2., vollständig überarb. und erw. Aufl. 2005). AULA-Verlag - Glutz von Blotzheim, Urs N. (Ed.). (1985). Handbuch der Vögel Mitteleuropas. Bd. 10. Passeriformes (Teil 1) 1. Alaudidae - Hirundidae. AULA-Verlag, Wiesbaden. ISBN 3-89104-019-9\n\n\n\n\n\n","category":"type"},{"location":"species.html#Persefone.breeding-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.breeding","text":"Do lots of foraging (not yet implemented).\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.create!-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.create!","text":"Initialise a skylark individual. Selects migration dates and checks if the bird should currently be on migration. Also sets other individual-specific variables.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.egg-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.egg","text":"As an egg, simply check for mortality and hatching.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.fledgling-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.fledgling","text":"As a fledgling, move around a little, but mainly wait for maturity and check mortality.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.mating-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.mating","text":"Move around until a mate is found.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.migrationdates-Tuple{Animal, SimulationModel}","page":"Species","title":"Persefone.migrationdates","text":"migrationdates(skylark, model)\n\nSelect the dates on which this skylark will leave for / return from its migration, based on observed migration patterns.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.nestbuilding-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.nestbuilding","text":"Females select a location and build a nest. Males do nothing. (Sound familiar?)\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.nestling-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.nestling","text":"As a nestling, simply check for mortality and fledging.\n\n\n\n\n\n","category":"method"},{"location":"species.html#Persefone.nonbreeding-Tuple{Persefone.Skylark, SimulationModel}","page":"Species","title":"Persefone.nonbreeding","text":"As a non-breeding adult, move around with other individuals and check for migration.\n\n\n\n\n\n","category":"method"},{"location":"species-dsl.html#Defining-new-species","page":"Defining new species","title":"Defining new species","text":"","category":"section"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"In order to make implementing new species as easy as possible, Persefone includes a domain-specific language (DSL) built from a collection of macros and functions.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Here is an example of what this looks like, using a hypothetical mermaid species:","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"@species Mermaid begin\n ageofmaturity = 2\n pesticidemortality = 1.0\nend\n\n@create Mermaid begin\n @debug \"Created $(animalid(self)).\"\nend\n\n@phase Mermaid life begin\n @debug \"$(animalid(self)) is swimming happily in its pond.\"\n @respond pesticide @kill(self.pesticidemortality, \"poisoning\")\n @respond harvesting @setphase(drought)\n if self.sex == female && length(@neighbours()) < 3 &&\n self.age >= self.ageofmaturity && @landcover() == water\n @reproduce()\n end\nend\n\n@phase Mermaid drought begin\n n = sum(1 for a in @neighbours())\n @debug \"$(animalid(self)) is experiencing drought with $n neighbour(s).\"\n @respond sowing @setphase(life)\nend\n\n@populate Mermaid begin\n birthphase = life\n initphase = life\n habitat = @habitat(@landcover() == water)\n pairs=true\nend","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"A complete species definition consists of one call each to @species, @create, @populate, and one or more calls to @phase. Another important macro is @habitat. Further macros are available to provide convenience wrappers for common functions. (See src/nature/nature.jl for details.)","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The first macro to call is @species. This takes two arguments: a species name and a definition block (enclosed in begin and end tags). Within the block, species-specific parameters and variables can be defined (and optionally given values) that should be available throughout a species' lifetime. ","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"Next, each species must define one or more @phase blocks. The concept behind this is that species show different behaviours at different phases of their lifecycle. Each @phase block defines the behaviour in one of these phases. (Technically, it defines a function that will be called daily, so long as the species' phase variable is set to this phase.) Code in this section has access to the model object as well as a self object, which is the currently active Animal agent. Within a phase block, @respond can be used to define the species' response to a FarmEvent that affects the species' current location, while a variety of other macros provide wrappers to life history and movement functions from src/nature/populations.jl.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The third macro to call is @create. Like @phase, this defines a function with access to the world and self objects. This function is called whenever a new individual of this species is created (either at birth, or when the model is initialised).","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The last macro that must be called is [@populate]. Whereas @create regulates the creation of individual animals, @populate determines how the population of a species is initialised at the start of a simulation. It does this by defining values for the parameters used by initpopulation!. The full list of parameters that can be used is documented under PopInitParams.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"The final important macro is @habitat. This defines a \"habitat descriptor\", i.e. a predicate function that tests whether or not a given landscape pixel is suitable for a specified purpose. Such habitat descriptors are used as arguments to various functions, for example for population initialisation or movement. The argument to @habitat consists of a logical expression, which has access to the animal's current position (the pos tuple variable) and the model. Various macros are available to easily reference information about the current location, such as @landcover or @distancetoedge.","category":"page"},{"location":"species-dsl.html","page":"Defining new species","title":"Defining new species","text":"All of these macros are defined in src/nature/macros.jl.","category":"page"},{"location":"developing.html#Developing-Persefone","page":"Developing Persefone","title":"Developing Persefone","text":"","category":"section"},{"location":"developing.html#Setting-up","page":"Developing Persefone","title":"Setting up","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"If you haven't worked with Julia before, here are detailed instructions for how to set up your development environment. The main development is currently done on Linux (and as the primary execution platform will be an HPC, Linux compatibility is important), but developing on Windows works too.","category":"page"},{"location":"developing.html#Visual-Studio-Code-on-Windows","page":"Developing Persefone","title":"Visual Studio Code on Windows","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Download and install Julia, git and Visual Studio Code.\nInstall the Julia extension for VS Code: In VS Code, open the extensions pane (Ctrl+Shift+X). Search for and install Julia Language Support.\nClone the Gitlab repository: In VS Code, open the source control pane (Ctrl+Shift+G). Click on Clone and enter the repo URL. Then select a folder on your computer to download the files into, and let VS Code open the project once it has been cloned.\nStart a Julia REPL: In VS Code, bring up the command palette (Ctrl+Shift+P). Execute the command Julia: Start REPL. Then install all dependencies of Persefone by running using Pkg; Pkg.activate(\".\"); Pkg.instantiate(). (This will take some time.)\nOpen the file run.jl and click Execute (triangular button in the top right). The source code will compile (this can take a lot of time the first time you do it) and run a default simulation.\nFurther steps: You may want to familiarise yourself with how to use git with VS Code. You may also want to clone the Persefone Desktop repository (repeat steps 3 to 5).","category":"page"},{"location":"developing.html#Emacs-on-Linux","page":"Developing Persefone","title":"Emacs on Linux","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"You can of course also use VS Code on Linux. In that case, follow the instructions above.","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Make sure you have git and Julia installed. Git should be in your distro's repos (e.g. sudo apt install git). To install Julia, download the binary and unpack it. For greater ease of use, copy the unpacked files to /usr/local/lib/julia (or similar) and create a symlink to the executable: sudo ln -s /usr/local/lib/julia/bin/julia /usr/local/bin/julia. Then go the to folder that you want to use for development and run git clone https://git.idiv.de/persefone/persefone-model.git . in your terminal.","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"There are a couple of addons that make working with Julia much nicer in Emacs:","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"julia-mode gives syntax highlighting. Install with M-x package-install julia-mode.\njulia-snail provides IDE-like features, especially a fully-functional REPL and the ability to evaluate code straight from inside a buffer. Note that the installation can be somewhat tricky. You first need to manually install all the dependencies of its dependency vterm, then install vterm itself with M-x package-install vterm, before you can do M-x package-install julia-snail. Then add it to your init.el with (require 'julia-snail) and (add-hook 'julia-mode-hook #'julia-snail-mode).\ncompany-mode integrates with Snail to give code completion. Install with M-x package-install company, then add (add-hook 'julia-mode-hook #'company-mode) and (global-set-key (kbd \"C-<tab>\") 'company-complete) to your init.el.\nmagit is a great git interface for Emacs. Install with M-x package-install magit and add (global-set-key (kbd \"C-x g\") 'magit-status) to your init.el.","category":"page"},{"location":"developing.html#Development-workflow","page":"Developing Persefone","title":"Development workflow","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Pull the current version from the master branch on Gitlab: https://git.idiv.de/persefone/persefone-model.\nIf you are working on a new feature, create a new branch to avoid breaking the master branch. (The master branch on Github should always be in a runnable and error-free state.)\nImplement your changes.\nRun an example simulation and the test suite to make sure everything works without crashing (make run and make test on Linux, or execute run.jl and test/runtests.jl manually.)\nCommit your work frequently, and try to keep each commit small. Don't forget to add relevant tests to the test suite.\nOnce your satisfied with your work, do another pull/merge from the master branch in case somebody else changed the branch in the meantime. Then merge your work into master and push to the Gitlab server.\nRepeat :-)","category":"page"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"The Gitlab issue tracker can be used to create, discuss, and assign tasks, as well as to monitor progress towards milestones/releases. Once we have a first release, we will start using semantic versioning and a changelog.","category":"page"},{"location":"developing.html#Important-libraries","page":"Developing Persefone","title":"Important libraries","text":"","category":"section"},{"location":"developing.html#Revise.jl","page":"Developing Persefone","title":"Revise.jl","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Revise.jl allows one to reload code without restarting the Julia interpreter. Get it with Pkg.add(\"Revise\"), then add using Revise to .julia/config/startup.jl to have it automatically available.","category":"page"},{"location":"developing.html#Test","page":"Developing Persefone","title":"Test","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Persefone uses the inbuilt Julia testing framework. All new functions should have appropriate tests written for them in the appropriate file in the test directory. (See test/runtests.jl for details.) There are three ways to run the test suite: in the terminal, executing make test or cd test; julia runtests.jl; or in the Julia REPL, Pkg.activate(\".\"); Pkg.test().","category":"page"},{"location":"developing.html#Documenter.jl","page":"Developing Persefone","title":"Documenter.jl","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"The HTML documentation is generated using Documenter.jl. Therefore, all new functions should have docstrings attached. New files need to be integrated into the relevant documentation source files in docs/src, and if necessary into docs/builddocs.jl. To build the documentation, run make docs, or cd docs; julia builddocs.jl (if using the latter, don't forget to update the date and commit in docs/src/index.md).","category":"page"},{"location":"developing.html#Graphics-and-user-interface","page":"Developing Persefone","title":"Graphics and user interface","text":"","category":"section"},{"location":"developing.html","page":"Developing Persefone","title":"Developing Persefone","text":"Persefone uses Makie as a plotting library to generate its output graphics. Additionally, Persefone Desktop uses QML.jl to create its graphical user interface.","category":"page"},{"location":"simulation.html#Simulation","page":"Simulation","title":"Simulation","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"The core and world directories hold source files that are important for all submodels, including scheduling, landscape, weather, and input/output functions.","category":"page"},{"location":"simulation.html#Persefone.jl","page":"Simulation","title":"Persefone.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file defines the module, including all exported symbols and two high-level types.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"Persefone.jl\"]","category":"page"},{"location":"simulation.html#Persefone.ModelAgent","page":"Simulation","title":"Persefone.ModelAgent","text":"ModelAgent\n\nThe supertype of all agents in the model (animal species, farmer types, farmplots).\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.SimulationModel","page":"Simulation","title":"Persefone.SimulationModel","text":"SimulationModel\n\nThe supertype of AgricultureModel. This is needed to avoid circular dependencies (most types and functions depend on SimulationModel, but the definition of the model struct depends on these types).\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#simulation.jl","page":"Simulation","title":"simulation.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file includes the basal functions for initialising and running simulations.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"core/simulation.jl\"]","category":"page"},{"location":"simulation.html#Persefone.AgricultureModel","page":"Simulation","title":"Persefone.AgricultureModel","text":"AgricultureModel\n\nThis is the heart of the model - a struct that holds all data and state for one simulation run. It is created by initialise and passed as input to most model functions.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.finalise!-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.finalise!","text":"finalise!(model)\n\nWrap up the simulation. Finalises and visualises output, then terminates.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.initialise","page":"Simulation","title":"Persefone.initialise","text":"initialise(config=PARAMFILE, seed=nothing)\n\nInitialise the model: read in parameters, create the output data directory, and instantiate the SimulationModel object(s). Optionally allows specifying the configuration file and overriding the seed parameter. This returns a single model object, unless the config file contains multiple values for one or more parameters, in which case it creates a full-factorial simulation experiment and returns a vector of model objects.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.initmodel-Tuple{Dict{String, Any}}","page":"Simulation","title":"Persefone.initmodel","text":"initmodel(settings)\n\nInitialise a model object using a ready-made settings dict. This is a helper function for initialise().\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.nagents-Tuple{AgricultureModel}","page":"Simulation","title":"Persefone.nagents","text":"nagents(model)\n\nReturn the total number of agents in a model object.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}","page":"Simulation","title":"Persefone.paramscan","text":"paramscan(settings)\n\nCreate a list of settings dicts, covering all possible parameter combinations given by the input settings (i.e. a full-factorial experiment). This is a helper function for initialise().\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.simulate","page":"Simulation","title":"Persefone.simulate","text":"simulate(config=PARAMFILE, seed=nothing)\n\nInitialise one or more model objects and carry out a full simulation experiment, optionally specifying a configuration file and a seed for the RNG.\n\nThis is the default way to run a Persefone simulation.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.simulate!-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.simulate!","text":"simulate!(model)\n\nCarry out a complete simulation run using a pre-initialised model object.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.stepagent!-Tuple{ModelAgent, SimulationModel}","page":"Simulation","title":"Persefone.stepagent!","text":"stepagent!(agent, model)\n\nAll agent types must define a stepagent!() method that will be called daily.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.stepsimulation!-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.stepsimulation!","text":"stepsimulation!(model)\n\nExecute one update of the model.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#landscape.jl","page":"Simulation","title":"landscape.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file manages the landscape maps that underlie the model.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"world/landscape.jl\"]","category":"page"},{"location":"simulation.html#Persefone.EventType","page":"Simulation","title":"Persefone.EventType","text":"The types of landscape event that can be simulated\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.FarmEvent","page":"Simulation","title":"Persefone.FarmEvent","text":"FarmEvent\n\nA data structure to define a landscape event, giving its type, spatial extent, and duration.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.LandCover","page":"Simulation","title":"Persefone.LandCover","text":"The land cover classes encoded in the Mundialis Sentinel data.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.Pixel","page":"Simulation","title":"Persefone.Pixel","text":"Pixel\n\nA pixel is a simple data structure to combine land use and ownership information in a single object. The model landscape consists of a matrix of pixels. (Note: further landscape information may be added here in future.)\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.createevent!","page":"Simulation","title":"Persefone.createevent!","text":"createevent!(model, pixels, name, duration=1)\n\nAdd a farm event to the specified pixels (a vector of position tuples) for a given duration.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}","page":"Simulation","title":"Persefone.directionto","text":"directionto(pos, model, habitatdescriptor)\n\nCalculate the direction from the given location to the closest location matching the habitat descriptor function. Returns a coordinate tuple (target - position), or nothing if no matching habitat is found. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}","page":"Simulation","title":"Persefone.directionto","text":"directionto(pos, model, habitattype)\n\nCalculate the direction from the given location to the closest habitat of the specified type. Returns a coordinate tuple (target - position), or nothing if no matching habitat is found. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}","page":"Simulation","title":"Persefone.distanceto","text":"distanceto(pos, model, habitatdescriptor)\n\nCalculate the distance from the given location to the closest location matching the habitat descriptor function. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}","page":"Simulation","title":"Persefone.distanceto","text":"distanceto(pos, model, habitattype)\n\nCalculate the distance from the given location to the closest habitat of the specified type. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Simulation","title":"Persefone.distancetoedge","text":"distancetoedge(pos, model)\n\nCalculate the distance from the given location to the closest neighbouring habitat. Caution: can be computationally expensive!\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.farmplot-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Simulation","title":"Persefone.farmplot","text":"farmplot(position, model)\n\nReturn the farm plot at this position, or nothing if there is none (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.inbounds-Tuple{Any, Any}","page":"Simulation","title":"Persefone.inbounds","text":"inbounds(pos, model)\n\nIs the given position within the bounds of the model landscape?\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.initlandscape-Tuple{String, String}","page":"Simulation","title":"Persefone.initlandscape","text":"initlandscape(landcovermap, farmfieldsmap)\n\nInitialise the model landscape based on the map files specified in the configuration. Returns a matrix of pixels.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.landcover-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Simulation","title":"Persefone.landcover","text":"landcover(position, model)\n\nReturn the land cover class at this position (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.randomdirection","page":"Simulation","title":"Persefone.randomdirection","text":"randomdirection(model, range=1)\n\nGet a random direction coordinate tuple within the specified range.\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.randompixel","page":"Simulation","title":"Persefone.randompixel","text":"randompixel(position, model, range, habitatdescriptor)\n\nFind a random pixel within a given range of the position that matches the habitatdescriptor (create this using @habitat).\n\n\n\n\n\n","category":"function"},{"location":"simulation.html#Persefone.safebounds-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Simulation","title":"Persefone.safebounds","text":"safebounds(pos, model)\n\nMake sure that a given position is within the bounds of the model landscape.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.updateevents!-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.updateevents!","text":"updateevents!(model)\n\nCycle through the list of events, removing those that have expired.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#weather.jl","page":"Simulation","title":"weather.jl","text":"","category":"section"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"This file reads in weather data and makes it available to the model.","category":"page"},{"location":"simulation.html","page":"Simulation","title":"Simulation","text":"Modules = [Persefone]\nPages = [\"world/weather.jl\"]","category":"page"},{"location":"simulation.html#Persefone.Weather","page":"Simulation","title":"Persefone.Weather","text":"Weather\n\nA single weather datum, combining the observations from one day.\n\n\n\n\n\n","category":"type"},{"location":"simulation.html#Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}","page":"Simulation","title":"Persefone.initweather","text":"initweather(weatherfile, startdate, enddate)\n\nLoad a weather file, extract the values that are relevant to this model run (specified by start and end dates), and return a dictionary of Weather objects mapped to dates.\n\nNote: This requires a weather file in the format produced by data/extract_weather_data.R.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.maxtemp-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.maxtemp","text":"maxtemp(model)\n\nReturn today's maximum temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.meantemp-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.meantemp","text":"meantemp(model)\n\nReturn today's mean temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.mintemp-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.mintemp","text":"mintemp(model)\n\nReturn today's minimum temperature in °C.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.precipitation-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.precipitation","text":"precipitation(model)\n\nReturn today's total precipitation in mm.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.sunshine-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.sunshine","text":"sunshine(model)\n\nReturn today's sunshine duration in hours.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.vapourpressure-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.vapourpressure","text":"vapourpressure(model)\n\nReturn today's average vapour pressure in hPa.\n\n\n\n\n\n","category":"method"},{"location":"simulation.html#Persefone.windspeed-Tuple{SimulationModel}","page":"Simulation","title":"Persefone.windspeed","text":"windspeed(model)\n\nReturn today's average windspeed in m/s.\n\n\n\n\n\n","category":"method"},{"location":"farm.html#Farm-submodel","page":"Farm submodel","title":"Farm submodel","text":"","category":"section"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"Eventually, the aim is to create a full socio-economic farm decision model for Persefone. However, for the time being, we will restrict ourselves to a simple model that executes typical farm operations and crop rotations.","category":"page"},{"location":"farm.html#farm.jl","page":"Farm submodel","title":"farm.jl","text":"","category":"section"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"This file is responsible for managing the farm module(s).","category":"page"},{"location":"farm.html","page":"Farm submodel","title":"Farm submodel","text":"Modules = [Persefone]\nPages = [\"farm/farm.jl\"]","category":"page"},{"location":"farm.html#Persefone.Farmer","page":"Farm submodel","title":"Persefone.Farmer","text":"Farmer\n\nThis is the agent type for the farm ABM. (Not yet implemented.)\n\n\n\n\n\n","category":"type"},{"location":"farm.html#Persefone.initfarms!-Tuple{SimulationModel}","page":"Farm submodel","title":"Persefone.initfarms!","text":"initfarms!(model)\n\nInitialise the model with a set of farm agents.\n\n\n\n\n\n","category":"method"},{"location":"farm.html#Persefone.stepagent!-Tuple{Farmer, SimulationModel}","page":"Farm submodel","title":"Persefone.stepagent!","text":"stepagent!(farmer, model)\n\nUpdate a farmer by one day.\n\n\n\n\n\n","category":"method"},{"location":"adapting.html#Adapting-Persefone","page":"Adapting Persefone","title":"Adapting Persefone","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"A key development goal of Persefone is to be FAIR: findable, accessible, interoperable, and reusable. We aim to build a model that is both easy to use and easy to adapt to new situations.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"There are multiple ways to adapt Persefone for a new modelling study:","category":"page"},{"location":"adapting.html#Changing-the-parameters","page":"Adapting Persefone","title":"Changing the parameters","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"The simplest way to adapt Persefone is simply by changing the parameters. Copy src/parameters.toml to a new location, adjust it to your needs, and run the model using julia run.jl -c <configfile>.","category":"page"},{"location":"adapting.html#Changing-the-region","page":"Adapting Persefone","title":"Changing the region","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To apply Persefone to a new region, you need to create new input maps of land cover and farmplots. How to do so is described here.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"You may also need to change aspects of the farm submodel. This is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-new-animal-species","page":"Adapting Persefone","title":"Adding new animal species","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To implement a new species to the nature submodel, add a new file to the src/nature/species directory and include it in src/Persefone.jl, as well as adding the name of the species to the nature.targetspecies parameter. In the new file, implement the species using the @species syntax as described here.","category":"page"},{"location":"adapting.html#Adding-new-crop-species","page":"Adapting Persefone","title":"Adding new crop species","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Crop growth is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-new-farmer-behaviour","page":"Adapting Persefone","title":"Adding new farmer behaviour","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Farmer behaviour is not yet implemented.","category":"page"},{"location":"adapting.html#Adding-a-new-submodel","page":"Adapting Persefone","title":"Adding a new submodel","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To add a new submodel in addition to the existing ones (nature, crop, and farm), you need to familiarise yourself with the software architecture. In particular, you need to understand how initialisation and scheduling works in src/core/simulation.jl, and what information is stored in the model object.","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"If you want to add a new agent type, create a subtype of ModelAgent, implement a stepagent! function for it and add it to Persefone.initmodel.","category":"page"},{"location":"adapting.html#Linking-to-another-model","page":"Adapting Persefone","title":"Linking to another model","text":"","category":"section"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"Persefone can also be used as a software library and be called from another application. For this purpose, it is set up as a Julia package, with a module exporting various model functions, types, and macros (see src/Persefone.jl). Of particular interest are the functions simulate (set up and run a complete simulation based on a config file), initialise (create one or more model objects from a config file), simulate! (do a simulation run with an existing model object), and stepsimulation! (update a model object by one time step).","category":"page"},{"location":"adapting.html","page":"Adapting Persefone","title":"Adapting Persefone","text":"To interface with Julia from another language, see the Julia docs here and here.","category":"page"},{"location":"odd.html#Overview,-Design,-Details-(ODD)","page":"Overview, Design, Details (ODD)","title":"Overview, Design, Details (ODD)","text":"","category":"section"},{"location":"odd.html","page":"Overview, Design, Details (ODD)","title":"Overview, Design, Details (ODD)","text":"TODO","category":"page"},{"location":"gis.html#Maps-and-weather-data","page":"Maps and weather data","title":"Maps and weather data","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Persefone currently requires two separate map input files: one for land cover, the other for field geometry. Additionally, a weather input file is needed. This documents describe how to obtain and process the data needed for each of these.","category":"page"},{"location":"gis.html#Land-cover-maps","page":"Maps and weather data","title":"Land cover maps","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Land cover maps for Germany at 10m resolution can be obtained from Mundialis. These are generated annually from Sentinel data and comprise the following land cover classes:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"10: forest\n20: low vegetation\n30: water\n40: built-up\n50: bare soil\n60: agriculture","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"To create a Persefone map input file, you need to crop the national Mundialis map to the extent that you want to simulate (suggestion: approx. 10x10km is a reasonable size).","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"To do so, download the Mundialis map and import it into QGIS. Then create a new vector layer and create a rectangle feature to delimit the extent of your region. Then go to Raster -> Extraction -> Clip Raster by Extent. Select the Mundialis map as the input layer, set the clipping extent by choosing your region vector layer under Calculate from Layer and specify the output file name before clicking Run. This will generate a TIF file that you can pass to Persefone as the landcovermap parameter.","category":"page"},{"location":"gis.html#Field-ID-maps","page":"Maps and weather data","title":"Field ID maps","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"In addition to the land cover data explained above, Persefone also needs information about agricultural field boundaries in order to assign these to the farming agents. Unfortunately, getting this is rather more complicated.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"In the EU, every country runs a Land Parcel Information System (LPIS) to administer CAP payments. In Germany, this is called InVeKoS and is run by the Länder. For example, you can view and download the InVeKoS data for Thüringen here. This gives you a vector layer which can be loaded into QGIS. However, it needs to be converted to a raster layer and cropped to your region extent before it can be used in Persefone.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"The first thing to do is to make sure that the vector layer has a numeric (!) field with a unique identifier for each field block (check the attribute table). The Thüringen data has the FBI (\"Feldblockident\") field, but this is a string value and therefore not usable by the rasteriser. So, we set the vector layer to edit mode, open the field calculator, enter the information for a new field (call it \"FID\" and set it to a 32-bit integer), and enter @row_number in the expression field. Then save the layer and close the calculator.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Secondly, you need to filter out all non-field/non-grassland plot types. (LPIS also has data on forests and various landscape elements that are not relevant to our use case.) Assuming you're working with the Thüringen InVeKoS data (other data sets may have a different structure), right-click on the layer name in QGIS' layer overview and click on \"Filter...\". Then, enter this expression in the query builder: \"BNK\" = 'AL' OR \"BNK\" = 'GL' and click \"OK\". This will select only field and grassland plots.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Next, open the rasteriser (Raster -> Conversion -> Rasterize). Select your FID field as the \"Field to use for a burn-in value\", and your land cover map (as created above - this ensures the two layers match) as the output extent. Make sure the \"fixed value to burn\" is \"Not set\". Then choose \"Georeferenced units\" as the \"Out raster size units\" and set horizontal and vertical resolution to 10.0. In the advanced parameters, set the output data type to UInt32. Finally, enter an output file name and run. The resulting TIF file can be passed to Persefone as the farmfieldmap parameter.","category":"page"},{"location":"gis.html#Weather-data","page":"Maps and weather data","title":"Weather data","text":"","category":"section"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Currently, Persefone uses historical weather data from the closes weather station as its weather input. (In future, this may be changed to a more detailed raster input, which could then also provide future weather predictions under climate change.) Weather data can be downloaded from the German weather service (DWD). The relevant data are in the folder daily/kl/historical.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"The description of this data set and the list of weather stations can be found in the Persefone repository, in the docs folder (or downloaded from the link above). Using the list of weather stations, select the one closest to the area of study. Note that not all stations were continuously in operation; make sure that the selected station covers the years of interest.","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Region Jena: station number 02444 (\"Jena (Sternwarte)\")\nRegion Eichsfeld:\nRegion Thüringer Becken:\nRegion Hohenlohe:\nRegion Bodensee:\nRegion Nördlicher Oberrhein:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"From the link above, download the ZIP file associated with the station number. Check the included meta-data if there is any important missing data, or other relevant information (e.g. the station moved position).","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Then use data/extract_weather_data.R to process the data into the format needed by Persefone:","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"library(tidyverse)\n\n## replace this with the correct file name\nweatherfile = \"produkt_klima_tag_18210101_20221231_02444.txt\"\n\ndata = read.table(weatherfile, sep=\";\", header=T)\n\nweather = data %>%\n ## drop values before 2000 to save space\n filter(MESS_DATUM>=20000101) %>%\n ## select relevant variables and convert place-holder values to NA\n select(MESS_DATUM, FM, RSK, SDK, VPM, TMK, TXK, TNK) %>%\n mutate(date=MESS_DATUM, MESS_DATUM=NULL,\n mean_windspeed=na_if(FM, -999), FM=NULL,\n precipitation=na_if(RSK, -999), RSK=NULL,\n sunshine_hours=na_if(SDK, -999), SDK=NULL,\n mean_vapour_pressure=na_if(VPM, -999), VPM=NULL,\n mean_temperature=na_if(TMK, -999), TMK=NULL,\n max_temperature=na_if(TXK, -999), TXK=NULL,\n min_temperature=na_if(TNK, -999), TNK=NULL)\n\n## replace with the desired file name\nwrite.csv(weather, file=\"weather_jena.csv\", row.names=FALSE)","category":"page"},{"location":"gis.html","page":"Maps and weather data","title":"Maps and weather data","text":"Note: for calculating the reference evapotranspiration ET_0 (needed for the AquaCrop model), use the FAO Penman-Monteith equation.","category":"page"},{"location":"crops.html#Crop-submodel","page":"Crop submodel","title":"Crop submodel","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Eventually, the plan is to have Persefone include a reimplementation of the AquaCrop model, a well-established crop growth model developed by the FAO. Until then, we are using the crop growth submodel used in ALMaSS.","category":"page"},{"location":"crops.html#farmplot.jl","page":"Crop submodel","title":"farmplot.jl","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"This file is responsible for the farm plots, i.e. the indidivual fields that farmers manage.","category":"page"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Modules = [Persefone]\nPages = [\"crop/farmplot.jl\"]","category":"page"},{"location":"crops.html#Persefone.FarmPlot","page":"Crop submodel","title":"Persefone.FarmPlot","text":"FarmPlot\n\nThis represents one field, i.e. a collection of pixels with the same management. This is the spatial unit with which the crop growth model and the farm model work.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.averagefieldsize-Tuple{SimulationModel}","page":"Crop submodel","title":"Persefone.averagefieldsize","text":"averagefieldsize(model)\n\nCalculate the average field size in hectares for the model landscape.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.cropheight-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Crop submodel","title":"Persefone.cropheight","text":"cropheight(model, position)\n\nReturn the height of the crop at this position, or nothing if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.cropname-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Crop submodel","title":"Persefone.cropname","text":"cropname(model, position)\n\nReturn the name of the crop at this position, or an empty string if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.croptype-Tuple{Tuple{Int64, Int64}, SimulationModel}","page":"Crop submodel","title":"Persefone.croptype","text":"croptype(model, position)\n\nReturn the crop at this position, or nothing if there is no crop here (utility wrapper).\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.growcrop!-Tuple{FarmPlot, SimulationModel}","page":"Crop submodel","title":"Persefone.growcrop!","text":"growcrop!(farmplot, model)\n\nApply the relevant crop growth model to update the plants on this farm plot. Currently only supports the ALMaSS crop growth model by Topping et al.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.harvest!-Tuple{FarmPlot, SimulationModel}","page":"Crop submodel","title":"Persefone.harvest!","text":"harvest!(farmplot, model)\n\nHarvest the crop on this farmplot.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.initfields!-Tuple{SimulationModel}","page":"Crop submodel","title":"Persefone.initfields!","text":"initfields!(model)\n\nInitialise the model with its farm plots.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.sow!-Tuple{String, FarmPlot, SimulationModel}","page":"Crop submodel","title":"Persefone.sow!","text":"sow!(cropname, farmplot, model)\n\nSow the specified crop on this farmplot.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.stepagent!-Tuple{FarmPlot, SimulationModel}","page":"Crop submodel","title":"Persefone.stepagent!","text":"stepagent!(farmplot, model)\n\nUpdate a farm plot by one day.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#crops.jl","page":"Crop submodel","title":"crops.jl","text":"","category":"section"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"This includes the types and functions needed for all crop growth model, which are also referenced by the other submodels.","category":"page"},{"location":"crops.html","page":"Crop submodel","title":"Crop submodel","text":"Modules = [Persefone]\nPages = [\"crop/crops.jl\"]","category":"page"},{"location":"crops.html#Persefone.CropCurveParams","page":"Crop submodel","title":"Persefone.CropCurveParams","text":"CropCurveParams\n\nThe values in this struct define one crop growth curve.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.CropType","page":"Crop submodel","title":"Persefone.CropType","text":"CropType\n\nThe type struct for all crops. Currently follows the crop growth model as implemented in ALMaSS.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Persefone.GrowthPhase","page":"Crop submodel","title":"Persefone.GrowthPhase","text":"GrowthPhase\n\nALMaSS crop growth curves are split into five phases, triggered by seasonal dates or agricultural events.\n\n\n\n\n\n","category":"type"},{"location":"crops.html#Base.tryparse-Tuple{Type{Persefone.GrowthPhase}, String}","page":"Crop submodel","title":"Base.tryparse","text":"Base.tryparse(type, str)\n\nExtend tryparse to allow parsing GrowthPhase values. (Needed to read in the CSV parameter file.)\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.buildgrowthcurve-Tuple{Vector{CSV.Row}}","page":"Crop submodel","title":"Persefone.buildgrowthcurve","text":"buildgrowthcurve(data)\n\nConvert a list of rows from the crop growth data into a CropCurveParams object.\n\n\n\n\n\n","category":"method"},{"location":"crops.html#Persefone.readcropparameters-Tuple{String, String}","page":"Crop submodel","title":"Persefone.readcropparameters","text":"readcropparameters(generalcropfile, cropgrowthfile)\n\nParse a CSV file containing the required parameter values for each crop (as produced from the original ALMaSS file by convert_almass_data.py).\n\n\n\n\n\n","category":"method"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"CurrentModule = Persefone","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"(Image: Persefone.jl splash screen)","category":"page"},{"location":"index.html#Introduction","page":"Introduction","title":"Introduction","text":"","category":"section"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"Persefone.jl models agricultural practice and how it impacts animal species at a landscape scale. It includes a farm submodel, a crop growth submodel, and individual-based models of multiple indicator species. Its aim is to investigate how changes in farm operations (e.g. through policy changes in the CAP) influence biodiversity.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"The model is open-source software available on Gitlab.","category":"page"},{"location":"index.html","page":"Introduction","title":"Introduction","text":"This documentation was last updated on 2024-06-07 for Persefone.jl v0.5.0 (commit 2341a34).","category":"page"}] } diff --git a/docs/build/simulation.html b/docs/build/simulation.html index 58b1810698fa6cd12d2253526bc2cc93fb75118a..a55a5d4fd9d4473407c13e7bd9288942f4de75bf 100644 --- a/docs/build/simulation.html +++ b/docs/build/simulation.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Simulation · Persefone</title><meta name="title" content="Simulation · Persefone"/><meta property="og:title" content="Simulation · Persefone"/><meta property="twitter:title" content="Simulation · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li class="is-active"><a class="tocitem" href="simulation.html">Simulation</a><ul class="internal"><li><a class="tocitem" href="#simulation.jl"><span>simulation.jl</span></a></li><li><a class="tocitem" href="#landscape.jl"><span>landscape.jl</span></a></li><li><a class="tocitem" href="#weather.jl"><span>weather.jl</span></a></li></ul></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Core</a></li><li class="is-active"><a href="simulation.html">Simulation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="simulation.html">Simulation</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/simulation.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Simulation"><a class="docs-heading-anchor" href="#Simulation">Simulation</a><a id="Simulation-1"></a><a class="docs-heading-anchor-permalink" href="#Simulation" title="Permalink"></a></h1><p>The <code>core</code> and <code>world</code> directories hold source files that are important for all submodels, including scheduling, landscape, weather, and input/output functions.</p><h2 id="simulation.jl"><a class="docs-heading-anchor" href="#simulation.jl">simulation.jl</a><a id="simulation.jl-1"></a><a class="docs-heading-anchor-permalink" href="#simulation.jl" title="Permalink"></a></h2><p>This file includes the basal functions for initialising and running simulations.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.finalise!-Tuple{Agents.AgentBasedModel}" href="#Persefone.finalise!-Tuple{Agents.AgentBasedModel}"><code>Persefone.finalise!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">finalise!(model)</code></pre><p>Wrap up the simulation. Currently doesn't do anything except print some information.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L144-L148">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initialise" href="#Persefone.initialise"><code>Persefone.initialise</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">initialise(config=PARAMFILE, seed=nothing)</code></pre><p>Initialise the model: read in parameters, create the output data directory, and instantiate the AgentBasedModel object(s). Optionally allows specifying the configuration file and overriding the <code>seed</code> parameter. This returns a single model object, unless the config file contains multiple values for one or more parameters, in which case it creates a full-factorial simulation experiment and returns a vector of model objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L35-L44">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initmodel-Tuple{Dict{String, Any}}" href="#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initmodel(settings)</code></pre><p>Initialise a model object using a ready-made settings dict. This is a helper function for <code>initialise()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L54-L59">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}" href="#Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}"><code>Persefone.paramscan</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">paramscan(settings)</code></pre><p>Create a list of settings dicts, covering all possible parameter combinations given by the input settings (i.e. a full-factorial experiment). This is a helper function for <code>initialise()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L93-L99">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.simulate" href="#Persefone.simulate"><code>Persefone.simulate</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">simulate(config=PARAMFILE, seed=nothing)</code></pre><p>Initialise one or more model objects and carry out a full simulation experiment, optionally specifying a configuration file and a seed for the RNG.</p><p>This is the default way to run a Persefone simulation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L8-L15">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.simulate!-Tuple{Agents.AgentBasedModel}" href="#Persefone.simulate!-Tuple{Agents.AgentBasedModel}"><code>Persefone.simulate!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">simulate!(model)</code></pre><p>Carry out a complete simulation run using a pre-initialised model object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L23-L27">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}" href="#Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}"><code>Persefone.stepsimulation!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepsimulation!(model)</code></pre><p>Execute one update of the model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/core/simulation.jl#L121-L125">source</a></section></article><h2 id="landscape.jl"><a class="docs-heading-anchor" href="#landscape.jl">landscape.jl</a><a id="landscape.jl-1"></a><a class="docs-heading-anchor-permalink" href="#landscape.jl" title="Permalink"></a></h2><p>This file manages the landscape maps that underlie the model.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.EventType" href="#Persefone.EventType"><code>Persefone.EventType</code></a> — <span class="docstring-category">Type</span></header><section><div><p>The types of landscape event that can be simulated</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.FarmEvent" href="#Persefone.FarmEvent"><code>Persefone.FarmEvent</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">FarmEvent</code></pre><p>A data structure to define a landscape event, giving its type, spatial extent, and duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L26-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.LandCover" href="#Persefone.LandCover"><code>Persefone.LandCover</code></a> — <span class="docstring-category">Type</span></header><section><div><p>The land cover classes encoded in the Mundialis Sentinel data.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L6">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Pixel" href="#Persefone.Pixel"><code>Persefone.Pixel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Pixel</code></pre><p>A pixel is a simple data structure to combine land use and ownership information in a single object. The model landscape consists of a matrix of pixels. (Note: further landscape information may be added here in future.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L13-L19">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.createevent!" href="#Persefone.createevent!"><code>Persefone.createevent!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">createevent!(model, pixels, name, duration=1)</code></pre><p>Add a farm event to the specified pixels (a vector of position tuples) for a given duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L89-L93">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Function}" href="#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Function}"><code>Persefone.distanceto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distanceto(pos, model, habitatdescriptor)</code></pre><p>Calculate the distance from the given location to the closest location matching the habitat descriptor function. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L122-L127">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Persefone.LandCover}" href="#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel, Persefone.LandCover}"><code>Persefone.distanceto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distanceto(pos, model, habitattype)</code></pre><p>Calculate the distance from the given location to the closest habitat of the specified type. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L156-L161">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.distancetoedge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distancetoedge(pos, model)</code></pre><p>Calculate the distance from the given location to the closest neighbouring habitat. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L167-L172">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.farmplot-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.farmplot-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.farmplot</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">farmplot(position, model)</code></pre><p>Return the farm plot at this position, or nothing if there is none (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L111-L115">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initlandscape-Tuple{String, String}" href="#Persefone.initlandscape-Tuple{String, String}"><code>Persefone.initlandscape</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initlandscape(landcovermap, farmfieldsmap)</code></pre><p>Initialise the model landscape based on the map files specified in the configuration. Returns a matrix of pixels.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L38-L43">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.landcover-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}" href="#Persefone.landcover-Tuple{Tuple{Int64, Int64}, Agents.AgentBasedModel}"><code>Persefone.landcover</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">landcover(position, model)</code></pre><p>Return the land cover class at this position (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L102-L106">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.updateevents!-Tuple{Agents.AgentBasedModel}" href="#Persefone.updateevents!-Tuple{Agents.AgentBasedModel}"><code>Persefone.updateevents!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">updateevents!(model)</code></pre><p>Cycle through the list of events, removing those that have expired.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/landscape.jl#L68-L72">source</a></section></article><h2 id="weather.jl"><a class="docs-heading-anchor" href="#weather.jl">weather.jl</a><a id="weather.jl-1"></a><a class="docs-heading-anchor-permalink" href="#weather.jl" title="Permalink"></a></h2><p>This file reads in weather data and makes it available to the model.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Weather" href="#Persefone.Weather"><code>Persefone.Weather</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Weather</code></pre><p>A single weather datum, combining the observations from one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}" href="#Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}"><code>Persefone.initweather</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initweather(weatherfile, startdate, enddate)</code></pre><p>Load a weather file, extract the values that are relevant to this model run (specified by start and end dates), and return a dictionary of Weather objects mapped to dates.</p><p><strong>Note:</strong> This requires a weather file in the format produced by <code>data/extract_weather_data.R</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L22-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.maxtemp-Tuple{Agents.AgentBasedModel}" href="#Persefone.maxtemp-Tuple{Agents.AgentBasedModel}"><code>Persefone.maxtemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">maxtemp(model)</code></pre><p>Return today's maximum temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.meantemp-Tuple{Agents.AgentBasedModel}" href="#Persefone.meantemp-Tuple{Agents.AgentBasedModel}"><code>Persefone.meantemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">meantemp(model)</code></pre><p>Return today's mean temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.mintemp-Tuple{Agents.AgentBasedModel}" href="#Persefone.mintemp-Tuple{Agents.AgentBasedModel}"><code>Persefone.mintemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">mintemp(model)</code></pre><p>Return today's minimum temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L105-L109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.precipitation-Tuple{Agents.AgentBasedModel}" href="#Persefone.precipitation-Tuple{Agents.AgentBasedModel}"><code>Persefone.precipitation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">precipitation(model)</code></pre><p>Return today's total precipitation in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L60-L64">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.sunshine-Tuple{Agents.AgentBasedModel}" href="#Persefone.sunshine-Tuple{Agents.AgentBasedModel}"><code>Persefone.sunshine</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">sunshine(model)</code></pre><p>Return today's sunshine duration in hours.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L69-L73">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.vapourpressure-Tuple{Agents.AgentBasedModel}" href="#Persefone.vapourpressure-Tuple{Agents.AgentBasedModel}"><code>Persefone.vapourpressure</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">vapourpressure(model)</code></pre><p>Return today's average vapour pressure in hPa.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L78-L82">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.windspeed-Tuple{Agents.AgentBasedModel}" href="#Persefone.windspeed-Tuple{Agents.AgentBasedModel}"><code>Persefone.windspeed</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">windspeed(model)</code></pre><p>Return today's average windspeed in m/s.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/b27fb1b4a30d0aeab50e8cf399d05c46f18af286/src/world/weather.jl#L51-L55">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="species-dsl.html">« Defining new species</a><a class="docs-footer-nextpage" href="io.html">Input and Output »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Simulation · Persefone.jl</title><meta name="title" content="Simulation · Persefone.jl"/><meta property="og:title" content="Simulation · Persefone.jl"/><meta property="twitter:title" content="Simulation · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li class="is-active"><a class="tocitem" href="simulation.html">Simulation</a><ul class="internal"><li><a class="tocitem" href="#Persefone.jl"><span>Persefone.jl</span></a></li><li><a class="tocitem" href="#simulation.jl"><span>simulation.jl</span></a></li><li><a class="tocitem" href="#landscape.jl"><span>landscape.jl</span></a></li><li><a class="tocitem" href="#weather.jl"><span>weather.jl</span></a></li></ul></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Core</a></li><li class="is-active"><a href="simulation.html">Simulation</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="simulation.html">Simulation</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/simulation.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Simulation"><a class="docs-heading-anchor" href="#Simulation">Simulation</a><a id="Simulation-1"></a><a class="docs-heading-anchor-permalink" href="#Simulation" title="Permalink"></a></h1><p>The <code>core</code> and <code>world</code> directories hold source files that are important for all submodels, including scheduling, landscape, weather, and input/output functions.</p><h2 id="Persefone.jl"><a class="docs-heading-anchor" href="#Persefone.jl">Persefone.jl</a><a id="Persefone.jl-1"></a><a class="docs-heading-anchor-permalink" href="#Persefone.jl" title="Permalink"></a></h2><p>This file defines the module, including all exported symbols and two high-level types.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.ModelAgent" href="#Persefone.ModelAgent"><code>Persefone.ModelAgent</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">ModelAgent</code></pre><p>The supertype of all agents in the model (animal species, farmer types, farmplots).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/Persefone.jl#L111-L115">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.SimulationModel" href="#Persefone.SimulationModel"><code>Persefone.SimulationModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">SimulationModel</code></pre><p>The supertype of <a href="@ref">AgricultureModel</a>. This is needed to avoid circular dependencies (most types and functions depend on <code>SimulationModel</code>, but the definition of the model struct depends on these types).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/Persefone.jl#L102-L108">source</a></section></article><h2 id="simulation.jl"><a class="docs-heading-anchor" href="#simulation.jl">simulation.jl</a><a id="simulation.jl-1"></a><a class="docs-heading-anchor-permalink" href="#simulation.jl" title="Permalink"></a></h2><p>This file includes the basal functions for initialising and running simulations.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.AgricultureModel" href="#Persefone.AgricultureModel"><code>Persefone.AgricultureModel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">AgricultureModel</code></pre><p>This is the heart of the model - a struct that holds all data and state for one simulation run. It is created by <a href="simulation.html#Persefone.initialise"><code>initialise</code></a> and passed as input to most model functions.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L8-L14">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.finalise!-Tuple{SimulationModel}" href="#Persefone.finalise!-Tuple{SimulationModel}"><code>Persefone.finalise!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">finalise!(model)</code></pre><p>Wrap up the simulation. Finalises and visualises output, then terminates.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L194-L198">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initialise" href="#Persefone.initialise"><code>Persefone.initialise</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">initialise(config=PARAMFILE, seed=nothing)</code></pre><p>Initialise the model: read in parameters, create the output data directory, and instantiate the SimulationModel object(s). Optionally allows specifying the configuration file and overriding the <code>seed</code> parameter. This returns a single model object, unless the config file contains multiple values for one or more parameters, in which case it creates a full-factorial simulation experiment and returns a vector of model objects.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L79-L88">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initmodel-Tuple{Dict{String, Any}}" href="#Persefone.initmodel-Tuple{Dict{String, Any}}"><code>Persefone.initmodel</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initmodel(settings)</code></pre><p>Initialise a model object using a ready-made settings dict. This is a helper function for <code>initialise()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L98-L103">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nagents-Tuple{AgricultureModel}" href="#Persefone.nagents-Tuple{AgricultureModel}"><code>Persefone.nagents</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">nagents(model)</code></pre><p>Return the total number of agents in a model object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L32-L36">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}" href="#Persefone.paramscan-Tuple{Dict{String, Any}, Vector{String}}"><code>Persefone.paramscan</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">paramscan(settings)</code></pre><p>Create a list of settings dicts, covering all possible parameter combinations given by the input settings (i.e. a full-factorial experiment). This is a helper function for <code>initialise()</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L142-L148">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.simulate" href="#Persefone.simulate"><code>Persefone.simulate</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">simulate(config=PARAMFILE, seed=nothing)</code></pre><p>Initialise one or more model objects and carry out a full simulation experiment, optionally specifying a configuration file and a seed for the RNG.</p><p>This is the default way to run a Persefone simulation.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L50-L57">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.simulate!-Tuple{SimulationModel}" href="#Persefone.simulate!-Tuple{SimulationModel}"><code>Persefone.simulate!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">simulate!(model)</code></pre><p>Carry out a complete simulation run using a pre-initialised model object.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L65-L69">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepagent!-Tuple{ModelAgent, SimulationModel}" href="#Persefone.stepagent!-Tuple{ModelAgent, SimulationModel}"><code>Persefone.stepagent!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepagent!(agent, model)</code></pre><p>All agent types must define a stepagent!() method that will be called daily.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L41-L45">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.stepsimulation!-Tuple{SimulationModel}" href="#Persefone.stepsimulation!-Tuple{SimulationModel}"><code>Persefone.stepsimulation!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">stepsimulation!(model)</code></pre><p>Execute one update of the model.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/core/simulation.jl#L170-L174">source</a></section></article><h2 id="landscape.jl"><a class="docs-heading-anchor" href="#landscape.jl">landscape.jl</a><a id="landscape.jl-1"></a><a class="docs-heading-anchor-permalink" href="#landscape.jl" title="Permalink"></a></h2><p>This file manages the landscape maps that underlie the model.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.EventType" href="#Persefone.EventType"><code>Persefone.EventType</code></a> — <span class="docstring-category">Type</span></header><section><div><p>The types of landscape event that can be simulated</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L10">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.FarmEvent" href="#Persefone.FarmEvent"><code>Persefone.FarmEvent</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">FarmEvent</code></pre><p>A data structure to define a landscape event, giving its type, spatial extent, and duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L28-L33">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.LandCover" href="#Persefone.LandCover"><code>Persefone.LandCover</code></a> — <span class="docstring-category">Type</span></header><section><div><p>The land cover classes encoded in the Mundialis Sentinel data.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L7">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Pixel" href="#Persefone.Pixel"><code>Persefone.Pixel</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Pixel</code></pre><p>A pixel is a simple data structure to combine land use and ownership information in a single object. The model landscape consists of a matrix of pixels. (Note: further landscape information may be added here in future.)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L14-L20">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.createevent!" href="#Persefone.createevent!"><code>Persefone.createevent!</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">createevent!(model, pixels, name, duration=1)</code></pre><p>Add a farm event to the specified pixels (a vector of position tuples) for a given duration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L91-L95">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}" href="#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}"><code>Persefone.directionto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">directionto(pos, model, habitatdescriptor)</code></pre><p>Calculate the direction from the given location to the closest location matching the habitat descriptor function. Returns a coordinate tuple (target - position), or nothing if no matching habitat is found. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L123-L129">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}" href="#Persefone.directionto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}"><code>Persefone.directionto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">directionto(pos, model, habitattype)</code></pre><p>Calculate the direction from the given location to the closest habitat of the specified type. Returns a coordinate tuple (target - position), or nothing if no matching habitat is found. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L162-L168">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}" href="#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Function}"><code>Persefone.distanceto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distanceto(pos, model, habitatdescriptor)</code></pre><p>Calculate the distance from the given location to the closest location matching the habitat descriptor function. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L174-L179">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}" href="#Persefone.distanceto-Tuple{Tuple{Int64, Int64}, SimulationModel, Persefone.LandCover}"><code>Persefone.distanceto</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distanceto(pos, model, habitattype)</code></pre><p>Calculate the distance from the given location to the closest habitat of the specified type. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L186-L191">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.distancetoedge-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.distancetoedge</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">distancetoedge(pos, model)</code></pre><p>Calculate the distance from the given location to the closest neighbouring habitat. Caution: can be computationally expensive!</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L197-L202">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.farmplot-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.farmplot-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.farmplot</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">farmplot(position, model)</code></pre><p>Return the farm plot at this position, or nothing if there is none (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L113-L117">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.inbounds-Tuple{Any, Any}" href="#Persefone.inbounds-Tuple{Any, Any}"><code>Persefone.inbounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">inbounds(pos, model)</code></pre><p>Is the given position within the bounds of the model landscape?</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L234-L238">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initlandscape-Tuple{String, String}" href="#Persefone.initlandscape-Tuple{String, String}"><code>Persefone.initlandscape</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initlandscape(landcovermap, farmfieldsmap)</code></pre><p>Initialise the model landscape based on the map files specified in the configuration. Returns a matrix of pixels.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L40-L45">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.landcover-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.landcover-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.landcover</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">landcover(position, model)</code></pre><p>Return the land cover class at this position (utility wrapper).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L104-L108">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.randomdirection" href="#Persefone.randomdirection"><code>Persefone.randomdirection</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">randomdirection(model, range=1)</code></pre><p>Get a random direction coordinate tuple within the specified range.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L225-L229">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.randompixel" href="#Persefone.randompixel"><code>Persefone.randompixel</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia hljs">randompixel(position, model, range, habitatdescriptor)</code></pre><p>Find a random pixel within a given <code>range</code> of the <code>position</code> that matches the habitatdescriptor (create this using <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L208-L213">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.safebounds-Tuple{Tuple{Int64, Int64}, SimulationModel}" href="#Persefone.safebounds-Tuple{Tuple{Int64, Int64}, SimulationModel}"><code>Persefone.safebounds</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">safebounds(pos, model)</code></pre><p>Make sure that a given position is within the bounds of the model landscape.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L244-L248">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.updateevents!-Tuple{SimulationModel}" href="#Persefone.updateevents!-Tuple{SimulationModel}"><code>Persefone.updateevents!</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">updateevents!(model)</code></pre><p>Cycle through the list of events, removing those that have expired.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/landscape.jl#L70-L74">source</a></section></article><h2 id="weather.jl"><a class="docs-heading-anchor" href="#weather.jl">weather.jl</a><a id="weather.jl-1"></a><a class="docs-heading-anchor-permalink" href="#weather.jl" title="Permalink"></a></h2><p>This file reads in weather data and makes it available to the model.</p><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Weather" href="#Persefone.Weather"><code>Persefone.Weather</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Weather</code></pre><p>A single weather datum, combining the observations from one day.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L7-L11">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}" href="#Persefone.initweather-Tuple{String, Dates.Date, Dates.Date}"><code>Persefone.initweather</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">initweather(weatherfile, startdate, enddate)</code></pre><p>Load a weather file, extract the values that are relevant to this model run (specified by start and end dates), and return a dictionary of Weather objects mapped to dates.</p><p><strong>Note:</strong> This requires a weather file in the format produced by <code>data/extract_weather_data.R</code>.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L22-L30">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.maxtemp-Tuple{SimulationModel}" href="#Persefone.maxtemp-Tuple{SimulationModel}"><code>Persefone.maxtemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">maxtemp(model)</code></pre><p>Return today's maximum temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L96-L100">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.meantemp-Tuple{SimulationModel}" href="#Persefone.meantemp-Tuple{SimulationModel}"><code>Persefone.meantemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">meantemp(model)</code></pre><p>Return today's mean temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L87-L91">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.mintemp-Tuple{SimulationModel}" href="#Persefone.mintemp-Tuple{SimulationModel}"><code>Persefone.mintemp</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">mintemp(model)</code></pre><p>Return today's minimum temperature in °C.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L105-L109">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.precipitation-Tuple{SimulationModel}" href="#Persefone.precipitation-Tuple{SimulationModel}"><code>Persefone.precipitation</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">precipitation(model)</code></pre><p>Return today's total precipitation in mm.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L60-L64">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.sunshine-Tuple{SimulationModel}" href="#Persefone.sunshine-Tuple{SimulationModel}"><code>Persefone.sunshine</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">sunshine(model)</code></pre><p>Return today's sunshine duration in hours.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L69-L73">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.vapourpressure-Tuple{SimulationModel}" href="#Persefone.vapourpressure-Tuple{SimulationModel}"><code>Persefone.vapourpressure</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">vapourpressure(model)</code></pre><p>Return today's average vapour pressure in hPa.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L78-L82">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.windspeed-Tuple{SimulationModel}" href="#Persefone.windspeed-Tuple{SimulationModel}"><code>Persefone.windspeed</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">windspeed(model)</code></pre><p>Return today's average windspeed in m/s.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/world/weather.jl#L51-L55">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="species-dsl.html">« Defining new species</a><a class="docs-footer-nextpage" href="io.html">Input and Output »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/species-dsl.html b/docs/build/species-dsl.html index ba66ab7647e10897541218778376b113a30ff11e..3c6ca2aaa65bb2d7ad7e13b717dbad6bdcecc403 100644 --- a/docs/build/species-dsl.html +++ b/docs/build/species-dsl.html @@ -1,23 +1,32 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Defining new species · Persefone</title><meta name="title" content="Defining new species · Persefone"/><meta property="og:title" content="Defining new species · Persefone"/><meta property="twitter:title" content="Defining new species · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li class="is-active"><a class="tocitem" href="species-dsl.html">Defining new species</a><ul class="internal"><li><a class="tocitem" href="#The-Persefone-species-DSL"><span>The Persefone species DSL</span></a></li><li><a class="tocitem" href="#Implementation-details"><span>Implementation details</span></a></li></ul></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="species-dsl.html">Defining new species</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="species-dsl.html">Defining new species</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/species-dsl.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Defining-new-species"><a class="docs-heading-anchor" href="#Defining-new-species">Defining new species</a><a id="Defining-new-species-1"></a><a class="docs-heading-anchor-permalink" href="#Defining-new-species" title="Permalink"></a></h1><h2 id="The-Persefone-species-DSL"><a class="docs-heading-anchor" href="#The-Persefone-species-DSL">The Persefone species DSL</a><a id="The-Persefone-species-DSL-1"></a><a class="docs-heading-anchor-permalink" href="#The-Persefone-species-DSL" title="Permalink"></a></h2><p>In order to make implementing new species as easy as possible, Persefone includes a <a href="https://doi.org/10.1016/j.ecoinf.2015.02.005">domain-specific language</a> (DSL) built from a collection of macros and functions.</p><p>Here is an example of what this looks like, using a hypothetical mermaid species:</p><pre><code class="language-julia hljs">@species Mermaid begin +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Defining new species · Persefone.jl</title><meta name="title" content="Defining new species · Persefone.jl"/><meta property="og:title" content="Defining new species · Persefone.jl"/><meta property="twitter:title" content="Defining new species · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li class="is-active"><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Developer guide</a></li><li class="is-active"><a href="species-dsl.html">Defining new species</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="species-dsl.html">Defining new species</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/species-dsl.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Defining-new-species"><a class="docs-heading-anchor" href="#Defining-new-species">Defining new species</a><a id="Defining-new-species-1"></a><a class="docs-heading-anchor-permalink" href="#Defining-new-species" title="Permalink"></a></h1><p>In order to make implementing new species as easy as possible, Persefone includes a <a href="https://doi.org/10.1016/j.ecoinf.2015.02.005">domain-specific language</a> (DSL) built from a collection of macros and functions.</p><p>Here is an example of what this looks like, using a hypothetical mermaid species:</p><pre><code class="language-julia hljs">@species Mermaid begin ageofmaturity = 2 pesticidemortality = 1.0 - @initialise(@habitat(@landcover() == water), pairs=true) - - @phase life begin - @debug "$(animalid(animal)) is swimming happily in its pond." - @respond pesticide @kill(@trait(pesticidemortality), "poisoning") - @respond harvest @setphase(drought) - @debug "Animal: $animal" - if @trait(sex) == female && @countanimals() < 3 && - @trait(age) >= @trait(ageofmaturity) && @landcover() == water - @reproduce() - end +end + +@create Mermaid begin + @debug "Created $(animalid(self))." +end + +@phase Mermaid life begin + @debug "$(animalid(self)) is swimming happily in its pond." + @respond pesticide @kill(self.pesticidemortality, "poisoning") + @respond harvesting @setphase(drought) + if self.sex == female && length(@neighbours()) < 3 && + self.age >= self.ageofmaturity && @landcover() == water + @reproduce() end - - @phase drought begin - n = sum(1 for a in @neighbours(0)) - @debug "$(animalid(animal)) is experiencing drought with $n neighbour(s)." - @respond sowing @setphase(life) - end -end</code></pre><p>The two most important macros are <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> and <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a>, followed by <a href="nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>@initialise</code></a>, <a href="nature.html#Persefone.@trait-Tuple{Any}"><code>@trait</code></a>, <a href="nature.html#Persefone.@respond-Tuple{Any, Any}"><code>@respond</code></a>, and <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>. Other macros provide convenience wrappers for common functions. (See <code>src/nature/nature.jl</code> for details.)</p><p>The top-level macro is <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a>. This takes two arguments: a species name and a definition block (enclosed in <code>begin</code> and <code>end</code> tags). At the start of the definition block, species-specific variables can be defined that should be available throughout a species' lifetime. Code in this section has access to the <code>model</code> object and can thus reference the current model state. In this section, the user also has to call the <a href="nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>@initialise</code></a> macro. This wraps the <a href="nature.html#Persefone.initpopulation-Tuple{Function}"><code>Persefone.initpopulation</code></a> function, and takes a habitat descriptor (see <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a> below) and several options to specify how the species' population should be distributed in the landscape during model initialisation.</p><p>Following this section, each species must define one or more <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> blocks. The concept behind this is that species show different behaviours at different phases of their lifecycle. Each <code>@phase</code> block defines the behaviour in one of these phases. (Technically, it defines a function that will be called daily, so long as the species' <code>phase</code> variable is set to the name of this phase.) Code in this section has access to the <code>model</code> object as well as an <code>animal</code> object, which is the currently active animal agent. Properties of the <code>animal</code> agent, regardless of whether they were defined by the user or by Persefone, can be accessed using the <a href="nature.html#Persefone.@trait-Tuple{Any}"><code>@trait</code></a> macro. Within a phase block, <a href="nature.html#Persefone.@respond-Tuple{Any, Any}"><code>@respond</code></a> can be used to define the species' response to a <a href="simulation.html#Persefone.FarmEvent"><code>FarmEvent</code></a> that affects the species' current location, while a variety of other macros provide wrappers to ecological process functions from <code>src/nature/populations.jl</code>.</p><p>Another important macro is <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>. This defines a "habitat descriptor", i.e. a predicate function that tests whether or not a given landscape pixel is suitable for a specified purpose. Such habitat descriptors are used as arguments to various functions, for example for population initialisation or movement. The argument to <code>@habitat</code> consists of a logical expression, which has access to the animal's current position (the <code>pos</code> tuple variable) and the <code>model</code>. Various macros are available to easily reference information about the current location, such as <a href="nature.html#Persefone.@landcover-Tuple{}"><code>@landcover</code></a> or <a href="nature.html#Persefone.@distancetoedge-Tuple{}"><code>@distancetoedge</code></a>.</p><h2 id="Implementation-details"><a class="docs-heading-anchor" href="#Implementation-details">Implementation details</a><a id="Implementation-details-1"></a><a class="docs-heading-anchor-permalink" href="#Implementation-details" title="Permalink"></a></h2><p>Due to a known <a href="https://juliadynamics.github.io/Agents.jl/stable/performance_tips/#Avoid-Unions-of-many-different-agent-types-(temporary!)-1">performance problem</a> with multi-agent models, the underlying implementation of species is rather complicated (see <code>src/nature/nature.jl</code> for details.)</p><p>Rather than creating a new type/struct for each species, all <a href="@ref">Animal</a> agents have the same type. Instead, they are differentiated by a <code>traits</code> dict, which stores both species-specific parameters and run-time variables. Note that due to a redefinition of the <code>getproperty()/setproperty!()</code> methods, variables from the trait dict can be accessed and modified just like normal struct fields (i.e. although <code>phase</code> is defined in the dict, not the struct, <code>animal.phase = "newphase"</code> works just fine - one does not have to use <code>animal.traits["phase"] = "newphase"</code>.)</p><p>Under the hood, the <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a> macro generates a function (with the name of the species), which in turn creates the trait dict when called. Thus, adding a new animal agent to the model involves instantiating an <a href="nature.html#Persefone.Animal"><code>Animal</code></a> object, then calling the relevant species function and attaching the returned dict to the agent object.</p><p>Similarly, the <a href="nature.html#Persefone.@phase-Tuple{Any, Any}"><code>@phase</code></a> macro too works by defining a new function, which is stored in the species' trait dict. These functions take an animal object and the model object as input, and define what the species does during its daily update.</p><p>Once again, <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a> creates a function that takes <code>model</code> and <code>pos</code> as input and returns a boolean response. Functions that require a habitat descriptor thus take in this (anonymous) function and call it internally.</p><p>Finally, the <a href="nature.html#Persefone.@initialise-Tuple{Any, Vararg{Any}}"><code>@initialise</code></a> macro is a wrapper around <a href="nature.html#Persefone.initpopulation-Tuple{Function}"><code>Persefone.initpopulation</code></a>, which (yet again) creates a function that specifies how a species' population is to be initialised at the beginning of a simulation run. This function is stored in the species trait dict and accessed during model setup.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="gis.html">« Maps and weather data</a><a class="docs-footer-nextpage" href="simulation.html">Simulation »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +end + +@phase Mermaid drought begin + n = sum(1 for a in @neighbours()) + @debug "$(animalid(self)) is experiencing drought with $n neighbour(s)." + @respond sowing @setphase(life) +end + +@populate Mermaid begin + birthphase = life + initphase = life + habitat = @habitat(@landcover() == water) + pairs=true +end</code></pre><p>A complete species definition consists of one call each to <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a>, <a href="nature.html#Persefone.@create-Tuple{Any, Any}"><code>@create</code></a>, <a href="nature.html#Persefone.@populate-Tuple{Any, Any}"><code>@populate</code></a>, and one or more calls to <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a>. Another important macro is <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>. Further macros are available to provide convenience wrappers for common functions. (See <a href="nature.html"><code>src/nature/nature.jl</code></a> for details.)</p><p>The first macro to call is <a href="nature.html#Persefone.@species-Tuple{Any, Any}"><code>@species</code></a>. This takes two arguments: a species name and a definition block (enclosed in <code>begin</code> and <code>end</code> tags). Within the block, species-specific parameters and variables can be defined (and optionally given values) that should be available throughout a species' lifetime. </p><p>Next, each species must define one or more <a href="nature.html#Persefone.@phase-Tuple{Any, Any, Any}"><code>@phase</code></a> blocks. The concept behind this is that species show different behaviours at different phases of their lifecycle. Each <code>@phase</code> block defines the behaviour in one of these phases. (Technically, it defines a function that will be called daily, so long as the species' <code>phase</code> variable is set to this phase.) Code in this section has access to the <code>model</code> object as well as a <code>self</code> object, which is the currently active <a href="nature.html#Persefone.Animal"><code>Animal</code></a> agent. Within a phase block, <a href="nature.html#Persefone.@respond-Tuple{Any, Any}"><code>@respond</code></a> can be used to define the species' response to a <a href="simulation.html#Persefone.FarmEvent"><code>FarmEvent</code></a> that affects the species' current location, while a variety of other macros provide wrappers to life history and movement functions from <a href="nature.html"><code>src/nature/populations.jl</code></a>.</p><p>The third macro to call is <a href="nature.html#Persefone.@create-Tuple{Any, Any}"><code>@create</code></a>. Like <code>@phase</code>, this defines a function with access to the <code>world</code> and <code>self</code> objects. This function is called whenever a new individual of this species is created (either at birth, or when the model is initialised).</p><p>The last macro that must be called is [<code>@populate</code>]. Whereas <code>@create</code> regulates the creation of individual animals, <code>@populate</code> determines how the population of a species is initialised at the start of a simulation. It does this by defining values for the parameters used by <a href="@ref"><code>initpopulation!</code></a>. The full list of parameters that can be used is documented under <a href="@ref"><code>PopInitParams</code></a>.</p><p>The final important macro is <a href="nature.html#Persefone.@habitat-Tuple{Any}"><code>@habitat</code></a>. This defines a "habitat descriptor", i.e. a predicate function that tests whether or not a given landscape pixel is suitable for a specified purpose. Such habitat descriptors are used as arguments to various functions, for example for population initialisation or movement. The argument to <code>@habitat</code> consists of a logical expression, which has access to the animal's current position (the <code>pos</code> tuple variable) and the <code>model</code>. Various macros are available to easily reference information about the current location, such as <a href="nature.html#Persefone.@landcover-Tuple{}"><code>@landcover</code></a> or <a href="nature.html#Persefone.@distancetoedge-Tuple{}"><code>@distancetoedge</code></a>.</p><p>All of these macros are defined in <a href="https://git.idiv.de/persefone/persefone-model/-/blob/master/src/nature/macros.jl"><code>src/nature/macros.jl</code></a>.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="gis.html">« Maps and weather data</a><a class="docs-footer-nextpage" href="simulation.html">Simulation »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/species.html b/docs/build/species.html index 25e43d173d1f2dea1d345a652c745c2810e45661..defdf64e05133367d09ad137a42f3684bdb98242 100644 --- a/docs/build/species.html +++ b/docs/build/species.html @@ -1,2 +1,2 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Species · Persefone</title><meta name="title" content="Species · Persefone"/><meta property="og:title" content="Species · Persefone"/><meta property="twitter:title" content="Species · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li class="is-active"><a class="tocitem" href="species.html">Species</a><ul class="internal"><li><a class="tocitem" href="#Skylark"><span>Skylark</span></a></li></ul></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="species.html">Species</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="species.html">Species</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/species.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Species"><a class="docs-heading-anchor" href="#Species">Species</a><a id="Species-1"></a><a class="docs-heading-anchor-permalink" href="#Species" title="Permalink"></a></h1><p>The ecological submodel in Persefone simulates a range of species in agricultural landscapes.</p><h2 id="Skylark"><a class="docs-heading-anchor" href="#Skylark">Skylark</a><a id="Skylark-1"></a><a class="docs-heading-anchor-permalink" href="#Skylark" title="Permalink"></a></h2></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="energy.html">« Dynamic Energy Budgets</a><a class="docs-footer-nextpage" href="crops.html">Crop submodel »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>Species · Persefone.jl</title><meta name="title" content="Species · Persefone.jl"/><meta property="og:title" content="Species · Persefone.jl"/><meta property="twitter:title" content="Species · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li><a class="tocitem" href="using.html">The Persefone.jl Package</a></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li class="is-active"><a class="tocitem" href="species.html">Species</a><ul class="internal"><li><a class="tocitem" href="#Skylark"><span>Skylark</span></a></li></ul></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">Nature</a></li><li class="is-active"><a href="species.html">Species</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="species.html">Species</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/species.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="Species"><a class="docs-heading-anchor" href="#Species">Species</a><a id="Species-1"></a><a class="docs-heading-anchor-permalink" href="#Species" title="Permalink"></a></h1><p>The ecological submodel in Persefone simulates a range of species in agricultural landscapes.</p><h2 id="Skylark"><a class="docs-heading-anchor" href="#Skylark">Skylark</a><a id="Skylark-1"></a><a class="docs-heading-anchor-permalink" href="#Skylark" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.Skylark" href="#Persefone.Skylark"><code>Persefone.Skylark</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia hljs">Skylark</code></pre><p><em>Alauda arvensis</em> is a common and charismatic species of agricultural landscapes. At the moment, this implementation is still in development.</p><p><strong>Sources:</strong> - Bauer, H.-G., Bezzel, E., & Fiedler, W. (Eds.). (2012). Das Kompendium der Vögel Mitteleuropas: Ein umfassendes Handbuch zu Biologie, Gefährdung und Schutz (Einbändige Sonderausg. der 2., vollständig überarb. und erw. Aufl. 2005). AULA-Verlag - Glutz von Blotzheim, Urs N. (Ed.). (1985). Handbuch der Vögel Mitteleuropas. Bd. 10. Passeriformes (Teil 1) 1. Alaudidae - Hirundidae. AULA-Verlag, Wiesbaden. ISBN 3-89104-019-9</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L15-L31">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.breeding-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.breeding-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.breeding</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Do lots of foraging (not yet implemented).</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L196-L198">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.create!-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.create!-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.create!</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Initialise a skylark individual. Selects migration dates and checks if the bird should currently be on migration. Also sets other individual-specific variables.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L233-L236">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.egg-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.egg-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.egg</code></a> — <span class="docstring-category">Method</span></header><section><div><p>As an egg, simply check for mortality and hatching.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L65-L67">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.fledgling-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.fledgling-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.fledgling</code></a> — <span class="docstring-category">Method</span></header><section><div><p>As a fledgling, move around a little, but mainly wait for maturity and check mortality.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L89-L92">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.mating-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.mating-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.mating</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Move around until a mate is found.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L126-L128">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.migrationdates-Tuple{Animal, SimulationModel}" href="#Persefone.migrationdates-Tuple{Animal, SimulationModel}"><code>Persefone.migrationdates</code></a> — <span class="docstring-category">Method</span></header><section><div><pre><code class="language-julia hljs">migrationdates(skylark, model)</code></pre><p>Select the dates on which this skylark will leave for / return from its migration, based on observed migration patterns.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L216-L221">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nestbuilding-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.nestbuilding-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.nestbuilding</code></a> — <span class="docstring-category">Method</span></header><section><div><p>Females select a location and build a nest. Males do nothing. (Sound familiar?)</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L155-L157">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nestling-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.nestling-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.nestling</code></a> — <span class="docstring-category">Method</span></header><section><div><p>As a nestling, simply check for mortality and fledging.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L77-L79">source</a></section></article><article class="docstring"><header><a class="docstring-article-toggle-button fa-solid fa-chevron-down" href="javascript:;" title="Collapse docstring"></a><a class="docstring-binding" id="Persefone.nonbreeding-Tuple{Persefone.Skylark, SimulationModel}" href="#Persefone.nonbreeding-Tuple{Persefone.Skylark, SimulationModel}"><code>Persefone.nonbreeding</code></a> — <span class="docstring-category">Method</span></header><section><div><p>As a non-breeding adult, move around with other individuals and check for migration.</p></div><a class="docs-sourcelink" target="_blank" href="https://git.idiv.de/persefone/persefone-model/-/tree/2341a34a58bcc94ec225660138a44bd4d67eb9b9/src/nature/species/skylark.jl#L103-L105">source</a></section></article></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="energy.html">« Dynamic Energy Budgets</a><a class="docs-footer-nextpage" href="crops.html">Crop submodel »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/build/using.html b/docs/build/using.html index edbe31bf2dac35fb6f256c77f3b1b1eeadaaa326..02cb569ce5df11adf9739725fd72e9a44e372578 100644 --- a/docs/build/using.html +++ b/docs/build/using.html @@ -1,5 +1,5 @@ <!DOCTYPE html> -<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>The Persefone.jl Package · Persefone</title><meta name="title" content="The Persefone.jl Package · Persefone"/><meta property="og:title" content="The Persefone.jl Package · Persefone"/><meta property="twitter:title" content="The Persefone.jl Package · Persefone"/><meta name="description" content="Documentation for Persefone."/><meta property="og:description" content="Documentation for Persefone."/><meta property="twitter:description" content="Documentation for Persefone."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li class="is-active"><a class="tocitem" href="using.html">The Persefone.jl Package</a><ul class="internal"><li><a class="tocitem" href="#Installation"><span>Installation</span></a></li><li><a class="tocitem" href="#Running-from-the-command-line"><span>Running from the command line</span></a></li><li><a class="tocitem" href="#Running-from-within-Julia"><span>Running from within Julia</span></a></li></ul></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="using.html">The Persefone.jl Package</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="using.html">The Persefone.jl Package</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/using.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="The-Persefone.jl-Package"><a class="docs-heading-anchor" href="#The-Persefone.jl-Package">The Persefone.jl Package</a><a id="The-Persefone.jl-Package-1"></a><a class="docs-heading-anchor-permalink" href="#The-Persefone.jl-Package" title="Permalink"></a></h1><p><em>This page describes how to run Persefone.jl as a command line application or Julia package, which is the default mode. To use the model with a graphical user interface, see <a href="gui.html">here</a>.</em></p><h2 id="Installation"><a class="docs-heading-anchor" href="#Installation">Installation</a><a id="Installation-1"></a><a class="docs-heading-anchor-permalink" href="#Installation" title="Permalink"></a></h2><p><em>For more detailed installation instructions, see <a href="developing.html">here</a>.</em></p><p>Install the latest version of the <a href="https://julialang.org/downloads/">Julia</a> programming language (1.9+). The recommended editors are <a href="https://www.julia-vscode.org/">VSCode</a> or <a href="https://www.emacswiki.org/emacs/JuliaProgrammingLanguage">Emacs</a>. To install the package dependencies, open a Julia REPL in this folder and run:</p><pre><code class="language-julia hljs">using Pkg +<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>The Persefone.jl Package · Persefone.jl</title><meta name="title" content="The Persefone.jl Package · Persefone.jl"/><meta property="og:title" content="The Persefone.jl Package · Persefone.jl"/><meta property="twitter:title" content="The Persefone.jl Package · Persefone.jl"/><meta name="description" content="Documentation for Persefone.jl."/><meta property="og:description" content="Documentation for Persefone.jl."/><meta property="twitter:description" content="Documentation for Persefone.jl."/><script data-outdated-warner src="assets/warner.js"></script><link href="https://cdnjs.cloudflare.com/ajax/libs/lato-font/3.0.0/css/lato-font.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/juliamono/0.050/juliamono.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.16.8/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL="."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="assets/documenter.js"></script><script src="search_index.js"></script><script src="siteinfo.js"></script><script src="../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-dark.css" data-theme-name="documenter-dark" data-theme-primary-dark/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><a class="docs-logo" href="index.html"><img src="assets/logo.png" alt="Persefone.jl logo"/></a><div class="docs-package-name"><span class="docs-autofit"><a href="index.html">Persefone.jl</a></span></div><button class="docs-search-query input is-rounded is-small is-clickable my-2 mx-auto py-1 px-2" id="documenter-search-query">Search docs (Ctrl + /)</button><ul class="docs-menu"><li><a class="tocitem" href="index.html">Introduction</a></li><li><span class="tocitem">User guide</span><ul><li class="is-active"><a class="tocitem" href="using.html">The Persefone.jl Package</a><ul class="internal"><li><a class="tocitem" href="#Installation"><span>Installation</span></a></li><li><a class="tocitem" href="#Running-from-the-command-line"><span>Running from the command line</span></a></li><li><a class="tocitem" href="#Running-from-within-Julia"><span>Running from within Julia</span></a></li></ul></li><li><a class="tocitem" href="gui.html">Graphical User Interface</a></li><li><a class="tocitem" href="config.html">Configuration</a></li></ul></li><li><span class="tocitem">Developer guide</span><ul><li><a class="tocitem" href="developing.html">Developing Persefone</a></li><li><a class="tocitem" href="adapting.html">Adapting Persefone</a></li><li><a class="tocitem" href="architecture.html">Source code architecture</a></li><li><a class="tocitem" href="gis.html">Maps and weather data</a></li><li><a class="tocitem" href="species-dsl.html">Defining new species</a></li></ul></li><li><span class="tocitem">Core</span><ul><li><a class="tocitem" href="simulation.html">Simulation</a></li><li><a class="tocitem" href="io.html">Input and Output</a></li></ul></li><li><span class="tocitem">Nature</span><ul><li><a class="tocitem" href="nature.html">Nature</a></li><li><a class="tocitem" href="energy.html">Dynamic Energy Budgets</a></li><li><a class="tocitem" href="species.html">Species</a></li></ul></li><li><a class="tocitem" href="crops.html">Crop submodel</a></li><li><a class="tocitem" href="farm.html">Farm submodel</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><a class="docs-sidebar-button docs-navbar-link fa-solid fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a><nav class="breadcrumb"><ul class="is-hidden-mobile"><li><a class="is-disabled">User guide</a></li><li class="is-active"><a href="using.html">The Persefone.jl Package</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href="using.html">The Persefone.jl Package</a></li></ul></nav><div class="docs-right"><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model" title="View the repository"><span class="docs-icon fa-brands"></span><span class="docs-label is-hidden-touch">Repository</span></a><a class="docs-navbar-link" href="https://git.idiv.de/persefone/persefone-model/-/tree/master/docs/src/using.md" title="Edit source"><span class="docs-icon fa-solid"></span></a><a class="docs-settings-button docs-navbar-link fa-solid fa-gear" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-article-toggle-button fa-solid fa-chevron-up" id="documenter-article-toggle-button" href="javascript:;" title="Collapse all docstrings"></a></div></header><article class="content" id="documenter-page"><h1 id="The-Persefone.jl-Package"><a class="docs-heading-anchor" href="#The-Persefone.jl-Package">The Persefone.jl Package</a><a id="The-Persefone.jl-Package-1"></a><a class="docs-heading-anchor-permalink" href="#The-Persefone.jl-Package" title="Permalink"></a></h1><p><em>This page describes how to run Persefone.jl as a command line application or Julia package, which is the default mode. To use the model with a graphical user interface, see <a href="gui.html">here</a>.</em></p><h2 id="Installation"><a class="docs-heading-anchor" href="#Installation">Installation</a><a id="Installation-1"></a><a class="docs-heading-anchor-permalink" href="#Installation" title="Permalink"></a></h2><p><em>For more detailed installation instructions, see <a href="developing.html">here</a>.</em></p><p>Install the latest version of the <a href="https://julialang.org/downloads/">Julia</a> programming language (1.10+). The recommended editors are <a href="https://www.julia-vscode.org/">VSCode</a> or <a href="https://www.emacswiki.org/emacs/JuliaProgrammingLanguage">Emacs</a>. To install the package dependencies, open a Julia REPL in this folder and run:</p><pre><code class="language-julia hljs">using Pkg Pkg.activate(".") Pkg.instantiate()</code></pre><h2 id="Running-from-the-command-line"><a class="docs-heading-anchor" href="#Running-from-the-command-line">Running from the command line</a><a id="Running-from-the-command-line-1"></a><a class="docs-heading-anchor-permalink" href="#Running-from-the-command-line" title="Permalink"></a></h2><p>This is the normal mode of operation. Simply execute <code>run.jl</code> in a terminal, typically like so (in Linux):</p><pre><code class="nohighlight hljs">> julia run.jl -c <config></code></pre><p>where <code><config></code> specifies the configuration file to use. The recommended workflow is to copy <code>scr/parameters.toml</code> to a location of your choice and edit the copy to suit your requirements. The adapted config file can then be passed to <code>run.jl</code>. (If no configuration file is specified, Persefone will run with its default settings.)</p><p>The full list of commandline arguments is:</p><pre><code class="nohighlight hljs">usage: run.jl [-c CONFIGFILE] [-s SEED] [-o OUTDIR] [-l LOGLEVEL] [--version] [-h] @@ -18,4 +18,4 @@ optional arguments: > make docs # build the documentation > make release # create a release</code></pre><h2 id="Running-from-within-Julia"><a class="docs-heading-anchor" href="#Running-from-within-Julia">Running from within Julia</a><a id="Running-from-within-Julia-1"></a><a class="docs-heading-anchor-permalink" href="#Running-from-within-Julia" title="Permalink"></a></h2><p>To use the model from within Julia (either inside an interactive REPL or if you want to import it from your own software), do the following:</p><pre><code class="language-julia hljs">using Pkg Pkg.activate(".") # assuming you're in the Persefone root folder -using Persefone</code></pre><p>You can then access all Persefone functions, such as <a href="simulation.html#Persefone.simulate"><code>simulate</code></a>, <a href="simulation.html#Persefone.initialise"><code>initialise</code></a>, <a href="simulation.html#Persefone.stepsimulation!-Tuple{Agents.AgentBasedModel}"><code>stepsimulation!</code></a>, <a href="simulation.html#Persefone.simulate!-Tuple{Agents.AgentBasedModel}"><code>simulate!</code></a>, or <a href="io.html#Persefone.visualiseoutput"><code>visualiseoutput</code></a>. (See <code>src/Persefone.jl</code> for a list of exported functions.)</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="index.html">« Introduction</a><a class="docs-footer-nextpage" href="gui.html">Graphical User Interface »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Tuesday 31 October 2023 18:07">Tuesday 31 October 2023</span>. Using Julia version 1.9.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> +using Persefone</code></pre><p>You can then access all Persefone functions, such as <a href="simulation.html#Persefone.simulate"><code>simulate</code></a>, <a href="simulation.html#Persefone.initialise"><code>initialise</code></a>, <a href="simulation.html#Persefone.stepsimulation!-Tuple{SimulationModel}"><code>stepsimulation!</code></a>, <a href="simulation.html#Persefone.simulate!-Tuple{SimulationModel}"><code>simulate!</code></a>, or <a href="io.html#Persefone.visualiseoutput-Tuple{SimulationModel}"><code>visualiseoutput</code></a>. (See <code>src/Persefone.jl</code> for a list of exported functions.)</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="index.html">« Introduction</a><a class="docs-footer-nextpage" href="gui.html">Graphical User Interface »</a><div class="flexbox-break"></div><p class="footer-message">Powered by <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> and the <a href="https://julialang.org/">Julia Programming Language</a>.</p></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option><option value="auto">Automatic (OS)</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> version 1.1.2 on <span class="colophon-date" title="Friday 7 June 2024 12:55">Friday 7 June 2024</span>. Using Julia version 1.10.3.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html> diff --git a/docs/src/index.md b/docs/src/index.md index b148767c11533f509f3bfa3f81867213a010f143..45b2e9fb8eca13ab389613156afa9a0a4c480c6c 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -14,4 +14,4 @@ changes in farm operations (e.g. through policy changes in the CAP) influence bi The model is open-source software available on [Gitlab](https://git.idiv.de/persefone/persefone-model). -*This documentation was last updated on 2024-06-07 for **Persefone.jl v0.4.1** (commit [4f3d4f4](https://git.idiv.de/persefone/persefone-model/-/commit/4f3d4f4)).* +*This documentation was last updated on 2024-06-07 for **Persefone.jl v0.5.0** (commit [2341a34](https://git.idiv.de/persefone/persefone-model/-/commit/2341a34)).*