Commit 1b615869 authored by Lambert Patrick's avatar Lambert Patrick
Browse files

targeted age for calibration as a field

Showing with 59 additions and 35 deletions
+59 -35
...@@ -172,6 +172,12 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe ...@@ -172,6 +172,12 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
*/ */
private transient List<Duo<Double, Double>> parameterSets; private transient List<Duo<Double, Double>> parameterSets;
// =================================================
// calibration
// =================================================
private Double targetedAgeForFemaleSpawnerForFirstTime = 5.5;
private Double targetedAgeForMaleSpawnerForFirstTime = 4.5;
/** /**
* map of observedoccurence in 1900 * map of observedoccurence in 1900
...@@ -491,6 +497,12 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe ...@@ -491,6 +497,12 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
} catch (IOException ex) { } catch (IOException ex) {
Logger.getLogger(DiadromousFishGroup.class.getName()).log(Level.SEVERE, null, ex); Logger.getLogger(DiadromousFishGroup.class.getName()).log(Level.SEVERE, null, ex);
} }
// defaut values
if (targetedAgeForFemaleSpawnerForFirstTime == null)
targetedAgeForFemaleSpawnerForFirstTime = 5.5;
if (targetedAgeForMaleSpawnerForFirstTime == null)
targetedAgeForMaleSpawnerForFirstTime = 4.5;
} }
...@@ -666,7 +678,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe ...@@ -666,7 +678,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
@Observable(description="Female spawners For First Time Summary Statistic") @Observable(description="Female spawners For First Time Summary Statistic")
public double computeFemaleSpawnerForFirstTimeSummaryStatistic() { public double computeFemaleSpawnerForFirstTimeSummaryStatistic() {
return computeFemaleSpawnerForFirstTimeSummaryStatisticWithTarget(5.5); return computeFemaleSpawnerForFirstTimeSummaryStatisticWithTarget(targetedAgeForFemaleSpawnerForFirstTime);
} }
...@@ -712,7 +724,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe ...@@ -712,7 +724,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
@Observable(description="Male spawners For First Time Summary Statistic") @Observable(description="Male spawners For First Time Summary Statistic")
public double computeMaleSpawnerForFirstTimeSummaryStatistic() { public double computeMaleSpawnerForFirstTimeSummaryStatistic() {
return computeMaleSpawnerForFirstTimeSummaryStatisticWithTarget(4.5); return computeMaleSpawnerForFirstTimeSummaryStatisticWithTarget(targetedAgeForFemaleSpawnerForFirstTime);
} }
@Observable(description="mean age of first reprodution for male") @Observable(description="mean age of first reprodution for male")
......
...@@ -89,7 +89,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -89,7 +89,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
mortalityFunction=new MortalityFunction(); mortalityFunction=new MortalityFunction();
stockRecruitmentRelationship= new StockRecruitmentRelationship(); stockRecruitmentRelationship= new StockRecruitmentRelationship();
} }
/** /**
* @return the tempMinRep * @return the tempMinRep
...@@ -105,20 +105,22 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -105,20 +105,22 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
List<DiadromousFish> deadFish = new ArrayList<DiadromousFish>(); List<DiadromousFish> deadFish = new ArrayList<DiadromousFish>();
for(RiverBasin riverBasin : group.getEnvironment().getRiverBasins()){ for(RiverBasin riverBasin : group.getEnvironment().getRiverBasins()){
// before the party !!!! // before the party !!!!
double fluxBefore =riverBasin.getSpawnerNumber(); double fluxBefore =riverBasin.getSpawnerNumber();
double b, c, alpha, beta, amountPerSuperIndividual , S95, S50 ; double b, c, alpha, beta, amountPerSuperIndividual , S95, S50 ;
double numberOfFemaleSpawners = 0.; double numberOfFemaleSpawners = 0.;
double numberOfMaleSpawners = 0.; double numberOfMaleSpawners = 0.;
double numberOfAutochtones = 0.; double numberOfAutochtones = 0.;
double numberOfFemaleSpawnerForFirstTime = 0.; double numberOfFemaleSpawnerForFirstTime = 0.;
double femaleSpawnersForFirstTimeAgesSum = 0.; double femaleSpawnersForFirstTimeAgesSum = 0.;
double femaleSpawnersForFirstTimeLengthsSum = 0.;
double numberOfMaleSpawnerForFirstTime = 0.; double numberOfMaleSpawnerForFirstTime = 0.;
double maleSpawnersForFirstTimeAgesSum = 0.; double maleSpawnersForFirstTimeAgesSum = 0.;
double maleSpawnersForFirstTimeLengthsSum = 0.;
long survivalAmount; long survivalAmount;
double muRecruitment = 0.; double muRecruitment = 0.;
//double weightOfGenitors = 0.; //double weightOfGenitors = 0.;
...@@ -190,24 +192,26 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -190,24 +192,26 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
for (DiadromousFish fish : fishInBasin){ for (DiadromousFish fish : fishInBasin){
if (fish.isMature()) { if (fish.isMature()) {
// number of spawners per gender // number of spawners per gender
if (fish.getGender() == Gender.FEMALE) { if (fish.getGender() == Gender.FEMALE) {
//System.out.println(fish.getAge() + " -> "+ fish.getLength() + " ("+fish.getStage()+")"); //System.out.println(fish.getAge() + " -> "+ fish.getLength() + " ("+fish.getStage()+")");
numberOfFemaleSpawners += fish.getAmount() ; // on ajoute a chaque fois le fish.getAmount (CcumSum) numberOfFemaleSpawners += fish.getAmount() ; // on ajoute a chaque fois le fish.getAmount (CcumSum)
if (fish.getNumberOfReproduction() < 1) { if (fish.getNumberOfReproduction() < 1) {
numberOfFemaleSpawnerForFirstTime++; numberOfFemaleSpawnerForFirstTime += fish.getAmount();
femaleSpawnersForFirstTimeAgesSum += fish.getAge(); femaleSpawnersForFirstTimeAgesSum += fish.getAge() * fish.getAmount();
femaleSpawnersForFirstTimeLengthsSum += fish.getLength() * fish.getAmount();
} }
} }
else if (fish.getGender() == Gender.MALE) { else if (fish.getGender() == Gender.MALE) {
numberOfMaleSpawners += fish.getAmount() ; // on ajoute a chaque fois le fish.getAmount (CcumSum) numberOfMaleSpawners += fish.getAmount() ; // on ajoute a chaque fois le fish.getAmount (CcumSum)
if (fish.getNumberOfReproduction() < 1) { if (fish.getNumberOfReproduction() < 1) {
numberOfMaleSpawnerForFirstTime++; numberOfMaleSpawnerForFirstTime += fish.getAmount();
maleSpawnersForFirstTimeAgesSum += fish.getAge(); maleSpawnersForFirstTimeAgesSum += fish.getAge() * fish.getAmount();
maleSpawnersForFirstTimeLengthsSum += fish.getLength() * fish.getAmount();
} }
} }
// spawner per origine // spawner per origine
String basinName = fish.getBirthBasin().getName(); String basinName = fish.getBirthBasin().getName();
spawnerOriginsDuringReproduction.put(basinName, spawnerOriginsDuringReproduction.get(basinName) + fish.getAmount() ); spawnerOriginsDuringReproduction.put(basinName, spawnerOriginsDuringReproduction.get(basinName) + fish.getAmount() );
...@@ -231,12 +235,12 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -231,12 +235,12 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
spawnerOrigin = fluxOrigin.AUTOCHTONOUS; spawnerOrigin = fluxOrigin.AUTOCHTONOUS;
else else
spawnerOrigin = fluxOrigin.ALLOCHTONOUS; spawnerOrigin = fluxOrigin.ALLOCHTONOUS;
// survival after reproduction (semelparity or iteroparity) of SI (change the amount of the SI) // survival after reproduction (semelparity or iteroparity) of SI (change the amount of the SI)
double biomass = 0.; double biomass = 0.;
survivalAmount = Miscellaneous.binomialForSuperIndividual(group.getPilot(), fish.getAmount(), survivalRateAfterReproduction); survivalAmount = Miscellaneous.binomialForSuperIndividual(group.getPilot(), fish.getAmount(), survivalRateAfterReproduction);
// update the amount of fish or kill the fish if survival amount = 0 // update the amount of fish or kill the fish if survival amount = 0
// compute nutrient fluxes // compute nutrient fluxes
if (survivalAmount > 0) {// SUperindividu est encore vivant mais il perd des effectifs if (survivalAmount > 0) {// SUperindividu est encore vivant mais il perd des effectifs
...@@ -323,8 +327,8 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -323,8 +327,8 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
System.out.println("\tStrap="+stockRecruitmentRelationship.getStockTrap(riverBasin.getNativeSpawnerMortality())+ System.out.println("\tStrap="+stockRecruitmentRelationship.getStockTrap(riverBasin.getNativeSpawnerMortality())+
"\tStotal="+numberOfFemaleSpawners+"\tSautochthonous="+ "\tStotal="+numberOfFemaleSpawners+"\tSautochthonous="+
spawnerOriginsDuringReproduction.get(riverBasin.getName())); spawnerOriginsDuringReproduction.get(riverBasin.getName()));
/* // display effective from each catchment /* // display effective from each catchment
System.out.print(riverBasin.getName()); System.out.print(riverBasin.getName());
for (String natalBasinName : group.getEnvironment().getRiverBasinNames()){ for (String natalBasinName : group.getEnvironment().getRiverBasinNames()){
System.out.print("\t"+natalBasinName); System.out.print("\t"+natalBasinName);
...@@ -335,9 +339,9 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -335,9 +339,9 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
System.out.print("\t"+spawnerOriginsDuringReproduction.get(natalBasinName)); System.out.print("\t"+spawnerOriginsDuringReproduction.get(natalBasinName));
} }
System.out.println();*/ System.out.println();*/
// System.out.println("\t"+ riverBasin.getPopulationStatus()); // System.out.println("\t"+ riverBasin.getPopulationStatus());
String message; String message;
if (Double.isNaN(riverBasin.getNativeSpawnerMortality())) if (Double.isNaN(riverBasin.getNativeSpawnerMortality()))
message="noSense"; message="noSense";
...@@ -375,7 +379,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -375,7 +379,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
long numberOfRecruit = Math.round(Math.exp(genNormal.nextDouble()*sigmaRecruitment + muRecruitment)); long numberOfRecruit = Math.round(Math.exp(genNormal.nextDouble()*sigmaRecruitment + muRecruitment));
long numberOfFemaleRecruit = Math.round(numberOfRecruit * proportionOfFemaleAtBirth); long numberOfFemaleRecruit = Math.round(numberOfRecruit * proportionOfFemaleAtBirth);
long numberOfMaleRecruit = numberOfRecruit - numberOfFemaleRecruit; long numberOfMaleRecruit = numberOfRecruit - numberOfFemaleRecruit;
//System.out.println(group.getPilot().getCurrentTime()+" "+Time.getSeason(group.getPilot())+" "+ riverBasin.getName()+": " + numberOfGenitors + " spwaners \tgive "+ numberOfRecruit + " recruits"); //System.out.println(group.getPilot().getCurrentTime()+" "+Time.getSeason(group.getPilot())+" "+ riverBasin.getName()+": " + numberOfGenitors + " spwaners \tgive "+ numberOfRecruit + " recruits");
// ---------------------------------------------- // ----------------------------------------------
...@@ -384,16 +388,24 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -384,16 +388,24 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
riverBasin.getLastPercentagesOfAutochtones().push(numberOfAutochtones * 100 / numberOfFemaleSpawners); riverBasin.getLastPercentagesOfAutochtones().push(numberOfAutochtones * 100 / numberOfFemaleSpawners);
// keep the number of spawners for the first time in the basin // keep the number of spawners for the first time in the basin
if (numberOfFemaleSpawnerForFirstTime>0) if (numberOfFemaleSpawnerForFirstTime>0) {
riverBasin.getSpawnersForFirstTimeMeanAges(Gender.FEMALE).push(femaleSpawnersForFirstTimeAgesSum/numberOfFemaleSpawnerForFirstTime); riverBasin.getSpawnersForFirstTimeMeanAges(Gender.FEMALE).push(femaleSpawnersForFirstTimeAgesSum / numberOfFemaleSpawnerForFirstTime);
else riverBasin.getSpawnersForFirstTimeMeanLengths(Gender.FEMALE).push(femaleSpawnersForFirstTimeLengthsSum / numberOfFemaleSpawnerForFirstTime);
}
else {
riverBasin.getSpawnersForFirstTimeMeanAges(Gender.FEMALE).push(0.); riverBasin.getSpawnersForFirstTimeMeanAges(Gender.FEMALE).push(0.);
if (numberOfMaleSpawnerForFirstTime>0) riverBasin.getSpawnersForFirstTimeMeanLengths(Gender.MALE).push(0.);
}
if (numberOfMaleSpawnerForFirstTime>0) {
riverBasin.getSpawnersForFirstTimeMeanAges(Gender.MALE).push(maleSpawnersForFirstTimeAgesSum/numberOfMaleSpawnerForFirstTime); riverBasin.getSpawnersForFirstTimeMeanAges(Gender.MALE).push(maleSpawnersForFirstTimeAgesSum/numberOfMaleSpawnerForFirstTime);
else riverBasin.getSpawnersForFirstTimeMeanLengths(Gender.MALE).push(maleSpawnersForFirstTimeLengthsSum / numberOfMaleSpawnerForFirstTime);
}
else {
riverBasin.getSpawnersForFirstTimeMeanAges(Gender.MALE).push(0.); riverBasin.getSpawnersForFirstTimeMeanAges(Gender.MALE).push(0.);
riverBasin.getSpawnersForFirstTimeMeanLengths(Gender.MALE).push(0.);
}
//System.out.println("nb spawners in basin " + riverBasin.getName() + " : " + numberOfGenitors); //System.out.println("nb spawners in basin " + riverBasin.getName() + " : " + numberOfGenitors);
//System.out.println("nb recruit in basin " + riverBasin.getName() + " : " + numberOfRecruit); //System.out.println("nb recruit in basin " + riverBasin.getName() + " : " + numberOfRecruit);
...@@ -401,31 +413,31 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -401,31 +413,31 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
if (numberOfRecruit > 0){ if (numberOfRecruit > 0){
long numberOfsuperIndividual, effectiveAmount, remainingFish; long numberOfsuperIndividual, effectiveAmount, remainingFish;
// features of the super individuals // features of the super individuals
// for female // for female
numberOfsuperIndividual = Math.max(1L, numberOfsuperIndividual = Math.max(1L,
Math.round(numberOfFemaleRecruit / amountPerSuperIndividual)); Math.round(numberOfFemaleRecruit / amountPerSuperIndividual));
effectiveAmount = (long) Math.floor(numberOfFemaleRecruit / numberOfsuperIndividual); effectiveAmount = (long) Math.floor(numberOfFemaleRecruit / numberOfsuperIndividual);
for (long i = 0; i < (numberOfsuperIndividual-1); i++){ for (long i = 0; i < (numberOfsuperIndividual-1); i++){
group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount, Gender.FEMALE)); group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount, Gender.FEMALE));
} }
// the last Super indivial could be larger to include remainging fish // the last Super indivial could be larger to include remainging fish
remainingFish = numberOfFemaleRecruit - numberOfsuperIndividual * effectiveAmount; remainingFish = numberOfFemaleRecruit - numberOfsuperIndividual * effectiveAmount;
group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount + remainingFish, Gender.FEMALE)); group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount + remainingFish, Gender.FEMALE));
// for male // for male
numberOfsuperIndividual = Math.max(1L, numberOfsuperIndividual = Math.max(1L,
Math.round(numberOfMaleRecruit / amountPerSuperIndividual)); Math.round(numberOfMaleRecruit / amountPerSuperIndividual));
effectiveAmount = (long) Math.floor(numberOfMaleRecruit / numberOfsuperIndividual); effectiveAmount = (long) Math.floor(numberOfMaleRecruit / numberOfsuperIndividual);
for (long i = 0; i < (numberOfsuperIndividual-1); i++){ for (long i = 0; i < (numberOfsuperIndividual-1); i++){
group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount, Gender.MALE)); group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount, Gender.MALE));
} }
// the last Super indivial could be larger to include remainging fish // the last Super indivial could be larger to include remainging fish
remainingFish = numberOfMaleRecruit - numberOfsuperIndividual * effectiveAmount; remainingFish = numberOfMaleRecruit - numberOfsuperIndividual * effectiveAmount;
group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount + remainingFish, Gender.FEMALE)); group.addAquaNism(new DiadromousFish(group.getPilot(), riverBasin, initialLength, effectiveAmount + remainingFish, Gender.FEMALE));
// ---------------------------------------------- // ----------------------------------------------
// keep information when reproduction with success // keep information when reproduction with success
// stock the first year when recruitment is non nul // stock the first year when recruitment is non nul
...@@ -476,12 +488,12 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG ...@@ -476,12 +488,12 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
group.removeAquaNism(fish); group.removeAquaNism(fish);
} }
deadFish.clear(); deadFish.clear();
// ------------------------------------------------------- // -------------------------------------------------------
// display information // display information
// ----------------------------------------------------- // -----------------------------------------------------
if (displayFluxesOnConsole) if (displayFluxesOnConsole)
System.out.println(group.getPilot().getCurrentTime() + "; " + Time.getYear(group.getPilot()) + ";" + Time.getSeason(group.getPilot()) + ";IMPORT;" System.out.println(group.getPilot().getCurrentTime() + "; " + Time.getYear(group.getPilot()) + ";" + Time.getSeason(group.getPilot()) + ";IMPORT;"
+ riverBasin.getName() + ";" + fluxBefore + ";" + riverBasin.getSpawnerNumberPerGroup(group)+ "; " + totalInputFluxes); + riverBasin.getName() + ";" + fluxBefore + ";" + riverBasin.getSpawnerNumberPerGroup(group)+ "; " + totalInputFluxes);
BufferedWriter bW = group.getbWForFluxes(); BufferedWriter bW = group.getbWForFluxes();
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment