la mortalité par peche par groupe est calculée sur les captures ou sur les debarquements selon l'espece. J'ai donc crée la variable FonCatch qui vaut 1 si F est calculee sur les captures et 0 sinon. et je veux que la methode fishingMortalityPerGroup en tienne compte. Cf dessous.
public MatrixND fishingMortalityPerGroup(TimeStep step, Population pop, ResultStorage resManager) throws TopiaException {
double Fgroup = 0;
double Cgroup = 0;
double Mgroup = 0;
double NgroupJan = 0;
List<Population> populations = Collections.singletonList(pop);
List<PopulationGroup> groups = pop.getPopulationGroup();
MatrixND tfgMatrix = MatrixFactory.getInstance().create(
ResultName.MATRIX_FISHING_MORTALITY_PER_GROUP,
new List[]{populations, groups}, // On travaille sur les pops ET les groupes
new String[]{n("Population"), n("Group")});
for (PopulationGroup group : groups) {
if (step.getMonth() == Month.DECEMBER) {
MatrixND catchPerStrategy = null;
for (TimeStep loopstep = new TimeStep(step.getYear() * 12); loopstep.beforeOrEquals(step); loopstep=loopstep.next()) {
// On fait cette boucle pour contourner les aspects de cache qui font que les resultats ne sont pas recuperes
//s'ils ont deja ete calcules une fois (meme s'ils ont change depuis)
// beforeOrEquals sert a bien prendre Decembre aussi
if(context.get(pop).getAsDouble("FonCatch") == null || context.get(pop).getAsDouble("FonCatch") == 1){
MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP);
}else {
MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_LANDING_PER_MET);
}
if (catchPerStrategy == null) {
catchPerStrategy = catchPerStrategyTemp.clone();
// On clone la matrice car si on fait les operations sur celle contenue dans le cache on la modifie et donc on recupere des resultats faux.
} else {
catchPerStrategy = catchPerStrategy.add(catchPerStrategyTemp); // Pour avoir la somme des captures sur les 12 mois
}
}
//
log.info("catchPerStrategy = " + catchPerStrategy);
catchPerStrategy = catchPerStrategy.sumOverDim(0); // Strategy
catchPerStrategy = catchPerStrategy.sumOverDim(1); // Metier
catchPerStrategy = catchPerStrategy.sumOverDim(3); // Zone : une pop peut avoir plusieurs zonespop dans ISIS
List semgroup = catchPerStrategy.getSemantic(2);
catchPerStrategy = catchPerStrategy.reduce(); // Enleve les dimensions de taille 1
catchPerStrategy.setSemantic(0, semgroup); // Ne plait pas a Eric
Cgroup = catchPerStrategy.getValue(group);
//
log.info("Cgroup = " + Cgroup + "Year=" + step.getYear());
//
log.info("catchPerStrategy = " + catchPerStrategy + "Year=" + step.getYear());
MatrixND naturalDeathRatePop = pop.getNaturalDeathRateMatrix();
naturalDeathRatePop = naturalDeathRatePop.meanOverDim(1); // moyenne sur Zone
naturalDeathRatePop = naturalDeathRatePop.reduce(); // Enleve les dimensions de taille 1
Mgroup = naturalDeathRatePop.getValue(group);
//
log.info("Mgroup= " + Mgroup + "Year=" + step.getYear());
MatrixND abundancePopJan = resManager.getMatrix(new TimeStep(12*step.getYear()), pop, ResultName.MATRIX_ABUNDANCE_BEGIN_MONTH); // Le timestep 0 correspond a janvier de la premiere annee et les annees sont numerotees a partir de zero
abundancePopJan = abundancePopJan.sumOverDim(1); // somme sur Zone
abundancePopJan = abundancePopJan.reduce();
NgroupJan = abundancePopJan.getValue(group);
//
log.info("NgroupJan = " + NgroupJan + "Year=" + step.getYear());
ObjectiveFunction f = new ObjectiveFunctionBaranov(Cgroup, Mgroup, NgroupJan);
Fgroup = MinimisationUtil.fmin(0.0,2.0,1.0e-10, f); // step ??
//
log.info("Fgroup = " + Fgroup);
tfgMatrix.setValue(pop, group, Fgroup); // Bien faire attention a l'endroit ou on met cette etape (quelle boucle) ?
} else {
//Fgroup = 0; // Ce n'est plus une valeur unique mais une matrice, est-ce que cette notation peut fonctionner ?
tfgMatrix.setValue(pop, group, 0); // Bien faire attention a l'endroit ou on met cette etape (quelle boucle) ?
}
}
//
log.info("tfgMatrix = " + tfgMatrix);
//
log.info("tfg.DimensionNames = " + Arrays.toString(tfgMatrix.getDimensionNames()));
//
log.info("tfg.Semantics = " + Arrays.toString(tfgMatrix.getSemantics()));
return tfgMatrix;
}