From 309bb45c3c3bcb8c9423b4e473cb89abce13f411 Mon Sep 17 00:00:00 2001
From: "camille.poulet" <camille.poulet@BXP1829.bordeaux.irstea.priv>
Date: Fri, 3 May 2019 17:42:56 +0200
Subject: [PATCH] Fish nutrient with Array list and Hashtable implementation

---
 src/main/java/species/FishNutrient.java | 407 ++++++++++++++----------
 1 file changed, 236 insertions(+), 171 deletions(-)

diff --git a/src/main/java/species/FishNutrient.java b/src/main/java/species/FishNutrient.java
index 7b6703c..c9f56a0 100644
--- a/src/main/java/species/FishNutrient.java
+++ b/src/main/java/species/FishNutrient.java
@@ -1,7 +1,7 @@
 /**
- * patrick.lambert
- * @author Patrick Lambert
- * @copyright Copyright (c) 2018, Irstea
+ * 
+ * @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
@@ -20,55 +20,93 @@
 package species;
 
 import environment.SeaBasin;
+import environment.Time.Season;
 import fr.cemagref.simaqualife.pilot.Pilot;
 import species.DiadromousFish.Gender;
 import species.DiadromousFish.Stage;
+import species.ReproduceAndSurviveAfterReproduction;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
 
 /**
  *
  */
-public class FishNutrient {
-
-	private double aLWfemalePre = 0.0221; // param�tre "a" de la relation taille/poids avec Lt en cm
-	private double bLWfemalePre  = 2.8147; // param�tre "b" de la relation taille/poids
-	private double GSIfemalePre =.15;	
-	private double aLWmalePre = 0.0221; // param�tre "a" de la relation taille/poids avec Lt en cm
-	private double bLWmalePre  = 2.8147; // param�tre "b" de la relation taille/poids
-	private double GSImalePre =.07;
 
-	// Si on ne possède pas wT post reproduction 
+/**
+ * @author camille.poulet
+ *
+ */
+public class FishNutrient {
 
 	/**
-	 *  param�tre "a" de la relation taille/poids avec Lt en cm
+	 * Main feature for weight computation before spawning i.e. gametes expelling //Voir pour un retour à la ligne lors du commentaire 
+	 * key gender
+	 * value
+	 * 		key feature
+	 * 		value value
 	 */
-	private double aLWfemalePost = 0.; // param�tre "a" de la relation taille/poids avec Lt en cm
-	private double bLWfemalePost  = 0.; // param�tre "b" de la relation taille/poids
+	private Map <Gender,Map<String, Double>> fishFeatures;
+
+	// Si on ne possede pas wT post reproduction 
+
+	private double aLWfemalePost = 0.; 
+	private double bLWfemalePost  = 0.;
 	private double GSIfemalePost=0.10;	
-	private double aLWmalePost = 0.; // param�tre "a" de la relation taille/poids avec Lt en cm
-	private double bLWmalePost = 0.; // param�tre "b" de la relation taille/poids
+	private double aLWmalePost = 0.; 
+	private double bLWmalePost = 0.; 
 	private double GSImalePost =.07;
 
-	//Si on possede WT post reproduction 
 
-	private double CoeffLossWeight = 0.; 
+	// Valeurs de Haskell pour A. sapidissima -- A rechercher pour Alosa alosa
 
-	//Valeurs de Haskell pour A. sapidissima -- A rechercher pour Alosa alosa
+	/**
+	 * chemical composition of carcass before gametes expelling (before spawning) i.e. carcass + gonads + gametes
+	 * <key> gender
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+	private Map<DiadromousFish.Gender,Map<String,Double>> compoCarcassPreSpawning;
 
-	private double compoNpreMale = 2.921; 
-	private double compoPpreMale = 0.662;
-	private double compoNpreFemale = 2.917;
-	private double compoPpreFemale = 0.725;
+	//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. 
 
-	private double compoNpostMale = 2.790 ;
-	private double compoPpostMale = 0.961;
-	private double compoNpostFemale = 3.216 ;
-	private double compoPpostFemale = 0.997;
+	/**
+	 * chemical composition of carcass after spawning i.e. gonads without gametes
+	 * <key> gender
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+	private Map<DiadromousFish.Gender, Map<String, Double>> compoCarcassPostSpawning;
+	
+	/**
+	 * chemical composition of gametes
+	 * <key> gender
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+	private Map<DiadromousFish.Gender, Map<String,Double>> compoGametes;
 
-	private double compoNoocyte =0.0;
-	private double compoNsperm =0.0;
-	private double compoPoocyte =0.0;
-	private double compoPsperm =0.0;
+	// For juveniles - Based on Taverny (1991)
 
+	/**
+	 * chemical composition of juveniles
+	 * <key> stage
+	 * <value> 
+	 * 		<key> chemical element
+	 * 		<value> value
+	 */
+
+	private Map<String,Double> compoJuvenile; 
+
+	private double aLWjuveniles = -11.942 ; // parametre "a" de la relation taille/poids avec Lt en cm - Traduit la condition
+	private double bLWjuveniles  = 3.0306; // parametre "b" de la relation taille/poids - Coefficient d'allometrie
 
 	/**
 	 * 
@@ -76,175 +114,202 @@ public class FishNutrient {
 	public FishNutrient() {
 		// TODO Auto-generated constructor stub
 	}
-	
 
-	public FishNutrient(double aLWfemalePre, double bLWfemalePre, double gSIfemalePre, double aLWmalePre,
-			double bLWmalePre, double gSImalePre, double aLWfemalePost, double bLWfemalePost, double gSIfemalePost,
-			double aLWmalePost, double bLWmalePost, double gSImalePost, double coeffLossWeight, double compoNpreMale,
-			double compoPpreMale, double compoNpreFemale, double compoPpreFemale, double compoNpostMale,
-			double compoPpostMale, double compoNpostFemale, double compoPpostFemale, double compoNoocyte,
-			double compoNsperm, double compoPoocyte, double compoPsperm) {
+
+	/**
+	 * Constructor based on the 5 Map of fish composition 
+	 * @param fishFeatures
+	 * @param compoCarcassPreSpawning
+	 * @param compoCarcassPostSpawning
+	 * @param compoGametes
+	 * @param compoJuvenile
+	 */
+	public FishNutrient(Map<Gender, Map<String, Double>> fishFeatures,
+			Map<Gender, Map<String, Double>> compoCarcassPreSpawning,
+			Map<Gender, Map<String, Double>> compoCarcassPostSpawning, Map<Gender, Map<String, Double>> compoGametes,
+			Map<String, Double> compoJuvenile,double aLWjuveniles, double bLWjuveniles ) {
 		super();
-		this.aLWfemalePre = aLWfemalePre;
-		this.bLWfemalePre = bLWfemalePre;
-		GSIfemalePre = gSIfemalePre;
-		this.aLWmalePre = aLWmalePre;
-		this.bLWmalePre = bLWmalePre;
-		GSImalePre = gSImalePre;
-		this.aLWfemalePost = aLWfemalePost;
-		this.bLWfemalePost = bLWfemalePost;
-		GSIfemalePost = gSIfemalePost;
-		this.aLWmalePost = aLWmalePost;
-		this.bLWmalePost = bLWmalePost;
-		GSImalePost = gSImalePost;
-		CoeffLossWeight = coeffLossWeight;
-		this.compoNpreMale = compoNpreMale;
-		this.compoPpreMale = compoPpreMale;
-		this.compoNpreFemale = compoNpreFemale;
-		this.compoPpreFemale = compoPpreFemale;
-		this.compoNpostMale = compoNpostMale;
-		this.compoPpostMale = compoPpostMale;
-		this.compoNpostFemale = compoNpostFemale;
-		this.compoPpostFemale = compoPpostFemale;
-		this.compoNoocyte = compoNoocyte;
-		this.compoNsperm = compoNsperm;
-		this.compoPoocyte = compoPoocyte;
-		this.compoPsperm = compoPsperm;
+		this.fishFeatures = fishFeatures;
+		this.compoCarcassPreSpawning = compoCarcassPreSpawning;
+		this.compoCarcassPostSpawning = compoCarcassPostSpawning;
+		this.compoGametes = compoGametes;
+		this.compoJuvenile = compoJuvenile; 
+		this.aLWjuveniles = aLWjuveniles; 
+		this.bLWjuveniles = bLWjuveniles; 
 	}
 
-
 	/**
-	 * compute the N and P fluxes for a single fish (in the super individual)
-	 *  that dies after spawning (gametes expelling) 
+	 * compute the nutrient fluxes for a single fish (in the super individual)
+	 *  that dies before spawning  
 	 * @param fish
 	 */
-	public double[] computeInportNPforDeathBeforeSpawning(DiadromousFish fish) {
-		double totalWeightPre; 
+	public Map<String,Double> computeNutrientsInputForDeathBeforeSpawning(DiadromousFish fish, ArrayList<String> nutrientsOfInterest) { 
 
-		double [] inportNP = new double[2]; //Declare an array with two coloumns 
-		inportNP[0] = 0; // create the colomn 
-		inportNP[1] = 0; 
+		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) {
-			if(fish.getGender()== Gender.FEMALE) {
-				totalWeightPre = aLWfemalePre * Math.pow(fish.getLength(), bLWfemalePre);
+			if (fish.getStage()== Stage.MATURE) {
+				double totalWeightPre = fishFeatures.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeatures.get(fish.getGender()).get("bLW"));
 				//totalWeightPost = totalWeightPre * (1-GSIfemalePost)+ totalWeightPost * GSIfemalePost * CoeffLossWeight
-				inportNP[0] = totalWeightPre * compoNpreFemale;
-				inportNP[1] = totalWeightPre * compoPpreFemale;
+				nutrientsInput.put(nutrient, totalWeightPre * compoCarcassPreSpawning.get(fish.getGender()).get(nutrient));
 			}
-			else if (fish.getGender()== Gender.MALE) {
-				totalWeightPre = aLWmalePre * Math.pow(fish.getLength(), bLWmalePre);
-				//totalWeightPost = totalWeightPre * (1-GSImalePost)+ totalWeightPost * GSImalePost * CoeffLossWeight
-				inportNP[0] = totalWeightPre * compoNpreMale; 
-				inportNP[1] = totalWeightPre * compoPpreMale; 	
-			}
-			else {
-				totalWeightPre= Double.NaN; 
-				inportNP[0] = 0.; 
-				inportNP[1] = 0; 
+			else { 
+				nutrientsInput.put(nutrient, 0.);
 			}
 		}
-		return inportNP;
-
+		return nutrientsInput;
 	}
 
-	public double[] computeInportNPforDeathAfterSpawning(DiadromousFish fish) {
-		double totalWeightPre, totalWeightPost;
+	/**
+	 * 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) {
 
-		double[] inportNP = new double[2]; 
-		inportNP[0] = 0.;
-		inportNP[1] = 0.;
+			if (fish.getStage()== Stage.MATURE) {
 
-		if (fish.getStage() == Stage.MATURE) {
-			if (fish.getGender() == Gender.FEMALE ) {
-				totalWeightPre = aLWfemalePre * Math.pow(fish.getLength(), bLWfemalePre);
-				totalWeightPost = aLWfemalePost * Math.pow(fish.getLength(), bLWfemalePost);
-				//totalWeightPost = totalWeightPre * (1-GSIfemalePost)+ totalWeightPost * GSIfemalePost * CoeffLossWeight
-				inportNP[0] = totalWeightPost * compoNpostFemale + (totalWeightPre - totalWeightPost) * compoNoocyte;
-				inportNP[1] = totalWeightPost * compoPpostFemale + (totalWeightPre - totalWeightPost) * compoPoocyte;
-			}
-			else if (fish.getGender() == Gender.MALE) {
-				totalWeightPre = aLWmalePre * Math.pow(fish.getLength(), bLWmalePre);
-				totalWeightPost = aLWmalePost * Math.pow(fish.getLength(), bLWmalePost);
-				//totalWeightPost = totalWeightPre * (1-GSImalePost)+ totalWeightPost * GSImalePost * CoeffLossWeight
-				inportNP[0] = totalWeightPost * compoNpostMale + (totalWeightPre - totalWeightPost) * compoNsperm;
-				inportNP[1] = totalWeightPost * compoPpostMale + (totalWeightPre - totalWeightPost) * compoPsperm;
+				double totalWeightPre = fishFeatures.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeatures.get(fish.getGender()).get("bLW"));
+	//TODO Fix the new data
+				double totalWeightPost = aLWfemalePost * Math.pow(fish.getLength(), bLWfemalePost);
+				nutrientsInput.put(nutrient,(totalWeightPre - totalWeightPost) * compoCarcassPostSpawning.get(fish.getGender()).get(nutrient));
 			}
 			else {
-				totalWeightPre = Double.NaN;
-				totalWeightPost = 0.;
-				inportNP[0]=0.;
-				inportNP[1]=0.;
-			}
+				nutrientsInput.put(nutrient,0.);
+			}	
 		}
-
-		return inportNP;	
+		return nutrientsInput; 
 	}
 
-	public double [] computeInportNPforSurvivalAfterSpawning(DiadromousFish fish) {
-		double totalWeightPre, totalWeightPost;
-
-		double[]inportNP = new double [2]; 
-		inportNP[0]= 0;
-		inportNP[1] = 0; 
-
-		if (fish.getStage()== Stage.MATURE) {
-			if (fish.getGender()==Gender.FEMALE){
-				totalWeightPre = aLWfemalePre * Math.pow(fish.getLength(), bLWfemalePre);
-				totalWeightPost = aLWfemalePost * Math.pow(fish.getLength(), bLWfemalePost);
-				//totalWeightPost = totalWeightPre * (1-GSImalePost)+ totalWeightPost * GSImalePost * CoeffLossWeight
-				inportNP[0] = (totalWeightPre - totalWeightPost)* compoNoocyte; 
-				inportNP[1] = (totalWeightPre - totalWeightPost)* compoPoocyte; 	
-			}
-			else if (fish.getGender()== Gender.MALE) {
+	
+	/**
+	 * 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) {
 
-				totalWeightPre = aLWfemalePre * Math.pow(fish.getLength(), bLWmalePre);
-				totalWeightPost = aLWfemalePost * Math.pow(fish.getLength(), bLWmalePost);
-				//totalWeightPost = totalWeightPre * (1-GSImalePost)+ totalWeightPost * GSImalePost * CoeffLossWeight
-				inportNP[0] = (totalWeightPre - totalWeightPost)* compoNsperm; 
-				inportNP[1] = (totalWeightPre - totalWeightPost)* compoPsperm; 
+		Map<String,Double> nutrientsInput = new Hashtable<String,Double>();
+		for (String nutrient: nutrientsOfInterest) {
+			if (fish.getStage()==Stage.MATURE) {
 
+				double totalWeightPre = fishFeatures.get(fish.getGender()).get("aLW") * Math.pow(fish.getLength(), fishFeatures.get(fish.getGender()).get("bLW"));
+			//TODO Fix with new data 
+				double totalWeightPost = aLWfemalePost * Math.pow(fish.getLength(), bLWfemalePost);
+				nutrientsInput.put(nutrient, (totalWeightPre - totalWeightPost) * compoGametes.get(fish.getGender()).get(nutrient)); 	
 			}
 			else {
-				totalWeightPre= Double.NaN; 
-				totalWeightPost = 0.; 
-				inportNP[0] = 0.; 
-				inportNP[1] = 0;
-
+				nutrientsInput.put(nutrient,0.);
 			}
 		}
-
-		return inportNP; 
+		return nutrientsInput;
+	}	
+
+	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 = aLWjuveniles * Math.pow(juvenileFish.getLength(), bLWjuveniles);
+				nutrientsExport.put(nutrient, JuvenileMass * compoJuvenile.get(nutrient));
+			}
+		}
+		
+		return nutrientsExport;
 	}
 
-public static void main(String[] args)	{
-	
-	FishNutrient fn = new FishNutrient(0.0221, 2.8147, .15, 0.0221, 2.8147, .07, 0., 0., 0.10, 0., 0., 0.07, 0., 2.921, 0.662, 2.917, 0.725, 2.790, 0.961, 3.216, 0.997, 0., 0., 0., 0.); //On lui passe les valeurs utilisés ici dans le programme 
-	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 fish = new DiadromousFish (pilot, basin, 40., 1L, Gender.FEMALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
-	fish.setStage(Stage.MATURE);
-	double[] np =  fn.computeInportNPforDeathAfterSpawning(fish); 
-	System.out.println("N = " + np[0]+ "P = "+ np[1]); // on met des + à la place des "," car l'ordinateur n'est pas capable detraiter des objets ddifférent de "String". Or on a un double ici. 
-			
-			
-			
-			
-			
-			
-	
-	
-	
-	
-	
-	
+	public static void main(String[] args)	{
+		
+		Map<Gender, Map<String, Double>> aFeaturePreSpawning = new Hashtable<DiadromousFish.Gender, Map<String,Double>>();
+		Map<String,Double> aFeature = new Hashtable<String,Double>();
+		aFeature.put("aLW",1.2102E-6); // parametre "a" de la relation taille/poids avec Lt en cm - Traduit la condition
+		aFeature.put("bLW",3.3429);// parametre "b" de la relation taille/poids - Coefficient d'allometrie
+		aFeature.put("GSI",0.15); 
+		aFeaturePreSpawning.put(Gender.FEMALE, aFeature);
+		
+		aFeature = new Hashtable<String,Double>();
+		aFeature.put("aLW",2.4386E-6);
+		aFeature.put("bLW",3.2252);
+		aFeature.put("GSI",.07);
+		aFeaturePreSpawning.put(Gender.MALE,aFeature);
+
+		System.out.println(aFeaturePreSpawning.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.917); //On remplit une collection avec un put. 
+		aCompo.put("P", 0.725);
+		aCompoCarcassPreSpawning.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 2.921);
+		aCompo.put("P",0.662);
+		aCompoCarcassPreSpawning.put(Gender.MALE,aCompo);
+
+		System.out.println(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); //On remplit une collection avec un put. 
+		aCompo.put("P", 0.997);
+		aCompoCarcassPostSpawning.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 2.790);
+		aCompo.put("P",0.961);
+		aCompoCarcassPostSpawning.put(Gender.MALE,aCompo);
+
+		System.out.println(aCompoCarcassPostSpawning.toString()); //
+
+		// carcass composition for fish gametes
+		Map<Gender, Map<String, Double>> aCompoGametes = new Hashtable<DiadromousFish.Gender,Map<String,Double>>();
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 0.); //On remplit une collection avec un put. 
+		aCompo.put("P", 0.);
+		aCompoGametes.put(Gender.FEMALE,aCompo);
+
+		aCompo = new Hashtable<String,Double>();
+		aCompo.put("N", 0.);
+		aCompo.put("P",0.);
+		aCompoGametes.put(Gender.MALE,aCompo);
+
+		System.out.println(aCompoGametes.toString()); //
+
+		// carcass composition for juveniles fish 
+		Map<String, Double> aCompoJuveniles = new Hashtable<String,Double>();
+		aCompoJuveniles.put("N", 0.); //On remplit une collection avec un put. 
+		aCompoJuveniles.put("P", 0.);
+
+		System.out.println(aCompoJuveniles.toString()); 
+
+		FishNutrient fn = new FishNutrient(aFeaturePreSpawning, aCompoCarcassPreSpawning, aCompoCarcassPostSpawning, aCompoGametes, aCompoJuveniles, 
+				-11.942, 3.0306);
+		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 fish = new DiadromousFish (pilot, basin, 40., 1L, Gender.FEMALE); //Idem ici, on regarde comment est construit DiadromousFih et on lui donne les valeur de ce qu'il nous demande. 
+		fish.setStage(Stage.MATURE);
+		DiadromousFish juvenileFish = new DiadromousFish(pilot,basin,2.0,1L,Gender.UNDIFFERENCIED);
+		fish.setStage(Stage.IMMATURE);
+		ArrayList <String> nutrientsOfInterest= new ArrayList <String>();
+		nutrientsOfInterest.add("N");
+		nutrientsOfInterest.add("P");
+		
+		System.out.println(nutrientsOfInterest);
+		
+		System.out.println("Nutrients Fluxes for death before spawning " + fn.computeNutrientsInputForDeathBeforeSpawning(fish, nutrientsOfInterest).toString());
+		System.out.println("Nutrients Fluxes for death after spawning " + fn.computeNutrientsInputForDeathAfterSpawning(fish, nutrientsOfInterest).toString());
+		System.out.println("Nutrients Fluxes for survival  " + fn.computeNutrientsInputForSurvivalAfterSpawning(fish, nutrientsOfInterest).toString());
+		System.out.println("Nutrients Fluxes for juveniles " + fn.computeNutrientsExportForJuveniles(juvenileFish, nutrientsOfInterest).toString());
+
+		
+	} 
 }
-	
-	
-	
-} 
-
-
-
 
 
-- 
GitLab