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
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
00022 for (int i=0; i< fe.nbf(); i++) {
00023 index.first = dof.glob_dof(fe.dof(i));
00024 for (int j=0; j< fe.nbf(); j++) {
00025 index.second = dof.glob_dof(fe.dof(j));
00026 GiNaC::ex nabla = inner(grad(fe.N(i)),grad(fe.N(j)));
00027 GiNaC::ex Aij = domain.integrate(nabla);
00028 A[index] += Aij;
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 }