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;         
    }