Skip to content

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.

Crop growth model: the weather gives the daily low and high temperature, the degree-days and the water stress give the degree-days of each field, the growth fraction sets the plant height, wheels, the vehicle body and the cutter set the sample bits of the crop patches, and the changes go into the totals and the event logs. Crop growth, crush and harvest Soil water field mean θ and pond Weather model day low and high, 10 s farm steps Degree-days modified method, base and cap Water stress factor 0 to 1, half when the field ponds Field degree-days one sum for each of the 59 fields Growth G sum / maturity, limits 0 and 1 height and harvest gate Crop patches 1.52 m × 1 m, 16 samples each Stamp samples in the footprint rectangle Sample masks crushed bits, harvested bits Totals crushed area, bunker mass Events farm-events.csv, episode log Wheels and body pressure above 10 kPa, plant above clearance Cutter mature crop only, bunker has room
The crop model: degree-days and water stress give the growth, and the stamps of the vehicles change the crop patches. Open the diagram
  • 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_{ij} = x_p + 0.38\,(i - 1.5), \qquad y_{ij} = y_p + 0.25\,(j - 1.5) \]

\((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.

  1. Put a patch at each point of a 1.52 m × 1 m grid in the bounds of the field polygon.
  2. Keep the patch when its four corners, with a margin of 0.38 m, are in the polygon.
  3. 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.

\[ \Gamma_0 = \sum_{d = d_p}^{d_s - 1} g_d\bigl(T_{min}(d),\, T_{max}(d)\bigr), \qquad G_0 = \mathrm{clamp}\!\left(\frac{\Gamma_0}{\Gamma_m},\ 0,\ 1\right) \]

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\).

\[ g_d = \max\!\left(0,\ \frac{\min(T_{max}, T_c) + \max(T_{min}, T_b)}{2} - T_b\right) \]

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.

\[ \Gamma \leftarrow \Gamma + g_d\,\frac{\Delta t}{86400}\,s_w \]

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.

\[ s_w = \mathrm{clamp}\!\left(\frac{\bar\theta - \theta_{wp}}{\max(0.01,\ 0.5\,(\theta_{fc} - \theta_{wp}))},\ 0,\ 1\right) \times \begin{cases} 0.5 & \bar h > 0.01\ \text{m} \\ 1 & \text{other} \end{cases} \]

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.

\[ G = \mathrm{clamp}\!\left(\frac{\Gamma}{\Gamma_m},\ 0,\ 1\right) \]

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.

\[ H = H_p\,(0.03 + 0.97\,G) \]

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.

\[ M = n_u\,a_s\,Y\,G \]

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.

\[ \lvert d_x f_x + d_y f_y \rvert \le \frac{L}{2}, \qquad \lvert -d_x f_y + d_y f_x \rvert \le \frac{W}{2} \]

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.

\[ H_p\,(0.03 + 0.97\,G) > c_b \]
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.

\[ m_s = a_s\,Y, \qquad m_{bunker} + m_s \le m_{capacity} \]

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.
How a wheel contact gets its surface: the surface map gives the surface class of the contact point, a hard class takes a friction template and the pond depth, a soil class takes a soil template, a soil library class, and the water content and rut depth of the farm, and the vehicle model computes the tyre forces. From a wheel contact to the soil parameters Wheel contact contact point x, y Surface map polygons with class and priority Hard surface 1 asphalt, 2 concrete, 3 gravel Template friction, rolling, from tractor.json Wetness pond depth / 2 mm, limit 1 Friction model a wet film lowers the friction Soil surface 0 field, 4 grass lane, 5 grass, 6 dirt Template traffic compaction, root cohesion Soil class one of 7 classes of the soil library Soil source field preset, if not: SSURGO texture Soil water, ruts 4 m water snapshot, 0.25 m rut map Farm sample θ, wetness, pond, rut depth Tyre-soil model soil state, sinkage, shear Without the polygon file: the 1.524 m cells of surfaces.u8 give the surface.
From the contact point of a wheel to the inputs of the friction model and of the tyre-soil model. Open the diagram

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.

  1. 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.
  2. The polygon with the highest priority gives the class.
  3. For equal priorities, the polygon that is later in the file gives the class.
  4. 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.

  1. The field of the contact point has a preset with a library class: that class.
  2. The key soil.class of tractor.json is auto: the class of the texture group of the soil unit below the wheel.
  3. The key soil.class is the id of a class, or the option -VehicleSoilClass= gives one: that class for all soil.
  4. No class: the constant soil values of the block soil of tractor.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::RestoreFieldId clears the masks, the ruts and the field work of one field. It keeps the growth.
  • The export saves the marks in farm-state.json and farm-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=date has 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.