diff --git a/data/input/fishTryRealBV_CC.xml b/data/input/fishTryRealBV_CC.xml
index c5fcdbb2371c615ee7d4b7b6bc655ac1b5333a47..6236237886728ab546c03a51417852ddee2d881b 100644
--- a/data/input/fishTryRealBV_CC.xml
+++ b/data/input/fishTryRealBV_CC.xml
@@ -10,7 +10,7 @@
 		<linfVonBert>60.0</linfVonBert>
 		<dMaxDisp>300.0</dMaxDisp>
 		<lFirstMaturity>40.0</lFirstMaturity>
-		<fishNutrient>
+		<nutrientRoutine>
 			<nutrientsOfInterest>
 				<string>N</string>
 				<string>P</string>
@@ -218,7 +218,7 @@
 					<double>0.02803</double>
 				</entry>
 			</compoJuvenile>
-		</fishNutrient>
+		</nutrientRoutine>
 
 		<fileNameInputForInitialObservation>data/input/reality/Obs1900.csv</fileNameInputForInitialObservation>
 		<centileForRange>0.95</centileForRange>
diff --git a/src/main/java/species/DiadromousFishGroup.java b/src/main/java/species/DiadromousFishGroup.java
index 0b5eaf4fabdb2e12ab1dc5ffc44dcfc175bb8c52..67d2454f4b121b10f28ba7867b4a79d72e9e141a 100644
--- a/src/main/java/species/DiadromousFishGroup.java
+++ b/src/main/java/species/DiadromousFishGroup.java
@@ -62,7 +62,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
 	 * Routine to compute nutrient fluxes operated by a single individual (TODO by a single super individual). 
 	 * 
 	 */
-	private  FishNutrient fishNutrient; 
+	private  NutrientRoutine nutrientRoutine; 
 	
 	public String fileNameInputForInitialObservation = "data/input/reality/Obs1900.csv";
 
@@ -265,7 +265,7 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
 
 	
 		
-		diadromousFishGroup.fishNutrient = new FishNutrient(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, 
+		diadromousFishGroup.nutrientRoutine = new NutrientRoutine(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, 
 				aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes,
 				aJuvenileFeatures, aCompoJuveniles);
 		
@@ -507,9 +507,9 @@ public class DiadromousFishGroup extends AquaNismsGroup< DiadromousFish, BasinNe
 		return lFirstMaturity;
 	}
 
-	public  FishNutrient getFishNutrient() {
+	public  NutrientRoutine getNutrientRoutine() {
 		
-		return fishNutrient; 
+		return nutrientRoutine; 
 	}
 	
 	public void setlFirstMaturity(double lFirstMaturity) {
diff --git a/src/main/java/species/MigrateToSea.java b/src/main/java/species/MigrateToSea.java
index cdbc3bcca715332fea076d6fb8e16df803d42399..206043342e5bf624554daa588f8c98e9f6c507ae 100644
--- a/src/main/java/species/MigrateToSea.java
+++ b/src/main/java/species/MigrateToSea.java
@@ -44,7 +44,7 @@ public class MigrateToSea extends AquaNismsGroupProcess<DiadromousFish, Diadromo
 				List<DiadromousFish> fishes = basin.getFishs(group);
 				
 				// ON ré-initialise notre map pour chauqe bassin 
-				for (String nutrient : group.getFishNutrient().getNutrientsOfInterest()) {
+				for (String nutrient : group.getNutrientRoutine().getNutrientsOfInterest()) {
 					totalOutputFluxes.put(nutrient, 0.); 
 				}
 				totalOutputFluxes.put("biomass", 0.); //création de la biomasse 
@@ -54,10 +54,10 @@ public class MigrateToSea extends AquaNismsGroupProcess<DiadromousFish, Diadromo
 						destination = group.getEnvironment().getAssociatedSeaBasin(fish.getPosition());
 						fishesToMove.add(new Duo<DiadromousFish, Basin>(fish, destination)); //Mentionne la sortie d'un poisson de la boucle 
 					
-						double biomass = group.getFishNutrient().getWeight(fish) * fish.getAmount(); 
+						double biomass = group.getNutrientRoutine().getWeight(fish) * fish.getAmount(); 
 						
 						if (fish.getStage()==Stage.IMMATURE) {
-							Map <String, Double> aFluxExportedByJuveniles= group.getFishNutrient().computeNutrientsExportForJuveniles(fish); 
+							Map <String, Double> aFluxExportedByJuveniles= group.getNutrientRoutine().computeNutrientsExportForJuveniles(fish); 
 							for (String nutrient: aFluxExportedByJuveniles.keySet()) {
 								totalOutputFluxes.put(nutrient,totalOutputFluxes.get(nutrient) + aFluxExportedByJuveniles.get(nutrient) * fish.getAmount()); 	
 							}
diff --git a/src/main/java/species/FishNutrient.java b/src/main/java/species/NutrientRoutine.java
similarity index 96%
rename from src/main/java/species/FishNutrient.java
rename to src/main/java/species/NutrientRoutine.java
index e39d6d0ced09f7bac010bb8ad063c25a33111346..f3f26a36fe1717fc09b5dda2c33dc8b0863ac308 100644
--- a/src/main/java/species/FishNutrient.java
+++ b/src/main/java/species/NutrientRoutine.java
@@ -1,533 +1,533 @@
-/**
- * 
- * @author Camille Poulet, Patrick Lambert
- * @copyright Copyright (c) 2019, Irstea
- *
- * 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 3 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 <http://www.gnu.org/licenses/>.
-
- */
-package species;
-
-import environment.SeaBasin;
-import fr.cemagref.simaqualife.pilot.Pilot;
-import species.DiadromousFish.Gender;
-import species.DiadromousFish.Stage;
-import java.util.ArrayList;
-import java.util.Hashtable;
-import java.util.Map;
-
-import com.thoughtworks.xstream.XStream;
-import com.thoughtworks.xstream.io.xml.DomDriver;
-
-
-/**
- * @author camille.poulet
- *
- */
-public class FishNutrient {
-
-
-	private static enum SpawningPosition  {PRE,POST}; // on créer un static pour réserver une même classe mémoire pour toutes les instances 
-
-	//private static enum Gender {UNDIFFERENCIED, FEMALE, MALE}; 
-
-	private ArrayList<String> nutrientsOfInterest;
-
-	private double residenceTime;
-
-	private Map<String, Double> excretionRate; 
-
-	/**
-	 * Main feature for weight (g) computation before spawning i.e. gametes expelling according to gender, for a given length (cm) 
-	 * //Voir pour un retour à la ligne lors du commentaire 
-	 * key gender
-	 * value
-	 * 		key feature
-	 * 		value value
-	 */
-	private Map <DiadromousFish.Gender,Map<String, Double>> fishFeaturesPreSpawning;
-
-	private Map <DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning;
-
-	private Map<String, Double> juvenileFeatures;
-
-
-	/**
-	 *  Weight  of gametes spawned for both males and females 
-	 * key gender
-	 * value g
-	 * usually computed as the difference between unspawned gonad (inbound) and spawned gonad (outbound; "spent gonad") 
-	 */
-	//private Map <DiadromousFish.Gender, Double> spawnedGametesWeight; 
-
-
-	/**
-	 * chemical composition of carcass before gametes expelling (before spawning) i.e. soma + gonads + gametes
-	 * <key> gender
-	 * <value> 
-	 * 		<key> chemical element
-	 * 		<value> value ratio element / (total wet weight) g/g
-	 */
-	private Map<DiadromousFish.Gender,Map<String,Double>> compoCarcassPreSpawning;
-
-	//package permettant la création d'une table de hachage ie fonctionnant en clé -valeur. Clé unique, mais valeur peut être associée à plusieurs clés; 
-	//La class d'objet Map a pour point faible la taille des données à stocker. Plus on a de valeur dans la table, plus c'est lourd et lent! Donc, trouver un compromis entre temps de calcul et espace.
-	//N'accepte pas la valeur nulle et thread safe i.e. utilisable simultanément par plusieurs éléments du programme. 
-
-	/**
-	 * chemical composition of carcass after spawning i.e. soma + spent gonad (without gametes)
-	 * <value> 
-	 * 		<key> chemical element
-	 * 		<value> value
-	 */
-	private Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning;
-
-	/**
-	 * chemical composition of gametes estimated from the MIGADO dataset (BDalosesBruch)
-	 * <key> gender
-	 * <value> 
-	 * 		<key> chemical element
-	 * 		<value> value
-	 */
-	private Map<DiadromousFish.Gender, Map<String,Double>> compoGametes;
-
-	// For juveniles - Based on Taverny (1991)
-
-	/**
-	 * chemical composition of juveniles
-	 * 		<key> chemical element
-	 * 		<value> value
-	 */
-
-	private Map<String,Double> compoJuvenile;
-
-
-
-	/**
-	 * Constructor based on the 5 Map of fish composition 
-	 * @param fishFeaturesPreSpawning
-	 * @param compoCarcassPreSpawning
-	 * @param compoCarcassPostSpawning
-	 * @param compoGametes
-	 * @param compoJuvenile
-	 */
-	public FishNutrient(ArrayList<String> nutrientsOfInterest, 
-
-			double residenceTime,
-			Map <String, Double> excretionRate,
-			Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPreSpawning,
-			Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning,
-			Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPreSpawning,
-			Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning, 
-			Map<DiadromousFish.Gender, Map<String, Double>> compoGametes,
-			Map<String, Double> juvenileFeatures,
-			Map<String, Double> compoJuvenile)
-	{
-		super();
-		this.nutrientsOfInterest = nutrientsOfInterest;
-		this.excretionRate = excretionRate; 
-		this.residenceTime = residenceTime; 
-		this.fishFeaturesPreSpawning = fishFeaturesPreSpawning;
-		this.fishFeaturesPostSpawning = fishFeaturesPostSpawning;
-		this.compoCarcassPreSpawning = compoCarcassPreSpawning;
-		this.compoCarcassPostSpawning = compoCarcassPostSpawning;
-		this.compoGametes = compoGametes;
-		this.juvenileFeatures = juvenileFeatures;
-		this.compoJuvenile = compoJuvenile; 
-
-	}
-
-	/**
-	 * compute the nutrient fluxes for a single fish (in the super individual)
-	 *  that dies before spawning  
-	 * @param fish
-	 */
-	public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) { 
-
-		Map<String,Double> nutrientsInput = new Hashtable<String, Double>(); // On créer ici une Map, classe mère des hashtable (Homme = classe mere ie Map//Jules = hashtable)
-		for (String nutrient : nutrientsOfInterest) {
-
-			if (fish.getStage()== Stage.MATURE) {
-				double totalWeightPre = this.getWeight(fish,SpawningPosition.PRE);
-				double carcass = totalWeightPre 
-						* compoCarcassPreSpawning.get(fish.getGender()).get(nutrient);
-				double excretion = totalWeightPre 
-						* residenceTime 
-						* excretionRate.get(nutrient) ; 
-				double nutrientImport = carcass + excretion;
-
-				nutrientsInput.put(nutrient, nutrientImport); 
-			}
-			else { 
-				nutrientsInput.put(nutrient, 0.);
-			}
-		}
-
-		//TODO Multiply by fish amount 
-		return nutrientsInput;
-	}
-
-	public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish) { 
-
-		return computeNutrientsInputForDeathBeforeSpawning(fish,this.nutrientsOfInterest); 
-	}
-
-	/**
-	 * compute the nutrient fluxes for a single fish (in the super individual)
-	 * that dies after spawning (gametes expelling)
-	 * @param fish
-	 * @return nutrientsInput
-	 */
-	public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
-
-		Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
-		for (String nutrient : nutrientsOfInterest) {
-
-			if (fish.getStage()== Stage.MATURE) {
-
-				double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
-				double carcass = totalWeightPost 
-						* compoCarcassPostSpawning.get(fish.getGender()).get(nutrient); 
-				//double gametes = (totalWeightPre - totalWeightPost) FAUX car perte de poids somatique due a la reproduction  
-				double gametes = this.getGonadWeight(fish, SpawningPosition.PRE) - this.getGonadWeight(fish, SpawningPosition.POST)
-						*compoGametes.get(fish.getGender()).get(nutrient); 
-				double excretion = totalWeightPost
-						* residenceTime 
-						* excretionRate.get(nutrient);
-				double nutrientImport = carcass + gametes + excretion;
-
-				nutrientsInput.put(nutrient,nutrientImport);
-			}
-			else {
-				nutrientsInput.put(nutrient,0.);
-			}	
-		}
-		return nutrientsInput; 
-	}
-
-	public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish){
-
-		return computeNutrientsInputForDeathAfterSpawning(fish, this.nutrientsOfInterest); 
-	}
-	/**
-	 * compute the nutrient fluxes for a single fish (in the super individual)
-	 * that survives after spawning 
-	 * Map: model output = element of interest ie string + double ie the quantification of this fluxes. 
-	 * @return nutrientsInput
-	 */
-	public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
-
-		Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
-		for (String nutrient: nutrientsOfInterest) {
-			if (fish.getStage()==Stage.MATURE) {
-
-				//TODO Fix with new data 
-				double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
-				//Gamete compositions depends on sex. 
-
-				double gametes = this.getGonadWeight(fish, SpawningPosition.PRE) - this.getGonadWeight(fish, SpawningPosition.POST)
-						* compoGametes.get(fish.getGender()).get(nutrient);
-				double excretion = totalWeightPost 
-						* residenceTime 
-						* excretionRate.get(nutrient);
-				double nutrientImport = gametes + excretion;
-
-				nutrientsInput.put(nutrient, nutrientImport); 	
-			}
-			else {
-				nutrientsInput.put(nutrient,0.);
-			}
-		}
-		return nutrientsInput;
-	}	
-
-	public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish) {
-
-		return computeNutrientsInputForSurvivalAfterSpawning(fish, this.nutrientsOfInterest);
-	}
-
-
-	public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish, ArrayList<String>nutrientsOfInterest) {
-		Map<String,Double> nutrientsExport = new Hashtable<String,Double>();
-		for(String nutrient: nutrientsOfInterest) {
-			if(juvenileFish.getStage()==Stage.IMMATURE) {
-
-				double JuvenileMass = this.getWeight(juvenileFish);
-				nutrientsExport.put(nutrient, JuvenileMass * compoJuvenile.get(nutrient));
-			}
-		}
-
-		return nutrientsExport;
-	}
-
-	public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish){
-		return computeNutrientsExportForJuveniles(juvenileFish, this.nutrientsOfInterest);
-
-	}
-
-	/**
-	 * Compute the weight for a fish with length (cm) 
-	 * @param fish
-	 * @return weight (g)
-	 */
-	public double getWeight (DiadromousFish fish, SpawningPosition spawningPosition) {
-
-		double weight = 0.; 
-			if (fish.getStage()==Stage.IMMATURE) 
-			weight = juvenileFeatures.get("aLW") * Math.pow(fish.getLength(),juvenileFeatures.get("bLW"));
-		else  //Stage.MATURE
-			if (spawningPosition == SpawningPosition.PRE)
-				weight = fishFeaturesPreSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPreSpawning.get(fish.getGender()).get("bLW") ); 
-			else 
-				weight = fishFeaturesPostSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPostSpawning.get(fish.getGender()).get("bLW"));
-
-		return weight;
-	}
-
-
-	/**
-	 * Compute the weight for a fish with length (cm) 
-	 * @param fish
-	 * @return weight (g)
-	 */
-	public double getWeight (DiadromousFish fish) {
-
-		return getWeight (fish, SpawningPosition.PRE);
-	}
-
-	public double getGonadWeight (DiadromousFish fish, SpawningPosition spawningPosition) {
-
-		double gonadWeight = 0.; 
-			if (fish.getStage()==Stage.MATURE);
-				if (spawningPosition == SpawningPosition.PRE)
-			gonadWeight = Math.exp(fishFeaturesPreSpawning.get(fish.getGender()).get("aLW_Gonad")
-					+ fishFeaturesPreSpawning.get(fish.getGender()).get("bLW_Gonad") * Math.log(fish.getLength())); 
-		else 
-			gonadWeight = Math.exp(fishFeaturesPostSpawning.get(fish.getGender()).get("aLW_Gonad")
-					+ fishFeaturesPostSpawning.get(fish.getGender()).get("bLW_Gonad") * Math.log(fish.getLength())); 
-
-		return gonadWeight;
-	}
-
-
-	/**
-	 * Compute the gonad weight for a fish with length (cm) to compute the gamete emission (g). 
-	 * @param fish
-	 * @return weight (g)
-	 */
-	public double getGonadWeight (DiadromousFish fish) {
-
-		return getGonadWeight (fish, SpawningPosition.PRE);
-	}	
-
-
-
-
-	public ArrayList<String> getNutrientsOfInterest() {
-		return nutrientsOfInterest;
-	}
-
-	/**
-	 * @param args
-	 */
-	/**
-	 * @param args
-	 */
-	/**
-	 * @param args
-	 */
-	public static void main(String[] args)	{
-
-
-		double aResidenceTime =30; 
-
-		System.out.println("aResidenceTime: " + aResidenceTime); //
-
-
-		Map <String, Double> anExcretionRate = new Hashtable <String, Double>(); 
-		anExcretionRate.put("N", 24.71E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour : convertit en g
-		anExcretionRate.put("P", 2.17E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour: convertit en g
-
-		System.out.println("anExcretionRate: " + anExcretionRate.toString()); //
-
-		/*
-		 * A feature pre spawning 
-		 */
-		Map<Gender, Map<String, Double>> aFeaturePreSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
-
-		/*
-		 * For females
-		 */
-		Map<String,Double> aFeature = new Hashtable<String,Double>();
-
-		aFeature.put("aLW", Math.exp(-4.9078)); //weight size relationship computed from BDalosesBruch 
-		aFeature.put("bLW", 3.147);
-		aFeature.put("aLW_Gonad", -5.2425); // issu de la relation taille - poids des gonades Bruch
-		aFeature.put("bLW_Gonad", 2.6729); // issu de la relation taille - poids des gonades Bruch
-		//aFeature.put("bLW",3.3429);// parametre "b" de la relation taille/poids - Coefficient d'allometrie
-		//aFeature.put("aLW",1.2102E-6 * Math.pow(10., aFeature.get("bLW"))); // parametre "a" de la relation taille/poids en kg/cm- Traduit la condition
-		//aFeature.put("GSI",0.15); 
-		aFeaturePreSpawning.put(Gender.FEMALE, aFeature);
-
-		/*
-		 * For males 
-		 */
-		aFeature = new Hashtable<String,Double>();
-		aFeature.put("aLW", Math.exp(-1.304)); 
-		aFeature.put("bLW", 2.1774);
-		aFeature.put("aLW_Gonad", -8.8744); 
-		aFeature.put("bLW_Gonad", 3.3838); 
-		//aFeature.put("aLW",2.4386E-6 * Math.pow(10, aFeature.get("bLW"))); // Conversion des g/mm en g.cm (from Taverny, 1991) 
-		//aFeature.put("GSI",.08);
-		aFeaturePreSpawning.put(Gender.MALE,aFeature);
-
-		System.out.println("aFeaturePreSpawning: " + aFeaturePreSpawning.toString()); //
-
-		/*
-		 * a Feature post Spawning 
-		 */
-		Map<Gender, Map<String, Double>> aFeaturePostSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
-
-		/*
-		 * For females 
-		 */
-		aFeature = new Hashtable<String,Double>();
-		aFeature.put("aLW", Math.exp(-4.3276)); //weight size relationship computed from BDalosesBruch 
-		aFeature.put("bLW", 2.9418);
-		aFeature.put("aLW_Gonad", -6.6234); // issu de la relation taille - poids des gonades Bruch
-		aFeature.put("bLW_Gonad", 2.8545); // issu de la relation taille - poids des gonades Bruch
-		//aFeature.put("GSI",0.10); //From BDalosesBruch 
-		//aFeature.put("aLW",aFeaturePreSpawning.get(Gender.FEMALE).get("aLW")/(1+aFeature.get("GSI"))); // parametre "a" de la relation taille/poids avec Lt en cm - Traduit la condition
-		//aFeature.put("bLW",aFeaturePreSpawning.get(Gender.FEMALE).get("bLW"));// parametre "b" de la relation taille/poids - Coefficient d'allometrie
-		aFeaturePostSpawning.put(Gender.FEMALE, aFeature);
-
-		/*
-		 * For males 
-		 */
-		aFeature = new Hashtable<String,Double>();
-
-		aFeature.put("aLW", Math.exp(-4.5675));// parametre "a" de la relation taille/poids - Coefficient d'allometrie
-		aFeature.put("bLW", 2.9973); 
-		aFeature.put("aLW_Gonad", -11.285); // issu de la relation taille - poids des gonades Bruch
-		aFeature.put("bLW_Gonad", 3.8331); // issu de la relation taille - poids des gonades Bruch
-		//aFeature.put("GSI",.05); From BDalosesBruch 
-		//aFeature.put("aLW",aFeaturePreSpawning.get(Gender.MALE).get("aLW")/(1+aFeature.get("GSI")));
-		//aFeature.put("bLW",aFeaturePreSpawning.get(Gender.MALE).get("bLW"));
-		aFeaturePostSpawning.put(Gender.MALE,aFeature);
-
-		System.out.println("aFeaturePostSpawning: " + aFeaturePostSpawning.toString());
-
-		// carcass composition for fish before spawning
-		Map<Gender, Map<String, Double>> aCompoCarcassPreSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
-		Map<String,Double> aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 2.958 / 100.); //On remplit une collection avec un put. 
-		aCompo.put("P", 0.673 / 100.);
-		aCompoCarcassPreSpawning.put(Gender.FEMALE,aCompo);
-
-		aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 2.941 / 100.);
-		aCompo.put("P", 0.666 / 100.);
-		aCompoCarcassPreSpawning.put(Gender.MALE,aCompo);
-
-		System.out.println("aCompoCarcassPreSpawning: " + aCompoCarcassPreSpawning.toString()); //
-
-		// carcass composition for fish after spawning
-		Map<Gender, Map<String, Double>> aCompoCarcassPostSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
-		aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 3.216 / 100.); //On remplit une collection avec un put. 
-		aCompo.put("P", 0.997 / 100.);
-		aCompoCarcassPostSpawning.put(Gender.FEMALE,aCompo);
-
-		aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 2.790 / 100.); // From Haskel et al, 2017 
-		aCompo.put("P", 0.961 / 100.);
-		aCompoCarcassPostSpawning.put(Gender.MALE,aCompo);
-
-		System.out.println("aCompoCarcassPostSpawning: " + aCompoCarcassPostSpawning.toString()); //
-
-		// Gametes composition approximated by the difference between gonads weight before and after spawning. 
-		Map<Gender, Map<String, Double>> aCompoGametes = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
-		aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 3.242 / 100.); //On remplit une collection avec un put. From Haskel et al, 2018. 
-		aCompo.put("P", 0.320 / 100.); // Haskel = %P, N, ici ratio donc divise par 100 
-		aCompoGametes.put(Gender.FEMALE,aCompo);
-
-		aCompo = new Hashtable<String,Double>();
-		aCompo.put("N", 3.250 / 100.); // Approximée par la compo des gonades 
-		aCompo.put("P", 0.724 / 100.);
-		aCompoGametes.put(Gender.MALE,aCompo);
-
-		System.out.println("aCompoGametes:" + aCompoGametes.toString()); //
-
-		// features for juveniles 
-
-		Map<String,Double> aJuvenileFeatures = new Hashtable<String, Double>();
-		aJuvenileFeatures.put("bLW",3.0306);
-		aJuvenileFeatures.put("aLW",Math.exp(-11.942) * Math.pow(10., aJuvenileFeatures.get("bLW")));
-
-		System.out.println("aJuvenileFeatures: " + aJuvenileFeatures.toString()); 
-
-		// carcass composition for juveniles fish 
-		Map<String, Double> aCompoJuveniles = new Hashtable<String,Double>();
-		aCompoJuveniles.put("N", 2.803 / 100.); //On remplit une collection avec un put. %N in wet weight (Haskell et al, 2017) on Alosa sapidissima 
-		aCompoJuveniles.put("P", 0.887 / 100.); //%P in wet weight (from Haskell et al, 2017) on Alosa sapidissima 
-
-		System.out.println("aCompoJuveniles: " + aCompoJuveniles.toString()); 
-
-		ArrayList <String> nutrientsOfInterest= new ArrayList <String>();
-		nutrientsOfInterest.add("N");
-		nutrientsOfInterest.add("P");
-
-		System.out.println("nutrientsOfInterest: " + nutrientsOfInterest);
-
-
-		FishNutrient fn = new FishNutrient(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, 
-				aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes,
-				aJuvenileFeatures, aCompoJuveniles);
-
-		SeaBasin basin = new SeaBasin(0,"Bidon",10.,12., 14.,12.); //il faut aller dans "SeaBasin" dans "environement et regarder comment est construit le constructeur. Il lui faut ici un rang, un nom de bassin versant, et des température pour chaque saison 
-		Pilot pilot = new Pilot ();
-		DiadromousFish fishFemale = new DiadromousFish (pilot, basin, 52., 1L, Gender.FEMALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
-		fishFemale.setStage(Stage.MATURE);
-		DiadromousFish fishMale = new DiadromousFish (pilot, basin, 47., 1L, Gender.MALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
-		fishMale.setStage(Stage.MATURE);
-		DiadromousFish juvenileFish = new DiadromousFish(pilot,basin,7.0,1L,Gender.UNDIFFERENCIED);
-		juvenileFish.setStage(Stage.IMMATURE);
-
-		System.out.println(); // affiche une ligne blanche 
-		System.out.println(fishFemale.getGender() + ": " + fishFemale.getLength() + " cm " + fn.getWeight(fishFemale, SpawningPosition.PRE)+ " g " + fn.getWeight(fishFemale, SpawningPosition.POST));
-		System.out.println("\tNutrients Fluxes for death before spawning " + fn.computeNutrientsInputForDeathBeforeSpawning(fishFemale).toString());
-		System.out.println("\tNutrients Fluxes for death after spawning " + fn.computeNutrientsInputForDeathAfterSpawning(fishFemale).toString());
-		System.out.println("\tNutrients Fluxes for survival  " + fn.computeNutrientsInputForSurvivalAfterSpawning(fishFemale).toString());
-
-		System.out.println(fishMale.getGender() + ": " + fishMale.getLength() + " cm " + fn.getWeight(fishMale, SpawningPosition.PRE)+ " g " + fn.getWeight(fishMale, SpawningPosition.POST));
-		System.out.println("\tNutrients Fluxes for death before spawning " + fn.computeNutrientsInputForDeathBeforeSpawning(fishMale).toString());
-		System.out.println("\tNutrients Fluxes for death after spawning " + fn.computeNutrientsInputForDeathAfterSpawning(fishMale).toString());
-		System.out.println("\tNutrients Fluxes for survival  " + fn.computeNutrientsInputForSurvivalAfterSpawning(fishMale).toString());
-
-		System.out.println(juvenileFish.getStage() + ": " + juvenileFish.getLength() + " cm " + fn.getWeight(juvenileFish)+ " g ");
-		System.out.println("\tNutrients Fluxes for juveniles " + fn.computeNutrientsExportForJuveniles(juvenileFish).toString());
-
-
-
-
-		/* Create XML file 
-		 * 
-		 */
-		System.out.println((new	XStream(new DomDriver())).toXML(fn));
-
-	} 
-}
-
-
+/**
+ * 
+ * @author Camille Poulet, Patrick Lambert
+ * @copyright Copyright (c) 2019, Irstea
+ *
+ * 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 3 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 <http://www.gnu.org/licenses/>.
+
+ */
+package species;
+
+import environment.SeaBasin;
+import fr.cemagref.simaqualife.pilot.Pilot;
+import species.DiadromousFish.Gender;
+import species.DiadromousFish.Stage;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.Map;
+
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.DomDriver;
+
+
+/**
+ * @author camille.poulet
+ *
+ */
+public class NutrientRoutine {
+
+
+	private static enum SpawningPosition  {PRE,POST}; // on créer un static pour réserver une même classe mémoire pour toutes les instances 
+
+	//private static enum Gender {UNDIFFERENCIED, FEMALE, MALE}; 
+
+	private ArrayList<String> nutrientsOfInterest;
+
+	private double residenceTime;
+
+	private Map<String, Double> excretionRate; 
+
+	/**
+	 * Main feature for weight (g) computation before spawning i.e. gametes expelling according to gender, for a given length (cm) 
+	 * //Voir pour un retour à la ligne lors du commentaire 
+	 * key gender
+	 * value
+	 * 		key feature
+	 * 		value value
+	 */
+	private Map <DiadromousFish.Gender,Map<String, Double>> fishFeaturesPreSpawning;
+
+	private Map <DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning;
+
+	private Map<String, Double> juvenileFeatures;
+
+
+	/**
+	 *  Weight  of gametes spawned for both males and females 
+	 * key gender
+	 * value g
+	 * usually computed as the difference between unspawned gonad (inbound) and spawned gonad (outbound; "spent gonad") 
+	 */
+	//private Map <DiadromousFish.Gender, Double> spawnedGametesWeight; 
+
+
+	/**
+	 * chemical composition of carcass before gametes expelling (before spawning) i.e. soma + gonads + gametes
+	 * <key> gender
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value ratio element / (total wet weight) g/g
+	 */
+	private Map<DiadromousFish.Gender,Map<String,Double>> compoCarcassPreSpawning;
+
+	//package permettant la création d'une table de hachage ie fonctionnant en clé -valeur. Clé unique, mais valeur peut être associée à plusieurs clés; 
+	//La class d'objet Map a pour point faible la taille des données à stocker. Plus on a de valeur dans la table, plus c'est lourd et lent! Donc, trouver un compromis entre temps de calcul et espace.
+	//N'accepte pas la valeur nulle et thread safe i.e. utilisable simultanément par plusieurs éléments du programme. 
+
+	/**
+	 * chemical composition of carcass after spawning i.e. soma + spent gonad (without gametes)
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+	private Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning;
+
+	/**
+	 * chemical composition of gametes estimated from the MIGADO dataset (BDalosesBruch)
+	 * <key> gender
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+	private Map<DiadromousFish.Gender, Map<String,Double>> compoGametes;
+
+	// For juveniles - Based on Taverny (1991)
+
+	/**
+	 * chemical composition of juveniles
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+
+	private Map<String,Double> compoJuvenile;
+
+
+
+	/**
+	 * Constructor based on the 5 Map of fish composition 
+	 * @param fishFeaturesPreSpawning
+	 * @param compoCarcassPreSpawning
+	 * @param compoCarcassPostSpawning
+	 * @param compoGametes
+	 * @param compoJuvenile
+	 */
+	public NutrientRoutine(ArrayList<String> nutrientsOfInterest, 
+
+			double residenceTime,
+			Map <String, Double> excretionRate,
+			Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPreSpawning,
+			Map<DiadromousFish.Gender, Map<String, Double>> fishFeaturesPostSpawning,
+			Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPreSpawning,
+			Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning, 
+			Map<DiadromousFish.Gender, Map<String, Double>> compoGametes,
+			Map<String, Double> juvenileFeatures,
+			Map<String, Double> compoJuvenile)
+	{
+		super();
+		this.nutrientsOfInterest = nutrientsOfInterest;
+		this.excretionRate = excretionRate; 
+		this.residenceTime = residenceTime; 
+		this.fishFeaturesPreSpawning = fishFeaturesPreSpawning;
+		this.fishFeaturesPostSpawning = fishFeaturesPostSpawning;
+		this.compoCarcassPreSpawning = compoCarcassPreSpawning;
+		this.compoCarcassPostSpawning = compoCarcassPostSpawning;
+		this.compoGametes = compoGametes;
+		this.juvenileFeatures = juvenileFeatures;
+		this.compoJuvenile = compoJuvenile; 
+
+	}
+
+	/**
+	 * compute the nutrient fluxes for a single fish (in the super individual)
+	 *  that dies before spawning  
+	 * @param fish
+	 */
+	public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) { 
+
+		Map<String,Double> nutrientsInput = new Hashtable<String, Double>(); // On créer ici une Map, classe mère des hashtable (Homme = classe mere ie Map//Jules = hashtable)
+		for (String nutrient : nutrientsOfInterest) {
+
+			if (fish.getStage()== Stage.MATURE) {
+				double totalWeightPre = this.getWeight(fish,SpawningPosition.PRE);
+				double carcass = totalWeightPre 
+						* compoCarcassPreSpawning.get(fish.getGender()).get(nutrient);
+				double excretion = totalWeightPre 
+						* residenceTime 
+						* excretionRate.get(nutrient) ; 
+				double nutrientImport = carcass + excretion;
+
+				nutrientsInput.put(nutrient, nutrientImport); 
+			}
+			else { 
+				nutrientsInput.put(nutrient, 0.);
+			}
+		}
+
+		//TODO Multiply by fish amount 
+		return nutrientsInput;
+	}
+
+	public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish) { 
+
+		return computeNutrientsInputForDeathBeforeSpawning(fish,this.nutrientsOfInterest); 
+	}
+
+	/**
+	 * compute the nutrient fluxes for a single fish (in the super individual)
+	 * that dies after spawning (gametes expelling)
+	 * @param fish
+	 * @return nutrientsInput
+	 */
+	public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
+
+		Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
+		for (String nutrient : nutrientsOfInterest) {
+
+			if (fish.getStage()== Stage.MATURE) {
+
+				double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
+				double carcass = totalWeightPost 
+						* compoCarcassPostSpawning.get(fish.getGender()).get(nutrient); 
+				//double gametes = (totalWeightPre - totalWeightPost) FAUX car perte de poids somatique due a la reproduction  
+				double gametes = this.getGonadWeight(fish, SpawningPosition.PRE) - this.getGonadWeight(fish, SpawningPosition.POST)
+						*compoGametes.get(fish.getGender()).get(nutrient); 
+				double excretion = totalWeightPost
+						* residenceTime 
+						* excretionRate.get(nutrient);
+				double nutrientImport = carcass + gametes + excretion;
+
+				nutrientsInput.put(nutrient,nutrientImport);
+			}
+			else {
+				nutrientsInput.put(nutrient,0.);
+			}	
+		}
+		return nutrientsInput; 
+	}
+
+	public Map<String, Double> computeNutrientsInputForDeathAfterSpawning(DiadromousFish fish){
+
+		return computeNutrientsInputForDeathAfterSpawning(fish, this.nutrientsOfInterest); 
+	}
+	/**
+	 * compute the nutrient fluxes for a single fish (in the super individual)
+	 * that survives after spawning 
+	 * Map: model output = element of interest ie string + double ie the quantification of this fluxes. 
+	 * @return nutrientsInput
+	 */
+	public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) {
+
+		Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
+		for (String nutrient: nutrientsOfInterest) {
+			if (fish.getStage()==Stage.MATURE) {
+
+				//TODO Fix with new data 
+				double totalWeightPost = this.getWeight(fish, SpawningPosition.POST);
+				//Gamete compositions depends on sex. 
+
+				double gametes = this.getGonadWeight(fish, SpawningPosition.PRE) - this.getGonadWeight(fish, SpawningPosition.POST)
+						* compoGametes.get(fish.getGender()).get(nutrient);
+				double excretion = totalWeightPost 
+						* residenceTime 
+						* excretionRate.get(nutrient);
+				double nutrientImport = gametes + excretion;
+
+				nutrientsInput.put(nutrient, nutrientImport); 	
+			}
+			else {
+				nutrientsInput.put(nutrient,0.);
+			}
+		}
+		return nutrientsInput;
+	}	
+
+	public Map<String,Double>computeNutrientsInputForSurvivalAfterSpawning(DiadromousFish fish) {
+
+		return computeNutrientsInputForSurvivalAfterSpawning(fish, this.nutrientsOfInterest);
+	}
+
+
+	public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish, ArrayList<String>nutrientsOfInterest) {
+		Map<String,Double> nutrientsExport = new Hashtable<String,Double>();
+		for(String nutrient: nutrientsOfInterest) {
+			if(juvenileFish.getStage()==Stage.IMMATURE) {
+
+				double JuvenileMass = this.getWeight(juvenileFish);
+				nutrientsExport.put(nutrient, JuvenileMass * compoJuvenile.get(nutrient));
+			}
+		}
+
+		return nutrientsExport;
+	}
+
+	public Map<String,Double> computeNutrientsExportForJuveniles(DiadromousFish juvenileFish){
+		return computeNutrientsExportForJuveniles(juvenileFish, this.nutrientsOfInterest);
+
+	}
+
+	/**
+	 * Compute the weight for a fish with length (cm) 
+	 * @param fish
+	 * @return weight (g)
+	 */
+	public double getWeight (DiadromousFish fish, SpawningPosition spawningPosition) {
+
+		double weight = 0.; 
+			if (fish.getStage()==Stage.IMMATURE) 
+			weight = juvenileFeatures.get("aLW") * Math.pow(fish.getLength(),juvenileFeatures.get("bLW"));
+		else  //Stage.MATURE
+			if (spawningPosition == SpawningPosition.PRE)
+				weight = fishFeaturesPreSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPreSpawning.get(fish.getGender()).get("bLW") ); 
+			else 
+				weight = fishFeaturesPostSpawning.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeaturesPostSpawning.get(fish.getGender()).get("bLW"));
+
+		return weight;
+	}
+
+
+	/**
+	 * Compute the weight for a fish with length (cm) 
+	 * @param fish
+	 * @return weight (g)
+	 */
+	public double getWeight (DiadromousFish fish) {
+
+		return getWeight (fish, SpawningPosition.PRE);
+	}
+
+	public double getGonadWeight (DiadromousFish fish, SpawningPosition spawningPosition) {
+
+		double gonadWeight = 0.; 
+			if (fish.getStage()==Stage.MATURE);
+				if (spawningPosition == SpawningPosition.PRE)
+			gonadWeight = Math.exp(fishFeaturesPreSpawning.get(fish.getGender()).get("aLW_Gonad")
+					+ fishFeaturesPreSpawning.get(fish.getGender()).get("bLW_Gonad") * Math.log(fish.getLength())); 
+		else 
+			gonadWeight = Math.exp(fishFeaturesPostSpawning.get(fish.getGender()).get("aLW_Gonad")
+					+ fishFeaturesPostSpawning.get(fish.getGender()).get("bLW_Gonad") * Math.log(fish.getLength())); 
+
+		return gonadWeight;
+	}
+
+
+	/**
+	 * Compute the gonad weight for a fish with length (cm) to compute the gamete emission (g). 
+	 * @param fish
+	 * @return weight (g)
+	 */
+	public double getGonadWeight (DiadromousFish fish) {
+
+		return getGonadWeight (fish, SpawningPosition.PRE);
+	}	
+
+
+
+
+	public ArrayList<String> getNutrientsOfInterest() {
+		return nutrientsOfInterest;
+	}
+
+	/**
+	 * @param args
+	 */
+	/**
+	 * @param args
+	 */
+	/**
+	 * @param args
+	 */
+	public static void main(String[] args)	{
+
+
+		double aResidenceTime =30; 
+
+		System.out.println("aResidenceTime: " + aResidenceTime); //
+
+
+		Map <String, Double> anExcretionRate = new Hashtable <String, Double>(); 
+		anExcretionRate.put("N", 24.71E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour : convertit en g
+		anExcretionRate.put("P", 2.17E-6); //values from Barber et al, Alosa sapidissima in ug/g wet mass/hour: convertit en g
+
+		System.out.println("anExcretionRate: " + anExcretionRate.toString()); //
+
+		/*
+		 * A feature pre spawning 
+		 */
+		Map<Gender, Map<String, Double>> aFeaturePreSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
+
+		/*
+		 * For females
+		 */
+		Map<String,Double> aFeature = new Hashtable<String,Double>();
+
+		aFeature.put("aLW", Math.exp(-4.9078)); //weight size relationship computed from BDalosesBruch 
+		aFeature.put("bLW", 3.147);
+		aFeature.put("aLW_Gonad", -5.2425); // issu de la relation taille - poids des gonades Bruch
+		aFeature.put("bLW_Gonad", 2.6729); // issu de la relation taille - poids des gonades Bruch
+		//aFeature.put("bLW",3.3429);// parametre "b" de la relation taille/poids - Coefficient d'allometrie
+		//aFeature.put("aLW",1.2102E-6 * Math.pow(10., aFeature.get("bLW"))); // parametre "a" de la relation taille/poids en kg/cm- Traduit la condition
+		//aFeature.put("GSI",0.15); 
+		aFeaturePreSpawning.put(Gender.FEMALE, aFeature);
+
+		/*
+		 * For males 
+		 */
+		aFeature = new Hashtable<String,Double>();
+		aFeature.put("aLW", Math.exp(-1.304)); 
+		aFeature.put("bLW", 2.1774);
+		aFeature.put("aLW_Gonad", -8.8744); 
+		aFeature.put("bLW_Gonad", 3.3838); 
+		//aFeature.put("aLW",2.4386E-6 * Math.pow(10, aFeature.get("bLW"))); // Conversion des g/mm en g.cm (from Taverny, 1991) 
+		//aFeature.put("GSI",.08);
+		aFeaturePreSpawning.put(Gender.MALE,aFeature);
+
+		System.out.println("aFeaturePreSpawning: " + aFeaturePreSpawning.toString()); //
+
+		/*
+		 * a Feature post Spawning 
+		 */
+		Map<Gender, Map<String, Double>> aFeaturePostSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
+
+		/*
+		 * For females 
+		 */
+		aFeature = new Hashtable<String,Double>();
+		aFeature.put("aLW", Math.exp(-4.3276)); //weight size relationship computed from BDalosesBruch 
+		aFeature.put("bLW", 2.9418);
+		aFeature.put("aLW_Gonad", -6.6234); // issu de la relation taille - poids des gonades Bruch
+		aFeature.put("bLW_Gonad", 2.8545); // issu de la relation taille - poids des gonades Bruch
+		//aFeature.put("GSI",0.10); //From BDalosesBruch 
+		//aFeature.put("aLW",aFeaturePreSpawning.get(Gender.FEMALE).get("aLW")/(1+aFeature.get("GSI"))); // parametre "a" de la relation taille/poids avec Lt en cm - Traduit la condition
+		//aFeature.put("bLW",aFeaturePreSpawning.get(Gender.FEMALE).get("bLW"));// parametre "b" de la relation taille/poids - Coefficient d'allometrie
+		aFeaturePostSpawning.put(Gender.FEMALE, aFeature);
+
+		/*
+		 * For males 
+		 */
+		aFeature = new Hashtable<String,Double>();
+
+		aFeature.put("aLW", Math.exp(-4.5675));// parametre "a" de la relation taille/poids - Coefficient d'allometrie
+		aFeature.put("bLW", 2.9973); 
+		aFeature.put("aLW_Gonad", -11.285); // issu de la relation taille - poids des gonades Bruch
+		aFeature.put("bLW_Gonad", 3.8331); // issu de la relation taille - poids des gonades Bruch
+		//aFeature.put("GSI",.05); From BDalosesBruch 
+		//aFeature.put("aLW",aFeaturePreSpawning.get(Gender.MALE).get("aLW")/(1+aFeature.get("GSI")));
+		//aFeature.put("bLW",aFeaturePreSpawning.get(Gender.MALE).get("bLW"));
+		aFeaturePostSpawning.put(Gender.MALE,aFeature);
+
+		System.out.println("aFeaturePostSpawning: " + aFeaturePostSpawning.toString());
+
+		// carcass composition for fish before spawning
+		Map<Gender, Map<String, Double>> aCompoCarcassPreSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
+		Map<String,Double> aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 2.958 / 100.); //On remplit une collection avec un put. 
+		aCompo.put("P", 0.673 / 100.);
+		aCompoCarcassPreSpawning.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 2.941 / 100.);
+		aCompo.put("P", 0.666 / 100.);
+		aCompoCarcassPreSpawning.put(Gender.MALE,aCompo);
+
+		System.out.println("aCompoCarcassPreSpawning: " + aCompoCarcassPreSpawning.toString()); //
+
+		// carcass composition for fish after spawning
+		Map<Gender, Map<String, Double>> aCompoCarcassPostSpawning = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 3.216 / 100.); //On remplit une collection avec un put. 
+		aCompo.put("P", 0.997 / 100.);
+		aCompoCarcassPostSpawning.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 2.790 / 100.); // From Haskel et al, 2017 
+		aCompo.put("P", 0.961 / 100.);
+		aCompoCarcassPostSpawning.put(Gender.MALE,aCompo);
+
+		System.out.println("aCompoCarcassPostSpawning: " + aCompoCarcassPostSpawning.toString()); //
+
+		// Gametes composition approximated by the difference between gonads weight before and after spawning. 
+		Map<Gender, Map<String, Double>> aCompoGametes = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 3.242 / 100.); //On remplit une collection avec un put. From Haskel et al, 2018. 
+		aCompo.put("P", 0.320 / 100.); // Haskel = %P, N, ici ratio donc divise par 100 
+		aCompoGametes.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 3.250 / 100.); // Approximée par la compo des gonades 
+		aCompo.put("P", 0.724 / 100.);
+		aCompoGametes.put(Gender.MALE,aCompo);
+
+		System.out.println("aCompoGametes:" + aCompoGametes.toString()); //
+
+		// features for juveniles 
+
+		Map<String,Double> aJuvenileFeatures = new Hashtable<String, Double>();
+		aJuvenileFeatures.put("bLW",3.0306);
+		aJuvenileFeatures.put("aLW",Math.exp(-11.942) * Math.pow(10., aJuvenileFeatures.get("bLW")));
+
+		System.out.println("aJuvenileFeatures: " + aJuvenileFeatures.toString()); 
+
+		// carcass composition for juveniles fish 
+		Map<String, Double> aCompoJuveniles = new Hashtable<String,Double>();
+		aCompoJuveniles.put("N", 2.803 / 100.); //On remplit une collection avec un put. %N in wet weight (Haskell et al, 2017) on Alosa sapidissima 
+		aCompoJuveniles.put("P", 0.887 / 100.); //%P in wet weight (from Haskell et al, 2017) on Alosa sapidissima 
+
+		System.out.println("aCompoJuveniles: " + aCompoJuveniles.toString()); 
+
+		ArrayList <String> nutrientsOfInterest= new ArrayList <String>();
+		nutrientsOfInterest.add("N");
+		nutrientsOfInterest.add("P");
+
+		System.out.println("nutrientsOfInterest: " + nutrientsOfInterest);
+
+
+		NutrientRoutine fn = new NutrientRoutine(nutrientsOfInterest,aResidenceTime, anExcretionRate, aFeaturePreSpawning, aFeaturePostSpawning, 
+				aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes,
+				aJuvenileFeatures, aCompoJuveniles);
+
+		SeaBasin basin = new SeaBasin(0,"Bidon",10.,12., 14.,12.); //il faut aller dans "SeaBasin" dans "environement et regarder comment est construit le constructeur. Il lui faut ici un rang, un nom de bassin versant, et des température pour chaque saison 
+		Pilot pilot = new Pilot ();
+		DiadromousFish fishFemale = new DiadromousFish (pilot, basin, 52., 1L, Gender.FEMALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
+		fishFemale.setStage(Stage.MATURE);
+		DiadromousFish fishMale = new DiadromousFish (pilot, basin, 47., 1L, Gender.MALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
+		fishMale.setStage(Stage.MATURE);
+		DiadromousFish juvenileFish = new DiadromousFish(pilot,basin,7.0,1L,Gender.UNDIFFERENCIED);
+		juvenileFish.setStage(Stage.IMMATURE);
+
+		System.out.println(); // affiche une ligne blanche 
+		System.out.println(fishFemale.getGender() + ": " + fishFemale.getLength() + " cm " + fn.getWeight(fishFemale, SpawningPosition.PRE)+ " g " + fn.getWeight(fishFemale, SpawningPosition.POST));
+		System.out.println("\tNutrients Fluxes for death before spawning " + fn.computeNutrientsInputForDeathBeforeSpawning(fishFemale).toString());
+		System.out.println("\tNutrients Fluxes for death after spawning " + fn.computeNutrientsInputForDeathAfterSpawning(fishFemale).toString());
+		System.out.println("\tNutrients Fluxes for survival  " + fn.computeNutrientsInputForSurvivalAfterSpawning(fishFemale).toString());
+
+		System.out.println(fishMale.getGender() + ": " + fishMale.getLength() + " cm " + fn.getWeight(fishMale, SpawningPosition.PRE)+ " g " + fn.getWeight(fishMale, SpawningPosition.POST));
+		System.out.println("\tNutrients Fluxes for death before spawning " + fn.computeNutrientsInputForDeathBeforeSpawning(fishMale).toString());
+		System.out.println("\tNutrients Fluxes for death after spawning " + fn.computeNutrientsInputForDeathAfterSpawning(fishMale).toString());
+		System.out.println("\tNutrients Fluxes for survival  " + fn.computeNutrientsInputForSurvivalAfterSpawning(fishMale).toString());
+
+		System.out.println(juvenileFish.getStage() + ": " + juvenileFish.getLength() + " cm " + fn.getWeight(juvenileFish)+ " g ");
+		System.out.println("\tNutrients Fluxes for juveniles " + fn.computeNutrientsExportForJuveniles(juvenileFish).toString());
+
+
+
+
+		/* Create XML file 
+		 * 
+		 */
+		System.out.println((new	XStream(new DomDriver())).toXML(fn));
+
+	} 
+}
+
+
diff --git a/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java b/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java
index 5f543a60d3d8845acf94fcfd62ef407b9e370cdf..3a2cde9c98073624cd6b7019edab553eae041b8d 100644
--- a/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java
+++ b/src/main/java/species/ReproduceAndSurviveAfterReproductionWithDiagnose.java
@@ -111,7 +111,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
 
 					//Initiate the total fluxes for this basin 
 					Map<String, Double> totalInputFluxes = new Hashtable<String, Double>(); //On créer la Map pour stocker les flux 
-					for (String nutrient : group.getFishNutrient().getNutrientsOfInterest()) {
+					for (String nutrient : group.getNutrientRoutine().getNutrientsOfInterest()) {
 						totalInputFluxes.put(nutrient, 0.); // ON MET A JOUR NOTRE map 
 					}
 
@@ -193,10 +193,10 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
 							if (survivalAmount > 0) {// SUperindividu est encore vivant mais il perd des effectifs 
 
 								//Export for fishes survived after spawning (survivalAmount) : excretion + gametes
-								Map <String, Double> aFluxAfterSurvival = group.getFishNutrient().computeNutrientsInputForSurvivalAfterSpawning(fish); 
+								Map <String, Double> aFluxAfterSurvival = group.getNutrientRoutine().computeNutrientsInputForSurvivalAfterSpawning(fish); 
 
 								//Export for fishes that dies after spawning (fish.getAmount - survivalAmount): excretion + gametes + carcasse 
-								Map<String, Double> aFluxForDeadFish = group.getFishNutrient().computeNutrientsInputForDeathAfterSpawning(fish); 
+								Map<String, Double> aFluxForDeadFish = group.getNutrientRoutine().computeNutrientsInputForDeathAfterSpawning(fish); 
 
 								for (String nutrient: aFluxAfterSurvival.keySet()) {
 									//For survival fish
@@ -207,7 +207,7 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
 								}
 								
 								//compute biomass for dead fish 
-								biomass = group.getFishNutrient().getWeight(fish) * (fish.getAmount() - survivalAmount); 
+								biomass = group.getNutrientRoutine().getWeight(fish) * (fish.getAmount() - survivalAmount); 
 								totalInputFluxes.put("biomass", totalInputFluxes.get("biomass") + biomass);
 								
 								//update the amount of individual in the super-individual 
@@ -218,12 +218,12 @@ public class ReproduceAndSurviveAfterReproductionWithDiagnose extends AquaNismsG
 								deadFish.add(fish);
 
 								//Export for fished died before spawning (fish.getAmount): carcasses + excretion + gametes 
-								Map<String, Double> aFlux = group.getFishNutrient().computeNutrientsInputForDeathAfterSpawning(fish); // 
+								Map<String, Double> aFlux = group.getNutrientRoutine().computeNutrientsInputForDeathAfterSpawning(fish); // 
 								
 								for (String nutrient: aFlux.keySet()) {
 									totalInputFluxes.put(nutrient,totalInputFluxes.get(nutrient) + aFlux.get(nutrient) * fish.getAmount()); //Fish.getAmount - survivalAmount = total fishes died. 
 								}
-								 biomass = group.getFishNutrient().getWeight(fish) * (fish.getAmount());
+								 biomass = group.getNutrientRoutine().getWeight(fish) * (fish.getAmount());
 								 totalInputFluxes.put("biomass", totalInputFluxes.get("biomass") + biomass); 
 							}
 						}