Nektar++
BlockMatrix.cpp
Go to the documentation of this file.
1 ///////////////////////////////////////////////////////////////////////////////
2 //
3 // For more information, please see: http://www.nektar.info
4 //
5 // The MIT License
6 //
7 // Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
8 // Department of Aeronautics, Imperial College London (UK), and Scientific
9 // Computing and Imaging Institute, University of Utah (USA).
10 //
11 // Permission is hereby granted, free of charge, to any person obtaining a
12 // copy of this software and associated documentation files (the "Software"),
13 // to deal in the Software without restriction, including without limitation
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
15 // and/or sell copies of the Software, and to permit persons to whom the
16 // Software is furnished to do so, subject to the following conditions:
17 //
18 // The above copyright notice and this permission notice shall be included
19 // in all copies or substantial portions of the Software.
20 //
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
27 // DEALINGS IN THE SOFTWARE.
28 //
29 // Description:
30 //
31 ///////////////////////////////////////////////////////////////////////////////
32 
33 #include <boost/core/ignore_unused.hpp>
34 
38 
39 namespace Nektar
40 {
41  template<typename DataType, typename InnerMatrixType>
43  BaseType(0,0,type),
44  m_data(),
45  m_rowSizes(),
46  m_columnSizes(),
47  m_storageSize(),
48  m_numberOfBlockRows(0),
49  m_numberOfBlockColumns(0)
50  {
51  }
52 
53  template<typename DataType, typename InnerMatrixType>
54  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::NekMatrix(unsigned int numberOfBlockRows, unsigned int numberOfBlockColumns,
55  unsigned int rowsPerBlock, unsigned int columnsPerBlock,
56  MatrixStorage type) :
57  BaseType(numberOfBlockRows*rowsPerBlock, numberOfBlockColumns*columnsPerBlock,type),
58  m_data(),
59  m_rowSizes(numberOfBlockRows),
60  m_columnSizes(numberOfBlockColumns),
61  m_storageSize(0),
62  m_numberOfBlockRows(numberOfBlockRows),
63  m_numberOfBlockColumns(numberOfBlockColumns)
64  {
65  m_storageSize = GetRequiredStorageSize();
66  m_data = Array<OneD, std::shared_ptr<InnerType> >(m_storageSize, std::shared_ptr<InnerType>());
67  for(unsigned int i = 1; i <= numberOfBlockRows; ++i)
68  {
69  m_rowSizes[i-1] = i*rowsPerBlock-1;
70  }
71 
72  for(unsigned int i = 1; i <= numberOfBlockColumns; ++i)
73  {
74  m_columnSizes[i-1] = i*columnsPerBlock-1;
75  }
76  }
77 
78  template<typename DataType, typename InnerMatrixType>
79  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::NekMatrix(unsigned int numberOfBlockRows, unsigned int numberOfBlockColumns,
80  const unsigned int* rowsPerBlock, const unsigned int* columnsPerBlock,
81  MatrixStorage type) :
82  BaseType(std::accumulate(rowsPerBlock, rowsPerBlock + numberOfBlockRows, 0),
83  std::accumulate(columnsPerBlock, columnsPerBlock + numberOfBlockColumns, 0),
84  type),
85  m_data(),
86  m_rowSizes(numberOfBlockRows),
87  m_columnSizes(numberOfBlockColumns),
88  m_storageSize(0),
89  m_numberOfBlockRows(numberOfBlockRows),
90  m_numberOfBlockColumns(numberOfBlockColumns)
91  {
92  m_storageSize = GetRequiredStorageSize();
93  m_data = Array<OneD, std::shared_ptr<InnerType> >(m_storageSize, std::shared_ptr<InnerType>());
94  Initialize(rowsPerBlock, columnsPerBlock);
95  }
96 
97  template<typename DataType, typename InnerMatrixType>
98  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::NekMatrix(unsigned int numberOfBlockRows, unsigned int numberOfBlockColumns,
99  const Array<OneD, const unsigned int>& rowsPerBlock, const Array<OneD, const unsigned int>& columnsPerBlock,
100  MatrixStorage type) :
101  BaseType(std::accumulate(rowsPerBlock.data(), rowsPerBlock.data() + numberOfBlockRows, 0),
102  std::accumulate(columnsPerBlock.data(), columnsPerBlock.data() + numberOfBlockColumns, 0),
103  type),
104  m_data(),
105  m_rowSizes(numberOfBlockRows),
106  m_columnSizes(numberOfBlockColumns),
107  m_storageSize(0),
108  m_numberOfBlockRows(numberOfBlockRows),
109  m_numberOfBlockColumns(numberOfBlockColumns)
110  {
111  m_storageSize = GetRequiredStorageSize();
112  m_data = Array<OneD, std::shared_ptr<InnerType> >(m_storageSize, std::shared_ptr<InnerType>());
113  Initialize(rowsPerBlock.data(), columnsPerBlock.data());
114  }
115 
116  template<typename DataType, typename InnerMatrixType>
118  const Array<OneD, const unsigned int>& columnsPerBlock,
119  MatrixStorage type) :
120  BaseType(std::accumulate(rowsPerBlock.begin(), rowsPerBlock.end(), 0),
121  std::accumulate(columnsPerBlock.begin(), columnsPerBlock.end(), 0),
122  type),
123  m_data(),
124  m_rowSizes(rowsPerBlock.size()),
125  m_columnSizes(columnsPerBlock.size()),
126  m_storageSize(0),
127  m_numberOfBlockRows(rowsPerBlock.size()),
128  m_numberOfBlockColumns(columnsPerBlock.size())
129  {
130  m_storageSize = GetRequiredStorageSize();
131  m_data = Array<OneD, std::shared_ptr<InnerType> >(m_storageSize, std::shared_ptr<InnerType>());
132  Initialize(rowsPerBlock.data(), columnsPerBlock.data());
133  }
134 
135  template<typename DataType, typename InnerMatrixType>
137  BaseType(rhs),
138  m_data(rhs.m_data.size()),
139  m_rowSizes(rhs.m_rowSizes),
140  m_columnSizes(rhs.m_columnSizes),
141  m_storageSize(rhs.m_storageSize),
142  m_numberOfBlockRows(rhs.m_numberOfBlockRows),
143  m_numberOfBlockColumns(rhs.m_numberOfBlockColumns)
144  {
145  for(unsigned int i = 0; i < rhs.m_data.size(); ++i)
146  {
147  m_data[i] = InnerType::CreateWrapper(rhs.m_data[i]);
148  }
149  }
150 
151  template<typename DataType, typename InnerMatrixType>
152  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetRequiredStorageSize() const
153  {
154  return BaseType::GetRequiredStorageSize(this->GetStorageType(), this->GetNumberOfBlockRows(),
155  this->GetNumberOfBlockColumns());
156  }
157 
158  template<typename DataType, typename InnerMatrixType>
159  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::CalculateBlockIndex(unsigned int row, unsigned int column) const
160  {
161  return BaseType::CalculateIndex(this->GetStorageType(),
162  row, column, m_numberOfBlockRows, m_numberOfBlockColumns, this->GetTransposeFlag());
163  }
164 
165  template<typename DataType, typename InnerMatrixType>
166  const typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::InnerType*
167  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetBlockPtr(unsigned int row, unsigned int column) const
168  {
169  ASSERTL2(this->GetTransposeFlag() == 'N' ? row < m_numberOfBlockRows : row < m_numberOfBlockColumns,
170  std::string("Row ") + std::to_string(row) +
171  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockRows) +
172  std::string(" rows"));
173  ASSERTL2(this->GetTransposeFlag() == 'N' ? column < m_numberOfBlockColumns : column < m_numberOfBlockColumns,
174  std::string("Column ") + std::to_string(column) +
175  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockColumns) +
176  std::string(" columns"));
177  int x = CalculateBlockIndex(row,column);
178  if (x == -1)
179  {
180  return 0;
181  }
182  else
183  {
184  return m_data[x].get();
185  }
186  }
187 
188  template<typename DataType, typename InnerMatrixType>
189  std::shared_ptr<const typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::InnerType>
190  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetBlock(unsigned int row, unsigned int column) const
191  {
192  ASSERTL2(this->GetTransposeFlag() == 'N' ? row < m_numberOfBlockRows : row < m_numberOfBlockColumns,
193  std::string("Row ") + std::to_string(row) +
194  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockRows) +
195  std::string(" rows"));
196  ASSERTL2(this->GetTransposeFlag() == 'N' ? column < m_numberOfBlockColumns : column < m_numberOfBlockRows,
197  std::string("Column ") + std::to_string(column) +
198  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockColumns) +
199  std::string(" columns"));
200  int x = CalculateBlockIndex(row,column);
201  if (x < 0)
202  {
203  return std::shared_ptr<const InnerType>();
204  }
205  else
206  {
207  return m_data[x];
208  }
209  }
210 
211  template<typename DataType, typename InnerMatrixType>
212  std::shared_ptr<typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::InnerType>&
213  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetBlock(unsigned int row, unsigned int column)
214  {
215  ASSERTL2(this->GetTransposeFlag() == 'N' ? row < m_numberOfBlockRows : row < m_numberOfBlockColumns,
216  std::string("Row ") + std::to_string(row) +
217  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockRows) +
218  std::string(" rows"));
219  ASSERTL2(this->GetTransposeFlag() == 'N' ? column < m_numberOfBlockColumns : column < m_numberOfBlockRows,
220  std::string("Column ") + std::to_string(column) +
221  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockColumns) +
222  std::string(" columns"));
223  int x = CalculateBlockIndex(row,column);
224  if (x == -1)
225  {
226  return m_nullBlockPtr;
227  }
228  else
229  {
230  return m_data[x];
231  }
232  }
233 
234  template<typename DataType, typename InnerMatrixType>
235  void NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::SetBlock(unsigned int row, unsigned int column, std::shared_ptr<InnerType>& m)
236  {
237  ASSERTL2(this->GetTransposeFlag() == 'N' ? row < m_numberOfBlockRows : row < m_numberOfBlockColumns,
238  std::string("Row ") + std::to_string(row) +
239  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockRows) +
240  std::string(" rows"));
241  ASSERTL2(this->GetTransposeFlag() == 'N' ? column < m_numberOfBlockColumns : column < m_numberOfBlockRows,
242  std::string("Column ") + std::to_string(column) +
243  std::string(" requested in a block matrix with a maximum of ") + std::to_string(m_numberOfBlockColumns) +
244  std::string(" columns"));
245  m_data[CalculateBlockIndex(row, column)] = InnerType::CreateWrapper(m);
246  }
247 
248 
249 
250  template<typename DataType, typename InnerMatrixType>
251  typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::ConstGetValueType
252  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::operator()(unsigned int row, unsigned int col) const
253  {
254  ASSERTL2(row < this->GetRows(), std::string("Row ") + std::to_string(row) +
255  std::string(" requested in a matrix with a maximum of ") + std::to_string(this->GetRows()) +
256  std::string(" rows"));
257  ASSERTL2(col < this->GetColumns(), std::string("Column ") + std::to_string(col) +
258  std::string(" requested in a matrix with a maximum of ") + std::to_string(this->GetColumns()) +
259  std::string(" columns"));
260 
261 
262  const Array<OneD, unsigned int>* rowSizes = &m_rowSizes;
263  const Array<OneD, unsigned int>* columnSizes = &m_columnSizes;
264 
265  if( this->GetTransposeFlag() == 'T' )
266  {
267  std::swap(rowSizes, columnSizes);
268  }
269 
270  unsigned int blockRow = std::lower_bound(rowSizes->begin(), rowSizes->end(), row) - rowSizes->begin();
271  unsigned int blockColumn = std::lower_bound(columnSizes->begin(), columnSizes->end(), col) - columnSizes->begin();
272  const std::shared_ptr<const InnerType> block = GetBlock(blockRow, blockColumn);
273 
274  unsigned int actualRow = row;
275  if( blockRow > 0 )
276  {
277  actualRow = row-((*rowSizes)[blockRow-1])-1;
278  }
279 
280  unsigned int actualCol = col;
281  if( blockColumn > 0 )
282  {
283  actualCol = col-((*columnSizes)[blockColumn-1])-1;
284  }
285 
286 
287  if( block )
288  {
289  return (*block)(actualRow, actualCol);
290  }
291  else
292  {
293  return m_zeroElement;
294  }
295  }
296 
297  template<typename DataType, typename InnerMatrixType>
298  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetStorageSize() const
299  {
300  return m_storageSize;
301  }
302 
303  template<typename DataType, typename InnerMatrixType>
304  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetNumberOfBlockRows() const
305  {
306  if( this->GetTransposeFlag() == 'N' )
307  {
308  return m_numberOfBlockRows;
309  }
310  else
311  {
312  return m_numberOfBlockColumns;
313  }
314  }
315 
316  template<typename DataType, typename InnerMatrixType>
317  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetNumberOfBlockColumns() const
318  {
319  if( this->GetTransposeFlag() == 'N' )
320  {
321  return m_numberOfBlockColumns;
322  }
323  else
324  {
325  return m_numberOfBlockRows;
326  }
327  }
328 
329  template<typename DataType, typename InnerMatrixType>
330  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetNumberOfRowsInBlockRow(unsigned int blockRow) const
331  {
332  if( this->GetTransposeFlag() == 'N' )
333  {
334  return GetNumberOfElementsInBlock(blockRow, m_numberOfBlockRows, m_rowSizes);
335  }
336  else
337  {
338  return GetNumberOfElementsInBlock(blockRow, m_numberOfBlockColumns, m_columnSizes);
339  }
340  }
341 
342  template<typename DataType, typename InnerMatrixType>
343  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetNumberOfColumnsInBlockColumn(unsigned int blockCol) const
344  {
345  if( this->GetTransposeFlag() == 'T' )
346  {
347  return GetNumberOfElementsInBlock(blockCol, m_numberOfBlockRows, m_rowSizes);
348  }
349  else
350  {
351  return GetNumberOfElementsInBlock(blockCol, m_numberOfBlockColumns, m_columnSizes);
352  }
353  }
354 
355  template<typename DataType, typename InnerMatrixType>
356  void NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetBlockSizes(
357  Array<OneD, unsigned int>& rowSizes,
358  Array<OneD, unsigned int>& colSizes) const
359  {
360  if( this->GetTransposeFlag() == 'T' )
361  {
362  rowSizes = m_columnSizes;
363  colSizes = m_rowSizes;
364  }
365  else
366  {
367  rowSizes = m_rowSizes;
368  colSizes = m_columnSizes;
369  }
370  }
371 
372  template<typename DataType, typename InnerMatrixType>
373  typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::begin() { return iterator(*this, 0, 0); }
374 
375  template<typename DataType, typename InnerMatrixType>
377 
378  template<typename DataType, typename InnerMatrixType>
379  typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::const_iterator NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::begin() const { return const_iterator(*this, 0, 0); }
380 
381  template<typename DataType, typename InnerMatrixType>
383 
384 
385  template<typename DataType, typename InnerMatrixType>
387  {
388  return ThisType(rhs);
389  }
390 
391  template<typename DataType, typename InnerMatrixType>
392  std::shared_ptr<NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag> > NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::CreateWrapper(const std::shared_ptr<NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag> >& rhs)
393  {
394  return std::shared_ptr<ThisType>(new ThisType(*rhs));
395  }
396 
397 
398  template<typename DataType, typename InnerMatrixType>
399  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::GetNumberOfElementsInBlock(unsigned int block, unsigned int totalBlocks, const Array<OneD, unsigned int>& sizes)
400  {
401  boost::ignore_unused(totalBlocks);
402  ASSERTL2(block < totalBlocks, std::string("Block Element ") + std::to_string(block) +
403  std::string(" requested in a matrix with a maximum of ") + std::to_string(totalBlocks) +
404  std::string(" blocks."));
405  if( block == 0 )
406  {
407  return sizes[block]+1;
408  }
409  else
410  {
411  return sizes[block] - sizes[block-1];
412  }
413  }
414 
415  template<typename DataType, typename InnerMatrixType>
416  void NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::Initialize(const unsigned int* rowsPerBlock, const unsigned int* columnsPerBlock)
417  {
418  m_storageSize = this->GetRows()*this->GetColumns();
419  if (this->GetRows() > 0)
420  {
421  m_rowSizes[0] = rowsPerBlock[0] - 1;
422  for(unsigned int i = 1; i < m_numberOfBlockRows; ++i)
423  {
424  m_rowSizes[i] = rowsPerBlock[i] + m_rowSizes[i-1];
425  }
426  }
427  if (this->GetColumns() > 0)
428  {
429  m_columnSizes[0] = columnsPerBlock[0] - 1;
430  for(unsigned int i = 1; i < m_numberOfBlockColumns; ++i)
431  {
432  m_columnSizes[i] = columnsPerBlock[i] + m_columnSizes[i-1];
433  }
434  }
435  }
436 
437  template<typename DataType, typename InnerMatrixType>
438  typename boost::call_traits<typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::NumberType>::value_type
439  NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::v_GetValue(unsigned int row, unsigned int column) const
440  {
441  return (*this)(row, column);
442  }
443 
444  template<typename DataType, typename InnerMatrixType>
445  unsigned int NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::v_GetStorageSize() const
446  {
447  return this->GetStorageSize();
448  }
449 
450  template<typename DataType, typename InnerMatrixType>
451  void NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::v_Transpose()
452  {
453  for (auto &ptr : m_data)
454  {
455  if( ptr.get() != 0 )
456  {
457  ptr->Transpose();
458  }
459  }
460  }
461 
462 
463 // template<typename DataType, typename InnerMatrixType>
464 // template<typename MatrixType>
465 // NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::iterator_base(MatrixType& m, unsigned int curRow, unsigned int curCol) :
466 // m_matrix(m),
467 // m_curRow(curRow),
468 // m_curColumn(curCol)
469 // {
470 // }
471 
472 // template<typename DataType, typename InnerMatrixType>
473 // template<typename MatrixType>
474 // NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::iterator_base(MatrixType& m) :
475 // m_matrix(m),
476 // m_curRow(std::numeric_limits<unsigned int>::max()),
477 // m_curColumn(std::numeric_limits<unsigned int>::max())
478 // {
479 // }
480 
481 // template<typename DataType, typename InnerMatrixType>
482 // template<typename MatrixType>
483 // NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::iterator_base(const NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>& rhs) :
484 // m_matrix(rhs.m_matrix),
485 // m_curRow(rhs.m_curRow),
486 // m_curColumn(rhs.m_curColumn)
487 // {
488 // }
489 
490 // template<typename DataType, typename InnerMatrixType>
491 // template<typename MatrixType>
492 // void NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::operator++()
493 // {
494 // if( m_curRow != std::numeric_limits<unsigned int>::max() )
495 // {
496 // boost::tie(m_curRow, m_curColumn) = StoragePolicy::Advance(
497 // m_matrix.GetRows(), m_matrix.GetColumns(), m_curRow, m_curColumn);
498 // }
499 // }
500 
501 // template<typename DataType, typename InnerMatrixType>
502 // template<typename MatrixType>
503 // typename NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::NumberType
504 // NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::operator*()
505 // {
506 // return m_matrix(m_curRow, m_curColumn);
507 // }
508 
509 // template<typename DataType, typename InnerMatrixType>
510 // template<typename MatrixType>
511 // bool NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::operator==(const NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>& rhs)
512 // {
513 // return m_curRow == rhs.m_curRow && m_curColumn == rhs.m_curColumn;
514 // }
515 
516 // template<typename DataType, typename InnerMatrixType>
517 // template<typename MatrixType>
518 // bool NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>::operator!=(const NekMatrix<NekMatrix<DataType, InnerMatrixType>, BlockMatrixTag>::iterator_base<MatrixType>& rhs)
519 // {
520 // return !(*this == rhs);
521 // }
522 
523 
525  template LIB_UTILITIES_EXPORT class NekMatrix<NekMatrix< NekMatrix<NekDouble, StandardMatrixTag>, BlockMatrixTag>, BlockMatrixTag>;
526  template LIB_UTILITIES_EXPORT class NekMatrix<NekMatrix< NekMatrix<NekDouble, StandardMatrixTag>, ScaledMatrixTag>, BlockMatrixTag>;
527  template LIB_UTILITIES_EXPORT class NekMatrix<NekMatrix<NekMatrix< NekMatrix<NekDouble, StandardMatrixTag>, ScaledMatrixTag>, BlockMatrixTag>, BlockMatrixTag>;
528 
529  template LIB_UTILITIES_EXPORT class
532  NekSingle, StandardMatrixTag>, BlockMatrixTag>, BlockMatrixTag>;
534  NekSingle, StandardMatrixTag>, ScaledMatrixTag>, BlockMatrixTag>;
536  NekMatrix<NekSingle, StandardMatrixTag>, ScaledMatrixTag>,
537  BlockMatrixTag>, BlockMatrixTag>;
538 }
539 
#define ASSERTL2(condition, msg)
Assert Level 2 – Debugging which is used FULLDEBUG compilation mode. This level assert is designed to...
Definition: ErrorUtil.hpp:274
#define LIB_UTILITIES_EXPORT
The above copyright notice and this permission notice shall be included.
Definition: CoupledSolver.h:1