SyFi  0.3
SyFi::Triangle Class Reference

#include <Polygon.h>

Inheritance diagram for SyFi::Triangle:
SyFi::Polygon SyFi::ReferenceTriangle

List of all members.

Public Member Functions

 Triangle (GiNaC::ex x0, GiNaC::ex x1, GiNaC::ex x2, const std::string &subscript="")
 Triangle (const Triangle &triangle)
virtual ~Triangle ()
virtual unsigned int no_space_dim () const
virtual Line line (unsigned int i) const
virtual GiNaC::ex repr (Repr_format=SUBS_PERFORMED) const
virtual const std::string str () const
virtual GiNaC::ex integrate (GiNaC::ex f, Repr_format format=SUBS_PERFORMED)
virtual Trianglecopy () const

Protected Member Functions

 Triangle (const std::string &subscript="")

Detailed Description

Definition at line 110 of file Polygon.h.


Constructor & Destructor Documentation

SyFi::Triangle::Triangle ( const std::string &  subscript = "") [protected]

Referenced by copy().

SyFi::Triangle::Triangle ( GiNaC::ex  x0,
GiNaC::ex  x1,
GiNaC::ex  x2,
const std::string &  subscript = "" 
)
SyFi::Triangle::Triangle ( const Triangle triangle)

Definition at line 440 of file Polygon.cpp.

virtual SyFi::Triangle::~Triangle ( ) [inline, virtual]

Definition at line 117 of file Polygon.h.

{}

Member Function Documentation

Triangle * SyFi::Triangle::copy ( ) const [virtual]

Implements SyFi::Polygon.

Reimplemented in SyFi::ReferenceTriangle.

Definition at line 607 of file Polygon.cpp.

References Triangle().

        {
                return new Triangle(*this);
        }
ex SyFi::Triangle::integrate ( GiNaC::ex  f,
Repr_format  format = SUBS_PERFORMED 
) [virtual]

Implements SyFi::Polygon.

Reimplemented in SyFi::ReferenceTriangle.

Definition at line 502 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(), SyFi::Robust::compute_basis_functions(), and main().

        {
                ex ret;

                if ( format == SUBS_PERFORMED )
                {
                        ex t_repr = repr();
                        lst sub;
                        int counter=0;

                        // perform substitution
                        if ( p[0].nops() == 3)
                        {
                                sub = lst(t_repr.op(0), t_repr.op(1), t_repr.op(2));
                                counter = 3;
                        }
                        else if ( p[0].nops() == 2)
                        {
                                sub = lst(t_repr.op(0), t_repr.op(1));
                                counter = 2;
                        }
                        ex intf = func.subs(sub);

                        // compute D
                        ex D;
                        if ( p[0].nops() == 3)
                        {
                                ex r = t_repr.op(3).op(0);
                                ex s = t_repr.op(4).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(1).rhs().coeff(r,1);
                                ex d = t_repr.op(1).rhs().coeff(s,1);
                                ex e = t_repr.op(2).rhs().coeff(r,1);
                                ex f = t_repr.op(2).rhs().coeff(s,1);
                                D = pow(c*f-d*e,2) + pow(a*f - b*e,2) + pow(a*d - b*c,2);
                                D = sqrt(D);
                        }
                        else if ( p[0].nops() == 2)
                        {
                                ex r = t_repr.op(2).op(0);
                                ex s = t_repr.op(3).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(1).rhs().coeff(r,1);
                                ex d = t_repr.op(1).rhs().coeff(s,1);
                                D = abs(a*d-b*c);
                        }

                        intf = intf*D;

                        counter++;
                        intf = GiNaC::integral(t_repr.op(counter).op(0), t_repr.op(counter).op(1), t_repr.op(counter).op(2), intf);
                        intf = eval_integ(intf);

                        counter--;
                        intf = GiNaC::integral(t_repr.op(counter).op(0), t_repr.op(counter).op(1), t_repr.op(counter).op(2), intf);
                        ret = eval_integ(intf);

                }
                else if ( format == SUBS_NOT_PERFORMED )
                {
                        ex t_repr = repr();
                        lst sub;
                        int counter=0;

                        GiNaC::symbol a("a"), b("b"), c("c"), d("d"), e("e"), f("f"), r("r"), s("s"), D("D");

                        // perform substitution
                        if ( p[0].nops() == 3)
                        {
                                sub = lst(x == p[0].op(0) + a*r + b*s,
                                        y == p[0].op(1) + c*r + d*s,
                                        z == p[0].op(2) + e*r + f*s);
                                counter = 3;
                        }
                        else if ( p[0].nops() == 2)
                        {
                                sub = lst(t_repr.op(0), t_repr.op(1));
                                sub = lst(x == p[0].op(0) + a*r + b*s,
                                        y == p[0].op(1) + c*r + d*s);
                                counter = 2;
                        }

                        ex intf = func.subs(sub);

                        counter++;
                        intf = GiNaC::integral(t_repr.op(counter).op(0), t_repr.op(counter).op(1), t_repr.op(counter).op(2), intf);
                        intf = eval_integ(intf);

                        counter--;
                        intf = GiNaC::integral(t_repr.op(counter).op(0), t_repr.op(counter).op(1), t_repr.op(counter).op(2), intf);
                        intf = eval_integ(intf);

                        ret = intf*D;

                }
                else
                {
                        throw std::runtime_error("Invalid format!");
                }

                return ret;
        }
Line SyFi::Triangle::line ( unsigned int  i) const [virtual]

Reimplemented from SyFi::Polygon.

Definition at line 444 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::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), main(), SyFi::normal(), and SyFi::tangent().

        {

                if      ( i == 0) return Line(p[1],p[2], istr(subscript,i));
                else if ( i == 1) return Line(p[0],p[2], istr(subscript,i));
                else if ( i == 2) return Line(p[0],p[1], istr(subscript,i));

                throw std::out_of_range("Line index is out of range!");
        }
unsigned int SyFi::Triangle::no_space_dim ( ) const [virtual]

Implements SyFi::Polygon.

Definition at line 442 of file Polygon.cpp.

{ return 2; }
ex SyFi::Triangle::repr ( Repr_format  format = SUBS_PERFORMED) const [virtual]

Implements SyFi::Polygon.

Definition at line 454 of file Polygon.cpp.

References SyFi::Polygon::p, SyFi::Line::repr(), SyFi::Polygon::vertex(), and SyFi::x.

Referenced by integrate(), and main().

        {
                GiNaC::symbol r("r"), s("s");
                GiNaC::symbol G("G"), H("H");
                ex l1_repr = Line(vertex(0), vertex(1)).repr(r);
                ex l2_repr = Line(vertex(0), vertex(2)).repr(s);
                lst ret;
                //2D
                if ( p[0].nops() == 2)
                {
                        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,
                                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);

                }
                else if ( p[0].nops() == 3)
                {

                        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,
                                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,
                                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);

                }

                ret.append(lst(r, 0, 1));
                ret.append(lst(s, 0, 1 - r));

                return ret;

        }
const string SyFi::Triangle::str ( ) const [virtual]

Implements SyFi::Polygon.

Reimplemented in SyFi::ReferenceTriangle.

Definition at line 494 of file Polygon.cpp.

Referenced by main().

        {
                std::ostringstream s;
                //    s <<"Triangle("<<p[0]<<","<<p[1]<<","<<p[2]<<")";
                s <<"Triangle";
                return s.str();
        }

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator