diff --git a/data/input/fishTryRealBV_CC.xml b/data/input/fishTryRealBV_CC.xml index 8a72c6b87ddc1198e4db87a7acb3c4226f1f9a4b..6f101f21c93cbbed7d7d615fb6d667da6014f04b 100644 --- a/data/input/fishTryRealBV_CC.xml +++ b/data/input/fishTryRealBV_CC.xml @@ -1,5 +1,6 @@ <list> <species.DiadromousFishGroup> + <useCemetery>true</useCemetery> <name>species A</name> <color> <red>255</red> @@ -8,11 +9,217 @@ <alpha>255</alpha> </color> <linfVonBert>60.0</linfVonBert> - <dMaxDisp>0.0</dMaxDisp> + <dMaxDisp>300.0</dMaxDisp> <lFirstMaturity>40.0</lFirstMaturity> - <fileNameInputForInitialObservation>data/input/reality/Obs1900.csv</fileNameInputForInitialObservation> + <fishNutrient> + <nutrientsOfInterest> + <string>N</string> + <string>P</string> + </nutrientsOfInterest> + <residenceTime>30.0</residenceTime> + <excretionRate class="hashtable"> + <entry> + <string>P</string> + <double>2.17E-6</double> + </entry> + <entry> + <string>N</string> + <double>2.471E-5</double> + </entry> + </excretionRate> + <fishFeaturesPreSpawning class="hashtable"> + <entry> + <species.DiadromousFish_-Gender>MALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>bLW</string> + <double>2.1774</double> + </entry> + <entry> + <string>aLW</string> + <double>0.27144384321211973</double> + </entry> + </hashtable> + </entry> + <entry> + <species.DiadromousFish_-Gender>FEMALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>bLW</string> + <double>3.147</double> + </entry> + <entry> + <string>aLW</string> + <double>0.007388725660209693</double> + </entry> + </hashtable> + </entry> + </fishFeaturesPreSpawning> + <fishFeaturesPostSpawning class="hashtable"> + <entry> + <species.DiadromousFish_-Gender>MALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>bLW</string> + <double>2.9973</double> + </entry> + <entry> + <string>aLW</string> + <double>0.010383887012522573</double> + </entry> + </hashtable> + </entry> + <entry> + <species.DiadromousFish_-Gender>FEMALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>bLW</string> + <double>2.9418</double> + </entry> + <entry> + <string>aLW</string> + <double>0.013199187556948952</double> + </entry> + </hashtable> + </entry> + </fishFeaturesPostSpawning> + <juvenileFeatures class="hashtable"> + <entry> + <string>bLW</string> + <double>3.0306</double> + </entry> + <entry> + <string>aLW</string> + <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> + <hashtable> + <entry> + <string>P</string> + <double>0.00666</double> + </entry> + <entry> + <string>N</string> + <double>0.02941</double> + </entry> + </hashtable> + </entry> + <entry> + <species.DiadromousFish_-Gender>FEMALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>P</string> + <double>0.006730000000000001</double> + </entry> + <entry> + <string>N</string> + <double>0.029580000000000002</double> + </entry> + </hashtable> + </entry> + </compoCarcassPreSpawning> + <compoCarcassPostSpawning class="hashtable"> + <entry> + <species.DiadromousFish_-Gender>MALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>P</string> + <double>0.00961</double> + </entry> + <entry> + <string>N</string> + <double>0.0279</double> + </entry> + </hashtable> + </entry> + <entry> + <species.DiadromousFish_-Gender>FEMALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>P</string> + <double>0.00997</double> + </entry> + <entry> + <string>N</string> + <double>0.03216</double> + </entry> + </hashtable> + </entry> + </compoCarcassPostSpawning> + <compoGametes class="hashtable"> + <entry> + <species.DiadromousFish_-Gender>MALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>P</string> + <double>0.00724</double> + </entry> + <entry> + <string>N</string> + <double>0.0325</double> + </entry> + </hashtable> + </entry> + <entry> + <species.DiadromousFish_-Gender>FEMALE + </species.DiadromousFish_-Gender> + <hashtable> + <entry> + <string>P</string> + <double>0.0032</double> + </entry> + <entry> + <string>N</string> + <double>0.03242</double> + </entry> + </hashtable> + </entry> + </compoGametes> + <compoJuvenile class="hashtable"> + <entry> + <string>P</string> + <double>0.00887</double> + </entry> + <entry> + <string>N</string> + <double>0.02803</double> + </entry> + </compoJuvenile> + </fishNutrient> + <fileNameInputForInitialObservation>data/input/reality/Obs1900.csv + </fileNameInputForInitialObservation> + <centileForRange>0.95</centileForRange> + <parameterSetfileName>data/input/reality/parameterSet.csv + </parameterSetfileName> + <parameterSetLine>0</parameterSetLine> + <yearOfTheUpdate>0</yearOfTheUpdate> + <basinsToUpdateFile>data/input/reality/basinsToUpdate.csv + </basinsToUpdateFile> <outputPath>data/output/</outputPath> - <processes> <processesAtBegin> <species.PopulateBasinNetworkWithANorthLimit> @@ -99,7 +306,8 @@ <initialLength>2.0</initialLength> <sigmaRecruitment>0.2</sigmaRecruitment> <survivalRateAfterReproduction>0.1</survivalRateAfterReproduction> - <maxNumberOfSuperIndividualPerReproduction>50.0</maxNumberOfSuperIndividualPerReproduction> + <maxNumberOfSuperIndividualPerReproduction>50.0 + </maxNumberOfSuperIndividualPerReproduction> <withDiagnose>false</withDiagnose> </species.ReproduceAndSurviveAfterReproductionWithDiagnose> diff --git a/src/main/java/species/DiadromousFishGroup.java b/src/main/java/species/DiadromousFishGroup.java index 79fc81094ec7cf1b996468f834e7dbaf3016e732..49dab6f5048449929c030970a63a6136c886a5b2 100644 --- a/src/main/java/species/DiadromousFishGroup.java +++ b/src/main/java/species/DiadromousFishGroup.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashMap; +import java.util.Hashtable; import java.util.List; import java.util.Locale; import java.util.Map; @@ -28,6 +29,7 @@ import java.util.regex.Pattern; import miscellaneous.Duo; import miscellaneous.TreeMapForCentile; +import species.DiadromousFish.Gender; import org.openide.util.lookup.ServiceProvider; @@ -56,6 +58,12 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe */ public double lFirstMaturity = 40.; + /** + * Routine to compute nutrient fluxes operated by a single individual (TODO by a single super individual). + * + */ + private FishNutrient fishNutrient; + public String fileNameInputForInitialObservation = "data/input/reality/Obs1900.csv"; /** @@ -121,9 +129,148 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe * @unit */ private transient List<Duo<Double, Double>> parameterSets; + + public static void main(String[] args) { - System.out.println((new XStream(new DomDriver())).toXML(new DiadromousFishGroup(new Pilot(), null, null))); + DiadromousFishGroup diadromousFishGroup = new DiadromousFishGroup(new Pilot(), null, null); + + double aResidenceTime =30; + + + 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 + + + /* + * A feature pre spawning + */ + Map<DiadromousFish.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); + + + /* + * a Feature post Spawning + */ + Map<DiadromousFish.Gender, Map<String, Double>> aFeaturePostSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>(); + + /* + * For females + */ + aFeature = new Hashtable<String,Double>(); + aFeature.put("aLW", Math.exp(-4.3276)); //weight size relationship computed from BDalosesBruch + aFeature.put("bLW", 2.9418); + //aFeature.put("GSI",0.10); //From BDalosesBruch + //aFeature.put("aLW",aFeaturePreSpawning.get(Gender.FEMALE).get("aLW")/(1+aFeature.get("GSI"))); // parametre "a" de la relation taille/poids avec Lt en cm - Traduit la condition + //aFeature.put("bLW",aFeaturePreSpawning.get(Gender.FEMALE).get("bLW"));// parametre "b" de la relation taille/poids - Coefficient d'allometrie + aFeaturePostSpawning.put(Gender.FEMALE, aFeature); + + /* + * For males + */ + aFeature = new Hashtable<String,Double>(); + + aFeature.put("aLW", Math.exp(-4.5675));// parametre "a" de la relation taille/poids - Coefficient d'allometrie + aFeature.put("bLW", 2.9973); + //aFeature.put("GSI",.05); From BDalosesBruch + //aFeature.put("aLW",aFeaturePreSpawning.get(Gender.MALE).get("aLW")/(1+aFeature.get("GSI"))); + //aFeature.put("bLW",aFeaturePreSpawning.get(Gender.MALE).get("bLW")); + aFeaturePostSpawning.put(Gender.MALE,aFeature); + + + Map<DiadromousFish.Gender, Double> aGameteSpawned = new Hashtable <DiadromousFish.Gender,Double>(); + aGameteSpawned.put(Gender.FEMALE, 131.); // Compute from the difference between spawned and unspawned ovaries ie correspond to a mean weight of eggs spawned + aGameteSpawned.put(Gender.MALE, 44.8); // Compute from the difference between spawned and unspawned testes ie correspond to a mean weight of sperm spawned + + + // carcass composition for fish before spawning + Map<DiadromousFish.Gender, Map<String, Double>> aCompoCarcassPreSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>(); + Map<String,Double> aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 2.958 / 100.); //On remplit une collection avec un put. + aCompo.put("P", 0.673 / 100.); + aCompoCarcassPreSpawning.put(Gender.FEMALE,aCompo); + + aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 2.941 / 100.); + aCompo.put("P", 0.666 / 100.); + aCompoCarcassPreSpawning.put(Gender.MALE,aCompo); + + + + // carcass composition for fish after spawning + Map<DiadromousFish.Gender, Map<String, Double>> aCompoCarcassPostSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>(); + aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 3.216 / 100.); //On remplit une collection avec un put. + aCompo.put("P", 0.997 / 100.); + aCompoCarcassPostSpawning.put(Gender.FEMALE,aCompo); + + aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 2.790 / 100.); // From Haskel et al, 2017 + aCompo.put("P", 0.961 / 100.); + aCompoCarcassPostSpawning.put(Gender.MALE,aCompo); + + + + // Gametes composition approximated by the difference between gonads weight before and after spawning. + Map<DiadromousFish.Gender, Map<String, Double>> aCompoGametes = new Hashtable<DiadromousFish.Gender,Map<String,Double>>(); + aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 3.242 / 100.); //On remplit une collection avec un put. From Haskel et al, 2018. + aCompo.put("P", 0.320 / 100.); // Haskel = %P, N, ici ratio donc divise par 100 + aCompoGametes.put(Gender.FEMALE,aCompo); + + aCompo = new Hashtable<String,Double>(); + aCompo.put("N", 3.250 / 100.); + aCompo.put("P", 0.724 / 100.); + aCompoGametes.put(Gender.MALE,aCompo); + + + // features for juveniles + + Map<String,Double> aJuvenileFeatures = new Hashtable<String, Double>(); + aJuvenileFeatures.put("bLW",3.0306); + aJuvenileFeatures.put("aLW",Math.exp(-11.942) * Math.pow(10., aJuvenileFeatures.get("bLW"))); + + + // carcass composition for juveniles fish + Map<String, Double> aCompoJuveniles = new Hashtable<String,Double>(); + aCompoJuveniles.put("N", 2.803 / 100.); //On remplit une collection avec un put. %N in wet weight (Haskell et al, 2017) on Alosa sapidissima + aCompoJuveniles.put("P", 0.887 / 100.); //%P in wet weight (from Haskell et al, 2017) on Alosa sapidissima + + + ArrayList <String> nutrientsOfInterest= new ArrayList <String>(); + nutrientsOfInterest.add("N"); + nutrientsOfInterest.add("P"); + + + + diadromousFishGroup.fishNutrient = new FishNutrient(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, aGameteSpawned, + aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes, + aJuvenileFeatures, aCompoJuveniles); + + + System.out.println((new XStream(new DomDriver())).toXML(diadromousFishGroup)); } public DiadromousFishGroup(Pilot pilot, BasinNetwork environment, Processes processes) { @@ -360,10 +507,16 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe return lFirstMaturity; } + public FishNutrient getFishNutrient() { + + return fishNutrient; + } + public void setlFirstMaturity(double lFirstMaturity) { this.lFirstMaturity = lFirstMaturity; } + // ================================================================ // statictis for calibration // ================================================================ diff --git a/src/main/java/species/FishNutrient.java b/src/main/java/species/FishNutrient.java index 43c757c785c18516b432d9f70ae7907588fd01ca..753335d48ea6a20eaa43c77b76bd2fe7023cef05 100644 --- a/src/main/java/species/FishNutrient.java +++ b/src/main/java/species/FishNutrient.java @@ -20,15 +20,11 @@ package species; import environment.SeaBasin; -import environment.Time.Season; import fr.cemagref.simaqualife.pilot.Pilot; import species.DiadromousFish.Gender; import species.DiadromousFish.Stage; -import species.ReproduceAndSurviveAfterReproduction; import java.util.ArrayList; -import java.util.HashMap; import java.util.Hashtable; -import java.util.List; import java.util.Map; import com.thoughtworks.xstream.XStream; @@ -44,6 +40,7 @@ public class FishNutrient { private static enum SpawningPosition {PRE,POST}; // on créer un static pour réserver une même classe mémoire pour toutes les instances + //private static enum Gender {UNDIFFERENCIED, FEMALE, MALE}; private ArrayList<String> nutrientsOfInterest; @@ -59,11 +56,11 @@ public class FishNutrient { * key feature * value value */ - private Map <Gender,Map<String, Double>> fishFeaturesPreSpawning; + private Map <DiadromousFish.Gender,Map<String, Double>> fishFeaturesPreSpawning; - private Map <Gender, Map<String, Double>> fishFeaturesPostSpawning; + private Map <DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning; - private Map <String, Double> juvenileFeatures; + private Map<String, Double> juvenileFeatures; /** @@ -72,7 +69,7 @@ public class FishNutrient { * value g * usually computed as the difference between unspawned gonad (inbound) and spawned gonad (outbound; "spent gonad") */ - private Map <Gender, Double> spawnedGametesWeight; + private Map <DiadromousFish.Gender, Double> spawnedGametesWeight; /** @@ -109,8 +106,6 @@ public class FishNutrient { /** * chemical composition of juveniles - * <key> stage - * <value> * <key> chemical element * <value> value */ @@ -118,13 +113,6 @@ public class FishNutrient { private Map<String,Double> compoJuvenile; - /** - * - */ - public FishNutrient() { - // TODO Auto-generated constructor stub - } - /** * Constructor based on the 5 Map of fish composition @@ -138,12 +126,12 @@ public class FishNutrient { double residenceTime, Map <String, Double> excretionRate, - Map<Gender, Map<String, Double>> fishFeaturesPreSpawning, - Map<Gender, Map<String, Double>> fishFeaturesPostSpawning, - Map<Gender, Double> gameteSpawned, - Map<Gender, Map<String, Double>> compoCarcassPreSpawning, - Map<Gender, Map<String, Double>> compoCarcassPostSpawning, - Map<Gender, Map<String, Double>> compoGametes, + 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) { @@ -161,7 +149,7 @@ public class FishNutrient { this.compoJuvenile = compoJuvenile; } - + /** * compute the nutrient fluxes for a single fish (in the super individual) * that dies before spawning @@ -499,6 +487,8 @@ public static void main(String[] args) { System.out.println(juvenileFish.getStage() + ": " + juvenileFish.getLength() + " cm " + fn.getWeight(juvenileFish)+ " g "); System.out.println("\tNutrients Fluxes for juveniles " + fn.computeNutrientsExportForJuveniles(juvenileFish).toString()); + + /* Create XML file * diff --git a/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java b/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java index a7ffa89871d199929d0aafed7c7045b47b3719f9..9e5f7d3b7f94696f599d8c04fffe10a350345b17 100644 --- a/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java +++ b/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java @@ -337,9 +337,11 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG riverBasin.getNumberOfNonNulRecruitmentForFinalProbOfPres().push(0.); } // -------------------------------------------------------------------------------------------------- - // Remove deadfish + // Remove deadfish and compute the related nutrient fluxes // -------------------------------------------------------------------------------------------------- for (DiadromousFish fish : deadFish){ + + System.out.println(group.getFishNutrient().computeNutrientsInputForDeathAfterSpawning(fish)); // group.removeAquaNism(fish); } deadFish.clear();