[cig-commits] r12843 - cs/cigma/trunk/src

luis at geodynamics.org luis at geodynamics.org
Wed Sep 10 12:50:44 PDT 2008


Author: luis
Date: 2008-09-10 12:50:44 -0700 (Wed, 10 Sep 2008)
New Revision: 12843

Added:
   cs/cigma/trunk/src/Hex.cpp
   cs/cigma/trunk/src/Hex.h
Log:
Linear Hex3d element




Added: cs/cigma/trunk/src/Hex.cpp
===================================================================
--- cs/cigma/trunk/src/Hex.cpp	                        (rev 0)
+++ cs/cigma/trunk/src/Hex.cpp	2008-09-10 19:50:44 UTC (rev 12843)
@@ -0,0 +1,130 @@
+#include "Hex.h"
+#include <cassert>
+
+static void hex_shape(double u, double v, double w, double s[8])
+{
+    s[0] = (1.0 - u) * (1.0 - v) * (1.0 - w) * 0.125;
+    s[1] = (1.0 + u) * (1.0 - v) * (1.0 - w) * 0.125;
+    s[2] = (1.0 + u) * (1.0 + v) * (1.0 - w) * 0.125;
+    s[3] = (1.0 - u) * (1.0 + v) * (1.0 - w) * 0.125;
+    s[4] = (1.0 - u) * (1.0 - v) * (1.0 + w) * 0.125;
+    s[5] = (1.0 + u) * (1.0 - v) * (1.0 + w) * 0.125;
+    s[6] = (1.0 + u) * (1.0 + v) * (1.0 + w) * 0.125;
+    s[7] = (1.0 - u) * (1.0 + v) * (1.0 + w) * 0.125;
+}
+
+static void hex_grad_shape(double u, double v, double w, double s[8*3])
+{
+    #define S(i,j) s[3*(i) + (j)]
+
+    S(0,0) = -0.125 * (1.-v) * (1.-w);
+    S(0,1) = -0.125 * (1.-u) * (1.-w);
+    S(0,2) = -0.125 * (1.-u) * (1.-v);
+
+    S(1,0) =  0.125 * (1.-v) * (1.-w);
+    S(1,1) = -0.125 * (1.+u) * (1.-w);
+    S(1,2) = -0.125 * (1.+u) * (1.-v);
+
+    S(2,0) =  0.125 * (1.+v) * (1.-w);
+    S(2,1) =  0.125 * (1.+u) * (1.-w);
+    S(2,2) = -0.125 * (1.+u) * (1.+v);
+
+    S(3,0) = -0.125 * (1.+v) * (1.-w);
+    S(3,1) =  0.125 * (1.-u) * (1.-w);
+    S(3,2) = -0.125 * (1.-u) * (1.+v);
+
+    S(4,0) = -0.125 * (1.-v) * (1.+w);
+    S(4,1) = -0.125 * (1.-u) * (1.+w);
+    S(4,2) =  0.125 * (1.-u) * (1.-v);
+
+    S(5,0) =  0.125 * (1.-v) * (1.+w);
+    S(5,1) = -0.125 * (1.+u) * (1.+w);
+    S(5,2) =  0.125 * (1.+u) * (1.-v);
+
+    S(6,0) =  0.125 * (1.+v) * (1.+w);
+    S(6,1) =  0.125 * (1.+u) * (1.+w);
+    S(6,2) =  0.125 * (1.+u) * (1.+v);
+
+    S(7,0) = -0.125 * (1.+v) * (1.+w);
+    S(7,1) =  0.125 * (1.-u) * (1.+w);
+    S(7,2) =  0.125 * (1.-u) * (1.+v);
+
+    #undef S
+}
+
+cigma::Hex::Hex()
+{
+    const int nno = 8;
+    const int nsd = 3;
+    const int celldim = 3;
+    double verts[nno * celldim] = {
+        -1.0, -1.0, -1.0,
+        +1.0, -1.0, -1.0,
+        +1.0, +1.0, -1.0,
+        -1.0, +1.0, -1.0,
+        -1.0, -1.0, +1.0,
+        +1.0, +1.0, +1.0,
+        -1.0, +1.0, +1.0
+    };
+
+    set(nsd, celldim, nno);
+    set_reference_vertices(verts, nno);
+}
+
+cigma::Hex::~Hex()
+{
+}
+
+
+/*
+ * @param points points is an [num x nsd] array (in)
+ * @param values values is an [num x ndofs] array (out)
+ *
+ */
+void cigma::Hex::shape(int num, double *points, double *values)
+{
+    assert(ndofs > 0);
+    for (int i = 0; i < num; i++)
+    {
+        double u = points[3*i + 0];
+        double v = points[3*i + 1];
+        double w = points[3*i + 2];
+        hex_shape(u, v, w, &values[ndofs*i]);
+    }
+}
+
+/*
+ *
+ * @param points points is an [num x celldim] array (in)
+ * @param values values is an [num x ndofs x celldim] array (out)
+ */
+void cigma::Hex::grad_shape(int num, double *points, double *values)
+{
+    assert(ndofs > 0);
+    for (int i = 0; i < num; i++)
+    {
+        double u = points[3*i + 0];
+        double v = points[3*i + 1];
+        double w = points[3*i + 2];
+        hex_grad_shape(u, v, w, &values[ndofs*celldim*i]);
+    }
+}
+
+/*
+ *
+ */
+bool cigma::Hex::interior(double u, double v, double w)
+{
+    #define ZERO    (-1.0e-6)
+    #define ONE     (1-ZERO)
+
+    if ((u < -ONE) || (v < -ONE) || (w < -ONE) ||
+        (u > +ONE) || (v > +ONE) || (w > +ONE))
+    {
+        return false;
+    }
+    return true;
+
+    #undef ONE
+    #undef ZERO
+}

Added: cs/cigma/trunk/src/Hex.h
===================================================================
--- cs/cigma/trunk/src/Hex.h	                        (rev 0)
+++ cs/cigma/trunk/src/Hex.h	2008-09-10 19:50:44 UTC (rev 12843)
@@ -0,0 +1,24 @@
+#ifndef __HEX_H__
+#define __HEX_H__
+
+#include "Cell.h"
+
+namespace cigma
+{
+    class Hex;
+}
+
+class cigma::Hex : public Cell
+{
+public:
+    Hex();
+    ~Hex();
+
+public:
+    void shape(int num, double *points, double *values);
+    void grad_shape(int num, double *points, double *values);
+    bool interior(double u, double v, double w);
+};
+
+
+#endif



More information about the cig-commits mailing list