40 template<
typename DataType>
48 template<
typename DataType>
56 template<
typename DataType>
62 std::fill_n(m_data.get(), m_size, a);
65 template<
typename DataType>
73 std::vector<DataType> values = FromString<DataType>(vectorValues);
74 m_size = values.size();
76 std::copy(values.begin(), values.end(), m_data.begin());
78 ASSERTL0(m_size > 0,
"Error converting string values to vector");
80 catch(std::runtime_error& e)
82 NEKERROR(ErrorUtil::efatal, e.what());
86 template<
typename DataType>
88 typename boost::call_traits<DataType>::const_reference y,
89 typename boost::call_traits<DataType>::const_reference z) :
99 template<
typename DataType>
101 m_size(rhs.GetDimension()),
103 m_wrapperType(rhs.m_wrapperType)
105 if( m_wrapperType ==
eCopy )
112 template<
typename DataType>
120 template<
typename DataType>
122 m_size(ptr.num_elements()),
133 template<
typename DataType>
142 std::to_string(size) +
" but the incoming array only has " +
150 template<
typename DataType>
152 m_size(ptr.num_elements()),
163 template<
typename DataType>
172 std::to_string(size) +
" but the incoming array only has " +
180 template<
typename DataType>
183 template<
typename DataType>
186 if( m_wrapperType ==
eCopy )
196 else if( m_wrapperType ==
eWrapper )
200 ASSERTL0(GetDimension() == rhs.
GetDimension(),
"Wrapped NekVectors must have the same dimension in operator=");
208 template<
typename DataType>
214 template<
typename DataType>
220 template<
typename DataType>
223 return this->GetData().get();
226 template<
typename DataType>
229 template<
typename DataType>
235 template<
typename DataType>
238 template<
typename DataType>
241 template<
typename DataType>
244 template<
typename DataType>
247 template<
typename DataType>
250 template<
typename DataType>
254 "Invalid access to m_data via parenthesis operator");
255 return this->GetData()[i];
258 template<
typename DataType>
261 return this->GetData()[i];
264 template<
typename DataType>
267 ASSERTL1(this->GetDimension() >= 1,
"Invalid use of NekVector::x");
271 template<
typename DataType>
274 ASSERTL1(this->GetDimension() >= 2,
"Invalid use of NekVector::y");
278 template<
typename DataType>
281 ASSERTL1(this->GetDimension() >= 3,
"Invalid use of NekVector::z");
285 template<
typename DataType>
288 ASSERTL1(this->GetDimension() >= 1,
"Invalid use of NekVector::SetX");
289 this->GetData()[0] = val;
292 template<
typename DataType>
295 ASSERTL1(this->GetDimension() >= 2,
"Invalid use of NekVector::SetX");
296 this->GetData()[1] = val;
299 template<
typename DataType>
302 ASSERTL1(this->GetDimension() >= 3,
"Invalid use of NekVector::SetX");
303 this->GetData()[2] = val;
306 template<
typename DataType>
313 template<
typename DataType>
320 template<
typename DataType>
327 template<
typename DataType>
334 template<
typename DataType>
337 template<
typename DataType>
341 "Invalid access to m_data via parenthesis operator");
345 template<
typename DataType>
351 template<
typename DataType>
354 ASSERTL1( GetDimension() >= 1,
"Invalid use of NekVector::x");
358 template<
typename DataType>
361 ASSERTL1( GetDimension() >= 2,
"Invalid use of NekVector::y");
365 template<
typename DataType>
368 ASSERTL1( GetDimension() >= 3,
"Invalid use of NekVector::z");
372 template<
typename DataType>
375 template<
typename DataType>
378 template<
typename DataType>
381 template<
typename DataType>
387 template<
typename DataType>
391 template<
typename DataType>
394 template<
typename DataType>
397 template<
typename DataType>
400 template<
typename DataType>
403 template<
typename DataType>
406 template<
typename DataType>
409 template<
typename DataType>
412 template<
typename DataType>
415 template<
typename DataType>
418 if(m_data.num_elements() < newSize )
427 template<
typename DataType>
433 const DataType* lhs_buf = lhs.
GetRawPtr();
434 const DataType* rhs_buf = rhs.
GetRawPtr();
436 for(
int i = 0; i < ldim; ++i)
438 r_buf[i] = lhs_buf[i] + rhs_buf[i];
442 template<
typename DataType>
448 const DataType* lhs_buf = lhs.
GetRawPtr();
449 const DataType* rhs_buf = rhs.
GetRawPtr();
451 for(
int i = 0; i < ldim; ++i)
453 r_buf[i] = -lhs_buf[i] + rhs_buf[i];
458 const NekVector<NekDouble>&
lhs,
459 const NekVector<NekDouble>&
rhs);
461 const NekVector<NekDouble>& lhs,
462 const NekVector<NekDouble>& rhs);
464 template<
typename DataType>
469 const DataType* rhs_buf = rhs.
GetRawPtr();
471 for(
int i = 0; i < rdim; ++i)
473 r_buf[i] += rhs_buf[i];
477 template<
typename DataType>
482 const DataType* rhs_buf = rhs.
GetRawPtr();
484 for(
int i = 0; i < rdim; ++i)
486 r_buf[i] = -r_buf[i] + rhs_buf[i];
491 void AddEqual(NekVector<NekDouble>& result,
492 const NekVector<NekDouble>& rhs);
495 const NekVector<NekDouble>& rhs);
503 Add(result, lhs, rhs);
508 NekVector<NekDouble>
Add(
const NekVector<NekDouble>& lhs,
509 const NekVector<NekDouble>& rhs);
511 template<
typename ResultDataType,
typename InputDataType>
516 ResultDataType* r_buf = result.
GetRawPtr();
517 typename std::add_const<InputDataType>::type* lhs_buf = lhs.
GetRawPtr();
518 typename std::add_const<InputDataType>::type* rhs_buf = rhs.
GetRawPtr();
520 for(
int i = 0; i < ldim; ++i)
522 r_buf[i] = lhs_buf[i] - rhs_buf[i];
526 template<
typename ResultDataType,
typename InputDataType>
531 ResultDataType* r_buf = result.
GetRawPtr();
532 typename std::add_const<InputDataType>::type* lhs_buf = lhs.
GetRawPtr();
533 typename std::add_const<InputDataType>::type* rhs_buf = rhs.
GetRawPtr();
535 for(
int i = 0; i < ldim; ++i)
537 r_buf[i] = -lhs_buf[i] - rhs_buf[i];
542 void Subtract(NekVector<NekDouble>& result,
543 const NekVector<NekDouble>& lhs,
544 const NekVector<NekDouble>& rhs);
548 const NekVector<NekDouble>& lhs,
549 const NekVector<NekDouble>& rhs);
551 template<
typename ResultDataType,
typename InputDataType>
555 ResultDataType* r_buf = result.
GetRawPtr();
556 typename std::add_const<InputDataType>::type* rhs_buf = rhs.
GetRawPtr();
558 for(
int i = 0; i < rdim; ++i)
560 r_buf[i] -= rhs_buf[i];
564 template<
typename ResultDataType,
typename InputDataType>
568 ResultDataType* r_buf = result.
GetRawPtr();
569 typename std::add_const<InputDataType>::type* rhs_buf = rhs.
GetRawPtr();
571 for(
int i = 0; i < rdim; ++i)
573 r_buf[i] = -r_buf[i] - rhs_buf[i];
579 const NekVector<NekDouble>& rhs);
583 const NekVector<NekDouble>& rhs);
585 template<
typename DataType>
597 Subtract(
const NekVector<NekDouble>& lhs,
598 const NekVector<NekDouble>& rhs);
600 template<
typename ResultDataType,
typename InputDataType>
605 ResultDataType* r_buf = result.
GetRawPtr();
606 typename std::add_const<InputDataType>::type* lhs_buf = lhs.
GetRawPtr();
609 for(
int i = 0; i < ldim; ++i)
611 r_buf[i] = lhs_buf[i] /
rhs;
616 void Divide(NekVector<NekDouble>& result,
617 const NekVector<NekDouble>& lhs,
620 template<
typename ResultDataType>
624 ResultDataType* r_buf = result.
GetRawPtr();
627 for(
int i = 0; i < resdim; ++i)
637 template<
typename DataType>
649 Divide(
const NekVector<NekDouble>& lhs,
653 template<
typename ResultDataType,
typename InputDataType>
658 ResultDataType* result_buf = result.
GetRawPtr();
659 const InputDataType* rhs_buf = rhs.
GetRawPtr();
660 const InputDataType* lhs_buf = lhs.
GetRawPtr();
662 for(
int i = 0; i < resdim; ++i)
664 result_buf[i] = lhs_buf[i] * rhs_buf[i];
669 void Multiply(NekVector<NekDouble>& result,
const NekVector<NekDouble>& lhs,
const NekVector<NekDouble>& rhs);
671 template<
typename ResultDataType,
typename InputDataType>
675 ResultDataType* result_buf = result.
GetRawPtr();
676 const InputDataType* rhs_buf = rhs.
GetRawPtr();
678 for(
int i = 0; i < resdim; ++i)
680 result_buf[i] *= rhs_buf[i];
685 void MultiplyEqual(NekVector<NekDouble>& result,
const NekVector<NekDouble>& rhs);
687 template<
typename DataType,
typename InputDataType>
699 Multiply(
const NekVector<NekDouble>& lhs,
const NekVector<NekDouble>& rhs);
702 template<
typename ResultDataType,
typename InputDataType>
707 ResultDataType* r_buf = result.
GetRawPtr();
708 const InputDataType* lhs_buf = lhs.
GetRawPtr();
711 for(
int i = 0; i < ldim; ++i)
713 r_buf[i] = lhs_buf[i] *
rhs;
718 void Multiply(NekVector<NekDouble>& result,
719 const NekVector<NekDouble>& lhs,
722 template<
typename ResultDataType>
726 ResultDataType* r_buf = result.
GetRawPtr();
728 for(
unsigned int i = 0; i < rdim; ++i)
737 template<
typename DataType>
749 Multiply(
const NekVector<NekDouble>& lhs,
752 template<
typename ResultDataType,
typename InputDataType>
760 template<
typename ResultDataType,
typename InputDataType>
765 ResultDataType* r_buf = result.
GetRawPtr();
766 const InputDataType* rhs_buf = rhs.
GetRawPtr();
770 for(
int i = 0; i < rdim; ++i)
772 r_buf[i] = inverse * rhs_buf[i];
779 const NekVector<NekDouble>& rhs);
782 void Multiply(NekVector<NekDouble>& result,
784 const NekVector<NekDouble>& rhs);
786 template<
typename DataType>
795 const NekVector<NekDouble>& rhs);
798 template<
typename DataType>
799 std::ostream& operator<<(std::ostream& os, const NekVector<DataType>&
rhs)
806 std::ostream& operator<<(std::ostream& os, const NekVector<NekDouble>&
rhs);
808 template<
typename DataType>
813 for(
unsigned int i = 0; i < 3; ++i)
815 result[i] = dest[i]-source[i];
825 template<
typename DataType>
830 for(
unsigned int i = 0; i < 3; ++i)
832 result[i] = lhs[i]*t;
842 template<
typename DataType>
855 bool operator==(
const NekVector<NekDouble>& lhs,
856 const NekVector<NekDouble>& rhs);
858 template<
typename DataType>
862 return !(lhs ==
rhs);
866 bool operator!=(
const NekVector<NekDouble>& lhs,
867 const NekVector<NekDouble>& rhs);
869 template<
typename DataType>
872 std::vector<DataType> result;
876 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
877 boost::char_separator<char> sep(
"(<,>) ");
878 tokenizer tokens(str, sep);
879 for( tokenizer::iterator strIter = tokens.begin(); strIter != tokens.end(); ++strIter)
881 result.push_back(boost::lexical_cast<DataType>(*strIter));
884 catch(boost::bad_lexical_cast&)
892 std::vector<NekDouble>
FromString(
const std::string& str);
894 template<
typename DataType>
900 for(
typename VectorType::const_iterator iter = v.
begin(); iter != v.
end(); ++iter)
902 result += fabs(*iter);
911 template<
typename DataType>
917 for(
typename VectorType::const_iterator iter = v.
begin(); iter != v.
end(); ++iter)
919 DataType v = fabs(*iter);
928 template<
typename DataType>
931 DataType result = fabs(v[0]);
933 for(
unsigned int i = 0; i < vdim; ++i)
935 result = std::max(fabs(v[i]), result);
943 template<
typename DataType>
948 for(
unsigned int i = 0; i < tdim; ++i)
956 NekVector<NekDouble>
Negate(
const NekVector<NekDouble>& v);
958 template<
typename DataType>
963 for(
unsigned int i = 0; i < vdim; ++i)
972 template<
typename DataType>
975 DataType result = DataType(0);
978 for(
unsigned int i = 0; i < vdim; ++i)
988 template<
typename DataType>
994 DataType result = DataType(0);
996 for(
unsigned int i = 0; i < ldim; ++i)
998 result += lhs[i]*rhs[i];
1006 const NekVector<NekDouble>& rhs) ;
1008 template<
typename DataType>
1012 if( m > DataType(0) )
1019 void Normalize(NekVector<NekDouble>& v);
1024 template<
typename DataType>
1030 DataType first = lhs.
y()*rhs.
z() - lhs.
z()*rhs.
y();
1031 DataType second = lhs.
z()*rhs.
x() - lhs.
x()*rhs.
z();
1032 DataType third = lhs.
x()*rhs.
y() - lhs.
y()*rhs.
x();
1039 NekVector<NekDouble>
Cross(
const NekVector<NekDouble>& lhs,
const NekVector<NekDouble>& rhs);
1041 template<
typename DataType>
1045 std::string result =
"(";
1046 for(
unsigned int i = 0; i < d; ++i)
1048 result += boost::lexical_cast<std::string>(v[i]);
1059 std::string
AsString(
const NekVector<NekDouble>& v);
NekVector()
Creates an empty vector.
#define ASSERTL0(condition, msg)
#define NEKERROR(type, msg)
Assert Level 0 – Fundamental assert which is used whether in FULLDEBUG, DEBUG or OPT compilation mod...
template NekVector< NekDouble > Subtract(const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
template void SubtractEqual(NekVector< NekDouble > &result, const NekVector< NekDouble > &rhs)
boost::call_traits< DataType >::reference x()
template void Normalize(NekVector< NekDouble > &v)
template std::string AsString(const NekVector< NekDouble > &v)
template void SubtractNegatedLhs(NekVector< NekDouble > &result, const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
template NekDouble InfinityNorm(const NekVector< NekDouble > &v)
template NekVector< NekDouble > Add(const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
DataType L1Norm(const NekVector< DataType > &v)
NekVector< DataType > Cross(const NekVector< DataType > &lhs, const NekVector< DataType > &rhs)
void Normalize(NekVector< DataType > &v)
template void SubtractEqualNegatedLhs(NekVector< NekDouble > &result, const NekVector< NekDouble > &rhs)
const_iterator begin() const
template bool operator!=(const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
template NekVector< NekDouble > Multiply(const NekDouble &lhs, const NekVector< NekDouble > &rhs)
template NekPoint< NekDouble > findPointAlongVector(const NekVector< NekDouble > &lhs, const NekDouble &t)
DataType Magnitude(const NekVector< DataType > &v)
template NekVector< NekDouble > createVectorFromPoints(const NekPoint< NekDouble > &source, const NekPoint< NekDouble > &dest)
const DataType * const_iterator
DataType L2Norm(const NekVector< DataType > &v)
std::string AsString(const NekVector< DataType > &v)
template NekDouble Magnitude(const NekVector< NekDouble > &v)
DataType InfinityNorm(const NekVector< DataType > &v)
DataType Dot(const NekVector< DataType > &lhs, const NekVector< DataType > &rhs)
std::string AsString() const
template void DivideEqual(NekVector< NekDouble > &result, const NekDouble &rhs)
template void MultiplyInvertedLhs(NekVector< NekDouble > &result, const NekDouble &lhs, const NekVector< NekDouble > &rhs)
template NekVector< NekDouble > Negate(const NekVector< NekDouble > &v)
#define LIB_UTILITIES_EXPORT
template void AddEqual(NekVector< NekDouble > &result, const NekVector< NekDouble > &rhs)
std::vector< DataType > FromString(const std::string &str)
void CopyArray(const Array< OneD, ConstDataType > &source, Array< OneD, DataType > &dest)
DataType Magnitude() const
PointerWrapper
Specifies if the pointer passed to a NekMatrix or NekVector is copied into an internal representation...
NekMatrix< typename NekMatrix< LhsDataType, LhsMatrixType >::NumberType, StandardMatrixTag > operator-(const NekMatrix< LhsDataType, LhsMatrixType > &lhs, const NekMatrix< RhsDataType, RhsMatrixType > &rhs)
template NekDouble L1Norm(const NekVector< NekDouble > &v)
void NegateInPlace(NekDouble &v)
boost::call_traits< DataType >::reference z()
template NekVector< NekDouble > Divide(const NekVector< NekDouble > &lhs, const NekDouble &rhs)
template NekDouble L2Norm(const NekVector< NekDouble > &v)
unsigned int GetDimension() const
Returns the number of dimensions for the point.
boost::call_traits< DataType >::reference y()
template void AddEqualNegatedLhs(NekVector< NekDouble > &result, const NekVector< NekDouble > &rhs)
StandardMatrixTag boost::call_traits< LhsDataType >::const_reference rhs
Array< OneD, const DataType >::const_iterator begin() const
unsigned int GetRows() const
size_t num_elements() const
Returns the array's size.
void InvertInPlace(NekDouble &v)
template NekVector< NekDouble > Cross(const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
1D Array of constant elements with garbage collection and bounds checking.
#define ASSERTL1(condition, msg)
Assert Level 1 – Debugging which is used whether in FULLDEBUG or DEBUG compilation mode...
bool operator==(const VertexSharedPtr &v1, const VertexSharedPtr &v2)
Define comparison operator for the vertex struct.
template void MultiplyEqual(NekVector< NekDouble > &result, const NekDouble &rhs)
template void AddNegatedLhs(NekVector< NekDouble > &result, const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)
template NekDouble Dot(const NekVector< NekDouble > &lhs, const NekVector< NekDouble > &rhs)