24 #ifndef SpatialOps_MatVecFields_h 25 #define SpatialOps_MatVecFields_h 29 #include <spatialops/SpatialOpsConfigure.h> 31 #include <spatialops/structured/SpatialFieldStore.h> 49 template<
typename OpT >
51 template<
typename OpT >
53 template<
typename OpT >
55 template<
typename OpT >
57 template<
typename OpT >
59 template<
typename OpT >
61 template<
typename FieldT >
62 class EigenDecomposition;
63 template<
typename FieldT >
65 template<
typename FieldT >
66 class MatScalDiagOffset;
79 template<
typename FieldT >
83 std::vector<SpatFldPtr<FieldT> > vals_;
84 typedef typename FieldT::value_type ValT;
97 FieldVector(
const int elements,
98 const MemoryWindow window,
99 const BoundaryCellInfo bc,
100 const GhostData ghosts,
101 const short int devIdx = CPU_INDEX )
107 vals_.push_back ( SpatialFieldStore::get_from_window<FieldT>( window, bc, ghosts, devIdx ) );
117 FieldVector(
const std::vector<SpatFldPtr<FieldT> >& vec )
132 template<
typename OpT >
133 void operator = (
const VecScalarOp< OpT >& rhsOp );
145 template<
typename OpT >
146 void operator = (
const VecVecOp< OpT >& rhsOp );
158 template<
typename OpT >
159 void operator = (
const MatVecOp< OpT >& rhsOp );
172 template<
typename OpT >
173 void operator = (
const MatUnaryOp< OpT >& rhsOp );
185 void operator = (
const ValT scalar );
187 FieldT& operator() (
const int j )
188 {
return *(vals_[j]); }
189 const FieldT& operator() (
const int j )
const 190 {
return *(vals_[j]); }
191 FieldT& at (
const int j )
192 {
return *(vals_[j]); }
193 const FieldT& at (
const int j )
const 194 {
return *(vals_[j]); }
196 std::vector<SpatFldPtr<FieldT> >& raw_vector(
void)
198 const std::vector<SpatFldPtr<FieldT> >& raw_vector(
void)
const 202 {
return vals_.size(); }
225 void add_device(
short int deviceIndex)
227 int i = vals_.size();
229 vals_[i]->add_device(deviceIndex);
243 void validate_device(
short int deviceIndex)
245 int i = vals_.size();
247 vals_[i]->validate_device(deviceIndex);
260 inline void set_device_as_active(
const short int deviceIndex )
262 int i = vals_.size();
264 vals_[i]->set_device_as_active(deviceIndex);
274 inline bool is_valid(
int const deviceIndex)
const 276 int i = vals_.size();
279 valid &= vals_[i]->is_valid(deviceIndex);
286 inline int active_device_index(
void)
const 289 return vals_[0]->active_device_index();
297 inline void set_stream(
const cudaStream_t& stream )
299 int i = vals_.size();
301 vals_[i]->set_stream(stream);
311 inline void set_stream(
const size_t i,
const cudaStream_t& stream )
313 vals_[i]->set_stream(stream);
321 inline cudaStream_t
const & get_stream(
const size_t i )
const 323 return vals_[i]->get_stream();
331 inline cudaEvent_t
const & get_last_event(
const size_t i )
const 333 return vals_[i]->get_last_event();
352 template<
typename FieldT >
356 std::vector<SpatFldPtr<FieldT> > vals_;
357 typedef typename FieldT::value_type ValT;
369 FieldMatrix(
const int elements,
370 const MemoryWindow window,
371 const BoundaryCellInfo bc,
372 const GhostData ghosts,
373 const short int devIdx = CPU_INDEX )
375 elements_( elements )
377 int ij = elements * elements;
378 vals_.reserve ( ij );
380 vals_.push_back ( SpatialFieldStore::get_from_window<FieldT>( window, bc, ghosts, devIdx ) );
390 FieldMatrix(
const std::vector<SpatFldPtr<FieldT> >& vec )
392 elements_(
std::sqrt( vec.size() ) )
395 double elements = std::sqrt( vec.size() );
396 assert( elements == std::floor( elements ) );
408 void add_to_diagonal(
const typename FieldT::value_type c);
419 MatUnaryOp< EigenDecomposition<FieldT> > real_eigenvalues();
428 void eigenvalues(FieldVector<FieldT>& realVector,
429 FieldVector<FieldT>& complexVector);
444 MatVecOp< LinearSolve< FieldT > > solve(
const FieldVector< FieldT >& vec );
456 template<
typename OpT >
457 void operator = (
const MatScalarOp< OpT >& rhsOp );
469 template<
typename OpT >
470 void operator = (
const MatMatOp< OpT >& rhsOp );
478 void operator = (
const ValT scalar );
480 FieldT& operator() (
const int i,
const int j )
481 {
return *vals_[i * elements_ + j]; }
483 FieldT& operator() (
const int ij )
484 {
return *(vals_[ij]); }
486 FieldT& at (
const int ij )
487 {
return *(vals_[ij]); }
489 const FieldT& operator() (
const int i,
const int j )
const 490 {
return *vals_[i * elements_ + j]; }
492 const FieldT& operator() (
const int ij )
const 493 {
return *(vals_[ij]); }
495 const FieldT& at (
const int ij )
const 496 {
return *(vals_[ij]); }
498 FieldVector<FieldT> row (
const int i)
const 500 std::vector<SpatFldPtr<FieldT> > rowVector(vals_.begin() + (i * elements_), vals_.begin() + ((i * elements_) + elements_));
502 return FieldVector<FieldT>(rowVector);
505 std::vector<SpatFldPtr<FieldT> >& raw_vector(
void)
507 const std::vector<SpatFldPtr<FieldT> >& raw_vector(
void)
const 511 {
return elements_; }
534 void add_device(
short int deviceIndex)
536 int i = vals_.size();
538 vals_[i]->add_device(deviceIndex);
552 void validate_device(
short int deviceIndex)
554 int i = vals_.size();
556 vals_[i]->validate_device(deviceIndex);
569 inline void set_device_as_active(
const short int deviceIndex )
571 int i = vals_.size();
573 vals_[i]->set_device_as_active(deviceIndex);
583 inline bool is_valid(
int const deviceIndex)
const 585 int i = vals_.size();
588 valid &= vals_[i]->is_valid(deviceIndex);
595 inline int active_device_index(
void)
const 598 return vals_[0]->active_device_index();
606 inline void set_stream(
const cudaStream_t& stream )
608 int i = vals_.size();
610 vals_[i]->set_stream(stream);
620 inline void set_stream(
const size_t i,
const cudaStream_t& stream )
622 vals_[i]->set_stream(stream);
630 inline cudaStream_t
const & get_stream(
const size_t i )
const 632 return vals_[i]->get_stream();
640 inline cudaEvent_t
const & get_last_event(
const size_t i )
const 642 return vals_[i]->get_last_event();
650 template<
typename FieldT >
651 void FieldVector<FieldT>::operator = (
const ValT scalar )
653 int i = vals_.size();
655 *(vals_[i]) <<= scalar;
659 template<
typename FieldT >
660 void FieldMatrix<FieldT>::operator = (
const ValT scalar )
662 int i = vals_.size();
664 *(vals_[i]) <<= scalar;
668 template<
typename FieldT >
669 template<
typename OpT >
670 void FieldVector< FieldT >::operator = (
const VecScalarOp< OpT >& rhsOp ){
674 template<
typename FieldT >
675 template<
typename OpT >
676 void FieldMatrix< FieldT >::operator = (
const MatScalarOp< OpT >& rhsOp ){
680 template<
typename FieldT >
681 template<
typename OpT >
682 void FieldVector< FieldT >::operator = (
const VecVecOp< OpT >& rhsOp ){
686 template<
typename FieldT >
687 template<
typename OpT >
688 void FieldVector< FieldT >::operator = (
const MatVecOp< OpT >& rhsOp ){
692 template<
typename FieldT >
693 template<
typename OpT >
694 void FieldMatrix< FieldT >::operator = (
const MatMatOp< OpT >& rhsOp ){
698 template<
typename FieldT >
699 template<
typename OpT >
700 void FieldVector< FieldT>::operator = (
const MatUnaryOp< OpT >& rhsOp ){
706 #endif // SpatialOps_MatVecField_h