|
SyFi
0.3
|
Classes | |
| class | ArnoldFalkWintherWeakSymSigma |
| class | ArnoldFalkWintherWeakSymU |
| class | ArnoldFalkWintherWeakSymP |
| class | BrezziDouglasMarini |
| class | Bubble |
| class | CrouzeixRaviart |
| class | VectorCrouzeixRaviart |
| class | DiscontinuousLagrange |
| class | VectorDiscontinuousLagrange |
| class | Dof |
| class | FE |
| class | StandardFE |
| class | SymbolMapBuilderVisitor |
| class | SymbolCounterVisitor |
| class | ExStatsVisitor |
| class | ExStats |
| class | Hermite |
| class | Lagrange |
| class | VectorLagrange |
| class | TensorLagrange |
| class | MixedFE |
| class | Nedelec |
| class | Nedelec2Hdiv |
| class | OrderedPtvSet |
| struct | OrderedPtvSet_is_less |
| class | OrderedPtvSet_i |
| struct | OrderedPtvSet_i_is_less |
| class | P0 |
| class | VectorP0 |
| class | TensorP0 |
| class | Polygon |
| class | Line |
| class | ReferenceLine |
| class | Triangle |
| class | ReferenceTriangle |
| class | Rectangle |
| class | ReferenceRectangle |
| class | Tetrahedron |
| class | ReferenceTetrahedron |
| class | Box |
| class | ReferenceBox |
| class | Simplex |
| class | RaviartThomas |
| class | Robust |
| class | SpaceTimeDomain |
| class | SpaceTimeElement |
Typedefs | |
| typedef std::pair < GiNaC::symbol, GiNaC::ex > | symexpair |
| typedef std::list< std::pair < GiNaC::symbol, GiNaC::ex > > | symexlist |
| typedef std::list< GiNaC::ex > | exlist |
| typedef std::set< GiNaC::ex, GiNaC::ex_is_less > | exset |
| typedef std::map< GiNaC::ex, int, GiNaC::ex_is_less > | ex_int_map |
| typedef std::pair< unsigned int, unsigned int > | pair_ii |
| typedef std::vector< std::pair < unsigned int, unsigned int > > | vector_ii |
Enumerations | |
| enum | Repr_format { SUBS_PERFORMED = 1, SUBS_NOT_PERFORMED = 2 } |
Functions | |
| GiNaC::ex | div (GiNaC::ex v) |
| GiNaC::ex | div (GiNaC::ex v, GiNaC::ex G) |
| GiNaC::ex | div (GiNaC::lst &v) |
| GiNaC::ex | div (GiNaC::lst &v, GiNaC::ex G) |
| GiNaC::ex | div (GiNaC::exvector &v) |
| GiNaC::ex | grad (GiNaC::ex f) |
| GiNaC::ex | grad (GiNaC::ex f, GiNaC::ex G) |
| void | usage (FE &fe) |
| void | usage (FE &v_fe, FE &p_fe) |
| void | compute_Poisson_element_matrix (FE &fe, Dof &dof, std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > &A) |
| void | compute_Stokes_element_matrix (FE &v_fe, FE &p_fe, Dof &dof, std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > &A) |
| void | compute_mixed_Poisson_element_matrix (FE &v_fe, FE &p_fe, Dof &dof, std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > &A) |
| GiNaC::lst | cross (GiNaC::lst &v1, GiNaC::lst &v2) |
| GiNaC::ex | inner (GiNaC::ex a, GiNaC::ex b, bool transposed) |
| GiNaC::ex | inner (GiNaC::lst v1, GiNaC::lst v2) |
| GiNaC::ex | inner (GiNaC::exvector &v1, GiNaC::exvector &v2) |
| GiNaC::lst | matvec (GiNaC::matrix &M, GiNaC::lst &x) |
| GiNaC::ex | matvec (GiNaC::ex A, GiNaC::ex x) |
| GiNaC::lst | ex2equations (GiNaC::ex rel) |
| GiNaC::lst | collapse (GiNaC::lst l) |
| GiNaC::matrix | equations2matrix (const GiNaC::ex &eqns, const GiNaC::ex &symbols) |
| void | matrix_from_equations (const GiNaC::ex &eqns, const GiNaC::ex &symbols, GiNaC::matrix &A, GiNaC::matrix &b) |
| GiNaC::ex | lst_to_matrix2 (const GiNaC::lst &l) |
| GiNaC::lst | matrix_to_lst2 (const GiNaC::ex &m) |
| GiNaC::lst | lst_equals (GiNaC::ex a, GiNaC::ex b) |
| int | find (GiNaC::ex e, GiNaC::lst list) |
| void | visitor_subst_pow (GiNaC::ex e, GiNaC::exmap &map, ex_int_map &intmap, string a) |
| void | check_visitor (GiNaC::ex e, GiNaC::lst &exlist) |
| GiNaC::ex | homogenous_pol (unsigned int order, unsigned int nsd, const string a) |
| GiNaC::lst | homogenous_polv (unsigned int no_fields, unsigned int order, unsigned int nsd, const string a) |
| GiNaC::ex | pol (unsigned int order, unsigned int nsd, const string a) |
| GiNaC::lst | polv (unsigned int no_fields, unsigned int order, unsigned int nsd, const string a) |
| GiNaC::ex | polb (unsigned int order, unsigned int nsd, const string a) |
| GiNaC::lst | coeffs (GiNaC::lst pols) |
| GiNaC::lst | coeffs (GiNaC::ex pol) |
| GiNaC::exvector | coeff (GiNaC::ex pol) |
| GiNaC::exmap | pol2basisandcoeff (GiNaC::ex e, GiNaC::ex s) |
| GiNaC::exmap | pol2basisandcoeff (GiNaC::ex e) |
| GiNaC::ex | legendre1D (const GiNaC::symbol x, unsigned int n) |
| GiNaC::ex | legendre (unsigned int order, unsigned int nsd, const string s) |
| GiNaC::lst | legendrev (unsigned int no_fields, unsigned int order, unsigned int nsd, const string a) |
| bool | compare (const ex &e, const string &s) |
| void | EQUAL_OR_DIE (const ex &e, const string &s) |
| exhashmap< int > | count_symbols (const ex &e) |
| ex | extract_symbols (const ex &e) |
| void | collect_symbols (const GiNaC::ex &e, exset &v) |
| GiNaC::exvector | collect_symbols (const GiNaC::ex &e) |
| bool | compare_archives (const string &first, const string &second, std::ostream &os) |
| ExStats | count_ops (const ex &e) |
| ex | replace_powers (const ex &ein, const list< symbol > &symbols, list< symexpair > &sel, const string &tmpsymbolprefix) |
| bool | compare (const GiNaC::ex &e, const std::string &s) |
| void | EQUAL_OR_DIE (const GiNaC::ex &e, const std::string &s) |
| bool | compare_archives (const std::string &first, const std::string &second, std::ostream &os=std::cout) |
| void | visitor_subst_pow (GiNaC::ex e, GiNaC::exmap &map, ex_int_map &intmap, std::string a) |
| GiNaC::ex | pol (unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::lst | polv (unsigned int no_fields, unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::ex | polb (unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::ex | homogenous_pol (unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::lst | homogenous_polv (unsigned int no_fields, unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::ex | legendre (unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::lst | legendrev (unsigned int no_fields, unsigned int order, unsigned int nsd, const std::string a) |
| GiNaC::exhashmap< int > | count_symbols (const GiNaC::ex &e) |
| GiNaC::ex | extract_symbols (const GiNaC::ex &e) |
| ExStats | count_ops (const GiNaC::ex &e) |
| GiNaC::ex | replace_powers (const GiNaC::ex &e, const std::list< GiNaC::symbol > &symbols, std::list< symexpair > &sel, const std::string &tmpsymbolprefix="p_") |
| GiNaC::ex | lagrange (unsigned int order, Polygon &p, const std::string &a) |
| GiNaC::lst | lagrangev (unsigned int no_fields, unsigned int order, Polygon &p, const std::string &a) |
| std::ostream & | operator<< (std::ostream &os, const OrderedPtvSet &p) |
| std::ostream & | operator<< (std::ostream &os, const OrderedPtvSet_i &p) |
| lst | bezier_ordinates (Tetrahedron &tetrahedra, unsigned int d) |
| lst | interior_coordinates (Tetrahedron &tetrahedra, unsigned int d) |
| lst | bezier_ordinates (Triangle &triangle, unsigned int d) |
| lst | interior_coordinates (Triangle &triangle, unsigned int d) |
| lst | bezier_ordinates (Line &line, unsigned int d) |
| lst | interior_coordinates (Line &line, unsigned int d) |
| ex | barycenter_line (ex p0, ex p1) |
| ex | barycenter_triangle (ex p0, ex p1, ex p2) |
| ex | barycenter_tetrahedron (ex p0, ex p1, ex p2, ex p3) |
| ex | barycenter (Simplex &simplex) |
| ex | bernstein (unsigned int order, Polygon &p, const string &a) |
| lst | bernsteinv (unsigned int no_fields, unsigned int order, Polygon &p, const string &a) |
| lst | normal (Tetrahedron &tetrahedron, unsigned int i) |
| lst | normal (Triangle &triangle, unsigned int i) |
| lst | tangent (Triangle &triangle, unsigned int i) |
| GiNaC::ex | barycenter_line (GiNaC::ex p0, GiNaC::ex p1) |
| GiNaC::ex | barycenter_triangle (GiNaC::ex p0, GiNaC::ex p1, GiNaC::ex p2) |
| GiNaC::ex | barycenter_tetrahedron (GiNaC::ex p0, GiNaC::ex p1, GiNaC::ex p2, GiNaC::ex p3) |
| GiNaC::ex | bernstein (unsigned int order, Polygon &p, const std::string &a) |
| GiNaC::lst | bernsteinv (unsigned int no_fields, unsigned int order, Polygon &p, const std::string &a) |
| void | sort_vector (vector< Ptv > &a) |
| void | set_tolerance (double tolerance) |
| double | mul (const Ptv &a, const Ptv &b) |
| double | norm (const Ptv &a) |
| void | normalize (Ptv &a) |
| void | add (const Ptv &a, const Ptv &b, Ptv &c) |
| void | sub (const Ptv &a, const Ptv &b, Ptv &c) |
| void | cross (const Ptv &a, const Ptv &b, Ptv &c) |
| bool | is_equal (Ptv &a, Ptv &b) |
| bool | line_contains (Ptv &e0, Ptv &e1, Ptv &p) |
| bool | is_inside_triangle (Ptv &e0, Ptv &e1, Ptv &e2, Ptv &p) |
| bool | contains2D (Ptv &e0, Ptv &e1, Ptv &p) |
| bool | contains3D (Ptv &e0, Ptv &e1, Ptv &e2, Ptv &p) |
| GiNaC::symbol | x ("(x is not initialized since initSyFi has never been called)") |
| GiNaC::symbol | y ("(y is not initialized since initSyFi has never been called)") |
| GiNaC::symbol | z ("(z is not initialized since initSyFi has never been called)") |
| GiNaC::symbol | t ("(t is not initialized since initSyFi has never been called)") |
| GiNaC::symbol | infinity ("(infinity is not initialized since initSyFi has never been called)") |
| GiNaC::symbol | DUMMY ("(DUMMY is not initialized since initSyFi has never been called)") |
| void | initSyFi (unsigned int nsd_) |
| bool | symbol_exists (const string &name) |
| const symbol & | get_symbol (const string &name) |
| const symbol & | isymb (const string &a, int b) |
| const symbol & | isymb (const string &a, int b, int c) |
| GiNaC::ex | get_symbolic_vector (int m, const std::string &basename) |
| GiNaC::ex | get_symbolic_matrix (int m, int n, const std::string &basename) |
| bool | symbol_exists (const std::string &name) |
| const GiNaC::symbol & | get_symbol (const std::string &name) |
| const GiNaC::symbol & | isymb (const std::string &a, int b) |
| const GiNaC::symbol & | isymb (const std::string &a, int b, int c) |
| int | dirac (unsigned int i, unsigned int j) |
| string | int2string (int i) |
| string | istr (const string &a, int b) |
| string | istr (const string &a, int b, int c) |
| string | lst2string (GiNaC::lst &l) |
| string | exvector2string (GiNaC::exvector &v) |
| void | print (GiNaC::lst &l) |
| void | print (GiNaC::exvector &v) |
| void | print (std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > &A) |
| void | print (ex_int_map map) |
| void | print (GiNaC::exmap map) |
| std::string | istr (const std::string &a, int b) |
| std::string | istr (const std::string &a, int b, int c) |
Variables | |
| unsigned int | nsd = 2 |
| GiNaC::lst | p |
| map< string, symbol > | symbol_collection |
| GiNaC::symbol | x |
| GiNaC::symbol | y |
| GiNaC::symbol | z |
| GiNaC::symbol | t |
| GiNaC::symbol | infinity |
| GiNaC::symbol | DUMMY |
| const int | version_major = SYFILIB_MAJOR_VERSION |
| const int | version_minor = SYFILIB_MINOR_VERSION |
| const char * | version_micro = SYFILIB_MICRO_VERSION |
| typedef std::map<GiNaC::ex, int, GiNaC::ex_is_less> SyFi::ex_int_map |
Definition at line 40 of file containers.h.
| typedef std::list<GiNaC::ex> SyFi::exlist |
Definition at line 37 of file containers.h.
| typedef std::set<GiNaC::ex, GiNaC::ex_is_less> SyFi::exset |
Definition at line 38 of file containers.h.
| typedef std::pair<unsigned int, unsigned int> SyFi::pair_ii |
| typedef std::list< std::pair<GiNaC::symbol, GiNaC::ex> > SyFi::symexlist |
Definition at line 34 of file containers.h.
| typedef std::pair<GiNaC::symbol, GiNaC::ex> SyFi::symexpair |
Definition at line 33 of file containers.h.
| typedef std::vector< std::pair<unsigned int, unsigned int> > SyFi::vector_ii |
| enum SyFi::Repr_format |
Definition at line 27 of file Polygon.h.
{
SUBS_PERFORMED = 1,
SUBS_NOT_PERFORMED = 2
};
Definition at line 76 of file Ptv_tools.cpp.
References Ptv::redim(), and Ptv::size().
| GiNaC::ex SyFi::barycenter | ( | Simplex & | simplex | ) |
Definition at line 1768 of file Polygon.cpp.
References get_symbolic_vector(), SyFi::Polygon::no_vertices(), nsd, and SyFi::Polygon::vertex().
Referenced by main().
{
if (nsd != simplex.no_vertices()-1)
{
throw std::runtime_error("Could not compute the barycentric coordinates. Not implemented yet for simplices with no_vertices != nsd +1.");
}
// put symbols in lst
ex b = get_symbolic_vector(simplex.no_vertices(), "b");
lst symbols;
for (unsigned int i=0; i<b.nops(); i++)
{
symbols.append(b.op(i));
}
// put equations in lst
lst eqs;
for (unsigned int i=0; i<nsd; i++)
{
ex sum = 0;
for (unsigned int k=0; k< simplex.no_vertices(); k++)
{
sum += b.op(k)*simplex.vertex(k).op(i);
}
ex eqi = p[i] == sum;
eqs.append(eqi);
}
// last eq, sum = 1
ex sum = 0;
for (unsigned int i=0; i<symbols.nops(); i++)
{
sum += symbols.op(i);
}
ex last_eq = 1 == sum;
eqs.append(last_eq);
// solve equations
ex sol = lsolve(eqs, symbols);
return sol;
}
| GiNaC::ex SyFi::barycenter_line | ( | GiNaC::ex | p0, |
| GiNaC::ex | p1 | ||
| ) |
| ex SyFi::barycenter_line | ( | ex | p0, |
| ex | p1 | ||
| ) |
Definition at line 1623 of file Polygon.cpp.
References x.
Referenced by bernstein().
{
ex sol;
// 1D
if (!GiNaC::is_a<lst>(p0))
{
GiNaC::symbol b0("b0"), b1("b1");
ex eq1 = x == b0*p0 + b1*p1;
ex eq2 = 1 == b0 + b1;
sol = lsolve(lst(eq1, eq2), lst(b0, b1));
}
else if (p0.nops() == 1 && p1.nops() == 1)
{
GiNaC::symbol b0("b0"), b1("b1");
ex eq1 = x == b0*p0.op(0) + b1*p1.op(0);
ex eq2 = 1 == b0 + b1;
sol = lsolve(lst(eq1, eq2), lst(b0, b1));
if ( sol == 0 )
{
ex eq1 = y == b0*p0.op(1) + b1*p1.op(1);
sol = lsolve(lst(eq1, eq2), lst(b0, b1));
}
if ( sol == 0 )
{
ex eq1 = z == b0*p0.op(2) + b1*p1.op(2);
sol = lsolve(lst(eq1, eq2), lst(b0, b1));
}
}
//2D
else if ( p0.nops() == 2 && p1.nops() == 2 )
{
GiNaC::symbol b0("b0"), b1("b1");
ex eq1 = x == b0*p0.op(0) + b1*p1.op(0);
ex eq3 = 1 == b0 + b1;
sol = lsolve(lst(eq1, eq3), lst(b0, b1));
if (sol.nops() == 0)
{
ex eq2 = y == b0*p0.op(1) + b1*p1.op(1);
sol = lsolve(lst(eq2, eq3), lst(b0, b1));
}
}
//3D
else if ( p0.nops() == 3 && p1.nops() == 3 )
{
GiNaC::symbol b0("b0"), b1("b1");
ex eq1 = x == b0*p0.op(0) + b1*p1.op(0);
ex eq4 = 1 == b0 + b1;
sol = lsolve(lst(eq1, eq4), lst(b0, b1));
if (sol.nops() == 0)
{
ex eq2 = y == b0*p0.op(1) + b1*p1.op(1);
sol = lsolve(lst(eq2, eq4), lst(b0, b1));
}
if (sol.nops() == 0)
{
ex eq3 = z == b0*p0.op(2) + b1*p1.op(2);
sol = lsolve(lst(eq3, eq4), lst(b0, b1));
}
}
else
{
throw std::runtime_error("Could not compute the barycentric coordinates. Check the coordinates.");
}
return sol;
}
| GiNaC::ex SyFi::barycenter_tetrahedron | ( | GiNaC::ex | p0, |
| GiNaC::ex | p1, | ||
| GiNaC::ex | p2, | ||
| GiNaC::ex | p3 | ||
| ) |
| ex SyFi::barycenter_tetrahedron | ( | ex | p0, |
| ex | p1, | ||
| ex | p2, | ||
| ex | p3 | ||
| ) |
Definition at line 1752 of file Polygon.cpp.
References x.
Referenced by barycenter_triangle(), bernstein(), and SyFi::Bubble::compute_basis_functions().
{
GiNaC::symbol b0("b0"), b1("b1"), b2("b2"), b3("b3");
// 3D
ex eq1 = x == b0*p0.op(0) + b1*p1.op(0) + b2*p2.op(0) + b3*p3.op(0);
ex eq2 = y == b0*p0.op(1) + b1*p1.op(1) + b2*p2.op(1) + b3*p3.op(1);
ex eq3 = z == b0*p0.op(2) + b1*p1.op(2) + b2*p2.op(2) + b3*p3.op(2);
ex eq4 = 1 == b0 + b1 + b2 +b3;
ex sol = lsolve(lst(eq1, eq2, eq3, eq4), lst(b0, b1, b2, b3));
return sol;
}
| GiNaC::ex SyFi::barycenter_triangle | ( | GiNaC::ex | p0, |
| GiNaC::ex | p1, | ||
| GiNaC::ex | p2 | ||
| ) |
| ex SyFi::barycenter_triangle | ( | ex | p0, |
| ex | p1, | ||
| ex | p2 | ||
| ) |
Definition at line 1691 of file Polygon.cpp.
References barycenter_tetrahedron(), cross(), and x.
Referenced by bernstein(), and SyFi::Bubble::compute_basis_functions().
{
ex sol;
// 2D
if ( p0.nops() == 2 && p1.nops() == 2 && p2.nops() == 2)
{
GiNaC::symbol b0("b0"), b1("b1"), b2("b2");
ex eq1 = x == b0*p0.op(0) + b1*p1.op(0) + b2*p2.op(0);
ex eq2 = y == b0*p0.op(1) + b1*p1.op(1) + b2*p2.op(1);
ex eq3 = 1 == b0 + b1 + b2;
sol = lsolve(lst(eq1, eq2, eq3), lst(b0, b1, b2));
}
// 3D
else if ( p0.nops() == 3 && p1.nops() == 3 && p2.nops() == 3)
{
lst n1(p1.op(0) - p0.op(0), p1.op(1) - p0.op(1), p1.op(2) - p0.op(2));
lst n2 = lst(p2.op(0) - p0.op(0), p2.op(1) - p0.op(1), p2.op(2) - p0.op(2));
lst n = cross(n1,n2);
lst midpoint = lst((p0.op(0) + p1.op(0) + p2.op(0))/3,
(p0.op(1) + p1.op(1) + p2.op(1))/3,
(p0.op(2) + p1.op(2) + p2.op(2))/3);
ex p3 = lst(midpoint.op(0) + n.op(0),
midpoint.op(1) + n.op(1),
midpoint.op(2) + n.op(2));
ex s = barycenter_tetrahedron(p0, p1, p2, p3);
lst solution;
for (unsigned int i=0; i<s.nops(); i++)
{
ex d = s.op(i).subs(x == p3.op(0)).subs(y == p3.op(1)).subs(z == p3.op(2));
d = d.rhs();
if ( GiNaC::is_a<GiNaC::numeric>(d))
{
// FIXME: bad test, should use the toleranse variable set by CLN or something
if ( GiNaC::abs(GiNaC::ex_to<GiNaC::numeric>(d)) < 10e-8)
{
solution.append(s.op(i));
}
}
else
{
if ( d.is_zero() )
{
solution.append(s.op(i));
}
}
}
sol = solution;
}
else
{
throw std::runtime_error("Could not compute the barycentric coordinates. Check the coordinates.");
}
return sol;
}
| GiNaC::ex SyFi::bernstein | ( | unsigned int | order, |
| Polygon & | p, | ||
| const std::string & | a | ||
| ) |
| ex SyFi::bernstein | ( | unsigned int | order, |
| Polygon & | p, | ||
| const string & | a | ||
| ) |
Definition at line 1810 of file Polygon.cpp.
References barycenter_line(), barycenter_tetrahedron(), barycenter_triangle(), get_symbolic_matrix(), matrix_to_lst2(), SyFi::Polygon::str(), and SyFi::Polygon::vertex().
Referenced by bernsteinv(), SyFi::Lagrange::compute_basis_functions(), SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), and main().
{
if ( order < 0 )
{
throw(std::logic_error("Can not create polynomials of order less than 0!"));
}
ex ret; // ex to return
int dof; // degrees of freedom
ex A; // ex holding the coefficients a_0 .. a_dof
lst basis;
if ( p.str().find("Line") != string::npos )
{
ex bary = barycenter_line(p.vertex(0), p.vertex(1));
ex b0= bary.op(0).rhs();
ex b1= bary.op(1).rhs();
dof = order+1;
A = get_symbolic_matrix(1,dof, a);
int o=0;
for (GiNaC::const_iterator i = A.begin(); i != A.end(); ++i)
{
ex scale = GiNaC::binomial(order,o);
ret += (*i)*scale*pow(b0,o)*pow(b1,order-o);
basis.append(scale*pow(b0,o)*pow(b1,order-o));
o++;
}
}
else if ( p.str().find("Triangle") != string::npos )
{
dof = (order+1)*(order+2)/2;
A = get_symbolic_matrix(1, dof , a);
ex bary = barycenter_triangle(p.vertex(0), p.vertex(1), p.vertex(2));
ex b0= bary.op(0).rhs();
ex b1= bary.op(1).rhs();
ex b2= bary.op(2).rhs();
size_t i=0;
for (unsigned int o1 = 0; o1 <= order; o1++)
{
for (unsigned int o2 = 0; o2 <= order; o2++)
{
for (unsigned int o3 = 0; o3 <= order; o3++)
{
if ( o1 + o2 + o3 == order )
{
ex scale = (GiNaC::factorial(order)/(GiNaC::factorial(o1)*GiNaC::factorial(o2)*GiNaC::factorial(o3)));
ret += A.op(i)*scale*pow(b0,o1)*pow(b1,o2)*pow(b2,o3);
basis.append(scale*pow(b0,o1)*pow(b1,o2)*pow(b2,o3));
i++;
}
}
}
}
}
else if ( p.str().find("Tetrahedron") != string::npos )
{
dof = 0;
for (unsigned int j=0; j<= order; j++)
{
dof += (j+1)*(j+2)/2;
}
A = get_symbolic_matrix(1, dof , a);
ex bary = barycenter_tetrahedron(p.vertex(0), p.vertex(1), p.vertex(2), p.vertex(3));
ex b0= bary.op(0).rhs();
ex b1= bary.op(1).rhs();
ex b2= bary.op(2).rhs();
ex b3= bary.op(3).rhs();
size_t i=0;
for (unsigned int o1 = 0; o1 <= order; o1++)
{
for (unsigned int o2 = 0; o2 <= order; o2++)
{
for (unsigned int o3 = 0; o3 <= order; o3++)
{
for (unsigned int o4 = 0; o4 <= order; o4++)
{
if ( o1 + o2 + o3 + o4 == order )
{
ex scale = (GiNaC::factorial(order)/(GiNaC::factorial(o1)*GiNaC::factorial(o2)*GiNaC::factorial(o3)*GiNaC::factorial(o4)));
ret += A.op(i)*scale*pow(b0,o1)*pow(b1,o2)*pow(b2,o3)*pow(b3,o4);
basis.append(scale*pow(b0,o1)*pow(b1,o2)*pow(b2,o3)*pow(b3,o4));
i++;
}
}
}
}
}
}
else if (p.str() == "Simplex" || p.str() == "ReferenceSimplex")
{
throw std::runtime_error("Not implemented yet.");
// ex bary = barycenter(p);
}
return lst(ret,matrix_to_lst2(A),basis);
}
| GiNaC::lst SyFi::bernsteinv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| Polygon & | p, | ||
| const std::string & | a | ||
| ) |
| lst SyFi::bernsteinv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| Polygon & | p, | ||
| const string & | a | ||
| ) |
Definition at line 1917 of file Polygon.cpp.
References bernstein(), pol(), and SyFi::Polygon::str().
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
if ( order < 0 )
{
throw(std::logic_error("Can not create polynomials of order less than 0!"));
}
lst ret1; // contains the polynom
lst ret2; // contains the coefficients
lst ret3; // constains the basis functions
lst basis_tmp;
for (unsigned int i=0; i< no_fields; i++)
{
lst basis;
std::ostringstream s;
s <<a<<""<<i<<"_";
ex pol = bernstein(order, p, s.str());
ret1.append(pol.op(0));
ret2.append(pol.op(1));
basis_tmp = ex_to<lst>(pol.op(2));
for (lst::const_iterator basis_iterator = basis_tmp.begin();
basis_iterator != basis_tmp.end(); ++basis_iterator)
{
lst tmp_lst;
for (unsigned int d=1; d<=no_fields; d++) tmp_lst.append(0);
tmp_lst.let_op(i) = (*basis_iterator);
ret3.append(tmp_lst);
}
}
return lst(ret1,ret2,ret3);
}
| GiNaC::lst SyFi::bezier_ordinates | ( | Tetrahedron & | tetrahedra, |
| unsigned int | d | ||
| ) |
Definition at line 1392 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
Referenced by SyFi::Lagrange::compute_basis_functions(), and main().
{
//FIXME: ugly conversion to matrix
lst ret;
ex V1 = tetrahedra.vertex(0);
ex V2 = tetrahedra.vertex(1);
ex V3 = tetrahedra.vertex(2);
ex V4 = tetrahedra.vertex(3);
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
lst V3l = ex_to<lst>(V3);
lst V4l = ex_to<lst>(V4);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
ex V3m = lst_to_matrix2(V3l);
ex V4m = lst_to_matrix2(V4l);
int l;
for (unsigned int i=0; i<= d; i++)
{
for (unsigned int j=0; j<= d; j++)
{
for (unsigned int k=0; k<= d; k++)
{
if ( d - i - j -k >= 0 )
{
l= d - i - j -k;
ex sum = (l*V1m + k*V2m + j*V3m + i*V4m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
}
}
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
return ret;
}
| GiNaC::lst SyFi::bezier_ordinates | ( | Triangle & | triangle, |
| unsigned int | d | ||
| ) |
Definition at line 1477 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
{
//FIXME: ugly conversion to matrix
lst ret;
ex V1 = triangle.vertex(0);
ex V2 = triangle.vertex(1);
ex V3 = triangle.vertex(2);
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
lst V3l = ex_to<lst>(V3);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
ex V3m = lst_to_matrix2(V3l);
int k;
for (unsigned int i=0; i <= d; i++)
{
for (unsigned int j=0; j <= d; j++)
{
if ( int(d) - int(i) - int(j) >= 0 )
{
k = d - i - j;
ex sum = (k*V1m + j*V2m + i*V3m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
}
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
return ret;
}
| GiNaC::lst SyFi::bezier_ordinates | ( | Line & | line, |
| unsigned int | d | ||
| ) |
Definition at line 1551 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
{
lst ret;
ex V1 = line.vertex(0);
ex V2 = line.vertex(1);
if (!GiNaC::is_a<lst>(V1))
{
int k;
for (unsigned int i=0; i <= d; i++)
{
k = d - i;
ex sum = (k*V1 + i*V2)/d;
ret.append(sum);
}
}
else
{
//FIXME: ugly conversion to matrix
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
int k;
for (unsigned int i=0; i <= d; i++)
{
k = d - i;
ex sum = (k*V1m + i*V2m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
}
return ret;
}
| void SyFi::check_visitor | ( | GiNaC::ex | e, |
| GiNaC::lst & | exlist | ||
| ) |
Definition at line 461 of file ginac_tools.cpp.
References find().
{
if (find(e, exlist) >= 0) return;
// cout <<"ex e "<<e<<endl;
if (GiNaC::is_a<GiNaC::numeric>(e))
{
}
else if (GiNaC::is_a<GiNaC::add>(e) )
{
// cout <<"e "<<e <<endl;
// cout <<"e.nops() "<<e.nops() <<endl;
if (e.nops() > 4 && e.nops() < 10 ) exlist.append(e);
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"add e "<<e2<<endl;
// exlist.append(e2);
check_visitor(e2,exlist);
}
}
else if (GiNaC::is_a<GiNaC::mul>(e))
{
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"mul e "<<e2<<endl;
exlist.append(e2);
check_visitor(e2,exlist);
}
}
else if (GiNaC::is_a<GiNaC::lst>(e))
{
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"GiNaC::lst e "<<e2<<endl;
// exlist.append(e2);
check_visitor(e2,exlist);
}
}
else if (GiNaC::is_exactly_a<GiNaC::power>(e))
{
exlist.append(e);
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"power e "<<e2<<endl;
check_visitor(e2,exlist);
}
}
else if (GiNaC::is_a<GiNaC::function>(e))
{
exlist.append(e);
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"function e "<<e2<<endl;
check_visitor(e2,exlist);
}
}
else
{
// exlist.append(e);
// cout <<"atom e "<<e<<endl;
}
exlist.sort();
exlist.unique();
}
| GiNaC::exvector SyFi::coeff | ( | GiNaC::ex | pol | ) |
Definition at line 855 of file ginac_tools.cpp.
References test_syfi::debug::c, x, y, and z.
Referenced by SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::exvector cc;
GiNaC::ex c, b;
for (int i=pol.ldegree(x); i<=pol.degree(x); ++i)
{
for (int j=pol.ldegree(y); j<=pol.degree(y); ++j)
{
for (int k=pol.ldegree(z); k<=pol.degree(z); ++k)
{
c = pol.coeff(x,i).coeff(y, j).coeff(z,k);
if ( c != 0 ) cc.insert(cc.begin(),c);
}
}
}
return cc;
}
| GiNaC::lst SyFi::coeffs | ( | GiNaC::lst | pols | ) |
Definition at line 819 of file ginac_tools.cpp.
References collapse().
| GiNaC::lst SyFi::coeffs | ( | GiNaC::ex | pol | ) |
Definition at line 832 of file ginac_tools.cpp.
References test_syfi::debug::c, x, y, and z.
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::lst cc;
GiNaC::ex c, b;
for (int i=pol.ldegree(x); i<=pol.degree(x); ++i)
{
for (int j=pol.ldegree(y); j<=pol.degree(y); ++j)
{
for (int k=pol.ldegree(z); k<=pol.degree(z); ++k)
{
c = pol.coeff(x,i).coeff(y, j).coeff(z,k);
if ( c != 0 ) cc.append(c);
}
}
}
return cc;
}
| GiNaC::lst SyFi::collapse | ( | GiNaC::lst | l | ) |
Definition at line 214 of file ginac_tools.cpp.
Referenced by coeffs(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
GiNaC::lst lc;
GiNaC::lst::const_iterator iter1, iter2;
for (iter1 = l.begin(); iter1 != l.end(); ++iter1)
{
if (GiNaC::is_a<GiNaC::lst>(*iter1))
{
for (iter2 = GiNaC::ex_to<GiNaC::lst>(*iter1).begin(); iter2 != GiNaC::ex_to<GiNaC::lst>(*iter1).end(); ++iter2)
{
lc.append(*iter2);
}
}
else
{
lc.append(*iter1);
}
}
lc.sort();
lc.unique();
return lc;
}
| void SyFi::collect_symbols | ( | const GiNaC::ex & | e, |
| exset & | v | ||
| ) |
Definition at line 1234 of file ginac_tools.cpp.
References test_syfi::debug::v.
Referenced by collect_symbols().
{
if (GiNaC::is_a<GiNaC::symbol>(e))
{
v.insert(e);
}
else
{
for (size_t i=0; i<e.nops(); i++)
{
collect_symbols(e.op(i), v);
}
}
}
| GiNaC::exvector SyFi::collect_symbols | ( | const GiNaC::ex & | e | ) |
Definition at line 1250 of file ginac_tools.cpp.
References collect_symbols(), and test_syfi::debug::v.
{
exset s;
collect_symbols(e, s);
GiNaC::exvector v(s.size());
for(exset::iterator i=s.begin(); i!= s.end(); i++)
{
v.push_back(*i);
}
return v;
}
| bool SyFi::compare | ( | const GiNaC::ex & | e, |
| const std::string & | s | ||
| ) |
| bool SyFi::compare | ( | const ex & | e, |
| const string & | s | ||
| ) |
Definition at line 1087 of file ginac_tools.cpp.
Referenced by EQUAL_OR_DIE().
{
ostringstream ss;
ss << e;
return ss.str() == s;
}
| bool SyFi::compare_archives | ( | const std::string & | first, |
| const std::string & | second, | ||
| std::ostream & | os = std::cout |
||
| ) |
| bool SyFi::compare_archives | ( | const string & | first, |
| const string & | second, | ||
| std::ostream & | os | ||
| ) |
Definition at line 1263 of file ginac_tools.cpp.
References extract_symbols().
Referenced by check_CrouzeixRaviart(), and main().
{
bool ret = true;
// read both archives
archive a1, a2;
ifstream if1(first.c_str()), if2(second.c_str());
if1 >> a1;
if2 >> a2;
// compare size
int n = a1.num_expressions();
int n2 = a2.num_expressions();
if(n != n2)
{
os << "Archives " << first << " and " << second
<< " has a different number of expressions, " << n << " and " << n2 << "." << endl;
os << "Comparing common expressions." << endl;
ret = false;
}
// iterate over all expressions in first archive
ex e1,e2;
for(int i=0; i<n; i++)
{
lst syms;
string exname;
e1 = a1.unarchive_ex(syms, exname, i);
syms = ex_to<lst>(extract_symbols(e1));
// os << "Comparing " << exname << " with symbols " << syms << endl;
// is this in the second archive?
try
{
e2 = a2.unarchive_ex(syms, exname.c_str());
// got it, now compare
bool isequal = is_zero(e1-e2);
if(!isequal)
{
if(ret)
{
os << "Archives " << first << " and " << second
<< " are not equal, details follow:" << endl;
}
os << "Expression with name " << exname << " is not equal:" << endl;
os << "First: " << endl << e1 << endl;
os << "Second: " << endl << e2 << endl;
ret = false;
}
}
catch(...)
{
os << "Expression " << exname << " is missing from " << second << "." << endl;
ret = false;
}
}
return ret;
}
| void SyFi::compute_mixed_Poisson_element_matrix | ( | FE & | v_fe, |
| FE & | p_fe, | ||
| Dof & | dof, | ||
| std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > & | A | ||
| ) |
Definition at line 150 of file ElementComputations.cpp.
References div(), SyFi::FE::dof(), SyFi::FE::get_polygon(), SyFi::Dof::glob_dof(), inner(), SyFi::Dof::insert_dof(), SyFi::Polygon::integrate(), SyFi::FE::N(), and SyFi::FE::nbf().
Referenced by main().
{
std::pair<unsigned int,unsigned int> index;
std::pair<unsigned int,unsigned int> index2;
// FIXME: need to check that p_fe
// contains the same domain
Polygon& domain = v_fe.get_polygon();
// Insert the local degrees of freedom into the global Dof
for (unsigned int i=0; i< v_fe.nbf(); i++)
{
dof.insert_dof(1,i,v_fe.dof(i));
}
for (unsigned int i=0; i< p_fe.nbf(); i++)
{
dof.insert_dof(1,v_fe.nbf()+i+1,p_fe.dof(i));
}
// The term (u,v)
for (unsigned int i=0; i< v_fe.nbf(); i++)
{
// fetch the global dof related to i and v
index.first = dof.glob_dof(v_fe.dof(i));
for (unsigned int j=0; j< v_fe.nbf(); j++)
{
// fetch the global dof related to j and p
index.second = dof.glob_dof(v_fe.dof(j));
// compute the integrand
GiNaC::ex mass = inner(v_fe.N(i),v_fe.N(j));
// compute the integral
GiNaC::ex Aij = domain.integrate(mass);
A[index] += Aij; // add to global matrix
}
}
// The term -(div u, q)
for (unsigned int i=0; i< p_fe.nbf(); i++)
{
// fetch the global dof for p_i
index.first = dof.glob_dof(p_fe.dof(i));
for (unsigned int j=0; j< v_fe.nbf(); j++)
{
// fetch the global dof for v_j
index.second=dof.glob_dof(v_fe.dof(j));
// compute the integrand
GiNaC::ex divV= -p_fe.N(i)*div(v_fe.N(j));
// compute the integral
GiNaC::ex Aij = domain.integrate(divV);
A[index] += Aij; // add to global matrix
// Do not need to compute the term (grad(p),v), since the system is
// symmetric we simply set Aji = Aij
index2.first = index.second;
index2.second = index.first;
A[index2] += Aij;
}
}
}
| void SyFi::compute_Poisson_element_matrix | ( | FE & | fe, |
| Dof & | dof, | ||
| std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > & | A | ||
| ) |
Definition at line 52 of file ElementComputations.cpp.
References SyFi::FE::dof(), SyFi::FE::get_polygon(), SyFi::Dof::glob_dof(), grad(), inner(), SyFi::Dof::insert_dof(), SyFi::Polygon::integrate(), SyFi::FE::N(), and SyFi::FE::nbf().
{
std::pair<unsigned int,unsigned int> index;
// Insert the local degrees of freedom into the global Dof
for (unsigned int i=0; i< fe.nbf(); i++)
{
dof.insert_dof(1,i,fe.dof(i));
}
Polygon& domain = fe.get_polygon();
// The term (grad u, grad v)
for (unsigned int i=0; i< fe.nbf(); i++)
{
// fetch the global dof for Ni
index.first = dof.glob_dof(fe.dof(i));
for (unsigned int j=0; j< fe.nbf(); j++)
{
// fetch the global dof for Nj
index.second = dof.glob_dof(fe.dof(j));
// compute the integrand
GiNaC::ex nabla = inner(grad(fe.N(i)),
grad(fe.N(j)));
// compute the integral
GiNaC::ex Aij = domain.integrate(nabla);
A[index] += Aij; // add to global matrix
}
}
}
| void SyFi::compute_Stokes_element_matrix | ( | FE & | v_fe, |
| FE & | p_fe, | ||
| Dof & | dof, | ||
| std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > & | A | ||
| ) |
Definition at line 86 of file ElementComputations.cpp.
References div(), SyFi::FE::dof(), SyFi::FE::get_polygon(), SyFi::Dof::glob_dof(), grad(), inner(), SyFi::Dof::insert_dof(), SyFi::Polygon::integrate(), SyFi::FE::N(), and SyFi::FE::nbf().
Referenced by main().
{
std::pair<unsigned int,unsigned int> index;
std::pair<unsigned int,unsigned int> index2;
// FIXME: need to check that p_fe
// contains the same domain
Polygon& domain = v_fe.get_polygon();
// Insert the local degrees of freedom into the global Dof
for (unsigned int i=0; i< v_fe.nbf(); i++)
{
dof.insert_dof(1,i,v_fe.dof(i));
}
for (unsigned int i=0; i< p_fe.nbf(); i++)
{
dof.insert_dof(1,v_fe.nbf()+i,p_fe.dof(i));
}
// The term (grad u, grad v)
for (unsigned int i=0; i< v_fe.nbf(); i++)
{
// fetch the global dof for v_i
index.first = dof.glob_dof(v_fe.dof(i));
for (unsigned int j=0; j< v_fe.nbf(); j++)
{
// fetch the global dof for v_j
index.second = dof.glob_dof(v_fe.dof(j));
GiNaC::ex nabla = inner(grad(v_fe.N(i)),
grad(v_fe.N(j)));// compute the integrand
// compute the integral
GiNaC::ex Aij = domain.integrate(nabla);
A[index] += Aij; // add to global matrix
}
}
// The term -(div u, q)
for (unsigned int i=0; i< p_fe.nbf(); i++)
{
// fetch the global dof for p_i
index.first = dof.glob_dof(p_fe.dof(i));
for (unsigned int j=0; j< v_fe.nbf(); j++)
{
// fetch the global dof for v_j
index.second=dof.glob_dof(v_fe.dof(j));
// compute the integrand
GiNaC::ex divV= -p_fe.N(i)*div(v_fe.N(j));
// compute the integral
GiNaC::ex Aij = domain.integrate(divV);
A[index] += Aij; // add to global matrix
// Do not need to compute the term (grad(p),v), since the system is
// symmetric. We simply set Aji = Aij
index2.first = index.second;
index2.second = index.first;
A[index2] += Aij;
}
}
}
| bool SyFi::contains2D | ( | Ptv & | e0, |
| Ptv & | e1, | ||
| Ptv & | p | ||
| ) |
Definition at line 201 of file Ptv_tools.cpp.
References line_contains(), and Ptv::size().
{
if ( e0.size() != e1.size() || e0.size() != p.size() )
{
throw(std::logic_error("Exception from contains2D(Ptv&, Ptv&, Ptv&): The dimentions of a and b must be the same."));
}
bool b = line_contains(e0, e1, p);
return b;
}
| bool SyFi::contains3D | ( | Ptv & | e0, |
| Ptv & | e1, | ||
| Ptv & | e2, | ||
| Ptv & | p | ||
| ) |
Definition at line 214 of file Ptv_tools.cpp.
References is_equal(), is_inside_triangle(), and line_contains().
{
// check if p is either e0, e1, or e2
if ( is_equal(e0, p) ) return true;
else if ( is_equal(e1, p) ) return true;
else if ( is_equal(e2, p) ) return true;
// check if p is on the lines connecting e0, e1, and e2
if ( line_contains(e0, e1, p) ) return true;
else if ( line_contains(e1, e2, p) ) return true;
else if ( line_contains(e2, e1, p) ) return true;
// check if p is inside the triangle with verticies e0, e1, and e2
if ( is_inside_triangle(e0, e1, e2, p) ) return true;
return false;
}
| ExStats SyFi::count_ops | ( | const GiNaC::ex & | e | ) |
| ExStats SyFi::count_ops | ( | const ex & | e | ) |
Definition at line 1378 of file ginac_tools.cpp.
References SyFi::ExStatsVisitor::es, and test_syfi::debug::v.
Referenced by main(), and print().
{
//cout << "count_ops " << e << endl;
//cout << "is an add: " << GiNaC::is<GiNaC::add>(e) << endl;
//cout << "is a mul: " << GiNaC::is<GiNaC::mul>(e) << endl;
ExStatsVisitor v;
e.traverse(v);
return v.es;
}
| GiNaC::exhashmap<int> SyFi::count_symbols | ( | const GiNaC::ex & | e | ) |
| exhashmap<int> SyFi::count_symbols | ( | const ex & | e | ) |
Definition at line 1167 of file ginac_tools.cpp.
References SyFi::SymbolCounterVisitor::symbolcount, and test_syfi::debug::v.
Referenced by print().
{
SymbolCounterVisitor v;
e.traverse(v);
return v.symbolcount;
}
| GiNaC::lst SyFi::cross | ( | GiNaC::lst & | v1, |
| GiNaC::lst & | v2 | ||
| ) |
Definition at line 34 of file ginac_tools.cpp.
Referenced by barycenter_triangle(), SyFi::Nedelec::compute_basis_functions(), line_contains(), and normal().
{
GiNaC::lst ret;
if ( v1.nops() != v2.nops() )
{
cout <<"incompatible vectors "<<endl;
cout <<"v1.nops() "<<v1.nops();
cout <<" v2.nops() "<<v2.nops()<<endl; ;
return GiNaC::lst();
}
ret.append( v1.op(1)*v2.op(2) - v1.op(2)*v2.op(1));
ret.append(- v1.op(0)*v2.op(2) + v1.op(2)*v2.op(0));
ret.append( v1.op(0)*v2.op(1) - v1.op(1)*v2.op(0));
return ret;
}
| void SyFi::cross | ( | const Ptv & | a, |
| const Ptv & | b, | ||
| Ptv & | c | ||
| ) |
Definition at line 104 of file Ptv_tools.cpp.
References Ptv::redim(), and Ptv::size().
{
if ( a.size() != b.size() )
{
throw(std::logic_error("Exception from cross (const Ptv&, const Ptv&, Ptv&): The dimentions of a and b must be the same."));
}
if ( a.size() == 2 )
{
c.redim(1);
c[0] = a[0]*b[1] - a[1]*b[0];
}
else if ( a.size() == 3 )
{
c.redim(3);
c[0] = a[1]*b[2] - b[1]*a[2];
c[1] = - a[0]*b[2] + b[0]*a[2];
c[2] = a[0]*b[1] - b[0]*a[1];
}
else
{
throw(std::logic_error("The cross product can only be computed in 2D and 3D."));
}
}
| int SyFi::dirac | ( | unsigned int | i, |
| unsigned int | j | ||
| ) |
Definition at line 34 of file utilities.cpp.
Referenced by SyFi::CrouzeixRaviart::compute_basis_functions(), and main().
{
if (i==j) return 1;
else return 0;
}
| GiNaC::ex SyFi::div | ( | GiNaC::ex | v | ) |
Definition at line 45 of file diff_tools.cpp.
References test_syfi::debug::c, nsd, test_syfi::debug::v, x, y, and z.
Referenced by SyFi::Robust::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), compute_mixed_Poisson_element_matrix(), compute_Stokes_element_matrix(), div(), and main().
{
using SyFi::nsd;
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::ex ret;
if (GiNaC::is_a<GiNaC::matrix>(v))
{
GiNaC::matrix m = GiNaC::ex_to<GiNaC::matrix>(v);
if ( m.cols() == 1 && m.rows() == nsd )
{
if (nsd == 1)
{
ret = diff(m,x);
}
else if (nsd == 2)
{
ret = diff(m.op(0),x) + diff(m.op(1),y) ;
}
else if (nsd == 3)
{
ret = diff(m.op(0),x) + diff(m.op(1),y) + diff(m.op(2),z) ;
}
else
{
throw std::runtime_error("Invalid nsd");
}
}
else
{
GiNaC::matrix retm = GiNaC::matrix(m.cols(),1);
if ( nsd != m.rows() )
{
throw(std::invalid_argument("The number of rows must equal nsd."));
}
GiNaC::symbol xr;
GiNaC::ex tmp;
for (unsigned int c=0; c<m.cols(); c++)
{
for (unsigned int r=0; r<m.rows(); r++)
{
if (r+1 == 1) xr = x;
if (r+1 == 2) xr = y;
if (r+1 == 3) xr = z;
retm(c,0) += diff(m(c,r), xr);
}
}
ret = retm;
}
return ret;
}
else if (GiNaC::is_a<GiNaC::lst>(v))
{
GiNaC::lst l = GiNaC::ex_to<GiNaC::lst>(v);
return div(l);
}
throw std::invalid_argument("v must be a matrix or lst.");
}
| GiNaC::ex SyFi::div | ( | GiNaC::ex | v, |
| GiNaC::ex | G | ||
| ) |
Definition at line 108 of file diff_tools.cpp.
References div(), nsd, test_syfi::debug::v, x, y, and z.
{
using SyFi::nsd;
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::ex ret;
if (GiNaC::is_a<GiNaC::matrix>(v) && GiNaC::is_a<GiNaC::matrix>(G))
{
GiNaC::matrix m = GiNaC::ex_to<GiNaC::matrix>(v);
GiNaC::matrix GG = GiNaC::ex_to<GiNaC::matrix>(G);
if ( m.cols() == 1 && m.rows() == nsd && GG.rows() == nsd && GG.cols() == nsd )
{
if ( nsd == 1 || nsd == 2 || nsd == 3)
{
ret = GiNaC::numeric(0);
GiNaC::symbol xj;
for (unsigned int i=0; i< nsd; i++)
{
for (unsigned int j=0; j< nsd; j++)
{
if (j == 0) xj = x;
if (j == 1) xj = y;
if (j == 2) xj = z;
ret += m.op(i).diff(xj)*GG(i,j);
}
}
}
else
{
throw std::runtime_error("Invalid nsd");
}
}
else
{
throw std::invalid_argument("This functions needs v and G on the form: v.cols()=1, v.rows()=G.rows()=G.cols()=nsd.");
}
}
else if (GiNaC::is_a<GiNaC::lst>(v))
{
GiNaC::lst l = GiNaC::ex_to<GiNaC::lst>(v);
return div(l,G);
}
else
{
throw std::invalid_argument("v must be a matrix or lst.");
}
return ret;
}
| GiNaC::ex SyFi::div | ( | GiNaC::lst & | v | ) |
Definition at line 159 of file diff_tools.cpp.
| GiNaC::ex SyFi::div | ( | GiNaC::lst & | v, |
| GiNaC::ex | G | ||
| ) |
Definition at line 183 of file diff_tools.cpp.
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
using SyFi::nsd;
nsd = v.nops();
GiNaC::ex ret;
if (GiNaC::is_a<GiNaC::matrix>(G))
{
GiNaC::matrix GG = GiNaC::ex_to<GiNaC::matrix>(G);
if ( nsd != GG.cols() || nsd != GG.rows())
{
throw(std::invalid_argument("The number of rows and cols in G must equal the size of v."));
}
if (nsd == 1 || nsd == 2 || nsd == 3 )
{
GiNaC::symbol xj;
ret = GiNaC::numeric(0);
for (unsigned int i=0; i< nsd; i++)
{
for (unsigned int j=0; j< nsd; j++)
{
if (i == 0) xj = x;
if (i == 1) xj = y;
if (i == 2) xj = z;
ret += v.op(i).diff(xj)*GG(i,j);
}
}
}
else
{
throw std::runtime_error("Invalid nsd");
}
}
else
{
throw std::invalid_argument("v must be a matrix.");
}
return ret;
}
| GiNaC::ex SyFi::div | ( | GiNaC::exvector & | v | ) |
| GiNaC::symbol SyFi::DUMMY | ( | "(DUMMY is not initialized since initSyFi has never been called)" | ) |
| void SyFi::EQUAL_OR_DIE | ( | const GiNaC::ex & | e, |
| const std::string & | s | ||
| ) |
| void SyFi::EQUAL_OR_DIE | ( | const ex & | e, |
| const string & | s | ||
| ) |
Definition at line 1095 of file ginac_tools.cpp.
References compare().
Referenced by main().
{
if (!compare(e, s))
{
ostringstream os;
os << "ERROR: expression e: " <<e<<" is not equal to "<<s<<endl;
throw runtime_error(os.str());
}
}
| GiNaC::matrix SyFi::equations2matrix | ( | const GiNaC::ex & | eqns, |
| const GiNaC::ex & | symbols | ||
| ) |
Definition at line 238 of file ginac_tools.cpp.
References test_syfi::debug::c.
{
GiNaC::matrix sys(eqns.nops(),symbols.nops());
GiNaC::matrix rhs(eqns.nops(),1);
GiNaC::matrix vars(symbols.nops(),1);
for (size_t r=0; r<eqns.nops(); r++)
{
// lhs-rhs==0
const GiNaC::ex eq = eqns.op(r).op(0)-eqns.op(r).op(1);
GiNaC::ex linpart = eq;
for (size_t c=0; c<symbols.nops(); c++)
{
const GiNaC::ex co = eq.coeff(GiNaC::ex_to<GiNaC::symbol>(symbols.op(c)),1);
linpart -= co*symbols.op(c);
sys(r,c) = co;
}
linpart = linpart.expand();
rhs(r,0) = -linpart;
}
return sys;
}
| GiNaC::lst SyFi::ex2equations | ( | GiNaC::ex | rel | ) |
Definition at line 187 of file ginac_tools.cpp.
{
GiNaC::ex lhs = rel.lhs();
GiNaC::ex rhs = rel.rhs();
GiNaC::ex l;
GiNaC::ex r;
GiNaC::lst eqs;
for (int i=lhs.ldegree(x); i<=lhs.degree(x); ++i)
{
for (int j=lhs.ldegree(y); j<=lhs.degree(y); ++j)
{
for (int k=lhs.ldegree(z); k<=lhs.degree(z); ++k)
{
l = lhs.coeff(x,i).coeff(y, j).coeff(z,k);
r = rhs.coeff(x,i).coeff(y, j).coeff(z,k);
// if (! (l == 0 && r == 0 ) ) eqs.append(l == r); OLD VERSION
if ( (l != 0 && (r == 0 || r == 1) ) ) eqs.append(l == r);
}
}
}
eqs.sort();
return eqs;
}
| GiNaC::ex SyFi::extract_symbols | ( | const GiNaC::ex & | e | ) |
| ex SyFi::extract_symbols | ( | const ex & | e | ) |
Definition at line 1215 of file ginac_tools.cpp.
References SyFi::SymbolCounterVisitor::symbolcount, and test_syfi::debug::v.
Referenced by compare_archives().
{
// Implemented directly to avoid copying map:
SymbolCounterVisitor v;
e.traverse(v);
exhashmap<int> & sc = v.symbolcount;
lst l;
for(exhashmap<int>::iterator it=sc.begin(); it!=sc.end(); it++)
{
l.append(it->first);
std::cout << (it->first) << std::endl;
}
ex ret = l;
return ret;
}
| string SyFi::exvector2string | ( | GiNaC::exvector & | v | ) |
| int SyFi::find | ( | GiNaC::ex | e, |
| GiNaC::lst | list | ||
| ) |
Definition at line 390 of file ginac_tools.cpp.
Referenced by check_visitor().
{
for (unsigned int i=0; i< list.nops(); i++)
{
if ( e == list.op(i) ) return i;
}
return -1;
}
| const GiNaC::symbol& SyFi::get_symbol | ( | const std::string & | name | ) |
| const symbol& SyFi::get_symbol | ( | const string & | name | ) |
Definition at line 123 of file syfi/symbol_factory.cpp.
References symbol_collection.
Referenced by initSyFi(), isymb(), main(), pickExpression(), and replace_powers().
{
map<string, symbol>::iterator i = symbol_collection.find(name);
if( i != symbol_collection.end() )
{
return i->second;
}
return symbol_collection.insert(make_pair(name, symbol(name))).first->second;
}
| GiNaC::ex SyFi::get_symbolic_matrix | ( | int | m, |
| int | n, | ||
| const std::string & | basename | ||
| ) |
Definition at line 154 of file syfi/symbol_factory.cpp.
References isymb().
Referenced by bernstein(), homogenous_pol(), lagrange(), lagrangev(), legendre(), main(), pol(), and polb().
| GiNaC::ex SyFi::get_symbolic_vector | ( | int | m, |
| const std::string & | basename | ||
| ) |
Definition at line 143 of file syfi/symbol_factory.cpp.
References isymb().
Referenced by barycenter(), initSyFi(), main(), and SyFi::Simplex::repr().
| GiNaC::ex SyFi::grad | ( | GiNaC::ex | f | ) |
Definition at line 245 of file diff_tools.cpp.
References run_tests::f, nsd, x, y, and z.
Referenced by compute_nlconvdiff_element_matrix(), compute_Poisson_element_matrix(), compute_poisson_element_matrix(), compute_Poisson_element_matrix(), compute_Stokes_element_matrix(), example_of_use(), main(), and usage().
{
using SyFi::nsd;
using SyFi::x;
using SyFi::y;
using SyFi::z;
if (GiNaC::is_a<GiNaC::matrix>(f))
{
GiNaC::matrix m = GiNaC::ex_to<GiNaC::matrix>(f);
GiNaC::matrix ret_m(nsd,m.rows());
for (unsigned int r=0; r< m.rows(); r++)
{
if (nsd == 1)
{
// ret_m(0,r) = diff(m.op(r),x);
return diff(f, x);
}
else if ( nsd == 2)
{
ret_m(0,r) = diff(m.op(r),x);
ret_m(1,r) = diff(m.op(r),y);
}
else if ( nsd == 3)
{
ret_m(0,r) = diff(m.op(r),x);
ret_m(1,r) = diff(m.op(r),y);
ret_m(2,r) = diff(m.op(r),z);
}
}
return ret_m;
}
else
{
if (nsd == 1)
{
// return GiNaC::matrix(nsd,1,GiNaC::lst(diff(f,x)));
return diff(f,x);
}
else if ( nsd == 2)
{
return GiNaC::matrix(nsd,1,GiNaC::lst(diff(f,x), diff(f,y)));
}
else if ( nsd == 3)
{
return GiNaC::matrix(nsd,1,GiNaC::lst(diff(f,x), diff(f,y), diff(f,z)));
}
else
{
throw(std::invalid_argument("nsd must be either 1, 2, or 3."));
return GiNaC::matrix();
}
}
}
| GiNaC::ex SyFi::grad | ( | GiNaC::ex | f, |
| GiNaC::ex | G | ||
| ) |
Definition at line 301 of file diff_tools.cpp.
References test_syfi::debug::c, run_tests::f, nsd, x, y, and z.
{
using SyFi::nsd;
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::symbol xr;
if ( GiNaC::is_a<GiNaC::matrix>(G))
{
GiNaC::matrix GG = GiNaC::ex_to<GiNaC::matrix>(G);
if (! (GG.rows() == nsd && GG.cols() == nsd ))
{
throw(std::invalid_argument("The number of cols/rows in G must equal nsd."));
}
if (GiNaC::is_a<GiNaC::matrix>(f) )
{
GiNaC::matrix m = GiNaC::ex_to<GiNaC::matrix>(f);
GiNaC::matrix ret_m(nsd,m.rows());
for (unsigned int k=0; k< m.rows(); k++)
{
for (unsigned int c=0; c<nsd; c++)
{
for (unsigned int r=0; r<nsd; r++)
{
if (r == 0) xr = x;
if (r == 1) xr = y;
if (r == 2) xr = z;
ret_m(c,k) += diff(f,xr)*GG(r,c);
}
}
}
return ret_m;
}
else
{
GiNaC::matrix ret_m(nsd,1);
for (unsigned int c=0; c<nsd; c++)
{
for (unsigned int r=0; r<nsd; r++)
{
if (r == 0) xr = x;
if (r == 1) xr = y;
if (r == 2) xr = z;
ret_m(c,0) += diff(f,xr)*GG(r,c);
}
}
return ret_m;
}
}
else
{
throw(std::invalid_argument("G must be a matrix."));
}
}
| GiNaC::ex SyFi::homogenous_pol | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::ex SyFi::homogenous_pol | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 534 of file ginac_tools.cpp.
References get_symbolic_matrix(), istr(), matrix_to_lst2(), x, y, and z.
Referenced by homogenous_polv(), and main().
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
if ( nsd == 1)
{
GiNaC::symbol a0(istr(a,0));
return GiNaC::lst(a0*pow(x,order), a0, pow(x,order));
}
else if ( nsd == 2 )
{
GiNaC::ex variables = get_symbolic_matrix(1,order+1, a);
GiNaC::lst basis;
GiNaC::ex ret;
for (unsigned int i=0; i<= order; i++)
{
basis.append(pow(x,i)*pow(y,order-i));
ret += variables.op(i)*basis.op(i);
}
return GiNaC::lst(ret, matrix_to_lst2(variables), basis);
}
else if ( nsd == 3 )
{
GiNaC::lst basis;
for (unsigned int i=0; i<= order; i++)
{
for (unsigned int j=0; j<= order; j++)
{
for (unsigned int k=0; k<= order; k++)
{
if ( i + j + k == order )
{
basis.append(pow(x,i)*pow(y,j)*pow(z,k));
}
}
}
}
GiNaC::ex variables = get_symbolic_matrix(1,basis.nops(), a);
GiNaC::ex ret;
for (unsigned int i=0; i<basis.nops(); i++)
{
ret += variables.op(i)*basis.op(i);
}
return GiNaC::lst(ret, matrix_to_lst2(variables), basis);
}
throw std::runtime_error("Homogenous polynomials only implemented in 1D, 2D and 3D");
}
| GiNaC::lst SyFi::homogenous_polv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::lst SyFi::homogenous_polv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 585 of file ginac_tools.cpp.
References homogenous_pol().
Referenced by SyFi::Nedelec::compute_basis_functions(), and SyFi::Nedelec2Hdiv::compute_basis_functions().
{
GiNaC::lst ret1; // contains the polynom
GiNaC::lst ret2; // contains the coefficients
GiNaC::lst ret3; // constains the basis functions
GiNaC::lst basis_tmp;
for (unsigned int i=0; i< no_fields; i++)
{
GiNaC::lst basis;
std::ostringstream s;
s <<a<<""<<i<<"_";
GiNaC::ex polspace = homogenous_pol(order, nsd, s.str());
ret1.append(polspace.op(0));
ret2.append(polspace.op(1));
basis_tmp = GiNaC::ex_to<GiNaC::lst>(polspace.op(2));
for (GiNaC::lst::const_iterator basis_iterator = basis_tmp.begin();
basis_iterator != basis_tmp.end(); ++basis_iterator)
{
GiNaC::lst tmp_lst;
for (unsigned int d=1; d<=no_fields; d++) tmp_lst.append(0);
tmp_lst.let_op(i) = (*basis_iterator);
ret3.append(tmp_lst);
}
}
return GiNaC::lst(ret1,ret2,ret3);
}
| GiNaC::symbol SyFi::infinity | ( | "(infinity is not initialized since initSyFi has never been called)" | ) |
| void SyFi::initSyFi | ( | unsigned int | nsd_ | ) |
Definition at line 46 of file syfi/symbol_factory.cpp.
References DUMMY, get_symbol(), get_symbolic_vector(), infinity, nsd, p, t, x, y, and z.
Referenced by check_CrouzeixRaviart(), check_RaviartThomas(), and main().
{
// initSyFi uses the global coordinates x for nsd == 1
// initSyFi uses the global coordinates x,y for nsd == 2
// initSyFi uses the global coordinates x,y,z for nsd == 3
// when nsd > 3 the coordinates can be found in the p, which is of type lst
// FIXME: this whole thing is just a mess, but it's a nontrivial job to fix it all over syfi...
SyFi::nsd = nsd_;
SyFi::t = get_symbol("t");
SyFi::infinity = get_symbol("infinity");
SyFi::DUMMY = get_symbol("DUMMY");
SyFi::x = get_symbol("(SyFi::x is not initialized)");
SyFi::y = get_symbol("(SyFi::y is not initialized)");
SyFi::z = get_symbol("(SyFi::z is not initialized)");
/*
std::cout << "SyFi::p before remove_all:" << std::endl;
std::cout << SyFi::p << std::endl;
*/
SyFi::p.remove_all();
/*
std::cout << "SyFi::p after remove_all:" << std::endl;
std::cout << SyFi::p << std::endl;
*/
if ( nsd > 3 )
{
SyFi::x = get_symbol("(SyFi::x is an invalid symbol when nsd>3)");
SyFi::y = get_symbol("(SyFi::y is an invalid symbol when nsd>3)");
SyFi::z = get_symbol("(SyFi::z is an invalid symbol when nsd>3)");
ex tmp = get_symbolic_vector(nsd, "x");
for (unsigned int i=0; i<tmp.nops(); i++)
{
p.append(tmp.op(i));
}
}
else
{
if ( nsd > 0 )
{
SyFi::x = get_symbol("x");
SyFi::p.append(SyFi::x);
}
if ( nsd > 1 )
{
SyFi::y = get_symbol("y");
SyFi::p.append(SyFi::y);
}
if ( nsd > 2 )
{
SyFi::z = get_symbol("z");
SyFi::p.append(SyFi::z);
}
}
/*
std::cout << "SyFi::p at end of initSyFi:" << std::endl;
std::cout << SyFi::p << std::endl;
*/
}
| GiNaC::ex SyFi::inner | ( | GiNaC::ex | a, |
| GiNaC::ex | b, | ||
| bool | transposed | ||
| ) |
Definition at line 50 of file ginac_tools.cpp.
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), compute_mixed_Poisson_element_matrix(), compute_nlconvdiff_element_matrix(), compute_poisson_element_matrix(), compute_Poisson_element_matrix(), compute_Poisson_element_matrix(), compute_Stokes_element_matrix(), inner(), and main().
{
if (GiNaC::is_a<GiNaC::matrix>(a) && GiNaC::is_a<GiNaC::matrix>(b))
{
GiNaC::matrix ma = GiNaC::ex_to<GiNaC::matrix>(a);
GiNaC::matrix mb = GiNaC::ex_to<GiNaC::matrix>(b);
if ( !transposed )
{
if (ma.cols() != mb.cols() || ma.rows() != mb.rows() )
{
cout <<"Incompatible matrices "<<endl;
cout <<"a.cols() "<<ma.cols()<<endl;
cout <<"a.rows() "<<ma.rows()<<endl;
cout <<"b.cols() "<<mb.cols()<<endl;
cout <<"b.rows() "<<mb.rows()<<endl;
cout <<"a="<<a<<endl;
cout <<"b="<<b<<endl;
throw std::runtime_error("Incompatible matrices.");
}
GiNaC::ex ret;
for (unsigned int i=0; i<ma.rows(); i++)
{
for (unsigned int j=0; j<ma.cols(); j++)
{
ret += ma(i,j)*mb(i,j);
}
}
return ret;
}
else
{
if (ma.cols() != mb.rows() || ma.rows() != mb.cols() )
{
cout <<"Incompatible matrices "<<endl;
cout <<"a.cols() "<<ma.cols()<<endl;
cout <<"a.rows() "<<ma.rows()<<endl;
cout <<"b.cols() "<<mb.cols()<<endl;
cout <<"b.rows() "<<mb.rows()<<endl;
cout <<"a="<<a<<endl;
cout <<"b="<<b<<endl;
throw std::runtime_error("Incompatible matrices.");
}
GiNaC::ex ret;
for (unsigned int i=0; i<ma.rows(); i++)
{
for (unsigned int j=0; j<ma.cols(); j++)
{
ret += ma(i,j)*mb(j,i);
}
}
return ret;
}
}
else if (GiNaC::is_a<GiNaC::lst>(a)
&& GiNaC::is_a<GiNaC::lst>(b))
{
return inner(GiNaC::ex_to<GiNaC::lst>(a), GiNaC::ex_to<GiNaC::lst>(b));
}
else
{
return a*b;
}
}
| GiNaC::ex SyFi::inner | ( | GiNaC::lst | v1, |
| GiNaC::lst | v2 | ||
| ) |
Definition at line 116 of file ginac_tools.cpp.
References inner().
{
GiNaC::ex ret;
if ( v1.nops() != v2.nops() )
{
cout <<"incompatible vectors "<<endl;
cout <<"v1.nops() "<<v1.nops();
cout <<" v2.nops() "<<v2.nops()<<endl; ;
return 0;
}
for (unsigned i = 0; i <= v1.nops()-1 ; ++i)
{
if ( GiNaC::is_a<GiNaC::lst>(v1.op(i)) &&
GiNaC::is_a<GiNaC::lst>(v2.op(i)) )
{
ret += inner(GiNaC::ex_to<GiNaC::lst>(v1.op(i)),
GiNaC::ex_to<GiNaC::lst>(v2.op(i)));
}
else
{
ret += v1.op(i)*v2.op(i);
}
}
return ret;
}
| GiNaC::ex SyFi::inner | ( | GiNaC::exvector & | v1, |
| GiNaC::exvector & | v2 | ||
| ) |
Definition at line 143 of file ginac_tools.cpp.
{
GiNaC::ex ret;
for (unsigned int i=0; i< v1.size(); i++)
{
ret += v1[i]*v2[i];
}
return ret;
}
| std::string SyFi::int2string | ( | int | i | ) |
Definition at line 40 of file utilities.cpp.
Referenced by replace_powers().
{
ostringstream os;
os << i;
return os.str();
}
| GiNaC::lst SyFi::interior_coordinates | ( | Tetrahedron & | tetrahedra, |
| unsigned int | d | ||
| ) |
Definition at line 1434 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
Referenced by SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::RaviartThomas::compute_basis_functions().
{
//FIXME: ugly conversion to matrix
d = d+4;
lst ret;
ex V1 = tetrahedra.vertex(0);
ex V2 = tetrahedra.vertex(1);
ex V3 = tetrahedra.vertex(2);
ex V4 = tetrahedra.vertex(3);
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
lst V3l = ex_to<lst>(V3);
lst V4l = ex_to<lst>(V4);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
ex V3m = lst_to_matrix2(V3l);
ex V4m = lst_to_matrix2(V4l);
int l;
for (unsigned int i=1; i< d; i++)
{
for (unsigned int j=1; j< d; j++)
{
for (unsigned int k=1; k< d; k++)
{
if ( int(d) - int(i) - int(j) - int(k) >= 1 )
{
l= int(d) - int(i) - int(j) - int(k);
ex sum = (l*V1m + k*V2m + j*V3m + i*V4m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
}
}
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
return ret;
}
| GiNaC::lst SyFi::interior_coordinates | ( | Triangle & | triangle, |
| unsigned int | d | ||
| ) |
Definition at line 1513 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
{
//FIXME: ugly conversion to matrix
//
d=d+3;
lst ret;
ex V1 = triangle.vertex(0);
ex V2 = triangle.vertex(1);
ex V3 = triangle.vertex(2);
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
lst V3l = ex_to<lst>(V3);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
ex V3m = lst_to_matrix2(V3l);
int k;
for (unsigned int i=1; i < d; i++)
{
for (unsigned int j=1; j < d; j++)
{
if ( int(d) - int(i) - int(j) >= 1 )
{
k = d - i - j;
ex sum = (k*V1m + j*V2m + i*V3m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
}
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
return ret;
}
| GiNaC::lst SyFi::interior_coordinates | ( | Line & | line, |
| unsigned int | d | ||
| ) |
Definition at line 1592 of file Polygon.cpp.
References lst_to_matrix2(), matrix_to_lst2(), and SyFi::Polygon::vertex().
{
//FIXME: ugly conversion to matrix
d = d+2;
lst ret;
ex V1 = line.vertex(0);
ex V2 = line.vertex(1);
lst V1l = ex_to<lst>(V1);
lst V2l = ex_to<lst>(V2);
ex V1m = lst_to_matrix2(V1l);
ex V2m = lst_to_matrix2(V2l);
int k;
for (unsigned int i=1; i < d; i++)
{
k = d - i;
ex sum = (k*V1m + i*V2m)/d;
ret.append(matrix_to_lst2(sum.evalm()));
}
// FIXME how should these be sorted ?????
// ret = ret.sort();
return ret;
}
| bool SyFi::is_equal | ( | Ptv & | a, |
| Ptv & | b | ||
| ) |
Definition at line 132 of file Ptv_tools.cpp.
References Ptv::size(), and Ptv::tol.
Referenced by contains3D(), and line_contains().
| bool SyFi::is_inside_triangle | ( | Ptv & | e0, |
| Ptv & | e1, | ||
| Ptv & | e2, | ||
| Ptv & | p | ||
| ) |
Definition at line 174 of file Ptv_tools.cpp.
References mul(), normalize(), sub(), and Ptv::tol.
Referenced by contains3D().
| std::string SyFi::istr | ( | const std::string & | a, |
| int | b | ||
| ) |
| std::string SyFi::istr | ( | const std::string & | a, |
| int | b, | ||
| int | c | ||
| ) |
| string SyFi::istr | ( | const string & | a, |
| int | b | ||
| ) |
Definition at line 47 of file utilities.cpp.
Referenced by check_CrouzeixRaviart(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::P0::compute_basis_functions(), SyFi::ArnoldFalkWintherWeakSymSigma::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::ArnoldFalkWintherWeakSymU::compute_basis_functions(), SyFi::ArnoldFalkWintherWeakSymP::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), homogenous_pol(), isymb(), SyFi::Triangle::line(), SyFi::Rectangle::line(), SyFi::Tetrahedron::line(), SyFi::Box::line(), main(), SyFi::Box::rectangle(), SyFi::Simplex::sub_simplex(), and SyFi::Tetrahedron::triangle().
{
ostringstream s;
s << a << b;
return s.str();
}
| string SyFi::istr | ( | const string & | a, |
| int | b, | ||
| int | c | ||
| ) |
Definition at line 54 of file utilities.cpp.
References test_syfi::debug::c.
{
ostringstream s;
s << a << b << "_" <<c;
return s.str();
}
| const GiNaC::symbol& SyFi::isymb | ( | const std::string & | a, |
| int | b | ||
| ) |
| const GiNaC::symbol& SyFi::isymb | ( | const std::string & | a, |
| int | b, | ||
| int | c | ||
| ) |
| const symbol& SyFi::isymb | ( | const string & | a, |
| int | b | ||
| ) |
Definition at line 133 of file syfi/symbol_factory.cpp.
References get_symbol(), and istr().
Referenced by get_symbolic_matrix(), get_symbolic_vector(), and main().
{
return get_symbol(istr(a,b));
}
| const symbol& SyFi::isymb | ( | const string & | a, |
| int | b, | ||
| int | c | ||
| ) |
Definition at line 138 of file syfi/symbol_factory.cpp.
References get_symbol(), and istr().
{
return get_symbol(istr(a,b,c));
}
| GiNaC::ex SyFi::lagrange | ( | unsigned int | order, |
| Polygon & | p, | ||
| const std::string & | a | ||
| ) |
Definition at line 528 of file Lagrange.cpp.
References get_symbolic_matrix(), matrix_to_lst2(), SyFi::StandardFE::N(), and SyFi::StandardFE::nbf().
{
if ( order < 1 )
{
throw(std::logic_error("Can not create polynomials of order less than 1!"));
}
GiNaC::ex A;
GiNaC::ex ret;
GiNaC::lst basis;
Lagrange fe(p,order);
A = get_symbolic_matrix(1, fe.nbf(), a);
for (unsigned int i=0; i<fe.nbf(); i++)
{
ret += A.op(i)*fe.N(i);
basis.append(fe.N(i));
}
return GiNaC::lst(ret,matrix_to_lst2(A),basis);
}
| GiNaC::lst SyFi::lagrangev | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| Polygon & | p, | ||
| const std::string & | a | ||
| ) |
Definition at line 550 of file Lagrange.cpp.
References get_symbolic_matrix(), matrix_to_lst2(), SyFi::StandardFE::N(), and SyFi::StandardFE::nbf().
{
if ( order < 1 )
{
throw(std::logic_error("Can not create polynomials of order less than 1!"));
}
GiNaC::ex A;
GiNaC::ex ret;
GiNaC::lst basis;
VectorLagrange fe(p,order);
A = get_symbolic_matrix(1, fe.nbf(), a);
for (unsigned int i=0; i<fe.nbf(); i++)
{
ret += A.op(i)*fe.N(i);
basis.append(fe.N(i));
}
return GiNaC::lst(ret,matrix_to_lst2(A),basis);
}
| GiNaC::ex SyFi::legendre | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::ex SyFi::legendre | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const string | s | ||
| ) |
Definition at line 942 of file ginac_tools.cpp.
References run_tests::f, get_symbolic_matrix(), legendre1D(), matrix_to_lst2(), x, y, and z.
Referenced by SyFi::Hermite::compute_basis_functions(), legendrev(), and main().
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
// The Legendre polynomials to be used in FiniteElement
GiNaC::ex leg;
GiNaC::ex A;
GiNaC::lst basis;
int dof;
GiNaC::ex b;
// 1D
if(nsd == 1)
{
dof = order+1;
A = get_symbolic_matrix(1,dof,s);
int o=0;
for(GiNaC::const_iterator i = A.begin(); i!=A.end(); ++i)
{
b= legendre1D(x,o);
leg+= (*i)*b;
basis.append(b);
o++;
}
}
// 2D
/*
else if(nsd == 2){ // NB: Only for tensor products on TRIANGLES (not boxes)
/ * 2D: structure of coefficients (a_i)
* [ a_0 a_1 P_1(x) a_3 P_2(x) a_6 P_3(x)
* [ a_2 P_1(y) a_4 P_1(x)*P_1(y) a_7 P_2(x)*P_1(y)
* [ a_5 P_2(y) a_8 P_1(x)*P_2(y)
* [ a_9 P_3(y)
* /
dof = (order+1)*(order+2)/2;
A = get_symbolic_matrix(1,dof,s);
size_t i=0;
for (int o = 0; o <= order; o++) {
for (int d = 0; d <= o; d++) {
b = legendre1D(y,d)*legendre1D(x,o-d);
leg += A.op(i)*b;
basis.append(b);
i++;
}
}
}
*/
else if(nsd == 2) // NB: Only for tensor products on rectangles
{
dof = (order+1)*(order+1);
A = get_symbolic_matrix(1,dof,s);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= order; d++)
{
b = legendre1D(y,d)*legendre1D(x,o);
leg += A.op(i)*b;
basis.append(b);
i++;
}
}
}
/* tetrahedron
else if(nsd==3){
dof = 0;
for (int j=0; j<= order; j++) {
dof += (j+1)*(j+2)/2;
}
A = get_symbolic_matrix(1, dof , s);
size_t i=0;
for (int o = 0; o <= order; o++) {
for (int d = 0; d <= o; d++) {
for (int f = 0; f <= o; f++) {
if ( o-d-f >= 0) {
b = legendre1D(y,f)*legendre1D(z,d)*legendre1D(x,o-d-f);
leg += A.op(i)*b;
basis.append(b);
i++;
}
}
}
}
}
*/
else if(nsd==3)
{
dof = (order+1)*(order+1)*(order+1);
A = get_symbolic_matrix(1, dof , s);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= order; d++)
{
for (unsigned int f = 0; f <= order; f++)
{
b = legendre1D(y,f)*legendre1D(z,d)*legendre1D(x,o);
leg += A.op(i)*b;
basis.append(b);
i++;
}
}
}
}
return GiNaC::lst(leg,matrix_to_lst2(A), basis);
}
| GiNaC::ex SyFi::legendre1D | ( | const GiNaC::symbol | x, |
| unsigned int | n | ||
| ) |
Definition at line 928 of file ginac_tools.cpp.
References x.
Referenced by legendre().
{
GiNaC::ex P;
// Rodrigue's formula for Legendre polynomial of 1D
// The interval [-1, 1]
P=1/(pow(2,n)*GiNaC::factorial(n))*GiNaC::diff(GiNaC::pow((x*x-1),n),x,n);
// -----------------
// The interval [0,1]
// GiNaC::ex xx = 2*x - 1;
// P=1/(pow(2,2*n)*GiNaC::factorial(n))*GiNaC::diff(GiNaC::pow((xx*xx-1),n),x,n);
return P;
}
| GiNaC::lst SyFi::legendrev | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::lst SyFi::legendrev | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 1059 of file ginac_tools.cpp.
References legendre().
{
GiNaC::lst ret1; // contains the polynom
GiNaC::lst ret2; // contains the coefficients
GiNaC::lst ret3; // constains the basis functions
GiNaC::lst basis_tmp;
for (unsigned int i=1; i<= no_fields; i++)
{
GiNaC::lst basis;
std::ostringstream s;
s <<a<<""<<i<<"_";
GiNaC::ex polspace = legendre(order, nsd, s.str());
ret1.append(polspace.op(0));
ret2.append(polspace.op(1));
basis_tmp = GiNaC::ex_to<GiNaC::lst>(polspace.op(2));
for (GiNaC::lst::const_iterator basis_iterator = basis_tmp.begin();
basis_iterator != basis_tmp.end(); ++basis_iterator)
{
GiNaC::lst tmp_lst;
for (unsigned int d=1; d<=no_fields; d++) tmp_lst.append(0);
tmp_lst.let_op(i-1) = (*basis_iterator);
ret3.append(tmp_lst);
}
}
return GiNaC::lst(ret1,ret2,ret3);
}
| bool SyFi::line_contains | ( | Ptv & | e0, |
| Ptv & | e1, | ||
| Ptv & | p | ||
| ) |
Definition at line 147 of file Ptv_tools.cpp.
References test_syfi::debug::c, cross(), is_equal(), Ptv::less(), norm(), sub(), and Ptv::tol.
Referenced by contains2D(), and contains3D().
{
if ( is_equal(e0, p) || is_equal(e1, p) ) return true;
// vec0 = e1-e0
Ptv vec0;
sub(e1,e0, vec0);
// vec1 = e1-p
Ptv vec1;
sub(e1, p, vec1);
// check if the vec0 and vec1 are parallel
Ptv c;
cross(vec0, vec1, c);
if (norm(c) > Ptv::tol)
{
return false;
}
// check whether the edge (e0,e1) contains p .
if ( e0.less(p) && e1.less(p) ) return false;
if ( p.less(e0) && p.less(e1) ) return false;
return true;
}
| std::string SyFi::lst2string | ( | GiNaC::lst & | l | ) |
Definition at line 61 of file utilities.cpp.
Referenced by main().
{
ostringstream s;
GiNaC::lst::const_iterator i = l.begin();
s <<"("<<*i;
++i;
for (; i != l.end() ; ++i)
{
s<< ","<< *i;
}
s <<");"<<endl;
return s.str();
}
| GiNaC::lst SyFi::lst_equals | ( | GiNaC::ex | a, |
| GiNaC::ex | b | ||
| ) |
Definition at line 365 of file ginac_tools.cpp.
{
GiNaC::lst ret;
if ( (GiNaC::is_a<GiNaC::lst>(a)) && (GiNaC::is_a<GiNaC::lst>(b)) /*&& (a.nops() == b.nops())*/ ) {
for (unsigned int i=0; i<= a.nops()-1; i++)
{
ret.append(b.op(i) == a.op(i));
}
}
else if ( !(GiNaC::is_a<GiNaC::lst>(a)) && !(GiNaC::is_a<GiNaC::lst>(b)))
{
ret.append(b == a);
}
else if ( !(GiNaC::is_a<GiNaC::lst>(a)) && (GiNaC::is_a<GiNaC::lst>(b)))
{
ret.append(b.op(0) == a);
}
else
{
throw(std::invalid_argument("Make sure that the lists a and b are comparable."));
}
return ret;
}
| GiNaC::ex SyFi::lst_to_matrix2 | ( | const GiNaC::lst & | l | ) |
Definition at line 287 of file ginac_tools.cpp.
Referenced by bezier_ordinates(), and interior_coordinates().
{
GiNaC::lst::const_iterator itr, itc;
// Find number of rows and columns
size_t rows = l.nops(), cols = 0;
for (itr = l.begin(); itr != l.end(); ++itr)
{
if (!GiNaC::is_a<GiNaC::lst>(*itr))
// throw (std::invalid_argument("lst_to_matrix: argument must be a list of lists"));
cols = 1;
if (itr->nops() > cols)
cols = itr->nops();
}
// Allocate and fill matrix
GiNaC::matrix &M = *new GiNaC::matrix(rows, cols);
M.setflag(GiNaC::status_flags::dynallocated);
unsigned i;
for (itr = l.begin(), i = 0; itr != l.end(); ++itr, ++i)
{
unsigned j;
if (cols == 1)
{
M(i, 0) = *itr;
}
else
{
for (itc = GiNaC::ex_to<GiNaC::lst>(*itr).begin(), j = 0; itc != GiNaC::ex_to<GiNaC::lst>(*itr).end(); ++itc, ++j)
M(i, j) = *itc;
}
}
return M;
}
| void SyFi::matrix_from_equations | ( | const GiNaC::ex & | eqns, |
| const GiNaC::ex & | symbols, | ||
| GiNaC::matrix & | A, | ||
| GiNaC::matrix & | b | ||
| ) |
Definition at line 262 of file ginac_tools.cpp.
References test_syfi::debug::c.
Referenced by SyFi::Hermite::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
// build matrix from equation system
GiNaC::matrix sys(eqns.nops(),symbols.nops());
GiNaC::matrix rhs(eqns.nops(),1);
GiNaC::matrix vars(symbols.nops(),1);
for (size_t r=0; r<eqns.nops(); r++)
{
// lhs-rhs==0
const GiNaC::ex eq = eqns.op(r).op(0)-eqns.op(r).op(1);
GiNaC::ex linpart = eq;
for (size_t c=0; c<symbols.nops(); c++)
{
const GiNaC::ex co = eq.coeff(GiNaC::ex_to<GiNaC::symbol>(symbols.op(c)),1);
linpart -= co*symbols.op(c);
sys(r,c) = co;
}
linpart = linpart.expand();
rhs(r,0) = -linpart;
}
A = sys;
b = rhs;
}
| GiNaC::lst SyFi::matrix_to_lst2 | ( | const GiNaC::ex & | m | ) |
Definition at line 322 of file ginac_tools.cpp.
Referenced by bernstein(), bezier_ordinates(), homogenous_pol(), interior_coordinates(), lagrange(), lagrangev(), legendre(), pol(), and polb().
{
if (GiNaC::is_a<GiNaC::matrix>(m))
{
GiNaC::matrix A = GiNaC::ex_to<GiNaC::matrix>(m);
int cols = A.cols();
int rows = A.rows();
GiNaC::lst ret;
if ( cols == 1 )
{
for (unsigned int i=0; i<=A.rows()-1; i++)
{
ret.append(A(i,0));
}
}
else if ( rows == 1 )
{
for (unsigned int i=0; i<=A.cols()-1; i++)
{
ret.append(A(0,i));
}
}
else
{
for (unsigned int i=0; i<=A.rows()-1; i++)
{
GiNaC::lst rl;
for (unsigned int j=0; j<=A.cols()-1; j++)
{
rl.append(A(i,j));
}
ret.append(rl);
}
}
return ret;
}
else
{
return GiNaC::lst();
}
}
| GiNaC::lst SyFi::matvec | ( | GiNaC::matrix & | M, |
| GiNaC::lst & | x | ||
| ) |
Definition at line 153 of file ginac_tools.cpp.
{
GiNaC::lst ret;
int nr = M.rows();
int nc = M.cols();
for (int i = 0; i < nr; i++)
{
GiNaC::ex tmp;
for (int j = 0; j < nc; j++)
{
tmp = tmp + M(i,j)*(x.op(j));
}
ret.append(tmp);
}
return ret;
}
| GiNaC::ex SyFi::matvec | ( | GiNaC::ex | A, |
| GiNaC::ex | x | ||
| ) |
Definition at line 170 of file ginac_tools.cpp.
References x.
Definition at line 40 of file Ptv_tools.cpp.
References Ptv::size().
Referenced by is_inside_triangle().
| double SyFi::norm | ( | const Ptv & | a | ) |
Definition at line 55 of file Ptv_tools.cpp.
References Ptv::size().
Referenced by line_contains(), normal(), normalize(), and tangent().
{
double sum = 0.0;
for (unsigned int i=0; i < a.size(); i++)
{
sum += a[i]*a[i];
}
sum = sqrt(sum);
return sum;
}
| GiNaC::lst SyFi::normal | ( | Tetrahedron & | tetrahedron, |
| unsigned int | i | ||
| ) |
Definition at line 1951 of file Polygon.cpp.
References cross(), norm(), SyFi::Tetrahedron::triangle(), and SyFi::Polygon::vertex().
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), main(), and variants().
{
// Normal as defined by Maries note
Triangle triangle = tetrahedron.triangle(i);
lst vertex_i = ex_to<lst>(tetrahedron.vertex(i));
lst vertex_0 = ex_to<lst>(triangle.vertex(0));
lst vertex_1 = ex_to<lst>(triangle.vertex(1));
lst vertex_2 = ex_to<lst>(triangle.vertex(2));
lst n1(vertex_1.op(0) - vertex_0.op(0),
vertex_1.op(1) - vertex_0.op(1),
vertex_1.op(2) - vertex_0.op(2));
lst n2(vertex_2.op(0) - vertex_0.op(0),
vertex_2.op(1) - vertex_0.op(1),
vertex_2.op(2) - vertex_0.op(2));
/*
lst n3(vertex_0.op(0) - vertex_i.op(0),
vertex_0.op(1) - vertex_i.op(1),
vertex_0.op(2) - vertex_i.op(2));
*/
lst n4 = cross(n1,n2);
/*
ex nn = inner(n3, n4);
int sign = 1;
if ( is_a<numeric>(nn)) {
if ( nn > 0 ) {
sign = 1;
} else if ( nn < 0) {
sign = -1;
} else {
sign = 0;
}
}
*/
ex norm = sqrt(pow(n4.op(0),2)
+ pow(n4.op(1),2)
+ pow(n4.op(2),2));
n4.let_op(0) = n4.op(0)/norm;
n4.let_op(1) = n4.op(1)/norm;
n4.let_op(2) = n4.op(2)/norm;
return n4;
}
| GiNaC::lst SyFi::normal | ( | Triangle & | triangle, |
| unsigned int | i | ||
| ) |
Definition at line 2001 of file Polygon.cpp.
References SyFi::Triangle::line(), norm(), and SyFi::Polygon::vertex().
{
Line line = triangle.line(i);
lst vertex_i = ex_to<lst>(triangle.vertex(i));
lst vertex_0 = ex_to<lst>(line.vertex(0));
lst vertex_1 = ex_to<lst>(line.vertex(1));
/*
lst n1 = lst (- (vertex_1.op(1) - vertex_0.op(1)), vertex_1.op(0) - vertex_0.op(0) );
lst n2 = lst (vertex_0.op(0) - vertex_i.op(0), vertex_0.op(1) - vertex_i.op(1));
ex nn = inner(n1, n2);
int sign = 1;
/ *
if ( is_a<numeric>(nn)) {
if ( nn > 0 ) {
sign = 1;
} else if ( nn < 0) {
sign = -1;
} else {
sign = 0;
}
}
ex norm = sqrt(pow(n1.op(0),2) + pow(n1.op(1),2));
n1.let_op(0) = sign*n1.op(0)/norm;
n1.let_op(1) = sign*n1.op(1)/norm;
*/
// normal vector as Marie has defined them
lst n1 = lst ( (vertex_1.op(1) - vertex_0.op(1)),
-(vertex_1.op(0) - vertex_0.op(0)) );
ex norm = sqrt(pow(n1.op(0),2) + pow(n1.op(1),2));
n1.let_op(0) = n1.op(0)/norm;
n1.let_op(1) = n1.op(1)/norm;
return n1;
}
| void SyFi::normalize | ( | Ptv & | a | ) |
Definition at line 67 of file Ptv_tools.cpp.
References norm(), and Ptv::size().
Referenced by is_inside_triangle().
| std::ostream & SyFi::operator<< | ( | std::ostream & | os, |
| const OrderedPtvSet & | p | ||
| ) |
Definition at line 118 of file OrderedPtvSet.cpp.
References SyFi::OrderedPtvSet::size().
| std::ostream & SyFi::operator<< | ( | std::ostream & | os, |
| const OrderedPtvSet_i & | p | ||
| ) |
Definition at line 198 of file OrderedPtvSet.cpp.
References SyFi::OrderedPtvSet_i::get_i(), SyFi::OrderedPtvSet_i::get_OrderedPtvSet(), and SyFi::OrderedPtvSet_i::size().
| GiNaC::ex SyFi::pol | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::ex SyFi::pol | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 613 of file ginac_tools.cpp.
References run_tests::f, get_symbolic_matrix(), matrix_to_lst2(), x, y, and z.
Referenced by bernsteinv(), SyFi::Lagrange::compute_basis_functions(), SyFi::Hermite::compute_basis_functions(), main(), and polv().
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::ex ret; // ex to return
int dof; // degrees of freedom
GiNaC::ex A; // ex holding the coefficients a_0 .. a_dof
GiNaC::lst basis;
if (nsd == 1)
{
/* 1D:
* P^n = a_0 + a_1*x + .... + a_n*x^n
* dof : n+1
*/
dof = order+1;
A = get_symbolic_matrix(1,dof, a);
int o=0;
for (GiNaC::const_iterator i = A.begin(); i != A.end(); ++i)
{
ret += (*i)*pow(x,o);
basis.append(pow(x,o));
o++;
}
}
else if ( nsd == 2)
{
/* 2D: structure of coefficients (a_i)
* [ a_0 a_1 x a_3 x^2 a_6 x^3
* [ a_2 y a_4 xy a_7 x^2y
* [ a_5 y^2 a_8 xy^2
* [ a_9 y^3
*/
dof = (order+1)*(order+2)/2;
A = get_symbolic_matrix(1, dof , a);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= o; d++)
{
ret += A.op(i)*pow(y,d)*pow(x,o-d);
basis.append(pow(y,d)*pow(x,o-d));
i++;
}
}
}
else if (nsd == 3)
{
/* Similar structure as in 2D, but
* structured as a tetraheder, i.e.,
* a_o + a_1 x + a_2 y + a_3 z
* + a_4 x^2 + a_5 xy +
*/
dof = 0;
for (unsigned int j=0; j<= order; j++)
{
dof += (j+1)*(j+2)/2;
}
A = get_symbolic_matrix(1, dof , a);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= o; d++)
{
for (unsigned int f = 0; f <= o; f++)
{
if ( int(o)-int(d)-int(f) >= 0)
{
ret += A.op(i)*pow(y,f)*pow(z,d)*pow(x,o-d-f);
basis.append(pow(y,f)*pow(z,d)*pow(x,o-d-f));
i++;
}
}
}
}
}
return GiNaC::lst(ret,matrix_to_lst2(A), basis);
}
| GiNaC::exmap SyFi::pol2basisandcoeff | ( | GiNaC::ex | e, |
| GiNaC::ex | s | ||
| ) |
Definition at line 878 of file ginac_tools.cpp.
References test_syfi::debug::c.
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
if (GiNaC::is_a<GiNaC::symbol>(s))
{
GiNaC::symbol ss = GiNaC::ex_to<GiNaC::symbol>(s);
e = expand(e);
GiNaC::ex c;
GiNaC::ex b;
GiNaC::exmap map;
for (int i=e.ldegree(ss); i<=e.degree(ss); ++i)
{
c = e.coeff(ss,i);
b = pow(ss,i);
map[b] = c;
}
return map;
}
else
{
throw(std::invalid_argument("The second argument must be a symbol."));
}
}
| GiNaC::exmap SyFi::pol2basisandcoeff | ( | GiNaC::ex | e | ) |
Definition at line 902 of file ginac_tools.cpp.
References test_syfi::debug::c, x, y, and z.
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
e = expand(e);
GiNaC::ex c;
GiNaC::ex b;
GiNaC::exmap map;
for (int i=e.ldegree(x); i<=e.degree(x); ++i)
{
for (int j=e.ldegree(y); j<=e.degree(y); ++j)
{
for (int k=e.ldegree(z); k<=e.degree(z); ++k)
{
c = e.coeff(x,i).coeff(y, j).coeff(z,k);
b = pow(x,i)*pow(y,j)*pow(z,k);
map[b] = c;
}
}
}
return map;
}
| GiNaC::ex SyFi::polb | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::ex SyFi::polb | ( | unsigned int | order, |
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 738 of file ginac_tools.cpp.
References run_tests::f, get_symbolic_matrix(), matrix_to_lst2(), x, y, and z.
{
using SyFi::x;
using SyFi::y;
using SyFi::z;
GiNaC::ex ret; // ex to return
int dof; // degrees of freedom
GiNaC::ex A; // ex holding the coefficients a_0 .. a_dof
GiNaC::lst basis;
if (nsd == 1)
{
/* 1D:
* P^n = a_0 + a_1*x + .... + a_n*x^n
* dof : n+1
*/
dof = order+1;
A = get_symbolic_matrix(1,dof, a);
int o=0;
for (GiNaC::const_iterator i = A.begin(); i != A.end(); ++i)
{
ret += (*i)*pow(x,o);
basis.append(pow(x,o));
o++;
}
}
else if ( nsd == 2)
{
/* 2D: structure of coefficients (a_i)
* [ a_0 a_1 x a_3 x^2 a_6 x^3
* [ a_2 y a_4 xy a_7 x^2y
* [ a_5 y^2 a_8 xy^2
* [ a_9 y^3
*/
dof = (order+1)*(order+1);
A = get_symbolic_matrix(1, dof , a);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= order; d++)
{
ret += A.op(i)*pow(y,d)*pow(x,o);
basis.append(pow(y,d)*pow(x,o));
i++;
}
}
}
else if (nsd == 3)
{
/* Similar structure as in 2D, but
* structured as a tetraheder, i.e.,
* a_o + a_1 x + a_2 y + a_3 z
* + a_4 x^2 + a_5 xy +
*/
dof = (order+1)*(order+1)*(order+1);
A = get_symbolic_matrix(1, dof , a);
size_t i=0;
for (unsigned int o = 0; o <= order; o++)
{
for (unsigned int d = 0; d <= order; d++)
{
for (unsigned int f = 0; f <= order; f++)
{
ret += A.op(i)*pow(y,f)*pow(z,d)*pow(x,o);
basis.append(pow(y,f)*pow(z,d)*pow(x,o));
i++;
}
}
}
}
return GiNaC::lst(ret,matrix_to_lst2(A), basis);
}
| GiNaC::lst SyFi::polv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const std::string | a | ||
| ) |
| GiNaC::lst SyFi::polv | ( | unsigned int | no_fields, |
| unsigned int | order, | ||
| unsigned int | nsd, | ||
| const string | a | ||
| ) |
Definition at line 699 of file ginac_tools.cpp.
References pol().
{
GiNaC::lst ret1; // contains the polynom
GiNaC::lst ret2; // contains the coefficients
GiNaC::lst ret3; // constains the basis functions
GiNaC::lst basis_tmp;
for (unsigned int i=0; i< no_fields; i++)
{
GiNaC::lst basis;
std::ostringstream s;
s <<a<<""<<i<<"_";
GiNaC::ex polspace = pol(order, nsd, s.str());
ret1.append(polspace.op(0));
ret2.append(polspace.op(1));
basis_tmp = GiNaC::ex_to<GiNaC::lst>(polspace.op(2));
for (GiNaC::lst::const_iterator basis_iterator = basis_tmp.begin();
basis_iterator != basis_tmp.end(); ++basis_iterator)
{
GiNaC::lst tmp_lst;
for (unsigned int d=1; d<=no_fields; d++) tmp_lst.append(0);
tmp_lst.let_op(i) = (*basis_iterator);
ret3.append(tmp_lst);
}
}
return GiNaC::lst(ret1,ret2,ret3);
/* Old Code:
GiNaC::lst ret;
for (int i=1; i<= nsd; i++) {
std::ostringstream s;
s <<a<<"^"<<i<<"_";
GiNaC::ex p = pol(order, nsd, s.str());
ret.append(p);
}
return ret;
*/
}
| void SyFi::print | ( | GiNaC::lst & | l | ) |
Definition at line 89 of file utilities.cpp.
{
// for (GiNaC::lst::const_iterator i = l.begin(); i != l.end(); ++i)
// cout << *i << endl;
//
GiNaC::lst::const_iterator i = l.begin();
cout <<"GiNaC::lst("<<*i;
++i;
for (; i != l.end() ; ++i)
{
cout << ","<< *i;
}
cout <<");"<<endl;
}
| void SyFi::print | ( | GiNaC::exvector & | v | ) |
| void SyFi::print | ( | std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > & | A | ) |
Definition at line 115 of file utilities.cpp.
{
map<std::pair<unsigned int,unsigned int>,GiNaC::ex>::iterator iter;
for (iter = A.begin(); iter != A.end() ; iter++)
{
cout <<"A["<<(*iter).first.first<<","<<(*iter).first.second<<"]="<<(*iter).second<<endl;
}
}
| void SyFi::print | ( | ex_int_map | map | ) |
Definition at line 124 of file utilities.cpp.
References test_syfi::debug::c.
| void SyFi::print | ( | GiNaC::exmap | map | ) |
Definition at line 139 of file utilities.cpp.
References test_syfi::debug::c.
| GiNaC::ex SyFi::replace_powers | ( | const GiNaC::ex & | e, |
| const std::list< GiNaC::symbol > & | symbols, | ||
| std::list< symexpair > & | sel, | ||
| const std::string & | tmpsymbolprefix = "p_" |
||
| ) |
| ex SyFi::replace_powers | ( | const ex & | ein, |
| const list< symbol > & | symbols, | ||
| list< symexpair > & | sel, | ||
| const string & | tmpsymbolprefix | ||
| ) |
Definition at line 1394 of file ginac_tools.cpp.
References get_symbol(), and int2string().
Referenced by variants().
{
ex e = ein;
// build power expressions
list<symbol>::const_iterator it = symbols.begin();
for(; it != symbols.end(); it++)
{
int deg = e.degree(*it);
if(deg > 0)
{
symbol sym = ex_to<symbol>(*it);
string sname = tmpsymbolprefix + sym.get_name();
// make list of new symbols
vector<symbol> symbols(deg);
symbols[0] = sym;
for(int i=1; i<deg; i++)
{
symbols[i] = get_symbol( sname + int2string(i+1) );
sel.push_back(make_pair(symbols[i], symbols[i-1]*sym));
}
// with highest order first, subs in e
ex prod = sym;
for(int i=deg-1; i>=1; i--)
{
e = e.subs(power(sym,i+1) == symbols[i], subs_options::algebraic);
}
}
}
return e;
}
| void SyFi::set_tolerance | ( | double | tolerance | ) |
| void SyFi::sort_vector | ( | vector< Ptv > & | a | ) |
Definition at line 30 of file Ptv_tools.cpp.
{
sort(a.begin(), a.end(), Ptv_is_less());
}
Definition at line 90 of file Ptv_tools.cpp.
References Ptv::redim(), and Ptv::size().
Referenced by SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Line::integrate(), SyFi::Triangle::integrate(), SyFi::Rectangle::integrate(), SyFi::Tetrahedron::integrate(), SyFi::Box::integrate(), is_inside_triangle(), and line_contains().
| bool SyFi::symbol_exists | ( | const std::string & | name | ) |
| bool SyFi::symbol_exists | ( | const string & | name | ) |
Definition at line 118 of file syfi/symbol_factory.cpp.
References symbol_collection.
Referenced by main().
{
return symbol_collection.find(name) != symbol_collection.end();
}
| GiNaC::symbol SyFi::t | ( | "(t is not initialized since initSyFi has never been called)" | ) |
| GiNaC::lst SyFi::tangent | ( | Triangle & | triangle, |
| unsigned int | i | ||
| ) |
Definition at line 2041 of file Polygon.cpp.
References SyFi::Triangle::line(), norm(), and SyFi::Polygon::vertex().
Referenced by SyFi::Nedelec::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), and SyFi::Robust::compute_basis_functions_old().
{
/*
Line line = triangle.line(i);
//FIXME: 5 lines to compute the tangent vector, these should
// be put somewhere else.
GiNaC::symbol t("t");
ex line_repr = line.repr(t);
ex t1 = line_repr.op(0).rhs().coeff(t,1);
ex t2 = line_repr.op(1).rhs().coeff(t,1);
ex norm = sqrt(pow(t1,2) + pow(t2,2));
lst tangent = lst(t1/norm,t2/norm);
return tangent;
*/
/*
ex t1, t2;
if ( i == 0 ) {
t1 = triangle.vertex(2).op(0) - triangle.vertex(1).op(0);
t2 = triangle.vertex(2).op(1) - triangle.vertex(1).op(1);
} else if ( i == 1 ) {
t1 = triangle.vertex(0).op(0) - triangle.vertex(2).op(0);
t2 = triangle.vertex(0).op(1) - triangle.vertex(2).op(1);
} else if ( i == 2 ) {
t1 = triangle.vertex(1).op(0) - triangle.vertex(0).op(0);
t2 = triangle.vertex(1).op(1) - triangle.vertex(0).op(1);
} else {
throw(std::out_of_range("The side index is out of range!"));
}
*/
Line line = triangle.line(i);
ex t1 = line.vertex(1).op(0) - line.vertex(0).op(0);
ex t2 = line.vertex(1).op(1) - line.vertex(0).op(1);
ex norm = sqrt(pow(t1,2) + pow(t2,2));
lst tangent = lst(t1/norm,t2/norm);
return tangent;
}
| void SyFi::usage | ( | FE & | fe | ) |
Definition at line 27 of file ElementComputations.cpp.
References SyFi::FE::dof(), grad(), SyFi::FE::N(), and SyFi::FE::nbf().
Referenced by check_CrouzeixRaviart(), check_RaviartThomas(), and main().
{
for (unsigned int i=0; i< fe.nbf(); i++)
{
cout <<"fe.N("<<i<<") = "<<fe.N(i)<<endl;
cout <<"grad(fe.N("<<i<<")) = "<<grad(fe.N(i))<<endl;
cout <<"fe.dof("<<i<<") = "<<fe.dof(i)<<endl;
}
}
| void SyFi::usage | ( | FE & | v_fe, |
| FE & | p_fe | ||
| ) |
Definition at line 37 of file ElementComputations.cpp.
References SyFi::FE::dof(), grad(), SyFi::FE::N(), and SyFi::FE::nbf().
{
for (unsigned int i=0; i< v_fe.nbf(); i++)
{
cout <<"v_fe.N("<<i<<") = "<<v_fe.N(i)<<endl;
cout <<"grad(v_fe.N("<<i<<")) = "<<grad(v_fe.N(i))<<endl;
cout <<"v_fe.dof("<<i<<") = "<<v_fe.dof(i)<<endl;
}
for (unsigned int i=0; i< p_fe.nbf(); i++)
{
cout <<"p_fe.N("<<i<<")= "<<p_fe.N(i)<<endl;
cout <<"p_fe.dof("<<i<<")= "<<p_fe.dof(i)<<endl;
}
}
| void SyFi::visitor_subst_pow | ( | GiNaC::ex | e, |
| GiNaC::exmap & | map, | ||
| ex_int_map & | intmap, | ||
| std::string | a | ||
| ) |
| void SyFi::visitor_subst_pow | ( | GiNaC::ex | e, |
| GiNaC::exmap & | map, | ||
| ex_int_map & | intmap, | ||
| string | a | ||
| ) |
Definition at line 400 of file ginac_tools.cpp.
{
static int i=0;
if (map.find(e) != map.end())
{
intmap[e] = intmap[e]+1;
return;
}
if (GiNaC::is_exactly_a<GiNaC::power>(e))
{
std::ostringstream s;
s <<a<<i++;
map[e] = GiNaC::symbol(s.str());
intmap[e] = 0;
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"power e "<<e2<<endl;
visitor_subst_pow(e2,map,intmap, a);
}
}
else if (GiNaC::is_a<GiNaC::function>(e))
{
std::ostringstream s;
s <<a<<i++;
map[e] = GiNaC::symbol(s.str());
intmap[e] = 0;
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
// cout <<"function e "<<e2<<endl;
visitor_subst_pow(e2,map,intmap, a);
}
}
else if (GiNaC::is_a<GiNaC::mul>(e))
{
if (e.nops() > 4 && e.nops() < 10 )
{
std::ostringstream s;
s <<a<<i++;
map[e] = GiNaC::symbol(s.str());
intmap[e] = 0;
}
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
visitor_subst_pow(e2,map,intmap, a);
}
}
else if (GiNaC::is_a<GiNaC::add>(e))
{
for (unsigned int i=0; i< e.nops(); i++)
{
GiNaC::ex e2 = e.op(i);
visitor_subst_pow(e2,map,intmap,a);
}
}
}
| GiNaC::symbol SyFi::x | ( | "(x is not initialized since initSyFi has never been called)" | ) |
| GiNaC::symbol SyFi::y | ( | "(y is not initialized since initSyFi has never been called)" | ) |
| GiNaC::symbol SyFi::z | ( | "(z is not initialized since initSyFi has never been called)" | ) |
| GiNaC::symbol SyFi::DUMMY |
Referenced by initSyFi().
| GiNaC::symbol SyFi::infinity |
Referenced by initSyFi().
| unsigned int SyFi::nsd = 2 |
Definition at line 33 of file syfi/symbol_factory.cpp.
Referenced by barycenter(), div(), grad(), initSyFi(), SyFi::Simplex::integrate(), main(), SyFi::Simplex::repr(), SyFi::TensorLagrange::TensorLagrange(), SyFi::TensorP0::TensorP0(), SyFi::VectorCrouzeixRaviart::VectorCrouzeixRaviart(), SyFi::VectorLagrange::VectorLagrange(), and SyFi::VectorP0::VectorP0().
| GiNaC::lst SyFi::p |
Definition at line 39 of file syfi/symbol_factory.cpp.
Referenced by SyFi::StandardFE::get_polygon(), initSyFi(), DofT< D, C >::insert_dof(), SyFi::Dof::insert_dof(), main(), SyFi::StandardFE::set_polygon(), SyFi::StandardFE::StandardFE(), SyFi::SymbolCounterVisitor::visit(), and SyFi::StandardFE::~StandardFE().
| map<string, symbol> SyFi::symbol_collection |
Definition at line 116 of file syfi/symbol_factory.cpp.
Referenced by get_symbol(), and symbol_exists().
| GiNaC::symbol SyFi::t |
Referenced by SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::SpaceTimeElement::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), initSyFi(), SyFi::SpaceTimeDomain::integrate(), SyFi::Line::integrate(), main(), SyFi::SpaceTimeDomain::repr(), SyFi::Rectangle::repr(), SyFi::Tetrahedron::repr(), and SyFi::Box::repr().
| const int SyFi::version_major = SYFILIB_MAJOR_VERSION |
Definition at line 30 of file utilities.cpp.
| const char * SyFi::version_micro = SYFILIB_MICRO_VERSION |
Definition at line 32 of file utilities.cpp.
| const int SyFi::version_minor = SYFILIB_MINOR_VERSION |
Definition at line 31 of file utilities.cpp.
| GiNaC::symbol SyFi::x |
Referenced by barycenter_line(), barycenter_tetrahedron(), barycenter_triangle(), code_gen2D(), coeff(), coeffs(), SyFi::Bubble::compute_basis_functions(), SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Hermite::compute_basis_functions(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::SpaceTimeElement::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), div(), ex2equations(), grad(), homogenous_pol(), initSyFi(), SyFi::SpaceTimeDomain::integrate(), SyFi::Line::integrate(), SyFi::ReferenceLine::integrate(), SyFi::Triangle::integrate(), SyFi::ReferenceTriangle::integrate(), SyFi::Tetrahedron::integrate(), SyFi::ReferenceTetrahedron::integrate(), legendre(), legendre1D(), main(), matvec(), pickExpression(), pol(), pol2basisandcoeff(), polb(), Ptv::Ptv(), SyFi::ReferenceLine::repr(), SyFi::Triangle::repr(), SyFi::Rectangle::repr(), SyFi::Tetrahedron::repr(), SyFi::Box::repr(), SyFi::Simplex::repr(), and variants().
| GiNaC::symbol SyFi::y |
Referenced by code_gen2D(), coeff(), coeffs(), SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Hermite::compute_basis_functions(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::Robust::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), SyFi::BrezziDouglasMarini::compute_basis_functions(), SyFi::Robust::compute_basis_functions_old(), div(), ex2equations(), grad(), homogenous_pol(), initSyFi(), legendre(), main(), pickExpression(), pol(), pol2basisandcoeff(), polb(), Ptv::Ptv(), and variants().
| GiNaC::symbol SyFi::z |
Referenced by coeff(), coeffs(), SyFi::CrouzeixRaviart::compute_basis_functions(), SyFi::Lagrange::compute_basis_functions(), SyFi::Nedelec::compute_basis_functions(), SyFi::Hermite::compute_basis_functions(), SyFi::Nedelec2Hdiv::compute_basis_functions(), SyFi::RaviartThomas::compute_basis_functions(), div(), ex2equations(), grad(), homogenous_pol(), initSyFi(), legendre(), main(), pickExpression(), pol(), pol2basisandcoeff(), polb(), Ptv::Ptv(), and variants().