Commit 70378295 authored by guillaume.garbay's avatar guillaume.garbay
Browse files

No commit message

No commit message
1 merge request!1Add Svn history
Showing with 263 additions and 88 deletions
+263 -88
......@@ -4,29 +4,40 @@
<pikelake.pikes.PikesGroup>
<weightAtAgeThreshold>5.0</weightAtAgeThreshold>
<monthOfBirth>6</monthOfBirth>
<processes>
<processesAtBegin>
<pikelake.pikes.PikesPopulateProcess>
<initialNumberOfPikes>5</initialNumberOfPikes>
</pikelake.pikes.PikesPopulateProcess>
</processesAtBegin>
<processesEachStep>
<pikelake.environment.Time>
</pikelake.environment.Time>
<!-- pikelake.Grid>
</pikelake.Grid-->
<pikelake.pikes.PikeMovement>
<distance>10</distance>
<basicMovingRate>2</basicMovingRate>
</pikelake.pikes.PikeMovement>
<pikelake.pikes.PikeGrowthProcess>
<!--pikelake.pikes.PikeGrowthProcess>
<convertionFactor>0.25</convertionFactor>
<slimRate>0.9</slimRate>
</pikelake.pikes.PikeGrowthProcess>
<pikelake.pikes.PikeHuntProcess>
< pikelake.pikes.PikeHuntProcess>
<satiety>0.5</satiety>
</pikelake.pikes.PikeHuntProcess>
</pikelake.pikes.PikeHuntProcess-->
<!-- pikelake.pikes.PikeObservationProcess/>
<pikelake.pikes.PikeMovement/-->
<fr.cemagref.simaqualife.kernel.processes.FireAquaNismsChangesToObservers />
</processesEachStep>
</processes>
......
......@@ -10,7 +10,6 @@ import java.util.StringTokenizer;
import pikelake.Cell;
import pikelake.environment.AreaMovement;
import pikelake.pikes.Pike;
import pikelake.pikes.PikesGroup;
import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D;
import fr.cemagref.simaqualife.kernel.AquaNismsGroup;
import fr.cemagref.simaqualife.kernel.util.TransientParameters.InitTransientParameters;
......@@ -29,8 +28,7 @@ public class Grid extends Grid2D<Cell, Individual> {
*/
@InitTransientParameters
public void initTransientParameters(Pilot pilot) throws FileNotFoundException {
StringTokenizer sLigne;
@SuppressWarnings("unused")
double hsiStd = 0, hsiMoy = 0;
......@@ -78,7 +76,58 @@ public class Grid extends Grid2D<Cell, Individual> {
}
scanner.close();
}
/* public void doProcess (Pilot pilot) throws FileNotFoundException {
StringTokenizer sLigne;
@SuppressWarnings("unused")
double hsiStd = 0, hsiMoy = 0;
int idCell = 0, yPike = 0, xPike = 0;
// Initialisation grille vide
grid = new Cell[gridWidth * gridHeight];
// Initialisation de toute la grille avec hsi = -1
for (int cptCell = 0; cptCell < (gridWidth * gridHeight - 1); cptCell++) {
grid[cptCell] = new Cell(cptCell, -1);
}
// Lecture fichier contenant les HSI de toutes les mailles
String filePath = "data/input/HSI/hsi_BROETE507.txt";
Scanner scanner = new Scanner(new File(filePath));
// Initialisation de chaque cellule contenant HSI
// On boucle sur chaque ligne detecte
String line = scanner.nextLine();
while (scanner.hasNextLine()) {
line = scanner.nextLine();
// Decoupage ligne : id, hsiStd, hsiMoy
sLigne = new StringTokenizer (line);
if (sLigne.hasMoreTokens())
idCell = Integer.parseInt(sLigne.nextToken())-1;
if (sLigne.hasMoreTokens())
hsiStd = Double.parseDouble(sLigne.nextToken());
if (sLigne.hasMoreTokens())
hsiMoy = Double.parseDouble(sLigne.nextToken());
// Conversion idCell en coordonnees (x, y)
// (x, y) avec les id de cellules de 0 n-1
yPike = (int) Math.floor(idCell / gridWidth);
xPike = (int) idCell - (yPike * gridWidth);
// Inversion des coordonnees en Y (place l'origine en bas gauche)
yPike = (gridHeight-1) - yPike ;
// Conversion des coordonnees (x, y) en idCell
idCell = xPike + yPike * gridWidth;
// Initialisation du hsi de la cellule(idCell)
grid[idCell] = new Cell(idCell, hsiMoy);
}
scanner.close();
}*/
public void addAquaNism(Individual ind, AquaNismsGroup<?, ?> group) {
super.addAquaNism(ind, group);
ind.getPosition().addPike((Pike) ind);
......@@ -102,19 +151,22 @@ public class Grid extends Grid2D<Cell, Individual> {
* sortie : neighbours : liste des cellules (id) accessibles
*
*/
public List<Cell> getNeighbours(Cell position, int distance) {
public List<Cell> getNeighbours(Cell position) {
List<Cell> neighbours = new ArrayList<Cell>();
List<String> listeCoord = null;
int xPike = 0, yPike = 0;
// Calcul des coordonnees (x, y) a partir de l'Id de la maille
yPike = (position.getIndex() / gridWidth);
xPike = (position.getIndex() - (yPike * gridWidth));
AreaMovement aa = new AreaMovement("ETE","ETE");
listeCoord = aa.calculationArea(aa.getDistMax());
// Calcul de la liste des mailles pour une distance donnee
AreaMovement aa = new AreaMovement("ETE","AUBE");
listeCoord = aa.getArea();
// Calcul des mailles comprises dans le lac
for (String liste : listeCoord) {
String[] coord = liste.split(" ");
......
......@@ -7,11 +7,9 @@ import java.util.List;
import java.util.Scanner;
import java.util.StringTokenizer;
import fr.cemagref.simaqualife.extensions.spatial2D.Grid2D.NeighborsType;
public class AreaMovement {
List<String> area = new ArrayList<String>();
static List<String> area = new ArrayList<String>();
String saison = null, phaseJour = null;
int distMin = 0, distMoy = 0, distMax = 0, std = 0;
StringTokenizer sLigne;
......@@ -59,27 +57,41 @@ public class AreaMovement {
public List<String> calculationArea (int distance) {
int xi = 0, yi = 0;
// Conversion distance en nombre de cellule
int distCell = (int) Math.round(distance/10.);
System.out.println(distCell);
// Calcul des coordonnees (x,y) des cellules pour une distance donnee
for (xi = -distCell; xi <= distCell; xi++) {
yi = (int) Math.round(Math.sqrt(distCell*distCell - xi*xi));
for (int j = -yi; j <= yi; j++) {
area.add(xi + " " + j);
//System.out.println(xi + " " + j);
}
}
return area;
}
public int getDistMin () {
return distMin;
}
public int getDistMoy () {
return distMoy;
}
public int getDistMax () {
return distMax;
}
public int getDistStd () {
return std;
}
public String getSaison () {
return saison;
}
public String getPhaseJour () {
return phaseJour;
}
public List<String> getArea () {
return area;
}
......
......@@ -8,6 +8,7 @@ import fr.cemagref.ohoui.annotations.Description;
import fr.cemagref.ohoui.filters.NoTransientField;
import fr.cemagref.ohoui.swing.OhOUI;
import fr.cemagref.ohoui.swing.OhOUIDialog;
import fr.cemagref.simaqualife.kernel.util.TransientParameters;
import fr.cemagref.simaqualife.pilot.Pilot;
import java.awt.Color;
......@@ -71,6 +72,7 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C
private transient double shapeOriginalWidth, shapeOriginalHeight;
private transient double shapeAspectRatio;
@SuppressWarnings("unused")
private transient double rescaleFactorWithOriginal;
public Movement2DWithinShapeObserver(int margin) {
......@@ -99,8 +101,8 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C
return display;
}
public void init() {
@TransientParameters.InitTransientParameters
public void init(Pilot pilot) {
display = new DisplayComponent();
display.setVisible(false);
......@@ -131,7 +133,7 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C
e.printStackTrace();
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
//this.generalPath = new GeneralPath(((AsShapeConvertible)Pilot.getAquaticWorld().getEnvironment()).getShape());
//this.generalPath = new GeneralPath((Shape) ((AsShapeConvertible) pilot.getAquaticWorld().getEnvironment()).getShape());
// original dimension storage
......@@ -279,7 +281,8 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C
}
}
oneShot = true;
}
......@@ -306,4 +309,12 @@ public class Movement2DWithinShapeObserver extends ObserverListener implements C
}
}
@Override
public void init() {
// TODO Auto-generated method stub
}
}
package pikelake.environment;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import uk.me.jstott.coordconv.LatitudeLongitude;
import uk.me.jstott.sun.Sun;
import uk.me.jstott.util.JulianDateConverter;
public class NychtemeralTime {
protected final static NychtemeralTime simulationTimeInstance = new NychtemeralTime();
// TODO le faire remonter dans estuaire ??
private LatitudeLongitude LAT_LONG_ROYAN = new LatitudeLongitude(LatitudeLongitude.NORTH,45,38,0,LatitudeLongitude.WEST,1,3,0);
private TimeZone GMT = TimeZone.getTimeZone("Europe/London");
private Calendar startSimulationTime = new GregorianCalendar(1998,1,22,0,0,0);
public static NychtemeralTime getInstance(){
return simulationTimeInstance;
}
public boolean isNight(int currentTime){
Calendar date = startSimulationTime;
date.add(Calendar.SECOND,currentTime);
double currentSecondInTheDay = (date.get(Calendar.HOUR)*60 + date.get(Calendar.MINUTE))*60 + date.get(Calendar.SECOND);
double julianDay= JulianDateConverter.dateToJulian(date);
uk.me.jstott.sun.Time morningTwilightTime= Sun.morningAstronomicalTwilightTime(julianDay, LAT_LONG_ROYAN,
GMT,false);
uk.me.jstott.sun.Time eveningTwilightTime= Sun.eveningAstronomicalTwilightTime(julianDay, LAT_LONG_ROYAN,
GMT,false);
double morningTwilightSecondInTheDay = (morningTwilightTime.getHours()*60 + morningTwilightTime.getMinutes())*60 + morningTwilightTime.getSeconds();
double eveningTwilightSecondInTheDay = (eveningTwilightTime.getHours()*60 + eveningTwilightTime.getMinutes())*60 + eveningTwilightTime.getSeconds();
return ((currentSecondInTheDay<morningTwilightSecondInTheDay) & (currentSecondInTheDay > eveningTwilightSecondInTheDay));
}
}
package pikelake.environment;
public class Time {
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.TimeZone;
import pikelake.pikes.Pike;
import pikelake.pikes.PikesGroup;
import uk.me.jstott.coordconv.LatitudeLongitude;
import uk.me.jstott.sun.Sun;
import uk.me.jstott.util.JulianDateConverter;
import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
import fr.cemagref.simaqualife.pilot.Pilot;
public class Time extends AquaNismsGroupProcess<Pike,PikesGroup> {
// Donnees definissant la zone d'etude (lac des Bariousses)
private TimeZone GMT = TimeZone.getTimeZone("Europe/Paris");
private LatitudeLongitude LAT_LONG_ROYAN = new LatitudeLongitude(LatitudeLongitude.NORTH,45,33,55,LatitudeLongitude.WEST,1,49,16);
// Date de debut de la simulation
private Calendar startSimulationTime = new GregorianCalendar(2012,1,1,0,0,0);
public static long yearOfBegin = 2012 ;
protected final static Time simulationTimeInstance = new Time();
public static enum PhaseJour {AUBE, JOUR, CREP, NUIT};
public static enum Season {PRINTEMPS, ETE, AUTOMNE, HIVER};
public static enum Mois {JANVIER, FEVRIER, MARS, AVRIL, MAI, JUIN, JUILLET, AOUT, SEPTEMBRE, OCTOBRE, NOVEMBRE, DECRMBRE};
public static int mois = 0, jour = 0, saison = 0, annee = 0, phaseJour = 0, heure = 0;
@Override
public void doProcess (PikesGroup group) { /////// heure,jour,mois,saison, annee
Calendar date = startSimulationTime;
long nbrIter = group.getPilot().getCurrentTime();
heure = (int) nbrIter % 24;
////////////////// Calcul de la phase de la journee
//System.out.println(isNight((int) nbrIter));
jour = (int) Math.ceil(nbrIter / 24.);
while (jour>365) {
yearOfBegin = yearOfBegin + 1;
jour = jour - 365;
}
if (jour <= 31) mois = 0; // Janv
else if (jour <= 59) mois = 1; // Fev
else if (jour <= 90) mois = 2; // Mars
else if (jour <= 120) mois = 3; // Avril
else if (jour <= 151) mois = 4; // Mai
else if (jour <= 181) mois = 5; // Juin
else if (jour <= 212) mois = 6; // Juillet
else if (jour <= 243) mois = 7; // Aout
else if (jour <= 273) mois = 8; // Sept
else if (jour <= 304) mois = 9; // Oct
else if (jour <= 334) mois = 10; // Nov
else if (jour <= 365) mois = 11; // Dec
else mois = 0;
switch (mois) {
case 2 :
case 3 :
case 4 : saison = 0;
break;
case 5 :
case 6 :
case 7 : saison = 1;
break;
case 8 :
case 9 :
case 10: saison = 2;
break;
case 11:
case 0 :
case 1 :
default: saison = 3;
break;
}
System.out.println(yearOfBegin + " " + Season.values()[saison] + " " + Mois.values()[mois] + " " + jour + " " + heure);
}
public static Mois getMois () {
return Mois.values()[mois];
}
public static Season getSeason(){
return Season.values()[saison];
}
public static long getYear(){
return yearOfBegin;
}
public static long getNbYearFromBegin(long time){
return (long) Math.floor(time / Season.values().length);
}
public static double getSeasonDuration(){
return 1./ Season.values().length;
}
public static Time getInstance(){
return simulationTimeInstance;
}
public boolean isNight(int currentTime){
Calendar date = startSimulationTime;
date.add(Calendar.SECOND,currentTime);
double currentSecondInTheDay = (date.get(Calendar.HOUR)*60 + date.get(Calendar.MINUTE))*60 + date.get(Calendar.SECOND);
double julianDay= JulianDateConverter.dateToJulian(date);
uk.me.jstott.sun.Time morningTwilightTime= Sun.morningAstronomicalTwilightTime(julianDay, LAT_LONG_ROYAN, GMT,false);
uk.me.jstott.sun.Time eveningTwilightTime= Sun.eveningAstronomicalTwilightTime(julianDay, LAT_LONG_ROYAN, GMT,false);
double morningTwilightSecondInTheDay = (morningTwilightTime.getHours()*60 + morningTwilightTime.getMinutes())*60 + morningTwilightTime.getSeconds();
double eveningTwilightSecondInTheDay = (eveningTwilightTime.getHours()*60 + eveningTwilightTime.getMinutes())*60 + eveningTwilightTime.getSeconds();
return ((currentSecondInTheDay<morningTwilightSecondInTheDay) & (currentSecondInTheDay > eveningTwilightSecondInTheDay));
}
}
package pikelake.environment;
public class temp2 {
}
......@@ -14,6 +14,8 @@ public class PikeGrowthProcess extends AquaNismsGroupProcess<Pike,PikesGroup> {
*/
@Override
public void doProcess(PikesGroup group) {
System.out.println("PikeGrowthProcess");
for (Pike pike : group.getAquaNismsList()){
pike.incAge();
//System.out.print(" "+ (double) pike.getAge()/12. +"y "+pike.getWeight()+ " " );
......
......@@ -5,6 +5,8 @@ import java.util.Comparator;
//import java.util.List;
//import pikelake.Cell;
import umontreal.iro.lecuyer.probdist.UniformDist;
import umontreal.iro.lecuyer.randvar.UniformGen;
......@@ -24,14 +26,17 @@ LoopAquaNismsGroupProcess<Pike, AquaNismsGroup<Pike, ?>> {
* <code>satiety</code> ratio of the pike weigth which stops eating
* preys
*/
@SuppressWarnings("unused")
private double satiety = 0.10;
@SuppressWarnings("unused")
transient private UniformGen uniformGen;
@Override
protected void doProcess(Pike pike,
AquaNismsGroup<Pike, ?> group) {
protected void doProcess(Pike pike, AquaNismsGroup<Pike, ?> group) {
System.out.println("PikeHuntProcess");
// Cell pikeCell = pike.getPosition();
/* if (pikeCell.getPreys().size() > 0) {
//System.out.print(" " + pikeCell.getPreys().size() +" preys available in cell ");
......
......@@ -9,6 +9,8 @@ import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
public class PikeMortalityProcess extends AquaNismsGroupProcess<Pike, PikesGroup>{
public void doProcess(PikesGroup group) {
System.out.println("PikeMortalityProcess");
List<Pike> deadPike = new ArrayList<Pike>();
for (Pike pike: group.getAquaNismsList()){
double ratio = (12. * pike.getWeight() / (double) (pike.getAge()+12));
......
......@@ -7,14 +7,15 @@ import java.util.ArrayList;
import java.util.List;
import pikelake.Cell;
import pikelake.environment.Time;
import umontreal.iro.lecuyer.probdist.UniformDist;
import umontreal.iro.lecuyer.randvar.UniformGen;
import fr.cemagref.simaqualife.pilot.Pilot;
public class PikeMovement extends LoopAquaNismsGroupProcess<Pike, PikesGroup> {
@SuppressWarnings("unused")
private double basicMovingRate;
private int distance;
transient private UniformGen uniformGen;
public PikeMovement(Pilot pilot) {
......@@ -28,23 +29,19 @@ public class PikeMovement extends LoopAquaNismsGroupProcess<Pike, PikesGroup> {
@Override
protected void doProcess(Pike pike, PikesGroup group) {
//System.out.println("Init dplacement");
double cellSuitability = pike.getSuitabilityForPike(pike.getPosition());
final List<Cell> surrounding = group.getEnvironment().getNeighbours(pike.getPosition(), distance);
//System.out.println(cellSuitability);
final List<Cell> surrounding = group.getEnvironment().getNeighbours(pike.getPosition());
// the first possiblity is the cell where the prey is
List<Cell> possibilities = new ArrayList<Cell>();
possibilities.add(pike.getPosition());
// identify the destination possibilities in the neighbouring
// with the highest suitability
for (Cell cell : surrounding) {
double currentCellSuitability = pike.getSuitabilityForPike(cell);
//System.out.println(currentCellSuitability);
......
......@@ -5,6 +5,8 @@ import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
public class PikeObservationProcess extends AquaNismsGroupProcess<Pike,PikesGroup> {
public void doProcess(PikesGroup pikesGroup) {
System.out.println("PikeObservationProcess");
pikesGroup.calculatePikesBiomass();
pikesGroup.calculatePikesNumber();
......
......@@ -7,6 +7,8 @@ public class PikePlopProcess extends AquaNismsGroupProcess<Pike,PikesGroup> {
private int temporisation = 3000; // in ms
public void doProcess(PikesGroup object) {
System.out.println("PikePlopProcess");
try {
Thread.sleep(temporisation);
} catch (InterruptedException e) {
......
......@@ -5,7 +5,6 @@ import java.util.List;
import umontreal.iro.lecuyer.probdist.PoissonDist;
import umontreal.iro.lecuyer.randvar.PoissonGen;
import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
import fr.cemagref.simaqualife.pilot.Pilot;
......@@ -33,6 +32,8 @@ public class PikeReproductionProcess extends AquaNismsGroupProcess<Pike,PikesGro
}
public void doProcess(PikesGroup group) {
System.out.println("PikeReproductionProcess");
int offspring;
if (1+ ((group.getPilot().getCurrentTime()-1) % 12) == group.getMonthOfBirth()){
List<Pike> offsprings = new ArrayList<Pike>();
......
package pikelake.pikes;
import pikelake.Cell;
import pikelake.environment.AreaMovement;
import umontreal.iro.lecuyer.probdist.UniformDist;
import umontreal.iro.lecuyer.randvar.UniformGen;
import fr.cemagref.simaqualife.kernel.processes.AquaNismsGroupProcess;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment