SyFi
0.3
|
Go to the source code of this file.
Functions | |
void | compute_Poisson_element_matrix (FE &fe, Dof &dof, std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > &A) |
void | code_gen2D (FE &fe) |
int | main () |
void code_gen2D | ( | FE & | fe | ) |
Definition at line 34 of file code_gen.cpp.
References SyFi::FE::N(), SyFi::FE::nbf(), SyFi::x, and SyFi::y.
Referenced by main().
{ cout <<csrc; for (unsigned int i=0; i< fe.nbf(); i++) { cout <<"double N"<<i<<"(double x, double y){"<<endl; cout <<" return "<<fe.N(i)<<";"<<endl; cout <<"}"<<endl; } for (unsigned int i=0; i< fe.nbf(); i++) { cout <<"double dN"<<i<<"dx(double x, double y){"<<endl; cout <<" return "<<diff(fe.N(i),x)<<";"<<endl; cout <<"}"<<endl; } for (unsigned int i=0; i< fe.nbf(); i++) { cout <<"double dN"<<i<<"dy(double x, double y){"<<endl; cout <<" return "<<diff(fe.N(i),y)<<";"<<endl; cout <<"}"<<endl; } cout <<"double N(int i, double x, double y){"<<endl; cout <<" switch(i) {"<<endl; for (unsigned int i=0; i< fe.nbf(); i++) { cout <<" case "<<i<<" : return N"<<i<<"(x,y);"<<endl; } cout <<" }"<<endl; cout <<"}"<<endl; cout <<"double dNdx(int i, double x, double y){"<<endl; cout <<" switch(i) {"<<endl; for (unsigned int i=0; i< fe.nbf(); i++) { cout <<" case "<<i<<" : return dN"<<i<<"dx(x,y);"<<endl; } cout <<" }"<<endl; cout <<"}"<<endl; cout <<"double dNdy(int i, double x, double y){"<<endl; cout <<" switch(i) {"<<endl; for (unsigned int i=0; i< fe.nbf(); i++) { cout <<" case "<<i<<" : return dN"<<i<<"dy(x,y);"<<endl; } cout <<" }"<<endl; cout <<"}"<<endl; }
void compute_Poisson_element_matrix | ( | FE & | fe, |
Dof & | dof, | ||
std::map< std::pair< unsigned int, unsigned int >, GiNaC::ex > & | A | ||
) |
Definition at line 8 of file code_gen.cpp.
References SyFi::FE::dof(), SyFi::FE::get_polygon(), SyFi::Dof::glob_dof(), SyFi::grad(), SyFi::inner(), SyFi::Dof::insert_dof(), SyFi::Polygon::integrate(), SyFi::FE::N(), and SyFi::FE::nbf().
Referenced by check_CrouzeixRaviart(), and main().
{ 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++) { index.first = dof.glob_dof(fe.dof(i)); // fetch the global dof for Ni for (unsigned int j=0; j< fe.nbf(); j++) { index.second = dof.glob_dof(fe.dof(j)); // fetch the global dof for Nj GiNaC::ex nabla = inner(grad(fe.N(i)),grad(fe.N(j))); GiNaC::ex Aij = domain.integrate(nabla); // compute the integral A[index] += Aij; // add to global matrix } } }
int main | ( | ) |
Definition at line 79 of file code_gen.cpp.
References code_gen2D(), SyFi::compare_archives(), SyFi::Lagrange::compute_basis_functions(), compute_Poisson_element_matrix(), SyFi::initSyFi(), SyFi::istr(), SyFi::StandardFE::N(), SyFi::StandardFE::nbf(), print(), SyFi::StandardFE::set_order(), and SyFi::StandardFE::set_polygon().
{ initSyFi(2); Triangle triangle(lst(0,0), lst(1,0), lst(0,1)); Lagrange fe; fe.set_order(2); fe.set_polygon(triangle); fe.compute_basis_functions(); code_gen2D(fe); Dof dof; std::map<std::pair<unsigned int,unsigned int>, ex> A; ::compute_Poisson_element_matrix(fe, dof, A); cout <<"C code format on output "<<endl; cout <<csrc; print(A); archive ar; for (unsigned int i=0; i<fe.nbf(); i++) { ar.archive_ex(fe.N(i), istr("N",i).c_str()); } pair<unsigned int,unsigned int> index; for (unsigned int i=0; i<fe.nbf(); i++) { index.first = i; for (unsigned int j=0; j<fe.nbf(); j++) { index.second = j; ar.archive_ex(A[index], istr("A",i,j).c_str()); } } ofstream vfile("code_gen.gar.v"); vfile << ar; vfile.close(); if(!compare_archives("code_gen.gar.v", "code_gen.gar.r")) { cerr << "Failure!" << endl; return -1; } return 0; }