Commit dd3a6cb5 authored by Lambert Patrick's avatar Lambert Patrick
Browse files

fusion avec Camille

parents 8b24a024 8c107625
......@@ -10,7 +10,7 @@
<linfVonBert>60.0</linfVonBert>
<dMaxDisp>300.0</dMaxDisp>
<lFirstMaturity>40.0</lFirstMaturity>
<fishNutrient>
<nutrientRoutine>
<nutrientsOfInterest>
<string>N</string>
<string>P</string>
......@@ -30,6 +30,14 @@
<entry>
<species.DiadromousFish_-Gender>MALE</species.DiadromousFish_-Gender>
<hashtable>
<entry>
<string>bLW_Gonad</string>
<double>3.3838</double>
</entry>
<entry>
<string>aLW_Gonad</string>
<double>-8.8744</double>
</entry>
<entry>
<string>bLW</string>
<double>2.1774</double>
......@@ -43,6 +51,14 @@
<entry>
<species.DiadromousFish_-Gender>FEMALE</species.DiadromousFish_-Gender>
<hashtable>
<entry>
<string>bLW_Gonad</string>
<double>2.6729</double>
</entry>
<entry>
<string>aLW_Gonad</string>
<double>-5.2425</double>
</entry>
<entry>
<string>bLW</string>
<double>3.147</double>
......@@ -58,6 +74,14 @@
<entry>
<species.DiadromousFish_-Gender>MALE</species.DiadromousFish_-Gender>
<hashtable>
<entry>
<string>bLW_Gonad</string>
<double>3.8331</double>
</entry>
<entry>
<string>aLW_Gonad</string>
<double>-11.285</double>
</entry>
<entry>
<string>bLW</string>
<double>2.9973</double>
......@@ -71,6 +95,14 @@
<entry>
<species.DiadromousFish_-Gender>FEMALE</species.DiadromousFish_-Gender>
<hashtable>
<entry>
<string>bLW_Gonad</string>
<double>2.8545</double>
</entry>
<entry>
<string>aLW_Gonad</string>
<double>-6.6234</double>
</entry>
<entry>
<string>bLW</string>
<double>2.9418</double>
......@@ -92,16 +124,6 @@
<double>0.006986429759979109</double>
</entry>
</juvenileFeatures>
<spawnedGametesWeight class="hashtable">
<entry>
<species.DiadromousFish_-Gender>MALE</species.DiadromousFish_-Gender>
<double>44.8</double>
</entry>
<entry>
<species.DiadromousFish_-Gender>FEMALE</species.DiadromousFish_-Gender>
<double>131.0</double>
</entry>
</spawnedGametesWeight>
<compoCarcassPreSpawning class="hashtable">
<entry>
<species.DiadromousFish_-Gender>MALE</species.DiadromousFish_-Gender>
......@@ -196,7 +218,8 @@
<double>0.02803</double>
</entry>
</compoJuvenile>
</fishNutrient>
</nutrientRoutine>
<fileNameInputForInitialObservation>data/input/reality/Obs1900.csv</fileNameInputForInitialObservation>
<centileForRange>0.95</centileForRange>
<parameterSetfileName>data/input/reality/parameterSet.csv</parameterSetfileName>
......@@ -245,19 +268,16 @@
<meanBvSurface>17351</meanBvSurface>
<standardDeviationBvSurface>35594</standardDeviationBvSurface>
<meanInterDistance>300.0</meanInterDistance>
<standardDeviationInterDistance>978.0
</standardDeviationInterDistance>
<standardDeviationInterDistance>978.0</standardDeviationInterDistance>
<pHomingForReachEquil>0.75</pHomingForReachEquil>
<pHomingAfterEquil>0.75</pHomingAfterEquil>
<NbYearForInstallPop>0</NbYearForInstallPop>
<riverMigrationSeason>SPRING</riverMigrationSeason>
<alpha2Rep>0.0</alpha2Rep>
<meanSpawnersLengthAtRepro>45.0</meanSpawnersLengthAtRepro>
<standardDeviationOfSpawnersLengthAtRepro>2.0
</standardDeviationOfSpawnersLengthAtRepro>
<standardDeviationOfSpawnersLengthAtRepro>2.0</standardDeviationOfSpawnersLengthAtRepro>
<weightOfDeathBasin>0.4</weightOfDeathBasin>
</species.DisperseAndMigrateToRiverWithMultiNomDistriAndDeathBasin>
<species.Survive>
<synchronisationMode>ASYNCHRONOUS</synchronisationMode>
<tempMinMortGenInRiv>10.0</tempMinMortGenInRiv>
......@@ -268,8 +288,6 @@
<mortalityRateInSea>0.4</mortalityRateInSea>
<mortalityRateInOffshore>0.4</mortalityRateInOffshore>
</species.Survive>
<species.ReproduceAndSurviveAfterReproductionWithDiagnose>
<synchronisationMode>ASYNCHRONOUS</synchronisationMode>
<reproductionSeason>SPRING</reproductionSeason>
......@@ -314,8 +332,7 @@
</species.IdentifyPopulation>
<species.TypeTrajectoryCV>
<synchronisationMode>ASYNCHRONOUS</synchronisationMode>
<fileNameOutput>JeuParam100_2100RCP85_A_essai
</fileNameOutput>
<fileNameOutput>JeuParam100_2100RCP85_A_essai</fileNameOutput>
</species.TypeTrajectoryCV>
</processesAtEnd>
......
......@@ -62,7 +62,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
* Routine to compute nutrient fluxes operated by a single individual (TODO by a single super individual).
*
*/
private FishNutrient fishNutrient;
private NutrientRoutine nutrientRoutine;
public String fileNameInputForInitialObservation = "data/input/reality/Obs1900.csv";
......@@ -265,7 +265,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
diadromousFishGroup.fishNutrient = new FishNutrient(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, aGameteSpawned,
diadromousFishGroup.nutrientRoutine = new NutrientRoutine(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning,
aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes,
aJuvenileFeatures, aCompoJuveniles);
......@@ -507,9 +507,9 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
return lFirstMaturity;
}
public FishNutrient getFishNutrient() {
public NutrientRoutine getNutrientRoutine() {
return fishNutrient;
return nutrientRoutine;
}
public void setlFirstMaturity(double lFirstMaturity) {
......
......@@ -9,8 +9,13 @@ import environment.Time;
import environment.Time.Season;
import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import miscellaneous.Duo;
import species.DiadromousFish.Stage;
import org.openide.util.lookup.ServiceProvider;
@ServiceProvider(service = AquaNismsGroupProcess.class)
......@@ -28,19 +33,48 @@ public class MigrateToSea extends AquaNismsGroupProcess<DiadromousFish, Diadromo
if (Time.getSeason(group.getPilot()) == seaMigrationSeason ){
Basin destination;
List<Duo<DiadromousFish,Basin>> fishesToMove = new ArrayList<Duo<DiadromousFish,Basin>>();
for (int i = 0; i < group.getEnvironment().getRiverBasins().length; i++) {
RiverBasin basin = group.getEnvironment().getRiverBasins()[i];
List<DiadromousFish> fishes = basin.getFishs(group);
if (fishes!=null) for (DiadromousFish fish : fishes) {
destination = group.getEnvironment().getAssociatedSeaBasin(fish.getPosition());
fishesToMove.add(new Duo<DiadromousFish, Basin>(fish, destination));
}
}
for (Duo<DiadromousFish,Basin> duo : fishesToMove) {
duo.getFirst().moveTo(group.getPilot(), duo.getSecond(), group);
}
}
//On crer la Map pour stocker les flux d'export
Map<String, Double> totalOutputFluxes = new Hashtable<String, Double>();
List<Duo<DiadromousFish,Basin>> fishesToMove = new ArrayList<Duo<DiadromousFish,Basin>>();
for (int i = 0; i < group.getEnvironment().getRiverBasins().length; i++) {
RiverBasin basin = group.getEnvironment().getRiverBasins()[i];
//Fish move to sea and compute the related export of nutrients
List<DiadromousFish> fishes = basin.getFishs(group);
// ON r-initialise notre map pour chauqe bassin
for (String nutrient : group.getNutrientRoutine().getNutrientsOfInterest()) {
totalOutputFluxes.put(nutrient, 0.);
}
totalOutputFluxes.put("biomass", 0.); //cration de la biomasse
if (fishes!=null) {
for (DiadromousFish fish : fishes) {
destination = group.getEnvironment().getAssociatedSeaBasin(fish.getPosition());
fishesToMove.add(new Duo<DiadromousFish, Basin>(fish, destination)); //Mentionne la sortie d'un poisson de la boucle
double biomass = group.getNutrientRoutine().getWeight(fish) * fish.getAmount();
if (fish.getStage()==Stage.IMMATURE) {
Map <String, Double> aFluxExportedByJuveniles= group.getNutrientRoutine().computeNutrientsExportForJuveniles(fish);
for (String nutrient: aFluxExportedByJuveniles.keySet()) {
totalOutputFluxes.put(nutrient,totalOutputFluxes.get(nutrient) + aFluxExportedByJuveniles.get(nutrient) * fish.getAmount());
}
totalOutputFluxes.put("biomass", totalOutputFluxes.get("biomass") + biomass);
}
}
}
for (Duo<DiadromousFish,Basin> duo : fishesToMove) {
duo.getFirst().moveTo(group.getPilot(), duo.getSecond(), group); //on dplace les poissons dans le fichier MoveTo et on dnote la destination du poisson.
}
System.out.println(group.getPilot().getCurrentTime() + "; " + Time.getYear(group.getPilot()) + ";" + Time.getSeason(group.getPilot()) + ";EXPORT;"
+ basin.getName() + "; " + totalOutputFluxes);
}
}
}
}
}
\ No newline at end of file
/**
*
* @author Camille Poulet, Patrick Lambert
* @copyright Copyright (c) 2019, Irstea
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package species;
import environment.SeaBasin;
import fr.cemagref.simaqualife.pilot.Pilot;
import species.DiadromousFish.Gender;
import species.DiadromousFish.Stage;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Map;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
/**
* @author camille.poulet
*
*/
public class FishNutrient {
private static enum SpawningPosition {PRE,POST}; // on crer un static pour rserver une mme classe mmoire pour toutes les instances
//private static enum Gender {UNDIFFERENCIED, FEMALE, MALE};
private ArrayList<String> nutrientsOfInterest;
private double residenceTime;
private Map<String, Double> excretionRate;
/**
* Main feature for weight (g) computation before spawning i.e. gametes expelling according to gender, for a given length (cm)
* //Voir pour un retour la ligne lors du commentaire
* key gender
* value
* key feature
* value value
*/
private Map <DiadromousFish.Gender,Map<String, Double>> fishFeaturesPreSpawning;
private Map <DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning;
private Map<String, Double> juvenileFeatures;
/**
* Weight of gametes spawned for both males and females
* key gender
* value g
* usually computed as the difference between unspawned gonad (inbound) and spawned gonad (outbound; "spent gonad")
*/
private Map <DiadromousFish.Gender, Double> spawnedGametesWeight;
/**
* chemical composition of carcass before gametes expelling (before spawning) i.e. soma + gonads + gametes
* <key> gender
* <value>
* <key> chemical element
* <value> value ratio element / (total wet weight) g/g
*/
private Map<DiadromousFish.Gender,Map<String,Double>> compoCarcassPreSpawning;
//package permettant la cration d'une table de hachage ie fonctionnant en cl -valeur. Cl unique, mais valeur peut tre associe plusieurs cls;
//La class d'objet Map a pour point faible la taille des donnes stocker. Plus on a de valeur dans la table, plus c'est lourd et lent! Donc, trouver un compromis entre temps de calcul et espace.
//N'accepte pas la valeur nulle et thread safe i.e. utilisable simultanment par plusieurs lments du programme.
/**
* chemical composition of carcass after spawning i.e. soma + spent gonad (without gametes)
* <value>
* <key> chemical element
* <value> value
*/
private Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning;
/**
* chemical composition of gametes estimated from the MIGADO dataset (BDalosesBruch)
* <key> gender
* <value>
* <key> chemical element
* <value> value
*/
private Map<DiadromousFish.Gender, Map<String,Double>> compoGametes;
// For juveniles - Based on Taverny (1991)
/**
* chemical composition of juveniles
* <key> chemical element
* <value> value
*/
private Map<String,Double> compoJuvenile;
/**
* Constructor based on the 5 Map of fish composition
* @param fishFeaturesPreSpawning
* @param compoCarcassPreSpawning
* @param compoCarcassPostSpawning
* @param compoGametes
* @param compoJuvenile
*/
public FishNutrient(ArrayList<String> nutrientsOfInterest,
double residenceTime,
Map <String, Double> excretionRate,
Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPreSpawning,
Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning,
Map<DiadromousFish.Gender, Double> gameteSpawned,
Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPreSpawning,
Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning,
Map<DiadromousFish.Gender, Map<String, Double>> compoGametes,
Map<String, Double> juvenileFeatures,
Map<String, Double> compoJuvenile)
{
super();
this.nutrientsOfInterest = nutrientsOfInterest;
this.excretionRate = excretionRate;
this.residenceTime = residenceTime;
this.fishFeaturesPreSpawning = fishFeaturesPreSpawning;
this.fishFeaturesPostSpawning = fishFeaturesPostSpawning;
this.spawnedGametesWeight = gameteSpawned;
this.compoCarcassPreSpawning = compoCarcassPreSpawning;
this.compoCarcassPostSpawning = compoCarcassPostSpawning;
this.compoGametes = compoGametes;
this.juvenileFeatures = juvenileFeatures;
this.compoJuvenile = compoJuvenile;
}
/**
* compute the nutrient fluxes for a single fish (in the super individual)
* that dies before spawning
* @param fish
*/
public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
Map<String,Double> nutrientsInput = new Hashtable<String, Double>(); // On crer ici une Map, classe mre des hashtable (Homme = classe mere ie Map//Jules = hashtable)
for (String nutrient : nutrientsOfInterest) {
if (fish.getStage()== Stage.MATURE) {
double totalWeightPre = this.getWeight(fish,SpawningPosition.PRE);
double carcass = totalWeightPre
* compoCarcassPreSpawning.get(fish.getGender()).get(nutrient);
double excretion = totalWeightPre
* residenceTime
* excretionRate.get(nutrient) ;
double nutrientImport = carcass + excretion;
nutrientsInput.put(nutrient, nutrientImport);
}
else {
nutrientsInput.put(nutrient, 0.);
}
}
//TODO Multiply by fish amount
return nutrientsInput;
}
public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish) {
return computeNutrientsInputForDeathBeforeSpawning(fish,this.nutrientsOfInterest);
}
/**
* compute the nutrient fluxes for a single fish (in the super individual)
* that dies after spawning (gametes expelling)
* @param fish
* @return nutrientsInput
*/
public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
for (String nutrient : nutrientsOfInterest) {
if (fish.getStage()== Stage.MATURE) {
double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
double carcass = totalWeightPost
* compoCarcassPostSpawning.get(fish.getGender()).get(nutrient);
//double gametes = (totalWeightPre - totalWeightPost) FAUX car perte de poids somatique due a la reproduction
double gametes = spawnedGametesWeight.get(fish.getGender())
*compoGametes.get(fish.getGender()).get(nutrient); //TODO: FAUX ! Revoir comment calculer les gamtes
double excretion = totalWeightPost
* residenceTime
* excretionRate.get(nutrient);
double nutrientImport = carcass + gametes + excretion;
nutrientsInput.put(nutrient,nutrientImport);
}
else {
nutrientsInput.put(nutrient,0.);
}
}
return nutrientsInput;
}
public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish){
return computeNutrientsInputForDeathAfterSpawning(fish, this.nutrientsOfInterest);
}
/**
* compute the nutrient fluxes for a single fish (in the super individual)
* that survives after spawning
* Map: model output = element of interest ie string + double ie the quantification of this fluxes.
* @return nutrientsInput
*/
public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
for (String nutrient: nutrientsOfInterest) {
if (fish.getStage()==Stage.MATURE) {
//TODO Fix with new data
double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
//Gamete compositions depends on sex.
double gametes = spawnedGametesWeight.get(fish.getGender())
* compoGametes.get(fish.getGender()).get(nutrient);
double excretion = totalWeightPost
* residenceTime
* excretionRate.get(nutrient);
double nutrientImport = gametes + excretion;
nutrientsInput.put(nutrient, nutrientImport);
}
else {
nutrientsInput.put(nutrient,0.);
}
}
return nutrientsInput;
}
public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish) {
return computeNutrientsInputForSurvivalAfterSpawning(fish, this.nutrientsOfInterest);
}
public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish, ArrayList<String>nutrientsOfInterest) {
Map<String,Double> nutrientsExport = new Hashtable<String,Double>();
for(String nutrient: nutrientsOfInterest) {
if(juvenileFish.getStage()==Stage.IMMATURE) {
double JuvenileMass = this.getWeight(juvenileFish);
nutrientsExport.put(nutrient, JuvenileMass * compoJuvenile.get(nutrient));
}
}
return nutrientsExport;
}
public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish){
return computeNutrientsExportForJuveniles(juvenileFish, this.nutrientsOfInterest);
}
/**
* Compute the weight for a fish with length (cm)
* @param fish
* @return weight (g)
*/
public double getWeight (DiadromousFish fish, SpawningPosition spawningPosition) {
double weight = 0.;
if (fish.getStage()==Stage.IMMATURE)
weight = juvenileFeatures.get("aLW") * Math.pow(fish.getLength(),juvenileFeatures.get("bLW"));
else //Stage.MATURE
if (spawningPosition == SpawningPosition.PRE)
weight = fishFeaturesPreSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPreSpawning.get(fish.getGender()).get("bLW") );
else
weight = fishFeaturesPostSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPostSpawning.get(fish.getGender()).get("bLW"));
return weight;
}
/**
* Compute the weight for a fish with length (cm)
* @param fish
* @return weight (g)
*/
public double getWeight (DiadromousFish fish) {
return getWeight (fish, SpawningPosition.PRE);
}
public ArrayList<String> getNutrientsOfInterest() {
return nutrientsOfInterest;
}
/**
* @param args
*/
/**
* @param args
*/
/**
* @param args
*/
public static void main(String[] args) {
double aResidenceTime =30;
System.out.println("aResidenceTime: " + aResidenceTime); //
Map <String, Double> anExcretionRate = new Hashtable <String, Double>();
anExcretionRate.put("N", 24.71E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour : convertit en g
anExcretionRate.put("P", 2.17E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour: convertit en g
System.out.println("anExcretionRate: " + anExcretionRate.toString()); //
/*
* A feature pre spawning
*/
Map<Gender, Map<String, Double>> aFeaturePreSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
/*
* For females
*/
Map<String,Double> aFeature = new Hashtable<String,Double>();
aFeature.put("aLW", Math.exp(-4.9078)); //weight size relationship computed from BDalosesBruch
aFeature.put("bLW", 3.147);
//aFeature.put("bLW",3.3429);// parametre "b" de la relation taille/poids - Coefficient d'allometrie
//aFeature.put("aLW",1.2102E-6 * Math.pow(10., aFeature.get("bLW"))); // parametre "a" de la relation taille/poids en kg/cm- Traduit la condition
//aFeature.put("GSI",0.15);
aFeaturePreSpawning.put(Gender.FEMALE, aFeature);
/*
* For males
*/
aFeature = new Hashtable<String,Double>();
aFeature.put("aLW", Math.exp(-1.304));
aFeature.put("bLW", 2.1774);
//aFeature.put("aLW",2.4386E-6 * Math.pow(10, aFeature.get("bLW"))); // Conversion des g/mm en g.cm (from Taverny, 1991)
//aFeature.put("GSI",.08);
aFeaturePreSpawning.put(Gender.MALE,aFeature);
System.out.println("aFeaturePreSpawning: " + aFeaturePreSpawning.toString()); //
/*
* a Feature post Spawning