/* * #%L * IsisFish data * %% * Copyright (C) 2006 - 2011 Ifremer, CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 2 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * . * #L% */ package rules; import fr.ifremer.isisfish.datastore.ResultStorage; import fr.ifremer.isisfish.entities.Metier; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.Strategy; import fr.ifremer.isisfish.rule.AbstractRule; import fr.ifremer.isisfish.simulator.SimulationContext; import fr.ifremer.isisfish.types.Month; import fr.ifremer.isisfish.types.TimeStep; import fr.ifremer.isisfish.util.Doc; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.math.matrix.MatrixFactory; import org.nuiton.math.matrix.MatrixIterator; import org.nuiton.math.matrix.MatrixND; import resultinfos.*; import java.util.Arrays; import java.util.List; /** * Le but de cette regle est de permettre de simuler une "Effort control rule", * et d'ajuster l'effort des chalutiers chaque annee pour etre à Fmsy du merlu * Elle va fournir des valeurs de reduction d'effort pour une regle * * Created: * * @author Sigrid * @version $Revision: * * Last update: $Date: 131212 $ * by : $Author: Loic $ */ public class HCR_effort_WestMed extends AbstractRule { /** to use log facility, just put in your code: log.info("..."); */ static private Log log = LogFactory.getLog(HCR_effort_WestMed.class); @Doc("Affected population") public Population param_pop = null; @Doc("Begin date") public TimeStep param_beginStep = new TimeStep(36); @Doc("End date") public TimeStep param_endStep = new TimeStep(119); @Doc("Fmsy") public double param_fmsy = 0.29; boolean affectation = false; protected MatrixND MatrixTrackRule; protected String[] necessaryResult = { // put here all necessary result for this rule // example: MatrixTrackRule.NAME, MatrixTotalFishingMortality.NAME, MatrixCatchPerStrategyMetPerZonePop.NAME }; /** * @return the necessaryResult */ @Override public String[] getNecessaryResult() { return this.necessaryResult; } /** * Permet d'afficher a l'utilisateur une aide sur la regle. * * @return L'aide ou la description de la regle */ @Override public String getDescription() { return "Effort Control Rule : compute effort to be at Fmsy, for a given population"; } /** * Appele au demarrage de la simulation, cette methode permet d'initialiser * des valeurs * * @param context La simulation pour lequel on utilise cette regle */ @Override public void init(SimulationContext context) throws Exception { } /** * La condition qui doit etre vrai pour faire les actions. * * @param context la simulation pour lequel on utilise cette regle * @param step le pas de temps courant * @param metier le metier concerne * @return vrai si on souhaite que les actions soit faites */ @Override public boolean condition(SimulationContext context, TimeStep step, Metier metier) throws Exception { boolean result = false; if (step.afterOrEquals(param_beginStep) && step.before(param_endStep) && step.getMonth() == Month.JANUARY && step.getStep()!=0){ result = true; affectation =false; } return result; } /** * Si la condition est vrai alors cette action est executee avant le pas * de temps de la simulation. * * @param context la simulation pour lequel on utilise cette regle * @param step le pas de temps courant * @param metier le metier concerne */ @Override public void preAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { if( !affectation){ //log.info("Mise en place de l'HCR"); ResultStorage matResult = context.getSimulationStorage().getResultStorage(); // Calcul Fbar de l'anne double Fbar; // Fbar ISIS MatrixND MatFy = matResult.getMatrix(step.previous(), param_pop, MatrixTotalFishingMortality.NAME); // Fbar Fbar = MatFy.getValue(0) ; // % captures des chalutiers et Fpartiels double captTot = 0; double captOTB = 0; int year = step.previousYear().getYear(); for (TimeStep dat = new TimeStep(0); dat.before(step); dat = dat.next()) { if( dat.getYear() == year) { MatrixND mat = matResult.getMatrix(dat, param_pop, MatrixCatchPerStrategyMetPerZonePop.NAME); captTot += mat.sumAll(); MatrixND matStr = mat.sumOverDim(1,2,3).reduce(); for(MatrixIterator i= matStr.iterator(); i.hasNext();){ i.next(); Object [] sems = i.getSemanticsCoordinates(); Strategy str = (Strategy) sems[0]; if(str.getName().contains("_VL")){ captOTB += i.getValue(); } } } } double percOTB = captOTB/captTot; double FpOTB = Fbar * percOTB; //........................................................................... double multEffort = (param_fmsy - Fbar*(1-percOTB))/FpOTB; //---------------------------------------------------------------------------------------------------- // Faire en sorte que le mult soit utilise par la regle effort reduction context.setValue("multEffort" , multEffort); //---------------------------------------------------------------------------------------------------- // Store infos in MatrixTrackRule MatrixTrackRule = MatrixFactory.getInstance().create( MatrixTrackRule.NAME, new List[] { Arrays.asList(new String[]{"%captOTB","Fbar","FpOTB","mult"})}); MatrixTrackRule.setValue("%captOTB", percOTB); MatrixTrackRule.setValue("Fbar", Fbar); MatrixTrackRule.setValue("FpOTB", FpOTB); MatrixTrackRule.setValue("mult", multEffort); matResult.addResult(step, param_pop, MatrixTrackRule); affectation = true; } } /** // * Si la condition est vrai alors cette action est executee apres le pas * de temps de la simulation. * * @param context La simulation pour lequel on utilise cette regle * @param step le pas de temps courant * @param metier le metier concerne */ @Override public void postAction(SimulationContext context, TimeStep step, Metier metier) throws Exception { // Creation de la matrice de stockage de TAC } }