Je m apercois que ca implique aussi de calculer fishing mortality par group apres la post action, sinon pas de landing disponible... Le 17 avril 2015 18:17, Sigrid Lehuta <sigridlehuta@gmail.com> a écrit :
Comme le dit le titre : dans SiMatrix je veux accéder a la valeur d'une variable d'une population (onglet variables), son petit nom est "FonCatch". je sais le faire ds une regle avec context.get(pop).getAsDouble("FonCatch")
mais ds si matrix on a pas de context...
Si ca n'est pas possible comme ca, voici ce que je veux faire : 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.
Pouvez vous proposer autre chose si ca ne va pas? Merci !
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; }