From 3a1bbc49feac4d045aaf7d8cb3d2bb86e52dfe63 Mon Sep 17 00:00:00 2001
From: "camille.poulet" <camille.poulet@irstea.fr>
Date: Tue, 17 Sep 2019 10:43:35 +0200
Subject: [PATCH] Correction Temperature Effect on Survival

---
 data/input/fishTryRealBV_CC.xml               |  6 +-
 .../java/miscellaneous/Miscellaneous.java     | 72 +++++++++++--------
 src/main/java/species/Survive.java            |  9 +--
 3 files changed, 49 insertions(+), 38 deletions(-)

diff --git a/data/input/fishTryRealBV_CC.xml b/data/input/fishTryRealBV_CC.xml
index f78f02e..b572f72 100644
--- a/data/input/fishTryRealBV_CC.xml
+++ b/data/input/fishTryRealBV_CC.xml
@@ -287,9 +287,9 @@
 
 				<species.Survive>
 					<synchronisationMode>ASYNCHRONOUS</synchronisationMode>
-					<tempMinMortGenInRiv>10.0</tempMinMortGenInRiv>
-					<tempMaxMortGenInRiv>23.0</tempMaxMortGenInRiv>
-					<tempOptMortGenInRiv>20.0</tempOptMortGenInRiv>
+					<tempMinSurvivalSpawnerInRiv>10.0</tempMinSurvivalSpawnerInRiv>
+					<tempMaxSurvivalSpawnerInRiv>23.0</tempMaxSurvivalSpawnerInRiv>
+					<!-- <tempOptSurvivalSpawnerInRiv>20.0</tempOptSurvivalSpawnerInRiv> -->
 					<survivalProbOptGenInRiv>1.0</survivalProbOptGenInRiv>
 					<mortalityRateInRiver>0.4</mortalityRateInRiver>
 					<mortalityRateInSea>0.4</mortalityRateInSea>
diff --git a/src/main/java/miscellaneous/Miscellaneous.java b/src/main/java/miscellaneous/Miscellaneous.java
index 8b36401..dcd7138 100644
--- a/src/main/java/miscellaneous/Miscellaneous.java
+++ b/src/main/java/miscellaneous/Miscellaneous.java
@@ -6,41 +6,51 @@ import umontreal.iro.lecuyer.randvar.UniformGen;
 
 public class Miscellaneous {
 
-    public static long binomialForSuperIndividual(Pilot pilot, long amount, double succesProba, long threshold) {
-        long amountWithSuccess;
-        if (amount > threshold) { // use a normal approximation for huge amount 
+	public static long binomialForSuperIndividual(Pilot pilot, long amount, double succesProba, long threshold) {
+		long amountWithSuccess;
+		if (amount > threshold) { // use a normal approximation for huge amount 
 			/*			double p=-1.;
              while (p<0 | p>1){
              p = genAleaNormal.nextDouble() * 
              Math.sqrt(succesProba * (1 - succesProba) /amount) + succesProba;
              }
              amountWithSuccess = (long) Math.round(p* amount);*/
-            amountWithSuccess = -1;
-            while (amountWithSuccess < 0 | amountWithSuccess > amount) {
-                amountWithSuccess = Math.round(NormalGen.nextDouble(pilot.getRandomStream(), 0., 1.) * Math.sqrt(succesProba * (1 - succesProba) * amount)
-                        + succesProba * amount);
-            }
-
-        } else {
-            amountWithSuccess = 0;
-            for (long i = 0; i < amount; i++) {
-                if (UniformGen.nextDouble(pilot.getRandomStream(), 0, 1) < succesProba) {
-                    amountWithSuccess++;
-                }
-            }
-        }
-        return amountWithSuccess;
-    }
-
-    public static long binomialForSuperIndividual(Pilot pilot, long amount, double succesProba) {
-        return binomialForSuperIndividual(pilot, amount, succesProba, 50);
-    }
-
-    static public double temperatureEffect(double T, double Tmin, double Topt, double Tmax) {
-        if (T <= Tmin || T >= Tmax) {
-            return 0;
-        } else {
-            return (T - Tmin) * (T - Tmax) / ((T - Tmin) * (T - Tmax) - ((T - Topt) * (T-Topt)));
-        }
-    }
+			amountWithSuccess = -1;
+			while (amountWithSuccess < 0 | amountWithSuccess > amount) {
+				amountWithSuccess = Math.round(NormalGen.nextDouble(pilot.getRandomStream(), 0., 1.) * Math.sqrt(succesProba * (1 - succesProba) * amount)
+						+ succesProba * amount);
+			}
+
+		} else {
+			amountWithSuccess = 0;
+			for (long i = 0; i < amount; i++) {
+				if (UniformGen.nextDouble(pilot.getRandomStream(), 0, 1) < succesProba) {
+					amountWithSuccess++;
+				}
+			}
+		}
+		return amountWithSuccess;
+	}
+
+	public static long binomialForSuperIndividual(Pilot pilot, long amount, double succesProba) {
+		return binomialForSuperIndividual(pilot, amount, succesProba, 50);
+	}
+
+	static public double temperatureEffect(double T, double Tmin, double Topt, double Tmax) {
+		if (T <= Tmin || T >= Tmax) {
+			return 0;
+		} else {
+			return (T - Tmin) * (T - Tmax) / ((T - Tmin) * (T - Tmax) - ((T - Topt) * (T-Topt)));
+		}
+	}
+
+	static public double rectangularTemperatureEffect(double T, double Tmin, double Tmax) {
+		if (T <= Tmin || T >= Tmax) {
+			return 0;
+		} else {
+			return 1;
+		}
+	}
 }
