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