ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
FieldPeas.cpp
Go to the documentation of this file.
1 //
2 // FieldPeas.cpp
3 //
4 /*
5 *******************************************************************************************************
6 Copyright (c) 2011, Christopher John Topping, University of Aarhus
7 All rights reserved.
8 
9 Redistribution and use in source and binary forms, with or without modification, are permitted provided
10 that the following conditions are met:
11 
12 Redistributions of source code must retain the above copyright notice, this list of conditions and the
13 following disclaimer.
14 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and
15 the following disclaimer in the documentation and/or other materials provided with the distribution.
16 
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
18 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
19 FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
20 BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
22 BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 ********************************************************************************************************
26 */
27 
28 #include "../../Landscape/ls.h"
29 #include "../../Landscape/cropprogs/FieldPeas.h"
30 
31 
32 extern CfgFloat cfg_ins_app_prop1;
33 extern CfgFloat cfg_herbi_app_prop;
34 extern CfgFloat cfg_fungi_app_prop1;
35 extern CfgFloat cfg_greg_app_prop;
36 
37 bool FieldPeas::Do( Farm *a_farm, LE *a_field, FarmEvent *a_ev )
38 {
39  m_farm = a_farm;
40  m_field = a_field;
41  m_ev = a_ev;
42  double ins_app_prop=cfg_ins_app_prop1.value();
43  double herbi_app_prop=cfg_herbi_app_prop.value();
44 
45  bool done = false;
46 
47  switch ( m_ev->m_todo )
48  {
49  case fp_start:
50  {
52  FPEAD_FUNGI_DATE = 0;
53  FPEAD_WATER_DATE = 0;
55  // Set up the date management stuff
56  // Could save the start day in case it is needed later
57  // m_field->m_startday = m_ev->m_startday;
58  m_last_date=g_date->DayInYear(15,10);
59  // Start and stop dates for all events after harvest
60  int noDates=1;
61  m_field->SetMDates(0,0,g_date->DayInYear(30,8));
62  // 0,0 determined by harvest date - used to see if at all possible
63  m_field->SetMDates(1,0,g_date->DayInYear(30,8));
64  // Check the next crop for early start, unless it is a spring crop
65  // in which case we ASSUME that no checking is necessary!!!!
66  // So DO NOT implement a crop that runs over the year boundary
67 
68  //new if: do the check only for non-optimising farms and if year>0. (030713 - m_rotation used only in the hidden year, so I modified the condition from >7 to >0)
69  int d1;
70  if(!(m_farm->GetType() == tof_OptimisingFarm && g_date->GetYearNumber()>0)){
71 
72  if (m_ev->m_startday>g_date->DayInYear(1,7))
73  {
74  if (m_field->GetMDates(0,0) >=m_ev->m_startday)
75  {
76  //g_msg->Warn( WARN_BUG, "FieldPeas::Do(): Harvest too late for the next crop to start!!!", "" );
77 
78  char veg_type[ 20 ];
79  sprintf( veg_type, "%d", m_ev->m_next_tov );
80  g_msg->Warn( WARN_FILE, "FieldPeas::Do(): Harvest too late for the next crop to start!!! The next crop is: ", veg_type );
81 
82  exit( 1 );
83  }
84  // Now fix any late finishing problems
85  for (int i=0; i<noDates; i++) {
86  if(m_field->GetMDates(0,i)>=m_ev->m_startday) {
87  m_field->SetMDates(0,i,m_ev->m_startday-1); //move the starting date
88  }
89  if(m_field->GetMDates(1,i)>=m_ev->m_startday){
90  m_field->SetMConstants(i,0);
91  m_field->SetMDates(1,i,m_ev->m_startday-1); //move the finishing date
92  }
93  }
94  }
95  // Now no operations can be timed after the start of the next crop.
96 
97  // CJT note:
98  // Start single block date checking code to be cut-'n-pasted...
99 
100  if ( ! m_ev->m_first_year )
101  {
102  // Are we before July 1st?
103  d1 = g_date->OldDays() + g_date->DayInYear( 1,7 );
104  if (g_date->Date() < d1)
105  {
106  // Yes, too early. We assumme this is because the last crop was late
107  g_msg->Warn( WARN_BUG, "FieldPeas::Do(): "
108  "Crop start attempt between 1st Jan & 1st July", "" );
109  exit( 1 );
110  }
111  else
112  {
113  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
114  if (g_date->Date() > d1)
115  {
116  // Yes too late - should not happen - raise an error
117  g_msg->Warn( WARN_BUG, "FieldPeas::Do(): Crop start attempt after last possible start date", "" );
118  exit( 1 );
119  }
120  }
121  }
122  else
123  {
124  // If this is the first year of running then it is possible to start
125  // on day 0, so need this to tell us what to do:
126  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,3 ),
127  fp_spring_plough, false );
128  break;
129  }
130  }//if
131  // End single block date checking code. Please see next line
132  // comment as well.
133  // Reinit d1 to first possible starting date.
134  d1 = g_date->OldDays() + g_date->DayInYear( 1,10 );
135  if ( g_date->Date() > d1 ) {
136  d1 = g_date->Date();
137  }
138  // OK, let's go.
139  SimpleEvent( d1, fp_autumn_plough, false );
140  }
141  break;
142 
143  case fp_autumn_plough:
144  if ( m_ev->m_lock || m_farm->DoIt( 90 )) {
145  if (!m_farm->AutumnPlough( m_field, 0.0,
146  g_date->DayInYear( 1, 12 ) -
147  g_date->DayInYear())) {
148  SimpleEvent( g_date->Date() + 1, fp_autumn_plough, true );
149  break;
150  }
151  }
152  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,3 ) + 365,
153  fp_spring_plough, false );
154  break;
155 
156  case fp_spring_plough:
157  if ( m_ev->m_lock || m_farm->DoIt( 100 )) {
158  if (!m_farm->SpringPlough( m_field, 0.0,
159  g_date->DayInYear( 1,4 ) -
160  g_date->DayInYear())) {
161  SimpleEvent( g_date->Date() + 1, fp_spring_plough, true );
162  break;
163  }
164  }
165  {
166  int d1 = g_date->Date()+1;
167  int d2 = g_date->OldDays() + g_date->DayInYear( 5,3 );
168  if ( d1 < d2 ) {
169  d1 = d2;
170  }
171  SimpleEvent( d1, fp_spring_harrow, false );
172  }
173  break;
174 
175  case fp_spring_harrow:
176  if (!m_farm->SpringHarrow( m_field, 0.0,
177  g_date->DayInYear( 5,4 ) - g_date->DayInYear())) {
178  SimpleEvent( g_date->Date() + 1, fp_spring_harrow, true );
179  break;
180  }
181  {
183  if ( m_farm->IsStockFarmer()) {
184  dothis = fp_fertmanure_stock;
185  }
186 
187  int d1 = g_date->Date();
188  int d2 = g_date->OldDays() + g_date->DayInYear( 20,3 );
189  if ( d1 < d2 ) {
190  d1 = d2;
191  }
192  SimpleEvent( d1, dothis, false );
193  }
194  break;
195 
196  case fp_fertmanure_plant:
197  if (!m_farm->FP_Manure( m_field, 0.0,
198  g_date->DayInYear( 15,4 ) -
199  g_date->DayInYear())) {
200  SimpleEvent( g_date->Date() + 1, fp_fertmanure_plant, true );
201  break;
202  }
203  {
204  int d1 = g_date->Date();
205  int d2 = g_date->OldDays() + g_date->DayInYear( 25,3 );
206  if ( d1 < d2 ) {
207  d1 = d2;
208  }
209  SimpleEvent( d1, fp_spring_sow, false );
210  }
211  break;
212 
213  case fp_fertmanure_stock:
214  if ( m_ev->m_lock || m_farm->DoIt( 75 )) {
215  if (!m_farm->FA_Manure( m_field, 0.0,
216  g_date->DayInYear( 15,4 ) -
217  g_date->DayInYear())) {
218  SimpleEvent( g_date->Date() + 1, fp_fertmanure_stock, true );
219  break;
220  }
221  }
222  {
223  int d1 = g_date->Date();
224  int d2 = g_date->OldDays() + g_date->DayInYear( 25,3 );
225  if ( d1 < d2 ) {
226  d1 = d2;
227  }
228  SimpleEvent( d1, fp_spring_sow, false );
229  }
230  break;
231 
232  case fp_spring_sow:
233  if (!m_farm->SpringSow( m_field, 0.0,
234  g_date->DayInYear( 15,4 ) -
235  g_date->DayInYear())) {
236  SimpleEvent( g_date->Date() + 1, fp_spring_sow, true );
237  break;
238  }
239  SimpleEvent( g_date->Date(), fp_spring_roll, false );
240  break;
241 
242  case fp_spring_roll:
243  if (!m_farm->SpringRoll( m_field, 0.0,
244  g_date->DayInYear( 15,4 ) -
245  g_date->DayInYear())) {
246  SimpleEvent( g_date->Date() + 1, fp_spring_roll, true );
247  break;
248  }
249  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,4 ),
250  fp_herbicide_one, false );
251  break;
252 
253  case fp_herbicide_one:
254  if ( m_ev->m_lock || m_farm->DoIt( (int) (100*herbi_app_prop * m_farm->Prob_multiplier() ))) { //modified probability
255 
256  //new - for decision making
257  TTypesOfVegetation tov = m_field->GetVegType();
258  if(!m_ev->m_lock && !m_farm->Spraying_herbicides(tov)){
259  Field * pf = dynamic_cast<Field*>(m_field);
260  pf->Add_missed_herb_app();
261  if(m_farm->DoIt(95)) pf->Add_missed_herb_app(); //the 2nd missed application
263  } //end of the part for dec. making
264  else{
265  if (!m_farm->HerbicideTreat( m_field, 0.0, g_date->DayInYear( 20,4 ) - g_date->DayInYear())) {
266  SimpleEvent( g_date->Date() + 1, fp_herbicide_one, true );
267  break;
268  }
269  }
270  }
271  {
272  int d1 = g_date->OldDays() + g_date->DayInYear( 25,4 );
273  if ( d1 < g_date->Date() + 7 ) {
274  d1 = g_date->Date() + 7;
275  }
276  SimpleEvent( d1, fp_herbicide_two, false );
277  }
278  break;
279 
280  case fp_herbicide_two:
281  if ( m_ev->m_lock || m_farm->DoIt( (int) (95*herbi_app_prop *FPEAS_DECIDE_TO_HERB * m_farm->Prob_multiplier()))) { //modified probability
282  if (!m_farm->HerbicideTreat( m_field, 0.0,
283  g_date->DayInYear( 10,5 ) -
284  g_date->DayInYear())) {
285  SimpleEvent( g_date->Date() + 1, fp_herbicide_two, true );
286  break;
287  }
288  }
289  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,6 ),
290  fp_insecticide, false );
291  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,6 ),
292  fp_fungicide, false );
293 
294  // Water carries the main thread.
295  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,6 ),
296  fp_water_one, false );
297  break;
298 
299  case fp_fungicide:
300  if ( m_ev->m_lock || m_farm->DoIt( (int)( 10*cfg_fungi_app_prop1.value() ))) {
301 
302  //new - for decision making
303  TTypesOfVegetation tov = m_field->GetVegType();
304  if(!m_ev->m_lock && !m_farm->Spraying_fungins(tov)){
305  Field * pf = dynamic_cast<Field*>(m_field);
306  pf->Add_missed_fi_app();
307  break;
308  } //end of the part for dec. making
309 
310  // Check for proximity of watering.
311  {
312  int d1 = g_date->Date();
313  if ( d1 < FPEAD_WATER_DATE + 2 ) {
314  // Too close, try tomorrow.
315  SimpleEvent( g_date->Date() + 1, fp_fungicide, true );
316  break;
317  }
318  }
319  if (!m_farm->FungicideTreat( m_field, 0.0, g_date->DayInYear( 15,6 ) - g_date->DayInYear())) {
320  SimpleEvent( g_date->Date() + 1, fp_fungicide, true );
321  break;
322  }
323  FPEAD_FUNGI_DATE = g_date->Date();
324  }
325  // End of thread.
326  break;
327 
328  case fp_insecticide:
329  if ( m_ev->m_lock || m_farm->DoIt( (int) (90*ins_app_prop ))) {
330 
331  //new - for decision making
332  TTypesOfVegetation tov = m_field->GetVegType();
333  if(!m_ev->m_lock && !m_farm->Spraying_fungins(tov)){
334  Field * pf = dynamic_cast<Field*>(m_field);
335  pf->Add_missed_fi_app();
336  break;
337  } //end of the part for dec. making
338 
339  {
340  int d1 = g_date->Date();
341  if ( d1 < FPEAD_WATER_DATE + 2 ) {
342  // Too close, try tomorrow.
343  SimpleEvent( g_date->Date() + 1, fp_insecticide, true );
344  break;
345  }
346  }
347  if (!m_farm->InsecticideTreat( m_field, 0.0,
348  g_date->DayInYear( 15,6 ) -
349  g_date->DayInYear())) {
350  SimpleEvent( g_date->Date() + 1, fp_insecticide, true );
351  break;
352  }
353  FPEAD_INSECT_DATE = g_date->Date();
354  }
355  // End of thread.
356  break;
357 
358  case fp_water_one:
359  if ( m_ev->m_lock || m_farm->DoIt( 30 ))
360  {
361  {
362  int d1 = g_date->Date();
363  if ( d1 < FPEAD_INSECT_DATE + 2 ||
364  d1 < FPEAD_FUNGI_DATE + 2 ) {
365  // Too close, try tomorrow.
366  SimpleEvent( g_date->Date() + 1, fp_water_one, true );
367  break;
368  }
369  }
370  if (!m_farm->Water( m_field, 0.0,
371  g_date->DayInYear( 15,6 ) - g_date->DayInYear())) {
372  SimpleEvent( g_date->Date() + 1, fp_water_one, true );
373  break;
374  }
375  FPEAD_WATER_DATE = g_date->Date();
376  // Did first water, so do the second one too.
377  {
378  int d1 = g_date->OldDays() + g_date->DayInYear( 16,6 );
379  if ( d1 < g_date->Date() + 7 ) {
380  d1 = g_date->Date() + 7;
381  }
382  SimpleEvent( d1, fp_water_two, false );
383  }
384  }
385  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10,8 ),
386  fp_growth_reg, false );
387  break;
388 
389  case fp_water_two:
390  {
391  int d1 = g_date->Date();
392  if ( d1 < FPEAD_INSECT_DATE + 2 ||
393  d1 < FPEAD_FUNGI_DATE + 2 ) {
394  // Too close, try tomorrow.
395  SimpleEvent( g_date->Date() + 1, fp_water_two, true );
396  break;
397  }
398  }
399  if (!m_farm->Water( m_field, 0.0,
400  g_date->DayInYear( 1,7 ) -
401  g_date->DayInYear())) {
402  SimpleEvent( g_date->Date() + 1, fp_water_two, true );
403  break;
404  }
405  FPEAD_WATER_DATE = g_date->Date();
406  // End of thread.
407  break;
408 
409  case fp_growth_reg:
410  if ( m_ev->m_lock || m_farm->DoIt( (int) (20*cfg_greg_app_prop.value() )))
411  {
412  if (!m_farm->GrowthRegulator( m_field, 0.0,
413  g_date->DayInYear( 20,8 ) -
414  g_date->DayInYear())) {
415  SimpleEvent( g_date->Date() + 1, fp_growth_reg, true );
416  break;
417  }
418  // Did apply growth regulator, so wait seven days before
419  // harvesting.
420 
421  ChooseNextCrop (1);
422  SimpleEvent( g_date->Date()+7, fp_harvest, false );
423  break;
424  }
425  // No growth regulator, try harvesting today.
426  ChooseNextCrop (1);
427  SimpleEvent( g_date->Date(), fp_harvest, false );
428  break;
429 
430  case fp_harvest:
431  if (!m_farm->Harvest( m_field, 0.0,
432  g_date->DayInYear( 30,8 ) -
433  g_date->DayInYear())) {
434  SimpleEvent( g_date->Date() + 1, fp_harvest, true );
435  break;
436  }
437  SimpleEvent( g_date->Date(), fp_straw_chopping, false );
438  break;
439 
440  case fp_straw_chopping:
441  if (m_field->GetMConstants(0)==0) {
442  if (!m_farm->StrawChopping( m_field, 0.0, -1)) { //raise an error
443  g_msg->Warn( WARN_BUG, "FieldPeas::Do(): failure in 'StrawChopping' execution", "" );
444  exit( 1 );
445  }
446  }
447  else {
448  if (!m_farm->StrawChopping( m_field, 0.0, m_field->GetMDates(1,0) - g_date->DayInYear())) {
449  SimpleEvent( g_date->Date()+1, fp_straw_chopping, true );
450  break;
451  }
452  }
453  // End Main Thread
454  done=true;
455  break;
456 
457  default:
458  g_msg->Warn( WARN_BUG, "FieldPeas::Do(): "
459  "Unknown event type! ", "" );
460  exit( 1 );
461  }
462 
463  return done;
464 }
465 
466 
cfg_ins_app_prop1
CfgFloat cfg_ins_app_prop1
Farm::SpringRoll
virtual bool SpringRoll(LE *a_field, double a_user, int a_days)
Carry out a roll event in the spring on a_field.
Definition: farmfuncs.cpp:525
fp_straw_chopping
Definition: FieldPeas.h:56
Farm::SpringPlough
virtual bool SpringPlough(LE *a_field, double a_user, int a_days)
Carry out a ploughing event in the spring on a_field.
Definition: farmfuncs.cpp:444
Farm::HerbicideTreat
virtual bool HerbicideTreat(LE *a_field, double a_user, int a_days)
Apply herbicide to a_field.
Definition: farmfuncs.cpp:1156
Farm::IsStockFarmer
bool IsStockFarmer(void)
Definition: farm.h:905
Farm::Harvest
virtual bool Harvest(LE *a_field, double a_user, int a_days)
Carry out a harvest on a_field.
Definition: farmfuncs.cpp:1769
FarmEvent::m_lock
bool m_lock
Definition: farm.h:465
FarmEvent
A struct to hold the information required to trigger a farm event.
Definition: farm.h:463
Farm::DoIt
bool DoIt(double a_probability)
Return chance out of 0 to 100.
Definition: farm.cpp:800
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
tof_OptimisingFarm
Definition: farm.h:273
Farm::FA_Manure
virtual bool FA_Manure(LE *a_field, double a_user, int a_days)
Spread manure on a_field owned by an stock farmer.
Definition: farmfuncs.cpp:1036
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
fp_autumn_plough
Definition: FieldPeas.h:42
fp_water_two
Definition: FieldPeas.h:54
FPEAD_INSECT_DATE
#define FPEAD_INSECT_DATE
Definition: FieldPeas.h:33
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
Farm::FungicideTreat
virtual bool FungicideTreat(LE *a_field, double a_user, int a_days)
Apply fungicide to a_field.
Definition: farmfuncs.cpp:1279
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
fp_growth_reg
Definition: FieldPeas.h:55
Farm::FP_Manure
virtual bool FP_Manure(LE *a_field, double a_user, int a_days)
Spread manure on a_field owned by an arable farmer.
Definition: farmfuncs.cpp:773
Farm::Prob_multiplier
virtual double Prob_multiplier()
Definition: farm.h:786
fp_spring_sow
Definition: FieldPeas.h:47
fp_spring_harrow
Definition: FieldPeas.h:44
fp_fertmanure_plant
Definition: FieldPeas.h:45
TTypesOfVegetation
TTypesOfVegetation
Definition: tov_declaration.h:30
cfg_greg_app_prop
CfgFloat cfg_greg_app_prop
FPEAD_WATER_DATE
#define FPEAD_WATER_DATE
Definition: FieldPeas.h:35
fp_spring_roll
Definition: FieldPeas.h:48
Farm::Spraying_herbicides
virtual bool Spraying_herbicides(TTypesOfVegetation)
Definition: farm.h:784
Farm::StrawChopping
virtual bool StrawChopping(LE *a_field, double a_user, int a_days)
Carry out straw chopping on a_field.
Definition: farmfuncs.cpp:2132
FieldPeasToDo
FieldPeasToDo
Definition: FieldPeas.h:39
cfg_herbi_app_prop
CfgFloat cfg_herbi_app_prop
FPEAS_DECIDE_TO_HERB
#define FPEAS_DECIDE_TO_HERB
Definition: FieldPeas.h:36
fp_fertmanure_stock
Definition: FieldPeas.h:46
fp_insecticide
Definition: FieldPeas.h:51
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
Crop::m_farm
Farm * m_farm
Definition: farm.h:537
Crop::m_field
LE * m_field
Definition: farm.h:538
fp_herbicide_one
Definition: FieldPeas.h:49
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
Farm::InsecticideTreat
virtual bool InsecticideTreat(LE *a_field, double a_user, int a_days)
Apply insecticide to a_field.
Definition: farmfuncs.cpp:1348
FPEAD_FUNGI_DATE
#define FPEAD_FUNGI_DATE
Definition: FieldPeas.h:34
Farm::Water
virtual bool Water(LE *a_field, double a_user, int a_days)
Carry out a watering on a_field.
Definition: farmfuncs.cpp:1717
Crop::m_last_date
int m_last_date
Definition: farm.h:542
fp_harvest
Definition: FieldPeas.h:41
Farm::AutumnPlough
virtual bool AutumnPlough(LE *a_field, double a_user, int a_days)
Carry out a ploughing event in the autumn on a_field.
Definition: farmfuncs.cpp:132
Farm::SpringSow
virtual bool SpringSow(LE *a_field, double a_user, int a_days)
Carry out a sowing event in the spring on a_field.
Definition: farmfuncs.cpp:546
Farm
The base class for all farm types.
Definition: farm.h:767
Farm::GrowthRegulator
virtual bool GrowthRegulator(LE *a_field, double a_user, int a_days)
Apply growth regulator to a_field.
Definition: farmfuncs.cpp:1250
fp_herbicide_two
Definition: FieldPeas.h:50
cfg_fungi_app_prop1
CfgFloat cfg_fungi_app_prop1
FieldPeas::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: FieldPeas.cpp:37
fp_water_one
Definition: FieldPeas.h:53
fp_fungicide
Definition: FieldPeas.h:52
Crop::ChooseNextCrop
void ChooseNextCrop(int a_no_dates)
Chooses the next crop to grow in a field.
Definition: farm.cpp:318
fp_spring_plough
Definition: FieldPeas.h:43
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
fp_start
Definition: FieldPeas.h:40
Farm::Spraying_fungins
virtual bool Spraying_fungins(TTypesOfVegetation)
Definition: farm.h:785
Farm::SpringHarrow
virtual bool SpringHarrow(LE *a_field, double a_user, int a_days)
Carry out a harrow event in the spring on a_field.
Definition: farmfuncs.cpp:471