code_gen.cpp

Go to the documentation of this file.
00001 #include <SyFi.h>
00002 #include <fstream>
00003 
00004 using namespace GiNaC; 
00005 using namespace std; 
00006 
00007 void compute_Poisson_element_matrix(
00008                 FE& fe, 
00009                 Dof& dof, 
00010                 std::map<std::pair<int,int>, GiNaC::ex>& A)
00011 {
00012   std::pair<int,int> index; 
00013 
00014    // Insert the local degrees of freedom into the global Dof
00015   for (int i=0; i< fe.nbf(); i++) {
00016     dof.insert_dof(1,i,fe.dof(i)); 
00017   }
00018 
00019   Polygon& domain = fe.getPolygon(); 
00020 
00021   // The term (grad u, grad v)  
00022   for (int i=0; i< fe.nbf(); i++) {
00023     index.first = dof.glob_dof(fe.dof(i));               // fetch the global dof for Ni 
00024     for (int j=0; j< fe.nbf(); j++) {
00025       index.second = dof.glob_dof(fe.dof(j));            // fetch the global dof for Nj 
00026       GiNaC::ex nabla = inner(grad(fe.N(i)),grad(fe.N(j))); 
00027       GiNaC::ex Aij = domain.integrate(nabla);   // compute the integral  
00028       A[index] += Aij;                           // add to global matrix 
00029     }
00030   }
00031 }
00032 
00033 void code_gen2D(FE& fe){ 
00034   cout <<csrc; 
00035   for (int i=0; i< fe.nbf(); i++) {
00036     cout <<"double N"<<i<<"(double x, double y){"<<endl; 
00037     cout <<"  return "<<fe.N(i)<<";"<<endl; 
00038     cout <<"}"<<endl; 
00039   }
00040 
00041   for (int i=0; i< fe.nbf(); i++) {
00042     cout <<"double dN"<<i<<"dx(double x, double y){"<<endl; 
00043     cout <<"  return "<<diff(fe.N(i),x)<<";"<<endl; 
00044     cout <<"}"<<endl; 
00045   }
00046 
00047   for (int i=0; i< fe.nbf(); i++) {
00048     cout <<"double dN"<<i<<"dy(double x, double y){"<<endl; 
00049     cout <<"  return "<<diff(fe.N(i),y)<<";"<<endl; 
00050     cout <<"}"<<endl; 
00051   }
00052 
00053   cout <<"double N(int i, double x, double y){"<<endl; 
00054   cout <<"  switch(i) {"<<endl; 
00055   for (int i=0; i< fe.nbf(); i++) {
00056     cout <<"    case "<<i<<" :  return N"<<i<<"(x,y);"<<endl;  
00057   }
00058   cout <<"  }"<<endl; 
00059   cout <<"}"<<endl; 
00060 
00061   cout <<"double dNdx(int i, double x, double y){"<<endl; 
00062   cout <<"  switch(i) {"<<endl; 
00063   for (int i=0; i< fe.nbf(); i++) {
00064     cout <<"    case "<<i<<" :  return dN"<<i<<"dx(x,y);"<<endl;  
00065   }
00066   cout <<"  }"<<endl; 
00067   cout <<"}"<<endl; 
00068 
00069   cout <<"double dNdy(int i, double x, double y){"<<endl; 
00070   cout <<"  switch(i) {"<<endl; 
00071   for (int i=0; i< fe.nbf(); i++) {
00072     cout <<"    case "<<i<<" :  return dN"<<i<<"dy(x,y);"<<endl;  
00073   }
00074   cout <<"  }"<<endl; 
00075   cout <<"}"<<endl; 
00076 }
00077 
00078 int main() {
00079   int order =1; 
00080   Triangle triangle(lst(0,0), lst(1,0), lst(0,1));   
00081   LagrangeFE fe; 
00082   fe.set(2); 
00083   fe.set(triangle); 
00084   fe.compute_basis_functions(); 
00085   code_gen2D(fe); 
00086 
00087 
00088   Dof dof; 
00089   std::map<std::pair<int,int>, ex> A; 
00090   compute_Poisson_element_matrix(fe, dof, A); 
00091   cout <<"C code format on output "<<endl; 
00092   cout <<csrc; 
00093   print(A); 
00094 
00095 
00096 
00097 
00098 
00099 }

Generated on Wed Apr 19 12:38:13 2006 for SyFi by  doxygen 1.4.4