ArnoldFalkWintherWeakSym.cpp

Go to the documentation of this file.
00001 #include <ArnoldFalkWintherWeakSym.h>
00002 #include <Nedelec2Hdiv.h>
00003 #include <DiscontinuousLagrangeFE.h>
00004 
00005 //------------ sigma element 
00006 
00007 int ArnoldFalkWintherWeakSymSigma:: nbf() {
00008   return Ns.size();  
00009 }
00010 
00011 
00012 
00013 void ArnoldFalkWintherWeakSymSigma:: compute_basis_functions() {
00014 
00015   if ( order < 1 ) {
00016     cout <<"Arnold-Falk-Winther elements must be of order 1 or higher."<<endl; 
00017     return; 
00018   }
00019 
00020 
00021   if ( p == NULL ) {
00022     cout <<"You need to set a polygon before the basisfunctions can be computed"<<endl; 
00023     return; 
00024   }
00025 
00026   Nedelec2Hdiv fe; 
00027   fe.set(order); 
00028   fe.set(*p); 
00029   fe.compute_basis_functions(); 
00030 
00031   for (int d=0; d<3; d++) {
00032     for (int i=0; i<fe.nbf(); i++) {
00033       GiNaC::matrix Nmat = GiNaC::matrix(3,3); 
00034       Nmat(d,0) = fe.N(i).op(0); 
00035       Nmat(d,1) = fe.N(i).op(1); 
00036       Nmat(d,2) = fe.N(i).op(2); 
00037       Ns.insert(Ns.end(), Nmat); 
00038       dofs.insert(dofs.end(),GiNaC::lst(fe.dof(i), d)); 
00039     }
00040   }
00041 }
00042 
00043 
00044 void ArnoldFalkWintherWeakSymSigma:: set(Polygon& p_) {
00045   StandardFE::set(p_); 
00046 }
00047 
00048 
00049 void ArnoldFalkWintherWeakSymSigma:: set(int order_) { 
00050   StandardFE::set(order_); 
00051 }
00052 
00053 
00054 GiNaC::ex ArnoldFalkWintherWeakSymSigma:: dof(int i) {
00055   return StandardFE::dof(i);  
00056 }
00057 
00058 
00059 GiNaC::ex ArnoldFalkWintherWeakSymSigma::N(int i) {  
00060   return StandardFE::N(i); 
00061 }
00062 
00063 
00064 //------------ u element 
00065 
00066 int ArnoldFalkWintherWeakSymU:: nbf() {
00067   return Ns.size();  
00068 }
00069 
00070 
00071 void ArnoldFalkWintherWeakSymU:: compute_basis_functions() {
00072 
00073   if ( order < 1 ) {
00074     cout <<"Arnold-Falk-Winther elements must be of order 1 or higher."<<endl; 
00075     return; 
00076   }
00077 
00078 
00079   if ( p == NULL ) {
00080     cout <<"You need to set a polygon before the basisfunctions can be computed"<<endl; 
00081     return; 
00082   }
00083 
00084   
00085   VectorDiscontinuousLagrangeFE fe;  
00086   fe.set(order); 
00087   fe.set_size(3); 
00088   fe.set(*p); 
00089   fe.compute_basis_functions(); 
00090 
00091   for (int i=0; i<fe.nbf(); i++) {
00092       GiNaC::lst Ni = GiNaC::lst(fe.N(i).op(0), fe.N(i).op(1), fe.N(i).op(2)); 
00093       GiNaC::ex Nmat = GiNaC::matrix(3,1,Ni); 
00094       Ns.insert(Ns.end(), Nmat); 
00095   }
00096 }
00097 
00098 
00099 void ArnoldFalkWintherWeakSymU:: set(Polygon& p_) {
00100   StandardFE::set(p_); 
00101 }
00102 
00103 
00104 void ArnoldFalkWintherWeakSymU:: set(int order_) { 
00105   StandardFE::set(order_); 
00106 }
00107 
00108 
00109 GiNaC::ex ArnoldFalkWintherWeakSymU:: dof(int i) {
00110   return StandardFE::dof(i);  
00111 }
00112 
00113 
00114 GiNaC::ex ArnoldFalkWintherWeakSymU::N(int i) {  
00115   return StandardFE::N(i); 
00116 }
00117 
00118 
00119 
00120 //------------ p element 
00121 
00122 int ArnoldFalkWintherWeakSymP:: nbf() {
00123   return Ns.size();  
00124 }
00125 
00126 
00127 
00128 
00129 void ArnoldFalkWintherWeakSymP:: compute_basis_functions() {
00130 
00131   if ( order < 1 ) {
00132     cout <<"Arnold-Falk-Winther elements must be of order 1 or higher."<<endl; 
00133     return; 
00134   }
00135 
00136 
00137   if ( p == NULL ) {
00138     cout <<"You need to set a polygon before the basisfunctions can be computed"<<endl; 
00139     return; 
00140   }
00141 
00142   
00143   VectorDiscontinuousLagrangeFE fe;  
00144   fe.set(order); 
00145   fe.set_size(3); 
00146   fe.set(*p); 
00147   fe.compute_basis_functions(); 
00148 
00149   for (int d=0; d<3; d++) {
00150     for (int i=0; i<fe.nbf(); i++) {
00151       GiNaC::matrix Nmat = GiNaC::matrix(3,3); 
00152       Nmat(1,2) = -fe.N(i).op(0); 
00153       Nmat(2,1) =  fe.N(i).op(0); 
00154 
00155       Nmat(0,2) =  fe.N(i).op(1); 
00156       Nmat(2,0) = -fe.N(i).op(1); 
00157 
00158       Nmat(0,1) = -fe.N(i).op(2); 
00159       Nmat(1,0) =  fe.N(i).op(2); 
00160 
00161       Ns.insert(Ns.end(), Nmat); 
00162     }
00163   }
00164 }
00165 
00166 
00167 
00168 
00169 void ArnoldFalkWintherWeakSymP:: set(Polygon& p_) {
00170   StandardFE::set(p_); 
00171 }
00172 
00173 
00174 void ArnoldFalkWintherWeakSymP:: set(int order_) { 
00175   StandardFE::set(order_); 
00176 }
00177 
00178 
00179 GiNaC::ex ArnoldFalkWintherWeakSymP:: dof(int i) {
00180   return StandardFE::dof(i);  
00181 }
00182 
00183 
00184 GiNaC::ex ArnoldFalkWintherWeakSymP::N(int i) {  
00185   return StandardFE::N(i); 
00186 }
00187 
00188 
00189 
00190 
00191 

Generated on Tue Jun 13 13:18:38 2006 for SyFi by  doxygen 1.4.4