/**
* Name: ODE_LotkaVolterra
* Author: Huynh Quang Nghi & Nathalie Corson
*  Description: Lotka Volterra Predator Prey Model - ODE solved with Runge-Kutta 4 method with different integration time step with only one agent
* Tags: equation, math
*/

model ODE_LotkaVolterra

global {

	float prey_birth_rate<- 0.05 ; 		// natural birth rate of preys
	float predation_rate <- 0.001; 			// death rate of preys due to predators
	float predator_death_rate<- 0.03 ; 	// natural death rate of predators
	float predation_efficiency<- 0.0002 ; 	// birth rate of predators due to prey consumption

	float nb_prey_init <- 250.0; 			// initial number of preys
	float nb_predator_init <- 45.0 ; 		// initial number of predators

	float integration_time_step <- 0.01; 	// integration time step used in the Runge Kutta 4 method
	float t; 						// simulation time : t = n * integration_time_step  where n is the number of already computed time step

	init{
		create LotkaVolterra_agent number:1 ; 	// creation of an agent containing the ODE model
	}
}

species LotkaVolterra_agent {

	float nb_prey <- nb_prey_init ; 			// number of preys initialized with the values given by the user
	float nb_predator <- nb_predator_init ; 		// number of predators initialized with the values given by the user

	equation lotka_volterra {
		diff(nb_prey,t) =   nb_prey * (prey_birth_rate - predation_rate * nb_predator); 					// evolution of the number of preys duting an integration time step
		diff(nb_predator,t) = - nb_predator * (predator_death_rate - predation_efficiency * nb_prey); 		// evolution of the number of predator during an integration time step
      }
      reflex solving {
       	solve lotka_volterra method: "rk4" step_size:integration_time_step ;					 			// use of runge kutta 4 method with an integration time step of value integration_time_step
       }
}


experiment maths type: gui {

	parameter "Prey birth rate" var: prey_birth_rate <- 0.05 min: 0.0 max: 1.0 category: "Prey";						// the user defines the value of parameter prey_birth_rate on the interface, the default value is 0.05 and this value must be between 0 and 1
	parameter "Predation rate" var: predation_rate <- 0.001 min: 0.0 max: 1.0 category: "Prey"; 						// the user defines the value of parameter prey_birth_rate on the interface, the default value is 0.001 and this value must be between 0 and 1
	parameter "Predator death rate" var: predator_death_rate <- 0.03 min: 0.0 max: 1.0 category: "Predator";	 		// the user defines the value of parameter predator_death_rate on the interface, the default value is 0.03 and this value must be between 0 and 1
	parameter "Predation efficiency" var: predation_efficiency <- 0.0002 min: 0.0 max: 1.0 category: "Predator";		// the user defines the value of parameter predation_efficiency on the interface, the default value is 0.0002 and this value must be between 0 and 1

	parameter "Initial number of prey" var: nb_prey_init <- 250.0 min: 1.0 category: "Prey"; 							// the user defines the value of parameter predation_efficiency on the interface, the default value is 250, the minimum possible value is 1
	parameter "Initial number of predator" var: nb_predator_init <- 45.0 min: 1.0 category: "Predator"; 				// the user defines the value of parameter predation_efficiency on the interface, the default value is 45, the minimum possible value is 1

	parameter "Integration time step" var: integration_time_step <- 0.01 min: 0.0 max:0.1 category: "Integration method";  // the user defines the value of the integration step, the default value is 0.01 and this value must be between 0 and 1

	output {
 		display TimeSeries  {																	// creation of a display to show time series of the model, values are plotted at every step
			chart "Lotka Volterra Time Series" type: series background: #white {  						// the chart, of type 'serie', is named Lotka Volterra Time Series, it shows quantities according to time, and the background is white
				data 'Number of preys' value: first(LotkaVolterra_agent).nb_prey color: #green ;			// number of preys is plotted in green
				data 'Number of predators' value: first(LotkaVolterra_agent).nb_predator color: #red ; 	// number of predators is plotted in red
			}
		}
		display PhasePortrait  {																// creation of a display to show the phase portait, values are plotted at every time step
			chart "Lotka Volterra Phase Portrait" type: xy background: #white {							// the chart, os type 'xy', is named Lotka Volterra Phase portrait, it shows a quantity according to another one, and the background is white
			data ' ' value: {predator_death_rate / predation_efficiency, prey_birth_rate/predation_rate} color: °blue; // equilibrium point
			data 'Number of preys according to number of predators' value:{first(LotkaVolterra_agent).nb_prey, first(LotkaVolterra_agent).nb_predator} color: #black ;	// number of predators according to the number of preys plotted in black
			}
		}
	}
}