00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00041 #ifndef __ASSEMBLY_H
00042 #define __ASSEMBLY_H
00043
00044 #include "OFELI_Config.h"
00045 #include "Vect.h"
00046 #include "LocalVect.h"
00047 #include "LocalMatrix.h"
00048 #include "SkMatrix.h"
00049 #include "SkSMatrix.h"
00050 #include "SpMatrix.h"
00051
00052 namespace OFELI {
00053
00065 template<class T_,size_t N_,class E_>
00066 void Assembly(const E_ &e, const LocalVect<T_,N_> &be, Vect<T_> &b)
00067 {
00068 size_t i=1;
00069 for (size_t n=1; n<=e.getNbNodes(); n++) {
00070 Node *nd = e.getPtrNode(n);
00071 for (size_t k=1; k<=nd->getNbDOF(); k++)
00072 b(nd->getDOF(k)) += be(i++);
00073 }
00074 }
00075
00076
00084 template<class T_,size_t N_,class E_>
00085 void Assembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, Vect<T_> &b)
00086 {
00087 size_t i = 0;
00088 for (size_t n=1; n<=e.getNbNodes(); n++) {
00089 Node *nd = e.getPtrNode(n);
00090 for (size_t k=1; k<=nd->getNbDOF(); k++) {
00091 i++;
00092 b(nd->getDOF(k)) += ae(i,i);
00093 }
00094 }
00095 }
00096
00097
00105 template<class T_,size_t N_,class E_>
00106 void Assembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, SkMatrix<T_> &a)
00107 {
00108 size_t i = 1;
00109 for (size_t in=1; in<=e.getNbNodes(); in++) {
00110 Node *nd1 = e.getPtrNode(in);
00111 for (size_t k=1; k<=nd1->getNbDOF(); k++) {
00112 size_t ii = nd1->getDOF(k);
00113 size_t j = 1;
00114 for (size_t jn=1; jn<=e.getNbNodes(); jn++) {
00115 Node *nd2 = e.getPtrNode(jn);
00116 for (size_t l=1; l<=nd2->getNbDOF(); l++) {
00117 a.Add(ii,nd2->getDOF(l),ae(i,j));
00118 j++;
00119 }
00120 }
00121 i++;
00122 }
00123 }
00124 }
00125
00126
00134 template<class T_,size_t N_,class E_>
00135 void Assembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, SkSMatrix<T_> &a)
00136 {
00137 size_t i=1, ii, jj;
00138 for (size_t in=1; in<=e.getNbNodes(); in++) {
00139 Node *nd1 = e.getPtrNode(in);
00140 for (size_t k=1; k<=nd1->getNbDOF(); k++) {
00141 if ((ii=nd1->getDOF(k)) > 0) {
00142 size_t j = 1;
00143 for (size_t jn=1; jn<=e.getNbNodes(); jn++) {
00144 Node *nd2 = e.getPtrNode(jn);
00145 for (size_t l=1; l<=nd2->getNbDOF(); l++) {
00146 if ((jj=nd2->getDOF(l)) > 0)
00147 a.Add(ii,jj,ae(i,j));
00148 j++;
00149 }
00150 }
00151 }
00152 i++;
00153 }
00154 }
00155 }
00156
00157
00165 template<class T_,size_t N_,class E_>
00166 void Assembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, SpMatrix<T_> &a)
00167 {
00168 size_t i = 1;
00169 for (size_t in=1; in<=e.getNbNodes(); in++) {
00170 Node *nd1 = e.getPtrNode(in);
00171 for (size_t k=1; k<=nd1->getNbDOF(); k++) {
00172 size_t ii=nd1->getDOF(k), j=1;
00173 for (size_t jn=1; jn<=e.getNbNodes(); jn++) {
00174 Node *nd2 = e.getPtrNode(jn);
00175 for (size_t l=1; l<=nd2->getNbDOF(); l++) {
00176 size_t jj = nd2->getDOF(l);
00177 a.Add(ii,jj,ae(i,j));
00178 j++;
00179 }
00180 }
00181 i++;
00182 }
00183 }
00184 }
00185
00186
00187 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00188
00195 template<class T_,size_t N_,class E_>
00196 void SAssembly(const E_ &e, const LocalVect<T_,N_> &be, Vect<T_> &b)
00197 {
00198 size_t i = 1;
00199 for (size_t n=1; n<=N_; n++)
00200 b(e.getNodeLabel(n)) += be(i++);
00201 }
00202
00203
00211 template<class T_,size_t N_,class E_>
00212 void SAssembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, Vect<T_> &b)
00213 {
00214 for (size_t n=1; n<=N_; n++)
00215 b(e.getNodeLabel(n)) += ae(n,n);
00216 }
00217
00218
00219 template<class T_,size_t N_,class E_>
00220 void SAssembly(const E_ &e, const LocalMatrix<T_,N_,N_> &ae, SkSMatrix<T_> &a)
00221 {
00222 size_t i = 1;
00223 for (size_t in=1; in<=N_; in++) {
00224 size_t ii = e.getPtrNode(in)->getLabel();
00225 size_t j = 1;
00226 for (size_t jn=1; jn<=N_; jn++) {
00227 size_t jj = e.getNodeLabel(jn);
00228 if (ii >= jj)
00229 a.Add(ii,jj,ae(i,j));
00230 j++;
00231 }
00232 i++;
00233 }
00234 }
00235 #endif
00236
00237
00244 template<class T_,size_t N_>
00245 void SideAssembly(const Element &e, const LocalMatrix<T_,N_,N_> &ae, SpMatrix<T_> &a)
00246 {
00247 size_t i = 1;
00248 for (size_t n=1; n<=e.getNbSides(); n++) {
00249 Side *s1 = e.getPtrSide(n);
00250 for (size_t k=1; k<=s1->getNbDOF(); k++) {
00251 if (s1->getDOF(k)!=0) {
00252 size_t j = 1;
00253 for (size_t m=1; m<=e.getNbSides(); m++) {
00254 Side *s2 = e.getPtrSide(m);
00255 for (size_t l=1; l<=s2->getNbDOF(); l++) {
00256 if (s2->getDOF(l)!=0)
00257 a.Add(s1->getDOF(k),s2->getDOF(l),ae(i,j));
00258 j++;
00259 }
00260 }
00261 }
00262 i++;
00263 }
00264 }
00265 }
00266
00267
00275 template<class T_,size_t N_>
00276 void SideAssembly(const Element &e, const LocalMatrix<T_,N_,N_> &ae, SkSMatrix<T_> &a)
00277 {
00278 size_t i=1, j, ii, jj;
00279 for (size_t n=1; n<=e.getNbSides(); n++) {
00280 Side *s1 = e.getPtrSide(n);
00281 for (size_t k=1; k<=s1->getNbDOF(); k++) {
00282 if ((ii=s1->getDOF(k)) > 0) {
00283 j = 1;
00284 for (size_t m=1; m<=e.getNbSides(); m++) {
00285 Side *s2 = e.getPtrSide(m);
00286 for (size_t l=1; l<=s2->getNbDOF(); l++) {
00287 if ((jj=s2->getDOF(l)) > 0)
00288 a.Add(ii,jj,ae(i,j));
00289 j++;
00290 }
00291 }
00292 }
00293 i++;
00294 }
00295 }
00296 }
00297
00298
00306 template<class T_,size_t N_>
00307 void SideAssembly(const Element &e, const LocalMatrix<T_,N_,N_> &ae, SkMatrix<T_> &a)
00308 {
00309 size_t i = 1;
00310 for (size_t n=1; n<=e.getNbSides(); n++) {
00311 Side *s1 = e.getPtrSide(n);
00312 for (size_t k=1; k<=s1->getNbDOF(); k++) {
00313 size_t ii = s1->getDOF(k);
00314 if (ii != 0) {
00315 size_t j = 1;
00316 for (size_t m=1; m<=e.getNbSides(); m++) {
00317 Side *s2 = e.getPtrSide(m);
00318 for (size_t l=1; l<=s2->getNbDOF(); l++) {
00319 size_t jj = s2->getDOF(l);
00320 if (jj)
00321 a.Add(ii,jj,ae(i,j));
00322 j++;
00323 }
00324 }
00325 }
00326 i++;
00327 }
00328 }
00329 }
00330
00331
00339 template<class T_,size_t N_>
00340 void SideAssembly(const Element &e, const LocalVect<T_,N_> &be, Vect<T_> &b)
00341 {
00342 size_t i = 1;
00343 for (size_t n=1; n<=e.getNbSides(); n++) {
00344 Side *sd = e.getPtrSide(n);
00345 for (size_t k=1; k<=sd->getNbDOF(); k++) {
00346 if (sd->getDOF(k) != 0)
00347 b(sd->getDOF(k)) += be(i);
00348 i++;
00349 }
00350 }
00351 }
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370 }
00371
00372 #endif