Le 13/08/2012 15:20, Eric Chatellier a écrit :
Le 13/08/2012 15:15, Loic GASCHE a écrit :
Le 13/08/2012 15:07, Eric Chatellier a écrit :
Dans ton cas, tu appelles getSubMatrix() sur une matrice qui existe. D'où viens cette matrice ? Tu as un exemple de code qui la récupère ou qui la crée ?
public MatrixND TotalFishingMortality (TimeStep step, Population pop, MatrixND FishingMortalityPerGroup)throws TopiaException { // Zone zone double Ftemp=0; double Fpop=0; double Nbre;
MatrixND tfmMatrix = FishingMortalityPerGroup.copy();
C'est une copy de FishingMortalityPerGroup ?
Oui c'est ça
Tu aurais le code de celle ci ?
public MatrixND FishingMortalityPerGroup (TimeStep step, Population pop, ResultStorage resManager)throws TopiaException { double Fgroup=0; double Ftemp=0; double Fpop=0; double Cgroup=0; double Ctot=0; double SumMtot=0; double Mpop=0; double Mgroup=0; double Mtot=0; double NgroupJan=0; double NgroupDec=0; double DeltaN=0; int dim1; int dim2; List<Population> populations = new ArrayList(); populations.add(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")}); //if (step.getMonth() == Month.DECEMBER){ 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 MatrixND catchPerStrategyTemp = resManager.getMatrix(loopstep, pop, ResultName.MATRIX_CATCH_PER_STRATEGY_MET_PER_ZONE_POP); 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); // 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()); //Fgroup = RuleUtil.fmin(step,0.0,2.0,1.0e-10,Cgroup,Mgroup,NgroupJan); Fgroup = RuleUtil.fmin(step,0.0,2.0,1.0e-10, new FonctionObjectif_Baranov(Cgroup,Mgroup,NgroupJan)); 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) ? } } //tfgMatrix.setValue(pop, group, Fgroup); // Bien faire attention a l'endroit ou on met cette etape (quelle boucle) ? log.info("tfgMatrix = " + tfgMatrix); log.info("tfg.DimensionNames = " + tfgMatrix.getDimensionNames()); return tfgMatrix; } Une autre question : getSubMatrix utilise des int, alors que mes ageMin et ageMax sont des doubles... Cela ne va-t-il pas poser un soucis ? Peut-on convertir un double en int ?