[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