+
+
diff --git a/src/main/java/species/Survive.java b/src/main/java/species/Survive.java
index 2b6fc5a..214e038 100644
--- a/src/main/java/species/Survive.java
+++ b/src/main/java/species/Survive.java
@@ -19,9 +19,9 @@ import org.openide.util.lookup.ServiceProvider;
 @ServiceProvider(service = AquaNismsGroupProcess.class)
 public class Survive extends AquaNismsGroupProcess<DiadromousFish, DiadromousFishGroup> {
 
-	public double tempMinMortGenInRiv = 10.;
-	public double tempMaxMortGenInRiv = 23.; // DEFINIR TROIS AUTRES POUR MORTALITE
-	public double tempOptMortGenInRiv = 20.;
+	public double tempMinSurvivalSpawnerInRiv = 10.;
+	public double tempMaxSurvivalSpawnerInRiv = 23.; // DEFINIR TROIS AUTRES POUR MORTALITE
+	public double tempOptSurvivalSpawnerInRiv = 20.;
 	public double survivalProbOptGenInRiv = 1.;
 
 	public double mortalityRateInRiver = 0.4;
@@ -43,7 +43,8 @@ public class Survive extends AquaNismsGroupProcess<DiadromousFish, DiadromousFis
 				survivalProbability = 1.;
 				//Survive
 				if(fish.getPosition().getType() == TypeBassin.RIVER && fish.isMature()){				
-					double tempEffectSurv = Miscellaneous.temperatureEffect(fish.getPosition().getCurrentTemperature(group.getPilot()), tempMinMortGenInRiv, tempOptMortGenInRiv, tempMaxMortGenInRiv);
+					//double tempEffectSurv = Miscellaneous.temperatureEffect(fish.getPosition().getCurrentTemperature(group.getPilot()), tempMinSurvivalSpawnerInRiv, tempOptSurvivalSpawnerInRiv, tempMaxSurvivalSpawnerInRiv);
+					double tempEffectSurv = Miscellaneous.rectangularTemperatureEffect(fish.getPosition().getCurrentTemperature(group.getPilot()), tempMinSurvivalSpawnerInRiv, tempMaxSurvivalSpawnerInRiv);
 					if (tempEffectSurv == 0.){
 						survivalProbability = 0.;
 						//System.out.println("le poisson situ� dans le bassin " + fish.getPosition().getName() + " en " + Time.getSeason() +" a un coeff de mortalit� de " + fish.getMortalityRateInRiver() + " mais � cause de la temp�rature une prob de survie de " + survivalProbability);
-- 
GitLab