ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
OSpringBarleyExt.cpp
Go to the documentation of this file.
1 //
2 // OSpringBarleyExt.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/OSpringBarleyExt.h"
30 
31 extern CfgFloat cfg_strigling_prop;
32 
33 bool OSpringBarleyExt::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 osbext_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  osbext_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, osbext_autumn_plough, false );
120  OSBEXT_ISAUTUMNPLOUGH=false;
121  OSBEXT_SOW_DATE=0;
123  }
124  break;
125 
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, osbext_autumn_plough, true );
132  break;
133  }
135  if (m_farm->IsStockFarmer()) // StockFarmer
136  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5,3 ) + 365,
137  osbext_ferti_s2, false );
138  else // PlantFarmer
139  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1, 4 ) + 365,
140  osbext_ferti_p2, false );
141  // both must start this second thread
142  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
143  osbext_spring_harrow, false );
144  break;
145  }
146  if (m_farm->IsStockFarmer()) // StockFarmer
147  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
148  osbext_ferti_s1, false );
149  else // PlantFarmer
150  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ) + 365,
151  osbext_ferti_p1, false );
152  break;
153 
154  //*** The plant farmers thread
155  case osbext_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, osbext_ferti_p1, true );
161  break;
162  }
163  }
164  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 3 ),
165  osbext_spring_plough_p, false );
166  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 30 ,4 ),
167  osbext_ferti_p2, false );
168  break;
169 
171  if (!m_farm->SpringPlough( m_field, 0.0,
172  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
173  SimpleEvent( g_date->Date() + 1, osbext_spring_plough_p, true );
174  break;
175  }
176  // --FN--
177  SimpleEvent( g_date->Date(), osbext_spring_harrow, false );
178  break;
179 
180  case osbext_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, osbext_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 osbext_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, osbext_ferti_s1, true );
201  break;
202  }
203  }
204  SimpleEvent( g_date->Date(),
205  osbext_spring_plough_s, false );
206  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5,3 ),
207  osbext_ferti_s2, false );
208  break;
209 
211  if (!m_farm->SpringPlough( m_field, 0.0,
212  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
213  SimpleEvent( g_date->Date() + 1, osbext_spring_plough_s, true );
214  break;
215  }
216  SimpleEvent( g_date->Date(),
217  osbext_spring_harrow, false );
218  break;
219 
220  case osbext_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, osbext_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 
234  if (!m_farm->SpringHarrow( m_field, 0.0,
235  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
236  SimpleEvent( g_date->Date() + 1, osbext_spring_harrow, true );
237  break;
238  }
239  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,3 ),
240  osbext_spring_sow1, false );
241  break;
242 
243  case osbext_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, osbext_spring_sow1, true );
247  break;
248  }
249  OSBEXT_SOW_DATE=g_date->DayInYear();
250  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25,3 ),
251  osbext_spring_sow2, false );
252  break;
253 
254  case osbext_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, osbext_spring_sow2, true );
260  break;
261  }
262  }
263  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 16,3 ),
264  osbext_spring_roll, false );
265  break;
266 
267  case osbext_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, osbext_spring_roll, true );
273  break;
274  }
275  }
276  if (OSBEXT_SOW_DATE+5 >g_date->DayInYear( 20,3 ))
277  SimpleEvent( g_date->OldDays() + OSBEXT_SOW_DATE+5,
278  osbext_strigling1, false );
279  else
280  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 20,3 ),
281  osbext_strigling1, false );
282  break;
283 
284  case osbext_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, osbext_strigling1, true );
290  break;
291  }
292  else
293  {
294  OSBEXT_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  osbext_strigling2, false );
298  else SimpleEvent( g_date->Date()+5, osbext_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  osbext_harvest, false );
305  break;
306 
307  case osbext_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, osbext_strigling2, true );
311  break;
312  }
313  else
314  {
315  OSBEXT_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  osbext_strigling3, false );
319  else SimpleEvent( g_date->Date()+5, osbext_strigling3, false );
320  }
321  break;
322 
323  case osbext_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, osbext_strigling3, true );
329  break;
330  }
331  }
332  SimpleEvent( g_date->OldDays() + m_field->GetMDates(0,0),
333  osbext_harvest, false );
334  break;
335 
336  case osbext_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, osbext_harvest, true );
340  break;
341  }
342  SimpleEvent( g_date->Date(), osbext_straw_chopping, false );
343  break;
344 
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, osbext_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  osbext_hay, false );
360  break;
361 
362  case osbext_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, osbext_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
osbext_strigling2
Definition: OSpringBarleyExt.h:52
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::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
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
osbext_autumn_plough
Definition: OSpringBarleyExt.h:45
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
osbext_spring_sow2
Definition: OSpringBarleyExt.h:49
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
osbext_strigling1
Definition: OSpringBarleyExt.h:51
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
osbext_spring_sow1
Definition: OSpringBarleyExt.h:48
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
osbext_ferti_s2
Definition: OSpringBarleyExt.h:41
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
osbext_harvest
Definition: OSpringBarleyExt.h:42
osbext_start
Definition: OSpringBarleyExt.h:37
osbext_straw_chopping
Definition: OSpringBarleyExt.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
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
osbext_strigling3
Definition: OSpringBarleyExt.h:53
osbext_spring_plough_s
Definition: OSpringBarleyExt.h:44
OSpringBarleyExt::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: OSpringBarleyExt.cpp:33
OSBEXT_SOW_DATE
#define OSBEXT_SOW_DATE
Definition: OSpringBarleyExt.h:33
osbext_spring_plough_p
Definition: OSpringBarleyExt.h:43
Crop::m_farm
Farm * m_farm
Definition: farm.h:537
Crop::m_field
LE * m_field
Definition: farm.h:538
OSBEXT_STRIGLING_DATE
#define OSBEXT_STRIGLING_DATE
Definition: OSpringBarleyExt.h:34
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
cfg_strigling_prop
CfgFloat cfg_strigling_prop
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
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
osbext_spring_harrow
Definition: OSpringBarleyExt.h:46
osbext_hay
Definition: OSpringBarleyExt.h:50
Farm
The base class for all farm types.
Definition: farm.h:767
osbext_ferti_p1
Definition: OSpringBarleyExt.h:38
OSBEXT_ISAUTUMNPLOUGH
#define OSBEXT_ISAUTUMNPLOUGH
Definition: OSpringBarleyExt.h:32
osbext_ferti_p2
Definition: OSpringBarleyExt.h:39
osbext_ferti_s1
Definition: OSpringBarleyExt.h:40
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
osbext_spring_roll
Definition: OSpringBarleyExt.h:47
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