Crops and Ground Classes#
The crop model grows the crop of each field by degree-days and records the plants that the wheels, the vehicle body and the cutter change. The ground classes tell each wheel which surface and which soil are at its contact point.
Scope and Assumptions#
The crop equations are in the namespace AcresFarm of AcresFarmModel.cpp. They are an engine-free model.
The class FAcresFarmRuntime holds the crop patches, the ruts and the field marks of a session. The class AcresSim::FSurfaceMap gives the surface classes.
- A crop grows only by thermal time with a water stress factor. The model has no radiation, no leaf area, no roots and no nitrogen.
- All plants of a field have the same growth.
- A crushed plant does not recover.
- The crop values are estimates for a scenario. They have no calibration against ACRE yields.
- Soybean ignores the length of the day.
- The crop does not change the tyre forces. It changes the sensors, the events and the scores of a task.
Symbols#
| Symbol | Quantity | Unit |
|---|---|---|
| \(T_{min}, T_{max}\) | Low and high air temperature of the day | °C |
| \(T_b, T_c\) | Base temperature and upper limit of the crop | °C |
| \(g_d\) | Degree-days of one day | °C·day |
| \(\Gamma\) | Degree-day sum of a field | °C·day |
| \(\Gamma_m\) | Degree-day sum at maturity | °C·day |
| \(G\) | Growth fraction | 0 to 1 |
| \(s_w\) | Water stress factor | 0 to 1 |
| \(\bar\theta, \bar h\) | Mean water content and mean pond depth of the field | m³/m³, m |
| \(Y\) | Yield of a mature crop | kg/m² |
| \(H_p\) | Height of a full-grown patch | m |
| \(a_s\) | Area of one sample, 1.52 / 16 = 0.095 | m² |
| \(p\) | Mean contact pressure of a tyre | Pa |
| \(z_w\) | Sinkage of a tyre | m |
Crop Kinds and Patches#
AcresCrops.h defines three crop kinds.
| Kind | Name | Cover Code | Base Temperature | Upper Limit | Maturity | Yield |
|---|---|---|---|---|---|---|
| 0 | corn |
1 | 10 °C | 30 °C | 1400 °C·day | 1.1 kg/m² |
| 1 | soybean |
2 | 10 °C | 30 °C | 1100 °C·day | 0.35 kg/m² |
| 2 | potato |
9 | 7 °C | 29 °C | 1300 °C·day | 4.0 kg/m² |
The four values of a crop are \(T_b\), \(T_c\), \(\Gamma_m\) and \(Y\). The cover code is the value in ACRE/cover.u8. Soil Water uses it for the roughness and the detention of a cell.
Potato has the code 9, after gravel, thus the older codes keep their meaning.
The crop of a field is a set of patches. One patch is a block of plants of 1.52 m × 1 m. A patch has 4 × 4 samples. The sample \((i, j)\) has the bit \(4j + i\) of two 16-bit masks: crushed and harvested.
\((x_p, y_p)\) is the origin of the patch. The patches are parallel to the axes of the grid. A sample is in one mask at most. A set bit stays until a replant or a restore of the field. The model has no row objects. The plant rows are part of the patch mesh.
The level contains the patches of the surveyed crop fields. FAcresFarmRuntime::Initialize generates the patches of the other planted fields.
- Put a patch at each point of a 1.52 m × 1 m grid in the bounds of the field polygon.
- Keep the patch when its four corners, with a margin of 0.38 m, are in the polygon.
- Remove the patch when the surface class at its centre is not
field.
The shipped map with the 2026 season has 705 070 patches. The surface map removes 7 677 patches on lanes and verges. A hash grid with 4 m cells finds the patches near a point.
Crop Season and Start Growth#
The crop season gives the crop and the planting date of each field. The option -CropSeason= selects it. The default is 2026.
| Season | Source | Result |
|---|---|---|
2026 |
ACRE/crops_2026.json |
28 corn fields, 19 soybean fields, 12 fields without a crop. |
legacy |
ACRE/fields.json |
The surveyed crop of each field. A field with the cover unassigned gets corn. |
The season file also contains the daily low and high air temperature from 1 April 2026 for 244 days. The first 178 days are measurements of the Purdue Mesonet station ACRE. The other days are means of the years 2023 to 2025.
The field setup can then change the crop of a planted field or remove it. See Field Setup.
The start growth has three sources.
| Option | Start Growth |
|---|---|
| None | \(G = 1\) for all planted fields. The crop is mature. |
-FarmInitialGrowth= |
The same fraction for all planted fields. Range 0 to 1. |
-CropStage=date |
The growth of each field from its planting date to the date of the session. |
With -CropStage=date the start sum is the sum of the daily degree-days of the season file, without water stress.
\(d_p\) is the planting day and \(d_s\) is the day of the session date.
The option -FarmInitialGrowth= has priority. The option -CropStage=date needs a season file.
For the date 1 July 2026, most corn fields start with a growth of 0.38. The range of all planted fields is 0.00 to 0.43. See Set Soil and Weather.
Growth by Degree-Days#
AcresFarm::DegreeDays is the modified degree-day method. It limits the maximum to \(T_c\) and the minimum to \(T_b\).
The default day of 16 °C to 28 °C gives 12 °C·day for corn and soybean and 15 °C·day for potato. At that rate, corn is mature after 117 days, soybean after 92 days and potato after 87 days.
FAcresFarmRuntime::Advance adds the degree-days in steps of \(\Delta t = 10\) s of environment time.
\(T_{min}\) and \(T_{max}\) are the DayLowC and DayHighC of the weather model. The step divides the degree-days of the day equally.
The water stress uses the mean water content of the field from the water snapshot. \(\theta_{wp}\) and \(\theta_{fc}\) are the values of the soil unit that has the most soil cells in the field.
The growth is at its full rate while half or more of the available water remains. It stops at the wilting point. A field with a mean pond of more than 1 cm grows at half the rate.
AcresFarm::Growth gives the growth fraction.
Each field also has a second sum, the thermal time. It uses the soybean values and the same stress, for planted and empty fields. The seedlings of the seed drill use it. See Implement Mechanics.
Growth Stages, Height and Yield#
The model has no named growth stages. The code uses these limits of \(G\).
| Growth | Effect |
|---|---|
| \(G \le 0.02\) | Wheels and the body do not crush the plants. |
| \(0.02 < G < 1\) | Wheels and the body can crush the plants. The cutter takes nothing. |
| \(G = 1\) | The crop is mature. The cutter can harvest it. |
The height of the plants of a patch follows the growth. \(H_p\) is the height of the patch mesh with the scale of the patch.
The mass of a crop is its yield only. Each sample of a mature crop gives \(a_s\,Y\).
| Crop | Mass of One Sample | Mass of One Patch |
|---|---|---|
| Corn | 0.105 kg | 1.67 kg |
| Soybean | 0.033 kg | 0.53 kg |
| Potato | 0.380 kg | 6.08 kg |
The export reports a standing yield for each field. \(n_u\) is the number of samples that still stand.
Crush by Wheels and Body#
FAcresFarmRuntime::Wheel runs for each wheel that touches the ground, in each physics step. It makes a footprint rectangle at the contact point.
| Side | Size |
|---|---|
| Width, across the direction of travel | The width of the tyre. |
| Length, along the direction of travel | \(\max(0.15,\ A_c / b) + \lvert v \rvert\,\Delta t\), with the contact area \(A_c\) and the tyre width \(b\). |
FAcresFarmRuntime::Stamp finds the samples in the rectangle. \((f_x, f_y)\) is the unit direction of travel and \((d_x, d_y)\) is the vector from the centre to the sample.
The stamp ignores a patch that is more than 1 m above or below the contact point. A tyre crushes the samples when \(p > 10\) kPa and \(G > 0.02\).
AcresFarm::Crush sets the bits of the samples that still stand. Each new bit adds \(a_s\) to the crushed area.
A second pass on the same sample adds nothing.
FAcresFarmRuntime::Body runs one time in each physics step when all four wheels are on the ground and the speed is above 0.05 m/s.
It crushes the plants that are higher than the clearance below the body. It has no pressure limit.
| Value | Maxxum | Polaris |
|---|---|---|
| Clearance \(c_b\) | 0.55 m | 0.33 m |
| Front overhang | 0.9 m | 0.55 m |
The body footprint is as wide as the track plus the width of the wider tyres. Its length is the wheelbase plus the front overhang plus the distance of the step. Low plants thus go below the body, and the vehicle marks them only in its wheel tracks.
Harvest by the Cutter#
The cutter is a simple attachment at the side of the tractor. It is not a model of a real machine. The option -FarmHarvester installs it.
The H key or the option -FarmHarvestOn starts it.
FAcresFarmRuntime::Cut harvests in a physics step when all of these conditions are true.
- The engine speed is 1200 rpm or more.
- The forward speed is between 0.05 m/s and 4 m/s.
- The bunker has room.
The cutter stamps a rectangle of the cutter width × 0.8 m at the position of the header.
AcresFarm::Harvest takes the samples in bit sequence. It takes a sample when the crop is mature, the sample still stands and its mass fits in the bunker.
The cutter does not take potato. The potato digger takes only potato, and it also lifts the samples that a wheel crushed.
The game uses the digger when the implement type of tractor.json is potato_digger.
While the cutter runs, it adds its power to the PTO load. The load increases from 0 at 900 rpm to the full value at 1200 rpm. The mass in the bunker adds to the mass of the tractor. The U key empties the bunker when the tractor stands. The N key plants the field below the tractor again: it clears the masks and sets \(\Gamma = 0\).
Field Setup#
A field setup changes the crop, the soil, the start wetness and the terrain of single fields for one session.
The menu writes it from the tab Fields. The option -FieldSetup=<folder> loads it. FAcresFieldSetup::Active gives it to all models.
The folder contains field-setup.json and, with terrain edits, terrain-edits.f32.
{
"schema": "acres-field-setup-1",
"fields": [
{"field": 21, "crop": "empty", "soil": "loamy_sand", "wetness": 0.58}
]
}
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
field |
integer | The field number, 1 to 59. | ||
crop |
string | "" |
"" keeps the crop. corn, soybean or potato changes it. empty removes it. Planted fields only. |
|
soil |
string | ssurgo |
ssurgo, the id of a preset, or custom. |
|
ks_mm_h |
number | mm/h | 30 | \(K_s\) of a custom soil. Minimum 0.01. |
ks_sealed_mm_h |
number | mm/h | 3 | \(K_{seal}\) of a custom soil. Range 0.01 to \(K_s\). |
suction_m |
number | m | 0.17 | \(\psi\) of a custom soil. Range 0.01 to 1. |
saturated |
number | m³/m³ | 0.50 | \(\theta_s\) of a custom soil. Range 0.25 to 0.6. |
field_capacity |
number | m³/m³ | 0.33 | \(\theta_{fc}\) of a custom soil. Range 0.05 to \(\theta_s - 0.02\). |
wilting |
number | m³/m³ | 0.13 | \(\theta_{wp}\) of a custom soil. Range 0.01 to \(\theta_{fc} - 0.02\). |
wetness |
number | −1 | The start wetness. A negative value uses the global fraction. |
Soil Water gives the effect of the soil values and of the wetness.
Soil Presets#
A preset replaces the hydraulic values of the field. FAcresFieldSetup::SoilPresets contains the table.
The columns Open and Sealed are the conductivities \(K_s\) and \(K_{seal}\) in mm/h. The suction \(\psi\) is in m. The water contents \(\theta_s\), \(\theta_{fc}\) and \(\theta_{wp}\) are in m³/m³.
| Id | Open | Sealed | Suction | Saturation | Field Capacity | Wilting Point |
|---|---|---|---|---|---|---|
sand |
360 | 210 | 0.049 | 0.437 | 0.091 | 0.033 |
loamy_sand |
150 | 61.1 | 0.061 | 0.437 | 0.125 | 0.055 |
sandy_loam |
100 | 25.9 | 0.110 | 0.453 | 0.207 | 0.095 |
loam |
40 | 13.2 | 0.089 | 0.463 | 0.270 | 0.117 |
silt_loam |
33 | 6.8 | 0.167 | 0.501 | 0.330 | 0.133 |
silty_clay_loam |
15 | 1.5 | 0.273 | 0.471 | 0.366 | 0.208 |
clay_loam |
12 | 2.3 | 0.209 | 0.464 | 0.318 | 0.197 |
clay |
4 | 0.6 | 0.316 | 0.475 | 0.396 | 0.272 |
The water contents and \(K_{seal}\) are texture means from Rawls, Brakensiek and Saxton (1982). \(\psi\) is from Rawls, Brakensiek and Miller (1983). \(K_s\) is a typical survey value for each texture.
Each preset apart from clay_loam has a soil library class with the same id.
Such a preset also sets the soil of the tyre-soil model in that field. See Surface Classes.
Terrain Edits#
A terrain edit is a height offset at each node of the survey grid, in metres. The file has 1001 × 1001 values of 32 bits. The brush of the menu changes only the nodes in the polygon of one field. The limit is ±1 m.
| Brush Mode | Change of the Offset in One Update |
|---|---|
| Raise, lower | Rate × time × weight. |
| Smooth | Moves the surface to the mean of its four neighbours by \(\min(1,\ 6\,\Delta t\,w)\) of the difference. |
| Flatten | Moves the surface to the height at the start of the stroke by \(\min(1,\ 3\,\Delta t\,w)\) of the difference. |
The weight \(w\) is a smooth step from 1 at the centre of the brush to 0 at its radius.
FAcresFieldSetup::DeltaAt interpolates the offset on the two triangles of each survey cell, the same as the terrain.
The wheel contacts, the bed of the water grid, the crop patches and the rendered ground use the edited height. The collision of the vehicle body uses the terrain without the edits. The limit of 1 m keeps that safe.
Surface Classes#
The surface map gives one of seven surface classes at a point. The enumeration is ESurfaceClass in AcresSurfaceMap.h.
| Class | Name | Default Priority | Surface Template | Ground |
|---|---|---|---|---|
| 0 | field |
0 | dry_soil |
Field soil. All ground without a polygon. |
| 1 | asphalt |
60 | asphalt |
Paved road or lot. |
| 2 | concrete |
55 | concrete |
Concrete pad, apron or lot. |
| 3 | gravel |
40 | gravel |
Gravel road, lane or yard. |
| 4 | grass_lane |
20 | sod_lane |
Mown grass lane with traffic. |
| 5 | grass |
10 | sod |
Mown grass without traffic: verges and lawns. |
| 6 | dirt |
30 | dirt_track |
Bare dirt track. |
Surface Map#
The file ACRE/surface_polygons.json contains 521 polygons: 33 asphalt, 22 concrete, 139 gravel, 78 grass lane, 236 grass and 13 dirt.
Each polygon has a class, a priority, an outer ring and optional holes. The coordinates in the file are Unreal centimetres.
FSurfaceMap::ClassAt uses these rules.
- A point is in a polygon when it is in the outer ring and not in a hole. The test is the even-odd rule.
- The polygon with the highest priority gives the class.
- For equal priorities, the polygon that is later in the file gives the class.
- A point in no polygon has the class
field.
FSurfaceMap::Build puts the polygons into a grid of 2 m buckets. Each bucket holds its polygons in the sequence of rules 2 and 3.
A query examines one bucket and stops at the first polygon that contains the point.
The tool that makes the ground textures uses the same rules, thus the image and the physics agree.
Without the polygon file, the game uses ACRE/surfaces.u8. That file has one template code from 0 to 5 for each 1.524 m survey cell.
Surface Templates#
AAcresVehiclePawn::SampleSurface copies the template of the class from the block surfaces of tractor.json.
| Template | Soil | Friction | Rolling | Traffic Compaction | Root Cohesion |
|---|---|---|---|---|---|
asphalt |
No | 0.9 | 0.015 | ||
concrete |
No | 0.85 | 0.012 | ||
gravel |
No | 0.65 | 0.035 | ||
dry_soil |
Yes | 0 | 0 Pa | ||
sod_lane |
Yes | 0.6 | 3000 Pa | ||
sod |
Yes | 0.2 | 6000 Pa | ||
dirt_track |
Yes | 0.7 | 0 Pa |
On a hard surface the friction model uses the friction and the rolling resistance of the template. On soil the tyre-soil model uses the soil library class. The traffic compaction gives the density between the firm and the maximum density of the class. The root cohesion adds strength to a sod. Tyre and Soil gives the equations.
The templates wet_soil and mud are not classes of the map. The driver selects them with the keys 1 to 6. The 0 key goes back to the map.
Soil of a Wheel on a Soil Surface#
AAcresVehiclePawn::SoilLibraryClassAt selects the soil library class in this sequence.
- The field of the contact point has a preset with a library class: that class.
- The key
soil.classoftractor.jsonisauto: the class of the texture group of the soil unit below the wheel. - The key
soil.classis the id of a class, or the option-VehicleSoilClass=gives one: that class for all soil. - No class: the constant soil values of the block
soiloftractor.json.
The texture group comes from the wilting point of the soil unit (TextureFromWilting).
| Wilting Point | Texture Group | Soil Library Class |
|---|---|---|
| 0.19 or more | Fine | silty_clay_loam |
| Between 0.10 and 0.19 | Medium | silt_loam |
| 0.10 or less | Coarse | sandy_loam |
On the ACRE tile, the units Pg, Cm, Mu, Md and Pk are fine. All other units are medium.
A field with a custom soil or with the preset clay_loam uses the texture group of its own wilting point.
Then the farm fills the water content, the wetness, the pond depth and the rut depth. See Soil Water. A wheel on a tilled cell uses the loose density of its class, without traffic compaction and without root cohesion.
Ground Classes of the Scouting Map#
The scouting map has its own ground classes for the scores of the scouting task. The file is Acres/Content/Simulation/ACRE/Scouting/ground_classes.u8.
It has 3048 × 3048 cells of 0.5 m. Row 0 is at the north edge of the tile.
| Code | Class |
|---|---|
| 0 | Crop |
| 1 | Lane |
| 2 | Verge |
| 3 | Edge band |
| 4 | Obstacle |
| 5 | Other |
Only ACRES Core reads this file (FAcresWorldOptions::GroundClassesFile). It uses the classes as zones.
When a stamp crushes a sample, Core adds the area of the sample to the zone at the position of the sample.
The game does not read the file. It gives the crushed area in an edge band from the distance to the field polygon.
Scouting Map gives the content of the map.
Farm Events, Stamps and Marks#
Marks#
The marks are the changes that the vehicles leave on the farm. They are the state of the session, not of an episode.
| Mark | Storage | Written By |
|---|---|---|
| Crushed and harvested samples | Two masks for each patch | Wheel, Body, Cut |
| Ruts | Rut depth for each 0.25 m cell | Wheel |
| Field work | Bits for each 0.25 m cell: 1 tilled, 2 seeded, 4 sprayed | Work |
| Pits and spoil | Height offset for each 0.25 m cell | Dig, Spoil |
- A new session starts with fresh fields.
- A reset of a vehicle keeps the marks. A client must ask for a restore to clear a field.
FAcresFarmRuntime::RestoreFieldIdclears the masks, the ruts and the field work of one field. It keeps the growth.- The export saves the marks in
farm-state.jsonandfarm-field.bin. The option-FarmLoad=loads them.
Implement Mechanics gives the field work, the pits and the spoil.
Event Log of the Farm#
The farm writes one line for each event into farm-events.csv of the session folder. The columns are environment_time_s, action, field and quantity.
| Action | Quantity |
|---|---|
crush_m2 |
Area that one stamp crushed in one patch, m². |
harvest_kg |
Mass that the cutter took from one patch, kg. |
reseed |
0. The field has a new crop. |
restore |
Number of rut and relief cells that the restore removed. |
load |
0. The farm loaded a saved state. |
A session with the Maxxum at one position in mature corn gave 18 crush_m2 lines with a sum of 10.355 m².
Events and Stamps in the Episode Log#
While an episode log records, the farm also queues events and stamps for it.
An event is one change of the farm. A stamp is one call of Wheel or Body with its arguments.
| Event Kind | Name | Content |
|---|---|---|
| 1 | Crop crushed | The patch index, the new sample bits and the area. |
| 2 | Crop harvested | The patch index, the new sample bits and the area. |
| 3 | Cell worked | The cell centre, the new work bits and the cell area. |
| 4 | Rut | The cell centre and the new rut depth. One event for each 5 mm. |
| 5 | Field restored | The field number. |
Each event and each stamp has the agent and the physics step. The messages are FarmEvent and FarmStamp of the package acres_interfaces.
An episode replay repeats the stamps with Wheel and Body. It applies the other events with FAcresFarmRuntime::ApplyLogEvent.
Episode Log gives the channels.
Field State#
FAcresFarmRuntime::FieldStats gives the ground truth of each field.
The values are the areas of the crop, of the crushed crop, of the harvested crop and of the field work.
The mean water content, the mean pond and the rut area complete the list.
The rut area counts the cells with a rut deeper than 1 cm. The simulator control channel sends it with the operation farm_state.
Farm State in ACRES Core#
ACRES Core keeps the crop patches, the growth of each field and the surface map in its shared world.
Each environment has its own FAcresFarmState with the crushed masks and the ruts.
It uses the same rules for the wheel stamp, the body stamp and the ruts. It has no cutter and no field work.
Crop and Ground Visuals#
The class FAcresSoilVisuals draws the state of the farm. It does not change the physics.
- The height of each patch has the scale \(\max\bigl(0.015,\ (0.03 + 0.97\,G)\,(1 - 0.88\,c_c - 0.97\,c_h)\bigr)\). \(c_c\) and \(c_h\) are the crushed and the harvested fractions of the patch.
- Crushed plants tilt in the direction of travel of the vehicle, by a maximum of 70°.
- Near the vehicle, tiles of 16 m with a resolution of 0.25 m replace the terrain. They show the ruts, the pits, the spoil and the field work.
- A texture with one pixel for each 4 m cell gives the wetness and the pond depth to the ground material.
- Mud, dust and water drops are particles without mass. A maximum of 512 of each kind exist at one time.
The game applies a maximum of 1024 patch changes in each frame. Under simulator control it applies all changes in the same frame.
Parameters#
farm.json, Blocks crops and harvester#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
crops.<crop>.base_c |
number | °C | 10, 10, 7 | \(T_b\) of corn, soybean, potato. |
crops.<crop>.cap_c |
number | °C | 30, 30, 29 | \(T_c\) of corn, soybean, potato. |
crops.<crop>.maturity_gdd_c |
number | °C·day | 1400, 1100, 1300 | \(\Gamma_m\) of corn, soybean, potato. |
crops.<crop>.yield_kg_m2 |
number | kg/m² | 1.1, 0.35, 4.0 | \(Y\) of corn, soybean, potato. |
harvester.width_m |
number | m | 3 | The width of the cutter. Maximum 12. |
harvester.offset_x_m |
number | m | −3.2 | The position of the header along the tractor, forward positive. |
harvester.offset_y_m |
number | m | 2.5 | The position of the header across the tractor, right positive. |
harvester.pto_kw |
number | kW | 35 | The PTO power of the cutter. |
harvester.bunker_capacity_kg |
number | kg | 600 | The capacity of the bunker. Maximum 2000. |
harvester.potato_digger.offset_x_m |
number | m | −2.9 | The position of the digger along the tractor. |
harvester.potato_digger.offset_y_m |
number | m | 0 | The position of the digger across the tractor. |
harvester.potato_digger.pto_kw |
number | kW | 20 | The PTO power of the digger. |
harvester.potato_digger.bunker_capacity_kg |
number | kg | 1500 | The capacity of the hopper. |
Command-Line Options#
| Name | Type | Unit | Default | Description |
|---|---|---|---|---|
-CropSeason= |
string | 2026 |
The crop season: 2026 or legacy. |
|
-CropStage= |
string | mature |
date grows each field from its planting date to the session date. |
|
-FarmInitialGrowth= |
number | 1 | The start growth of all planted fields. Range 0 to 1. | |
-FarmGeneratedCrops= |
boolean | true | 0 does not generate patches for fields without surveyed patches. |
|
-FieldSetup= |
path | The folder of the field setup. | ||
-FarmHarvester |
flag | off | Installs the cutter. | |
-FarmHarvestOn |
flag | off | Starts the session with the cutter on. | |
-FarmLoad= |
path | Loads the farm-state.json of a saved session. |
||
-FarmFresh |
flag | off | A replay does not load the start state of its session. | |
-FarmDisabled |
flag | off | Starts the session without the farm. | |
-VehicleSoilClass= |
string | from tractor.json |
The soil library class for all soil, or auto. |
|
-VehicleSurface= |
string | mapped |
One surface template for all ground, or mapped for the surface map. |
Constants in the Code#
| Constant | Value | Description |
|---|---|---|
| Patch size | 1.52 m × 1 m | The area of one patch is 1.52 m². |
| Sample grid | 4 × 4 | 0.38 m along X and 0.25 m along Y. |
| Crush pressure | 10 kPa | The minimum contact pressure of a tyre that crushes. |
| Crush growth | 0.02 | The minimum growth of a crop that a vehicle can crush. |
| Cutter engine speed | 1200 rpm | The minimum engine speed of the cutter. |
| Cutter speed range | 0.05 m/s to 4 m/s | The forward speed of a harvest. |
| Cutter strip length | 0.8 m | The length of the rectangle of the cutter. |
| Bucket size of the surface map | 2 m | The cell of the polygon index. |
Code Map#
| Item | File | Function |
|---|---|---|
| Crop kinds, cover codes | AcresCrops.h |
AcresCrops::Name, Cover, IsFieldCover |
| Degree-days and growth | AcresFarmModel.cpp |
AcresFarm::DegreeDays, Growth |
| Sample masks | AcresFarmModel.cpp |
AcresFarm::Crush, Harvest, Bits |
| Patches, season, start growth | AcresFarmRuntime.cpp |
FAcresFarmRuntime::Initialize |
| Growth step and stress | AcresFarmRuntime.cpp |
FAcresFarmRuntime::Advance |
| Wheel, body and cutter stamps | AcresFarmRuntime.cpp |
Wheel, Body, Cut, Stamp |
| Replant and restore | AcresFarmRuntime.cpp |
Replant, RestoreFieldId |
| Events, stamps, field state | AcresFarmRuntime.cpp |
Event, ApplyLogEvent, FieldStats, QueryPoint |
| Field setup | AcresFieldSetup.cpp |
FAcresFieldSetup::Active, SoilPresets, DeltaAt, Brush |
| Crop season | AcresFieldSetup.cpp |
FAcresFieldSetup::CropSeason, FAcresCropSeason::DegreeDaysSincePlanting |
| Surface map | AcresSurfaceMap.cpp |
FSurfaceMap::Build, ClassAt |
| Surface map file | AcresFieldSetup.cpp |
FAcresFieldSetup::SurfaceMap |
| Surface and soil of a wheel | AcresVehicle.cpp |
SampleSurface, SoilLibraryClassAt, SoilTextureAt |
| Visuals | AcresSoilVisuals.cpp |
FAcresSoilVisuals::Tick, ApplyChanges |
| Farm state of Core | Core/Source/AcresCoreFarm.cpp |
FAcresFarmState::Wheel, Body |
| Zones of Core | Core/Source/AcresCoreWorld.cpp |
FAcresWorld::Load, ZoneAt |
Limitations#
- The crop values have no calibration. Maturity and yield are estimates for a scenario.
- The degree-days of a day do not change with the hour. The growth has no daily cycle.
- The start growth of
-CropStage=datehas no water stress. - The stamp assumes that the patches are parallel to the grid axes.
- The body stamp uses one clearance for the full body. It does not show the shape of the axles.
- A field override of the crop applies only to a field that the season plants.
- The cutter is a simple rectangle. It has no losses, no grain moisture and no threshing model.
- Marks only increase in a session. Only a restore, a replant or tillage removes them.
- The surface map has no height. A bridge and the ground below it have the same class.
References#
- Allen, R. G., Pereira, L. S., Raes, D., and Smith, M. (1998). Crop evapotranspiration: guidelines for computing crop water requirements. FAO Irrigation and Drainage Paper 56. Rome: FAO.
- Nielsen, R. L. Heat unit concepts related to corn development. Corny News Network, Purdue University.
https://www.agry.purdue.edu/ext/corn/news/timeless/heatunits.html - North Dakota State University Extension. Publication A1174.
https://www.ndsu.edu/agriculture/sites/default/files/2021-11/a1174.pdf - Rawls, W. J., Brakensiek, D. L., and Miller, N. (1983). Green-Ampt infiltration parameters from soils data. Journal of Hydraulic Engineering, 109(1), 62-70.
- Rawls, W. J., Brakensiek, D. L., and Saxton, K. E. (1982). Estimation of soil water properties. Transactions of the ASAE, 25(5), 1316-1320.
- Soil Survey Staff. Soil Survey Geographic (SSURGO) database. United States Department of Agriculture, Natural Resources Conservation Service.