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 >, ex > &A) |
void | compute_nlconvdiff_element_matrix (FE &fe, Dof &dof, std::map< std::pair< unsigned int, unsigned int >, ex > &A) |
int | main () |
void compute_nlconvdiff_element_matrix | ( | FE & | fe, |
Dof & | dof, | ||
std::map< std::pair< unsigned int, unsigned int >, ex > & | A | ||
) |
Definition at line 36 of file nljacobian_ex.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 main().
{ std::pair<unsigned int,unsigned int> index; Polygon& domain = fe.get_polygon(); // insert the local dofs into the global Dof object for (unsigned int i=0; i< fe.nbf() ; i++) { dof.insert_dof(1,i,fe.dof(i)); } // create the local U field: U = sum_k u_k N_k ex UU = matrix(2,1,lst(0,0)); ex ujs = symbolic_matrix(1,fe.nbf(), "u"); for (unsigned int k=0; k< fe.nbf(); k++) { UU +=ujs.op(k)*fe.N(k); // U += u_k N_k } //Get U represented as a matrix matrix U = ex_to<matrix>(UU.evalm()); for (unsigned int i=0; i< fe.nbf() ; i++) { index.first = dof.glob_dof(fe.dof(i)); // fetch global dof associated with i // First: the diffusion term in Fi ex gradU = grad(U); // compute the gradient of U ex Fi_diffusion = inner(gradU, grad(fe.N(i))); // inner product of grad(U) and grad(Ni) // Second: the convection term in Fi ex Ut = U.transpose(); // get the transposed of U ex UgradU = (Ut*gradU).evalm(); // compute U*grad(U) ex Fi_convection = inner(UgradU, fe.N(i), true); // compute U*grad(U)*Ni // add together terms for convection and diffusion ex Fi = Fi_convection + Fi_diffusion; // Loop over all uj and differentiate Fi with respect // to uj to get the Jacobian Jij for (unsigned int j=0; j< fe.nbf() ; j++) { index.second = dof.glob_dof(fe.dof(j)); // fetch global dof associated with j symbol uj = ex_to<symbol>(ujs.op(j)); // cast uj to a symbol ex Jij = Fi.diff(uj,1); // differentiate Fi with respect to uj ex Aij = domain.integrate(Jij); // intergrate the Jacobian Jij A[index] += Aij; // update the global matrix } } }
void compute_poisson_element_matrix | ( | FE & | fe, |
Dof & | dof, | ||
std::map< std::pair< unsigned int, unsigned int >, ex > & | A | ||
) |
Definition at line 8 of file nljacobian_ex.cpp.
References SyFi::FE::get_polygon(), SyFi::grad(), SyFi::inner(), SyFi::Polygon::integrate(), SyFi::FE::N(), and SyFi::FE::nbf().
Referenced by main().
{ std::pair<unsigned int,unsigned int> index; Polygon& domain = fe.get_polygon(); ex ujs = symbolic_matrix(1,fe.nbf(), "u"); ex u; for (unsigned int k=0; k< fe.nbf(); k++) { u += ujs.op(k)*fe.N(k); } for (unsigned int i=0; i< fe.nbf() ; i++) { index.first = i; ex Fi = inner(grad(u), grad(fe.N(i))); for (unsigned int j=0; j< fe.nbf() ; j++) { index.second = j; symbol uj = ex_to<symbol>(ujs.op(j)); ex nabla = Fi.diff(uj,1); ex Aij = domain.integrate(nabla); A[index] += Aij; } } }
int main | ( | ) |
Definition at line 90 of file nljacobian_ex.cpp.
References SyFi::compare_archives(), SyFi::Lagrange::compute_basis_functions(), SyFi::VectorLagrange::compute_basis_functions(), compute_nlconvdiff_element_matrix(), compute_poisson_element_matrix(), SyFi::initSyFi(), SyFi::istr(), print(), SyFi::StandardFE::set_order(), SyFi::StandardFE::set_polygon(), SyFi::VectorLagrange::set_size(), and SyFi::usage().
{ initSyFi(2); Triangle T(lst(0,0), lst(1,0), lst(0,1), "t"); int order = 2; // First we compute a standard Poisson problem, i.e., // The differentiation of F(u_i) with respect to u_j // should give the standard Poisson problem. Lagrange fe; fe.set_order(order); fe.set_polygon(T); fe.compute_basis_functions(); Dof dof1; std::map<std::pair<unsigned int,unsigned int>, ex> A1; compute_poisson_element_matrix(fe,dof1,A1); print(A1); // Second we compute a nonlinear convection // diffusion problem. VectorLagrange vfe; vfe.set_order(order); vfe.set_size(2); vfe.set_polygon(T); vfe.compute_basis_functions(); usage(vfe); Dof dof2; std::map<std::pair<unsigned int,unsigned int>, ex> A2; compute_nlconvdiff_element_matrix(vfe,dof2,A2); cout <<"standard output"<<endl; print(A2); cout <<"LaTeX output"<<endl; cout <<latex; print(A2); cout <<"Python output"<<endl; cout <<python; print(A2); cout <<"C output"<<endl; cout <<csrc; print(A2); // regression test archive ar; map<std::pair<unsigned int,unsigned int>,ex>::iterator iter; for (iter = A1.begin(); iter != A1.end() ; iter++) { ar.archive_ex((*iter).second, istr("A1_", (*iter).first.first, (*iter).first.second).c_str()); } for (iter = A2.begin(); iter != A2.end() ; iter++) { ar.archive_ex((*iter).second, istr("A2_", (*iter).first.first, (*iter).first.second).c_str()); } ofstream vfile("nljacobian_ex.gar.v"); vfile << ar; vfile.close(); if(!compare_archives("nljacobian_ex.gar.v", "nljacobian_ex.gar.r")) { cerr << "Failure!" << endl; return -1; } return 0; }