00001 #include <ElementComputations.h>
00002
00003 void usage(FE& fe) {
00004 for (int i=0; i< fe.nbf(); i++) {
00005 cout <<"fe.N("<<i<<") = "<<fe.N(i)<<endl;
00006 cout <<"grad(fe.N("<<i<<")) = "<<grad(fe.N(i))<<endl;
00007 cout <<"fe.dof("<<i<<") = "<<fe.dof(i)<<endl;
00008 }
00009 }
00010
00011 void usage(FE& v_fe, FE& p_fe) {
00012 for (int i=0; i< v_fe.nbf(); i++) {
00013 cout <<"v_fe.N("<<i<<") = "<<v_fe.N(i)<<endl;
00014 cout <<"grad(v_fe.N("<<i<<")) = "<<grad(v_fe.N(i))<<endl;
00015 cout <<"v_fe.dof("<<i<<") = "<<v_fe.dof(i)<<endl;
00016 }
00017 for (int i=0; i< p_fe.nbf(); i++) {
00018 cout <<"p_fe.N("<<i<<")= "<<p_fe.N(i)<<endl;
00019 cout <<"p_fe.dof("<<i<<")= "<<p_fe.dof(i)<<endl;
00020 }
00021 }
00022
00023
00024
00025 void compute_Poisson_element_matrix(
00026 FE& fe,
00027 Dof& dof,
00028 std::map<std::pair<int,int>, GiNaC::ex>& A)
00029 {
00030 std::pair<int,int> index;
00031
00032
00033 for (int i=0; i< fe.nbf(); i++) {
00034 dof.insert_dof(1,i,fe.dof(i));
00035 }
00036
00037 Polygon& domain = fe.getPolygon();
00038
00039
00040 for (int i=0; i< fe.nbf(); i++) {
00041 index.first = dof.glob_dof(fe.dof(i));
00042 for (int j=0; j< fe.nbf(); j++) {
00043 index.second = dof.glob_dof(fe.dof(j));
00044 GiNaC::ex nabla = inner(grad(fe.N(i)),
00045 grad(fe.N(j)));
00046 GiNaC::ex Aij = domain.integrate(nabla);
00047 A[index] += Aij;
00048 }
00049 }
00050 }
00051
00052
00053
00054 void compute_Stokes_element_matrix(
00055 FE& v_fe,
00056 FE& p_fe,
00057 Dof& dof,
00058 std::map<std::pair<int,int>, GiNaC::ex>& A)
00059 {
00060 std::pair<int,int> index;
00061 std::pair<int,int> index2;
00062
00063
00064
00065 Polygon& domain = v_fe.getPolygon();
00066
00067
00068 for (int i=0; i< v_fe.nbf(); i++) {
00069 dof.insert_dof(1,i,v_fe.dof(i));
00070 }
00071 for (int i=0; i< p_fe.nbf(); i++) {
00072 dof.insert_dof(1,v_fe.nbf()+i,p_fe.dof(i));
00073 }
00074
00075
00076
00077
00078
00079 for (int i=0; i< v_fe.nbf(); i++) {
00080 index.first = dof.glob_dof(v_fe.dof(i));
00081 for (int j=0; j< v_fe.nbf(); j++) {
00082 index.second = dof.glob_dof(v_fe.dof(j));
00083 GiNaC::ex nabla = inner(grad(v_fe.N(i)),
00084 grad(v_fe.N(j)));
00085 GiNaC::ex Aij = domain.integrate(nabla);
00086 A[index] += Aij;
00087 }
00088 }
00089
00090
00091
00092
00093 for (int i=0; i< p_fe.nbf(); i++) {
00094 index.first = dof.glob_dof(p_fe.dof(i));
00095 for (int j=0; j< v_fe.nbf(); j++) {
00096 index.second=dof.glob_dof(v_fe.dof(j));
00097 GiNaC::ex divV= -p_fe.N(i)*div(v_fe.N(j));
00098 GiNaC::ex Aij = domain.integrate(divV);
00099 A[index] += Aij;
00100
00101
00102
00103 index2.first = index.second;
00104 index2.second = index.first;
00105 A[index2] += Aij;
00106 }
00107 }
00108 }
00109
00110
00111
00112 void compute_mixed_Poisson_element_matrix(
00113 FE& v_fe,
00114 FE& p_fe,
00115 Dof& dof,
00116 std::map<std::pair<int,int>, GiNaC::ex>& A)
00117 {
00118 std::pair<int,int> index;
00119 std::pair<int,int> index2;
00120
00121
00122
00123 Polygon& domain = v_fe.getPolygon();
00124
00125
00126 for (int i=0; i< v_fe.nbf(); i++) {
00127 dof.insert_dof(1,i,v_fe.dof(i));
00128 }
00129 for (int i=0; i< p_fe.nbf(); i++) {
00130 dof.insert_dof(1,v_fe.nbf()+i+1,p_fe.dof(i));
00131 }
00132
00133
00134
00135
00136 for (int i=0; i< v_fe.nbf(); i++) {
00137 index.first = dof.glob_dof(v_fe.dof(i));
00138 for (int j=0; j< v_fe.nbf(); j++) {
00139 index.second = dof.glob_dof(v_fe.dof(j));
00140 GiNaC::ex mass = inner(v_fe.N(i),v_fe.N(j));
00141 GiNaC::ex Aij = domain.integrate(mass);
00142 A[index] += Aij;
00143 }
00144 }
00145
00146
00147 for (int i=0; i< p_fe.nbf(); i++) {
00148 index.first = dof.glob_dof(p_fe.dof(i));
00149 for (int j=0; j< v_fe.nbf(); j++) {
00150 index.second=dof.glob_dof(v_fe.dof(j));
00151 GiNaC::ex divV= -p_fe.N(i)*div(v_fe.N(j));
00152 GiNaC::ex Aij = domain.integrate(divV);
00153 A[index] += Aij;
00154
00155
00156
00157 index2.first = index.second;
00158 index2.second = index.first;
00159 A[index2] += Aij;
00160 }
00161 }
00162 }
00163