[cig-commits] r13983 - cs/cigma/trunk/src
luis at geodynamics.org
luis at geodynamics.org
Wed Jan 28 09:05:14 PST 2009
Author: luis
Date: 2009-01-28 09:05:13 -0800 (Wed, 28 Jan 2009)
New Revision: 13983
Added:
cs/cigma/trunk/src/fe_tri6.cpp
cs/cigma/trunk/src/fe_tri6.h
Log:
Add quadratic tri6 element. This should just work with minimal changes.
Added: cs/cigma/trunk/src/fe_tri6.cpp
===================================================================
--- cs/cigma/trunk/src/fe_tri6.cpp (rev 0)
+++ cs/cigma/trunk/src/fe_tri6.cpp 2009-01-28 17:05:13 UTC (rev 13983)
@@ -0,0 +1,117 @@
+#include "fe_tri6.h"
+
+using namespace cigma;
+
+static void tri_shape(double u, double v, double s[6])
+{
+ s[0] = 1 - 3*u - 3*v + 4*u*v + 2*u*u + 2*v*v;
+ s[1] = 2*u*u - u;
+ s[2] = 2*v*v - v;
+ s[3] = 4*u*v;
+ s[4] = 4*(v - u*v - v*v);
+ s[5] = 4*(u - u*v - u*u);
+}
+
+static void tri_grad_shape(double u, double v, double s[6*2])
+{
+ #define S(i,j) s[2*(i) + (j)]
+
+ S(0,0) = -3 + 4*u + 4*v;
+ S(0,1) = -3 + 4*u + 4*v;
+
+ S(1,0) = 4*u - 1;
+ S(1,1) = 0;
+
+ S(2,0) = 0;
+ S(2,1) = 4*v - 1;
+
+ S(3,0) = 4*v;
+ S(3,1) = 4*u;
+
+ S(4,0) = -4*v;
+ S(4,1) = 4 - 4*u - 8*v;
+
+ S(5,0) = 4 - 4*v - 8*u;
+ S(5,1) = -4*u;
+
+ #undef S
+}
+
+double tri6::refverts[6*2] = {
+ 0.0, 0.0,
+ 1.0, 0.0,
+ 0.0, 1.0,
+ 0.5, 0.5,
+ 0.0, 0.5,
+ 0.5, 0.0
+};
+
+
+tri6::tri6()
+{
+ Cell::init();
+}
+
+tri6::tri6(const tri6& t)
+{
+ Cell::reinit(t);
+}
+
+tri6::~tri6()
+{
+}
+
+void tri6::shape(int num, double *points, double *values)
+{
+ const int nno = n_nodes();
+ for (int i = 0; i < num; i++)
+ {
+ const double u = points[2*i + 0];
+ const double v = points[2*i + 1];
+ tri_shape(u, v, &values[nno*i]);
+ }
+}
+
+void tri6::grad_shape(int num, double *points, double *values)
+{
+ const int nno = n_nodes();
+ const int celldim = n_celldim();
+ const int stride = nno * celldim;
+ for (int i = 0; i < num; i++)
+ {
+ const double u = points[2*i + 0];
+ const double v = points[2*i + 1];
+ tri_grad_shape(u, v, &values[stride*i]);
+ }
+}
+
+
+//void tri6::xyz2uvw(double xyz[3], double uvw[3]) {}
+
+
+#define ZERO (-1.0e-6)
+#define ONE (1 - ZERO)
+
+bool tri6::interior(double u, double v, double w)
+{
+
+ if ((u < ZERO) || (v < ZERO) || (u > (ONE - v)))
+ {
+ return false;
+ }
+ return true;
+}
+
+#undef ZERO
+#undef ONE
+
+
+double tri6::volume()
+{
+ #define X(n) globverts[2*(n) + 0]
+ #define Y(n) globverts[2*(n) + 1]
+ return 0.5*(X(0) * Y(1) - X(0) * Y(2) - X(1) * Y(0) + X(1) * Y(2) + X(2) * Y(0) - X(2) * Y(1));
+ #undef X
+ #undef Y
+}
+
Added: cs/cigma/trunk/src/fe_tri6.h
===================================================================
--- cs/cigma/trunk/src/fe_tri6.h (rev 0)
+++ cs/cigma/trunk/src/fe_tri6.h 2009-01-28 17:05:13 UTC (rev 13983)
@@ -0,0 +1,36 @@
+#ifndef __FE_TRI6_H__
+#define __FE_TRI6_H__
+
+#include "Cell.h"
+
+namespace cigma
+{
+ class tri6;
+}
+
+/**
+ * Subparametric quadratic triangle.
+ */
+class cigma::tri6 : public Cell
+{
+public:
+ tri6();
+ tri6(const tri6& t);
+ ~tri6();
+
+ int n_nodes() const { return 6; }
+ int n_celldim() const { return 2; }
+
+ Cell::type cell_type() const { return TRI6; }
+
+ void shape(int num, double *points, double *values);
+ void grad_shape(int num, double *points, double *values);
+ //void xyz2uvw(double xyz[3], double uvw[3]);
+ bool interior(double u, double v, double w);
+ double volume();
+
+public:
+ static double refverts[6*2];
+};
+
+#endif
More information about the CIG-COMMITS
mailing list