update structure and PV modules tutorial authored by Bouvry Arnaud's avatar Bouvry Arnaud
......@@ -38,37 +38,76 @@ Take the time to specify correct parameter values !
The parameters are located in several subdirectories according to their purpose:
- AV_CENTRAL/ : set parameters of the agrivoltaics plant (number of panels, azimuth of the central, etc.)
- CROPS/ : parameter files for the crop models (SIMPLE, STICS, Gras-Sim)
- HARDWARE/ : Configure key properties of a PV panel for simulation, including its dimensions, peak power output, and whether it is bifacial. It also specifies if the panel has thickness and includes a 3D model file. These settings define the panel’s physical and operational characteristics in the simulation environment.
- SCENARIOS/ : define the parameters of the simulation scenario, such as location, latitude and longitude, altitude, simulation options, start and end year of the simulation, etc.
- STRUCTURES/ : define the parameters of the mounting structure, such as the height of the panels, their tilt, etc.
- AV_CENTRAL/ : set parameters of the agrivoltaics plant (number of panels, azimuth of the central, height of the panels, their tilt, etc.)
- HARDWARE/ :
- PV_MODULES/: Configure key properties of a PV panel for simulation, including its dimensions, peak power output, and
whether it is bifacial.
It also specifies if the panel has thickness and includes a 3D model file.
These settings define the panel’s physical and operational characteristics in the simulation environment.
- STRUCTURES/ : define the parameters of the mounting structure, such as the type of structure, the shape of the profiles used in the structure, etc.
- CROPS/ : parameter files for the crop models (SIMPLE, STICS, GrasSim)
- WEATHER_FILES/ : the simulation can run on data fetched from an online database or on data files located in this subdirectory.
## AV central
The parameters of the agrivoltaics central (or the photovoltaics installation).
- NumberOfPanelsX: this defines the number of modules across a block of PV modules.
- NumberOfPanelsY: this defines the number of modules along a block of PV modules.
- RepetitionDistanceOfPanelsX: point-to-point (or center-to-center) distance between two neighboring panels across the block.
- RepetitionDistanceOfPanelsY: point-to-point (or center-to-center) distance between two neighboring panels along the block.
Figure 1 below shows an example with the following parameter values :
- NumberOfPanelsX: 2
- NumberOfPanelsY: 8
- RepetitionDistanceOfPanelsX: 2.5 [m]
- RepetitionDistanceOfPanelsY: 2.0 [m] (this distance is exaggerated for demonstration purposes)
- NumberOfPVBlocksX: 2
- NumberOfPVBlocksY: 1
- RepetitionDistanceOfPVBlocksX: 10 [m]
(the solar modules are 2.384 * 1.303 m)
This section details parameters of the photovoltaics component of the agrivoltaics central, i.e. the PV modules and structures.
Currently, PASE natively supports regular centrals : the user can configure one block of PV modules and structures, that can be repeated along a rectangular grid.
Figure 1 displays a schematic example of the layout.
![pv_modules_and_blocks.png](../uploads/structure/pv_modules_and_blocks.png)
<div align="center">
Figure 1 - Illustration of blocks of PV modules. A block is highlighted by the dashed rectangle.
In this example, each block counts 4 PV modules and there are respectively 3 block repetitions in the X axis and 2 block repetitions in the Y axis for a total of 6 blocks.
</div>
### PV modules
The PV modules are layed out in blocks. The user must start by defining the properties of the PV modules in a parameter file under `INPUTS/HARDWARE/PV_MODULES/`, e.g. `INPUTS/HARDWARE/PV_MODULES/Example1_PV_Module.yaml`.
Then, based on the dimensions of the PV modules and the desired layout, set parameter values in `INPUTS/AV_CENTRAL/` (e.g. `INPUTS/AV_CENTRAL/Example1_AV.yaml`) for the number of PV modules repetitions in a block (in both X and Y directions) as well as the repetition distance between successive PV modules.
Once the PV block is correctly parametrized, the same operation can be done to lay out the blocks to shape the entire PV central.
Table 2 and Figure 2 illustrate the result of this process.
Table 1 - Basic parameters to design a **block** of PV modules in an agrivoltaic central.
| Parameter | Description |
|-----------------------------|---------------------------------------------------------------------------------------------------|
| NumberOfPanelsX | defines the number of modules **across** a block of PV modules |
| NumberOfPanelsY | defines the number of modules **along** a block of PV modules |
| RepetitionDistanceOfPanelsX | point-to-point (or center-to-center) distance between two neighboring panels **across** the block |
| RepetitionDistanceOfPanelsY | point-to-point (or center-to-center) distance between two neighboring panels **along** the block |
Figure 1 below shows an example with the parameter values listed in Table 2.
Table 2 - parameters used to generate Figure 1.
| Parameter | Value | Unit |
|-------------------------------|-------|------|
| NumberOfPanelsX | 2 | - |
| NumberOfPanelsY | 8 | - |
| RepetitionDistanceOfPanelsX | 2.5 | m |
| RepetitionDistanceOfPanelsY | 2.0 | m |
| NumberOfPVBlocksX | 2 | - |
| NumberOfPVBlocksY | 1 | - |
| RepetitionDistanceOfPVBlocksX | 10 | - |
![AV params diagram](uploads/AV parameters diagram.png)
Figure 1 - illustration of parameters RepetitionDistanceOfPanelsX,
<div align="center">
Figure 2 - illustration of parameters RepetitionDistanceOfPanelsX,
RepetitionDistanceOfPanelsY and RepetitionDistanceOfPVBlocksX for a small
central with NumberOfPanelsX: 2, NumberOfPanelsY: 8, NumberOfPVBlocksX: 2
and NumberOfPVBlocksY: 1.
The solar modules are 2.384 * 1.303 m.
</div>
#### Orienting the PV modules
Figures 3 and 4 illustrate the behavior of orientation-related inputs (azimuth and tilt).
The CentralAzimut parameter (angle in degrees [°]) indicates the direction in
which the PV blocks' Y axis points:
......@@ -85,71 +124,114 @@ If the modules have a positive tilt, it means that for the following CentralAzim
(for negative tilt values, the central will face the opposite way).
Figures 2 and 3 are two examples to illustrate the behavior of those inputs.
![AV east facing](uploads/AV parameters diagram east facing.png)
Figure 2 - CentralAzimut: 0. The main axis (red arrow) of the block points North and,
<div align="center">
Figure 3 - CentralAzimut: 0. The main axis (red arrow) of the block points North and,
with positive tilt, the PV modules face East.
</div>
![AV south facing](uploads/AV parameters diagram south facing.png)
Figure 3 - CentralAzimut: 90. The main axis (red arrow) of the block points East and,
<div align="center">
Figure 4 - CentralAzimut: 90. The main axis (red arrow) of the block points East and,
with positive tilt, the PV modules face South.
</div>
### Structure
The structure configuration defines the physical mounting system for the PV modules.
This is controlled by parameters in the `INPUTS/HARDWARE/STRUCTURES/` YAML files.
Figure 5 illustrates the currently supported structure types.
#### Positioning and Spacing
| ![PV Table](uploads/structure/PV_table_nice.png) | ![HSATS](uploads/structure/HSATS_nice.png) | ![AV fence](uploads/structure/AV_fence_nice.png) |
|--------------------------------------------------|--------------------------------------------------------------|-----------------------------------------------------------------------------|
| <div align="center">(a) PV table</div> | <div align="center">(b) Horizontal Single Axis Tracker</div> | <div align="center">(c) Agrivoltaic fence for free-hanging PV modules</div> |
These parameters control where panels and structure groups are placed in space.
<div align="center">
Figure 5 - Three structure types available in PASE.
</div>
| Parameter | Unit | Description |
|---|---|---|
| `Height` | meters | Base elevation of the panel array above the ground |
| `TiltY` | degrees | Tilt angle of the panels around the Y axis |
| `PanelOffset` | meters | Offset applied to panel positioning |
| `PoleSpacingX` | meters | Total distance between the two poles along X |
| `StructureSpacingY` | meters | Spacing between structure groups along Y |
| `PoleGroundPositioning` | meters | Vertical offset relative to ground level (0 = flush, negative = buried) |
Parametrization of the structures is controlled by parameters in the YAML files under
`INPUTS/HARDWARE/STRUCTURES/` and `INPUTS/HARDWARE/AV_CENTRAL/`. For example, to
generate PV table structures, the parameter files `INPUTS/AV_CENTRAL/Example5_PVTable.
yaml` and `INPUTS/HARDWARE/STRUCTURES/PV_table.yaml` are used.
---
#### Structure building logic
A structure block supports a block of PV modules as defined in the AV_CENTRAL
parameter file.
Figure 6 illustrates how a structure block is built. Parts are assembled into
elementary groups, which are in turn repeated to form a block.
![Structure groups](uploads/structure/structure_groups.png)
<div align="center">
Figure 6 - This example shows a structure block of the "PV table" structure type, made of 3 elementary groups and
finalized with an end group. Note: the HSATS structure type does not use an end group.
</div>
#### Structure local coordinate frame
#### Structure Components
A PV structure is composed of several elementary parts. Each part has a **shape**, **dimensions**, and a **count**.
The canonical coordinate frame for structures is depicted in Figure 7.
The X axis goes across the structure block, while the Y axis goes along the structure block.
![structure axes.png](../uploads/structure/structure%20axes.png)
<div align="center">
Figure 7 - Local coordinate frame for a structure block. The X axis goes across the structure, while the Y axis goes along the structure.
</div>
#### Structure Parts
A PV structure group is composed of several elementary parts.
Each part has a **shape** and **dimensions**.
The various parts are described in this section.
##### Shape options
All structural members support three cross-section profiles:
All structural members support three cross-section profiles.
The parameter files under
`INPUTS/HARDWARE/STRUCTURES/` hold all the parameters related to parts.
Depending on the chosen cross-section shape, only the relevant parameters will be used
in the structure design, e.g. if the poles are defined as having a "square" cross-section shape, only the
"PoleSide" parameter will be used while "PoleWidth", "PoleHeight" and "PoleRadius" will be ignored.
Table 3 lists the shape type and dimension parameters associations.
Table 3 - Cross-section shape type and associated dimensions.
| Shape | Parameters used |
|---|---|
|-------------|-------------------|
| `Square` | `Side` |
| `Rectangle` | `Width`, `Height` |
| `Cylinder` | `Radius` |
###### Poles
##### Poles
Vertical posts that carry the entire structure.
Table 4 - Parametrization of posts.
| Parameter | Unit | Description |
|---|---|---|
| `PoleShape` | — | Cross-section type: `Square`, `Rectangle`, or `Cylinder` |
| `PoleSide` | meters | Side length (square profile) |
| `PoleWidth` / `PoleHeight` | meters | Width and height (rectangular profile) |
| `PoleRadius` | meters | Radius (cylindrical profile) |
| `PoleLength` | meters | Total pole length along Z |
![Structure types](uploads/structure/Rectangular_Pole.png)
figure 4 - Show a pole with a rectangular PoleShape and how parameters PoleWidth, PoleHeight and PoleLength are used to define the dimensions of the pole.
<div align="center">
Figure 8 - Pole with rectangular PoleShape. PoleWidth, PoleHeight and Length are
highlighted (note: the pole length is automatically derived from other parameters and is not input by the user).
</div>
###### Purlins
##### Purlins
Horizontal beams running along the **Y axis**, connecting poles and supporting panels from below.
Table 5 - Parametrization of purlins.
| Parameter | Unit | Description |
|---|---|---|
| `PurlinShape` | — | Cross-section type |
......@@ -158,12 +240,16 @@ Horizontal beams running along the **Y axis**, connecting poles and supporting p
![Structure types](uploads/structure/Rectangular_Purlin.png)
figure 5 - Show a purlin with a rectangular PurlinShape and how parameters PurlinWidth, PurlinHeight and PurlinLength are used to define the dimensions of the purlin.
<div align="center">
Figure 9 - Purlin with rectangular PurlinShape. PurlinWidth and PurlinHeight are highlighted. The purlin length is automatically derived from the structure group spacing along Y.
</div>
###### Rafters
##### Rafters
Beams oriented along the **X axis**, used to carry purlins or panels across the span.
Table 6 - Parametrization of rafters.
| Parameter | Unit | Description |
|---|---|---|
| `RafterShape` | — | Cross-section type |
......@@ -173,59 +259,101 @@ Beams oriented along the **X axis**, used to carry purlins or panels across the
![Structure types](uploads/structure/Rectangular_Rafter.png)
figure 6 - Show a rafter with a rectangular Raftershape and how parameters RafterWidth, RafterHeight and RafterLength are used to define the dimensions of the rafter.
<div align="center">
Figure 10 - Rafter with rectangular RafterShape. RafterWidth, RafterHeight and
RafterLength are highlighted.
</div>
##### Horizontal bars
###### Diagonals
Horizontal bars are used exclusively by the Agrivoltaic Fence structure. They are attached to each pole at heights derived from the `Height` parameter and the panel layout. Their cross-section shape and dimensions are controlled by the `Purlin*` parameters (`PurlinShape`, `PurlinRadius`, etc.).
##### Diagonals
Diagonal bracing bars connecting two poles to stiffen the structure against lateral loads.
Figure 11 highlights how diagonals are built in a PV table structure.
Table 7 - Parametrization of diagonals.
| Parameter | Unit | Description |
|---|---|---|
|------------------------------------------------------------------------|--------|-----------------------------------------------------|
| `DiagonalShape` | — | Cross-section type |
| `DiagonalSide` / `DiagonalWidth` / `DiagonalHeight` / `DiagonalRadius` | meters | Profile dimensions |
| `DiagonalEpsilon` | — | Small numerical offset to avoid degenerate geometry |
---
#### Structure types
#### Positioning and Spacing
Three structure types are available. The active type is set with `StructureType`:
These parameters control where panels and structure groups are placed in space.
```yaml
StructureType:
Value: PV Table
```
Table 8 - Parameters used to configure the layout of a structure. The "File" column
indicates in which file each parameter can be found.
| File | Parameter | Unit | Description |
|------------|---------------------------------|---------|--------------------------------------------------------------------------------------------------|
| AV_CENTRAL | `Height` | meters | Base elevation of the panel array above the ground |
| AV_CENTRAL | `TiltY` | degrees | Tilt angle of the panels around the Y axis |
| STRUCTURE | `PoleSpacingX` | meters | Total distance between the two poles along X |
| STRUCTURE | `PoleGroundPositioning` | meters | Vertical offset relative to ground level (0 = flush, negative = buried) |
| STRUCTURE | `NumberOfStructureGroups` | — | Number of elementary groups assembled to form one structure block |
| STRUCTURE | `RepetitionDistanceGroupYMode` | — | `auto`: group spacing is derived from the panel layout; `manual`: uses `RepetitionDistanceGroupY` |
| STRUCTURE | `RepetitionDistanceGroupY` | meters | Explicit spacing between structure groups along Y (only used when mode is `manual`) |
---
| ![PV Table](uploads/structure/PV_table_nice.png) | ![HSATS](uploads/structure/HSATS_nice.png) | ![AV fence](uploads/structure/AV_fence_nice.png) |
|---|---|---|
| (a) | (b) | (c) |
#### Parameter validation per structure type
Each structure type validates a specific set of required parameters at startup:
if any required key is missing from the aggregated YAML inputs, PASE raises a
`ValueError` before the simulation begins.
Parameters that are irrelevant to a given structure type — for example, diagonal
parameters for HSATS, or rafter and tilt parameters for the Agrivoltaic Fence —
are optional and fall back to zero if omitted from the YAML.
The safest approach is to copy the provided example YAML for the chosen structure
type (e.g. `INPUTS/HARDWARE/STRUCTURES/PV_table.yaml`) and adjust values from
there. All parameters in those files are either required or carry a meaningful
non-zero default for that structure type.
---
#### Structure types
Three structure types are available.
The active type is set with parameter `StructureType`.
The following subsections detail how each structure type can be parametrized.
---
Figure 7 - Three structure types available in PASE : (a) PV table ; (b) Horizontal Single Axis Tracker ; (c) Agrivoltaic Fence.
##### PV Table
**Description:** A fixed, tilted table structure. Two poles of different heights support a tilted rafter, with diagonal bracing and horizontal purlins.
A fixed, tilted table structure.
Two poles of different heights support a tilted rafter, with diagonal bracing and horizontal purlins.
**How it works:**
- Two poles per bay — one taller (high side) and one shorter (low side) — create the tilt.
- A rafter sits on top of both poles at the tilted angle.
- Purlins run horizontally along Y to support the panels.
- Purlins rest on the rafters and run horizontally along Y to support the PV modules.
- A diagonal brace connects the two poles for rigidity.
**Key parameters:**
| Parameter | Default | Description |
|---|---|---|
| `TiltY` | — | Tilt angle of the table (°). Combined with `PoleSpacingX` it determines the pole height difference. |
| `PoleSpacingX` | 0.2 m | Total distance between the two poles along X |
| `RafterLength` | 3.8 m | Minimum rafter length (auto-adjusted if too short for the tilt) |
| `NumberOfPurlins` | 5 | Purlins distributed evenly across the rafter span |
| Parameter | Description |
|---|---|
| `TiltY` | Tilt angle of the table (°). Combined with `PoleSpacingX` it determines the pole height difference. |
| `PoleSpacingX` | Total distance between the two poles along X |
| `RafterLength` | Minimum rafter length (auto-adjusted upward if the tilt geometry requires a longer rafter) |
| `NumberOfPurlins` | Number of purlins distributed evenly across the rafter span |
> If `TiltY` is too large relative to `Height` and `PoleSpacingX`, the structure will extend below ground.
> PASE will raise a `ValueError` in that case.
> ⚠️ If `TiltY` is too large relative to `Height` and `PoleSpacingX`, the structure will extend below ground. PASE will raise a `ValueError` in that case.
TODO link to example pv table (py script, yaml files).
**Example YAML snippet (`PV_table.yaml`):**
......@@ -236,44 +364,46 @@ Material:
Value: Wood
PoleShape:
Value: square
PoleLength:
Value: 3.8
PoleSpacingX:
Value: 2.0
NumberOfPurlins:
Value: 5
NumberOfRafters:
Value: 2
```
![PV Table](uploads/structure/PVTable.png)
Figure 8 - PV Table structure groups. PV tables have diagonals that start from the smallest pole of the group and end at the largest pole of the group. The length and angle of the diagonals are calculated automatically.
<div align="center">
Figure 11 - PV Table structure groups.
PV tables have diagonals that start from the smallest pole of the group and end at the largest pole of the group.
The length and angle of the diagonals are calculated automatically.
</div>
![TiltY](uploads/structure/TiltY.png)
Figure 9 - TiltY parameter : the tilt angle of the PV modules (and rafters/purlins depending on the type).
<div align="center">
Figure 12 - TiltY parameter : the tilt angle of the PV modules (and rafters/purlins depending on the type).
</div>
---
##### HSATS
**Description:** Horizontal Single-Axis Tracking Structure. A central pole supports a rotating frame that can track the sun along one axis.
Horizontal Single-Axis Tracking Structure.
A central pole supports a rotating frame that can track the sun along one axis.
**How it works:**
- A single central pole is placed at the base height.
- Purlins run along X, rafters run along Y — together they form a flat frame that can be tilted.
- Purlins run along Y, rafters run along X — together they form a flat frame that can be tilted.
- No diagonal brace is used.
**Key parameters:**
| Parameter | Default | Description |
|---|---|---|
| `PoleRadius` | 0.1 m | Cylindrical pole (default shape: `Cylinder`) |
| `NumberOfPurlins` | 5 | Purlins distributed across the rafter span |
| `NumberOfRafters` | 3 | Rafters distributed across the purlin span |
| `RafterLength` | 1.8 m | Length of each rafter along X |
| Parameter | Description |
|---|----------------------------------------------------------------------------------------------------------|
| `PoleShape` / `PoleRadius` / `PoleSide` / `PoleWidth` / `PoleHeight` | Cross-section shape and dimensions of the central pole |
| `NumberOfPurlins` | Number of purlins distributed across the rafter span (along X) |
| `NumberOfRafters` | Number of rafters distributed across the purlin span (along Y) |
| `RafterLength` | Length of each rafter along X; must cover the panel span (minus panel height to allow for some overhang) |
**Example YAML snippet (`HSATS.yaml`):**
......@@ -282,42 +412,53 @@ StructureType:
Value: HSATS
Material:
Value: Metal
RafterShape:
Value: Cylinder
RafterRadius:
Value: 0.1
PoleShape:
Value: Rectangle
PoleWidth:
Value: 0.2
PoleHeight:
Value: 0.2
PurlinShape:
Value: Cylinder
PurlinRadius:
Value: 0.1
Value: 0.05
NumberOfPurlins:
Value: 5
Value: 2
RafterShape:
Value: Square
RafterSide:
Value: 0.1
NumberOfRafters:
Value: 3
Value: 5
```
![HSATS](uploads/structure/HSATS.jpg)
Figure 10 - HSATS structure with highlighting objects representing the different components. This object represent a group you can duplicate along the X axis and Y axis to form a full AV system.
<div align="center">
Figure 13 - HSATS structure with highlighted objects representing the different components.
This object represents one group; groups are repeated along the Y axis to form a full AV system.
</div>
---
##### Agrivoltaic Fence
**Description:** A fence-like structure where panels are mounted vertically or near-vertically between posts.
A fence-like structure where panels are mounted vertically between posts.
It is possible to apply a tilt value to the panels to simulate the effect of wind on free hanging panels.
Note that this structure type was designed to canonically have 2 PV modules in the X axis of a block.
Other values will produce erroneous geometries.
**How it works:**
- A single vertical pole per bay is placed along Y.
- Two horizontal bars are attached to each pole — one at `StructureHeight`, one offset downward by `RepetitionDistanceOfPanelsX`.
- Two horizontal bars are attached to each pole at heights derived from the Height parameter, the panel dimensions
and the panel pitch (`RepetitionDistanceOfPanelsX`).
- A terminal end-post closes the last bay.
**Key parameters:**
| Parameter | Default | Description |
|---|---|---|
| `StructureHeight` | 3.3 m | Height of the top horizontal bar |
| `PoleLength` | 3.8 m | Total pole length (should exceed `StructureHeight`) |
| `PoleGroundPositioning` | -0.5 m | Buries the pole base 0.5 m underground for stability |
| `StructureSpacingY` | 5.0 m | Spacing between fence bays |
| Parameter | Description |
|---|---|
| `PoleGroundPositioning` | Vertical offset of the pole base relative to ground level (negative = buried) |
**Example YAML snippet (`agrivoltaic_fence.yaml`):**
......@@ -330,23 +471,26 @@ PoleShape:
Value: Cylinder
PoleRadius:
Value: 0.1
PoleLength:
Value: 3.8
PoleGroundPositioning:
Value: -0.5
StructureHeight:
Value: 3.3
StructureSpacingY:
Value: 5.0
```
![Agrivoltaic Fence](uploads/structure/AgriFence.png)
Figure 11 - Agrivoltaic Fence Structure : the poles remain vertical and tilt is
<div align="center">
Figure 14 - Agrivoltaic Fence Structure : the poles remain vertical and tilt is
applied to the PV modules to simulate the effect of wind.
</div>
---
#### Structure material
Currently, the Material property is used to apply a color to the structures. Use :
- "Metal" for grey structures
- "Wood" for brown structures
## Weather data
......
......