ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
OSpringBarleyPigs.cpp
Go to the documentation of this file.
1 //
2 // OSpringBarleyPigs.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/OSpringBarleyPigs.h"
30 
31 extern CfgFloat cfg_strigling_prop;
32 
33 bool OSpringBarleyPigs::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 osbp_start:
44  {
45  // Start date checking block.
46  int d1 = g_date->OldDays() + g_date->DayInYear( 10, 4 );
47  if ( ! m_ev->m_first_year ) {
48  if (g_date->Date() > d1) {
49  // No, later. It might be possible to start next spring if
50  // we are called very late in the year.
51  d1 = g_date->OldDays() + g_date->DayInYear( 1, 7 );
52  if (g_date->Date() >= d1) {
53  // We can run next spring!
54  // Calculate starting date.
55  d1 = g_date->OldDays() + g_date->DayInYear( 1, 3 ) + 365;
56  } else {
57  // Not possible to run. Bail out.
58  done = true;
59  break;
60  }
61  }
62  }
63  // End date checking block.
64  SimpleEvent( d1, osbp_spring_plough, false );
65  SimpleEvent( d1, osbp_ferti, false );
66  }
67  break;
68 
69 
70  case osbp_spring_plough:
71  if (!m_farm->SpringPlough( m_field, 0.0,
72  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
73  SimpleEvent( g_date->Date() + 1, osbp_spring_plough, true );
74  break;
75  }
76  SimpleEvent( g_date->Date(), osbp_spring_harrow, false );
77  break;
78 
79  case osbp_ferti:
80  if (!m_farm->FP_Slurry( m_field, 0.0,
81  g_date->DayInYear( 10, 4 ) - g_date->DayInYear())) {
82  SimpleEvent( g_date->Date() + 1, osbp_ferti, true );
83  break;
84  }
85  // end of thread
86  break;
87 
88  case osbp_spring_harrow:
89  if (!m_farm->SpringHarrow( m_field, 0.0,
90  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
91  SimpleEvent( g_date->Date() + 1, osbp_spring_harrow, true );
92  break;
93  }
94  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15,3 ),
95  osbp_spring_sow1, false );
96  break;
97 
98  case osbp_spring_sow1:
99  if (!m_farm->SpringSow( m_field, 0.0,
100  g_date->DayInYear( 15,4 ) - g_date->DayInYear())) {
101  SimpleEvent( g_date->Date() + 1, osbp_spring_sow1, true );
102  break;
103  }
104  OSBP_SOW_DATE=g_date->DayInYear();
105  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 16,3 ),
106  osbp_spring_roll, false );
107  break;
108 
109  case osbp_spring_roll:
110  if ( m_ev->m_lock || m_farm->DoIt( 90 ))
111  {
112  if (!m_farm->SpringRoll( m_field, 0.0,
113  g_date->DayInYear( 25,4 ) - g_date->DayInYear())) {
114  SimpleEvent( g_date->Date() + 1, osbp_spring_roll, true );
115  break;
116  }
117  }
118  if (OSBP_SOW_DATE+5 >g_date->DayInYear( 20,3 ))
119  SimpleEvent( g_date->OldDays() + OSBP_SOW_DATE+5,
120  osbp_strigling1, false );
121  else
122  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 20,3 ),
123  osbp_strigling1, false );
124  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25,3 ),
125  osbp_strigling_sow, false );
126  break;
127 
128  case osbp_strigling1:
129  if ( m_ev->m_lock || (cfg_strigling_prop.value() * m_farm->DoIt( 90 )))
130  {
131  if (!m_farm->Strigling( m_field, 0.0,
132  g_date->DayInYear( 20,4 ) - g_date->DayInYear())) {
133  SimpleEvent( g_date->Date() + 1, osbp_strigling1, true );
134  break;
135  }
136  OSBP_STRIGLING_DATE=g_date->Date();
137  // End of thread
138  }
139  break;
140 
141  case osbp_strigling_sow:
142  if ( m_ev->m_lock || m_farm->DoIt( 60 ))
143  {
144  if (!m_farm->StriglingSow( m_field, 0.0,
145  g_date->DayInYear( 30,4 ) - g_date->DayInYear())) {
146  SimpleEvent( g_date->Date() + 1, osbp_strigling_sow, true );
147  break;
148  }
149  else
150  {
151  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,8 ),
152  osbp_harvest, false );
153  break;
154  }
155  }
156  {
157  long newdate1 = g_date->OldDays() + g_date->DayInYear( 25,3 );
158  long newdate2 = OSBP_STRIGLING_DATE + 5;
159  if ( newdate2 > newdate1 )
160  newdate1 = newdate2;
161  SimpleEvent( newdate1, osbp_strigling2, false );
162  }
163  // End of thread
164  break;
165 
166  case osbp_strigling2:
167  if (!m_farm->Strigling( m_field, 0.0,
168  g_date->DayInYear( 5,5 ) - g_date->DayInYear())) {
169  SimpleEvent( g_date->Date() + 1, osbp_strigling2, true );
170  break;
171  }
172  {
173  long newdate1 = g_date->OldDays() + g_date->DayInYear( 30,3 );
174  long newdate2 = g_date->Date() + 5;
175  if ( newdate2 > newdate1 )
176  newdate1 = newdate2;
177  SimpleEvent( newdate1, osbp_strigling3, false );
178  }
179  break;
180 
181  case osbp_strigling3:
182  if ( m_ev->m_lock || (cfg_strigling_prop.value() * m_farm->DoIt( 89 )))
183  {
184  if (!m_farm->Strigling( m_field, 0.0,
185  g_date->DayInYear( 15,5 ) - g_date->DayInYear())) {
186  SimpleEvent( g_date->Date() + 1, osbp_strigling3, true );
187  break;
188  }
189  }
190  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1,8 ),
191  osbp_harvest, false );
192  break;
193 
194  case osbp_harvest:
195  if (!m_farm->Harvest( m_field, 0.0,
196  g_date->DayInYear( 15,8 ) - g_date->DayInYear())) {
197  SimpleEvent( g_date->Date() + 1, osbp_harvest, true );
198  break;
199  }
200  SimpleEvent( g_date->Date(), osbp_straw_chopping, false );
201  break;
202 
203  case osbp_straw_chopping:
204  if ( m_ev->m_lock || m_farm->DoIt( 20 ))
205  {
206  if (!m_farm->StrawChopping( m_field, 0.0,
207  g_date->DayInYear( 15,8 ) - g_date->DayInYear())) {
208  SimpleEvent( g_date->Date() + 1, osbp_straw_chopping, true );
209  break;
210  }
211  // END MAIN THREAD
212  done=true;
213  break;
214  }
215  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5,8 ),
216  osbp_hay, false );
217  break;
218 
219  case osbp_hay:
220  if (!m_farm->HayBailing( m_field, 0.0,
221  g_date->DayInYear( 20,8 ) - g_date->DayInYear())) {
222  SimpleEvent( g_date->Date() + 1, osbp_hay, true );
223  break;
224  }
225  // END MAIN THREAD
226  done=true;
227  break;
228 
229  default:
230  g_msg->Warn( WARN_BUG, "OSpringBarleyPigs::Do(): "
231  "Unknown event type! ", "" );
232  exit( 1 );
233  }
234 
235  return done;
236 }
237 
238 
osbp_harvest
Definition: OSpringBarleyPigs.h:38
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
osbp_ferti
Definition: OSpringBarleyPigs.h: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::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
osbp_spring_sow1
Definition: OSpringBarleyPigs.h:43
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
cfg_strigling_prop
CfgFloat cfg_strigling_prop
osbp_hay
Definition: OSpringBarleyPigs.h:45
osbp_straw_chopping
Definition: OSpringBarleyPigs.h:49
osbp_spring_roll
Definition: OSpringBarleyPigs.h:42
osbp_spring_harrow
Definition: OSpringBarleyPigs.h:41
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
osbp_start
Definition: OSpringBarleyPigs.h:36
osbp_strigling3
Definition: OSpringBarleyPigs.h:48
OSBP_SOW_DATE
#define OSBP_SOW_DATE
Definition: OSpringBarleyPigs.h:32
osbp_strigling_sow
Definition: OSpringBarleyPigs.h:44
OSpringBarleyPigs::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: OSpringBarleyPigs.cpp:33
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
osbp_spring_plough
Definition: OSpringBarleyPigs.h:39
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::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
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::StriglingSow
virtual bool StriglingSow(LE *a_field, double a_user, int a_days)
Carry out a mechanical weeding followed by sowing on a_field.
Definition: farmfuncs.cpp:1597
Farm
The base class for all farm types.
Definition: farm.h:767
osbp_strigling1
Definition: OSpringBarleyPigs.h:46
osbp_strigling2
Definition: OSpringBarleyPigs.h:47
OSBP_STRIGLING_DATE
#define OSBP_STRIGLING_DATE
Definition: OSpringBarleyPigs.h:33
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
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