|
SyFi
0.3
|
#include <Polygon.h>
Public Member Functions | |
| Tetrahedron (GiNaC::ex x0, GiNaC::ex x1, GiNaC::ex x2, GiNaC::ex x3, const std::string &subscript="") | |
| Tetrahedron (const Tetrahedron &tetrahedron) | |
| virtual | ~Tetrahedron () |
| virtual unsigned int | no_space_dim () const |
| virtual Line | line (unsigned int i) const |
| virtual Triangle | triangle (unsigned int i) const |
| virtual GiNaC::ex | repr (Repr_format format=SUBS_PERFORMED) const |
| virtual const std::string | str () const |
| virtual GiNaC::ex | integrate (GiNaC::ex f, Repr_format format=SUBS_PERFORMED) |
| virtual Tetrahedron * | copy () const |
| SyFi::Tetrahedron::Tetrahedron | ( | GiNaC::ex | x0, |
| GiNaC::ex | x1, | ||
| GiNaC::ex | x2, | ||
| GiNaC::ex | x3, | ||
| const std::string & | subscript = "" |
||
| ) |
Referenced by copy().
| SyFi::Tetrahedron::Tetrahedron | ( | const Tetrahedron & | tetrahedron | ) |
Definition at line 892 of file Polygon.cpp.
: Polygon(tetrahedron) { }
| virtual SyFi::Tetrahedron::~Tetrahedron | ( | ) | [inline, virtual] |
| Tetrahedron * SyFi::Tetrahedron::copy | ( | ) | const [virtual] |
Implements SyFi::Polygon.
Reimplemented in SyFi::ReferenceTetrahedron.
Definition at line 1051 of file Polygon.cpp.
References Tetrahedron().
{
return new Tetrahedron(*this);
}
| ex SyFi::Tetrahedron::integrate | ( | GiNaC::ex | f, |
| Repr_format | format = SUBS_PERFORMED |
||
| ) | [virtual] |
Implements SyFi::Polygon.
Reimplemented in SyFi::ReferenceTetrahedron.
Definition at line 971 of file Polygon.cpp.
References test_syfi::debug::c, run_tests::f, SyFi::Polygon::p, repr(), SyFi::sub(), SyFi::SUBS_NOT_PERFORMED, SyFi::SUBS_PERFORMED, and SyFi::x.
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), and main().
{
ex ret;
if ( format == SUBS_PERFORMED )
{
ex t_repr = repr();
// std::cout <<"t "<<t_repr<<std::endl;
//perform substitution
lst sub = lst(t_repr.op(0), t_repr.op(1), t_repr.op(2));
ex intf = func.subs(sub);
// compute D
ex D;
ex r = t_repr.op(3).op(0);
ex s = t_repr.op(4).op(0);
ex t = t_repr.op(5).op(0);
ex a = t_repr.op(0).rhs().coeff(r,1);
ex b = t_repr.op(0).rhs().coeff(s,1);
ex c = t_repr.op(0).rhs().coeff(t,1);
ex d = t_repr.op(1).rhs().coeff(r,1);
ex e = t_repr.op(1).rhs().coeff(s,1);
ex f = t_repr.op(1).rhs().coeff(t,1);
ex g = t_repr.op(2).rhs().coeff(r,1);
ex h = t_repr.op(2).rhs().coeff(s,1);
ex k = t_repr.op(2).rhs().coeff(t,1);
D = a*(e*k-f*h) - b*(d*k-f*g) + c*(d*h - g*e);
intf = intf*D;
intf = GiNaC::integral(t_repr.op(5).op(0), t_repr.op(5).op(1), t_repr.op(5).op(2), intf);
intf = GiNaC::eval_integ(intf);
intf = GiNaC::integral(t_repr.op(4).op(0), t_repr.op(4).op(1), t_repr.op(4).op(2), intf);
intf = GiNaC::eval_integ(intf);
intf = GiNaC::integral(t_repr.op(3).op(0), t_repr.op(3).op(1), t_repr.op(3).op(2), intf);
ret = GiNaC::eval_integ(intf);
}
else if ( format == SUBS_NOT_PERFORMED )
{
ex t_repr = repr();
GiNaC::symbol a("a"), b("b"), c("c"), d("d"), e("e"), f("f"), g("g"), h("h"), k("k"), D("D");
ex r = t_repr.op(3).op(0);
ex s = t_repr.op(4).op(0);
ex t = t_repr.op(5).op(0);
//perform substitution
// lst sub = lst(t_repr.op(0), t_repr.op(1), t_repr.op(2));
ex sub = lst(
x == p[0].op(0) + a*r + b*s + c*t,
y == p[0].op(1) + d*r + e*s + f*t,
z == p[0].op(2) + g*r + h*s + k*t);
ex intf = func.subs(sub);
intf = GiNaC::integral(t_repr.op(5).op(0), t_repr.op(5).op(1), t_repr.op(5).op(2), intf);
intf = GiNaC::eval_integ(intf);
intf = GiNaC::integral(t_repr.op(4).op(0), t_repr.op(4).op(1), t_repr.op(4).op(2), intf);
intf = GiNaC::eval_integ(intf);
intf = GiNaC::integral(t_repr.op(3).op(0), t_repr.op(3).op(1), t_repr.op(3).op(2), intf);
intf = GiNaC::eval_integ(intf);
ret = intf*D;
}
else
{
throw std::runtime_error("Invalid format.");
}
return ret;
}
| Line SyFi::Tetrahedron::line | ( | unsigned int | i | ) | const [virtual] |
Reimplemented from SyFi::Polygon.
Definition at line 899 of file Polygon.cpp.
References SyFi::istr(), SyFi::Polygon::p, and SyFi::Polygon::subscript.
Referenced by SyFi::Nedelec::compute_basis_functions().
{
int i0, i1;
switch(i)
{
case 0: i0 = 0; i1 = 1; break;
case 1: i0 = 0; i1 = 2; break;
case 2: i0 = 0; i1 = 3; break;
case 3: i0 = 1; i1 = 2; break;
case 4: i0 = 1; i1 = 3; break;
case 5: i0 = 2; i1 = 3; break;
default:
throw std::out_of_range("Line index is out of range!");
}
return Line(p[i0], p[i1], istr(subscript,i));
}
| unsigned int SyFi::Tetrahedron::no_space_dim | ( | ) | const [virtual] |
| ex SyFi::Tetrahedron::repr | ( | Repr_format | format = SUBS_PERFORMED | ) | const [virtual] |
Implements SyFi::Polygon.
Definition at line 940 of file Polygon.cpp.
References SyFi::Line::repr(), SyFi::t, SyFi::Polygon::vertex(), and SyFi::x.
Referenced by integrate(), and main().
{
GiNaC::symbol r("r"), s("s"), t("t");
ex l1_repr = Line(vertex(0), vertex(1)).repr(r);
ex l2_repr = Line(vertex(0), vertex(2)).repr(s);
ex l3_repr = Line(vertex(0), vertex(3)).repr(t);
lst ret;
ret = lst(
x == l1_repr.op(0).rhs().coeff(r,0) + l1_repr.op(0).rhs().coeff(r,1)*r
+ l2_repr.op(0).rhs().coeff(s,1)*s + l3_repr.op(0).rhs().coeff(t,1)*t,
y == l1_repr.op(1).rhs().coeff(r,0) + l1_repr.op(1).rhs().coeff(r,1)*r
+ l2_repr.op(1).rhs().coeff(s,1)*s + l3_repr.op(1).rhs().coeff(t,1)*t,
z == l1_repr.op(2).rhs().coeff(r,0) + l1_repr.op(2).rhs().coeff(r,1)*r
+ l2_repr.op(2).rhs().coeff(s,1)*s + l3_repr.op(2).rhs().coeff(t,1)*t);
ret.append(lst(r, 0, 1));
ret.append(lst(s, 0, 1 - r));
ret.append(lst(t, 0, 1 - r - s));
return ret;
}
| const string SyFi::Tetrahedron::str | ( | ) | const [virtual] |
Implements SyFi::Polygon.
Reimplemented in SyFi::ReferenceTetrahedron.
Definition at line 963 of file Polygon.cpp.
Referenced by main().
{
std::ostringstream s;
// s <<"Tetrahedron("<<p[0]<<","<<p[1]<<","<<p[2]<<","<<p[3]<<")";
s <<"Tetrahedron";
return s.str();
}
| Triangle SyFi::Tetrahedron::triangle | ( | unsigned int | i | ) | const [virtual] |
Reimplemented from SyFi::Polygon.
Definition at line 916 of file Polygon.cpp.
References SyFi::istr(), SyFi::Polygon::p, and SyFi::Polygon::subscript.
Referenced by SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), and SyFi::normal().
{
if ( i == 0 )
{
return Triangle(p[1], p[2], p[3], istr(subscript,i));
}
else if ( i == 1)
{
return Triangle(p[0], p[2], p[3], istr(subscript,i));
}
else if ( i == 2)
{
return Triangle(p[0], p[1], p[3], istr(subscript,i));
}
else if ( i == 3)
{
return Triangle(p[0], p[1], p[2], istr(subscript,i));
}
throw std::out_of_range("Face index is out of range!");
}