From 453efcfad3d70b7bb653efbae1cb9a37eba3ba11 Mon Sep 17 00:00:00 2001
From: Emilie Marchandise <emilie.marchandise@uclouvain.be>
Date: Fri, 18 Jun 2010 10:51:14 +0000
Subject: [PATCH]

---
 CMakeLists.txt          |  2 +-
 Solver/crossConfTerm.h  |  4 +--
 Solver/helmholtzTerm.h  |  2 +-
 Solver/orthogonalTerm.h | 75 +++++++++++++++++++++++++++++++++++++++++
 4 files changed, 79 insertions(+), 4 deletions(-)
 create mode 100644 Solver/orthogonalTerm.h

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ac7414c412..ab89bf5dc8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -79,7 +79,7 @@ set(GMSH_API
     Geo/Homology.h
   Mesh/meshGEdge.h Mesh/meshGFace.h Mesh/meshGFaceOptimize.h 
     Mesh/meshGFaceDelaunayInsertion.h
-  Solver/dofManager.h Solver/femTerm.h Solver/laplaceTerm.h Solver/elasticityTerm.h
+  Solver/dofManager.h Solver/femTerm.h Solver/laplaceTerm.h Solver/elasticityTerm.h Solver/crossConfTerm.h Solver/orthogonalTerm.h
     Solver/linearSystem.h Solver/linearSystemGMM.h Solver/linearSystemCSR.h 
     Solver/linearSystemFull.h Solver/elasticitySolver.h
   Post/PView.h Post/PViewData.h Plugin/PluginManager.h
diff --git a/Solver/crossConfTerm.h b/Solver/crossConfTerm.h
index f0dc4ddd80..a4a2146bde 100644
--- a/Solver/crossConfTerm.h
+++ b/Solver/crossConfTerm.h
@@ -46,7 +46,7 @@ class crossConfTerm : public femTerm<double> {
   {
     MElement *e = se->getMeshElement();
     int nbNodes = e->getNumVertices();
-    int integrationOrder = 2 * (e->getPolynomialOrder() - 1);
+    int integrationOrder = 2 * (e->getPolynomialOrder() - 1); 
     int npts;
     IntPt *GP;
     double jac[3][3];
@@ -54,7 +54,7 @@ class crossConfTerm : public femTerm<double> {
     SVector3 Grads [256];
     double grads[256][3];
     e->getIntegrationPoints(integrationOrder, &npts, &GP);
-  
+
     m.setAll(0.);
     
     for (int i = 0; i < npts; i++){
diff --git a/Solver/helmholtzTerm.h b/Solver/helmholtzTerm.h
index 2af2587d62..64b6d1890b 100644
--- a/Solver/helmholtzTerm.h
+++ b/Solver/helmholtzTerm.h
@@ -15,7 +15,7 @@
 #include "fullMatrix.h"
 #include "Numeric.h"
 
-// \nabla \cdot k \nabla U - a U = 0 
+// \nabla \cdot k \nabla U - a U 
 template<class scalar>
 class helmholtzTerm : public femTerm<scalar> {
  protected:
diff --git a/Solver/orthogonalTerm.h b/Solver/orthogonalTerm.h
new file mode 100644
index 0000000000..cf1d3c3274
--- /dev/null
+++ b/Solver/orthogonalTerm.h
@@ -0,0 +1,75 @@
+// Gmsh - Copyright (C) 1997-2010 C. Geuzaine, J.-F. Remacle
+//
+// See the LICENSE.txt file for license information. Please report all
+// bugs and problems to <gmsh@geuz.org>.
+
+#ifndef _ORTHOGONAL_TERM_H_
+#define _ORTHOGONAL_TERM_H_
+
+#include "helmholtzTerm.h"
+
+class orthogonalTerm : public helmholtzTerm<double> {
+ protected:
+  fullVector<double> *_value;
+ public:
+ orthogonalTerm(GModel *gm, int iField, fullVector<double> &value)
+   : helmholtzTerm<double>(gm, iField, iField, 1.0, 0), _value(value) {}
+  void elementVector(SElement *se, fullVector<double> &m) const
+  {
+
+    MElement *e = se->getMeshElement();
+
+    //fill elementary matrix mat(i,j)
+    int nbNodes = e->getNumVertices();
+    int integrationOrder = 2 * (e->getPolynomialOrder() - 1);
+    int npts;
+    IntPt *GP;
+    double jac[3][3];
+    double invjac[3][3];
+    SVector3 Grads [256];
+    double grads[256][3];
+    e->getIntegrationPoints(integrationOrder, &npts, &GP);
+    fullMatrix<double> mat;
+    mat.setAll(0.);
+    
+    for (int i = 0; i < npts; i++){
+      const double u = GP[i].pt[0];
+      const double v = GP[i].pt[1];
+      const double w = GP[i].pt[2];
+      const double weight = GP[i].weight;
+      const double detJ = e->getJacobian(u, v, w, jac);   
+      SPoint3 p; e->pnt(u, v, w, p);
+      const double _diff = (*_diffusivity)(p.x(), p.y(), p.z());
+      inv3x3(jac, invjac); 
+      e->getGradShapeFunctions(u, v, w, grads);
+      for (int j = 0; j < nbNodes; j++){
+        Grads[j] = SVector3(invjac[0][0] * grads[j][0] + invjac[0][1] * grads[j][1] + 
+                            invjac[0][2] * grads[j][2],
+                            invjac[1][0] * grads[j][0] + invjac[1][1] * grads[j][1] + 
+                            invjac[1][2] * grads[j][2],
+                            invjac[2][0] * grads[j][0] + invjac[2][1] * grads[j][1] +
+                            invjac[2][2] * grads[j][2]);
+      }
+      SVector3 N (jac[2][0], jac[2][1], jac[2][2]);
+      for (int j = 0; j < nbNodes; j++){
+        for (int k = 0; k <= j; k++){
+          mat(j, k) += dot(crossprod(Grads[j], Grads[k]), N) * weight * detJ * _diff;
+        }
+      }
+    }
+    for (int j = 0; j < nbNodes; j++)
+      for (int k = 0; k < j; k++)
+        mat(k, j) = -1.* m(j, k);
+ 
+    //2) compute vector m(i) = mat(i,j)*val(j)
+    fullVector<double> val(nbNodes);
+
+    m.scale(0.); 
+    for (int i = 0; i < nbNodes; i++)
+      for (int j = 0; j < nbNodes; j++)
+	m(i)  +=  mat(i,j)*val(j);
+ 
+  }
+};
+
+#endif
-- 
GitLab