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
00033
00034 #ifndef __ABS_VECT_H
00035 #define __ABS_VECT_H
00036
00037 #include <iostream>
00038 #include <fstream>
00039 using std::istream;
00040 using std::ostream;
00041 using std::endl;
00042
00043 #include <iomanip>
00044 using std::setw;
00045 using std::ios;
00046 using std::setprecision;
00047
00048 #include <string>
00049 using std::string;
00050
00051 #include <valarray>
00052 using std::valarray;
00053
00054 #include "OFELI_Config.h"
00055 #include "Mesh.h"
00056 #include "Vect.h"
00057 #include "FFI.h"
00058 #include "fparser.h"
00059 #include "util.h"
00060
00061 extern FunctionParser _theParser;
00062
00063 namespace OFELI {
00064
00084 template <class T_> class Vect;
00085 template <class T_> class AbsVect;
00086
00087
00088
00089
00090
00091
00092 template <class T_>
00093 class AbsVect
00094 {
00095
00096 public:
00097
00100 AbsVect();
00101
00107 AbsVect(const class Mesh &mesh, size_t nb_dof=1);
00108
00116 AbsVect(const class Mesh &mesh, size_t nb_dof, const string &name, double time=0);
00117
00123 AbsVect(const class Mesh &mesh, const string &name=" ", double time=0);
00124
00134 AbsVect(const class Mesh &mesh, size_t nb_dof, size_t first_dof, const string &name, double time=0);
00135
00139 AbsVect(Vect<T_> &v);
00140
00142 virtual ~AbsVect();
00143
00146 char *getBinary();
00147
00150 void setBinary(char *s);
00151
00156 virtual void setMesh(const class Mesh &ms, size_t nb_dof=0)=0;
00157
00163 void Fill(const valarray<T_> &v, size_t dof=0);
00164
00167 void Copy(valarray<T_> &v);
00168
00171 void setName(const string &name);
00172
00173 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00176 void setField(int field);
00177 #endif
00178
00180 const string &getName() const;
00181
00184 void setTime(double time);
00185
00187 double getTime() const;
00188
00190 const Mesh &getMesh() const;
00191
00194 size_t getNbX() const;
00195
00197 double getNorm2() const;
00198
00202 double getWNorm2() const;
00203
00205 double getNormMax() const;
00206
00209 double getNorm2(size_t j) const;
00210
00216 double getWNorm2(size_t j) const;
00217
00220 double getNormMax(size_t j) const;
00221
00224 double getMin(size_t j) const;
00225
00228 double getMax(size_t j) const;
00229
00233 T_ & operator()(size_t i, size_t j=1, size_t k=1);
00234
00238 T_ operator()(size_t i, size_t j=1, size_t k=1) const;
00239
00243 AbsVect<T_> & operator*=(T_ a);
00244
00248 AbsVect<T_> & operator/=(T_ a);
00249
00253 AbsVect<T_> & operator+=(T_ a);
00254
00258 AbsVect<T_> & operator-=(T_ a);
00259
00262 AbsVect<T_> & operator=(const AbsVect<T_> &v);
00263
00266 AbsVect<T_> & operator-=(const AbsVect<T_> &v);
00267
00270 AbsVect<T_> & operator+=(const AbsVect<T_> &v);
00271
00274 AbsVect<T_> & operator=(const valarray<T_> &v);
00275
00280 virtual void insertBC(const Vect<T_> &v, const Vect<T_> &bc);
00281
00284 void BGet(const string &file);
00285
00289 void BPut(const string &file);
00290
00292 size_t getLength() const;
00293
00295 void setLength(size_t n);
00296
00298 size_t getNbDOF() const;
00299
00301 void setNbDOF(int n);
00302
00303 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00304 size_t getNb() const { return _nb; }
00305 #endif
00306
00309 int getField() const;
00310
00312 Vect<T_> &getVect();
00313
00315 void selectDOF(size_t dof);
00316
00318 void unselectDOF();
00319
00320 protected:
00321 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00322 Vect<T_> _v;
00323 valarray<string> _kw;
00324 double _time;
00325 size_t _nb_dof, _first_dof, _length, _nb, _nbn, _this_dof;
00326 int _field;
00327 string _name;
00328 valarray<T_> _M, _b;
00329 const Mesh *_theMesh;
00330
00333 void Init();
00334 #endif
00335 };
00336
00337
00339
00341
00342
00343 template <class T_>
00344 AbsVect<T_>::AbsVect()
00345 {
00346 _first_dof = 1;
00347 _this_dof = 0;
00348 _time = 0.;
00349 _length = 0;
00350 _theMesh = NULL;
00351 _name = "u";
00352 _kw.resize(7);
00353 _kw[0] = "EOF$";
00354 _kw[1] = "Name$";
00355 _kw[2] = "NbDOF$";
00356 _kw[3] = "NbNodes$";
00357 _kw[4] = "Time$";
00358 _kw[5] = "Data$";
00359 _kw[6] = "Val$ue";
00360 }
00361
00362
00363 template <class T_>
00364 AbsVect<T_>::AbsVect(const class Mesh &mesh, size_t nb_dof)
00365 {
00366 _nb_dof = nb_dof;
00367 _this_dof = 0;
00368 _nbn = 1;
00369 _first_dof = 1;
00370 _time = 0.;
00371 _theMesh = &mesh;
00372 _name = "u";
00373 _kw.resize(7);
00374 _kw[0] = "EOF$";
00375 _kw[1] = "Name$";
00376 _kw[2] = "NbDOF$";
00377 _kw[3] = "NbNodes$";
00378 _kw[4] = "Time$";
00379 _kw[5] = "Data$";
00380 _kw[6] = "Val$ue";
00381 }
00382
00383
00384 template <class T_>
00385 AbsVect<T_>::AbsVect(const class Mesh &mesh, size_t nb_dof, const string &name, double time)
00386 {
00387 _nb_dof = nb_dof;
00388 _this_dof = 0;
00389 _nbn = 1;
00390 _first_dof = 1;
00391 _time = time;
00392 _theMesh = &mesh;
00393 _name = name;
00394 _kw.resize(7);
00395 _kw[0] = "EOF$";
00396 _kw[1] = "Name$";
00397 _kw[2] = "NbDOF$";
00398 _kw[3] = "NbNodes$";
00399 _kw[4] = "Time$";
00400 _kw[5] = "Data$";
00401 _kw[6] = "Val$ue";
00402 }
00403
00404
00405 template <class T_>
00406 AbsVect<T_>::AbsVect(const class Mesh &mesh, const string &name, double time)
00407 {
00408 _nbn = 1;
00409 _first_dof = 1;
00410 _this_dof = 0;
00411 _time = time;
00412 _theMesh = &mesh;
00413 _name = name;
00414 _length = mesh.getNbDOF();
00415 _kw.resize(7);
00416 _kw[0] = "EOF$";
00417 _kw[1] = "Name$";
00418 _kw[2] = "NbDOF$";
00419 _kw[3] = "NbNodes$";
00420 _kw[4] = "Time$";
00421 _kw[5] = "Data$";
00422 _kw[6] = "Val$ue";
00423 }
00424
00425
00426 template <class T_>
00427 AbsVect<T_>::AbsVect(const class Mesh &mesh, size_t nb_dof, size_t first_dof, const string &name, double time)
00428 {
00429 _nb_dof = nb_dof;
00430 _nbn = 1;
00431 _first_dof = first_dof;
00432 _this_dof = 0;
00433 _time = time;
00434 _theMesh = &mesh;
00435 _name = name;
00436 _kw.resize(7);
00437 _kw[0] = "EOF$";
00438 _kw[1] = "Name$";
00439 _kw[2] = "NbDOF$";
00440 _kw[4] = "Time$";
00441 _kw[5] = "Data$";
00442 _kw[6] = "Val$ue";
00443 }
00444
00445
00446 template <class T_>
00447 AbsVect<T_>::AbsVect(Vect<T_> &v)
00448 {
00449 &_v = &(v._v);
00450 _name = "u";
00451 _this_dof = 0;
00452 }
00453
00454
00455 template <class T_>
00456 AbsVect<T_>::~AbsVect() { }
00457
00458
00459 template <class T_>
00460 void AbsVect<T_>::Fill(const valarray<T_> &v, size_t dof)
00461 {
00462 #ifdef _BOUNDS_DEBUG
00463 assert(v.size() == _length);
00464 #endif
00465 if (dof==0)
00466 for (size_t i=0; i<_length; ++i)
00467 _v[i] = v[i];
00468 else
00469 for (size_t i=0; i<_nb*_nbn; ++i)
00470 _v[_nb_dof*i+dof-1] = v[i];
00471 }
00472
00473
00474 template <class T_>
00475 char *AbsVect<T_>::getBinary()
00476 {
00477 return reinterpret_cast<char *>(&_v);
00478 }
00479
00480
00481 template <class T_>
00482 void AbsVect<T_>::setBinary(char *s)
00483 {
00484 _v = *reinterpret_cast<Vect<T_> *>(s);
00485 }
00486
00487
00488 template <class T_>
00489 void AbsVect<T_>::Copy(valarray<T_> &v)
00490 {
00491 for (size_t i=0; i<_length; ++i)
00492 v[i] = _v[i];
00493 }
00494
00495
00496 template <class T_>
00497 void AbsVect<T_>::setName(const string &name)
00498 {
00499 _name = name;
00500 }
00501
00502
00503 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00504 template <class T_>
00505 void AbsVect<T_>::setField(int field)
00506 {
00507 _field = field;
00508 }
00509 #endif
00510
00511
00512 template <class T_>
00513 const string &AbsVect<T_>::getName() const
00514 {
00515 return _name;
00516 }
00517
00518
00519 template <class T_>
00520 void AbsVect<T_>::setTime(double time)
00521 {
00522 _time = time;
00523 }
00524
00525
00526 template <class T_>
00527 double AbsVect<T_>::getTime() const
00528 {
00529 return _time;
00530 }
00531
00532
00533 template <class T_>
00534 const Mesh &AbsVect<T_>::getMesh() const
00535 {
00536 return *_theMesh;
00537 }
00538
00539
00540 template <class T_>
00541 size_t AbsVect<T_>::getNbX() const
00542 {
00543 return _nb;
00544 }
00545
00546
00547 template <class T_>
00548 double AbsVect<T_>::getNorm2() const
00549 {
00550 double s = 0.;
00551 for (size_t i=0; i<_length; ++i)
00552 s += _v[i] * _v[i];
00553 return sqrt(s);
00554 }
00555
00556
00557 template <class T_>
00558 double AbsVect<T_>::getWNorm2() const
00559 {
00560 return getNorm2()/sqrt(_length);
00561 }
00562
00563
00564 template <class T_>
00565 double AbsVect<T_>::getNormMax() const
00566 {
00567 double s = 0.;
00568 for (size_t i=0; i<_length; ++i)
00569 s = max(abs(_v[i]),s);
00570 return s;
00571 }
00572
00573
00574 template <class T_>
00575 double AbsVect<T_>::getNorm2(size_t j) const
00576 {
00577 double s = 0.;
00578 #ifdef _BOUNDS_DEBUG
00579 assert(j>0 && j<=_nb_dof);
00580 #endif
00581 for (size_t i=0; i<_nb*_nbn; ++i)
00582 s += _v[_nb_dof*i+j-1];
00583 return sqrt(s);
00584 }
00585
00586
00587 template <class T_>
00588 double AbsVect<T_>::getWNorm2(size_t j) const
00589 {
00590 return getNorm2(j)/sqrt(_nb);
00591 }
00592
00593
00594 template <class T_>
00595 double AbsVect<T_>::getNormMax(size_t j) const
00596 {
00597 double s = 0.;
00598 for (size_t i=0; i<_length; ++i)
00599 s = max(Abs(_v[i]),s);
00600 return s;
00601 }
00602
00603
00604 template <class T_>
00605 double AbsVect<T_>::getMin(size_t j) const
00606 {
00607 #ifdef _BOUNDS_DEBUG
00608 assert(j>0 && j<=_nb_dof);
00609 #endif
00610 double s = _v[j-1];
00611 for (size_t i=1; i<_nb; ++i)
00612 s = Min(_v[_nb_dof*i+j-1],s);
00613 return s;
00614 }
00615
00616
00617 template <class T_>
00618 double AbsVect<T_>::getMax(size_t j) const
00619 {
00620 #ifdef _BOUNDS_DEBUG
00621 assert(j>0 && j<=_nb_dof);
00622 #endif
00623 double s = _v[j-1];
00624 for (size_t i=1; i<_nb*_nbn; ++i)
00625 s = Max(_v[_nb_dof*i+j-1],s);
00626 return s;
00627 }
00628
00629
00630 template <class T_>
00631 T_ &AbsVect<T_>::operator()(size_t i, size_t j, size_t k)
00632 {
00633 #ifdef _BOUNDS_DEBUG
00634 assert(i>0 && i<=_nb);
00635 assert(j>0 && j<=_nbn);
00636 assert(k>0 && k<=_nb_dof);
00637 #endif
00638 return _v[_nb_dof*(i-1)+_nbn*(j-1)+k-1];
00639 }
00640
00641
00642 template <class T_>
00643 T_ AbsVect<T_>::operator()(size_t i, size_t j, size_t k) const
00644 {
00645 #ifdef _BOUNDS_DEBUG
00646 assert(i>0 && i<=_nb);
00647 assert(j>0 && j<=_nbn);
00648 assert(k>0 && k<=_nb_dof);
00649 #endif
00650 return _v[_nb_dof*(i-1)+_nbn*(j-1)+k-1];
00651 }
00652
00653
00654 template <class T_>
00655 AbsVect<T_> &AbsVect<T_>::operator*=(T_ a)
00656 {
00657 for (size_t i=0; i<_length; ++i)
00658 _v[i] *= a;
00659 return *this;
00660 }
00661
00662
00663 template <class T_>
00664 AbsVect<T_> &AbsVect<T_>::operator/=(T_ a)
00665 {
00666 for (size_t i=0; i<_length; ++i)
00667 _v[i] /= a;
00668 return *this;
00669 }
00670
00671
00672 template <class T_>
00673 AbsVect<T_> &AbsVect<T_>::operator+=(T_ a)
00674 {
00675 for (size_t i=0; i<_length; ++i)
00676 _v[i] += a;
00677 return *this;
00678 }
00679
00680
00681 template <class T_>
00682 AbsVect<T_> &AbsVect<T_>::operator-=(T_ a)
00683 {
00684 for (size_t i=0; i<_length; ++i)
00685 _v[i] -= a;
00686 return *this;
00687 }
00688
00689
00690 template <class T_>
00691 AbsVect<T_> &AbsVect<T_>::operator=(const AbsVect<T_> &v)
00692 {
00693 #ifdef _BOUNDS_DEBUG
00694 assert(v._nb == _nb);
00695 assert(v._length == _length);
00696 #endif
00697 for (size_t i=0; i<_length; ++i)
00698 _v[i] = v._v[i];
00699 return *this;
00700 }
00701
00702
00703 template <class T_>
00704 AbsVect<T_> &AbsVect<T_>::operator-=(const AbsVect<T_> &v)
00705 {
00706 #ifdef _BOUNDS_DEBUG
00707 assert(v._nb == _nb);
00708 assert(v._nbn == _nbn);
00709 assert(v._nb_dof == _nb_dof);
00710 #endif
00711 for (size_t i=0; i<_length; ++i)
00712 _v[i] -= v._v[i];
00713 return *this;
00714 }
00715
00716
00717 template <class T_>
00718 AbsVect<T_> &AbsVect<T_>::operator+=(const AbsVect<T_> &v)
00719 {
00720 #ifdef _BOUNDS_DEBUG
00721 assert(v._nb == _nb);
00722 assert(v._nbn == _nbn);
00723 assert(v._nb_dof == _nb_dof);
00724 #endif
00725 for (size_t i=0; i<_length; ++i)
00726 _v[i] += v._v[i];
00727 return *this;
00728 }
00729
00730
00731 template <class T_>
00732 AbsVect<T_> &AbsVect<T_>::operator=(const valarray<T_> &v)
00733 {
00734 #ifdef _BOUNDS_DEBUG
00735 assert(v._size == _length);
00736 #endif
00737 for (size_t i=0; i<_length; ++i)
00738 _v[i] = v[i];
00739 return *this;
00740 }
00741
00742
00743 template <class T_>
00744 void AbsVect<T_>::insertBC(const Vect<T_> &v, const Vect<T_> &bc)
00745 {
00746 v.size();
00747 bc.size();
00748 }
00749
00750
00751 template <class T_>
00752 void AbsVect<T_>::BGet(const string &file)
00753 {
00754 ifstream ff(file.c_str(),ios::binary);
00755 ff.read(reinterpret_cast<char *>(this),sizeof(*this));
00756 }
00757
00758
00759 template <class T_>
00760 void AbsVect<T_>::BPut(const string &file)
00761 {
00762 ofstream ff(file.c_str(),ios::binary);
00763 ff.write(reinterpret_cast<const char *>(this),sizeof(*this));
00764 }
00765
00766
00767 template <class T_>
00768 size_t AbsVect<T_>::getLength() const
00769 {
00770 return _length;
00771 }
00772
00773
00774 template <class T_>
00775 void AbsVect<T_>::setLength(size_t n)
00776 {
00777 _length = n;
00778 }
00779
00780
00781 template <class T_>
00782 size_t AbsVect<T_>::getNbDOF() const
00783 {
00784 return _nb_dof;
00785 }
00786
00787
00788 template <class T_>
00789 void AbsVect<T_>::setNbDOF(int n)
00790 {
00791 _nb_dof = n;
00792 }
00793
00794
00795 template <class T_>
00796 int AbsVect<T_>::getField() const
00797 {
00798 return _field;
00799 }
00800
00801
00802 template <class T_>
00803 Vect<T_> &AbsVect<T_>::getVect()
00804 {
00805 return _v;
00806 }
00807
00808
00809 template <class T_>
00810 void AbsVect<T_>::selectDOF(size_t dof)
00811 {
00812 _this_dof = dof;
00813 }
00814
00815
00816 template <class T_>
00817 void AbsVect<T_>::unselectDOF()
00818 {
00819 _this_dof = 0;
00820 }
00821
00822
00823 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00824 template <class T_>
00825 void AbsVect<T_>::Init()
00826 {
00827 _v.resize(_length);
00828 for (size_t i=0; i<_length; ++i)
00829 _v[i] = 0;
00830 }
00831 #endif
00832
00833
00834 }
00835
00836 #endif