ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
SpringBarleySeed.cpp
Go to the documentation of this file.
1 //
2 // SpringBarleySeed.cpp
3 //
4 /*
5 *******************************************************************************************************
6 Copyright (c) 2011, Christopher John Topping, Aarhus University
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/SpringBarleySeed.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 SpringBarleySeed::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  int d1=0;
43  int noDates=3;
44  bool done = false;
45 
46  switch ( m_ev->m_todo )
47  {
48  case sbse_start:
49  // Decide wether to do autumn_plough:
50  SBSE_FUNGI_DATE = 0;
51  SBSE_WATER_DATE = 0;
52 
53  // Set up the date management stuff
54  // Could save the start day in case it is needed later
55  // m_field->m_startday = m_ev->m_startday;
56  m_first_date=g_date->DayInYear(1,12);
57  m_last_date=g_date->DayInYear(15,9);
58  // Start and stop dates for all events after harvest
59  m_field->SetMDates(0,0,g_date->DayInYear(1,8));
60  // Determined by harvest date - used to see if at all possible
61  m_field->SetMDates(1,0,g_date->DayInYear(20,8));
62  m_field->SetMDates(0,1,g_date->DayInYear(5,8));
63  m_field->SetMDates(1,1,g_date->DayInYear(25,8));
64  m_field->SetMDates(0,2,g_date->DayInYear(15,8));
65  m_field->SetMDates(1,2,g_date->DayInYear(15,9));
66  // Check the next crop for early start, unless it is a spring crop
67  if ((m_field->GetMDates(0,0) >=m_ev->m_startday)
68  && (m_ev->m_startday>g_date->DayInYear(1,7)))
69  {
70  g_msg->Warn( WARN_BUG, "SpringBarleySeed::Do(): "
71  "Harvest too late for the next crop to start!!!", "" );
72  exit( 1 );
73  }
74  // Now fix any late finishing problems
75  for (int i=0; i<noDates; i++)
76  {
77  if (m_field->GetMDates(0,i)>=m_ev->m_startday)
78  m_field->SetMDates(0,i,m_ev->m_startday-1);
79  if (m_field->GetMDates(1,i)>=m_ev->m_startday)
80  m_field->SetMDates(1,i,m_ev->m_startday-1);
81  }
82  // Now no operations can be timed after the start of the next crop.
83  if ( ! m_ev->m_first_year )
84  {
85  // Are we before July 1st?
86  d1 = g_date->OldDays() + g_date->DayInYear( 1,7 );
87  if (g_date->Date() < d1)
88  {
89  // Yes, too early. We assumme this is because the last crop was late
90  g_msg->Warn( WARN_BUG, "SpringBarleySeed::Do(): "
91  "Crop start attempt between 1st Jan & 1st July", "" );
92  exit( 1 );
93  }
94  else
95  {
96  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
97  if (g_date->Date() > d1)
98  {
99  // Yes too late - should not happen - raise an error
100  g_msg->Warn( WARN_BUG, "SpringBarleySeed::Do(): "
101  "Crop start attempt after last possible start date", "" );
102  exit( 1 );
103  }
104  }
105 
106  }
107  else
108  {
109  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,4 ),
110  sbse_spring_plough, false );
111  break;
112  }
113  // End single block date checking code. Please see next line
114  // comment as well.
115  // Reinit d1 to first possible starting date.
116  d1 = g_date->OldDays() + g_date->DayInYear( 1,11 );
117  if ( g_date->Date() > d1 ) {
118  d1 = g_date->Date();
119  }
120 
121  // OK, let's go.
122 
123  if (m_farm->DoIt(50))
124  {
125  SimpleEvent( d1, sbse_autumn_plough, false );
126  }
127  else
128  {
129  SimpleEvent( g_date->OldDays() + 365 + g_date->DayInYear( 15, 3 ),
130  sbse_spring_plough, false );
131  }
132  break;
133 
134  case sbse_autumn_plough:
135  if (!m_farm->AutumnPlough( m_field, 0.0,
136  g_date->DayInYear( 1,12 ) -
137  g_date->DayInYear())) {
138  SimpleEvent( g_date->Date() + 1, sbse_autumn_plough, true );
139  break;
140  }
141  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,3 )+365,
142  sbse_spring_harrow, false );
143  break;
144 
145  case sbse_spring_plough:
146  if (!m_farm->SpringPlough( m_field, 0.0,
147  g_date->DayInYear( 10, 4 ) -
148  g_date->DayInYear())) {
149  SimpleEvent( g_date->Date()+1, sbse_spring_plough, true );
150  break;
151  }
152  SimpleEvent( g_date->Date(), sbse_spring_harrow, false );
153  break;
154 
155  case sbse_spring_harrow:
156  if (!m_farm->SpringHarrow( m_field, 0.0,
157  g_date->DayInYear( 10,4 ) -
158  g_date->DayInYear())) {
159  SimpleEvent( g_date->Date() + 1, sbse_spring_harrow, true );
160  break;
161  }
162  {
163  int d1 = g_date->Date();
164  if ( d1 > g_date->OldDays() + g_date->DayInYear( 20,3 ))
165  d1 = g_date->OldDays() + g_date->DayInYear( 20,3 );
166  if ( m_farm->DoIt( 80 ))
167  SimpleEvent( d1, sbse_fertnpk, false );
168  else
169  SimpleEvent( d1, sbse_fertlnh3, false );
170  }
171  break;
172 
173  case sbse_fertnpk:
174  if (!m_farm->FP_NPK( m_field, 0.0,
175  g_date->DayInYear( 10, 4 ) -
176  g_date->DayInYear())) {
177  SimpleEvent( g_date->Date() + 1, sbse_fertnpk, true );
178  break;
179  }
180  {
181  int d1 = g_date->Date();
182  if ( d1 < g_date->OldDays() + g_date->DayInYear( 25,3 )) {
183  d1 = g_date->OldDays() + g_date->DayInYear( 25,3 );
184  }
185  SimpleEvent( d1, sbse_spring_sow, false );
186  }
187  break;
188 
189  case sbse_fertlnh3:
190  if (!m_farm->FP_LiquidNH3( m_field, 0.0,
191  g_date->DayInYear( 10, 4 ) -
192  g_date->DayInYear())) {
193  SimpleEvent( g_date->Date() + 1, sbse_fertlnh3, true );
194  break;
195  }
196  SimpleEvent( g_date->Date(), sbse_fertpk, false );
197  break;
198 
199 
200  case sbse_fertpk:
201  if (!m_farm->FP_PK( m_field, 0.0,
202  g_date->DayInYear( 10, 4 ) -
203  g_date->DayInYear())) {
204  SimpleEvent( g_date->Date() + 1, sbse_fertpk, true );
205  break;
206  }
207  {
208  int d1 = g_date->Date();
209  if ( d1 < g_date->OldDays() + g_date->DayInYear( 25,3 )) {
210  d1 = g_date->OldDays() + g_date->DayInYear( 25,3 );
211  }
212  SimpleEvent( d1, sbse_spring_sow, false );
213  }
214  break;
215 
216  case sbse_spring_sow:
217  if (!m_farm->SpringSow( m_field, 0.0,
218  g_date->DayInYear( 15,4 ) -
219  g_date->DayInYear())) {
220  SimpleEvent( g_date->Date() + 1, sbse_spring_sow, true );
221  break;
222  }
223  SimpleEvent( g_date->Date(), sbse_spring_roll, false );
224  {
225  int d1 = g_date->Date();
226  if ( d1 < g_date->OldDays() + g_date->DayInYear( 1,4 )) {
227  d1 = g_date->OldDays() + g_date->DayInYear( 1,4 );
228  }
229  SimpleEvent( d1, sbse_herbicide_one, false );
230  }
231  break;
232 
233  case sbse_spring_roll:
234  if ( m_ev->m_lock || m_farm->DoIt( 90 ))
235  {
236  if (!m_farm->SpringRoll( m_field, 0.0,
237  g_date->DayInYear( 20,4 ) -
238  g_date->DayInYear())) {
239  SimpleEvent( g_date->Date() + 1, sbse_spring_roll, true );
240  break;
241  }
242  }
243  break;
244 
245  case sbse_herbicide_one:
246  if ( m_ev->m_lock || m_farm->DoIt( (int) (100*cfg_herbi_app_prop.value() ))) {
247  if (!m_farm->HerbicideTreat( m_field, 0.0,
248  g_date->DayInYear( 30,4 ) -
249  g_date->DayInYear())) {
250  SimpleEvent( g_date->Date() + 1, sbse_herbicide_one, true );
251  break;
252  }
253  }
254  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10,5 ),
255  sbse_GR, false );
256  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10,5 ),
257  sbse_fungicide_one, false );
258  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,5 ),
259  sbse_water_one, false );
260  break;
261 
262  case sbse_GR:
263  if ( m_ev->m_lock || m_farm->DoIt( (int) (25*cfg_greg_app_prop.value() )))
264  {
265  if (!m_farm->GrowthRegulator( m_field, 0.0,
266  g_date->DayInYear( 25,5 ) -
267  g_date->DayInYear())) {
268  SimpleEvent( g_date->Date() + 1, sbse_GR, true );
269  break;
270  }
271  }
272  break;
273 
274  // Fungicide thread
275  case sbse_fungicide_one:
276  if ( g_date->Date() < SBSE_WATER_DATE + 1 ) {
277  SimpleEvent( g_date->Date() + 1, sbse_fungicide_one, m_ev->m_lock );
278  break;
279  }
280  if ( m_ev->m_lock || m_farm->DoIt( (int) (90*cfg_fungi_app_prop1.value() )))
281  {
282  if (!m_farm->FungicideTreat( m_field, 0.0,
283  g_date->DayInYear( 25,5 ) -
284  g_date->DayInYear())) {
285  SimpleEvent( g_date->Date() + 1, sbse_fungicide_one, true );
286  break;
287  }
288  SBSE_FUNGI_DATE = g_date->Date();
289  {
290  d1 = g_date->Date() + 10;
291  if ( d1 < g_date->OldDays() + g_date->DayInYear( 15,5 )) {
292  d1 = g_date->OldDays() + g_date->DayInYear( 15,5 );
293  }
294  SimpleEvent( d1, sbse_fungicide_two, false );
295  }
296  }
297  break;
298 
299  case sbse_fungicide_two:
300  if ( g_date->Date() < SBSE_WATER_DATE + 1 ) {
301  SimpleEvent( g_date->Date() + 1, sbse_fungicide_two, m_ev->m_lock );
302  break;
303  }
304  if ( m_ev->m_lock || m_farm->DoIt( (int) (30*cfg_fungi_app_prop1.value() )))
305  {
306  if (!m_farm->FungicideTreat( m_field, 0.0,
307  g_date->DayInYear( 10,6 ) -
308  g_date->DayInYear())) {
309  SimpleEvent( g_date->Date() + 1, sbse_fungicide_two, true );
310  break;
311  }
312  SBSE_FUNGI_DATE = g_date->Date();
313  }
314  break;
315 
316  // Water thread
317  case sbse_water_one:
318  if ( g_date->Date() < SBSE_FUNGI_DATE + 1 ) {
319  SimpleEvent( g_date->Date() + 1, sbse_water_one, m_ev->m_lock );
320  break;
321  }
322  if ( m_ev->m_lock || m_farm->DoIt( 20 ))
323  {
324  if (!m_farm->Water( m_field, 0.0,
325  g_date->DayInYear( 30,5 ) -
326  g_date->DayInYear())) {
327  SimpleEvent( g_date->Date() + 1, sbse_water_one, true );
328  break;
329  }
330  SBSE_WATER_DATE = g_date->Date();
331  }
332  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,6 ),
333  sbse_water_two, false );
334  break;
335 
336  case sbse_water_two:
337  if ( g_date->Date() < SBSE_FUNGI_DATE + 1 ) {
338  SimpleEvent( g_date->Date() + 1, sbse_water_two, m_ev->m_lock );
339  break;
340  }
341  if ( m_ev->m_lock || m_farm->DoIt( 20 ))
342  {
343  if (!m_farm->Water( m_field, 0.0,
344  g_date->DayInYear( 1,7 ) -
345  g_date->DayInYear())) {
346  SimpleEvent( g_date->Date() + 1, sbse_water_two, true );
347  break;
348  }
349  SBSE_WATER_DATE = g_date->Date();
350  }
351  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,8 ),
352  sbse_harvest, false );
353  break;
354 
355  case sbse_harvest:
356  if (!m_farm->Harvest( m_field, 0.0,
357  m_field->GetMDates(1,0) -
358  g_date->DayInYear())) {
359  SimpleEvent( g_date->Date() + 1, sbse_harvest, true );
360  break;
361  }
362  {
363  d1 = g_date->Date();
364  if ( d1 < g_date->OldDays() + m_field->GetMDates(0,1))
365  d1 = g_date->OldDays() + m_field->GetMDates(0,1);
366  SimpleEvent( d1, sbse_hay_bailing, false );
367  }
368  break;
369 
370  case sbse_hay_bailing:
371  if (!m_farm->HayBailing( m_field, 0.0,
372  m_field->GetMDates(1,1) -
373  g_date->DayInYear())) {
374  SimpleEvent( g_date->Date() + 1, sbse_hay_bailing, true );
375  break;
376  }
377 // The rest is removed until we figure out how to implement over the year
378 // boundries - this is not a nice crop **CJT**
379 /* if ( m_farm->DoIt( 20 ))
380  SimpleEvent( g_date->Date(), sbse_burn_straw_stubble, false );
381  else {
382  int d1 = g_date->Date();
383  if ( d1 < g_date->OldDays() + m_field->GetMDates(0,2))
384  d1 = g_date->OldDays() + m_field->GetMDates(0,2);
385  SimpleEvent( d1, sbse_herbicide_two, false );
386  }
387  break;
388 
389  case sbse_herbicide_two:
390  if (m_farm->DoIt(100*cfg_herbi_app_prop.value()))
391  {
392  if (!m_farm->HerbicideTreat( m_field, 0.0,
393  m_field->GetMDates(1,2) -
394  g_date->DayInYear())) {
395  SimpleEvent( g_date->Date() + 1, sbse_herbicide_two, true );
396  break;
397  }
398  done = true;
399  }
400  */
401  done = true;
402  break;
403 
405  if (!m_farm->BurnStrawStubble( m_field, 0.0,
406  m_field->GetMDates(1,2) -
407  g_date->DayInYear())) {
408  SimpleEvent( g_date->Date() + 1, sbse_burn_straw_stubble, true );
409  break;
410  }
411  done=true;
412  break;
413 
414  default:
415  g_msg->Warn( WARN_BUG, "SpringBarleySeed::Do(): "
416  "Unknown event type! ", "" );
417  exit( 1 );
418  }
419  return done;
420 }
421 
422 
sbse_fungicide_two
Definition: SpringBarleySeed.h:49
sbse_fertlnh3
Definition: SpringBarleySeed.h:42
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
SpringBarleySeed::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: SpringBarleySeed.cpp:37
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
sbse_burn_straw_stubble
Definition: SpringBarleySeed.h:55
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::FP_NPK
virtual bool FP_NPK(LE *a_field, double a_user, int a_days)
Apply NPK fertilizer, on a_field owned by an arable farmer.
Definition: farmfuncs.cpp:629
Farm::DoIt
bool DoIt(double a_probability)
Return chance out of 0 to 100.
Definition: farm.cpp:800
sbse_spring_plough
Definition: SpringBarleySeed.h:39
cfg_fungi_app_prop1
CfgFloat cfg_fungi_app_prop1
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
sbse_water_two
Definition: SpringBarleySeed.h:52
sbse_spring_harrow
Definition: SpringBarleySeed.h:40
SBSE_WATER_DATE
#define SBSE_WATER_DATE
Definition: SpringBarleySeed.h:34
sbse_fungicide_one
Definition: SpringBarleySeed.h:48
cfg_greg_app_prop
CfgFloat cfg_greg_app_prop
cfg_herbi_app_prop
CfgFloat cfg_herbi_app_prop
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
Farm::FP_PK
virtual bool FP_PK(LE *a_field, double a_user, int a_days)
Apply PK fertilizer, on a_field owned by an arable farmer.
Definition: farmfuncs.cpp:653
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
sbse_autumn_plough
Definition: SpringBarleySeed.h:38
sbse_harvest
Definition: SpringBarleySeed.h:53
sbse_spring_sow
Definition: SpringBarleySeed.h:44
sbse_hay_bailing
Definition: SpringBarleySeed.h:54
Farm::HayBailing
virtual bool HayBailing(LE *a_field, double a_user, int a_days)
Carry out hay bailing on a_field.
Definition: farmfuncs.cpp:2184
sbse_water_one
Definition: SpringBarleySeed.h:51
Crop::m_farm
Farm * m_farm
Definition: farm.h:537
Crop::m_field
LE * m_field
Definition: farm.h:538
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
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
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
sbse_start
Definition: SpringBarleySeed.h:37
SBSE_FUNGI_DATE
#define SBSE_FUNGI_DATE
Definition: SpringBarleySeed.h:33
Farm::FP_LiquidNH3
virtual bool FP_LiquidNH3(LE *a_field, double a_user, int a_days)
Apply liquid ammonia fertilizer to a_field owned by an arable farmer.
Definition: farmfuncs.cpp:677
sbse_fertnpk
Definition: SpringBarleySeed.h:41
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
sbse_GR
Definition: SpringBarleySeed.h:50
Farm::BurnStrawStubble
virtual bool BurnStrawStubble(LE *a_field, double a_user, int a_days)
Burn stubble on a_field.
Definition: farmfuncs.cpp:2236
cfg_ins_app_prop1
CfgFloat cfg_ins_app_prop1
sbse_fertpk
Definition: SpringBarleySeed.h:43
sbse_herbicide_one
Definition: SpringBarleySeed.h:46
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
sbse_spring_roll
Definition: SpringBarleySeed.h:45
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