Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • usadellab/cplantbox_simulations
  • ceplas/cplantbox_simulations
2 results
Show changes
Showing
with 4794 additions and 0 deletions
upperDepth, lowerDepth, Campbell_he, Campbell_b, VG_he, VG_alpha, VG_n, VG_alpha_mod, VG_n_mod, thetaR, thetaS, Ksat
0.0, 1.0, -4.2, 3.58, -3.8, 0.15, 1.35, 0.3, 1.33, 0.01, 0.46, 0.001
<?xml version="1.0"?><VTKFile type="PolyData" version="0.1" byte_order="LittleEndian">
<PolyData>
<Piece NumberOfLines="35" NumberOfPoints="37">
<CellData Scalars=" CellData">
</CellData>
<Points>
<DataArray type="Float32" Name="Coordinates" NumberOfComponents="3" format="ascii" >
0 0 -3 -0.0268869 -0.0553848 -3.2423 -0.0577364 -0.0669445 -3.49012 -0.0882992 -0.0784067 -3.73798 -0.141769 -0.0767975 -3.98219 -0.191622 -0.0676985 -4.227 -0.253286 -0.0901169 -4.46824 -0.266554 -0.0762119 -4.7175 -0.264042 -0.0542005 -4.96651 -0.223172 -0.027088 -5.21166 -0.191931 -0.00915339 -5.45905 -0.165665 0.0143691 -5.70655 -0.150774 0.0191217 -5.90334 0 0 -3 0 0 -2.75 0 0 -2.5 0 0 -2.3 0 0 -2.05 0 0 -1.8 0 0 -1.6 0 0 -1.35 0 0 -1.1 0 0 -0.900001 7.33909e-18 -0.119856 -2.0806 1.46782e-17 -0.239713 -1.86121 2.20173e-17 -0.359569 -1.64181 2.4618e-17 -0.402043 -1.56407 -2.20173e-17 0.119856 -1.3806 -4.40345e-17 0.239713 -1.16121 -6.60518e-17 0.359569 -0.941813 -7.27758e-17 0.396173 -0.87481 3.66954e-17 -0.119856 -0.680758 7.31667e-17 -0.238981 -0.462702 1.07728e-16 -0.351867 -0.256065 -5.13736e-17 0.119856 -0.680606 -1.02747e-16 0.239713 -0.46121 -1.33401e-16 0.31123 -0.330299
</DataArray>
</Points>
<Lines>
<DataArray type="Int32" Name="connectivity" NumberOfComponents="1" format="ascii" >
0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 16 23 23 24 24 25 25 26 19 27 27 28 28 29 29 30 22 31 31 32 32 33 22 34 34 35 35 36
</DataArray>
<DataArray type="Int32" Name="offsets" NumberOfComponents="1" format="ascii" >
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 50 52 54 56 58 60 62 64 66 68 70
</DataArray>
</Lines>
</Piece>
</PolyData>
</VTKFile>
/**
namespace CPlantBox {
* Benchmarks
namespace CPlantBox {
*
namespace CPlantBox {
* Compare root system lengths with the exact solution (see also the Python script singleroot.py)
namespace CPlantBox {
*
namespace CPlantBox {
* Benchmark 1a
namespace CPlantBox {
* Single root, no laterals: defined as apical zone
namespace CPlantBox {
*
namespace CPlantBox {
* Benchmark 1a
namespace CPlantBox {
* Single root, no laterals: defined as root with laterals (lb, ln, la, nob), but laterals have 0 length
namespace CPlantBox {
*
namespace CPlantBox {
* Benchmark 2
namespace CPlantBox {
* Single root, with laterals
namespace CPlantBox {
*
namespace CPlantBox {
*/
namespace CPlantBox {
using namespace std;
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
void benchmark(string name, vector<double> times, vector<double> dt_, double dx,
namespace CPlantBox {
vector<double>& l0, vector<double>& l1, vector<double>& lt,
namespace CPlantBox {
string bm_name)
namespace CPlantBox {
{
namespace CPlantBox {
RootSystem rs1;
namespace CPlantBox {
rs1.openFile(name,"modelparameter_bu/");
namespace CPlantBox {
rs1.getRootTypeParameter(1)->dx=dx; // apply axial resolution
namespace CPlantBox {
rs1.getRootTypeParameter(2)->dx=dx; // apply axial resolution
namespace CPlantBox {
rs1.initialize();
namespace CPlantBox {
int i =0;
namespace CPlantBox {
for (auto dt : dt_) {
namespace CPlantBox {
rs1.simulate(dt);
namespace CPlantBox {
SegmentAnalyser analysis0(rs1);
namespace CPlantBox {
lt[i] = analysis0.getSummed(RootSystem::st_length);
namespace CPlantBox {
analysis0.filter(RootSystem::st_type,1);
namespace CPlantBox {
l0[i] = analysis0.getSummed(RootSystem::st_length);
namespace CPlantBox {
SegmentAnalyser analysis1(rs1);
namespace CPlantBox {
analysis1.filter(RootSystem::st_type,2);
namespace CPlantBox {
l1[i] = analysis1.getSummed(RootSystem::st_length);
namespace CPlantBox {
i++;
namespace CPlantBox {
}
namespace CPlantBox {
cout << bm_name <<"\ntimes [\t";
namespace CPlantBox {
for (auto t : times) { cout << t << "\t"; }
namespace CPlantBox {
cout << "]\nzero order length [\t";
namespace CPlantBox {
for (auto l : l0) { cout << l << "\t"; }
namespace CPlantBox {
cout << "]\nfirst order length [\t";
namespace CPlantBox {
for (auto l : l1) { cout << l << "\t"; }
namespace CPlantBox {
cout << "]\ntotal length [\t";
namespace CPlantBox {
for (auto l : lt) { cout << l << "\t"; }
namespace CPlantBox {
cout << "]\n\n";
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
void benchmarks()
namespace CPlantBox {
{
namespace CPlantBox {
vector<double> times = { 7 ,15, 30, 60 };
namespace CPlantBox {
namespace CPlantBox {
vector<double> dt_(times.size());
namespace CPlantBox {
dt_[0] = times[0];
namespace CPlantBox {
for (size_t i=1; i<times.size(); i++) {
namespace CPlantBox {
dt_[i] = times.at(i)-times.at(i-1);
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
vector<double> l0(times.size()); // zero order lengths
namespace CPlantBox {
vector<double> l1(times.size()); // first order lengths
namespace CPlantBox {
vector<double> lt(times.size()); // total lengths
namespace CPlantBox {
namespace CPlantBox {
double dx = 0.1;
namespace CPlantBox {
namespace CPlantBox {
benchmark("bm_singleroot_nl",times,dt_,dx,l0,l1,lt,"Benchmark 1a"); // single root, no laterals, default tap root system
namespace CPlantBox {
benchmark("bm_singleroot_nl2",times,dt_,dx,l0,l1,lt,"Benchmark 1b"); // single root, 0-lenght laterals, pparam file
namespace CPlantBox {
benchmark("bm_singleroot",times,dt_,dx,l0,l1,lt,"Benchmark 2"); // single root, laterals
namespace CPlantBox {
benchmark("bm_monocot_nl",times,dt_,dx,l0,l1,lt,"Benchmark 3a"); // multiple roots of type benchmark 1a
namespace CPlantBox {
benchmark("bm_monocot_nl2",times,dt_,dx,l0,l1,lt,"Benchmark 3b"); // multiple roots of type benchmark 1b
namespace CPlantBox {
benchmark("bm_monocot",times,dt_,dx,l0,l1,lt,"Benchmark 4"); // multiple roots of type benchmark 2
namespace CPlantBox {
namespace CPlantBox {
}
namespace CPlantBox {
/**
* Example 1
*
* 1) Opens plant and root parameters from a file
* 2) Simulates root growth
* 3) Outputs a VTP (for vizualisation in ParaView)
* In Paraview: use tubePLot.py script for fancy visualisation (Macro/Add new macro...), apply after opening file
*
* Additionally, exports the line segments as .txt file to import into Matlab for postprocessing
*/
using namespace std;
namespace CPlantBox {
void example1()
{
Plant plant;
string name = "PMA2018";
/*
* Open plant and root parameter from a file
*/
plant.openXML(name);
//plant.openFile(name);
// plant.writeAlltoXML(name);
// plant.writeParameters(std::cout);
/*
* Initialize
*/
plant.initialize();
std::cout << "finished initialize\n";
/*
* Simulate
*/
double simtime =3; // 60; // 20, 40, 60 days
double dt = 1; // try other values here
int N = round(simtime/dt);
for (int i=0; i<N; i++) {
plant.simulate(dt);
}
cout << "fin (with " << plant.getNumberOfNodes() << " nodes) \n";
auto o_ = plant.getOrgans(Organ::ot_organ);
cout << o_.size() << " organs \n";
/*
* Export final result (as vtp)
*/
// auto t1 = std::chrono::high_resolution_clock::now();
// plant.write("plant_write_rootsystem.vtp");
// auto t2 = std::chrono::high_resolution_clock::now();
// std::cout << "test function took "
// << std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count()
// << " milliseconds\n";
/*
* Export segments for Matlab analysis
*/
SegmentAnalyser analysis(plant);
// analysis.write("rootsystem.txt");
analysis.write("analysis_write_rootsystem.vtp");
/*
* Export dgf file
*/
// analysis.write("rootsystem.dgf");
/*
Total length and surface
*/
// double l = analysis.getSummed(Plant::st_length);
// std::cout << "Root system length " << l << " cm \n";
cout << "Finished with a total of " << plant.getNumberOfNodes()<< " nodes\n";
}
}
/**
* Example 2
*
* Same as Example 1, but with a plant container confining root growth
*
* Example container are:
* 1. Cylindrical soil core,
* 2. Flat square rhizotron,
* 3. Rotated square rhizotron
*
* Additionally, exports the confining geometry as paraview pyhton script
* (run file in Paraview by Tools->Python Shell, Run Script)
*/
namespace CPlantBox {
using namespace std;
void example2()
{
Plant rootsystem;
string name = "Zea_mays_5_Leitner_2014";
/*
* Plant and root parameter from a file
*/
rootsystem.openFile(name);
/*
* Set geometry
*/
// 1.creates a cylindrical soil core with top radius 5 cm, bot radius 5 cm, height 50cm, not square but circular
SDF_PlantContainer soilcore(5,5,40,false);
//2. creates a square 27*27 cm containter with height 1.5 cm (used in parametrisation experiment)
SDF_PlantBox rhizotron(1.4,27,27);
//3. creates a square rhizotron r*r, with height h, rotated around the x-axis for angle alpha
double r = 20;
double h = 4;
double alpha = 45.;
SDF_PlantContainer rhizotron2(r,r,h,true);
Vector3d posA = Vector3d(0,r,-h/2); // origin before rotation
Matrix3d A = Matrix3d::rotX(alpha/180.*3.14);
posA = A.times(posA); // origin after rotation
SDF_RotateTranslate rotatedRhizotron(&rhizotron2,alpha,0,posA.times(-1));
//rootsystem.setGeometry(&soilcore); // pick one of the geometries
rootsystem.setGeometry(&rhizotron); // pick one of the geometries
//rootsystem.setGeometry(&rotatedRhizotron); // pick one of the geometries
/*
* Initialize
*/
rootsystem.initialize(); //it is important to call initialize() after setGeometry()
/*
* Simulate
*/
double simtime = 60;
double dt = 1;
int N = round(simtime/dt);
for (int i=0; i<N; i++) {
rootsystem.simulate(dt);
}
/*
* Export results (as vtp)
*/
rootsystem.write(name+std::string(".vtp"));
/*
* Export container geometry as Paraview Python script (run file in Paraview by Tools->Python Shell, Run Script)
*/
rootsystem.write(name+ std::string(".py"));
cout << "Finished with a total of " << rootsystem.getNumberOfNodes()<< " nodes\n";
}
}
///**
// * Example 3
// *
// * Creates N*N root systems at different locations, no confining geometry
// *
// */
//using namespace std;
//
//void example3()
//{
// auto gen = default_random_engine(chrono::system_clock::now().time_since_epoch().count());
// auto UD = uniform_real_distribution<double>(0,1); // random stuff
//
// char * name = "Zea_mays_5_Leitner_2014";
//
// /*
// * Creates N*N root systems
// */
// int N=3;
// double dist = 40; // [cm]
// vector<Plant*> allRS;
// for (int i=0; i<N; i++) {
// for (int j=0;j<N; j++) {
// Plant* rs = new Plant();
// allRS.push_back(rs);
// rs->openFile(name);
// // rs->getRootSystemParameter()->seedPos = Vector3d(dist*i,dist*j,-3); // set position of seed [cm] TODO
// }
// }
//
// /*
// * Simulate
// */
// double simtime = 120; // days
// for (auto rs : allRS) { // simulate all
// double s = UD(gen);
// rs->setSeed(s); // randomly select a seed
// rs->initialize();
// rs->simulate(simtime);
// cout << "Finished with a total of " << rs->getNumberOfNodes()<< " nodes\n";
//// }
//
// /*
// * Export results as single vtp files
// */
// int c=0;
// for (auto rs : allRS) {
// c++; // root system number
// string vtpname = "results/"+name+std::to_string(c)+".vtp";
// rs->write(vtpname);
// }
//
//}
/**
* Example 4
*
* More complex geometries
*
* 1. a split pot experiment
* 2. rhizotubes as obstacles (from Example_Rhizotubes.m)
*
* Additionally, exports the confining geometry as paraview pyhton script
* (run file in Paraview by Tools->Python Shell, Run Script)
*/
namespace CPlantBox {
using namespace std;
void example4()
{
RootSystem rootsystem;
string name = "Zea_mays_5_Leitner_2014";
/*
* Plant and root parameter from a file
*/
rootsystem.openFile(name);
/*
* 1. A split pot experiment
*/
SDF_PlantBox topBox(22,20,5);
SDF_PlantBox sideBox(10,20,35);
SDF_RotateTranslate left(&sideBox, Vector3d(-6,0,-5));
SDF_RotateTranslate right(&sideBox, Vector3d(6,0,-5));
vector<SignedDistanceFunction*> box_;
box_.push_back(&topBox);
box_.push_back(&left);
box_.push_back(&right);
SDF_Union splitBox(box_);
/*
* 2. Rhizotubes as obstacles
*/
// Box
double boxX = 96.;
double boxY = 126.;
double boxZ = 130.;
SDF_PlantBox box(boxX,boxY,boxZ);
// A single Rhizotube
double r = 2.*3.2; // cm
SDF_PlantContainer rhizotube(r,r,96.,false);
SDF_RotateTranslate rhizoX(&rhizotube, 90., SDF_RotateTranslate::yaxis, Vector3d(boxX/2.,0.,0));
// The experimental setting
vector<SignedDistanceFunction*> rhizotubes_;
const int tubeN=6;
double y_[tubeN] = { -30, -18, -6, 6, 18, 30 };
double z_[tubeN]= { -10, -20, -40, -60, -80, -120 };
for (int i=0; i<tubeN; i++) {
rhizotubes_.push_back(new SDF_RotateTranslate(&rhizoX, 0, SDF_RotateTranslate::xaxis, Vector3d(0,y_[i],z_[i])));
}
// Final geometry
SDF_Union rhizotubes(rhizotubes_);
SDF_Difference rhizoTubes(&box, &rhizotubes);
rootsystem.setGeometry(&rhizoTubes); // &splitBox, or &rhizoTubes
/**
* Initialize
*/
rootsystem.initialize(); //it is important to call initialize() after setGeometry()
/*
* Simulate
*/
double simtime = 100; // e.g. 30 or 60 days
double dt = 1;
int N = round(simtime/dt);
for (int i=0; i<N; i++) {
rootsystem.simulate(dt);
}
/**
* Export results (as vtp)
*/
rootsystem.write(name+".vtp");
/**
* Export container geometry as Paraview Python script (run file in Paraview by Tools->Python Shell, Run Script)
*/
rootsystem.write(name+".py");
cout << "Finished with a total of " << rootsystem.getNumberOfNodes()<< " nodes\n";
}
}
/**
* Example 5
*
* Hydrotropism ,
* proof of concept, with a static soil water content
*
*/
namespace CPlantBox {
using namespace std;
void example5()
{
RootSystem rootsystem;
string name = "Zea_mays_5_Leitner_2014";
/*
* Plant and root parameter from a file
*/
rootsystem.openFile(name);
// "manually" set tropism to hydrotropism
for (int i=1; i<7; i++) {
rootsystem.getRootTypeParameter(i)->tropismT = RootSystem::tt_hydro;
rootsystem.getRootTypeParameter(i)->tropismN = 1; //N
rootsystem.getRootTypeParameter(i)->tropismS = 0.4; //sigma
}
/**
* Static soil property
*/
SDF_PlantBox sideBox(10,20,50);
SDF_RotateTranslate left(&sideBox, Vector3d(-4.99,0,0));
SDF_RotateTranslate right(&sideBox, Vector3d(4.99,0,0));
SDF_Union leftright(&left,&right);
rootsystem.setGeometry(&leftright); //for vizualisation
double maxS = 0.7; // maximal saturation
double minS = 0.1; // minimal saturation
double slope = 20; // [cm] linear gradient between min and max
SoilLookUpSDF soilprop(&left, maxS, minS, slope);
// set the soil properties before calling initialize
rootsystem.setSoil(&soilprop);
/**
* Initialize
*/
rootsystem.initialize(); //it is important to call initialize() after setGeometry()
/*
* Simulate
*/
double simtime = 30; // e.g. 30 or 60 days
double dt = 1;
int N = round(simtime/dt);
for (int i=0; i<N; i++) {
rootsystem.simulate(dt);
}
/**
* Export results (as vtp)
*/
rootsystem.write(name+".vtp");
/**
* Export container geometry as Paraview Python script (run file in Paraview by Tools->Python Shell, Run Script)
*/
rootsystem.write(name+".py");
cout << "Finished with a total of " << rootsystem.getNumberOfNodes()<< " nodes\n";
}
}
///**
namespace CPlantBox {
// * Example
namespace CPlantBox {
// *
namespace CPlantBox {
// * defines a minimal organ from the base organ class
namespace CPlantBox {
// *
namespace CPlantBox {
// */
namespace CPlantBox {
//
namespace CPlantBox {
//
namespace CPlantBox {
///**
namespace CPlantBox {
// * example organ, having two nodes, from (0,0,0) and (0,0,1)
namespace CPlantBox {
// */
namespace CPlantBox {
//class MyOrgan : public Organ {
namespace CPlantBox {
//
namespace CPlantBox {
//public:
namespace CPlantBox {
//
namespace CPlantBox {
// MyOrgan(Plant* plant, Organ* parent, int subtype, double delay): Organ(plant, parent, subtype, delay) {
namespace CPlantBox {
// r_nodes.push_back(Vector3d(0,0,0));
namespace CPlantBox {
// nodeIDs.push_back(0);
namespace CPlantBox {
// nctimes.push_back(0.);
namespace CPlantBox {
// r_nodes.push_back(Vector3d(0,0,1));
namespace CPlantBox {
// nodeIDs.push_back(0);
namespace CPlantBox {
// nctimes.push_back(0.);
namespace CPlantBox {
// }
namespace CPlantBox {
//
namespace CPlantBox {
// virtual void setRelativeOrigin(const Vector3d& o) override { this->o = o; }
namespace CPlantBox {
// virtual Vector3d getRelativeOrigin() const override { return o; }
namespace CPlantBox {
// virtual void setRelativeHeading(const Matrix3d& m) override { this->A = m; }
namespace CPlantBox {
// virtual Matrix3d getRelativeHeading() const override { return A; }
namespace CPlantBox {
//
namespace CPlantBox {
// Vector3d o;
namespace CPlantBox {
// Matrix3d A;
namespace CPlantBox {
//
namespace CPlantBox {
//};
namespace CPlantBox {
//
namespace CPlantBox {
//
namespace CPlantBox {
//
namespace CPlantBox {
//
namespace CPlantBox {
//void example_scenegraph()
namespace CPlantBox {
//{
namespace CPlantBox {
// Plant* plant = new Plant(); // we use the plant only for the vtp export
namespace CPlantBox {
//
namespace CPlantBox {
// Seed* seed = new Seed(plant);
namespace CPlantBox {
// MyOrgan* base = new MyOrgan(plant, nullptr, 0, 0);
namespace CPlantBox {
// MyOrgan* branch1 = new MyOrgan(plant, nullptr, 0, 0); // at top of base
namespace CPlantBox {
// MyOrgan* branch2 = new MyOrgan(plant, nullptr, 0, 0); // half way base
namespace CPlantBox {
// MyOrgan* branch3 = new MyOrgan(plant, nullptr, 0, 0); // at top of branch 1
namespace CPlantBox {
//
namespace CPlantBox {
// seed->setRelativeOrigin(Vector3d(0.,0.,2));
namespace CPlantBox {
//
namespace CPlantBox {
// base->setRelativeOrigin(Vector3d(0.,0.,0.));
namespace CPlantBox {
// base->setRelativeHeading(Matrix3d::rotX(30./180.*3.1415)); // rotated 30 degrees
namespace CPlantBox {
//
namespace CPlantBox {
// branch1->setRelativeOrigin(Vector3d(0.,0.,1.)); // at top
namespace CPlantBox {
// branch1->setRelativeHeading(Matrix3d::rotX(30./180.*3.1415)); // rotated 30 degrees
namespace CPlantBox {
//
namespace CPlantBox {
// branch2->setRelativeOrigin(Vector3d(0.,0.,0.5)); // half way
namespace CPlantBox {
// branch2->setRelativeHeading(Matrix3d::rotX(30./180.*3.1415)); // X rotated 30 degrees
namespace CPlantBox {
//
namespace CPlantBox {
// branch3->setRelativeOrigin(Vector3d(0.,0.,1.)); // at top
namespace CPlantBox {
// branch3->setRelativeHeading(Matrix3d::rotY(30./180.*3.1415)); // Y rotated 30 degrees
namespace CPlantBox {
//
namespace CPlantBox {
// // make tree by hand
namespace CPlantBox {
// seed->children.push_back(base);
namespace CPlantBox {
// base->children.push_back(branch1);
namespace CPlantBox {
// base->children.push_back(branch2);
namespace CPlantBox {
// branch1->children.push_back(branch3);
namespace CPlantBox {
// base->parent = seed;
namespace CPlantBox {
// branch1->parent = base;
namespace CPlantBox {
// branch2->parent = base;
namespace CPlantBox {
// branch3->parent = branch1;
namespace CPlantBox {
//
namespace CPlantBox {
// plant->seed = seed;
namespace CPlantBox {
// plant->write("example_scenegraph.vtp", Organ::ot_organ);
namespace CPlantBox {
//
namespace CPlantBox {
//}
namespace CPlantBox {
// Copyright (C) 2016 Daniel Leitner and Andrea Schnepf. See //license.txt for details.
///This is an under developed version with a simple stem growth.
#include <istream>
#include "Plant.h"
#include "Organ.h"
#include "analysis.h"
#include <iostream>
#include <fstream>
//#include <unistd.h>
#include "tinyxml2.h"
#include "example1.h"
#include "example2.h"
//#include "example3.h"
//#include "example_scenegraph.h"
/**
* Starts an examples (from the examples folder)
*/
int main(int argc, char* argv[])
{
string name = "PMA2018";
if (argc>1) {
name= argv[1];
}
CPlantBox::example1(); // open parameter file, and output VTP
// example2(); // like example 1, but with put geometry
// example3(); // more than 1 plant
// example_scenegraph();
return(0);
}
/mnt/c/cpb1/modelparameter
\ No newline at end of file
/**
namespace CPlantBox {
* Shehans experimental set-up
namespace CPlantBox {
*
namespace CPlantBox {
* (B) Virtual analysis using rhizo tubes
namespace CPlantBox {
*
namespace CPlantBox {
* simulates the growing root systems (6*37) in the field
namespace CPlantBox {
* uses trenches to analyse the number of roots in a coarse grid
namespace CPlantBox {
* *
namespace CPlantBox {
*/
namespace CPlantBox {
using namespace std;
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Creates the geometry of the rhizo tubes
namespace CPlantBox {
*
namespace CPlantBox {
* @param r radius of the rhizo tubes
namespace CPlantBox {
* \return union of the rhizo tubes
namespace CPlantBox {
*/
namespace CPlantBox {
SignedDistanceFunction* fieldRhizoTubes(double r)
namespace CPlantBox {
{
namespace CPlantBox {
double l = 90; // cm tube length
namespace CPlantBox {
SDF_PlantContainer* rhizotube = new SDF_PlantContainer(r,r,l,false);
namespace CPlantBox {
SDF_RotateTranslate* rhizoX = new SDF_RotateTranslate(rhizotube, l, SDF_RotateTranslate::yaxis, Vector3d(l,0.,0.));
namespace CPlantBox {
vector<SignedDistanceFunction*> rhizotubes_;
namespace CPlantBox {
const int tubeN=6;
namespace CPlantBox {
double y_[tubeN] = { 35, 45, 55, 65, 75, 85 };
namespace CPlantBox {
double z_[tubeN] = { -10, -20, -40, -60, -80, -120 };
namespace CPlantBox {
for (int i=0; i<tubeN; i++) {
namespace CPlantBox {
rhizotubes_.push_back(new SDF_RotateTranslate(rhizoX, 0, SDF_RotateTranslate::xaxis, Vector3d(0,y_[i],z_[i])));
namespace CPlantBox {
}
namespace CPlantBox {
SDF_Union* rhizotubes = new SDF_Union(rhizotubes_);
namespace CPlantBox {
return rhizotubes;
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* The positions in the rhizotubes were fotos are taken
namespace CPlantBox {
*
namespace CPlantBox {
* \return Positions of the fotos
namespace CPlantBox {
*/
namespace CPlantBox {
vector<Vector3d> fotoPos() {
namespace CPlantBox {
double l = 90; // cm
namespace CPlantBox {
vector<Vector3d> fP;
namespace CPlantBox {
const int tubeN=6;
namespace CPlantBox {
double y_[tubeN] = { 35, 45, 55, 65, 75, 85 };
namespace CPlantBox {
double z_[tubeN]= { -10, -20, -40, -60, -80, -120 };
namespace CPlantBox {
int nf = 7; // number of foto positions per tube
namespace CPlantBox {
double dist = l/double(nf+2); // = 10 cm
namespace CPlantBox {
for (int i=0; i<tubeN; i++) {
namespace CPlantBox {
for (int j=0; j<nf; j++) {
namespace CPlantBox {
fP.push_back(Vector3d((j+1)*dist,y_[i],z_[i]));
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
return fP;
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/**
namespace CPlantBox {
* Rhizo tube analysis in the virtual field experiment
namespace CPlantBox {
*/
namespace CPlantBox {
void shehan_RhizoTubes(string name = "wheat", bool exportVTP = false)
namespace CPlantBox {
{
namespace CPlantBox {
/*
namespace CPlantBox {
* Initialize
namespace CPlantBox {
*/
namespace CPlantBox {
double r = 3.2;
namespace CPlantBox {
SignedDistanceFunction* geometry = new SDF_Complement(fieldRhizoTubes(r));
namespace CPlantBox {
auto allRS = initializeRootSystems(name,geometry);
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Simulate
namespace CPlantBox {
*/
namespace CPlantBox {
vector<double> times = {0, 30, 60, 90, 120, 150, 180, 210, 240};
namespace CPlantBox {
//vector<double> times = {0, 7, 14, 21, 30, 37, 44, 51, 60, 67, 74, 81, 90, 97, 104, 111, 120, 127, 134, 141, 150, 157, 164, 171, 180, 187, 194, 201, 210,
namespace CPlantBox {
// 217, 223, 231, 240}; // test...
namespace CPlantBox {
simulateRS(times, allRS);
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Analysis: crop to the segments visible from the rhizotubes
namespace CPlantBox {
*/
namespace CPlantBox {
double dx = 0.3; //cm
namespace CPlantBox {
SignedDistanceFunction* visible = fieldRhizoTubes(3.2+dx);
namespace CPlantBox {
namespace CPlantBox {
vector<SegmentAnalyser> croppedTubes;
namespace CPlantBox {
for (size_t i=1; i<times.size(); i++) {
namespace CPlantBox {
std::cout << "\nANALYSE TIME " << times.at(i) <<"\n\n";
namespace CPlantBox {
SegmentAnalyser analyser = getResult(allRS,times.at(i));
namespace CPlantBox {
analyser.crop(visible); // throw segments away
namespace CPlantBox {
analyser.pack(); // throw nodes away
namespace CPlantBox {
if (exportVTP) {
namespace CPlantBox {
string vtpname = name + "_tube_cropped"+ std::to_string(i)+".vtp"; // export cropped segments for visualization
namespace CPlantBox {
analyser.write(vtpname);
namespace CPlantBox {
}
namespace CPlantBox {
croppedTubes.push_back(analyser); // copies into the vector
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Foto
namespace CPlantBox {
*/
namespace CPlantBox {
vector<vector<double>> finalmatrixC(times.size()-1);
namespace CPlantBox {
vector<vector<double>> finalmatrixL(times.size()-1);
namespace CPlantBox {
namespace CPlantBox {
vector<Vector3d> fpos = fotoPos();
namespace CPlantBox {
namespace CPlantBox {
vector<SegmentAnalyser> fotos; // not real fotos, but slices of the croopedTube
namespace CPlantBox {
namespace CPlantBox {
double xx = 1.4; // cm slice thickness
namespace CPlantBox {
double a1 = 8./180.*M_PI;
namespace CPlantBox {
double a2 = 22./180.*M_PI;
namespace CPlantBox {
double r_ = r+dx; // 3.5
namespace CPlantBox {
double zz = sin(a1)*r_ + sin(a2)*r_;
namespace CPlantBox {
cout << " foto box " << xx << ", 100, "<<zz<< "\n";
namespace CPlantBox {
SDF_PlantBox fotoBox(xx,100.,zz);
namespace CPlantBox {
namespace CPlantBox {
vector<SignedDistanceFunction*> allcameras;
namespace CPlantBox {
namespace CPlantBox {
for (size_t t=0; t<times.size()-1; t++) {
namespace CPlantBox {
namespace CPlantBox {
int c = 0;
namespace CPlantBox {
cout << "Time: " << times.at(t) << "\n";
namespace CPlantBox {
SegmentAnalyser empty = SegmentAnalyser();
namespace CPlantBox {
fotos.push_back(empty); // fill in this time step
namespace CPlantBox {
SegmentAnalyser f = croppedTubes.at(t);
namespace CPlantBox {
namespace CPlantBox {
for (auto& p :fpos) {
namespace CPlantBox {
namespace CPlantBox {
int j = floor(double(c)/7.);
namespace CPlantBox {
namespace CPlantBox {
if (int(finalmatrixC[t].size())<=j) {
namespace CPlantBox {
finalmatrixC[t].push_back(0.);
namespace CPlantBox {
finalmatrixL[t].push_back(0.);
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
// foto 1 + 2
namespace CPlantBox {
SDF_RotateTranslate* foto = new SDF_RotateTranslate(&fotoBox,
namespace CPlantBox {
Vector3d(p.x,p.y,p.z+r_*sin(a2)));
namespace CPlantBox {
SegmentAnalyser foto12 = f;
namespace CPlantBox {
foto12.crop(foto);
namespace CPlantBox {
foto12.pack();
namespace CPlantBox {
namespace CPlantBox {
finalmatrixC[t][j] += double(foto12.getNumberOfRoots())/7.;
namespace CPlantBox {
// number of segments is not feasible, since a root might grow around the tube
namespace CPlantBox {
finalmatrixL[t][j] += double(foto12.getSummed(RootSystem::st_length))/7.;
namespace CPlantBox {
// finalmatrixC[t][j] += 1./7.; // for debugging
namespace CPlantBox {
// finalmatrixL[t][j] += 1./7.;
namespace CPlantBox {
namespace CPlantBox {
std::cout << "#" << c << " foto at location: "<< p.toString() << " tube " << j << "\n";
namespace CPlantBox {
namespace CPlantBox {
allcameras.push_back(foto); // save geometry for later vizualisation
namespace CPlantBox {
fotos.back().addSegments(foto12); // save segments for vizualisation
namespace CPlantBox {
c++;
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* export fotos
namespace CPlantBox {
*/
namespace CPlantBox {
int c=0;
namespace CPlantBox {
for (auto& ft : fotos) {
namespace CPlantBox {
string vtpname = name + "_tube_fotos"+std::to_string(++c) +".vtp";
namespace CPlantBox {
ft.write(vtpname);
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
int n = finalmatrixC[0].size(); // 32
namespace CPlantBox {
int m = times.size()-1; // 8
namespace CPlantBox {
string matname = name+"_tube_matrix1.txt";
namespace CPlantBox {
std::ofstream fos;
namespace CPlantBox {
fos.open(matname.c_str());
namespace CPlantBox {
for (int j=0; j<n; j++) {
namespace CPlantBox {
for (int i=0; i<m; i++) {
namespace CPlantBox {
std::cout << std::fixed << std::setprecision(4)<< finalmatrixC[i][j] << "\t";
namespace CPlantBox {
fos << std::fixed << std::setprecision(4)<< finalmatrixC[i][j] << "\t";
namespace CPlantBox {
}
namespace CPlantBox {
std::cout << "\n";
namespace CPlantBox {
fos << "\n";
namespace CPlantBox {
}
namespace CPlantBox {
fos.close();
namespace CPlantBox {
namespace CPlantBox {
n = finalmatrixL[0].size(); // 32
namespace CPlantBox {
m = times.size()-1; // 8
namespace CPlantBox {
matname = name+"_tube_matrix2.txt";
namespace CPlantBox {
fos.open(matname.c_str());
namespace CPlantBox {
for (int j=0; j<n; j++) {
namespace CPlantBox {
for (int i=0; i<m; i++) {
namespace CPlantBox {
std::cout << std::fixed << std::setprecision(4)<< finalmatrixL[i][j] << "\t";
namespace CPlantBox {
fos << std::fixed << std::setprecision(4)<< finalmatrixL[i][j] << "\t";
namespace CPlantBox {
}
namespace CPlantBox {
std::cout << "\n";
namespace CPlantBox {
fos << "\n";
namespace CPlantBox {
}
namespace CPlantBox {
fos.close();
namespace CPlantBox {
namespace CPlantBox {
/**
namespace CPlantBox {
* Export rhizotube geometry
namespace CPlantBox {
*/
namespace CPlantBox {
if (exportVTP) {
namespace CPlantBox {
string gname = name + "_tube.py";
namespace CPlantBox {
allRS[0]->write(gname);
namespace CPlantBox {
string gname2 = name + "_tubeCamera.py";
namespace CPlantBox {
SDF_Union cam(allcameras);
namespace CPlantBox {
allRS[0]->setGeometry(&cam);
namespace CPlantBox {
allRS[0]->write(gname2);
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
/**
* Shehans experimental set-up
*
* (A) Virtual soil core analysis
*
* Simulates the growing root systems (6*37) in the field
* uses the soil coring method to analyse the root systems.
*
*/
using namespace std;
#include <iostream>
namespace CPlantBox {
} // namespace CPlantBox
#include <iomanip>
/**
* Creates a field of multiply root system (6*37)
*
* @param name filename of the parameter file
* @param geom confining geometry
*/
vector<RootSystem*> initializeRootSystems(string name, SignedDistanceFunction* geom = new SignedDistanceFunction())
{
auto gen = mt19937(chrono::system_clock::now().time_since_epoch().count());
auto UID = std::uniform_int_distribution<unsigned int>(); // random stuff, does it work now?
int M=6;
int N=37;
double dist1 = 18; // [cm] (M-1)*18 = 90
double dist2 = 3; // [cm] (N-1)*3 = 108
vector<RootSystem*> allRS;
for (int i=0; i<M; i++) {
for (int j=0;j<N; j++) {
RootSystem* rs = new RootSystem();
allRS.push_back(rs);
rs->openFile(name);
rs->setGeometry(geom);
rs->getRootTypeParameter(4)->theta = 80./180.*M_PI; // fix insertion angle of the basal roots
rs->getRootSystemParameter()->seedPos = Vector3d(dist1*i,dist2*j,-3); // set position of seed [cm]
unsigned int s = UID(gen);
rs->setSeed(s); // randomly select a seed
rs->initialize();
}
}
return allRS;
}
/**
* Simulates all root systems and stores the results in one analyser class per time step
*
* @param times simulation times we want to simulate (starting with 0)
* @param allRS root systems to simulate
*/
void simulateRS(vector<double> times, vector<RootSystem*>& allRS)
{
int N_ = allRS.size();
for (size_t i=0; i<times.size()-1; i++) {
std::cout << "\nTIME " << times.at(i+1) <<"\n\n";
double dt = times.at(i+1)-times.at(i);
for (int r=0; r<N_; r++) { // simulate all
allRS.at(r)->simulate(dt,true);
}
}
}
/**
* Retrieves a the state of the root systems at a certain time in a SegmentAnalyser object
*/
SegmentAnalyser getResult(vector<RootSystem*>& allRS, double time) {
SegmentAnalyser a = SegmentAnalyser();
for (const auto& rs : allRS) { // merge all into one analyser object
//cout << "Analyser " << a.segments.size()<< ", " << a.nodes.size() << "\n";
//cout << "Root system: " << rs->getNumberOfNodes() <<"\n";
auto news = SegmentAnalyser(*rs);
news.filter(RootSystem::st_time,0,time);
news.pack(); // delete unused nodes
a.addSegments(news);
}
return a;
}
/**
* The geometry of the 15 soil cores with fixed location in the field
*
* @param r radius of the soil core
* @param h height of the soil core
*/
vector<SignedDistanceFunction*> soilCores(double r,double h)
{
SDF_PlantContainer* core = new SDF_PlantContainer(r,r,h,false);
vector<double> x = {27, 27, 27, 27, 27, 45, 45, 45, 45, 45, 63, 63, 63, 63, 63};
vector<double> y = {30, 42, 54, 66, 78, 30, 42, 54, 66, 78, 30, 42, 54, 66, 78};
vector<SignedDistanceFunction*> cores_;
for (size_t i=0; i<x.size(); i++) {
cores_.push_back(new SDF_RotateTranslate(core, 0, SDF_RotateTranslate::xaxis, Vector3d(x[i],y[i],0)));
}
// SDF_Union* cores = new SDF_Union(cores_);
return cores_;
}
/**
* Soil core analysis in the virtual field experiment
*/
void shehan_SoilCore(string name = "wheat", bool exportVTP = false)
{
/*
* Initialize
*/
auto allRS = initializeRootSystems(name);
/*
* Simulate
*/
vector<double> times = {0, 30, 60, 90};
simulateRS(times, allRS);
/*
* Analysis: vertical distribution within the soil cores
*/
double r = 2.1; // radius of the soil core (cm)
double h = 160; // depth of the soil core (cm)
double dz = 5; // width of layer (cm)
vector<SignedDistanceFunction*> coregeometry = soilCores(r,h);
vector<vector<double>> finalmatrix(15*(times.size()-1));
for (size_t i=1; i<times.size(); i++) {
for (size_t j=0; j<15; j++) {
std::cout << "\nANALYSE TIME " << times.at(i) <<"\n\n";
SegmentAnalyser coreanalyser = getResult(allRS, times.at(i));
std::cout << "crop\n";
coreanalyser.crop(coregeometry[j]); // throw segments away
std::cout << "pack\n";
coreanalyser.pack(); // throw unused nodes away
std::cout << "get distribution\n";
vector<double> tl = coreanalyser.distribution(RootSystem::st_length,0,h,round(h/dz),true); // vertical distribution
for (double& d :tl) {
d = d/(15*r*r*M_PI*dz); // 15 soil cores
}
finalmatrix.at((i-1)*15+j) = tl; // store length density in the finalmatrix
if (exportVTP) {
string vtpname = name + "_core_cropped"+ std::to_string(i)+".vtp"; // export cropped segments for vizualisaten
coreanalyser.write(vtpname);
}
}
}
/*
* Export the final matrix
*/
int n = finalmatrix[0].size(); // h/dz = 32
int m = finalmatrix.size();
string matname = name+"_core_matrix.txt";
std::ofstream fos;
fos.open(matname.c_str());
for (int j=0; j<n; j++) {
for (int i=0; i<m; i++) {
std::cout << std::fixed << std::setprecision(4)<< finalmatrix[i][j] << "\t";
fos << std::fixed << std::setprecision(4)<< finalmatrix[i][j] << "\t";
}
std::cout << "\n";
fos << "\n";
}
fos.close();
// /*
// * Export rootsystems (around 4.5GB)
// */
// SegmentAnalyser analyser;
// for (const auto& rs : allRS) {
// analyser.addSegments(*rs);
// }
// string vtpname = name +".vtp";
// analyser.write(vtpname);
/**
* Export core geometry
*/
if (exportVTP) {
string gname = name + "_core.py";
SDF_Union* cores = new SDF_Union(coregeometry);
allRS[0]->setGeometry(cores); // just for writing
allRS[0]->write(gname);
}
}
/**
namespace CPlantBox {
* Shehans experimental set-up
namespace CPlantBox {
*
namespace CPlantBox {
* (C) Virtual analysis of trenches
namespace CPlantBox {
*
namespace CPlantBox {
* simulates the growing root systems (6*37) in the field
namespace CPlantBox {
* uses trenches to analyse the number of roots in a coarse grid
namespace CPlantBox {
*
namespace CPlantBox {
*/
namespace CPlantBox {
using namespace std;
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
/**
namespace CPlantBox {
* Creates the geometry of the trenches
namespace CPlantBox {
*
namespace CPlantBox {
* \return a vector of 9 infinitely large trenches
namespace CPlantBox {
*/
namespace CPlantBox {
vector<SDF_HalfPlane*> fieldTrenches() {
namespace CPlantBox {
int N = 9; // number of trenches
namespace CPlantBox {
vector<SDF_HalfPlane*> trenches;
namespace CPlantBox {
double dist1 = 18; // cm horizontal distance between plants
namespace CPlantBox {
double dist2 = 6; // cm vertical distance between the trenches
namespace CPlantBox {
for (int i=0; i<N; i++) {
namespace CPlantBox {
Vector3d o(1.5*dist1, 5.*dist2+i*dist2, -160);
namespace CPlantBox {
std::cout << o.toString() << "\n";
namespace CPlantBox {
Vector3d p1(1.5*dist1, 5.*dist2+i*dist2, 0);
namespace CPlantBox {
Vector3d p2(3.5*dist1, 5.*dist2+i*dist2, -160);
namespace CPlantBox {
trenches.push_back(new SDF_HalfPlane(o,p1,p2));
namespace CPlantBox {
}
namespace CPlantBox {
return trenches;
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/**
namespace CPlantBox {
* Creates a field of multiply root system relevant for the trenches (4*21)
namespace CPlantBox {
*
namespace CPlantBox {
* @param name filename of the parameter file
namespace CPlantBox {
* @param geom confining geometry
namespace CPlantBox {
*/
namespace CPlantBox {
vector<RootSystem*> initializeRootSystems2(string name, SignedDistanceFunction* geom = new SignedDistanceFunction())
namespace CPlantBox {
{
namespace CPlantBox {
// auto gen = mt19937(chrono::system_clock::now().time_since_epoch().count());
namespace CPlantBox {
// auto UD = uniform_real_distribution<double>(0,1); // random stuff, does it work now?
namespace CPlantBox {
int M=6;
namespace CPlantBox {
int N=37;
namespace CPlantBox {
double dist1 = 18; // [cm] (M-1)*18 = 90
namespace CPlantBox {
double dist2 = 3; // [cm] (N-1)*3 = 108
namespace CPlantBox {
vector<RootSystem*> allRS;
namespace CPlantBox {
for (int i=1; i<(M-1); i++) {
namespace CPlantBox {
for (int j=8;j<(N-8); j++) {
namespace CPlantBox {
RootSystem* rs = new RootSystem();
namespace CPlantBox {
// double s = UD(gen);
namespace CPlantBox {
// rs->setSeed(s); // randomly select a seed
namespace CPlantBox {
allRS.push_back(rs);
namespace CPlantBox {
rs->openFile(name);
namespace CPlantBox {
rs->setGeometry(geom);
namespace CPlantBox {
rs->getRootTypeParameter(4)->theta = 80./180.*M_PI; // fix insertion angle of the basal roots
namespace CPlantBox {
auto pos = Vector3d(dist1*i,dist2*j,-3);
namespace CPlantBox {
std::cout << pos.toString() << "\n";
namespace CPlantBox {
rs->getRootSystemParameter()->seedPos = pos; // set position of seed [cm]
namespace CPlantBox {
rs->initialize();
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
return allRS;
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
/**
namespace CPlantBox {
* Trench analysis in the virtual field experiment
namespace CPlantBox {
*/
namespace CPlantBox {
void shehan_Trenches(string name = "wheat", bool exportVTP = false)
namespace CPlantBox {
{
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Initialize
namespace CPlantBox {
*/
namespace CPlantBox {
auto allRS = initializeRootSystems2(name); // no geometry, trenches are destructive and created after roots are grown
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Simulate
namespace CPlantBox {
*/
namespace CPlantBox {
vector<double> times = {0, 30}; //, 60, 90, 120, 150, 180, 210, 240};
namespace CPlantBox {
simulateRS(times, allRS);
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Analysis: cut the roots along the trenches
namespace CPlantBox {
*/
namespace CPlantBox {
double dist1 = 18; // cm
namespace CPlantBox {
int m = 4;
namespace CPlantBox {
int n = 32;
namespace CPlantBox {
SDF_PlantBox box_(36.,1.e9,160.);
namespace CPlantBox {
//SDF_RotateTranslate box(&box_, Vector3d(18.+ 27., 0., 0.) );
namespace CPlantBox {
vector<SDF_HalfPlane*> trenches = fieldTrenches();
namespace CPlantBox {
vector<vector<vector<double>>> finalMT;
namespace CPlantBox {
namespace CPlantBox {
for (size_t t=0; t<times.size()-1; t++) {
namespace CPlantBox {
namespace CPlantBox {
std::cout<<"create empty matrix";
namespace CPlantBox {
// create empty n*m matrix
namespace CPlantBox {
vector<vector<double>> finalmatrix(n);
namespace CPlantBox {
for (int i=0; i<n; i++) {
namespace CPlantBox {
for (int j=0; j<m; j++) {
namespace CPlantBox {
finalmatrix[i].push_back(0.);
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
// loop over trenches
namespace CPlantBox {
int ii=0;
namespace CPlantBox {
for (auto& tr : trenches) {
namespace CPlantBox {
//auto& tr = trenches[0];
namespace CPlantBox {
std::string s;
namespace CPlantBox {
std::ostringstream os;
namespace CPlantBox {
os << "trench_" << ++ii;
namespace CPlantBox {
std::cout << os.str() <<"\n";
namespace CPlantBox {
namespace CPlantBox {
// cut along the trench
namespace CPlantBox {
std::cout << "cut \n";
namespace CPlantBox {
SegmentAnalyser analyser = getResult(allRS,times.at(t+1));
namespace CPlantBox {
SegmentAnalyser cut = analyser.cut(*tr);
namespace CPlantBox {
// cut.crop(&box); // cut with bounding box
namespace CPlantBox {
// cut.write(os.str()+".vtp");
namespace CPlantBox {
namespace CPlantBox {
// split into grid
namespace CPlantBox {
std::cout <<"grid \n";
namespace CPlantBox {
// vector<vector<SegmentAnalyser>> anamatrix1 = cut.distribution2(0,160, 1.5*dist1, 2.5*dist1,n,m);
namespace CPlantBox {
// vector<vector<SegmentAnalyser>> anamatrix2 = cut.distribution2(0,160, 2.5*dist1, 3.5*dist1,n,m);
namespace CPlantBox {
vector<vector<SegmentAnalyser>> anamatrix = cut.distribution2(0,160, 1.5*dist1, 3.5*dist1,n,2*m); // grid of 8 * 32
namespace CPlantBox {
namespace CPlantBox {
// save root count into matrix
namespace CPlantBox {
std::cout<<"count \n";
namespace CPlantBox {
for (int i=0; i<n; i++) {
namespace CPlantBox {
for (int j=0; j<m; j++) {
namespace CPlantBox {
// finalmatrix[i][j] += anamatrix[i][j].segments.size();
namespace CPlantBox {
// finalmatrix[i][j] += anamatrix[i][j+m].segments.size();
namespace CPlantBox {
finalmatrix[i][j] += anamatrix[i][j].getSummed(RootSystem::st_length);
namespace CPlantBox {
finalmatrix[i][j] += anamatrix[i][j+m].getSummed(RootSystem::st_length);;
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
finalMT.push_back(finalmatrix); // a lot of finals we have here (one matrix per time step)
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Export the final matrix (one file per matrix)
namespace CPlantBox {
*/
namespace CPlantBox {
double N = double(trenches.size())*2.*(4.5*5.);
namespace CPlantBox {
// to calculate the mean number of roots per cm^2 over the trenches
namespace CPlantBox {
for (int j=0; j<m; j++) {
namespace CPlantBox {
string matname = name+"_trench_matrix"+std::to_string(j+1)+".txt"; // grid number
namespace CPlantBox {
std::ofstream fos;
namespace CPlantBox {
fos.open(matname.c_str());
namespace CPlantBox {
for (int i=0; i<n ; i++) {
namespace CPlantBox {
for (size_t t=0; t<times.size()-1; t++) {
namespace CPlantBox {
std::cout << std::fixed << std::setprecision(4)<< finalMT.at(t)[i][j]/N << "\t";
namespace CPlantBox {
fos << std::fixed << std::setprecision(4)<< finalMT.at(t)[i][j]/N << "\t";
namespace CPlantBox {
}
namespace CPlantBox {
std::cout << "\n";
namespace CPlantBox {
fos << "\n";
namespace CPlantBox {
}
namespace CPlantBox {
fos.close();
namespace CPlantBox {
std::cout << "\n\n";
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
/*
namespace CPlantBox {
* Export rootsystems (around 4.5GB)
namespace CPlantBox {
*/
namespace CPlantBox {
if (exportVTP) {
namespace CPlantBox {
for (size_t i=0; i<times.size()-1; i++) {
namespace CPlantBox {
string vtpname = name + std::to_string(i+1)+".vtp";
namespace CPlantBox {
getResult(allRS,times.at(i+1)).write(vtpname);
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
// export trench geometry
namespace CPlantBox {
vector<SignedDistanceFunction*> tr_;
namespace CPlantBox {
for (const auto& tr : trenches) { // copy vector
namespace CPlantBox {
tr_.push_back(tr);
namespace CPlantBox {
}
namespace CPlantBox {
string gname = name + "_trench.py";
namespace CPlantBox {
SDF_Union trenchgeometry = SDF_Union(tr_);
namespace CPlantBox {
allRS[0]->setGeometry(&trenchgeometry); // just for writing
namespace CPlantBox {
allRS[0]->write(gname);
namespace CPlantBox {
namespace CPlantBox {
// allRS[0]->setGeometry(&box); // just for writing
namespace CPlantBox {
// allRS[0]->write("boundingbox.py");
namespace CPlantBox {
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
}
namespace CPlantBox {
namespace CPlantBox {
namespace CPlantBox {
File added
File added
<Plant filetype="parameters" name="Juncus_squarrosus_Clausnitzer_1994">
<organ name="true" subType="0" type="seed">
<parameter name="seedPos.x" value="0" />
<parameter name="seedPos.y" value="0" />
<parameter name="seedPos.z" value="-3" />
<parameter name="plantingdepth" value="3" />
<parameter dev="0" name="firstB" value="0" />
<parameter dev="0" name="delayB" value="0" />
<parameter dev="0" name="maxB" value="47" />
<parameter dev="0" name="maxTi" value="20" />
<parameter name="nC" value="0" />
<parameter name="nz" value="0" />
<parameter dev="0" name="firstSB" value="1000" />
<parameter dev="0" name="delaySB" value="1000" />
<parameter dev="0" name="delayRC" value="1000" />
<parameter dev="0" name="simulationTime" value="30" />
</organ>
<organ name="taproot" subType="1" type="root">
<parameter dev="0" name="lb" value="3" />
<parameter dev="0" name="la" value="12" />
<parameter dev="0" name="ln" value="1" />
<parameter dev="19.600000000000001" name="lmax" value="196.69999999999999" />
<parameter dev="19.600000000000001" name="nob" value="182.69999999999999" />
<parameter dev="0" name="r" value="2.0880000000000001" />
<parameter dev="0" name="a" value="0.14999999999999999" />
<parameter name="RotBeta" value="0" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="205" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="0.20000000000000001" />
<parameter name="tropismS" value="0.20000000000000001" />
<parameter name="dx" value="0.5" />
<parameter dev="0" name="theta" value="0.5" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="2" />
</organ>
<organ name="lateral1" subType="2" type="root">
<parameter dev="0" name="lb" value="0.29999999999999999" />
<parameter dev="0" name="la" value="1.9199999999999999" />
<parameter dev="0" name="ln" value="0.14999999999999999" />
<parameter dev="0.27000000000000002" name="lmax" value="2.6699999999999999" />
<parameter dev="1.8000000000000003" name="nob" value="4" />
<parameter dev="0" name="r" value="0.23999999999999999" />
<parameter dev="0" name="a" value="0.050000000000000003" />
<parameter name="RotBeta" value="238" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="1.5" />
<parameter name="tropismS" value="0.20000000000000001" />
<parameter name="dx" value="0.5" />
<parameter dev="0" name="theta" value="1.5708" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="mainstem" subType="1" type="stem">
<parameter dev="0" name="lb" value="70" />
<parameter dev="0" name="la" value="0.2" />
<parameter dev="0" functiontype="0" name="ln" value="0" />
<parameter dev="0" name="lmax" value="100" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.45000000000000001" name="r" value="4" />
<parameter dev="0.02" name="a" value="0.20000000000000001" />
<parameter name="RotBeta" value="1" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="1" />
<parameter name="tropismS" value="0" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="2" />
</organ>
<organ name="1stbranch" subType="2" type="stem">
<parameter dev="0" name="lb" value="0" />
<parameter dev="0" name="la" value="0" />
<parameter dev="0" functiontype="1" name="ln" value="0" />
<parameter dev="0" name="lmax" value="1" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.035000000000000003" name="r" value="2" />
<parameter dev="0.00125" name="a" value="0.29999999999999999" />
<parameter name="RotBeta" value="0" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="2" />
<parameter name="tropismS" value="0.10000000000000001" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="2ndbranch" subType="3" type="stem">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="30" />
<parameter dev="0" functiontype="1" name="ln" value="8" />
<parameter dev="0" name="lmax" value="140" />
<parameter dev="0" name="nob" value="14.625" />
<parameter dev="0.45000000000000001" name="r" value="2" />
<parameter dev="0.02" name="a" value="0.20000000000000001" />
<parameter name="RotBeta" value="0.5" />
<parameter name="BetaDev" value="0.10000000000000001" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="1" />
<parameter name="tropismS" value="0" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0.29999999999999999" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="2" />
</organ>
<organ name="lateral1" subType="2" type="leaf">
<parameter dev="6" name="lb" value="20" />
<parameter dev="6" name="la" value="4" />
<parameter dev="6" functiontype="3" name="ln" value="14" />
<parameter dev="6" name="lmax" value="21" />
<parameter dev="0" name="nob" value="4.5" />
<parameter dev="3" name="r" value="0.59999999999999998" />
<parameter dev="0.002" name="a" value="2" />
<parameter name="RotBeta" value="0.69999999999999996" />
<parameter name="BetaDev" value="0.29999999999999999" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="18" />
<parameter name="tropismS" value="0.01" />
<parameter name="dx" value="0.25" />
<parameter dev="0.3" name="theta" value="0.1" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="tiller" subType="4" type="stem">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="0" />
<parameter dev="0" functiontype="0" name="ln" value="4" />
<parameter dev="3" name="lmax" value="5" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.035000000000000003" name="r" value="1" />
<parameter dev="0.00125" name="a" value="0.29999999999999999" />
<parameter name="RotBeta" value="0.3" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="0.5" />
<parameter name="tropismS" value="0.05" />
<parameter name="dx" value="0.25" />
<parameter dev="0.02" name="theta" value="0.05" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="2" />
</organ>
</Plant>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<Plant name="0_new" filetype="parameters">
<organ type="seed" name="true" subType="0">
<parameter name="seedPos.x" value="0"/>
<parameter name="seedPos.y" value="0"/>
<parameter name="seedPos.z" value="-3"/>
<parameter name="plantingdepth" value="3"/>
<parameter name="firstB" value="0" dev="0"/>
<parameter name="delayB" value="0" dev="0"/>
<parameter name="maxB" value="47" dev="0"/>
<parameter name="maxTi" value="20" dev="0"/>
<parameter name="nC" value="0"/>
<parameter name="nz" value="0"/>
<parameter name="firstSB" value="1000" dev="0"/>
<parameter name="delaySB" value="1000" dev="0"/>
<parameter name="delayRC" value="1000" dev="0"/>
<parameter name="simulationTime" value="30" dev="0"/>
</organ>
<organ type="root" name="taproot" subType="1">
<parameter name="lb" value="3" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="12" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="1" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="196.69999999999999" dev="19.600000000000001"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="182.69999999999999" dev="19.600000000000001"/>
<parameter name="r" value="2.0880000000000001" dev="0"/>
<parameter name="a" value="0.14999999999999999" dev="0"/>
<parameter name="RotBeta" value="0"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="205"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="0.20000000000000001"/>
<parameter name="tropismS" value="0.20000000000000001"/>
<parameter name="dx" value="0.5"/>
<parameter name="theta" value="0.5" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="2" percentage="1"/>
</organ>
<organ type="root" name="lateral1" subType="2">
<parameter name="lb" value="0.29999999999999999" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="1.9199999999999999" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0.14999999999999999" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="2.6699999999999999" dev="0.27000000000000002"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="4" dev="1.8000000000000003"/>
<parameter name="r" value="0.23999999999999999" dev="0"/>
<parameter name="a" value="0.050000000000000003" dev="0"/>
<parameter name="RotBeta" value="238"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="1.5"/>
<parameter name="tropismS" value="0.20000000000000001"/>
<parameter name="dx" value="0.5"/>
<parameter name="theta" value="1.5708" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="stem" name="mainstem" subType="1">
<parameter name="lb" value="70" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0.20000000000000001" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0" dev="0" functiontype="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="100" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="0" dev="0"/>
<parameter name="r" value="4" dev="0.45000000000000001"/>
<parameter name="a" value="0.20000000000000001" dev="0.02"/>
<parameter name="RotBeta" value="1"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="1"/>
<parameter name="tropismS" value="0"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="2" percentage="1"/>
</organ>
<organ type="stem" name="1stbranch" subType="2">
<parameter name="lb" value="0" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0" dev="0" functiontype="1"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="1" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="0" dev="0"/>
<parameter name="r" value="2" dev="0.035000000000000003"/>
<parameter name="a" value="0.29999999999999999" dev="0.00125"/>
<parameter name="RotBeta" value="0"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="2"/>
<parameter name="tropismS" value="0.10000000000000001"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="stem" name="2ndbranch" subType="3">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="30" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="8" dev="0" functiontype="1"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="140" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="14.625" dev="0"/>
<parameter name="r" value="2" dev="0.45000000000000001"/>
<parameter name="a" value="0.20000000000000001" dev="0.02"/>
<parameter name="RotBeta" value="0.5"/>
<parameter name="BetaDev" value="0.10000000000000001"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="1"/>
<parameter name="tropismS" value="0"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.29999999999999999" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="2" percentage="1"/>
</organ>
<organ type="stem" name="otherbranch1" subType="4">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="4" dev="0" functiontype="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="5" dev="3"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="2" dev="0.75"/>
<parameter name="r" value="1" dev="0.035000000000000003"/>
<parameter name="a" value="0.29999999999999999" dev="0.00125"/>
<parameter name="RotBeta" value="0.29999999999999999"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="0.5"/>
<parameter name="tropismS" value="0.050000000000000003"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.050000000000000003" dev="0.02"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="2" percentage="1"/>
</organ>
<organ type="leaf" name="lateral1" subType="2">
<parameter name="lb" value="20" dev="6"/>
<!--Basal zone [cm]-->
<parameter name="la" value="4" dev="6"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="14" dev="6" functiontype="3"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="21" dev="6"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="0.7857142857142857" dev="0"/>
<parameter name="r" value="0.59999999999999998" dev="3"/>
<parameter name="a" value="2" dev="0.002"/>
<parameter name="RotBeta" value="0.69999999999999996"/>
<parameter name="BetaDev" value="0.29999999999999999"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="18"/>
<parameter name="tropismS" value="0.01"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.10000000000000001" dev="0.29999999999999999"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
</Plant>
<Plant filetype="parameters" name="maize">
<organ name="maize" subType="0" type="seed">
<parameter name="seedPos.x" value="0" />
<parameter name="seedPos.y" value="100" />
<parameter name="seedPos.z" value="-3" />
<parameter name="plantingdepth" value="3" />
<parameter dev="0" name="firstB" value="1" />
<parameter dev="0" name="delayB" value="1" />
<parameter dev="0" name="maxB" value="0" />
<parameter dev="0" name="maxTi" value="2" />
<parameter name="nC" value="0" />
<parameter name="nz" value="0" />
<parameter dev="0" name="firstSB" value="1000" />
<parameter dev="0" name="delaySB" value="1000" />
<parameter dev="0" name="delayRC" value="1000" />
<parameter dev="0" name="simulationTime" value="15" />
</organ>
<organ name="taproot" subType="1" type="root">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="1.2" />
<parameter dev="0" name="ln" value="0.80000000000000004" />
<parameter dev="3.2999999999999998" name="lmax" value="33.399999999999999" />
<parameter dev="4.1249999999999991" name="nob" value="39.999999999999993" />
<parameter dev="0" name="r" value="4" />
<parameter dev="0" name="a" value="0.050000000000000003" />
<parameter name="RotBeta" value="0.43137300000000001" />
<parameter name="BetaDev" value="0.39215699999999998" />
<parameter name="InitBeta" value="0.196078" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="4" />
<parameter name="tropismS" value="1.5708" />
<parameter name="dx" value="1" />
<parameter dev="0" name="theta" value="0" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="2" />
</organ>
<organ name="lateral1" subType="2" type="root">
<parameter dev="0.10000000000000001" name="lb" value="0.40000000000000002" />
<parameter dev="0.20000000000000001" name="la" value="0.80000000000000004" />
<parameter dev="0.10000000000000001" name="ln" value="0.5" />
<parameter dev="10" name="lmax" value="7.7000000000000002" />
<parameter dev="16.800000000000004" name="nob" value="14" />
<parameter dev="0.14999999999999999" name="r" value="1.5" />
<parameter dev="0" name="a" value="0.029999999999999999" />
<parameter name="RotBeta" value="0.54901999999999995" />
<parameter name="BetaDev" value="0.49019600000000002" />
<parameter name="InitBeta" value="0.156863" />
<parameter name="tropismT" value="0" />
<parameter name="tropismN" value="2" />
<parameter name="tropismS" value="0.52359900000000004" />
<parameter name="dx" value="1" />
<parameter dev="0.052359900000000001" name="theta" value="1.22173" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="3" />
</organ>
<organ name="lateral2" subType="3" type="root">
<parameter dev="0.01" name="lb" value="0.10000000000000001" />
<parameter dev="0.01" name="la" value="0.10000000000000001" />
<parameter dev="0" name="ln" value="0.23999999999999999" />
<parameter dev="0.040000000000000001" name="lmax" value="0.44" />
<parameter dev="0.083333333333333329" name="nob" value="2" />
<parameter dev="0.20000000000000001" name="r" value="2" />
<parameter dev="0" name="a" value="0.02" />
<parameter name="RotBeta" value="0.62745099999999998" />
<parameter name="BetaDev" value="0.58823499999999995" />
<parameter name="InitBeta" value="0.117647" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="2" />
<parameter name="tropismS" value="0.78539800000000004" />
<parameter name="dx" value="1" />
<parameter dev="0.052359900000000001" name="theta" value="1.18682" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
<parameter name="successor" number="0" percentage="1" type="4" />
</organ>
<organ name="nodal_root" subType="4" type="root">
<parameter dev="0" name="lb" value="0" />
<parameter dev="0.029999999999999999" name="la" value="0.40000000000000002" />
<parameter dev="0" name="ln" value="0" />
<parameter dev="0.040000000000000001" name="lmax" value="0.40000000000000002" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.20000000000000001" name="r" value="2" />
<parameter dev="0" name="a" value="0.02" />
<parameter name="RotBeta" value="0.78431399999999996" />
<parameter name="BetaDev" value="0.78431399999999996" />
<parameter name="InitBeta" value="0.039215699999999999" />
<parameter name="tropismT" value="0" />
<parameter name="tropismN" value="0" />
<parameter name="tropismS" value="0.31415900000000002" />
<parameter name="dx" value="1" />
<parameter dev="0.052359900000000001" name="theta" value="1.18682" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="mainstem" subType="1" type="stem">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="0" />
<parameter dev="0" functiontype="3" name="ln" value="2" />
<parameter dev="0" name="lmax" value="30" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.45000000000000001" name="r" value="1" />
<parameter dev="0.02" name="a" value="0.20000000000000001" />
<parameter name="RotBeta" value="1" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="1" />
<parameter name="tropismS" value="0" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="bud" subType="2" type="stem">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="0" />
<parameter dev="0" functiontype="5" name="ln" value="5" />
<parameter dev="0" name="lmax" value="70" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.035000000000000003" name="r" value="0.1" />
<parameter dev="0.00125" name="a" value="0.29999999999999999" />
<parameter name="RotBeta" value="1" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0.5" />
<parameter name="tropismT" value="4" />
<parameter name="tropismN" value="8" />
<parameter name="tropismS" value="0.05" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0.3" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="tiller" subType="4" type="stem">
<parameter dev="0" name="lb" value="1" />
<parameter dev="0" name="la" value="0" />
<parameter dev="0" functiontype="3" name="ln" value="2" />
<parameter dev="0" name="lmax" value="20" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0.035000000000000003" name="r" value="1" />
<parameter dev="0.00125" name="a" value="0.13" />
<parameter name="RotBeta" value="1" />
<parameter name="BetaDev" value="0" />
<parameter name="InitBeta" value="0.5" />
<parameter name="tropismT" value="4" />
<parameter name="tropismN" value="8" />
<parameter name="tropismS" value="0.02" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0.3" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
<organ name="lateral2" subType="2" type="leaf">
<parameter dev="0" name="lb" value="2" />
<parameter dev="0" name="la" value="0.2" />
<parameter dev="0" functiontype="5" name="ln" value="0" />
<parameter dev="0" name="lmax" value="2" />
<parameter dev="0" name="nob" value="0" />
<parameter dev="0" name="r" value="1" />
<parameter dev="0.002" name="a" value="0.02" />
<parameter name="RotBeta" value="0.5" />
<parameter name="BetaDev" value="0.1" />
<parameter name="InitBeta" value="0.5" />
<parameter name="tropismT" value="1" />
<parameter name="tropismN" value="2" />
<parameter name="tropismS" value="0" />
<parameter name="dx" value="0.25" />
<parameter dev="0" name="theta" value="0.4" />
<parameter dev="0" name="rlt" value="1000000000" />
<parameter name="gf" value="1" />
</organ>
</Plant>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<Plant name="1_new" filetype="parameters">
<organ type="seed" name="true" subType="0">
<parameter name="seedPos.x" value="0"/>
<parameter name="seedPos.y" value="100"/>
<parameter name="seedPos.z" value="-3"/>
<parameter name="plantingdepth" value="3"/>
<parameter name="firstB" value="1" dev="0"/>
<parameter name="delayB" value="1" dev="0"/>
<parameter name="maxB" value="0" dev="0"/>
<parameter name="maxTi" value="2" dev="0"/>
<parameter name="nC" value="0"/>
<parameter name="nz" value="0"/>
<parameter name="firstSB" value="1000" dev="0"/>
<parameter name="delaySB" value="1000" dev="0"/>
<parameter name="delayRC" value="1000" dev="0"/>
<parameter name="simulationTime" value="15" dev="0"/>
</organ>
<organ type="root" name="taproot" subType="1">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="1.2" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0.80000000000000004" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="33.399999999999999" dev="3.2999999999999998"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="39.999999999999993" dev="4.1249999999999991"/>
<parameter name="r" value="4" dev="0"/>
<parameter name="a" value="0.050000000000000003" dev="0"/>
<parameter name="RotBeta" value="0.43137300000000001"/>
<parameter name="BetaDev" value="0.39215699999999998"/>
<parameter name="InitBeta" value="0.196078"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="4"/>
<parameter name="tropismS" value="1.5708"/>
<parameter name="dx" value="1"/>
<parameter name="theta" value="0" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="2" percentage="1"/>
</organ>
<organ type="root" name="lateral1" subType="2">
<parameter name="lb" value="0.40000000000000002" dev="0.10000000000000001"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0.80000000000000004" dev="0.20000000000000001"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0.5" dev="0.10000000000000001"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="7.7000000000000002" dev="10"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="14" dev="16.800000000000004"/>
<parameter name="r" value="1.5" dev="0.14999999999999999"/>
<parameter name="a" value="0.029999999999999999" dev="0"/>
<parameter name="RotBeta" value="0.54901999999999995"/>
<parameter name="BetaDev" value="0.49019600000000002"/>
<parameter name="InitBeta" value="0.156863"/>
<parameter name="tropismT" value="0"/>
<parameter name="tropismN" value="2"/>
<parameter name="tropismS" value="0.52359900000000004"/>
<parameter name="dx" value="1"/>
<parameter name="theta" value="1.22173" dev="0.052359900000000001"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="3" percentage="1"/>
</organ>
<organ type="root" name="lateral2" subType="3">
<parameter name="lb" value="0.10000000000000001" dev="0.01"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0.10000000000000001" dev="0.01"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0.23999999999999999" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="0.44" dev="0.040000000000000001"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="2" dev="0.083333333333333329"/>
<parameter name="r" value="2" dev="0.20000000000000001"/>
<parameter name="a" value="0.02" dev="0"/>
<parameter name="RotBeta" value="0.62745099999999998"/>
<parameter name="BetaDev" value="0.58823499999999995"/>
<parameter name="InitBeta" value="0.117647"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="2"/>
<parameter name="tropismS" value="0.78539800000000004"/>
<parameter name="dx" value="1"/>
<parameter name="theta" value="1.18682" dev="0.052359900000000001"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
<parameter name="successor" number="0" type="4" percentage="1"/>
</organ>
<organ type="root" name="nodal_root" subType="4">
<parameter name="lb" value="0" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0.40000000000000002" dev="0.029999999999999999"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="0.40000000000000002" dev="0.040000000000000001"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="0" dev="0"/>
<parameter name="r" value="2" dev="0.20000000000000001"/>
<parameter name="a" value="0.02" dev="0"/>
<parameter name="RotBeta" value="0.78431399999999996"/>
<parameter name="BetaDev" value="0.78431399999999996"/>
<parameter name="InitBeta" value="0.039215699999999999"/>
<parameter name="tropismT" value="0"/>
<parameter name="tropismN" value="0"/>
<parameter name="tropismS" value="0.31415900000000002"/>
<parameter name="dx" value="1"/>
<parameter name="theta" value="1.18682" dev="0.052359900000000001"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="stem" name="mainstem" subType="1">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="2" dev="0" functiontype="3"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="30" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="15.5" dev="0"/>
<parameter name="r" value="1" dev="0.45000000000000001"/>
<parameter name="a" value="0.20000000000000001" dev="0.02"/>
<parameter name="RotBeta" value="1"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="1"/>
<parameter name="tropismS" value="0"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="stem" name="1stbranch" subType="2">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="5" dev="0" functiontype="5"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="70" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="14.800000000000001" dev="0"/>
<parameter name="r" value="0.10000000000000001" dev="0.035000000000000003"/>
<parameter name="a" value="0.29999999999999999" dev="0.00125"/>
<parameter name="RotBeta" value="1"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0.5"/>
<parameter name="tropismT" value="4"/>
<parameter name="tropismN" value="8"/>
<parameter name="tropismS" value="0.050000000000000003"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.29999999999999999" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="stem" name="otherbranch1" subType="4">
<parameter name="lb" value="1" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="2" dev="0" functiontype="3"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="20" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="10.5" dev="0"/>
<parameter name="r" value="1" dev="0.035000000000000003"/>
<parameter name="a" value="0.13" dev="0.00125"/>
<parameter name="RotBeta" value="1"/>
<parameter name="BetaDev" value="0"/>
<parameter name="InitBeta" value="0.5"/>
<parameter name="tropismT" value="4"/>
<parameter name="tropismN" value="8"/>
<parameter name="tropismS" value="0.02"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.29999999999999999" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
<organ type="leaf" name="lateral2" subType="2">
<parameter name="lb" value="2" dev="0"/>
<!--Basal zone [cm]-->
<parameter name="la" value="0.20000000000000001" dev="0"/>
<!--Apical zone [cm];-->
<parameter name="ln" value="0" dev="0" functiontype="5"/>
<!--Inter-lateral distance [cm];-->
<parameter name="lmax" value="2" dev="0"/>
<!--Inter-lateral distance [cm];-->
<parameter name="nob" value="0" dev="0"/>
<parameter name="r" value="1" dev="0"/>
<parameter name="a" value="0.02" dev="0.002"/>
<parameter name="RotBeta" value="0.5"/>
<parameter name="BetaDev" value="0.10000000000000001"/>
<parameter name="InitBeta" value="0.5"/>
<parameter name="tropismT" value="1"/>
<parameter name="tropismN" value="2"/>
<parameter name="tropismS" value="0"/>
<parameter name="dx" value="0.25"/>
<parameter name="theta" value="0.40000000000000002" dev="0"/>
<parameter name="rlt" value="1000000000" dev="0"/>
<parameter name="gf" value="1"/>
</organ>
</Plant>