From 71f01c1c40f14a0767e544ae55779898c08c8138 Mon Sep 17 00:00:00 2001 From: Thomas De Maet <thomas.demaet@uclouvain.be> Date: Fri, 30 Mar 2012 14:49:23 +0000 Subject: [PATCH] Ground-surface water coupling --- Geo/MLine.cpp | 5 +++++ Geo/MLine.h | 1 + Geo/MQuadrangle.cpp | 15 ++++++++++++++- Geo/MQuadrangle.h | 3 ++- Geo/MTriangle.cpp | 11 +++++++++++ Geo/MTriangle.h | 1 + 6 files changed, 34 insertions(+), 2 deletions(-) diff --git a/Geo/MLine.cpp b/Geo/MLine.cpp index 5091bc18cc..3ffe7f1e10 100644 --- a/Geo/MLine.cpp +++ b/Geo/MLine.cpp @@ -65,3 +65,8 @@ double MLine::getLength() { return _v[0]->distance(_v[1]); } + +double MLine::getVolume() +{ + return getLength(); +} diff --git a/Geo/MLine.h b/Geo/MLine.h index a26fbaf268..8e60f50a6a 100644 --- a/Geo/MLine.h +++ b/Geo/MLine.h @@ -39,6 +39,7 @@ class MLine : public MElement { virtual MVertex *getVertex(int num){ return _v[num]; } virtual double getInnerRadius(); // half-length of segment line virtual double getLength(); // length of segment line + virtual double getVolume(); virtual void getVertexInfo(const MVertex * vertex, int &ithVertex) const { ithVertex = _v[0] == vertex ? 0 : 1; diff --git a/Geo/MQuadrangle.cpp b/Geo/MQuadrangle.cpp index c448fabab4..6f41fe2dc3 100644 --- a/Geo/MQuadrangle.cpp +++ b/Geo/MQuadrangle.cpp @@ -94,7 +94,20 @@ int MQuadrangleN::getNumEdgesRep(){ return 4 * CTX::instance()->mesh.numSubEdges int MQuadrangle8::getNumEdgesRep(){ return 4 * CTX::instance()->mesh.numSubEdges; } int MQuadrangle9::getNumEdgesRep(){ return 4 * CTX::instance()->mesh.numSubEdges; } - +double MQuadrangle::getVolume() +{ + if(getNumVertices() > 4) + return MElement::getVolume(); + double a = _v[0]->distance(_v[1]); + double b = _v[1]->distance(_v[2]); + double c = _v[2]->distance(_v[3]); + double d = _v[3]->distance(_v[0]); + double m = _v[0]->distance(_v[2]); + double n = _v[1]->distance(_v[3]); + double mn = 2. * m * n; + double abcd = a*a - b*b + c*c - d*d; + return sqrt( mn*mn - abcd*abcd ) / 4.; +} static void _myGetEdgeRep(MQuadrangle *q, int num, double *x, double *y, double *z, SVector3 *n, int numSubEdges) diff --git a/Geo/MQuadrangle.h b/Geo/MQuadrangle.h index f3affef3cc..4484c1dad8 100644 --- a/Geo/MQuadrangle.h +++ b/Geo/MQuadrangle.h @@ -38,7 +38,7 @@ class MQuadrangle : public MElement { v[2] = _v[2]; v[3] = _v[3]; } -void projectInMeanPlane(double *xn, double *yn); + void projectInMeanPlane(double *xn, double *yn); public : MQuadrangle(MVertex *v0, MVertex *v1, MVertex *v2, MVertex *v3, int num=0, int part=0) : MElement(num, part) @@ -132,6 +132,7 @@ void projectInMeanPlane(double *xn, double *yn); { return SPoint3(0., 0., 0.); } + virtual double getVolume(); virtual void revert() { MVertex *tmp = _v[1]; _v[1] = _v[3]; _v[3] = tmp; diff --git a/Geo/MTriangle.cpp b/Geo/MTriangle.cpp index a15d74f8ef..98f977d4f1 100644 --- a/Geo/MTriangle.cpp +++ b/Geo/MTriangle.cpp @@ -25,6 +25,17 @@ SPoint3 MTriangle::circumcenter() return SPoint3(res[0], res[1], res[2]); } +double MTriangle::getVolume() +{ + if(getNumVertices() > 3) + return MElement::getVolume(); + SPoint3 p0(_v[0]->x(), _v[0]->y(), _v[0]->z()); + SPoint3 p1(_v[1]->x(), _v[1]->y(), _v[1]->z()); + SPoint3 p2(_v[2]->x(), _v[2]->y(), _v[2]->z()); + SVector3 v1(p0, p1), v2(p0, p2); + return norm(crossprod(v1, v2)) / 2.; +} + double MTriangle::distoShapeMeasure() { #if defined(HAVE_MESH) diff --git a/Geo/MTriangle.h b/Geo/MTriangle.h index dbcb47e433..54a298904e 100644 --- a/Geo/MTriangle.h +++ b/Geo/MTriangle.h @@ -149,6 +149,7 @@ class MTriangle : public MElement { } virtual void getIntegrationPoints(int pOrder, int *npts, IntPt **pts); virtual SPoint3 circumcenter(); + virtual double getVolume(); static int edges_tri(const int edge, const int vert) { static const int e[3][2] = { -- GitLab