ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
OSpringBarley.cpp
Go to the documentation of this file.
1 //
2 // OSpringBarley.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/OSpringBarley.h"
30 
31 extern CfgFloat cfg_strigling_prop;
32 
33 bool OSpringBarley::Do( Farm *a_farm, LE *a_field, FarmEvent *a_ev )
34 {
35  m_farm = a_farm;
36  m_field = a_field;
37  m_ev = a_ev;
38 
39  bool done = false;
40 
41  switch ( m_ev->m_todo )
42  {
43  case osb_start:
44  {
45  // Set up the date management stuff
46  // Could save the start day in case it is needed later
47  // m_field->m_startday = m_ev->m_startday;
48  m_last_date=g_date->DayInYear(20,8);
49  // Start and stop dates for all events after harvest
50  int noDates=3;
51  m_field->SetMDates(0,0,g_date->DayInYear(1,8));
52  // Determined by harvest date - used to see if at all possible
53  m_field->SetMDates(1,0,g_date->DayInYear(15,8));
54  m_field->SetMDates(0,1,g_date->DayInYear(15,8));
55  m_field->SetMDates(1,1,g_date->DayInYear(15,8));
56  m_field->SetMDates(0,2,g_date->DayInYear(5,8));
57  m_field->SetMDates(1,2,g_date->DayInYear(20,8));
58  // Check the next crop for early start, unless it is a spring crop
59  // in which case we ASSUME that no checking is necessary!!!!
60  // So DO NOT implement a crop that runs over the year boundary
61  if (m_ev->m_startday>g_date->DayInYear(1,7))
62  {
63  if (m_field->GetMDates(0,0) >=m_ev->m_startday)
64  {
65  g_msg->Warn( WARN_BUG, "OSpringBarley::Do(): "
66  "Harvest too late for the next crop to start!!!", "" );
67  exit( 1 );
68  }
69  // Now fix any late finishing problems
70  for (int i=0; i<noDates; i++)
71  {
72  if (m_field->GetMDates(0,i)>=m_ev->m_startday)
73  m_field->SetMDates(0,i,m_ev->m_startday-1);
74  if (m_field->GetMDates(1,i)>=m_ev->m_startday)
75  m_field->SetMDates(1,i,m_ev->m_startday-1);
76  }
77  }
78  // Now no operations can be timed after the start of the next crop.
79 
80  int d1;
81  if ( ! m_ev->m_first_year )
82  {
83  int today=g_date->Date();
84  // Are we before July 1st?
85  d1 = g_date->OldDays() + g_date->DayInYear( 1,7 );
86  if (today < d1)
87  {
88  // Yes, too early. We assumme this is because the last crop was late
89  g_msg->Warn( WARN_BUG, "OSpringBarley::Do(): "
90  "Crop start attempt between 1st Jan & 1st July", "" );
91  exit( 1 );
92  }
93  else
94  {
95  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
96  if (today > d1)
97  {
98  // Yes too late - should not happen - raise an error
99  g_msg->Warn( WARN_BUG, "OSpringBarley::Do(): "
100  "Crop start attempt after last possible start date", "" );
101  exit( 1 );
102  }
103  }
104  }
105  else
106  {
107  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,4 ),
108  osb_spring_harrow, false );
109  break;
110  }
111  // End single block date checking code. Please see next line
112  // comment as well.
113  // Reinit d1 to first possible starting date.
114  d1 = g_date->OldDays() + m_first_date;
115  if ( g_date->Date() > d1 ) {
116  d1 = g_date->Date();
117  }
118  // OK, let's go.
119  SimpleEvent( d1, osb_autumn_plough, false );
120  OSB_ISAUTUMNPLOUGH=false;
121  OSB_SOW_DATE=0;
123  }
124  break;
125 
126  case osb_autumn_plough:
127  if ( m_ev->m_lock || m_farm->DoIt( 20 ))
128  {
129  if (!m_farm->AutumnPlough( m_field, 0.0,
130  g_date->DayInYear( 15, 12 ) - g_date->DayInYear())) {
131  SimpleEvent( g_date->Date() + 1, osb_autumn_plough, true );
132  break;
133  }
134  OSB_ISAUTUMNPLOUGH=true;
135  if (m_farm->IsStockFarmer()) // StockFarmer
136  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5,3 ) + 365,
137  osb_ferti_s2, false );
138  else // PlantFarmer
139  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1, 4 ) + 365,
140  osb_ferti_p2, false );
141  // both must start this second thread
142  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
143  osb_spring_harrow, false );
144  break;
145  }
146  if (m_farm->IsStockFarmer()) // StockFarmer
147  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
148  osb_ferti_s1, false );
149  else // PlantFarmer
150  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
151  osb_ferti_p1, false );
152  break;
153 
154  //*** The plant farmers thread
155  case osb_ferti_p1:
156  if ( m_ev->m_lock || m_farm->DoIt( 12 ))
157  {
158  if (!m_farm->FP_Manure( m_field, 0.0,
159  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
160  SimpleEvent( g_date->Date() + 1, osb_ferti_p1, true );
161  break;
162  }
163  }
164  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ),
165  osb_spring_plough_p, false );
166  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 30 ,4 ),
167  osb_ferti_p2, false );
168  break;
169 
170  case osb_spring_plough_p:
171  if (!m_farm->SpringPlough( m_field, 0.0,
172  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
173  SimpleEvent( g_date->Date() + 1, osb_spring_plough_p, true );
174  break;
175  }
176  // --FN--
177  SimpleEvent( g_date->Date(), osb_spring_harrow, false );
178  break;
179 
180  case osb_ferti_p2:
181  if ( m_ev->m_lock || m_farm->DoIt( 10 ))
182  {
183  if (!m_farm->FP_Slurry( m_field, 0.0,
184  g_date->DayInYear( 30, 4 ) - g_date->DayInYear())) {
185  SimpleEvent( g_date->Date() + 1, osb_ferti_p2, true );
186  break;
187  }
188  }
189  // end of thread
190  break;
191 
192  // END of the special plant thread - this now joins at obs_spring_harrow
193 
194  //*** The stock farmers thread
195  case osb_ferti_s1:
196  if ( m_ev->m_lock || m_farm->DoIt( 62 ))
197  {
198  if (!m_farm->FA_Manure( m_field, 0.0,
199  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
200  SimpleEvent( g_date->Date() + 1, osb_ferti_s1, true );
201  break;
202  }
203  }
204  SimpleEvent( g_date->Date(),
205  osb_spring_plough_s, false );
206  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5,3 ),
207  osb_ferti_s2, false );
208  break;
209 
210  case osb_spring_plough_s:
211  if (!m_farm->SpringPlough( m_field, 0.0,
212  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
213  SimpleEvent( g_date->Date() + 1, osb_spring_plough_s, true );
214  break;
215  }
216  SimpleEvent( g_date->Date(),
217  osb_spring_harrow, false );
218  break;
219 
220  case osb_ferti_s2:
221  if ( m_ev->m_lock || m_farm->DoIt( 80 ))
222  {
223  if (!m_farm->FA_Slurry( m_field, 0.0,
224  g_date->DayInYear( 20, 4 ) - g_date->DayInYear())) {
225  SimpleEvent( g_date->Date() + 1, osb_ferti_s2, true );
226  break;
227  }
228  }
229  // end of thread
230  break;
231  // END of the special stock thread - this now joins at obs_spring_harrow
232 
233  case osb_spring_harrow:
234  if (!m_farm->SpringHarrow( m_field, 0.0,
235  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
236  SimpleEvent( g_date->Date() + 1, osb_spring_harrow, true );
237  break;
238  }
239  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,3 ),
240  osb_spring_sow1, false );
241  break;
242 
243  case osb_spring_sow1:
244  if (!m_farm->SpringSow( m_field, 0.0,
245  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
246  SimpleEvent( g_date->Date() + 1, osb_spring_sow1, true );
247  break;
248  }
249  OSB_SOW_DATE=g_date->DayInYear();
250  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25,3 ),
251  osb_spring_sow2, false );
252  break;
253 
254  case osb_spring_sow2:
255  if ( m_ev->m_lock || m_farm->DoIt( 60 ))
256  {
257  if (!m_farm->SpringSow( m_field, 0.0,
258  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
259  SimpleEvent( g_date->Date() + 1, osb_spring_sow2, true );
260  break;
261  }
262  }
263  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 16,3 ),
264  osb_spring_roll, false );
265  break;
266 
267  case osb_spring_roll:
268  if ( m_ev->m_lock || m_farm->DoIt( 90 ))
269  {
270  if (!m_farm->SpringRoll( m_field, 0.0,
271  g_date->DayInYear( 30,4 ) - g_date->DayInYear())) {
272  SimpleEvent( g_date->Date() + 1, osb_spring_roll, true );
273  break;
274  }
275  }
276  if (OSB_SOW_DATE+5 >g_date->DayInYear( 20,3 ))
277  SimpleEvent( g_date->OldDays() + OSB_SOW_DATE+5,
278  osb_strigling1, false );
279  else
280  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 20,3 ),
281  osb_strigling1, false );
282  break;
283 
284  case osb_strigling1:
285  if ( m_ev->m_lock || (cfg_strigling_prop.value()*m_farm->DoIt( 90 )))
286  {
287  if (!m_farm->Strigling( m_field, 0.0,
288  g_date->DayInYear( 20,4 ) - g_date->DayInYear())) {
289  SimpleEvent( g_date->Date() + 1, osb_strigling1, true );
290  break;
291  }
292  else
293  {
294  OSB_STRIGLING_DATE=g_date->Date();
295  if ( g_date->Date()+5<g_date->DayInYear( 10,4 ))
296  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10,4 ),
297  osb_strigling2, false );
298  else SimpleEvent( g_date->Date()+5, osb_strigling2, false );
299  }
300  break;
301  }
302  // didn't do strigling so straight to harvest
303  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,8 ),
304  osb_harvest, false );
305  break;
306 
307  case osb_strigling2:
308  if (!m_farm->Strigling( m_field, 0.0,
309  g_date->DayInYear( 25,4 ) - g_date->DayInYear())) {
310  SimpleEvent( g_date->Date() + 1, osb_strigling2, true );
311  break;
312  }
313  else
314  {
315  OSB_STRIGLING_DATE=g_date->Date();
316  if ( g_date->Date()+5<g_date->DayInYear( 21,4 ))
317  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 21,4 ),
318  osb_strigling3, false );
319  else SimpleEvent( g_date->Date()+5, osb_strigling3, false );
320  }
321  break;
322 
323  case osb_strigling3:
324  if ( m_ev->m_lock || (cfg_strigling_prop.value()*m_farm->DoIt( 89 )))
325  {
326  if (!m_farm->Strigling( m_field, 0.0,
327  g_date->DayInYear( 5,5 ) - g_date->DayInYear())) {
328  SimpleEvent( g_date->Date() + 1, osb_strigling3, true );
329  break;
330  }
331  }
332  SimpleEvent( g_date->OldDays() + m_field->GetMDates(0,0),
333  osb_harvest, false );
334  break;
335 
336  case osb_harvest:
337  if (!m_farm->Harvest( m_field, 0.0,
338  m_field->GetMDates(1,0) - g_date->DayInYear())) {
339  SimpleEvent( g_date->Date() + 1, osb_harvest, true );
340  break;
341  }
342  SimpleEvent( g_date->Date(), osb_straw_chopping, false );
343  break;
344 
345  case osb_straw_chopping:
346  if ( m_ev->m_lock || m_farm->DoIt( 20 ))
347  {
348  if (!m_farm->StrawChopping( m_field, 0.0,
349  m_field->GetMDates(1,1) - g_date->DayInYear())) {
350  SimpleEvent( g_date->Date() + 1, osb_straw_chopping, true );
351  break;
352  }
353  // END MAIN THREAD
354  done=true;
355  // --FN--
356  break;
357  }
358  SimpleEvent( g_date->OldDays() + m_field->GetMDates(0,2),
359  osb_hay, false );
360  break;
361 
362  case osb_hay:
363  if (!m_farm->HayBailing( m_field, 0.0,
364  m_field->GetMDates(1,2) - g_date->DayInYear())) {
365  SimpleEvent( g_date->Date() + 1, osb_hay, true );
366  break;
367  }
368  // END MAIN THREAD
369  done=true;
370  break;
371 
372  default:
373  g_msg->Warn( WARN_BUG, "OSpringBarley::Do(): "
374  "Unknown event type! ", "" );
375  exit( 1 );
376  }
377 
378  return done;
379 }
380 
381 
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
Farm::FA_Slurry
virtual bool FA_Slurry(LE *a_field, double a_user, int a_days)
Spready slurry on a_field owned by an stock farmer.
Definition: farmfuncs.cpp:965
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
osb_strigling1
Definition: OSpringBarley.h:51
Farm::IsStockFarmer
bool IsStockFarmer(void)
Definition: farm.h:905
Farm::Strigling
virtual bool Strigling(LE *a_field, double a_user, int a_days)
Carry out a mechanical weeding on a_field.
Definition: farmfuncs.cpp:1545
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
osb_spring_harrow
Definition: OSpringBarley.h:46
FarmEvent
A struct to hold the information required to trigger a farm event.
Definition: farm.h:463
osb_ferti_s2
Definition: OSpringBarley.h:41
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
osb_spring_roll
Definition: OSpringBarley.h:47
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
OSB_STRIGLING_DATE
#define OSB_STRIGLING_DATE
Definition: OSpringBarley.h:34
osb_start
Definition: OSpringBarley.h:37
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
osb_ferti_p2
Definition: OSpringBarley.h:39
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
osb_ferti_s1
Definition: OSpringBarley.h:40
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
osb_strigling3
Definition: OSpringBarley.h:53
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
osb_strigling2
Definition: OSpringBarley.h:52
OSpringBarley::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: OSpringBarley.cpp:33
osb_spring_plough_s
Definition: OSpringBarley.h:44
osb_harvest
Definition: OSpringBarley.h:42
osb_spring_sow1
Definition: OSpringBarley.h:48
Crop::m_farm
Farm * m_farm
Definition: farm.h:537
Crop::m_field
LE * m_field
Definition: farm.h:538
cfg_strigling_prop
CfgFloat cfg_strigling_prop
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
Farm::FP_Slurry
virtual bool FP_Slurry(LE *a_field, double a_user, int a_days)
Apply slurry to a_field owned by an arable farmer.
Definition: farmfuncs.cpp:701
OSB_SOW_DATE
#define OSB_SOW_DATE
Definition: OSpringBarley.h:33
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
osb_autumn_plough
Definition: OSpringBarley.h:45
Farm
The base class for all farm types.
Definition: farm.h:767
osb_spring_sow2
Definition: OSpringBarley.h:49
osb_hay
Definition: OSpringBarley.h:50
osb_straw_chopping
Definition: OSpringBarley.h:54
OSB_ISAUTUMNPLOUGH
#define OSB_ISAUTUMNPLOUGH
Definition: OSpringBarley.h:32
osb_spring_plough_p
Definition: OSpringBarley.h:43
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
osb_ferti_p1
Definition: OSpringBarley.h:38
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