ALMaSS Hare ODDox  1.1
The hare model description following ODdox protocol
NorwegianPotatoes.cpp
Go to the documentation of this file.
1 //
2 // Potatoes.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/NorwegianPotatoes.h"
30 
31 #include <stdio.h>
32 
33 extern CfgFloat cfg_ins_app_prop1;
34 extern CfgFloat cfg_herbi_app_prop;
35 extern CfgFloat cfg_fungi_app_prop1;
36 extern CfgFloat cfg_greg_app_prop;
37 
38 bool NorwegianPotatoes::Do( Farm *a_farm, LE *a_field, FarmEvent *a_ev )
39 {
40  m_farm = a_farm;
41  m_field = a_field;
42  m_ev = a_ev;
43 
44  bool done = false;
45 
46  switch ( m_ev->m_todo ) {
47  case npe_start:
48  {
49  NPOT_SLURRY_DATE = 0;
50  NPOT_HERBI_DATE = 0;
51  NPOT_STRIG_DATE = 0;
52  NPOT_HILL_DATE = 0;
53  NPOT_DID_TREAT = false;
54  NPOT_DID_HILL = false;
55  m_field->SetVegPatchy(true); // root crop
56 
57  // Set up the date management stuff
58  m_last_date=g_date->DayInYear(24,10);
59  // Start and stop dates for all events after harvest
60  int noDates= 1;
61  m_field->SetMDates(0,0,g_date->DayInYear(6,9));
62  // Determined by harvest date - used to see if at all possible
63  m_field->SetMDates(1,0,g_date->DayInYear(24,10));
64  // Check the next crop for early start, unless it is a spring crop
65  // in which case we ASSUME that no checking is necessary!!!!
66  // So DO NOT implement a crop that runs over the year boundary
67 
68  //new if: do the check only for non-optimising farms and if year>0. (030713 - m_rotation used only in the hidden year, so I modified the condition from >7 to >0)
69  int d1;
70  if(!(m_farm->GetType() == tof_OptimisingFarm && g_date->GetYearNumber()>0)){
71 
72  if (m_ev->m_startday>g_date->DayInYear(1,7))
73  {
74  if (m_field->GetMDates(0,0) >=m_ev->m_startday)
75  {
76  char veg_type[20];
77  sprintf(veg_type, "%d", m_ev->m_next_tov);
78  g_msg->Warn( WARN_BUG, "NorwegianPotatoes::Do(): : Harvest too late for the next crop to start!!! The next crop is: ", veg_type);
79  exit( 1 );
80  }
81  // Now fix any late finishing problems
82  for (int i=0; i<noDates; i++) {
83  if(m_field->GetMDates(0,i)>=m_ev->m_startday) {
84  m_field->SetMDates(0,i,m_ev->m_startday-1); //move the starting date
85  }
86  if(m_field->GetMDates(1,i)>=m_ev->m_startday){
87  m_field->SetMConstants(i,0);
88  m_field->SetMDates(1,i,m_ev->m_startday-1); //move the finishing date
89  }
90  }
91  }
92  // Now no operations can be timed after the start of the next crop.
93 
94  if ( ! m_ev->m_first_year )
95  {
96  int today=g_date->Date();
97  // Are we before July 1st?
98  d1 = g_date->OldDays() + g_date->DayInYear( 1,7 );
99  if (today < d1)
100  {
101  // Yes, too early. We assumme this is because the last crop was late
102  g_msg->Warn( WARN_BUG, "Potatoes::Do(): "
103  "Crop start attempt between 1st Jan & 1st July", "" );
104  exit( 1 );
105  }
106  else
107  {
108  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
109  if (today > d1)
110  {
111  // Yes too late - should not happen - raise an error
112  g_msg->Warn( WARN_BUG, "Potatoes::Do(): "
113  "Crop start attempt after last possible start date", "" );
114  exit( 1 );
115  }
116  }
117  }
118  else
119  {
120  SimpleEvent( g_date->OldDays() + g_date->DayInYear(1,3),
121  npe_spring_plough, false );
122  break;
123  }
124  }//if
125 
126  // End single block date checking code. Please see next line
127  // comment as well.
128  // Reinit d1 to first possible starting date.
129  d1 = g_date->OldDays() + m_first_date; // Add 365 for spring crop
130  if ( g_date->Date() > d1 ) {
131  d1 = g_date->Date();
132  }
133  // OK, let's go.
134 
135  if ( m_farm->DoIt( 75 )) {
136  SimpleEvent( d1,npe_autumn_plough, false );
137  } else {
138  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1, 3 ) + 365,
139  npe_spring_plough, false );
140  }
141  }
142  break;
143 
144  case npe_autumn_plough:
145  if (!m_farm->AutumnPlough( m_field, 0.0,
146  g_date->DayInYear( 1, 12 ) -
147  g_date->DayInYear())) {
148  SimpleEvent( g_date->Date() + 1, npe_autumn_plough, false );
149  break;
150  }
151  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 20, 3 ) + 365,
152  npe_spring_harrow, false );
153  break;
154 
155  case npe_spring_plough:
156  if (!m_farm->SpringPlough( m_field, 0.0,
157  g_date->DayInYear( 15, 4 ) -
158  g_date->DayInYear())) {
159  SimpleEvent( g_date->Date() + 1, npe_spring_plough, false );
160  break;
161  }
162  {
163  int d1 = g_date->OldDays() + g_date->DayInYear( 20, 3 );
164  if ( g_date->Date() > d1 ) {
165  d1 = g_date->Date();
166  }
167  SimpleEvent( d1, npe_spring_harrow, false );
168  }
169  break;
170 
171  case npe_spring_harrow:
172  if (!m_farm->SpringHarrow( m_field, 0.0,
173  g_date->DayInYear( 24, 4 ) - g_date->DayInYear())) {
174  SimpleEvent( g_date->Date() + 1, npe_spring_harrow, false );
175  break;
176  }
177  if ( m_farm->IsStockFarmer()) {
178  // Do fa_slurry before sowing.
179  int d1 = g_date->OldDays() + g_date->DayInYear( 27, 3 );
180  if ( g_date->Date() > d1 ) {
181  d1 = g_date->Date();
182  }
183  SimpleEvent( d1, npe_fa_slurry, false );
184  } else {
185  int d1 = g_date->OldDays() + g_date->DayInYear( 1, 4 );
186  if ( g_date->Date() > d1 ) {
187  d1 = g_date->Date();
188  }
189  SimpleEvent( d1, npe_spring_sow, false );
190  }
191  break;
192 
193  case npe_fa_slurry:
194  if ( m_ev->m_lock || m_farm->DoIt( 30 )) {
195  if (!m_farm->FA_Slurry( m_field, 0.0,
196  g_date->DayInYear( 1, 5 ) -
197  g_date->DayInYear())) {
198  SimpleEvent( g_date->Date() + 1, npe_fa_slurry, true );
199  break;
200  }
201  NPOT_SLURRY_DATE = g_date->DayInYear();
202  }
203  {
204  int d1 = g_date->OldDays() + g_date->DayInYear( 1, 4 );
205  if ( g_date->Date() > d1 ) {
206  d1 = g_date->Date();
207  }
208  SimpleEvent( d1, npe_spring_sow, false );
209  }
210  break;
211 
212  case npe_spring_sow:
213  {
214  int time_to_waste;
215  if ( NPOT_SLURRY_DATE ) {
216  time_to_waste = NPOT_SLURRY_DATE + 3;
217  if ( time_to_waste > g_date->DayInYear( 1, 5 )) {
218  time_to_waste = g_date->DayInYear( 1, 5 );
219  }
220  } else {
221  time_to_waste = g_date->DayInYear( 1, 5 );
222  }
223  if (!m_farm->SpringSow( m_field, 0.0,
224  time_to_waste -
225  g_date->DayInYear())) {
226  SimpleEvent( g_date->Date() + 1, npe_spring_sow, false );
227  break;
228  }
229  // Did sowing, now add fa/fp_npk as well today.
230  if ( m_farm->IsStockFarmer()) {
231  m_farm->FA_NPK( m_field, 0.0, 0);
232  } else {
233  m_farm->FP_NPK( m_field, 0.0, 0);
234  }
235  }
236 
237  // Each of the three threads below need to set flags when they terminate
238  // so that the last one can start the insecticide thread
239  //
240  // Start hilling up sub thread.
241  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 15, 5 ),
242  npe_hilling, false );
243 
244  if ( m_farm->DoIt( 80 )) { // was 80
245  // Start herbicide treatment thread.
246  int d1 = g_date->OldDays() + g_date->DayInYear( 10, 4 );
247  if ( g_date->Date() + 10 > d1 ) {
248  d1 = g_date->Date() + 10;
249  }
250  SimpleEvent( d1, npe_herbi_one, false );
251  } else {
252  // Strigling thread.
253  int d1 = g_date->OldDays() + g_date->DayInYear( 14, 4 );
254  if ( g_date->Date() + 10 > d1 ) {
255  d1 = g_date->Date() + 10;
256  }
257  SimpleEvent( d1, npe_strigling_one, false );
258  }
259  break;
260 
261  case npe_strigling_one:
262  if ( NPOT_HILL_DATE &&
263  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
264  // Too close to hilling, try again tomorrow.
265  SimpleEvent( g_date->Date() + 1, npe_strigling_one, false );
266  break;
267  }
268  if (!m_farm->Strigling( m_field, 0.0,
269  g_date->DayInYear( 25, 5 ) - g_date->DayInYear())) {
270  SimpleEvent( g_date->Date() + 1, npe_strigling_one, false );
271  break;
272  }
273  NPOT_STRIG_DATE = g_date->Date();
274  {
275  int d1 = g_date->OldDays() + g_date->DayInYear( 21, 4 );
276  if ( g_date->Date() + 7 > d1 ) {
277  d1 = g_date->Date() + 7;
278  }
279  SimpleEvent( d1, npe_strigling_two, false );
280  }
281  break;
282 
283  case npe_strigling_two:
284  if ( NPOT_HILL_DATE &&
285  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
286  // Too close to hilling, try again tomorrow.
287  SimpleEvent( g_date->Date() + 1, npe_strigling_two, false );
288  break;
289  }
290  if (!m_farm->Strigling( m_field, 0.0,
291  g_date->DayInYear( 3, 6 ) - g_date->DayInYear())) {
292  SimpleEvent( g_date->Date() + 1, npe_strigling_two, false );
293  break;
294  }
295  NPOT_STRIG_DATE = g_date->Date();
296  {
297  int d1 = g_date->OldDays() + g_date->DayInYear( 30, 4 );
298  if ( g_date->Date() + 7 > d1 ) {
299  d1 = g_date->Date() + 7;
300  }
301  SimpleEvent( d1, npe_strigling_three, false );
302  }
303  break;
304 
305  case npe_strigling_three:
306  if ( NPOT_HILL_DATE &&
307  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
308  // Too close to hilling, try again tomorrow.
309  SimpleEvent( g_date->Date() + 1, npe_strigling_three, false );
310  break;
311  }
312  if (!m_farm->Strigling( m_field, 0.0,
313  g_date->DayInYear( 12, 6 ) -
314  g_date->DayInYear())) {
315  SimpleEvent( g_date->Date() + 1, npe_strigling_three, true );
316  break;
317  }
318  NPOT_STRIG_DATE = g_date->Date();
319  NPOT_DID_TREAT = true;
320  if ( NPOT_DID_HILL && NPOT_DID_TREAT) {
321  // last surviving tread, start insecticide.
322  int d1 = g_date->OldDays() + g_date->DayInYear( 10, 6 );
323  if ( g_date->Date() + 3 > d1 ) {
324  d1 = g_date->Date() + 3;
325  }
326  SimpleEvent( d1, npe_insecticide, false );
327  }
328  break;
329 
330  case npe_herbi_one:
331  if (( m_ev->m_lock || m_farm->DoIt( (int) (80*cfg_herbi_app_prop.value() * m_farm->Prob_multiplier())))) //modified probability
332  {
333  if ( NPOT_HILL_DATE &&
334  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
335  // Too close to hilling, try again tomorrow.
336  SimpleEvent( g_date->Date() + 1, npe_herbi_one, false );
337  break;
338  }
339  if (!m_farm->HerbicideTreat( m_field, 0.0,
340  g_date->DayInYear( 12, 5 ) -
341  g_date->DayInYear())) {
342  SimpleEvent( g_date->Date() + 1, npe_herbi_one, false );
343  break;
344  }
345  NPOT_HERBI_DATE = g_date->Date();
346  {
347  int d1 = g_date->OldDays() + g_date->DayInYear( 20, 4 );
348  if ( g_date->Date() + 10 > d1 ) {
349  d1 = g_date->Date() + 10;
350  }
351  SimpleEvent( d1, npe_herbi_two, false );
352  }
353  }
354  else {
355  NPOT_DID_TREAT = true; // Need to signal the finish of this thread
356  if ( NPOT_DID_HILL && NPOT_DID_TREAT ) {
357  // last surviving tread, start insecticide.
358  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 6 ),
359  npe_insecticide, false );
360  }
361  }
362  break;
363 
364  case npe_herbi_two:
365  if (( m_ev->m_lock || m_farm->DoIt( (int) (50*cfg_herbi_app_prop.value() * m_farm->Prob_multiplier() )))) //modified probability
366  {
367  if ( NPOT_HILL_DATE &&
368  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
369  // Too close to hilling, try again tomorrow.
370  SimpleEvent( g_date->Date() + 1, npe_herbi_two, false );
371  break;
372  }
373  if (!m_farm->HerbicideTreat( m_field, 0.0,
374  g_date->DayInYear( 26, 5 ) -
375  g_date->DayInYear())) {
376  SimpleEvent( g_date->Date() + 1, npe_herbi_two, false );
377  break;
378  }
379  NPOT_HERBI_DATE = g_date->Date();
380  {
381  int d1 = g_date->OldDays() + g_date->DayInYear( 30, 4 );
382  if ( g_date->Date() + 10 > d1 ) {
383  d1 = g_date->Date() + 10;
384  }
385  SimpleEvent( d1, npe_herbi_three, false );
386  }
387  }
388  else {
389  NPOT_DID_TREAT = true; // Need to signal the finish of this thread
390  if ( NPOT_DID_HILL && NPOT_DID_TREAT ) {
391  // last surviving tread, start insecticide.
392  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 6 ),
393  npe_insecticide, false );
394  }
395  }
396  break;
397 
398  case npe_herbi_three:
399  if (( m_ev->m_lock || m_farm->DoIt( (int) (53*cfg_herbi_app_prop.value() * m_farm->Prob_multiplier())))) //modified probability
400  {
401  if ( NPOT_HILL_DATE &&
402  NPOT_HILL_DATE >= g_date->Date() - 1 ) {
403  // Too close to hilling, try again tomorrow.
404  SimpleEvent( g_date->Date() + 1, npe_herbi_three, false );
405  break;
406  }
407  if (!m_farm->HerbicideTreat( m_field, 0.0,
408  g_date->DayInYear( 7, 6 ) -
409  g_date->DayInYear())) {
410  SimpleEvent( g_date->Date() + 1, npe_herbi_three, false );
411  break;
412  }
413  NPOT_HERBI_DATE = g_date->Date();
414  NPOT_DID_TREAT = true; // Need to signal the finish of this thread
415  if ( NPOT_DID_HILL && NPOT_DID_TREAT ) {
416  // last surviving tread, start insecticide.
417  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 6 ),
418  npe_insecticide, false );
419  }
420  }
421  else {
422  NPOT_DID_TREAT = true; // Need to signal the finish of this thread
423  if ( NPOT_DID_HILL && NPOT_DID_TREAT ) {
424  // last surviving tread, start insecticide.
425  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 10, 6 ),
426  npe_insecticide, false );
427  }
428  }
429  break;
430 
431  case npe_hilling:
432 if ( (NPOT_HERBI_DATE &&
433  NPOT_HERBI_DATE >= g_date->Date() - 2)
434  ||
435  (NPOT_STRIG_DATE &&
436  NPOT_STRIG_DATE >= g_date->Date() - 7)) {
437  // Too close to the others, try again tomorrow.
438  SimpleEvent( g_date->Date() + 1, npe_hilling, false );
439  break;
440  }
441 if (!m_farm->HillingUp( m_field, 0.0,
442  g_date->DayInYear( 25, 6 ) - g_date->DayInYear())) {
443  SimpleEvent( g_date->Date() + 1, npe_hilling, false );
444  break;
445  }
446  NPOT_HILL_DATE = g_date->Date();
447  NPOT_DID_HILL = true;
448  if ( NPOT_DID_TREAT )
449  {
450  // last surviving tread, start insecticide.
451  int d1 = g_date->OldDays() + g_date->DayInYear( 10, 6 );
452  if ( g_date->Date() + 3 > d1 ) {
453  d1 = g_date->Date() + 3;
454  }
455  SimpleEvent( d1, npe_insecticide, false );
456  }
457  break;
458 
459  case npe_insecticide:
460  if ( m_ev->m_lock || m_farm->DoIt( (int) (59*cfg_ins_app_prop1.value() * m_farm->Prob_multiplier()))) { //modified probability
461  if (!m_farm->InsecticideTreat( m_field, 0.0,
462  g_date->DayInYear( 26, 6 ) -
463  g_date->DayInYear())) {
464  SimpleEvent( g_date->Date() + 1, npe_insecticide, true );
465  break;
466  }
467  }
468  NPOT_WATER_DATE = 0;
469  NPOT_FUNGI_DATE = 0;
470  {
471  int d1 = g_date->OldDays() + g_date->DayInYear( 15, 6 );
472  if ( g_date->Date() + 1 > d1 ) {
473  d1 = g_date->Date() + 1;
474  }
475  SimpleEvent( d1, npe_water_one, false );
476  }
477  {
478  int d1 = g_date->OldDays() + g_date->DayInYear( 25, 6 );
479  if ( g_date->Date() + 1 > d1 ) {
480  d1 = g_date->Date() + 1;
481  }
482  SimpleEvent( d1, npe_fungi_one, false );
483  }
484  break;
485 
486  case npe_water_one:
487  if ( NPOT_FUNGI_DATE &&
488  NPOT_FUNGI_DATE >= g_date->Date() + 2 ) {
489  SimpleEvent( g_date->Date() + 1, npe_water_one, true );
490  break;
491  }
492  if ( m_ev->m_lock || m_farm->DoIt( 80 )) {
493  if (!m_farm->Water( m_field, 0.0,
494  g_date->DayInYear( 30, 6 ) -
495  g_date->DayInYear())) {
496  SimpleEvent( g_date->Date() + 1, npe_water_one, true );
497  break;
498  }
499  NPOT_WATER_DATE = g_date->Date();
500  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 1, 7 ),
501  npe_water_two, false );
502  }
503  break;
504 
505  case npe_water_two:
506  if ( NPOT_FUNGI_DATE &&
507  NPOT_FUNGI_DATE >= g_date->Date() + 2 ) {
508  SimpleEvent( g_date->Date() + 1, npe_water_two, true );
509  break;
510  }
511  if (!m_farm->Water( m_field, 0.0,
512  g_date->DayInYear( 15, 7 ) -
513  g_date->DayInYear())) {
514  SimpleEvent( g_date->Date() + 1, npe_water_two, true );
515  break;
516  }
517  NPOT_WATER_DATE = g_date->Date();
518  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 16, 7 ),
519  npe_water_three, false );
520  break;
521 
522  case npe_water_three:
523  if ( NPOT_FUNGI_DATE &&
524  NPOT_FUNGI_DATE >= g_date->Date() + 2 ) {
525  SimpleEvent( g_date->Date() + 1, npe_water_three, true );
526  break;
527  }
528  if (!m_farm->Water( m_field, 0.0,
529  g_date->DayInYear( 30, 7 ) -
530  g_date->DayInYear())) {
531  SimpleEvent( g_date->Date() + 1, npe_water_three, true );
532  break;
533  }
534  NPOT_WATER_DATE = g_date->Date();
535  break;
536 
537  case npe_fungi_one:
538  if ( NPOT_WATER_DATE && NPOT_WATER_DATE >= g_date->Date() + 2 ) {
539  SimpleEvent( g_date->Date() + 1, npe_fungi_one, true );
540  break;
541  }
542  if (!m_farm->FungicideTreat( m_field, 0.0, g_date->DayInYear( 10, 7 ) - g_date->DayInYear())) {
543  SimpleEvent( g_date->Date() + 1, npe_fungi_one, true );
544  break;
545  }
546  NPOT_FUNGI_DATE = g_date->Date();
547  {
548  int d1 = g_date->OldDays() + g_date->DayInYear( 5, 7 );
549  if ( g_date->Date() + 10 > d1 ) {
550  d1 = g_date->Date() + 10;
551  }
552  SimpleEvent( d1, npe_fungi_two, false );
553  }
554  break;
555 
556  case npe_fungi_two:
557  if ( NPOT_WATER_DATE &&
558  NPOT_WATER_DATE >= g_date->Date() + 2 ) {
559  SimpleEvent( g_date->Date() + 1, npe_fungi_two, true );
560  break;
561  }
562  if (!m_farm->FungicideTreat( m_field, 0.0,
563  g_date->DayInYear( 20, 7 ) -
564  g_date->DayInYear())) {
565  SimpleEvent( g_date->Date() + 1, npe_fungi_two, true );
566  break;
567  }
568  NPOT_FUNGI_DATE = g_date->Date();
569  {
570  int d1 = g_date->OldDays() + g_date->DayInYear( 15, 7 );
571  if ( g_date->Date() + 10 > d1 ) {
572  d1 = g_date->Date() + 10;
573  }
574  SimpleEvent( d1, npe_fungi_three, false );
575  }
576  break;
577 
578  case npe_fungi_three:
579  if ( NPOT_WATER_DATE &&
580  NPOT_WATER_DATE >= g_date->Date() + 2 ) {
581  SimpleEvent( g_date->Date() + 1, npe_fungi_three, true );
582  break;
583  }
584  if (!m_farm->FungicideTreat( m_field, 0.0,
585  g_date->DayInYear( 1, 8 ) -
586  g_date->DayInYear())) {
587  SimpleEvent( g_date->Date() + 1, npe_fungi_three, true );
588  break;
589  }
590  NPOT_FUNGI_DATE = g_date->Date();
591  {
592  int d1 = g_date->OldDays() + g_date->DayInYear( 25, 7 );
593  if ( g_date->Date() + 10 > d1 ) {
594  d1 = g_date->Date() + 10;
595  }
596  SimpleEvent( d1, npe_fungi_four, false );
597  }
598  break;
599 
600  case npe_fungi_four:
601  if ( NPOT_WATER_DATE &&
602  NPOT_WATER_DATE >= g_date->Date() + 2 ) {
603  SimpleEvent( g_date->Date() + 1, npe_fungi_four, true );
604  break;
605  }
606  if (!m_farm->FungicideTreat( m_field, 0.0,
607  g_date->DayInYear( 11, 8 ) -
608  g_date->DayInYear())) {
609  SimpleEvent( g_date->Date() + 1, npe_fungi_four, true );
610  break;
611  }
612  NPOT_FUNGI_DATE = g_date->Date();
613  {
614  int d1 = g_date->OldDays() + g_date->DayInYear( 5, 8 );
615  if ( g_date->Date() + 10 > d1 ) {
616  d1 = g_date->Date() + 10;
617  }
618  SimpleEvent( d1, npe_fungi_five, false );
619  }
620  break;
621 
622  case npe_fungi_five:
623  if (!m_farm->FungicideTreat( m_field, 0.0,
624  g_date->DayInYear( 21, 8 ) -
625  g_date->DayInYear())) {
626  SimpleEvent( g_date->Date() + 1, npe_fungi_five, true );
627  break;
628  }
629  SimpleEvent( g_date->OldDays() + g_date->DayInYear( 5, 8 ),
630  npe_growth_reg, false );
631  break;
632 
633  case npe_growth_reg:
634  if ( m_ev->m_lock || m_farm->DoIt( 80 )) {
635  if (!m_farm->GrowthRegulator( m_field, 0.0,
636  g_date->DayInYear( 1, 9 ) -
637  g_date->DayInYear())) {
638  SimpleEvent( g_date->Date() + 1, npe_growth_reg, true );
639  break;
640  }
641  }
642  {
643  int d1 = g_date->OldDays() + m_field->GetMDates(0, 1);
644  ChooseNextCrop (1);
645  SimpleEvent( d1, npe_harvest, false );
646  }
647  break;
648 
649  case npe_harvest:
650  if (m_field->GetMConstants(1)==0) {
651  if (!m_farm->Harvest( m_field, 0.0, -1)) { //raise an error
652  g_msg->Warn( WARN_BUG, "Potatoes::Do(): failure in 'Harvest' execution", "" );
653  exit( 1 );
654  }
655  }
656  else {
657  if (!m_farm->Harvest( m_field, 0.0, m_field->GetMDates(0,1) - g_date->DayInYear())) {
658  SimpleEvent( g_date->Date() + 1, npe_harvest, false );
659  break;
660  }
661  }
662  m_field->SetVegPatchy(false);
663  done = true;
664  break;
665 
666  default:
667  g_msg->Warn( WARN_BUG, "PotatoesEat::Do(): "
668  "Unknown event type! ", "" );
669  exit( 1 );
670  }
671 
672  return done;
673 }
674 
675 
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
Farm::HerbicideTreat
virtual bool HerbicideTreat(LE *a_field, double a_user, int a_days)
Apply herbicide to a_field.
Definition: farmfuncs.cpp:1156
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
cfg_ins_app_prop1
CfgFloat cfg_ins_app_prop1
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
npe_harvest
Definition: NorwegianPotatoes.h:67
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
FarmEvent::m_first_year
bool m_first_year
Definition: farm.h:467
tof_OptimisingFarm
Definition: farm.h:273
npe_fa_slurry
Definition: NorwegianPotatoes.h:46
NPOT_HERBI_DATE
#define NPOT_HERBI_DATE
Definition: NorwegianPotatoes.h:33
NPOT_DID_HILL
#define NPOT_DID_HILL
Definition: NorwegianPotatoes.h:37
npe_fungi_one
Definition: NorwegianPotatoes.h:61
NPOT_DID_TREAT
#define NPOT_DID_TREAT
Definition: NorwegianPotatoes.h:36
npe_strigling_one
Definition: NorwegianPotatoes.h:53
NPOT_WATER_DATE
#define NPOT_WATER_DATE
Definition: NorwegianPotatoes.h:38
Farm::GetType
TTypesOfFarm GetType(void)
Definition: farm.h:901
npe_herbi_three
Definition: NorwegianPotatoes.h:52
Crop::m_first_date
int m_first_date
Definition: farm.h:540
FarmEvent::m_startday
int m_startday
Definition: farm.h:466
Farm::FA_NPK
virtual bool FA_NPK(LE *a_field, double a_user, int a_days)
Apply NPK fertilizer to a_field owned by an stock farmer.
Definition: farmfuncs.cpp:917
Farm::FungicideTreat
virtual bool FungicideTreat(LE *a_field, double a_user, int a_days)
Apply fungicide to a_field.
Definition: farmfuncs.cpp:1279
Farm::HillingUp
virtual bool HillingUp(LE *a_field, double a_user, int a_days)
Do hilling up on a_field, probably of potatoes.
Definition: farmfuncs.cpp:1663
npe_spring_harrow
Definition: NorwegianPotatoes.h:45
Crop::SimpleEvent
void SimpleEvent(long a_date, int a_todo, bool a_lock)
Adds an event to this crop management.
Definition: farm.cpp:307
npe_herbi_one
Definition: NorwegianPotatoes.h:50
NPOT_SLURRY_DATE
#define NPOT_SLURRY_DATE
Definition: NorwegianPotatoes.h:32
npe_growth_reg
Definition: NorwegianPotatoes.h:66
Farm::Prob_multiplier
virtual double Prob_multiplier()
Definition: farm.h:786
npe_fungi_two
Definition: NorwegianPotatoes.h:62
npe_fungi_four
Definition: NorwegianPotatoes.h:64
npe_strigling_three
Definition: NorwegianPotatoes.h:55
npe_insecticide
Definition: NorwegianPotatoes.h:57
npe_fungi_three
Definition: NorwegianPotatoes.h:63
npe_autumn_plough
Definition: NorwegianPotatoes.h:43
FarmEvent::m_next_tov
TTypesOfVegetation m_next_tov
Definition: farm.h:471
npe_water_three
Definition: NorwegianPotatoes.h:60
npe_spring_sow
Definition: NorwegianPotatoes.h:47
Crop::m_farm
Farm * m_farm
Definition: farm.h:537
Crop::m_field
LE * m_field
Definition: farm.h:538
npe_hilling
Definition: NorwegianPotatoes.h:56
FarmEvent::m_todo
int m_todo
Definition: farm.h:469
Farm::InsecticideTreat
virtual bool InsecticideTreat(LE *a_field, double a_user, int a_days)
Apply insecticide to a_field.
Definition: farmfuncs.cpp:1348
NPOT_STRIG_DATE
#define NPOT_STRIG_DATE
Definition: NorwegianPotatoes.h:34
npe_water_two
Definition: NorwegianPotatoes.h:59
npe_fungi_five
Definition: NorwegianPotatoes.h:65
npe_start
Definition: NorwegianPotatoes.h:42
NorwegianPotatoes::Do
bool Do(Farm *a_farm, LE *a_field, FarmEvent *a_ev)
Definition: NorwegianPotatoes.cpp:38
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
npe_herbi_two
Definition: NorwegianPotatoes.h:51
Farm
The base class for all farm types.
Definition: farm.h:767
NPOT_FUNGI_DATE
#define NPOT_FUNGI_DATE
Definition: NorwegianPotatoes.h:39
npe_spring_plough
Definition: NorwegianPotatoes.h:44
cfg_greg_app_prop
CfgFloat cfg_greg_app_prop
Farm::GrowthRegulator
virtual bool GrowthRegulator(LE *a_field, double a_user, int a_days)
Apply growth regulator to a_field.
Definition: farmfuncs.cpp:1250
cfg_herbi_app_prop
CfgFloat cfg_herbi_app_prop
npe_strigling_two
Definition: NorwegianPotatoes.h:54
cfg_fungi_app_prop1
CfgFloat cfg_fungi_app_prop1
npe_water_one
Definition: NorwegianPotatoes.h:58
Crop::ChooseNextCrop
void ChooseNextCrop(int a_no_dates)
Chooses the next crop to grow in a field.
Definition: farm.cpp:318
Crop::m_ev
FarmEvent * m_ev
Definition: farm.h:539
NPOT_HILL_DATE
#define NPOT_HILL_DATE
Definition: NorwegianPotatoes.h:35
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