ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
OCloverGrassSilage1.cpp
Go to the documentation of this file.
1 //
2 // OCloverGrassSilage1.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/OCloverGrassSilage1.h"
30 
31 
32 //---------------------------------------------------------------------------
33 
34 //#pragma package(smart_init)
35 
36 
37 using namespace std;
38 
39 bool OCloverGrassSilage1::Do( Farm *a_farm, LE *a_field, FarmEvent *a_ev )
40 {
41  m_farm = a_farm;
42  m_field = a_field;
43  m_ev = a_ev;
44 
45  bool done = false;
46 
47  switch ( m_ev->m_todo ) {
48  case ocgs1_start:
49  {
50  // Set up the date management stuff
51  // Could save the start day in case it is needed later
52  // m_field->m_startday = m_ev->m_startday;
53  m_last_date=g_date->DayInYear(30,8);
54  // Start and stop dates for all events after harvest
55  int noDates= 1;
56  m_field->SetMDates(0,0,g_date->DayInYear(27,7));
57  // Determined by harvest date - used to see if at all possible
58  m_field->SetMDates(1,0,g_date->DayInYear(30,8));
59  // Check the next crop for early start, unless it is a spring crop
60  // in which case we ASSUME that no checking is necessary!!!!
61  // So DO NOT implement a crop that runs over the year boundary
62  if (m_ev->m_startday>g_date->DayInYear(1,7))
63  {
64  if (m_field->GetMDates(0,0) >=m_ev->m_startday)
65  {
66  g_msg->Warn( WARN_BUG, "OCloverGrassSilage1::Do(): "
67  "Harvest too late for the next crop to start!!!", "" );
68  exit( 1 );
69  }
70  // Now fix any late finishing problems
71  for (int i=0; i<noDates; i++)
72  {
73  if (m_field->GetMDates(0,i)>=m_ev->m_startday)
74  m_field->SetMDates(0,i,m_ev->m_startday-1);
75  if (m_field->GetMDates(1,i)>=m_ev->m_startday)
76  m_field->SetMDates(1,i,m_ev->m_startday-1);
77  }
78  }
79  // Now no operations can be timed after the start of the next crop.
80 
81  int d1;
82 
83  int today=g_date->Date();
84  d1 = g_date->OldDays() + m_first_date+365; // Add 365 for spring crop
85  if (today > d1)
86  {
87  // Yes too late - should not happen - raise an error
88  g_msg->Warn( WARN_BUG, " OCloverGrassSilage1::Do(): "
89  "Crop start attempt after last possible start date", "" );
90  exit( 1 );
91  }
92  // Reinit d1 to first possible starting date.
93  d1 = g_date->OldDays()+m_first_date;;
94  if ( ! m_ev->m_first_year ) d1+=365; // Add 365 for spring crop (not 1st yr)
95  if ( g_date->Date() > d1 ) {
96  d1 = g_date->Date();
97  }
98  m_field->SetLastSownVeg( m_field->GetVegType() ); //Force last sown, needed for goose habitat classification
99  // OK, let's go.
100  OCGS1_CUT_DATE=0;
101  OCGS1_SLURRY=false;
102  SimpleEvent( d1, ocgs1_ferti_zero, false );
103  }
104  break;
105 
106  case ocgs1_ferti_zero:
107  if ( m_ev->m_lock || m_farm->DoIt( 100 ))
108  {
109  if (!m_farm->FA_Slurry( m_field, 0.0,
110  g_date->DayInYear( 30, 4 ) - g_date->DayInYear())) {
111  // We didn't do it today, try again tomorrow.
112  SimpleEvent( g_date->Date() + 1, ocgs1_ferti_zero, true );
113  break;
114  }
115  else OCGS1_SLURRY=true;
116  }
117  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25, 5 ),
118  ocgs1_cut_to_silage, false );
119  // Start a watering thread
120  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1, 6 ),
121  ocgs1_water_zero, false );
122  break;
123 
124  case ocgs1_cut_to_silage:
125  if (!m_farm->CutToSilage( m_field, 0.0,
126  g_date->DayInYear( 15, 6 ) - g_date->DayInYear())) {
127  // We didn't do it today, try again tomorrow.
128  SimpleEvent( g_date->Date() + 1, ocgs1_cut_to_silage, true );
129  break;
130  }
131  OCGS1_CUT_DATE = g_date->DayInYear();
132  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25,5 ),
133  ocgs1_ferti_one, false );
134  break;
135 
136  case ocgs1_water_zero:
137  if ( m_ev->m_lock || m_farm->DoIt( 30 ))
138  {
139  if (!m_farm->Water( m_field, 0.0,
140  g_date->DayInYear( 15, 6 ) - g_date->DayInYear())) {
141  // We didn't do it today, try again tomorrow.
142  SimpleEvent( g_date->Date() + 1, ocgs1_water_zero, true );
143  break;
144  }
145  // Success
146  if ( (g_date->DayInYear()+7)<g_date->DayInYear( 25,6 ) )
147  SimpleEvent( g_date->Date() + 7,
148  ocgs1_water_one, false );
149  else
150  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 25,6 ),
151  ocgs1_water_one, false );
152  break;
153  }
154  // Didn't water so let the thread die
155  break;
156 
157  case ocgs1_water_one:
158  if ( m_ev->m_lock || m_farm->DoIt( 67 )) //**CJT** check this or 20
159  {
160  if (!m_farm->Water( m_field, 0.0,
161  g_date->DayInYear( 25, 7 ) - g_date->DayInYear())) {
162  // We didn't do it today, try again tomorrow.
163  SimpleEvent( g_date->Date() + 1, ocgs1_water_one, true );
164  break;
165  }
166  }
167  break;
168  // End of watering thread
169 
170  case ocgs1_ferti_one:
171  if(OCGS1_SLURRY) // if did it before
172  {
173  if (!m_farm->FA_Slurry( m_field, 0.0,
174  (OCGS1_CUT_DATE+4) - g_date->DayInYear()))
175  {
176  SimpleEvent( g_date->Date() + 1, ocgs1_ferti_one, true );
177  break;
178  }
179  }
180  // Three weeks later
181  SimpleEvent( g_date->Date()+21, ocgs1_cut_to_silage1, false );
182  break;
183 
185  if (!m_farm->CutToSilage( m_field, 0.0,
186  g_date->DayInYear( 30, 6 ) - g_date->DayInYear())) {
187  // We didn't do it today, try again tomorrow.
188  // --FN-- 26/01-2001
189  SimpleEvent( g_date->Date() + 1, ocgs1_cut_to_silage1, true );
190  break;
191  }
192  // Success so queue up the next event
193  OCGS1_CUT_DATE=g_date->DayInYear();
194  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15, 6 ),
195  ocgs1_ferti_two, false );
196  break;
197 
198  case ocgs1_ferti_two:
199  if (!m_farm->FA_Slurry( m_field, 0.0,
200  (OCGS1_CUT_DATE+4) - g_date->DayInYear())) {
201  SimpleEvent( g_date->Date() + 1, ocgs1_ferti_two, true );
202  break;
203  }
204  if ( (g_date->DayInYear(16,7))< OCGS1_CUT_DATE+21 )
205  SimpleEvent( g_date->OldDays() + (OCGS1_CUT_DATE+21),
206  ocgs1_cut_to_silage2, false );
207  else
208  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 6,7 ),
209  ocgs1_cut_to_silage2, false );
210  break;
211 
213  if (!m_farm->CutToSilage( m_field, 0.0,
214  g_date->DayInYear( 5,8 ) - g_date->DayInYear()))
215  {
216  // We didn't do it today, try again tomorrow.
217  SimpleEvent( g_date->Date() + 1, ocgs1_cut_to_silage2, true );
218  break;
219  }
220  OCGS1_CUT_DATE=g_date->DayInYear();
221  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 6,7 ),
222  ocgs1_ferti_three, false );
223  break;
224 
225  case ocgs1_ferti_three:
226  if ( m_ev->m_lock || m_farm->DoIt( 60 ))
227  {
228  if (!m_farm->FA_Slurry( m_field, 0.0,
229  (OCGS1_CUT_DATE+4) - g_date->DayInYear())) {
230  SimpleEvent( g_date->Date() + 1, ocgs1_ferti_three, true );
231  break;
232  }
233  }
234  if ( (g_date->DayInYear(27,7))< OCGS1_CUT_DATE+21 )
235  SimpleEvent( g_date->OldDays() + (OCGS1_CUT_DATE+21),
236  // --FN-- 26/01-2001
237  ocgs1_cut_to_silage3, false );
238  else
239  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 27,7 ),
240  ocgs1_cut_to_silage3, false );
241  break;
242 
244  if ( m_ev->m_lock || m_farm->DoIt( 40 ))
245  {
246  if (!m_farm->CutToSilage( m_field, 0.0,
247  m_field->GetMDates(1,0) - g_date->DayInYear()))
248  {
249  // We didn't do it today, try again tomorrow.
250  SimpleEvent( g_date->Date() + 1, ocgs1_cut_to_silage3, true );
251  break;
252  }
253  }
254  done=true; // END MAIN THREAD
255  break;
256 
257  default:
258  g_msg->Warn( WARN_BUG, "OCloverGrassGrazed1::Do(): "
259  "Unknown event type! ", "" );
260  exit( 1 );
261  }
262  return done;
263 }
264 //---------------------------------------------------------------------------
FarmEvent
A struct to hold the information required to trigger a farm event.
Definition: farm.h:463
ocgs1_water_one
Definition: OCloverGrassSilage1.h:46
OCGS1_SLURRY
#define OCGS1_SLURRY
Definition: OCloverGrassSilage1.h:32
ocgs1_ferti_two
Definition: OCloverGrassSilage1.h:39
ocgs1_ferti_zero
Definition: OCloverGrassSilage1.h:37
ocgs1_cut_to_silage1
Definition: OCloverGrassSilage1.h:42
ocgs1_ferti_three
Definition: OCloverGrassSilage1.h:40
ocgs1_cut_to_silage2
Definition: OCloverGrassSilage1.h:43
OCloverGrassSilage1::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: OCloverGrassSilage1.cpp:39
Farm
The base class for all farm types.
Definition: farm.h:767
ocgs1_cut_to_silage
Definition: OCloverGrassSilage1.h:41
OCGS1_CUT_DATE
#define OCGS1_CUT_DATE
Definition: OCloverGrassSilage1.h:31
ocgs1_ferti_one
Definition: OCloverGrassSilage1.h:38
ocgs1_start
Definition: OCloverGrassSilage1.h:36
ocgs1_cut_to_silage3
Definition: OCloverGrassSilage1.h:44
ocgs1_water_zero
Definition: OCloverGrassSilage1.h:45