📄 type_tensor.h
字号:
_coords[3] + p._coords[3], _coords[4] + p._coords[4], _coords[5] + p._coords[5], _coords[6] + p._coords[6], _coords[7] + p._coords[7], _coords[8] + p._coords[8]);#endif }template <typename T>template<typename T2>inlineconst TypeTensor<T> & TypeTensor<T>::operator += (const TypeTensor<T2> &p){ this->add (p); return *this;}template <typename T>template<typename T2>inlinevoid TypeTensor<T>::add (const TypeTensor<T2> &p){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] += p._coords[i];}template <typename T>template <typename T2>inlinevoid TypeTensor<T>::add_scaled (const TypeTensor<T2> &p, const T factor){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] += factor*p._coords[i];}template <typename T>template<typename T2>inlineTypeTensor<typename CompareTypes<T, T2>::supertype>TypeTensor<T>::operator - (const TypeTensor<T2> &p) const{#if DIM == 1 return TypeTensor(_coords[0] - p._coords[0]);#endif#if DIM == 2 return TypeTensor(_coords[0] - p._coords[0], _coords[1] - p._coords[1], 0., _coords[2] - p._coords[2], _coords[3] - p._coords[3]);#endif#if DIM == 3 return TypeTensor(_coords[0] - p._coords[0], _coords[1] - p._coords[1], _coords[2] - p._coords[2], _coords[3] - p._coords[3], _coords[4] - p._coords[4], _coords[5] - p._coords[5], _coords[6] - p._coords[6], _coords[7] - p._coords[7], _coords[8] - p._coords[8]);#endif}template <typename T>template <typename T2>inlineconst TypeTensor<T> & TypeTensor<T>::operator -= (const TypeTensor<T2> &p){ this->subtract (p); return *this;}template <typename T>template <typename T2>inlinevoid TypeTensor<T>::subtract (const TypeTensor<T2>& p){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] -= p._coords[i];}template <typename T>template <typename T2>inlinevoid TypeTensor<T>::subtract_scaled (const TypeTensor<T2> &p, const T factor){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] -= factor*p._coords[i];}template <typename T>inlineTypeTensor<T> TypeTensor<T>::operator - () const{ #if DIM == 1 return TypeTensor(-_coords[0]);#endif#if DIM == 2 return TypeTensor(-_coords[0], -_coords[1], -_coords[2], -_coords[3]);#endif#if DIM == 3 return TypeTensor(-_coords[0], -_coords[1], -_coords[2], -_coords[3], -_coords[4], -_coords[5], -_coords[6], -_coords[7], -_coords[8]);#endif }template <typename T>template <typename Scalar>inlinetypename boostcopy::enable_if_c< ScalarTraits<Scalar>::value, TypeTensor<typename CompareTypes<T, Scalar>::supertype> >::typeTypeTensor<T>::operator * (const Scalar factor) const{ typedef typename CompareTypes<T, Scalar>::supertype TS;#if DIM == 1 return TypeTensor<TS>(_coords[0]*factor);#endif #if DIM == 2 return TypeTensor<TS>(_coords[0]*factor, _coords[1]*factor, _coords[2]*factor, _coords[3]*factor);#endif #if DIM == 3 return TypeTensor<TS>(_coords[0]*factor, _coords[1]*factor, _coords[2]*factor, _coords[3]*factor, _coords[4]*factor, _coords[5]*factor, _coords[6]*factor, _coords[7]*factor, _coords[8]*factor);#endif }template <typename T, typename Scalar>inlinetypename boostcopy::enable_if_c< ScalarTraits<Scalar>::value, TypeTensor<typename CompareTypes<T, Scalar>::supertype> >::typeoperator * (const Scalar factor, const TypeTensor<T> &t){ return t * factor;}template <typename T>template <typename Scalar>inlineconst TypeTensor<T> & TypeTensor<T>::operator *= (const Scalar factor){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] *= factor; return *this;}template <typename T>template <typename Scalar>inlinetypename boostcopy::enable_if_c< ScalarTraits<Scalar>::value, TypeTensor<typename CompareTypes<T, Scalar>::supertype> >::typeTypeTensor<T>::operator / (const Scalar factor) const{ libmesh_assert (factor != static_cast<T>(0.)); typedef typename CompareTypes<T, Scalar>::supertype TS; #if DIM == 1 return TypeTensor<TS>(_coords[0]/factor);#endif #if DIM == 2 return TypeTensor<TS>(_coords[0]/factor, _coords[1]/factor, _coords[2]/factor, _coords[3]/factor);#endif #if DIM == 3 return TypeTensor<TS>(_coords[0]/factor, _coords[1]/factor, _coords[2]/factor, _coords[3]/factor, _coords[4]/factor, _coords[5]/factor, _coords[6]/factor, _coords[7]/factor, _coords[8]/factor);#endif }template <typename T>inlineTypeTensor<T> TypeTensor<T>::transpose() const{#if DIM == 1 return TypeTensor(_coords[0]);#endif #if DIM == 2 return TypeTensor(_coords[0], _coords[2], _coords[1], _coords[3]);#endif #if DIM == 3 return TypeTensor(_coords[0], _coords[3], _coords[6], _coords[1], _coords[4], _coords[7], _coords[2], _coords[5], _coords[8]);#endif}template <typename T>inlineconst TypeTensor<T> & TypeTensor<T>::operator /= (const T factor){ libmesh_assert (factor != static_cast<T>(0.)); for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] /= factor; return *this;}template <typename T>template <typename T2>inlineTypeVector<typename CompareTypes<T,T2>::supertype>TypeTensor<T>::operator * (const TypeVector<T2> &p) const{ TypeVector<typename CompareTypes<T,T2>::supertype> returnval; for (unsigned int i=0; i<DIM; i++) for (unsigned int j=0; j<DIM; j++) returnval(i) += (*this)(i,j)*p(j); return returnval;}template <typename T>template <typename T2>inlineTypeTensor<T> TypeTensor<T>::operator * (const TypeTensor<T2> &p) const{ TypeTensor<T> returnval; for (unsigned int i=0; i<DIM; i++) for (unsigned int j=0; j<DIM; j++) for (unsigned int k=0; k<DIM; k++) returnval(i,j) += (*this)(i,k)*p(k,j); return returnval;} /** * Multiply 2 tensors together, i.e. sum Aij*Bij. * The tensors may be of different types. */template <typename T>template <typename T2>inlinetypename CompareTypes<T,T2>::supertypeTypeTensor<T>::contract (const TypeTensor<T2> &t) const{ typename CompareTypes<T,T2>::supertype sum = 0.; for (unsigned int i=0; i<DIM*DIM; i++) sum += _coords[i]*t._coords[i]; return sum;}template <typename T>inlineReal TypeTensor<T>::size() const{ return std::sqrt(this->size_sq()); }template <typename T>inlinevoid TypeTensor<T>::zero(){ for (unsigned int i=0; i<DIM*DIM; i++) _coords[i] = 0.;}template <typename T>inlineReal TypeTensor<T>::size_sq () const{ Real sum = 0.; for (unsigned int i=0; i<DIM*DIM; i++) sum += libmesh_norm(_coords[i]); return sum;}template <typename T>inlinebool TypeTensor<T>::operator == (const TypeTensor<T>& rhs) const{#if DIM == 1 return (std::abs(_coords[0] - rhs._coords[0]) < TOLERANCE);#endif #if DIM == 2 return ((std::abs(_coords[0] - rhs._coords[0]) + std::abs(_coords[1] - rhs._coords[1]) + std::abs(_coords[2] - rhs._coords[2]) + std::abs(_coords[3] - rhs._coords[3])) < 4.*TOLERANCE);#endif #if DIM == 3 return ((std::abs(_coords[0] - rhs._coords[0]) + std::abs(_coords[1] - rhs._coords[1]) + std::abs(_coords[2] - rhs._coords[2]) + std::abs(_coords[3] - rhs._coords[3]) + std::abs(_coords[4] - rhs._coords[4]) + std::abs(_coords[5] - rhs._coords[5]) + std::abs(_coords[6] - rhs._coords[6]) + std::abs(_coords[7] - rhs._coords[7]) + std::abs(_coords[8] - rhs._coords[8])) < 9.*TOLERANCE);#endif }#endif // #define __type_tensor_h__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -