|
From: <de...@us...> - 2011-01-10 21:18:42
|
Revision: 6073
http://fudaa.svn.sourceforge.net/fudaa/?rev=6073&view=rev
Author: deniger
Date: 2011-01-10 21:18:36 +0000 (Mon, 10 Jan 2011)
Log Message:
-----------
Modified Paths:
--------------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolume.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolumeSeuil.java
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolume.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolume.java 2011-01-08 02:38:30 UTC (rev 6072)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolume.java 2011-01-10 21:18:36 UTC (rev 6073)
@@ -11,9 +11,6 @@
*/
package org.fudaa.dodico.ef.cubature;
-import gnu.trove.TIntArrayList;
-import gnu.trove.TIntObjectHashMap;
-
import java.io.IOException;
import com.memoire.fu.FuLog;
@@ -23,14 +20,11 @@
import org.fudaa.ctulu.CtuluVariable;
import org.fudaa.ctulu.ProgressionInterface;
import org.fudaa.ctulu.ProgressionUpdater;
-
import org.fudaa.dodico.commun.DodicoLib;
import org.fudaa.dodico.ef.EfData;
-import org.fudaa.dodico.ef.EfElement;
import org.fudaa.dodico.ef.EfFilter;
import org.fudaa.dodico.ef.EfFilterNone;
import org.fudaa.dodico.ef.EfGridData;
-import org.fudaa.dodico.ef.EfGridInterface;
/**
* Permet de calculer le volume d'eau sur une s\xE9lection d'\xE9l\xE9ment ou de noeuds.
@@ -41,65 +35,37 @@
public abstract class EfComputeVolume implements CtuluActivity {
public static class ForMeshData extends EfComputeVolume {
+ EfComputeVolumeSeuil.ForMeshData seuil;
ForMeshData(final EfFilter _filter, final ProgressionInterface _prog, final EfGridData _data,
final CtuluVariable _hVar) {
super(_filter, _prog, _data, _hVar);
}
- double computeVolume(final EfGridInterface _grid, final EfData _h) {
- double resi = 0;
- for (int ielt = 0; ielt < _grid.getEltNb(); ielt++) {
- if (filter_.isActivatedElt(ielt)) {
- resi += _grid.getAire(ielt) * _h.getValue(ielt);
- }
- }
- return resi;
+ double computeVolume(final EfData _h) {
+ return seuil.computeVolume(_h).getResultat();
}
}
public static class ForNodeData extends EfComputeVolume {
+ EfComputeVolumeSeuil.ForNodeData seuil;
ForNodeData(final EfFilter _filter, final ProgressionInterface _prog, final EfGridData _data,
final CtuluVariable _hVar) {
super(_filter, _prog, _data, _hVar);
+ seuil = new EfComputeVolumeSeuil.ForNodeData(_filter, _prog, _data, _hVar, 0);
}
- double computeVolume(final EfGridInterface _grid, final EfData _h) {
- double resi = 0;
- for (int ielt = 0; ielt < _grid.getEltNb(); ielt++) {
- // le calcul du volume se fait:
- // Volume=(surface des elements adjacents)* hauteur au point /3
- if (filter_.isActivatedElt(ielt, true)) {
- // liste des elements adjacents.
- // s est la surface des elements adjacents.
- EfElement elt = _grid.getElement(ielt);
- int nbElt = elt.getPtNb();
- double s = 0D;
- for (int k = 0; k < nbElt; k++) {
- s = s + _h.getValue(elt.getPtIndex(k));
- }
- // la formule qui tue
- resi += s * _grid.getAire(ielt) / ((double)nbElt);
- }
- }
- return resi;
+ double computeVolume(final EfData _h) {
+ return seuil.computeVolume(_h).getResultat();
}
- public double[] getVolume(final int _nbTimeStep) {
- computeNeighborMeshes();
- return super.getVolume(_nbTimeStep);
- }
}
final EfGridData data_;
final EfFilter filter_;
final CtuluVariable h_;
- /**
- * Stocke indice du noeuds -> list element adjacent. Pour les noeuds s\xE9lecionn\xE9s uniquement
- */
- TIntObjectHashMap idxPtAdjMes_;
ProgressionInterface prog_;
boolean stop_;
@@ -124,42 +90,10 @@
filter_ = _filter == null ? new EfFilterNone() : _filter;
}
- abstract double computeVolume(final EfGridInterface _grid, EfData _h);
+ abstract double computeVolume(EfData _h);
- protected void computeNeighborMeshes() {
- if (idxPtAdjMes_ != null) { return; }
- final ProgressionUpdater up = new ProgressionUpdater(prog_);
- final EfGridInterface grid = data_.getGrid();
- up.setValue(10, grid.getEltNb());
- up.majProgessionStateOnly(DodicoLib.getS("Recherche des \xE9l\xE9ments voisins"));
- idxPtAdjMes_ = new TIntObjectHashMap(grid.getPtsNb());
- for (int i = 0; i < grid.getEltNb(); i++) {
- if (stop_) {
- idxPtAdjMes_ = null;
- return;
- }
- final EfElement elt = grid.getElement(i);
- for (int j = 0; j < elt.getPtNb(); j++) {
- final int ptIndex = elt.getPtIndex(j);
- // si le noeud est s\xE9lectionne
- if (filter_.isActivated(ptIndex)) {
- TIntArrayList list = (TIntArrayList) idxPtAdjMes_.get(ptIndex);
- // ce noeud n'a pas encore \xE9t\xE9 trait\xE9
- if (list == null) {
- list = new TIntArrayList(10);
- idxPtAdjMes_.put(ptIndex, list);
- }
- list.add(i);
-
- }
- }
- up.majAvancement();
- }
- }
-
public double[] getVolume(final int _nbTimeStep) {
final ProgressionUpdater up = new ProgressionUpdater(prog_);
- final EfGridInterface grid = data_.getGrid();
up.setValue(10, _nbTimeStep);
final double[] res = new double[_nbTimeStep];
up.majProgessionStateOnly(DodicoLib.getS("Calcul du volume"));
@@ -173,7 +107,7 @@
}
if (h == null) { return null; }
- res[i] = computeVolume(grid, h);
+ res[i] = computeVolume(h);
up.majAvancement();
}
return res;
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolumeSeuil.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolumeSeuil.java 2011-01-08 02:38:30 UTC (rev 6072)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfComputeVolumeSeuil.java 2011-01-10 21:18:36 UTC (rev 6073)
@@ -1,10 +1,9 @@
package org.fudaa.dodico.ef.cubature;
-import gnu.trove.TIntArrayList;
-import gnu.trove.TIntObjectHashMap;
-
import java.io.IOException;
+import com.memoire.fu.FuLog;
+
import org.fudaa.ctulu.CtuluActivity;
import org.fudaa.ctulu.CtuluAnalyze;
import org.fudaa.ctulu.CtuluVariable;
@@ -16,10 +15,7 @@
import org.fudaa.dodico.ef.EfFilter;
import org.fudaa.dodico.ef.EfFilterNone;
import org.fudaa.dodico.ef.EfGridData;
-import org.fudaa.dodico.ef.EfGridInterface;
-import com.memoire.fu.FuLog;
-
/**
* Calcul du volume par rapport a un seuil et non plus 0.
*
@@ -34,12 +30,12 @@
super(_filter, _prog, _data, _hVar, seuil);
}
- EfDataIntegrale computeVolume(final EfGridInterface _grid, final EfData _h) {
+ protected EfDataIntegrale computeVolume(final EfData _h) {
EfDataIntegrale resi = new EfDataIntegrale();
- for (int ielt = 0; ielt < _grid.getEltNb(); ielt++) {
+ for (int ielt = 0; ielt < data_.getGrid().getEltNb(); ielt++) {
if (filter_.isActivatedElt(ielt)) {
- double value = _grid.getAire(ielt) * (_h.getValue(ielt) - seuil_);// Todo je pense que c'est la diff
+ double value = data_.getGrid().getAire(ielt) * (_h.getValue(ielt) - seuil_);// Todo je pense que c'est la diff
resi.add(value);
}
}
@@ -54,32 +50,28 @@
super(_filter, _prog, _data, _hVar, seuil);
}
- EfDataIntegrale computeVolume(final EfGridInterface _grid, final EfData _h) {
+ protected EfDataIntegrale computeVolume(final EfData _h) {
EfDataIntegrale resi = new EfDataIntegrale();
- for (int ipt = 0; ipt < _grid.getPtsNb(); ipt++) {
+ for (int ielt = 0; ielt < data_.getGrid().getEltNb(); ielt++) {
// le calcul du volume se fait:
// Volume=(surface des elements adjacents)* hauteur au point /3
- if (filter_.isActivated(ipt)) {
+ if (filter_.isActivatedElt(ielt, true)) {
// liste des elements adjacents.
- final TIntArrayList list = (TIntArrayList) idxPtAdjMes_.get(ipt);
- // la liste est nulle: ne devrait jamais arriv\xE9: un point isol\xE9 que faire ?
- // pour l'instant on ignore.
- if (list != null) {
- // s est la surface des elements adjacents.
- double s = 0D;
- for (int k = 0; k < list.size(); k++) {
- s += _grid.getAire(list.getQuick(k));
- }
- double d = s * (_h.getValue(ipt) - seuil_) / 3D;
- resi.add(d);
+ // s est la surface des elements adjacents.
+ EfElement elt = data_.getGrid().getElement(ielt);
+ int nbElt = elt.getPtNb();
+ double s = 0D;
+ for (int k = 0; k < nbElt; k++) {
+ s = s + (_h.getValue(elt.getPtIndex(k)) - seuil_);
+
}
+ resi.add(s * data_.getGrid().getAire(ielt) / ((double) nbElt));
}
}
return resi;
}
public EfDataIntegrale getVolume(int _choosenTimestep) {
- computeNeighborMeshes();
return super.getVolume(_choosenTimestep);
}
}
@@ -90,10 +82,6 @@
// protected final int timeStep_;
protected final double seuil_;
- /**
- * Stocke indice du noeuds -> list element adjacent. Pour les noeuds s\xE9lecionn\xE9s uniquement
- */
- TIntObjectHashMap idxPtAdjMes_;
ProgressionInterface prog_;
boolean stop_;
@@ -120,42 +108,12 @@
filter_ = _filter == null ? new EfFilterNone() : _filter;
}
- abstract EfDataIntegrale computeVolume(final EfGridInterface _grid, EfData _h);
+ protected abstract EfDataIntegrale computeVolume(EfData _h);
- protected void computeNeighborMeshes() {
- if (idxPtAdjMes_ != null) { return; }
- final ProgressionUpdater up = new ProgressionUpdater(prog_);
- final EfGridInterface grid = data_.getGrid();
- up.setValue(10, grid.getEltNb());
- up.majProgessionStateOnly(DodicoLib.getS("Recherche des \xE9l\xE9ments voisins"));
- idxPtAdjMes_ = new TIntObjectHashMap(grid.getPtsNb());
- for (int i = 0; i < grid.getEltNb(); i++) {
- if (stop_) {
- idxPtAdjMes_ = null;
- return;
- }
- final EfElement elt = grid.getElement(i);
- for (int j = 0; j < elt.getPtNb(); j++) {
- final int ptIndex = elt.getPtIndex(j);
- // si le noeud est s\xE9lectionne
- if (filter_.isActivated(ptIndex)) {
- TIntArrayList list = (TIntArrayList) idxPtAdjMes_.get(ptIndex);
- // ce noeud n'a pas encore \xE9t\xE9 trait\xE9
- if (list == null) {
- list = new TIntArrayList(10);
- idxPtAdjMes_.put(ptIndex, list);
- }
- list.add(i);
+
- }
- }
- up.majAvancement();
- }
- }
-
public EfDataIntegrale getVolume(int choosenTimestep) {
final ProgressionUpdater up = new ProgressionUpdater(prog_);
- final EfGridInterface grid = data_.getGrid();
up.setValue(10, 100);
EfDataIntegrale res;
up.majProgessionStateOnly(DodicoLib.getS("Calcul du volume"));
@@ -169,7 +127,7 @@
}
if (h == null) { return null; }
- res = computeVolume(grid, h);
+ res = computeVolume(h);
up.majAvancement();
return res;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: <de...@us...> - 2013-02-20 21:28:07
|
Revision: 8286
http://fudaa.svn.sourceforge.net/fudaa/?rev=8286&view=rev
Author: deniger
Date: 2013-02-20 21:28:00 +0000 (Wed, 20 Feb 2013)
Log Message:
-----------
support VariableFC
Modified Paths:
--------------
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java
trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfDataIntegrale.java
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java 2013-02-20 14:37:52 UTC (rev 8285)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfBilanHelper.java 2013-02-20 21:28:00 UTC (rev 8286)
@@ -3,6 +3,7 @@
*/
package org.fudaa.dodico.ef.cubature;
+import org.fudaa.ctulu.math.BilanHelper;
import org.fudaa.dodico.ef.EfData;
import org.fudaa.dodico.ef.operation.EfLineIntersection;
import org.fudaa.dodico.ef.operation.EfLineIntersectionsResultsI;
@@ -11,85 +12,9 @@
/**
* @author deniger
*/
-public class EfBilanHelper {
+public class EfBilanHelper extends BilanHelper {
/**
- * Integration des donnees par la methode des trapezes entre la courbe representee par les x1 et y1 et la droite d\xE9finie par la fonction affine de
- * coeff a et d'ordonn\xE9\xE9e a l origine b y1=a*x1+b
- *
- * @param lx
- * @param ly
- * @return
- */
- public static EfDataIntegrale integrerMethodeTrapeze(double[] lx, double[] ly, double a, double b) {
-
- EfDataIntegrale data = new EfDataIntegrale();
-
- for (int i = 0; i < Math.min(lx.length, ly.length) - 1; i++) {
- double x = lx[i];
- double x2 = lx[i + 1];
- double y = ly[i];
- double y2 = ly[i + 1];
-
- double ySeuil1 = a * x + b;
- double ySeuil2 = a * x2 + b;
- if (y > ySeuil1 && y2 > ySeuil2) {
- // courbe au dessus de la ligne
- data.addZonePlus(calculAireTrapeze(x, y, x2, y2, ySeuil1, ySeuil2));
-
- } else if (y < ySeuil1 && y2 < ySeuil2) {
- // courbe en dessous de la ligne
- data.addZoneMoins(calculAireTrapeze(x, y, x2, y2, ySeuil1, ySeuil2));
-
- } else {
- // cas particulier : intersection, on calcule l'intersection entre les
- // points
- // cas particulier : intersection, on calcule l'intersection entre les
- // points
- double yIntersect = 0;
- double xIntersect = 0;
- // on prend la droite form\xE9e par les 2 points et on calcule son
- // intersection avec la droite affine
- if (x2 - x != 0) {
- // droite non parrallele a l axe des abscisses
- double coefDirecteur = (y2 - y) / (x2 - x);
- double ordoOrigine = y2 - coefDirecteur * x2;
-
- // intersection de droites avec le seuil
-
- if (coefDirecteur - a != 0) {
- // droie non paralleles
- xIntersect = (ordoOrigine - b) / (coefDirecteur - a);
- yIntersect = coefDirecteur * xIntersect + ordoOrigine;
- } else {
- // droite parrallele confondue au seuil, on ne fais rien...
- }
-
- } else {
- // x2=x1 droite d equation x1=Cste
-
- xIntersect = x;
- yIntersect = a * x + b;
- }
-
- // maintenant que l on a le point d'intersection, on test si on ajoute en positif ou negatif
- if (y >= ySeuil1 && y2 <= ySeuil2) {
- data.addZonePlus(calculAireTrapeze(x, y, xIntersect, yIntersect, ySeuil1, ySeuil2));
- data.addZoneMoins(calculAireTrapeze(xIntersect, yIntersect, x2, y2, ySeuil1, ySeuil2));
-
- } else {
- data.addZoneMoins(calculAireTrapeze(x, y, xIntersect, yIntersect, ySeuil1, ySeuil2));
- data.addZonePlus(calculAireTrapeze(xIntersect, yIntersect, x2, y2, ySeuil1, ySeuil2));
- }
-
- }
-
- }
-
- return data;
- }
-
- /**
* Calcule l'aire du trapeze en utilisant un objet EfLineIntersectionsResultsI. EfLineIntersectionsResultsI fonctionne de la maniere suivante:
* getNbIntersect():donne le nombre de points getDistFromDeb(i) donne le Xi: distance entre le debut et le point getIntersect(i)
* getValueBadInterpolation(EfData _d) donne le y1 associ\xE9 au x1
@@ -114,20 +39,6 @@
return data;
}
- /**
- * calcul de l'aire du trapeze form\xE9 par les 4 points (x1,y1) (x2,y2) (x1,y3) (x2,y4)
- */
- public static double calculAireTrapeze(double x, double y, double x2, double y2, double y3, double y4) {
- // 1: calcul de la hauteur
- double h = Math.abs(x2 - x);
- // 2 base 1: coordonnees cartesiennes entre le point x1,y1 et x1,y3
- double base1 = Math.abs(y3 - y);
- // 3 base 2: coordonnees cartesiennes entre le point x2,y2 et x2,y4
- double base2 = Math.abs(y4 - y2);
- // 4 calcul de l'aire
- return h * (base1 + base2) / 2;
- }
-
public static EfDataIntegrale integrerMethodeTrapezeVector(EfLineIntersectionsResultsI interfaceRes, EfData vxData, EfData vyData, double seuil) {
EfDataIntegrale data = new EfDataIntegrale();
EfVectorComputation vectorComputation = new EfVectorComputation();
@@ -195,53 +106,4 @@
return data;
}
-
- private static void computeBilan(double x1, double x2, double y1, double y2, double seuil, EfDataIntegrale targetData) {
- if (y1 >= seuil && y2 >= seuil) {
- // courbe au dessus de la ligne
- targetData.addZonePlus(calculAireTrapeze(x1, y1, x2, y2, seuil, seuil));
- } else if (y1 <= seuil && y2 <= seuil) {
- // courbe en dessous de la ligne
- targetData.addZoneMoins(calculAireTrapeze(x1, y1, x2, y2, seuil, seuil));
- } else {
- // cas particulier : intersection, on calcule l'intersection entre les
- // points
- final double yIntersect = seuil;
- double xIntersect = 0;
- // on prend la droite form\xE9e par les 2 points et on calcule son
- // intersection avec la droite affine
- if (x2 - x1 != 0) {
- // droite non parrallele a l axe des ordonn\xE9e !
- double coefDirecteur = (y2 - y1) / (x2 - x1);
- double ordoOrigine = y2 - coefDirecteur * x2;
-
- // intersection de droites avec le seuil
- // yIntersect = seuil;
-
- if (coefDirecteur != 0) // droie non parallele au seuil
- {
- xIntersect = (yIntersect - ordoOrigine) / coefDirecteur;
- } else {
- // droite parrallele confondue au seuil, on ne fais rien...
- }
-
- } else {
- // x2=x1 droite perpendiculaire au seuil, le point d'intersection est
- // donc (x1,seuil)
- xIntersect = x1;
- // yIntersect = seuil;
- }
-
- // maintenant que l on a le point d'intersection, on test si on ajoute en positif ou negatif
- if (y1 >= seuil && y2 <= seuil) {
- targetData.addZonePlus(calculAireTrapeze(x1, y1, xIntersect, yIntersect, seuil, seuil));
- targetData.addZoneMoins(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
-
- } else {
- targetData.addZoneMoins(calculAireTrapeze(x1, y1, xIntersect, yIntersect, seuil, seuil));
- targetData.addZonePlus(calculAireTrapeze(xIntersect, yIntersect, x2, y2, seuil, seuil));
- }
-
- }
- }
}
Modified: trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfDataIntegrale.java
===================================================================
--- trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfDataIntegrale.java 2013-02-20 14:37:52 UTC (rev 8285)
+++ trunk/business/fudaa-ef/core/src/main/java/org/fudaa/dodico/ef/cubature/EfDataIntegrale.java 2013-02-20 21:28:00 UTC (rev 8286)
@@ -1,47 +1,11 @@
package org.fudaa.dodico.ef.cubature;
+import org.fudaa.ctulu.math.DataIntegrale;
+
/**
* Classe qui gere les bilans ainsi que les cubatures.
*
* @author Adrien Hadoux
*/
-public class EfDataIntegrale {
-
- /**
- * Valeur pour la zone plus
- */
- private double zonePlus_ = 0;
- /**
- * Valeur int\xE9grale pour la zone moins
- */
- private double zoneMoins_ = 0;
-
- public double getZonePlus() {
- return zonePlus_;
- }
-
- public double getZoneMoins() {
- return zoneMoins_;
- }
-
- public void addZonePlus(double _d) {
- zonePlus_ = zonePlus_ + Math.abs(_d);
-
- }
-
- public void addZoneMoins(double _d) {
- zoneMoins_ = zoneMoins_ + Math.abs(_d);
- }
-
- public void add(double _d) {
- if (Math.signum(_d) > 0) {
- addZonePlus(_d);
- } else {
- addZoneMoins(_d);
- }
- }
-
- public double getResultat() {
- return zonePlus_ - zoneMoins_;
- }
+public class EfDataIntegrale extends DataIntegrale {
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|