00001 #include <ArnoldFalkWintherWeakSym.h>
00002 #include <Nedelec2Hdiv.h>
00003 #include <DiscontinuousLagrangeFE.h>
00004
00005
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
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
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