NuTo
Numerics Tool
DofVector.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <map>
4 #include <vector>
5 #include <eigen3/Eigen/Core>
7 
8 namespace NuTo
9 {
10 
11 template <typename T>
12 class DofVector
13 {
14 public:
19  {
20  return mData.at(dofType);
21  }
22 
30  {
31  return mData[dofType];
32  }
33 
36  {
37  for (auto& entry : rhs.mData)
38  {
39  if (mData.find(entry.first) != mData.end())
40  mData[entry.first] += entry.second;
41  else
42  mData[entry.first] = entry.second;
43  }
44  return *this;
45  }
46 
49  {
50  for (auto& entry : rhs.mData)
51  {
52  if (mData.find(entry.first) != mData.end())
53  mData[entry.first] -= entry.second;
54  else
55  mData[entry.first] = -entry.second;
56  }
57  return *this;
58  }
59 
60  DofVector& operator*=(double scalar)
61  {
62  for (auto& entry : mData)
63  entry.second *= scalar;
64  return *this;
65  }
66 
68  {
69  lhs += rhs;
70  return lhs;
71  }
72 
74  {
75  lhs -= rhs;
76  return lhs;
77  }
78 
79  friend DofVector operator*(DofVector lhs, double scalar)
80  {
81  lhs *= scalar;
82  return lhs;
83  }
84 
85  friend DofVector operator*(double scalar, DofVector rhs)
86  {
87  rhs *= scalar;
88  return rhs;
89  }
90 
91  double operator()(DofType dof, int globalDofNumber) const
92  {
93  return (*this)[dof][globalDofNumber];
94  }
95 
96  void SetZero()
97  {
98  for (auto& entry : mData)
99  {
100  entry.second.setZero();
101  }
102  }
103 
104  std::vector<double> operator()(DofType dof, std::vector<int> globalDofNumbers) const
105  {
106  std::vector<double> v;
107  v.reserve(globalDofNumbers.size());
108  for (int globalDofNumber : globalDofNumbers)
109  v.push_back((*this)(dof, globalDofNumber));
110  return v;
111  }
112 
113  friend std::ostream& operator<<(std::ostream& out, const DofVector& v)
114  {
115  for (auto& entry : v.mData)
116  {
117  out << "==== " << entry.first.GetName() << "====\n";
118  out << entry.second << '\n';
119  }
120  return out;
121  }
122 
126  void AddScaled(const DofVector& rhs, double scalar)
127  {
128  for (auto& entry : rhs.mData)
129  {
130  if (mData.find(entry.first) != mData.end())
131  mData[entry.first] += entry.second * scalar;
132  else
133  mData[entry.first] = entry.second * scalar;
134  }
135  }
136 
137  std::vector<DofType> DofTypes() const
138  {
139  std::vector<DofType> dofTypes;
140  for (const auto& data : mData)
141  dofTypes.push_back(data.first);
142  return dofTypes;
143  }
144 
145 
146 protected:
148  std::map<DofType, Eigen::Matrix<T, Eigen::Dynamic, 1>, CompareDofType> mData;
149 };
150 
151 } /* NuTo */
void SetZero()
Definition: DofVector.h:96
const Eigen::Matrix< T, Eigen::Dynamic, 1 > & operator[](const DofType &dofType) const
const access
Definition: DofVector.h:18
DofVector & operator-=(const DofVector &rhs)
performs uninitialized addition that resizes the data to the length of rhs
Definition: DofVector.h:48
std::vector< DofType > DofTypes() const
Definition: DofVector.h:137
friend DofVector operator*(DofVector lhs, double scalar)
Definition: DofVector.h:79
Eigen::Matrix< T, Eigen::Dynamic, 1 > & operator[](const DofType &dofType)
nonconst access
Definition: DofVector.h:29
std::map< DofType, Eigen::Matrix< T, Eigen::Dynamic, 1 >, CompareDofType > mData
data container
Definition: DofVector.h:148
std::vector< double > operator()(DofType dof, std::vector< int > globalDofNumbers) const
Definition: DofVector.h:104
friend DofVector operator-(DofVector lhs, const DofVector &rhs)
Definition: DofVector.h:73
double operator()(DofType dof, int globalDofNumber) const
Definition: DofVector.h:91
Definition: DofType.h:8
DofVector & operator+=(const DofVector &rhs)
performs uninitialized addition that resizes the data to the length of rhs
Definition: DofVector.h:35
friend std::ostream & operator<<(std::ostream &out, const DofVector &v)
Definition: DofVector.h:113
Definition: DofType.h:36
void AddScaled(const DofVector &rhs, double scalar)
calculates (*this) += rhs * scalar
Definition: DofVector.h:126
int v
Definition: Quad2DPatchTest.py:9
DofVector & operator*=(double scalar)
Definition: DofVector.h:60
Definition: Exception.h:6
Definition: SerializeStreamOut.h:9
rhs
Definition: SparseDirectSolverMKLDSS.py:46
friend DofVector operator*(double scalar, DofVector rhs)
Definition: DofVector.h:85
friend DofVector operator+(DofVector lhs, const DofVector &rhs)
Definition: DofVector.h:67
Definition: DofVector.h:12