FixVec.hh 3.63 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/******************************************************************************
 *
 * AMDiS - Adaptive multidimensional simulations
 *
 * Copyright (C) 2013 Dresden University of Technology. All Rights Reserved.
 * Web: https://fusionforge.zih.tu-dresden.de/projects/amdis
 *
 * Authors: 
 * Simon Vey, Thomas Witkowski, Andreas Naumann, Simon Praetorius, et al.
 *
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 *
 *
 * This file is part of AMDiS
 *
 * See also license.opensource.txt in the distribution.
 * 
 ******************************************************************************/
20
21


22
23
namespace AMDiS {

24
25
26
27
28
29
30
31
  template<typename T>
  void DimVec<T>::multMatrixVec(DimMat<T> &m, DimVec<T> &v)
  {
    T *mIt, *thisIt;
    for (thisIt = this->begin(), mIt = m.begin();
	 thisIt != this->end();
	 thisIt++) {
      *thisIt = 0;
Thomas Witkowski's avatar
Thomas Witkowski committed
32
      for (T* vIt = v.begin(); vIt != v.end(); vIt++, mIt++)
33
34
35
36
	*thisIt += *vIt * *mIt;
    }
  }

37
38
39
  template<typename T, GeoIndex d>
  double absteukl(const FixVec<T,d>& a,const FixVec<T,d>& b)
  {
40
    double erg = 0.0;
41

Thomas Witkowski's avatar
Thomas Witkowski committed
42
    for (int i = 0; i < a.getSize() ; i++)
43
      erg = erg + ((a[i] - b[i]) * (a[i] - b[i]));
44
45
46
47
48

    return sqrt(erg);
  }

  template<typename T>
49
  void WorldVector<T>::multMatrixVec(const WorldMatrix<T> &m, const WorldVector<T> &v)
50
51
  {
    FUNCNAME("WorldVector<T>::multMatrix()");
52
53
    TEST_EXIT_DBG(m.getNumRows() == this->getSize())("invalide size\n");
    TEST_EXIT_DBG(v.getSize() == this->getSize())("invalide size\n");
54
55
56
57

    T *mIt, *thisIt;
    for (thisIt = this->begin(), mIt = m.begin();
	 thisIt != this->end(); 
58
59
60
	 thisIt++) {
      *thisIt = 0;
      
Thomas Witkowski's avatar
Thomas Witkowski committed
61
62
      for (T* vIt = v.begin(); vIt != v.end(); vIt++, mIt++) 
	*thisIt += *vIt * *mIt;      
63
    }
64
65
66
67
68
69
70
71
72
  }

  template<typename T>
  bool WorldMatrix<T>::isDiagMatrix() const
  {
    for (int i = 0; i < this->getSize(); i++)
      for (int j = i + 1; j < this->getSize(); j++)
	if (abs((*this)[i][j]) > DBL_TOL || abs((*this)[j][i]) > DBL_TOL) 
	  return(false);
73

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    return(true);
  }

  template<typename T>
  bool WorldMatrix<T>::isSymmetric() const
  {
    for (int i = 0; i < this->getSize(); i++)
      for (int j = i + 1; j < this->getSize(); j++)
	if (abs((*this)[i][j] - (*this)[j][i]) > DBL_TOL) 
	  return false;

    return true;
  }
 
  template<typename T>
  void WorldMatrix<T>::setDiag(T value)
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
91
    for (int i = 0; i < this->rows; i++)
92
93
94
95
96
97
98
99
      this->valArray[i * this->cols + i] = value;
  }

  template<typename T>
  void WorldMatrix<T>::vecProduct(const WorldVector<T>& v1, const WorldVector<T>& v2)
  {
    FUNCNAME("WorldMatrix<T>::vecProduct()");

100
101
    TEST_EXIT_DBG(v1.getSize() == v2.getSize())("invalid size 1\n");
    TEST_EXIT_DBG(v1.getSize() == this->getSize())("invalid size 2\n");
102
103
104

    T *thisIt = this->begin();

Thomas Witkowski's avatar
Thomas Witkowski committed
105
106
    for (T* v1It = v1.begin(); v1It != v1.end(); v1It++)
      for (T* v2It = v2.begin(); v2It != v2.end(); v2It++, thisIt++)
107
108
109
110
111
112
	*thisIt = *v1It * *v2It;
  }
  
  template<typename T>
  const WorldMatrix<T>& operator*=(WorldMatrix<T>& m, T scal)
  {
Thomas Witkowski's avatar
Thomas Witkowski committed
113
    for (T* mIt = m.begin(); mIt != m.end(); mIt++)
114
115
116
117
118
119
120
121
122
123
124
      *mIt *= scal;

    return m;
  }

  template<typename T>
  const WorldMatrix<T>& operator-=(WorldMatrix<T>& m1, const WorldMatrix<T>& m2)
  {
    T *m1It, *m2It;
    for (m1It = m1.begin(), m2It = m2.begin();
	 m1It != m1.end(); 
Thomas Witkowski's avatar
Thomas Witkowski committed
125
	 m1It++, m2It++)
126
      *m1It -= *m2It;
127
128
129
130
131
132
133
134
135
136

    return m1;
  }

  template<typename T>
  const WorldMatrix<T>& operator+=(WorldMatrix<T>& m1, const WorldMatrix<T>& m2)
  {
    T* m1It, *m2It;
    for (m1It = m1.begin(), m2It = m2.begin();
	 m1It != m1.end(); 
Thomas Witkowski's avatar
Thomas Witkowski committed
137
	 m1It++, m2It++)
138
      *m1It += *m2It;
139
140
141
142

    return m1;
  }
}