diff --git a/src/common/aka_types.hh b/src/common/aka_types.hh index 3d5f70746..fa91fa13b 100644 --- a/src/common/aka_types.hh +++ b/src/common/aka_types.hh @@ -1,1185 +1,1236 @@ /** * @file aka_types.hh * * @author Nicolas Richart * * @date creation: Thu Feb 17 2011 * @date last modification: Fri Jan 22 2016 * * @brief description of the "simple" types * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_error.hh" #include "aka_fwd.hh" #include "aka_math.hh" /* -------------------------------------------------------------------------- */ -#include #include +#include +#include /* -------------------------------------------------------------------------- */ #ifndef __AKANTU_AKA_TYPES_HH__ #define __AKANTU_AKA_TYPES_HH__ __BEGIN_AKANTU__ enum NormType { L_1 = 1, L_2 = 2, L_inf = UInt(-1) }; /** * DimHelper is a class to generalize the setup of a dim array from 3 * values. This gives a common interface in the TensorStorage class * independently of its derived inheritance (Vector, Matrix, Tensor3) * @tparam dim */ template struct DimHelper { static inline void setDims(UInt m, UInt n, UInt p, UInt dims[dim]); }; /* -------------------------------------------------------------------------- */ template <> struct DimHelper<1> { static inline void setDims(UInt m, __attribute__((unused)) UInt n, __attribute__((unused)) UInt p, UInt dims[1]) { dims[0] = m; } }; /* -------------------------------------------------------------------------- */ template <> struct DimHelper<2> { static inline void setDims(UInt m, UInt n, __attribute__((unused)) UInt p, UInt dims[2]) { dims[0] = m; dims[1] = n; } }; /* -------------------------------------------------------------------------- */ template <> struct DimHelper<3> { static inline void setDims(UInt m, UInt n, UInt p, UInt dims[3]) { dims[0] = m; dims[1] = n; dims[2] = p; } }; /* -------------------------------------------------------------------------- */ template class TensorStorage; /* -------------------------------------------------------------------------- */ /* Proxy classes */ /* -------------------------------------------------------------------------- */ +namespace tensors { +template struct is_copyable { + enum : bool { value = false }; +}; + +template struct is_copyable { + enum : bool { value = true }; +}; + +template struct is_copyable { + enum : bool { value = true }; +}; + +template struct is_copyable { + enum : bool { value = true }; +}; +} // namespace tensors /** * @class TensorProxy aka_types.hh * @desc The TensorProxy class is a proxy class to the TensorStorage it handles * the * wrapped case. That is to say if an accessor should give access to a Tensor * wrapped on some data, like the Array::iterator they can return a * TensorProxy that will be automatically transformed as a TensorStorage wrapped * on the same data * @tparam T stored type * @tparam ndim order of the tensor * @tparam RetType real derived type */ -template class TensorProxy { +template class TensorProxy { protected: + using RetTypeProxy = typename _RetType::proxy; + TensorProxy(T * data, UInt m, UInt n, UInt p) { DimHelper::setDims(m, n, p, this->n); this->values = data; } - TensorProxy(const TensorProxy & other) { + template ::value>> + explicit TensorProxy(const Other & other) { this->values = other.storage(); for (UInt i = 0; i < ndim; ++i) - this->n[i] = other.n[i]; + this->n[i] = other.size(i); } - inline TensorProxy(const TensorStorage & other); - - using RetTypeProxy = typename RetType::proxy; - public: + using RetType = _RetType; + operator RetType() { return RetType(static_cast(*this)); } UInt size(UInt i) const { AKANTU_DEBUG_ASSERT(i < ndim, "This tensor has only " << ndim << " dimensions, not " << (i + 1)); return n[i]; } inline UInt size() const { UInt _size = 1; for (UInt d = 0; d < ndim; ++d) _size *= this->n[d]; return _size; } T * storage() const { return values; } - inline RetTypeProxy & operator=(const RetType & src) { + template ::value>> + inline TensorProxy & operator=(const Other & other) { AKANTU_DEBUG_ASSERT( - src.size() == this->size(), + other.size() == this->size(), "You are trying to copy two tensors with different sizes"); - memcpy(this->values, src.storage(), this->size() * sizeof(T)); + memcpy(this->values, other.storage(), this->size() * sizeof(T)); return *this; } - inline RetTypeProxy & operator=(const RetTypeProxy & src) { - AKANTU_DEBUG_ASSERT( - src.size() == this->size(), - "You are trying to copy two tensors with different sizes"); - memcpy(this->values, src.storage(), this->size() * sizeof(T)); - return *this; - } + // template ::value>> + // inline TensorProxy & operator=(const Other && other) { + // AKANTU_DEBUG_ASSERT( + // other.size() == this->size(), + // "You are trying to copy two tensors with different sizes"); + // memcpy(this->values, other.storage(), this->size() * sizeof(T)); + // return *this; + // } template inline RetTypeProxy & operator*=(const O & o) { RetType(*this) *= o; return static_cast(*this); } template inline RetTypeProxy & operator/=(const O & o) { RetType(*this) /= o; return static_cast(*this); } protected: T * values; UInt n[ndim]; }; /* -------------------------------------------------------------------------- */ -template class VectorProxy : public TensorProxy > { - typedef TensorProxy > parent; +template class VectorProxy : public TensorProxy> { + using parent = TensorProxy>; using type = Vector; public: VectorProxy(T * data, UInt n) : parent(data, n, 0, 0) {} - VectorProxy(const VectorProxy & src) : parent(src) {} - VectorProxy(const Vector & src) : parent(src) {} + template VectorProxy(Other & src) : parent(src) {} + + /* ---------------------------------------------------------------------- */ + template + inline VectorProxy & operator=(const Other & other) { + parent::operator=(other); + return *this; + } + + // inline VectorProxy & operator=(const VectorProxy && other) { + // parent::operator=(other); + // return *this; + // } + + /* ------------------------------------------------------------------------ */ T & operator()(UInt index) { return this->values[index]; }; const T & operator()(UInt index) const { return this->values[index]; }; }; -template class MatrixProxy : public TensorProxy > { - typedef TensorProxy > parent; +template class MatrixProxy : public TensorProxy> { + using parent = TensorProxy>; using type = Matrix; public: MatrixProxy(T * data, UInt m, UInt n) : parent(data, m, n, 0) {} - MatrixProxy(const MatrixProxy & src) : parent(src) {} - MatrixProxy(const type & src) : parent(src) {} + template MatrixProxy(Other & src) : parent(src) {} + + /* ---------------------------------------------------------------------- */ + template + inline MatrixProxy & operator=(const Other & other) { + parent::operator=(other); + return *this; + } }; template -class Tensor3Proxy : public TensorProxy > { - typedef TensorProxy > parent; +class Tensor3Proxy : public TensorProxy> { + typedef TensorProxy> parent; using type = Tensor3; public: Tensor3Proxy(T * data, UInt m, UInt n, UInt k) : parent(data, m, n, k) {} Tensor3Proxy(const Tensor3Proxy & src) : parent(src) {} Tensor3Proxy(const Tensor3 & src) : parent(src) {} + + /* ---------------------------------------------------------------------- */ + template + inline Tensor3Proxy & operator=(const Other & other) { + parent::operator=(other); + return *this; + } }; /* -------------------------------------------------------------------------- */ /* Tensor base class */ /* -------------------------------------------------------------------------- */ template class TensorStorage { public: using value_type = T; protected: template void copySize(const TensorType & src) { for (UInt d = 0; d < ndim; ++d) this->n[d] = src.size(d); this->_size = src.size(); } - TensorStorage() : values(NULL) { + TensorStorage() : values(nullptr) { for (UInt d = 0; d < ndim; ++d) this->n[d] = 0; _size = 0; } TensorStorage(const TensorProxy & proxy) { this->copySize(proxy); this->values = proxy.storage(); this->wrapped = true; } protected: TensorStorage(const TensorStorage & src) = delete; public: TensorStorage(const TensorStorage & src, bool deep_copy) - : values(NULL), wrapped(false) { + : values(nullptr), wrapped(false) { if (deep_copy) this->deepCopy(src); else this->shallowCopy(src); } protected: TensorStorage(UInt m, UInt n, UInt p, const T & def) { DimHelper::setDims(m, n, p, this->n); this->computeSize(); this->values = new T[this->_size]; this->set(def); this->wrapped = false; } TensorStorage(T * data, UInt m, UInt n, UInt p) { DimHelper::setDims(m, n, p, this->n); this->computeSize(); this->values = data; this->wrapped = true; } public: /* ------------------------------------------------------------------------ */ template inline void shallowCopy(const TensorType & src) { this->copySize(src); if (!this->wrapped) delete[] this->values; this->values = src.storage(); this->wrapped = true; } /* ------------------------------------------------------------------------ */ template inline void deepCopy(const TensorType & src) { this->copySize(src); if (!this->wrapped) delete[] this->values; this->values = new T[this->_size]; memcpy((void *)this->values, (void *)src.storage(), this->_size * sizeof(T)); this->wrapped = false; } virtual ~TensorStorage() { if (!this->wrapped) delete[] this->values; } /* ------------------------------------------------------------------------ */ inline TensorStorage & operator=(const RetType & src) { if (this != &src) { if (this->wrapped) { // this test is not sufficient for Tensor of order higher than 1 AKANTU_DEBUG_ASSERT(this->_size == src.size(), "Tensors of different size"); memcpy((void *)this->values, (void *)src.storage(), this->_size * sizeof(T)); } else { deepCopy(src); } } return *this; } /* ------------------------------------------------------------------------ */ template inline RetType & operator+=(const TensorStorage & other) { T * a = this->storage(); T * b = other.storage(); AKANTU_DEBUG_ASSERT( _size == other.size(), "The two tensors do not have the same size, they cannot be subtracted"); for (UInt i = 0; i < _size; ++i) *(a++) += *(b++); return *(static_cast(this)); } /* ------------------------------------------------------------------------ */ template inline RetType & operator-=(const TensorStorage & other) { T * a = this->storage(); T * b = other.storage(); AKANTU_DEBUG_ASSERT( _size == other.size(), "The two tensors do not have the same size, they cannot be subtracted"); for (UInt i = 0; i < _size; ++i) *(a++) -= *(b++); return *(static_cast(this)); } /* ------------------------------------------------------------------------ */ inline RetType & operator+=(const T & x) { T * a = this->values; for (UInt i = 0; i < _size; ++i) *(a++) += x; return *(static_cast(this)); } /* ------------------------------------------------------------------------ */ inline RetType & operator-=(const T & x) { T * a = this->values; for (UInt i = 0; i < _size; ++i) *(a++) -= x; return *(static_cast(this)); } /* ------------------------------------------------------------------------ */ inline RetType & operator*=(const T & x) { T * a = this->storage(); for (UInt i = 0; i < _size; ++i) *(a++) *= x; return *(static_cast(this)); } /* ---------------------------------------------------------------------- */ inline RetType & operator/=(const T & x) { T * a = this->values; for (UInt i = 0; i < _size; ++i) *(a++) /= x; return *(static_cast(this)); } /// Y = \alpha X + Y inline RetType & aXplusY(const TensorStorage & other, const T & alpha = 1.) { AKANTU_DEBUG_ASSERT( _size == other.size(), "The two tensors do not have the same size, they cannot be subtracted"); Math::aXplusY(this->_size, alpha, other.storage(), this->storage()); return *(static_cast(this)); } /* ------------------------------------------------------------------------ */ T * storage() const { return values; } UInt size() const { return _size; } UInt size(UInt i) const { AKANTU_DEBUG_ASSERT(i < ndim, "This tensor has only " << ndim << " dimensions, not " << (i + 1)); return n[i]; }; /* ------------------------------------------------------------------------ */ inline void clear() { memset(values, 0, _size * sizeof(T)); }; inline void set(const T & t) { std::fill_n(values, _size, t); }; template inline void copy(const TensorType & other) { AKANTU_DEBUG_ASSERT( _size == other.size(), "The two tensors do not have the same size, they cannot be copied"); memcpy(values, other.storage(), _size * sizeof(T)); } bool isWrapped() const { return this->wrapped; } protected: friend class Array; inline void computeSize() { _size = 1; for (UInt d = 0; d < ndim; ++d) _size *= this->n[d]; } protected: template struct NormHelper { template static R norm(const Ten & ten) { R _norm = 0.; R * it = ten.storage(); R * end = ten.storage() + ten.size(); for (; it < end; ++it) _norm += std::pow(std::abs(*it), norm_type); return std::pow(_norm, 1. / norm_type); } }; template struct NormHelper { template static R norm(const Ten & ten) { R _norm = 0.; R * it = ten.storage(); R * end = ten.storage() + ten.size(); for (; it < end; ++it) _norm += std::abs(*it); return _norm; } }; template struct NormHelper { template static R norm(const Ten & ten) { R _norm = 0.; R * it = ten.storage(); R * end = ten.storage() + ten.size(); for (; it < end; ++it) _norm += *it * *it; return sqrt(_norm); } }; template struct NormHelper { template static R norm(const Ten & ten) { R _norm = 0.; R * it = ten.storage(); R * end = ten.storage() + ten.size(); for (; it < end; ++it) _norm = std::max(std::abs(*it), _norm); return _norm; } }; public: /*----------------------------------------------------------------------- */ /// "Entrywise" norm norm @f[ \|\boldsymbol{T}\|_p = \left( /// \sum_i^{n[0]}\sum_j^{n[1]}\sum_k^{n[2]} |T_{ijk}|^p \right)^{\frac{1}{p}} /// @f] template inline T norm() const { return NormHelper::norm(*this); } protected: UInt n[ndim]; UInt _size; T * values; bool wrapped{false}; }; -template -inline TensorProxy::TensorProxy( - const TensorStorage & other) { - this->values = other.storage(); - for (UInt i = 0; i < ndim; ++i) - this->n[i] = other.size(i); -} +// template +// inline TensorProxy::TensorProxy( +// const TensorStorage & other) { +// this->values = other.storage(); +// for (UInt i = 0; i < ndim; ++i) +// this->n[i] = other.size(i); +// } /* -------------------------------------------------------------------------- */ /* Vector */ /* -------------------------------------------------------------------------- */ -template class Vector : public TensorStorage > { - typedef TensorStorage > parent; +template class Vector : public TensorStorage> { + typedef TensorStorage> parent; public: using value_type = typename parent::value_type; using proxy = VectorProxy; public: Vector() : parent() {} explicit Vector(UInt n, const T & def = T()) : parent(n, 0, 0, def) {} Vector(T * data, UInt n) : parent(data, n, 0, 0) {} Vector(const Vector & src, bool deep_copy = true) : parent(src, deep_copy) {} Vector(const VectorProxy & src) : parent(src) {} Vector(std::initializer_list list) : parent(list.size(), 0, 0, T()) { UInt i = 0; - for(auto val : list) { + for (auto val : list) { operator()(i++) = val; } } + public: ~Vector() override = default; /* ------------------------------------------------------------------------ */ inline Vector & operator=(const Vector & src) { parent::operator=(src); return *this; } /* ------------------------------------------------------------------------ */ inline T & operator()(UInt i) { AKANTU_DEBUG_ASSERT((i < this->n[0]), "Access out of the vector! " << "Index (" << i << ") is out of the vector of size (" << this->n[0] << ")"); return *(this->values + i); } inline const T & operator()(UInt i) const { AKANTU_DEBUG_ASSERT((i < this->n[0]), "Access out of the vector! " << "Index (" << i << ") is out of the vector of size (" << this->n[0] << ")"); return *(this->values + i); } inline T & operator[](UInt i) { return this->operator()(i); } inline const T & operator[](UInt i) const { return this->operator()(i); } /* ------------------------------------------------------------------------ */ inline Vector & operator*=(Real x) { return parent::operator*=(x); } inline Vector & operator/=(Real x) { return parent::operator/=(x); } /* ------------------------------------------------------------------------ */ inline Vector & operator*=(const Vector & vect) { T * a = this->storage(); T * b = vect.storage(); for (UInt i = 0; i < this->_size; ++i) *(a++) *= *(b++); return *this; } /* ------------------------------------------------------------------------ */ inline Real dot(const Vector & vect) const { return Math::vectorDot(this->values, vect.storage(), this->_size); } /* ------------------------------------------------------------------------ */ inline Real mean() const { Real mean = 0; T * a = this->storage(); for (UInt i = 0; i < this->_size; ++i) mean += *(a++); return mean / this->_size; } /* ------------------------------------------------------------------------ */ inline Vector & crossProduct(const Vector & v1, const Vector & v2) { AKANTU_DEBUG_ASSERT(this->size() == 3, "crossProduct is only defined in 3D (n=" << this->size() << ")"); AKANTU_DEBUG_ASSERT( this->size() == v1.size() && this->size() == v2.size(), "crossProduct is not a valid operation non matching size vectors"); Math::vectorProduct3(v1.storage(), v2.storage(), this->values); return *this; } /* ------------------------------------------------------------------------ */ inline void solve(Matrix & A, const Vector & b) { AKANTU_DEBUG_ASSERT( this->size() == A.rows() && this->_size = A.cols(), "The size of the solution vector mismatches the size of the matrix"); AKANTU_DEBUG_ASSERT( this->_size == b._size, "The rhs vector has a mismatch in size with the matrix"); Math::solve(this->_size, A.storage(), this->values, b.storage()); } /* ------------------------------------------------------------------------ */ template inline void mul(const Matrix & A, const Vector & x, Real alpha = 1.0); /* ------------------------------------------------------------------------ */ inline Real norm() const { return parent::template norm(); } template inline Real norm() const { return parent::template norm(); } /* ------------------------------------------------------------------------ */ inline void normalize() { Real n = norm(); operator/=(n); } /* ------------------------------------------------------------------------ */ /// norm of (*this - x) inline Real distance(const Vector & y) const { Real * vx = this->values; Real * vy = y.storage(); Real sum_2 = 0; for (UInt i = 0; i < this->_size; ++i, ++vx, ++vy) sum_2 += (*vx - *vy) * (*vx - *vy); return sqrt(sum_2); } /* ------------------------------------------------------------------------ */ inline bool equal(const Vector & v, Real tolerance = Math::getTolerance()) const { T * a = this->storage(); T * b = v.storage(); UInt i = 0; while (i < this->_size && (std::abs(*(a++) - *(b++)) < tolerance)) ++i; return i == this->_size; } /* ------------------------------------------------------------------------ */ inline short compare(const Vector & v, Real tolerance = Math::getTolerance()) const { T * a = this->storage(); T * b = v.storage(); for (UInt i(0); i < this->_size; ++i, ++a, ++b) { if (std::abs(*a - *b) > tolerance) return (((*a - *b) > tolerance) ? 1 : -1); } return 0; } /* ------------------------------------------------------------------------ */ inline bool operator==(const Vector & v) const { return equal(v); } - inline bool operator!=(const Vector & v) const { return ! operator==(v); } + inline bool operator!=(const Vector & v) const { return !operator==(v); } inline bool operator<(const Vector & v) const { return compare(v) == -1; } inline bool operator>(const Vector & v) const { return compare(v) == 1; } /* ------------------------------------------------------------------------ */ /// function to print the containt of the class virtual void printself(std::ostream & stream, int indent = 0) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << "["; for (UInt i = 0; i < this->_size; ++i) { if (i != 0) stream << ", "; stream << this->values[i]; } stream << "]"; } -// friend class ::akantu::Array; + // friend class ::akantu::Array; }; using RVector = Vector; /* ------------------------------------------------------------------------ */ template <> inline bool Vector::equal(const Vector & v, __attribute__((unused)) Real tolerance) const { UInt * a = this->storage(); UInt * b = v.storage(); UInt i = 0; while (i < this->_size && (*(a++) == *(b++))) ++i; return i == this->_size; } /* ------------------------------------------------------------------------ */ /* Matrix */ /* ------------------------------------------------------------------------ */ -template class Matrix : public TensorStorage > { - typedef TensorStorage > parent; +template class Matrix : public TensorStorage> { + typedef TensorStorage> parent; public: using value_type = typename parent::value_type; using proxy = MatrixProxy; public: Matrix() : parent() {} Matrix(UInt m, UInt n, const T & def = T()) : parent(m, n, 0, def) {} Matrix(T * data, UInt m, UInt n) : parent(data, m, n, 0) {} Matrix(const Matrix & src, bool deep_copy = true) : parent(src, deep_copy) {} Matrix(const MatrixProxy & src) : parent(src) {} Matrix(std::initializer_list> list) { std::size_t n = 0; std::size_t m = list.size(); - for(auto row : list) { + for (auto row : list) { n = std::max(n, row.size()); } DimHelper<2>::setDims(m, n, 0, this->n); this->computeSize(); this->values = new T[this->_size]; this->set(0); UInt i = 0, j = 0; - for(auto row : list) { - for(auto val : row) { + for (auto row : list) { + for (auto val : row) { at(i, j++) = val; } ++i; j = 0; } } virtual ~Matrix() = default; /* ------------------------------------------------------------------------ */ inline Matrix & operator=(const Matrix & src) { parent::operator=(src); return *this; } public: /* ---------------------------------------------------------------------- */ UInt rows() const { return this->n[0]; } UInt cols() const { return this->n[1]; } /* ---------------------------------------------------------------------- */ inline T & at(UInt i, UInt j) { AKANTU_DEBUG_ASSERT(((i < this->n[0]) && (j < this->n[1])), "Access out of the matrix! " << "Index (" << i << ", " << j << ") is out of the matrix of size (" << this->n[0] << ", " << this->n[1] << ")"); return *(this->values + i + j * this->n[0]); } inline const T & at(UInt i, UInt j) const { AKANTU_DEBUG_ASSERT(((i < this->n[0]) && (j < this->n[1])), "Access out of the matrix! " << "Index (" << i << ", " << j << ") is out of the matrix of size (" << this->n[0] << ", " << this->n[1] << ")"); return *(this->values + i + j * this->n[0]); } - /* ---------------------------------------------------------------------- */ + /* ------------------------------------------------------------------------ */ inline T & operator()(UInt i, UInt j) { return this->at(i, j); } inline const T & operator()(UInt i, UInt j) const { return this->at(i, j); } /// give a line vector wrapped on the column i inline VectorProxy operator()(UInt j) { AKANTU_DEBUG_ASSERT(j < this->n[1], "Access out of the matrix! " << "You are trying to access the column vector " << j << " in a matrix of size (" << this->n[0] << ", " << this->n[1] << ")"); return VectorProxy(this->values + j * this->n[0], this->n[0]); } inline const VectorProxy operator()(UInt j) const { AKANTU_DEBUG_ASSERT(j < this->n[1], "Access out of the matrix! " << "You are trying to access the column vector " << j << " in a matrix of size (" << this->n[0] << ", " << this->n[1] << ")"); return VectorProxy(this->values + j * this->n[0], this->n[0]); } inline T & operator[](UInt idx) { return *(this->values + idx); }; inline const T & operator[](UInt idx) const { return *(this->values + idx); }; /* ---------------------------------------------------------------------- */ inline Matrix operator*(const Matrix & B) { Matrix C(this->rows(), B.cols()); C.mul(*this, B); return C; } /* ----------------------------------------------------------------------- */ inline Matrix & operator*=(const T & x) { return parent::operator*=(x); } inline Matrix & operator*=(const Matrix & B) { Matrix C(*this); this->mul(C, B); return *this; } /* ---------------------------------------------------------------------- */ template inline void mul(const Matrix & A, const Matrix & B, T alpha = 1.0) { UInt k = A.cols(); if (tr_A) k = A.rows(); #ifndef AKANTU_NDEBUG if (tr_B) { AKANTU_DEBUG_ASSERT(k == B.cols(), "matrices to multiply have no fit dimensions"); AKANTU_DEBUG_ASSERT(this->cols() == B.rows(), "matrices to multiply have no fit dimensions"); } else { AKANTU_DEBUG_ASSERT(k == B.rows(), "matrices to multiply have no fit dimensions"); AKANTU_DEBUG_ASSERT(this->cols() == B.cols(), "matrices to multiply have no fit dimensions"); } if (tr_A) { AKANTU_DEBUG_ASSERT(this->rows() == A.cols(), "matrices to multiply have no fit dimensions"); } else { AKANTU_DEBUG_ASSERT(this->rows() == A.rows(), "matrices to multiply have no fit dimensions"); } #endif // AKANTU_NDEBUG Math::matMul(this->rows(), this->cols(), k, alpha, A.storage(), B.storage(), 0., this->storage()); } /* ---------------------------------------------------------------------- */ inline void outerProduct(const Vector & A, const Vector & B) { AKANTU_DEBUG_ASSERT( A.size() == this->rows() && B.size() == this->cols(), "A and B are not compatible with the size of the matrix"); for (UInt i = 0; i < this->rows(); ++i) { for (UInt j = 0; j < this->cols(); ++j) { this->values[i + j * this->rows()] += A[i] * B[j]; } } } private: class EigenSorter { public: EigenSorter(const Vector & eigs) : eigs(eigs) {} bool operator()(const UInt & a, const UInt & b) const { return (eigs(a) > eigs(b)); } private: const Vector & eigs; }; public: /* ---------------------------------------------------------------------- */ inline void eig(Vector & eigenvalues, Matrix & eigenvectors) const { AKANTU_DEBUG_ASSERT(this->cols() == this->rows(), "eig is not a valid operation on a rectangular matrix"); AKANTU_DEBUG_ASSERT(eigenvalues.size() == this->cols(), "eigenvalues should be of size " << this->cols() << "."); #ifndef AKANTU_NDEBUG if (eigenvectors.storage() != NULL) AKANTU_DEBUG_ASSERT((eigenvectors.rows() == eigenvectors.cols()) && (eigenvectors.rows() == this->cols()), "Eigenvectors needs to be a square matrix of size " << this->cols() << " x " << this->cols() << "."); #endif Matrix tmp = *this; Vector tmp_eigs(eigenvalues.size()); Matrix tmp_eig_vects(eigenvectors.rows(), eigenvectors.cols()); if (tmp_eig_vects.rows() == 0 || tmp_eig_vects.cols() == 0) Math::matrixEig(tmp.cols(), tmp.storage(), tmp_eigs.storage()); else Math::matrixEig(tmp.cols(), tmp.storage(), tmp_eigs.storage(), tmp_eig_vects.storage()); Vector perm(eigenvalues.size()); for (UInt i = 0; i < perm.size(); ++i) perm(i) = i; std::sort(perm.storage(), perm.storage() + perm.size(), EigenSorter(tmp_eigs)); for (UInt i = 0; i < perm.size(); ++i) eigenvalues(i) = tmp_eigs(perm(i)); if (tmp_eig_vects.rows() != 0 && tmp_eig_vects.cols() != 0) for (UInt i = 0; i < perm.size(); ++i) { for (UInt j = 0; j < eigenvectors.rows(); ++j) { eigenvectors(j, i) = tmp_eig_vects(j, perm(i)); } } } /* ---------------------------------------------------------------------- */ inline void eig(Vector & eigenvalues) const { Matrix empty; eig(eigenvalues, empty); } /* ---------------------------------------------------------------------- */ inline void eye(T alpha = 1.) { AKANTU_DEBUG_ASSERT(this->cols() == this->rows(), "eye is not a valid operation on a rectangular matrix"); this->clear(); for (UInt i = 0; i < this->cols(); ++i) { this->values[i + i * this->rows()] = alpha; } } /* ---------------------------------------------------------------------- */ static inline Matrix eye(UInt m, T alpha = 1.) { Matrix tmp(m, m); tmp.eye(alpha); return tmp; } /* ---------------------------------------------------------------------- */ inline T trace() const { AKANTU_DEBUG_ASSERT( this->cols() == this->rows(), "trace is not a valid operation on a rectangular matrix"); T trace = 0.; for (UInt i = 0; i < this->rows(); ++i) { trace += this->values[i + i * this->rows()]; } return trace; } /* ---------------------------------------------------------------------- */ inline Matrix transpose() const { Matrix tmp(this->cols(), this->rows()); for (UInt i = 0; i < this->rows(); ++i) { for (UInt j = 0; j < this->cols(); ++j) { tmp(j, i) = operator()(i, j); } } return tmp; } /* ---------------------------------------------------------------------- */ inline void inverse(const Matrix & A) { AKANTU_DEBUG_ASSERT(A.cols() == A.rows(), "inv is not a valid operation on a rectangular matrix"); AKANTU_DEBUG_ASSERT(this->cols() == A.cols(), "the matrix should have the same size as its inverse"); if (this->cols() == 1) *this->values = 1. / *A.storage(); else if (this->cols() == 2) Math::inv2(A.storage(), this->values); else if (this->cols() == 3) Math::inv3(A.storage(), this->values); else Math::inv(this->cols(), A.storage(), this->values); } /* --------------------------------------------------------------------- */ inline T det() const { AKANTU_DEBUG_ASSERT(this->cols() == this->rows(), "inv is not a valid operation on a rectangular matrix"); if (this->cols() == 1) return *(this->values); else if (this->cols() == 2) return Math::det2(this->values); else if (this->cols() == 3) return Math::det3(this->values); else return Math::det(this->cols(), this->values); } /* --------------------------------------------------------------------- */ inline T doubleDot(const Matrix & other) const { AKANTU_DEBUG_ASSERT( this->cols() == this->rows(), "doubleDot is not a valid operation on a rectangular matrix"); if (this->cols() == 1) return *(this->values) * *(other.storage()); else if (this->cols() == 2) return Math::matrixDoubleDot22(this->values, other.storage()); else if (this->cols() == 3) return Math::matrixDoubleDot33(this->values, other.storage()); else AKANTU_DEBUG_ERROR("doubleDot is not defined for other spatial dimensions" << " than 1, 2 or 3."); return T(); } /* ---------------------------------------------------------------------- */ /// function to print the containt of the class virtual void printself(std::ostream & stream, int indent = 0) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << "["; for (UInt i = 0; i < this->n[0]; ++i) { if (i != 0) stream << ", "; stream << "["; for (UInt j = 0; j < this->n[1]; ++j) { if (j != 0) stream << ", "; stream << operator()(i, j); } stream << "]"; } stream << "]"; }; }; /* ------------------------------------------------------------------------ */ template template inline void Vector::mul(const Matrix & A, const Vector & x, Real alpha) { #ifndef AKANTU_NDEBUG UInt n = x.size(); if (tr_A) { AKANTU_DEBUG_ASSERT(n == A.rows(), "matrix and vector to multiply have no fit dimensions"); AKANTU_DEBUG_ASSERT(this->size() == A.cols(), "matrix and vector to multiply have no fit dimensions"); } else { AKANTU_DEBUG_ASSERT(n == A.cols(), "matrix and vector to multiply have no fit dimensions"); AKANTU_DEBUG_ASSERT(this->size() == A.rows(), "matrix and vector to multiply have no fit dimensions"); } #endif Math::matVectMul(A.rows(), A.cols(), alpha, A.storage(), x.storage(), 0., this->storage()); } /* -------------------------------------------------------------------------- */ template inline std::ostream & operator<<(std::ostream & stream, const Matrix & _this) { _this.printself(stream); return stream; } /* -------------------------------------------------------------------------- */ template inline std::ostream & operator<<(std::ostream & stream, const Vector & _this) { _this.printself(stream); return stream; } /* ------------------------------------------------------------------------ */ /* Tensor3 */ /* ------------------------------------------------------------------------ */ -template class Tensor3 : public TensorStorage > { - typedef TensorStorage > parent; +template class Tensor3 : public TensorStorage> { + typedef TensorStorage> parent; public: using value_type = typename parent::value_type; using proxy = Tensor3Proxy; public: Tensor3() : parent(){}; Tensor3(UInt m, UInt n, UInt p, const T & def = T()) : parent(m, n, p, def) {} Tensor3(T * data, UInt m, UInt n, UInt p) : parent(data, m, n, p) {} Tensor3(const Tensor3 & src, bool deep_copy = true) : parent(src, deep_copy) {} public: /* ------------------------------------------------------------------------ */ inline Tensor3 & operator=(const Tensor3 & src) { parent::operator=(src); return *this; } /* ---------------------------------------------------------------------- */ inline T & operator()(UInt i, UInt j, UInt k) { AKANTU_DEBUG_ASSERT( (i < this->n[0]) && (j < this->n[1]) && (k < this->n[2]), "Access out of the tensor3! " << "You are trying to access the element " << "(" << i << ", " << j << ", " << k << ") in a tensor of size (" << this->n[0] << ", " << this->n[1] << ", " << this->n[2] << ")"); return *(this->values + (k * this->n[0] + i) * this->n[1] + j); } inline const T & operator()(UInt i, UInt j, UInt k) const { AKANTU_DEBUG_ASSERT( (i < this->n[0]) && (j < this->n[1]) && (k < this->n[2]), "Access out of the tensor3! " << "You are trying to access the element " << "(" << i << ", " << j << ", " << k << ") in a tensor of size (" << this->n[0] << ", " << this->n[1] << ", " << this->n[2] << ")"); return *(this->values + (k * this->n[0] + i) * this->n[1] + j); } inline MatrixProxy operator()(UInt k) { AKANTU_DEBUG_ASSERT((k < this->n[2]), "Access out of the tensor3! " << "You are trying to access the slice " << k << " in a tensor3 of size (" << this->n[0] << ", " << this->n[1] << ", " << this->n[2] << ")"); return MatrixProxy(this->values + k * this->n[0] * this->n[1], this->n[0], this->n[1]); } inline const MatrixProxy operator()(UInt k) const { AKANTU_DEBUG_ASSERT((k < this->n[2]), "Access out of the tensor3! " << "You are trying to access the slice " << k << " in a tensor3 of size (" << this->n[0] << ", " << this->n[1] << ", " << this->n[2] << ")"); return MatrixProxy(this->values + k * this->n[0] * this->n[1], this->n[0], this->n[1]); } inline MatrixProxy operator[](UInt k) { return MatrixProxy(this->values + k * this->n[0] * this->n[1], this->n[0], this->n[1]); } inline const MatrixProxy operator[](UInt k) const { return MatrixProxy(this->values + k * this->n[0] * this->n[1], this->n[0], this->n[1]); } }; /* -------------------------------------------------------------------------- */ // support operations for the creation of other vectors /* -------------------------------------------------------------------------- */ template Vector operator*(const T & scalar, const Vector & a) { Vector r(a); r *= scalar; return r; } template Vector operator*(const Vector & a, const T & scalar) { Vector r(a); r *= scalar; return r; } template Vector operator/(const Vector & a, const T & scalar) { Vector r(a); r /= scalar; return r; } template Vector operator+(const Vector & a, const Vector & b) { Vector r(a); r += b; return r; } template Vector operator-(const Vector & a, const Vector & b) { Vector r(a); r -= b; return r; } /* -------------------------------------------------------------------------- */ template Matrix operator*(const T & scalar, const Matrix & a) { Matrix r(a); r *= scalar; return r; } template Matrix operator*(const Matrix & a, const T & scalar) { Matrix r(a); r *= scalar; return r; } template Matrix operator/(const Matrix & a, const T & scalar) { Matrix r(a); r /= scalar; return r; } template Matrix operator+(const Matrix & a, const Matrix & b) { Matrix r(a); r += b; return r; } template Matrix operator-(const Matrix & a, const Matrix & b) { Matrix r(a); r -= b; return r; } __END_AKANTU__ #endif /* __AKANTU_AKA_TYPES_HH__ */ diff --git a/src/mesh/group_manager.cc b/src/mesh/group_manager.cc index c6387a49d..5e2fa9a07 100644 --- a/src/mesh/group_manager.cc +++ b/src/mesh/group_manager.cc @@ -1,1028 +1,1028 @@ /** * @file group_manager.cc * * @author Guillaume Anciaux * @author Dana Christen * @author David Simon Kammer * @author Nicolas Richart * @author Marco Vocialta * * @date creation: Wed Nov 13 2013 * @date last modification: Mon Aug 17 2015 * * @brief Stores information about ElementGroup and NodeGroup * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "group_manager.hh" #include "aka_csr.hh" #include "mesh.hh" #include "mesh_utils.hh" #include "data_accessor.hh" #include "element_synchronizer.hh" #include "element_group.hh" #include "node_group.hh" /* -------------------------------------------------------------------------- */ #include #include #include #include #include #include /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ GroupManager::GroupManager(const Mesh & mesh, const ID & id, const MemoryID & mem_id) : id(id), memory_id(mem_id), mesh(mesh) { AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ GroupManager::~GroupManager() { ElementGroups::iterator eit = element_groups.begin(); ElementGroups::iterator eend = element_groups.end(); for (; eit != eend; ++eit) delete (eit->second); NodeGroups::iterator nit = node_groups.begin(); NodeGroups::iterator nend = node_groups.end(); for (; nit != nend; ++nit) delete (nit->second); } /* -------------------------------------------------------------------------- */ NodeGroup & GroupManager::createNodeGroup(const std::string & group_name, bool replace_group) { AKANTU_DEBUG_IN(); NodeGroups::iterator it = node_groups.find(group_name); if (it != node_groups.end()) { if (replace_group) { it->second->empty(); AKANTU_DEBUG_OUT(); return *(it->second); } else AKANTU_EXCEPTION( "Trying to create a node group that already exists:" << group_name); } std::stringstream sstr; sstr << this->id << ":" << group_name << "_node_group"; NodeGroup * node_group = new NodeGroup(group_name, mesh, sstr.str(), memory_id); node_groups[group_name] = node_group; AKANTU_DEBUG_OUT(); return *node_group; } /* -------------------------------------------------------------------------- */ template NodeGroup & GroupManager::createFilteredNodeGroup(const std::string & group_name, const NodeGroup & source_node_group, T & filter) { AKANTU_DEBUG_IN(); NodeGroup & node_group = this->createNodeGroup(group_name); node_group.append(source_node_group); if (T::type == FilterFunctor::_node_filter_functor) { node_group.applyNodeFilter(filter); } else { AKANTU_DEBUG_ERROR("ElementFilter cannot be applied to NodeGroup yet." << " Needs to be implemented."); } AKANTU_DEBUG_OUT(); return node_group; } /* -------------------------------------------------------------------------- */ void GroupManager::destroyNodeGroup(const std::string & group_name) { AKANTU_DEBUG_IN(); NodeGroups::iterator nit = node_groups.find(group_name); NodeGroups::iterator nend = node_groups.end(); if (nit != nend) { delete (nit->second); node_groups.erase(nit); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ ElementGroup & GroupManager::createElementGroup(const std::string & group_name, UInt dimension, bool replace_group) { AKANTU_DEBUG_IN(); NodeGroup & new_node_group = createNodeGroup(group_name + "_nodes", replace_group); ElementGroups::iterator it = element_groups.find(group_name); if (it != element_groups.end()) { if (replace_group) { it->second->empty(); AKANTU_DEBUG_OUT(); return *(it->second); } else AKANTU_EXCEPTION("Trying to create a element group that already exists:" << group_name); } std::stringstream sstr; sstr << this->id << ":" << group_name << "_element_group"; ElementGroup * element_group = new ElementGroup( group_name, mesh, new_node_group, dimension, sstr.str(), memory_id); std::stringstream sstr_nodes; sstr_nodes << group_name << "_nodes"; node_groups[sstr_nodes.str()] = &new_node_group; element_groups[group_name] = element_group; AKANTU_DEBUG_OUT(); return *element_group; } /* -------------------------------------------------------------------------- */ void GroupManager::destroyElementGroup(const std::string & group_name, bool destroy_node_group) { AKANTU_DEBUG_IN(); ElementGroups::iterator eit = element_groups.find(group_name); ElementGroups::iterator eend = element_groups.end(); if (eit != eend) { if (destroy_node_group) destroyNodeGroup(eit->second->getNodeGroup().getName()); delete (eit->second); element_groups.erase(eit); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void GroupManager::destroyAllElementGroups(bool destroy_node_groups) { AKANTU_DEBUG_IN(); ElementGroups::iterator eit = element_groups.begin(); ElementGroups::iterator eend = element_groups.end(); for (; eit != eend; ++eit) { if (destroy_node_groups) destroyNodeGroup(eit->second->getNodeGroup().getName()); delete (eit->second); } element_groups.clear(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ ElementGroup & GroupManager::createElementGroup(const std::string & group_name, UInt dimension, NodeGroup & node_group) { AKANTU_DEBUG_IN(); if (element_groups.find(group_name) != element_groups.end()) AKANTU_EXCEPTION( "Trying to create a element group that already exists:" << group_name); ElementGroup * element_group = new ElementGroup(group_name, mesh, node_group, dimension, id + ":" + group_name + "_element_group", memory_id); element_groups[group_name] = element_group; AKANTU_DEBUG_OUT(); return *element_group; } /* -------------------------------------------------------------------------- */ template ElementGroup & GroupManager::createFilteredElementGroup( const std::string & group_name, UInt dimension, const NodeGroup & node_group, T & filter) { AKANTU_DEBUG_IN(); ElementGroup * element_group = NULL; if (T::type == FilterFunctor::_node_filter_functor) { NodeGroup & filtered_node_group = this->createFilteredNodeGroup( group_name + "_nodes", node_group, filter); element_group = &(this->createElementGroup(group_name, dimension, filtered_node_group)); } else if (T::type == FilterFunctor::_element_filter_functor) { AKANTU_DEBUG_ERROR( "Cannot handle an ElementFilter yet. Needs to be implemented."); } AKANTU_DEBUG_OUT(); return *element_group; } /* -------------------------------------------------------------------------- */ class ClusterSynchronizer : public DataAccessor { typedef std::set > DistantIDs; public: ClusterSynchronizer(GroupManager & group_manager, UInt element_dimension, std::string cluster_name_prefix, ElementTypeMapArray & element_to_fragment, ElementSynchronizer & element_synchronizer, UInt nb_cluster) : group_manager(group_manager), element_dimension(element_dimension), cluster_name_prefix(cluster_name_prefix), element_to_fragment(element_to_fragment), element_synchronizer(element_synchronizer), nb_cluster(nb_cluster) {} UInt synchronize() { StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); UInt rank = comm.whoAmI(); UInt nb_proc = comm.getNbProc(); /// find starting index to renumber local clusters Array nb_cluster_per_proc(nb_proc); nb_cluster_per_proc(rank) = nb_cluster; comm.allGather(nb_cluster_per_proc); starting_index = std::accumulate(nb_cluster_per_proc.begin(), nb_cluster_per_proc.begin() + rank, 0); UInt global_nb_fragment = std::accumulate(nb_cluster_per_proc.begin() + rank, nb_cluster_per_proc.end(), starting_index); /// create the local to distant cluster pairs with neighbors element_synchronizer.computeBufferSize(*this, _gst_gm_clusters); element_synchronizer.asynchronousSynchronize(*this, _gst_gm_clusters); element_synchronizer.waitEndSynchronize(*this, _gst_gm_clusters); /// count total number of pairs Array nb_pairs(nb_proc); // This is potentially a bug for more than // 2**31 pairs, but due to a all gatherv after // it must be int to match MPI interfaces nb_pairs(rank) = distant_ids.size(); comm.allGather(nb_pairs); UInt total_nb_pairs = std::accumulate(nb_pairs.begin(), nb_pairs.end(), 0); /// generate pairs global array UInt local_pair_index = std::accumulate(nb_pairs.storage(), nb_pairs.storage() + rank, 0); Array total_pairs(total_nb_pairs, 2); DistantIDs::iterator ids_it = distant_ids.begin(); DistantIDs::iterator ids_end = distant_ids.end(); for (; ids_it != ids_end; ++ids_it, ++local_pair_index) { total_pairs(local_pair_index, 0) = ids_it->first; total_pairs(local_pair_index, 1) = ids_it->second; } /// communicate pairs to all processors nb_pairs *= 2; comm.allGatherV(total_pairs, nb_pairs); /// renumber clusters /// generate fragment list std::vector > global_clusters; UInt total_nb_cluster = 0; Array is_fragment_in_cluster(global_nb_fragment, 1, false); std::queue fragment_check_list; while (total_pairs.getSize() != 0) { /// create a new cluster ++total_nb_cluster; global_clusters.resize(total_nb_cluster); std::set & current_cluster = global_clusters[total_nb_cluster - 1]; UInt first_fragment = total_pairs(0, 0); UInt second_fragment = total_pairs(0, 1); total_pairs.erase(0); fragment_check_list.push(first_fragment); fragment_check_list.push(second_fragment); while (!fragment_check_list.empty()) { UInt current_fragment = fragment_check_list.front(); UInt * total_pairs_end = total_pairs.storage() + total_pairs.getSize() * 2; UInt * fragment_found = std::find(total_pairs.storage(), total_pairs_end, current_fragment); if (fragment_found != total_pairs_end) { UInt position = fragment_found - total_pairs.storage(); UInt pair = position / 2; UInt other_index = (position + 1) % 2; fragment_check_list.push(total_pairs(pair, other_index)); total_pairs.erase(pair); } else { fragment_check_list.pop(); current_cluster.insert(current_fragment); is_fragment_in_cluster(current_fragment) = true; } } } /// add to FragmentToCluster all local fragments for (UInt c = 0; c < global_nb_fragment; ++c) { if (!is_fragment_in_cluster(c)) { ++total_nb_cluster; global_clusters.resize(total_nb_cluster); std::set & current_cluster = global_clusters[total_nb_cluster - 1]; current_cluster.insert(c); } } /// reorganize element groups to match global clusters for (UInt c = 0; c < global_clusters.size(); ++c) { /// create new element group corresponding to current cluster std::stringstream sstr; sstr << cluster_name_prefix << "_" << c; ElementGroup & cluster = group_manager.createElementGroup(sstr.str(), element_dimension, true); std::set::iterator it = global_clusters[c].begin(); std::set::iterator end = global_clusters[c].end(); /// append to current element group all fragments that belong to /// the same cluster if they exist for (; it != end; ++it) { Int local_index = *it - starting_index; if (local_index < 0 || local_index >= Int(nb_cluster)) continue; std::stringstream tmp_sstr; tmp_sstr << "tmp_" << cluster_name_prefix << "_" << local_index; GroupManager::element_group_iterator eg_it = group_manager.element_group_find(tmp_sstr.str()); AKANTU_DEBUG_ASSERT(eg_it != group_manager.element_group_end(), "Temporary fragment \"" << tmp_sstr.str() << "\" not found"); cluster.append(*(eg_it->second)); group_manager.destroyElementGroup(tmp_sstr.str(), true); } } return total_nb_cluster; } private: /// functions for parallel communications inline UInt getNbData(const Array & elements, const SynchronizationTag & tag) const { if (tag == _gst_gm_clusters) return elements.getSize() * sizeof(UInt); return 0; } inline void packData(CommunicationBuffer & buffer, const Array & elements, const SynchronizationTag & tag) const { if (tag != _gst_gm_clusters) return; Array::const_iterator<> el_it = elements.begin(); Array::const_iterator<> el_end = elements.end(); for (; el_it != el_end; ++el_it) { const Element & el = *el_it; /// for each element pack its global cluster index buffer << element_to_fragment(el.type, el.ghost_type)(el.element) + starting_index; } } inline void unpackData(CommunicationBuffer & buffer, const Array & elements, const SynchronizationTag & tag) { if (tag != _gst_gm_clusters) return; Array::const_iterator<> el_it = elements.begin(); Array::const_iterator<> el_end = elements.end(); for (; el_it != el_end; ++el_it) { UInt distant_cluster; buffer >> distant_cluster; const Element & el = *el_it; UInt local_cluster = element_to_fragment(el.type, el.ghost_type)(el.element) + starting_index; distant_ids.insert(std::make_pair(local_cluster, distant_cluster)); } } private: GroupManager & group_manager; UInt element_dimension; std::string cluster_name_prefix; ElementTypeMapArray & element_to_fragment; ElementSynchronizer & element_synchronizer; UInt nb_cluster; DistantIDs distant_ids; UInt starting_index; }; /* -------------------------------------------------------------------------- */ /// \todo this function doesn't work in 1D UInt GroupManager::createBoundaryGroupFromGeometry() { UInt spatial_dimension = mesh.getSpatialDimension(); return createClusters(spatial_dimension - 1, "boundary"); } /* -------------------------------------------------------------------------- */ //// \todo if needed element list construction can be optimized by //// templating the filter class UInt GroupManager::createClusters( UInt element_dimension, std::string cluster_name_prefix, const GroupManager::ClusteringFilter & filter, ElementSynchronizer * element_synchronizer, Mesh * mesh_facets) { AKANTU_DEBUG_IN(); UInt nb_proc = StaticCommunicator::getStaticCommunicator().getNbProc(); std::string tmp_cluster_name_prefix = cluster_name_prefix; ElementTypeMapArray * element_to_fragment = NULL; if (nb_proc > 1 && element_synchronizer) { element_to_fragment = new ElementTypeMapArray("element_to_fragment", id, memory_id); mesh.initElementTypeMapArray(*element_to_fragment, 1, element_dimension, false, _ek_not_defined, true); tmp_cluster_name_prefix = "tmp_" + tmp_cluster_name_prefix; } /// Get facets bool mesh_facets_created = false; if (!mesh_facets && element_dimension > 0) { mesh_facets = new Mesh(mesh.getSpatialDimension(), mesh.getNodes().getID(), "mesh_facets_for_clusters"); mesh_facets->defineMeshParent(mesh); MeshUtils::buildAllFacets(mesh, *mesh_facets, element_dimension, - element_dimension - 1, element_synchronizer); + element_dimension - 1); } ElementTypeMapArray seen_elements("seen_elements", id, memory_id); mesh.initElementTypeMapArray(seen_elements, 1, element_dimension, false, _ek_not_defined, true); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; Element el; el.ghost_type = ghost_type; Mesh::type_iterator type_it = mesh.firstType(element_dimension, ghost_type, _ek_not_defined); Mesh::type_iterator type_end = mesh.lastType(element_dimension, ghost_type, _ek_not_defined); for (; type_it != type_end; ++type_it) { el.type = *type_it; el.kind = Mesh::getKind(*type_it); UInt nb_element = mesh.getNbElement(*type_it, ghost_type); Array & seen_elements_array = seen_elements(el.type, ghost_type); for (UInt e = 0; e < nb_element; ++e) { el.element = e; if (!filter(el)) seen_elements_array(e) = true; } } } Array checked_node(mesh.getNbNodes(), 1, false); UInt nb_cluster = 0; /// keep looping until all elements are seen for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; Element uns_el; uns_el.ghost_type = ghost_type; Mesh::type_iterator type_it = mesh.firstType(element_dimension, ghost_type, _ek_not_defined); Mesh::type_iterator type_end = mesh.lastType(element_dimension, ghost_type, _ek_not_defined); for (; type_it != type_end; ++type_it) { uns_el.type = *type_it; Array & seen_elements_vec = seen_elements(uns_el.type, uns_el.ghost_type); for (UInt e = 0; e < seen_elements_vec.getSize(); ++e) { // skip elements that have been already seen if (seen_elements_vec(e) == true) continue; // set current element uns_el.element = e; seen_elements_vec(e) = true; /// create a new cluster std::stringstream sstr; sstr << tmp_cluster_name_prefix << "_" << nb_cluster; ElementGroup & cluster = createElementGroup(sstr.str(), element_dimension, true); ++nb_cluster; // point element are cluster by themself if (element_dimension == 0) { cluster.add(uns_el); UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(uns_el.type); Vector connect = mesh.getConnectivity(uns_el.type, uns_el.ghost_type) .begin(nb_nodes_per_element)[uns_el.element]; for (UInt n = 0; n < nb_nodes_per_element; ++n) { /// add element's nodes to the cluster UInt node = connect[n]; if (!checked_node(node)) { cluster.addNode(node); checked_node(node) = true; } } continue; } std::queue element_to_add; element_to_add.push(uns_el); /// keep looping until current cluster is complete (no more /// connected elements) while (!element_to_add.empty()) { /// take first element and erase it in the queue Element el = element_to_add.front(); element_to_add.pop(); /// if parallel, store cluster index per element if (nb_proc > 1 && element_synchronizer) (*element_to_fragment)(el.type, el.ghost_type)(el.element) = nb_cluster - 1; /// add current element to the cluster cluster.add(el); const Array & element_to_facet = mesh_facets->getSubelementToElement(el.type, el.ghost_type); UInt nb_facet_per_element = element_to_facet.getNbComponent(); for (UInt f = 0; f < nb_facet_per_element; ++f) { const Element & facet = element_to_facet(el.element, f); if (facet == ElementNull) continue; const std::vector & connected_elements = mesh_facets->getElementToSubelement( facet.type, facet.ghost_type)(facet.element); for (UInt elem = 0; elem < connected_elements.size(); ++elem) { const Element & check_el = connected_elements[elem]; // check if this element has to be skipped if (check_el == ElementNull || check_el == el) continue; Array & seen_elements_vec_current = seen_elements(check_el.type, check_el.ghost_type); if (seen_elements_vec_current(check_el.element) == false) { seen_elements_vec_current(check_el.element) = true; element_to_add.push(check_el); } } } UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(el.type); Vector connect = mesh.getConnectivity(el.type, el.ghost_type) .begin(nb_nodes_per_element)[el.element]; for (UInt n = 0; n < nb_nodes_per_element; ++n) { /// add element's nodes to the cluster UInt node = connect[n]; if (!checked_node(node)) { cluster.addNode(node, false); checked_node(node) = true; } } } } } } if (nb_proc > 1 && element_synchronizer) { ClusterSynchronizer cluster_synchronizer( *this, element_dimension, cluster_name_prefix, *element_to_fragment, *element_synchronizer, nb_cluster); nb_cluster = cluster_synchronizer.synchronize(); delete element_to_fragment; } if (mesh_facets_created) delete mesh_facets; if (mesh.isDistributed()) this->synchronizeGroupNames(); AKANTU_DEBUG_OUT(); return nb_cluster; } /* -------------------------------------------------------------------------- */ template void GroupManager::createGroupsFromMeshData(const std::string & dataset_name) { std::set group_names; const ElementTypeMapArray & datas = mesh.getData(dataset_name); typedef typename ElementTypeMapArray::type_iterator type_iterator; std::map group_dim; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { type_iterator type_it = datas.firstType(_all_dimensions, *gt); type_iterator type_end = datas.lastType(_all_dimensions, *gt); for (; type_it != type_end; ++type_it) { const Array & dataset = datas(*type_it, *gt); UInt nb_element = mesh.getNbElement(*type_it, *gt); AKANTU_DEBUG_ASSERT(dataset.getSize() == nb_element, "Not the same number of elements (" << *type_it << ":" << *gt << ") in the map from MeshData (" << dataset.getSize() << ") " << dataset_name << " and in the mesh (" << nb_element << ")!"); for (UInt e(0); e < nb_element; ++e) { std::stringstream sstr; sstr << dataset(e); std::string gname = sstr.str(); group_names.insert(gname); std::map::iterator it = group_dim.find(gname); if (it == group_dim.end()) { group_dim[gname] = mesh.getSpatialDimension(*type_it); } else { it->second = std::max(it->second, mesh.getSpatialDimension(*type_it)); } } } } std::set::iterator git = group_names.begin(); std::set::iterator gend = group_names.end(); for (; git != gend; ++git) createElementGroup(*git, group_dim[*git]); if (mesh.isDistributed()) this->synchronizeGroupNames(); Element el; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { el.ghost_type = *gt; type_iterator type_it = datas.firstType(_all_dimensions, *gt); type_iterator type_end = datas.lastType(_all_dimensions, *gt); for (; type_it != type_end; ++type_it) { el.type = *type_it; const Array & dataset = datas(*type_it, *gt); UInt nb_element = mesh.getNbElement(*type_it, *gt); AKANTU_DEBUG_ASSERT(dataset.getSize() == nb_element, "Not the same number of elements in the map from " "MeshData and in the mesh!"); UInt nb_nodes_per_element = mesh.getNbNodesPerElement(el.type); Array::const_iterator > cit = mesh.getConnectivity(*type_it, *gt).begin(nb_nodes_per_element); for (UInt e(0); e < nb_element; ++e, ++cit) { el.element = e; std::stringstream sstr; sstr << dataset(e); ElementGroup & group = getElementGroup(sstr.str()); group.add(el, false, false); const Vector & connect = *cit; for (UInt n = 0; n < nb_nodes_per_element; ++n) { UInt node = connect[n]; group.addNode(node, false); } } } } git = group_names.begin(); for (; git != gend; ++git) { getElementGroup(*git).optimize(); } } template void GroupManager::createGroupsFromMeshData( const std::string & dataset_name); template void GroupManager::createGroupsFromMeshData(const std::string & dataset_name); /* -------------------------------------------------------------------------- */ void GroupManager::createElementGroupFromNodeGroup( const std::string & name, const std::string & node_group_name, UInt dimension) { NodeGroup & node_group = getNodeGroup(node_group_name); ElementGroup & group = createElementGroup(name, dimension, node_group); group.fillFromNodeGroup(); } /* -------------------------------------------------------------------------- */ void GroupManager::printself(std::ostream & stream, int indent) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << space << "GroupManager [" << std::endl; std::set node_group_seen; for (const_element_group_iterator it(element_group_begin()); it != element_group_end(); ++it) { it->second->printself(stream, indent + 1); node_group_seen.insert(it->second->getNodeGroup().getName()); } for (const_node_group_iterator it(node_group_begin()); it != node_group_end(); ++it) { if (node_group_seen.find(it->second->getName()) == node_group_seen.end()) it->second->printself(stream, indent + 1); } stream << space << "]" << std::endl; } /* -------------------------------------------------------------------------- */ UInt GroupManager::getNbElementGroups(UInt dimension) const { if (dimension == _all_dimensions) return element_groups.size(); ElementGroups::const_iterator it = element_groups.begin(); ElementGroups::const_iterator end = element_groups.end(); UInt count = 0; for (; it != end; ++it) count += (it->second->getDimension() == dimension); return count; } /* -------------------------------------------------------------------------- */ void GroupManager::checkAndAddGroups(CommunicationBuffer & buffer) { AKANTU_DEBUG_IN(); UInt nb_node_group; buffer >> nb_node_group; AKANTU_DEBUG_INFO("Received " << nb_node_group << " node group names"); for (UInt ng = 0; ng < nb_node_group; ++ng) { std::string node_group_name; buffer >> node_group_name; if (node_groups.find(node_group_name) == node_groups.end()) { this->createNodeGroup(node_group_name); } AKANTU_DEBUG_INFO("Received node goup name: " << node_group_name); } UInt nb_element_group; buffer >> nb_element_group; AKANTU_DEBUG_INFO("Received " << nb_element_group << " element group names"); for (UInt eg = 0; eg < nb_element_group; ++eg) { std::string element_group_name; buffer >> element_group_name; std::string node_group_name; buffer >> node_group_name; UInt dim; buffer >> dim; AKANTU_DEBUG_INFO("Received element group name: " << element_group_name << " corresponding to a " << Int(dim) << "D group with node group " << node_group_name); NodeGroup & node_group = *node_groups[node_group_name]; if (element_groups.find(element_group_name) == element_groups.end()) { this->createElementGroup(element_group_name, dim, node_group); } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void GroupManager::fillBufferWithGroupNames( DynamicCommunicationBuffer & comm_buffer) const { AKANTU_DEBUG_IN(); // packing node group names; UInt nb_groups = this->node_groups.size(); comm_buffer << nb_groups; AKANTU_DEBUG_INFO("Sending " << nb_groups << " node group names"); NodeGroups::const_iterator nnames_it = node_groups.begin(); NodeGroups::const_iterator nnames_end = node_groups.end(); for (; nnames_it != nnames_end; ++nnames_it) { std::string node_group_name = nnames_it->first; comm_buffer << node_group_name; AKANTU_DEBUG_INFO("Sending node goupe name: " << node_group_name); } // packing element group names with there associated node group name nb_groups = this->element_groups.size(); comm_buffer << nb_groups; AKANTU_DEBUG_INFO("Sending " << nb_groups << " element group names"); ElementGroups::const_iterator gnames_it = this->element_groups.begin(); ElementGroups::const_iterator gnames_end = this->element_groups.end(); for (; gnames_it != gnames_end; ++gnames_it) { ElementGroup & element_group = *(gnames_it->second); std::string element_group_name = gnames_it->first; std::string node_group_name = element_group.getNodeGroup().getName(); UInt dim = element_group.getDimension(); comm_buffer << element_group_name; comm_buffer << node_group_name; comm_buffer << dim; AKANTU_DEBUG_INFO("Sending element group name: " << element_group_name << " corresponding to a " << Int(dim) << "D group with the node group " << node_group_name); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void GroupManager::synchronizeGroupNames() { AKANTU_DEBUG_IN(); StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Int nb_proc = comm.getNbProc(); Int my_rank = comm.whoAmI(); if (nb_proc == 1) return; if (my_rank == 0) { for (Int p = 1; p < nb_proc; ++p) { CommunicationStatus status; comm.probe(p, p, status); AKANTU_DEBUG_INFO("Got " << printMemorySize(status.getSize()) << " from proc " << p); CommunicationBuffer recv_buffer(status.getSize()); comm.receive(recv_buffer, p, p); this->checkAndAddGroups(recv_buffer); } DynamicCommunicationBuffer comm_buffer; this->fillBufferWithGroupNames(comm_buffer); UInt buffer_size = comm_buffer.getSize(); comm.broadcast(buffer_size, 0); AKANTU_DEBUG_INFO("Initiating broadcast with " << printMemorySize(comm_buffer.getSize())); comm.broadcast(comm_buffer, 0); } else { DynamicCommunicationBuffer comm_buffer; this->fillBufferWithGroupNames(comm_buffer); AKANTU_DEBUG_INFO("Sending " << printMemorySize(comm_buffer.getSize()) << " to proc " << 0); comm.send(comm_buffer, 0, my_rank); UInt buffer_size = 0; comm.broadcast(buffer_size, 0); AKANTU_DEBUG_INFO("Receiving broadcast with " << printMemorySize(comm_buffer.getSize())); CommunicationBuffer recv_buffer(buffer_size); comm.broadcast(recv_buffer, 0); this->checkAndAddGroups(recv_buffer); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ const ElementGroup & GroupManager::getElementGroup(const std::string & name) const { const_element_group_iterator it = element_group_find(name); if (it == element_group_end()) { AKANTU_EXCEPTION("There are no element groups named " << name << " associated to the group manager: " << id); } return *(it->second); } /* -------------------------------------------------------------------------- */ ElementGroup & GroupManager::getElementGroup(const std::string & name) { element_group_iterator it = element_group_find(name); if (it == element_group_end()) { AKANTU_EXCEPTION("There are no element groups named " << name << " associated to the group manager: " << id); } return *(it->second); } /* -------------------------------------------------------------------------- */ const NodeGroup & GroupManager::getNodeGroup(const std::string & name) const { const_node_group_iterator it = node_group_find(name); if (it == node_group_end()) { AKANTU_EXCEPTION("There are no node groups named " << name << " associated to the group manager: " << id); } return *(it->second); } /* -------------------------------------------------------------------------- */ NodeGroup & GroupManager::getNodeGroup(const std::string & name) { node_group_iterator it = node_group_find(name); if (it == node_group_end()) { AKANTU_EXCEPTION("There are no node groups named " << name << " associated to the group manager: " << id); } return *(it->second); } __END_AKANTU__ diff --git a/src/mesh/mesh.cc b/src/mesh/mesh.cc index a5c1a18fe..47834ef9a 100644 --- a/src/mesh/mesh.cc +++ b/src/mesh/mesh.cc @@ -1,482 +1,483 @@ /** * @file mesh.cc * * @author Guillaume Anciaux * @author David Simon Kammer * @author Nicolas Richart * @author Marco Vocialta * * @date creation: Fri Jun 18 2010 * @date last modification: Fri Jan 22 2016 * * @brief class handling meshes * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include #include "aka_config.hh" /* -------------------------------------------------------------------------- */ #include "element_class.hh" #include "group_manager_inline_impl.cc" #include "mesh.hh" #include "mesh_io.hh" /* -------------------------------------------------------------------------- */ #include "element_synchronizer.hh" #include "mesh_utils_distribution.hh" #include "node_synchronizer.hh" #include "static_communicator.hh" /* -------------------------------------------------------------------------- */ #ifdef AKANTU_USE_IOHELPER #include "dumper_field.hh" #include "dumper_internal_material_field.hh" #endif /* -------------------------------------------------------------------------- */ namespace akantu { const Element ElementNull(_not_defined, 0); /* -------------------------------------------------------------------------- */ void Element::printself(std::ostream & stream, int indent) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << space << "Element [" << type << ", " << element << ", " << ghost_type << "]"; } /* -------------------------------------------------------------------------- */ Mesh::Mesh(UInt spatial_dimension, const ID & id, const MemoryID & memory_id, StaticCommunicator & communicator) : Memory(id, memory_id), GroupManager(*this, id + ":group_manager", memory_id), nodes(NULL), nodes_global_ids(nullptr), nodes_type(0, 1, id + ":nodes_type"), nb_global_nodes(0), created_nodes(true), connectivities("connectivities", id, memory_id), normals("normals", id, memory_id), spatial_dimension(spatial_dimension), types_offsets(Array((UInt)_max_element_type + 1, 1)), ghost_types_offsets(Array((UInt)_max_element_type + 1, 1)), lower_bounds(spatial_dimension, 0.), upper_bounds(spatial_dimension, 0.), size(spatial_dimension, 0.), local_lower_bounds(spatial_dimension, 0.), local_upper_bounds(spatial_dimension, 0.), mesh_data("mesh_data", id, memory_id), mesh_facets(nullptr), mesh_parent(nullptr), is_mesh_facets(false), is_distributed(false), communicator(&communicator), element_synchronizer(nullptr), node_synchronizer(nullptr) { AKANTU_DEBUG_IN(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ Mesh::Mesh(UInt spatial_dimension, StaticCommunicator & communicator, const ID & id, const MemoryID & memory_id) : Mesh(spatial_dimension, id, memory_id, communicator) { AKANTU_DEBUG_IN(); this->nodes = &(alloc(id + ":coordinates", memory_id, spatial_dimension)); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ Mesh::Mesh(UInt spatial_dimension, const ID & id, const MemoryID & memory_id) : Mesh(spatial_dimension, StaticCommunicator::getStaticCommunicator(), id, memory_id) {} /* -------------------------------------------------------------------------- */ Mesh::Mesh(UInt spatial_dimension, const ID & nodes_id, const ID & id, const MemoryID & memory_id) : Mesh(spatial_dimension, id, memory_id, StaticCommunicator::getStaticCommunicator()) { this->nodes = &(this->getArray(nodes_id)); this->nb_global_nodes = this->nodes->getSize(); this->computeBoundingBox(); } /* -------------------------------------------------------------------------- */ Mesh::Mesh(UInt spatial_dimension, Array & nodes, const ID & id, const MemoryID & memory_id) : Mesh(spatial_dimension, id, memory_id, StaticCommunicator::getStaticCommunicator()) { this->nodes = &nodes; this->nb_global_nodes = this->nodes->getSize(); this->computeBoundingBox(); } /* -------------------------------------------------------------------------- */ Mesh & Mesh::initMeshFacets(const ID & id) { AKANTU_DEBUG_IN(); if (!mesh_facets) { mesh_facets = new Mesh(spatial_dimension, *(this->nodes), getID() + ":" + id, getMemoryID()); mesh_facets->mesh_parent = this; mesh_facets->is_mesh_facets = true; } AKANTU_DEBUG_OUT(); return *mesh_facets; } /* -------------------------------------------------------------------------- */ void Mesh::defineMeshParent(const Mesh & mesh) { AKANTU_DEBUG_IN(); this->mesh_parent = &mesh; this->is_mesh_facets = true; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ Mesh::~Mesh() { AKANTU_DEBUG_IN(); delete mesh_facets; delete element_synchronizer; delete node_synchronizer; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void Mesh::read(const std::string & filename, const MeshIOType & mesh_io_type) { MeshIO mesh_io; mesh_io.read(filename, *this, mesh_io_type); type_iterator it = this->firstType(spatial_dimension, _not_ghost, _ek_not_defined); type_iterator last = this->lastType(spatial_dimension, _not_ghost, _ek_not_defined); if (it == last) AKANTU_EXCEPTION( "The mesh contained in the file " << filename << " does not seem to be of the good dimension." << " No element of dimension " << spatial_dimension << " where read."); } /* -------------------------------------------------------------------------- */ void Mesh::write(const std::string & filename, const MeshIOType & mesh_io_type) { MeshIO mesh_io; mesh_io.write(filename, *this, mesh_io_type); } /* -------------------------------------------------------------------------- */ void Mesh::printself(std::ostream & stream, int indent) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << space << "Mesh [" << std::endl; stream << space << " + id : " << getID() << std::endl; stream << space << " + spatial dimension : " << this->spatial_dimension << std::endl; stream << space << " + nodes [" << std::endl; nodes->printself(stream, indent + 2); stream << space << " + connectivities [" << std::endl; connectivities.printself(stream, indent + 2); stream << space << " ]" << std::endl; GroupManager::printself(stream, indent + 1); stream << space << "]" << std::endl; } /* -------------------------------------------------------------------------- */ void Mesh::computeBoundingBox() { AKANTU_DEBUG_IN(); for (UInt k = 0; k < spatial_dimension; ++k) { local_lower_bounds(k) = std::numeric_limits::max(); local_upper_bounds(k) = -std::numeric_limits::max(); } for (UInt i = 0; i < nodes->getSize(); ++i) { // if(!isPureGhostNode(i)) for (UInt k = 0; k < spatial_dimension; ++k) { local_lower_bounds(k) = std::min(local_lower_bounds[k], (*nodes)(i, k)); local_upper_bounds(k) = std::max(local_upper_bounds[k], (*nodes)(i, k)); } } if (this->is_distributed) { StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Matrix reduce_bounds(spatial_dimension, 2); for (UInt k = 0; k < spatial_dimension; ++k) { reduce_bounds(k, 0) = local_lower_bounds(k); reduce_bounds(k, 1) = -local_upper_bounds(k); } comm.allReduce(reduce_bounds, _so_min); for (UInt k = 0; k < spatial_dimension; ++k) { lower_bounds(k) = reduce_bounds(k, 0); upper_bounds(k) = -reduce_bounds(k, 1); } } else { this->lower_bounds = this->local_lower_bounds; this->upper_bounds = this->local_upper_bounds; } size = upper_bounds - lower_bounds; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void Mesh::initElementTypeMapArray(ElementTypeMapArray & vect, UInt nb_component, UInt dim, const bool & flag_nb_node_per_elem_multiply, ElementKind element_kind, bool size_to_nb_element) const { AKANTU_DEBUG_IN(); for (UInt g = _not_ghost; g <= _ghost; ++g) { GhostType gt = (GhostType)g; this->initElementTypeMapArray(vect, nb_component, dim, gt, flag_nb_node_per_elem_multiply, element_kind, size_to_nb_element); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void Mesh::initElementTypeMapArray(ElementTypeMapArray & vect, UInt nb_component, UInt dim, GhostType gt, const bool & flag_nb_node_per_elem_multiply, ElementKind element_kind, bool size_to_nb_element) const { AKANTU_DEBUG_IN(); this->initElementTypeMapArray(vect, nb_component, dim, gt, T(), flag_nb_node_per_elem_multiply, element_kind, size_to_nb_element); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void Mesh::initElementTypeMapArray(ElementTypeMapArray & vect, UInt nb_component, UInt dim, GhostType gt, const T & default_value, const bool & flag_nb_node_per_elem_multiply, ElementKind element_kind, bool size_to_nb_element) const { AKANTU_DEBUG_IN(); for (auto type : elementTypes(dim, gt, element_kind)) { UInt nb_comp = nb_component; if (flag_nb_node_per_elem_multiply) nb_comp *= Mesh::getNbNodesPerElement(type); UInt size = 0; if (size_to_nb_element) size = this->getNbElement(type, gt); vect.alloc(size, nb_comp, type, gt, default_value); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void Mesh::initNormals() { this->initElementTypeMapArray(normals, spatial_dimension, spatial_dimension, false, _ek_not_defined); } /* -------------------------------------------------------------------------- */ void Mesh::getGlobalConnectivity( ElementTypeMapArray & global_connectivity, UInt dimension, GhostType ghost_type) { AKANTU_DEBUG_IN(); for (auto type : elementTypes(dimension, ghost_type)) { Array & local_conn = connectivities(type, ghost_type); Array & g_connectivity = global_connectivity(type, ghost_type); if (!nodes_global_ids) nodes_global_ids = mesh_parent->nodes_global_ids; UInt * local_c = local_conn.storage(); UInt * global_c = g_connectivity.storage(); UInt nb_terms = local_conn.getSize() * local_conn.getNbComponent(); for (UInt i = 0; i < nb_terms; ++i, ++local_c, ++global_c) *global_c = (*nodes_global_ids)(*local_c); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ DumperIOHelper & Mesh::getGroupDumper(const std::string & dumper_name, const std::string & group_name) { if (group_name == "all") return this->getDumper(dumper_name); else return element_groups[group_name]->getDumper(dumper_name); } /* -------------------------------------------------------------------------- */ #define AKANTU_INSTANTIATE_INIT(type) \ template void Mesh::initElementTypeMapArray( \ ElementTypeMapArray & vect, UInt nb_component, UInt dim, \ const bool & flag_nb_elem_multiply, ElementKind element_kind, \ bool size_to_nb_element) const; \ template void Mesh::initElementTypeMapArray( \ ElementTypeMapArray & vect, UInt nb_component, UInt dim, \ GhostType gt, const bool & flag_nb_elem_multiply, \ ElementKind element_kind, bool size_to_nb_element) const; \ template void Mesh::initElementTypeMapArray( \ ElementTypeMapArray & vect, UInt nb_component, UInt dim, \ GhostType gt, const type & default_value, \ const bool & flag_nb_elem_multiply, ElementKind element_kind, \ bool size_to_nb_element) const AKANTU_INSTANTIATE_INIT(Real); AKANTU_INSTANTIATE_INIT(UInt); AKANTU_INSTANTIATE_INIT(Int); AKANTU_INSTANTIATE_INIT(bool); /* -------------------------------------------------------------------------- */ template ElementTypeMap Mesh::getNbDataPerElem(ElementTypeMapArray & arrays, const ElementKind & element_kind) { ElementTypeMap nb_data_per_elem; for (auto type : elementTypes(spatial_dimension, _not_ghost, element_kind)) { UInt nb_elements = this->getNbElement(type); auto & array = arrays(type); nb_data_per_elem(type) = array.getNbComponent() * array.getSize(); nb_data_per_elem(type) /= nb_elements; } return nb_data_per_elem; } /* -------------------------------------------------------------------------- */ template ElementTypeMap Mesh::getNbDataPerElem(ElementTypeMapArray & array, const ElementKind & element_kind); template ElementTypeMap Mesh::getNbDataPerElem(ElementTypeMapArray & array, const ElementKind & element_kind); /* -------------------------------------------------------------------------- */ #ifdef AKANTU_USE_IOHELPER template dumper::Field * Mesh::createFieldFromAttachedData(const std::string & field_id, const std::string & group_name, const ElementKind & element_kind) { dumper::Field * field = nullptr; ElementTypeMapArray * internal = nullptr; try { internal = &(this->getData(field_id)); } catch (...) { return nullptr; } ElementTypeMap nb_data_per_elem = this->getNbDataPerElem(*internal, element_kind); field = this->createElementalField( *internal, group_name, this->spatial_dimension, element_kind, nb_data_per_elem); return field; } template dumper::Field * Mesh::createFieldFromAttachedData(const std::string & field_id, const std::string & group_name, const ElementKind & element_kind); template dumper::Field * Mesh::createFieldFromAttachedData(const std::string & field_id, const std::string & group_name, const ElementKind & element_kind); #endif /* -------------------------------------------------------------------------- */ void Mesh::distribute() { this->distribute(StaticCommunicator::getStaticCommunicator()); } /* -------------------------------------------------------------------------- */ void Mesh::distribute(StaticCommunicator & communicator) { AKANTU_DEBUG_ASSERT(is_distributed == false, "This mesh is already distribute"); this->communicator = &communicator; this->element_synchronizer = new ElementSynchronizer(*this, this->getID() + ":element_synchronizer", this->getMemoryID(), true, communicator); this->node_synchronizer = new NodeSynchronizer(*this, this->getID() + ":node_synchronizer", this->getMemoryID(), true, communicator); Int psize = this->communicator->getNbProc(); #ifdef AKANTU_USE_SCOTCH Int prank = this->communicator->whoAmI(); if (prank == 0) { MeshPartitionScotch partition(*this, spatial_dimension); partition.partitionate(psize); MeshUtilsDistribution::distributeMeshCentralized(*this, 0, partition); } else { MeshUtilsDistribution::distributeMeshCentralized(*this, 0); } #else if(!(psize == 1)) { AKANTU_DEBUG_ERROR( "Cannot distribute a mesh without a partitioning tool"); } #endif this->is_distributed = true; + this->element_synchronizer->buildPrankToElement(); this->computeBoundingBox(); } /* -------------------------------------------------------------------------- */ } // akantu diff --git a/src/mesh/mesh_inline_impl.cc b/src/mesh/mesh_inline_impl.cc index f0eb2cc34..506027a8e 100644 --- a/src/mesh/mesh_inline_impl.cc +++ b/src/mesh/mesh_inline_impl.cc @@ -1,629 +1,630 @@ /** * @file mesh_inline_impl.cc * * @author Guillaume Anciaux * @author Dana Christen * @author Nicolas Richart * @author Marco Vocialta * * @date creation: Thu Jul 15 2010 * @date last modification: Thu Jan 21 2016 * * @brief Implementation of the inline functions of the mesh class * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #if defined(AKANTU_COHESIVE_ELEMENT) #include "cohesive_element.hh" #endif #ifndef __AKANTU_MESH_INLINE_IMPL_CC__ #define __AKANTU_MESH_INLINE_IMPL_CC__ __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ inline RemovedNodesEvent::RemovedNodesEvent(const Mesh & mesh) : new_numbering(mesh.getNbNodes(), 1, "new_numbering") {} /* -------------------------------------------------------------------------- */ inline RemovedElementsEvent::RemovedElementsEvent(const Mesh & mesh, ID new_numbering_id) : new_numbering(new_numbering_id, mesh.getID(), mesh.getMemoryID()) {} /* -------------------------------------------------------------------------- */ template <> inline void Mesh::sendEvent(RemovedElementsEvent & event) { this->connectivities.onElementsRemoved(event.getNewNumbering()); EventHandlerManager::sendEvent(event); } /* -------------------------------------------------------------------------- */ template <> inline void Mesh::sendEvent(RemovedNodesEvent & event) { if (created_nodes) this->removeNodesFromArray(*nodes, event.getNewNumbering()); if (nodes_global_ids) this->removeNodesFromArray(*nodes_global_ids, event.getNewNumbering()); if (nodes_type.getSize() != 0) this->removeNodesFromArray(nodes_type, event.getNewNumbering()); EventHandlerManager::sendEvent(event); } /* -------------------------------------------------------------------------- */ template inline void Mesh::removeNodesFromArray(Array & vect, const Array & new_numbering) { Array tmp(vect.getSize(), vect.getNbComponent()); UInt nb_component = vect.getNbComponent(); UInt new_nb_nodes = 0; for (UInt i = 0; i < new_numbering.getSize(); ++i) { UInt new_i = new_numbering(i); if (new_i != UInt(-1)) { T * to_copy = vect.storage() + i * nb_component; std::uninitialized_copy(to_copy, to_copy + nb_component, tmp.storage() + new_i * nb_component); ++new_nb_nodes; } } tmp.resize(new_nb_nodes); vect.copy(tmp); } /* -------------------------------------------------------------------------- */ inline UInt Mesh::elementToLinearized(const Element & elem) const { AKANTU_DEBUG_ASSERT(elem.type < _max_element_type && elem.element < types_offsets.storage()[elem.type + 1], "The element " << elem << "does not exists in the mesh " << getID()); return types_offsets.storage()[elem.type] + elem.element; } /* -------------------------------------------------------------------------- */ inline Element Mesh::linearizedToElement(UInt linearized_element) const { UInt t; for (t = _not_defined; t != _max_element_type && linearized_element >= types_offsets(t); ++t) ; AKANTU_DEBUG_ASSERT(linearized_element < types_offsets(t), "The linearized element " << linearized_element << "does not exists in the mesh " << getID()); --t; ElementType type = ElementType(t); return Element(type, linearized_element - types_offsets.storage()[t], _not_ghost, getKind(type)); } /* -------------------------------------------------------------------------- */ inline void Mesh::updateTypesOffsets(const GhostType & ghost_type) { Array * types_offsets_ptr = &this->types_offsets; if (ghost_type == _ghost) types_offsets_ptr = &this->ghost_types_offsets; Array & types_offsets = *types_offsets_ptr; types_offsets.clear(); for (auto type : elementTypes(_all_dimensions, ghost_type, _ek_not_defined)) types_offsets(type) = connectivities(type, ghost_type).getSize(); for (UInt t = _not_defined + 1; t < _max_element_type; ++t) types_offsets(t) += types_offsets(t - 1); for (UInt t = _max_element_type; t > _not_defined; --t) types_offsets(t) = types_offsets(t - 1); types_offsets(0) = 0; } /* -------------------------------------------------------------------------- */ inline const Mesh::ConnectivityTypeList & Mesh::getConnectivityTypeList(const GhostType & ghost_type) const { if (ghost_type == _not_ghost) return type_set; else return ghost_type_set; } /* -------------------------------------------------------------------------- */ inline Array * Mesh::getNodesGlobalIdsPointer() { AKANTU_DEBUG_IN(); if (nodes_global_ids == NULL) { std::stringstream sstr; sstr << getID() << ":nodes_global_ids"; nodes_global_ids = &(alloc(sstr.str(), nodes->getSize(), 1)); for (UInt i = 0; i < nodes->getSize(); ++i) { (*nodes_global_ids)(i) = i; } } AKANTU_DEBUG_OUT(); return nodes_global_ids; } /* -------------------------------------------------------------------------- */ inline Array * Mesh::getNodesTypePointer() { AKANTU_DEBUG_IN(); if (nodes_type.getSize() == 0) { nodes_type.resize(nodes->getSize()); nodes_type.set(_nt_normal); } AKANTU_DEBUG_OUT(); return &nodes_type; } /* -------------------------------------------------------------------------- */ inline Array * Mesh::getConnectivityPointer(const ElementType & type, const GhostType & ghost_type) { AKANTU_DEBUG_IN(); Array * tmp; if (!connectivities.exists(type, ghost_type)) { UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(type); tmp = &(connectivities.alloc(0, nb_nodes_per_element, type, ghost_type)); AKANTU_DEBUG_INFO("The connectivity vector for the type " << type << " created"); if (ghost_type == _not_ghost) type_set.insert(type); else ghost_type_set.insert(type); updateTypesOffsets(ghost_type); } else { tmp = &connectivities(type, ghost_type); } AKANTU_DEBUG_OUT(); return tmp; } /* -------------------------------------------------------------------------- */ inline Array> * Mesh::getElementToSubelementPointer(const ElementType & type, const GhostType & ghost_type) { Array> * tmp = getDataPointer>( "element_to_subelement", type, ghost_type, 1, true); return tmp; } /* -------------------------------------------------------------------------- */ inline Array * Mesh::getSubelementToElementPointer(const ElementType & type, const GhostType & ghost_type) { Array * tmp = getDataPointer( "subelement_to_element", type, ghost_type, getNbFacetsPerElement(type), true, is_mesh_facets); return tmp; } /* -------------------------------------------------------------------------- */ inline const Array> & Mesh::getElementToSubelement(const ElementType & type, const GhostType & ghost_type) const { return getData>("element_to_subelement", type, ghost_type); } /* -------------------------------------------------------------------------- */ inline Array> & Mesh::getElementToSubelement(const ElementType & type, const GhostType & ghost_type) { return getData>("element_to_subelement", type, ghost_type); } /* -------------------------------------------------------------------------- */ inline const Array & Mesh::getSubelementToElement(const ElementType & type, const GhostType & ghost_type) const { return getData("subelement_to_element", type, ghost_type); } /* -------------------------------------------------------------------------- */ inline Array & Mesh::getSubelementToElement(const ElementType & type, const GhostType & ghost_type) { return getData("subelement_to_element", type, ghost_type); } /* -------------------------------------------------------------------------- */ template inline Array * Mesh::getDataPointer(const std::string & data_name, const ElementType & el_type, const GhostType & ghost_type, UInt nb_component, bool size_to_nb_element, bool resize_with_parent) { Array & tmp = mesh_data.getElementalDataArrayAlloc( data_name, el_type, ghost_type, nb_component); if (size_to_nb_element) { if (resize_with_parent) tmp.resize(mesh_parent->getNbElement(el_type, ghost_type)); else tmp.resize(this->getNbElement(el_type, ghost_type)); } else { tmp.resize(0); } return &tmp; } /* -------------------------------------------------------------------------- */ template inline const Array & Mesh::getData(const std::string & data_name, const ElementType & el_type, const GhostType & ghost_type) const { return mesh_data.getElementalDataArray(data_name, el_type, ghost_type); } /* -------------------------------------------------------------------------- */ template inline Array & Mesh::getData(const std::string & data_name, const ElementType & el_type, const GhostType & ghost_type) { return mesh_data.getElementalDataArray(data_name, el_type, ghost_type); } /* -------------------------------------------------------------------------- */ template inline const ElementTypeMapArray & Mesh::getData(const std::string & data_name) const { return mesh_data.getElementalData(data_name); } /* -------------------------------------------------------------------------- */ template inline ElementTypeMapArray & Mesh::getData(const std::string & data_name) { return mesh_data.getElementalData(data_name); } /* -------------------------------------------------------------------------- */ template inline ElementTypeMapArray & Mesh::registerData(const std::string & data_name) { this->mesh_data.registerElementalData(data_name); return this->getData(data_name); } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbElement(const ElementType & type, const GhostType & ghost_type) const { try { const Array & conn = connectivities(type, ghost_type); return conn.getSize(); } catch (...) { return 0; } } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbElement(const UInt spatial_dimension, const GhostType & ghost_type, const ElementKind & kind) const { AKANTU_DEBUG_ASSERT(spatial_dimension <= 3 || spatial_dimension == UInt(-1), "spatial_dimension is " << spatial_dimension << " and is greater than 3 !"); UInt nb_element = 0; for (auto type : elementTypes(spatial_dimension, ghost_type, kind)) nb_element += getNbElement(type, ghost_type); return nb_element; } /* -------------------------------------------------------------------------- */ inline void Mesh::getBarycenter(UInt element, const ElementType & type, Real * barycenter, GhostType ghost_type) const { UInt * conn_val = getConnectivity(type, ghost_type).storage(); UInt nb_nodes_per_element = getNbNodesPerElement(type); Real * local_coord = new Real[spatial_dimension * nb_nodes_per_element]; UInt offset = element * nb_nodes_per_element; for (UInt n = 0; n < nb_nodes_per_element; ++n) { memcpy(local_coord + n * spatial_dimension, nodes->storage() + conn_val[offset + n] * spatial_dimension, spatial_dimension * sizeof(Real)); } Math::barycenter(local_coord, nb_nodes_per_element, spatial_dimension, barycenter); delete[] local_coord; } /* -------------------------------------------------------------------------- */ inline void Mesh::getBarycenter(const Element & element, Vector & barycenter) const { getBarycenter(element.element, element.type, barycenter.storage(), element.ghost_type); } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbNodesPerElement(const ElementType & type) { UInt nb_nodes_per_element = 0; #define GET_NB_NODES_PER_ELEMENT(type) \ nb_nodes_per_element = ElementClass::getNbNodesPerElement() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_NB_NODES_PER_ELEMENT); #undef GET_NB_NODES_PER_ELEMENT return nb_nodes_per_element; } /* -------------------------------------------------------------------------- */ inline ElementType Mesh::getP1ElementType(const ElementType & type) { ElementType p1_type = _not_defined; #define GET_P1_TYPE(type) p1_type = ElementClass::getP1ElementType() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_P1_TYPE); #undef GET_P1_TYPE return p1_type; } /* -------------------------------------------------------------------------- */ inline ElementKind Mesh::getKind(const ElementType & type) { ElementKind kind = _ek_not_defined; #define GET_KIND(type) kind = ElementClass::getKind() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_KIND); #undef GET_KIND return kind; } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getSpatialDimension(const ElementType & type) { UInt spatial_dimension = 0; #define GET_SPATIAL_DIMENSION(type) \ spatial_dimension = ElementClass::getSpatialDimension() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_SPATIAL_DIMENSION); #undef GET_SPATIAL_DIMENSION return spatial_dimension; } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbFacetTypes(const ElementType & type, __attribute__((unused)) UInt t) { UInt nb = 0; #define GET_NB_FACET_TYPE(type) nb = ElementClass::getNbFacetTypes() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_NB_FACET_TYPE); #undef GET_NB_FACET_TYPE return nb; } /* -------------------------------------------------------------------------- */ inline ElementType Mesh::getFacetType(const ElementType & type, UInt t) { ElementType surface_type = _not_defined; #define GET_FACET_TYPE(type) surface_type = ElementClass::getFacetType(t) AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_FACET_TYPE); #undef GET_FACET_TYPE return surface_type; } /* -------------------------------------------------------------------------- */ inline VectorProxy Mesh::getAllFacetTypes(const ElementType & type) { #define GET_FACET_TYPE(type) \ UInt nb = ElementClass::getNbFacetTypes(); \ ElementType * elt_ptr = \ const_cast(ElementClass::getFacetTypeInternal()); \ return VectorProxy(elt_ptr, nb); AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_FACET_TYPE); #undef GET_FACET_TYPE } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbFacetsPerElement(const ElementType & type) { AKANTU_DEBUG_IN(); UInt n_facet = 0; #define GET_NB_FACET(type) n_facet = ElementClass::getNbFacetsPerElement() AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_NB_FACET); #undef GET_NB_FACET AKANTU_DEBUG_OUT(); return n_facet; } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbFacetsPerElement(const ElementType & type, UInt t) { AKANTU_DEBUG_IN(); UInt n_facet = 0; #define GET_NB_FACET(type) \ n_facet = ElementClass::getNbFacetsPerElement(t) AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_NB_FACET); #undef GET_NB_FACET AKANTU_DEBUG_OUT(); return n_facet; } /* -------------------------------------------------------------------------- */ inline MatrixProxy Mesh::getFacetLocalConnectivity(const ElementType & type, UInt t) { AKANTU_DEBUG_IN(); #define GET_FACET_CON(type) \ AKANTU_DEBUG_OUT(); \ return ElementClass::getFacetLocalConnectivityPerElement(t) AKANTU_BOOST_ALL_ELEMENT_SWITCH(GET_FACET_CON); #undef GET_FACET_CON AKANTU_DEBUG_OUT(); - return Matrix(); // This avoid a compilation warning but will certainly - // also cause a segfault if reached + return MatrixProxy( + nullptr, 0, 0); // This avoid a compilation warning but will certainly + // also cause a segfault if reached } /* -------------------------------------------------------------------------- */ inline Matrix Mesh::getFacetConnectivity(const Element & element, UInt t) const { AKANTU_DEBUG_IN(); Matrix local_facets(getFacetLocalConnectivity(element.type, t), false); Matrix facets(local_facets.rows(), local_facets.cols()); const Array & conn = connectivities(element.type, element.ghost_type); for (UInt f = 0; f < facets.rows(); ++f) { for (UInt n = 0; n < facets.cols(); ++n) { facets(f, n) = conn(element.element, local_facets(f, n)); } } AKANTU_DEBUG_OUT(); return facets; } /* -------------------------------------------------------------------------- */ template inline void Mesh::extractNodalValuesFromElement( const Array & nodal_values, T * local_coord, UInt * connectivity, UInt n_nodes, UInt nb_degree_of_freedom) const { for (UInt n = 0; n < n_nodes; ++n) { memcpy(local_coord + n * nb_degree_of_freedom, nodal_values.storage() + connectivity[n] * nb_degree_of_freedom, nb_degree_of_freedom * sizeof(T)); } } /* -------------------------------------------------------------------------- */ inline void Mesh::addConnectivityType(const ElementType & type, const GhostType & ghost_type) { getConnectivityPointer(type, ghost_type); } /* -------------------------------------------------------------------------- */ inline bool Mesh::isPureGhostNode(UInt n) const { return nodes_type.getSize() ? (nodes_type(n) == _nt_pure_gost) : false; } /* -------------------------------------------------------------------------- */ inline bool Mesh::isLocalOrMasterNode(UInt n) const { return nodes_type.getSize() ? (nodes_type(n) == _nt_master) || (nodes_type(n) == _nt_normal) : true; } /* -------------------------------------------------------------------------- */ inline bool Mesh::isLocalNode(UInt n) const { return nodes_type.getSize() ? nodes_type(n) == _nt_normal : true; } /* -------------------------------------------------------------------------- */ inline bool Mesh::isMasterNode(UInt n) const { return nodes_type.getSize() ? nodes_type(n) == _nt_master : false; } /* -------------------------------------------------------------------------- */ inline bool Mesh::isSlaveNode(UInt n) const { return nodes_type.getSize() ? nodes_type(n) >= 0 : false; } /* -------------------------------------------------------------------------- */ inline NodeType Mesh::getNodeType(UInt local_id) const { return nodes_type.getSize() ? nodes_type(local_id) : _nt_normal; } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNodeGlobalId(UInt local_id) const { return nodes_global_ids ? (*nodes_global_ids)(local_id) : local_id; } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNodeLocalId(UInt global_id) const { AKANTU_DEBUG_ASSERT(nodes_global_ids != NULL, "The global ids are note set."); return nodes_global_ids->find(global_id); } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbGlobalNodes() const { return nodes_global_ids ? nb_global_nodes : nodes->getSize(); } /* -------------------------------------------------------------------------- */ inline UInt Mesh::getNbNodesPerElementList(const Array & elements) { UInt nb_nodes_per_element = 0; UInt nb_nodes = 0; ElementType current_element_type = _not_defined; Array::const_iterator el_it = elements.begin(); Array::const_iterator el_end = elements.end(); for (; el_it != el_end; ++el_it) { const Element & el = *el_it; if (el.type != current_element_type) { current_element_type = el.type; nb_nodes_per_element = Mesh::getNbNodesPerElement(current_element_type); } nb_nodes += nb_nodes_per_element; } return nb_nodes; } /* -------------------------------------------------------------------------- */ inline Mesh & Mesh::getMeshFacets() { if (!this->mesh_facets) AKANTU_EXCEPTION( "No facet mesh is defined yet! check the buildFacets functions"); return *this->mesh_facets; } /* -------------------------------------------------------------------------- */ inline const Mesh & Mesh::getMeshFacets() const { if (!this->mesh_facets) AKANTU_EXCEPTION( "No facet mesh is defined yet! check the buildFacets functions"); return *this->mesh_facets; } /* -------------------------------------------------------------------------- */ inline const Mesh & Mesh::getMeshParent() const { if (!this->mesh_parent) AKANTU_EXCEPTION( "No parent mesh is defined! This is only valid in a mesh_facets"); return *this->mesh_parent; } /* -------------------------------------------------------------------------- */ __END_AKANTU__ #endif /* __AKANTU_MESH_INLINE_IMPL_CC__ */ diff --git a/src/mesh_utils/mesh_utils.cc b/src/mesh_utils/mesh_utils.cc index db5f51d85..ff5862672 100644 --- a/src/mesh_utils/mesh_utils.cc +++ b/src/mesh_utils/mesh_utils.cc @@ -1,2372 +1,2369 @@ /** * @file mesh_utils.cc * * @author Guillaume Anciaux * @author Dana Christen * @author David Simon Kammer * @author Nicolas Richart * @author Leonardo Snozzi * @author Marco Vocialta * * @date creation: Fri Aug 20 2010 * @date last modification: Fri Jan 22 2016 * * @brief All mesh utils necessary for various tasks * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "mesh_utils.hh" #include "element_synchronizer.hh" #include "fe_engine.hh" #include "mesh_accessor.hh" /* -------------------------------------------------------------------------- */ #include #include #include #include /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ void MeshUtils::buildNode2Elements(const Mesh & mesh, CSR & node_to_elem, UInt spatial_dimension) { AKANTU_DEBUG_IN(); if (spatial_dimension == _all_dimensions) spatial_dimension = mesh.getSpatialDimension(); /// count number of occurrence of each node UInt nb_nodes = mesh.getNbNodes(); /// array for the node-element list node_to_elem.resizeRows(nb_nodes); node_to_elem.clearRows(); AKANTU_DEBUG_ASSERT( mesh.firstType(spatial_dimension) != mesh.lastType(spatial_dimension), "Some elements must be found in right dimension to compute facets!"); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { Mesh::type_iterator first = mesh.firstType(spatial_dimension, *gt, _ek_not_defined); Mesh::type_iterator last = mesh.lastType(spatial_dimension, *gt, _ek_not_defined); for (; first != last; ++first) { ElementType type = *first; UInt nb_element = mesh.getNbElement(type, *gt); Array::const_iterator> conn_it = mesh.getConnectivity(type, *gt).begin( Mesh::getNbNodesPerElement(type)); for (UInt el = 0; el < nb_element; ++el, ++conn_it) for (UInt n = 0; n < conn_it->size(); ++n) ++node_to_elem.rowOffset((*conn_it)(n)); } } node_to_elem.countToCSR(); node_to_elem.resizeCols(); /// rearrange element to get the node-element list Element e; node_to_elem.beginInsertions(); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { Mesh::type_iterator first = mesh.firstType(spatial_dimension, *gt, _ek_not_defined); Mesh::type_iterator last = mesh.lastType(spatial_dimension, *gt, _ek_not_defined); e.ghost_type = *gt; for (; first != last; ++first) { ElementType type = *first; e.type = type; e.kind = Mesh::getKind(type); UInt nb_element = mesh.getNbElement(type, *gt); Array::const_iterator> conn_it = mesh.getConnectivity(type, *gt).begin( Mesh::getNbNodesPerElement(type)); for (UInt el = 0; el < nb_element; ++el, ++conn_it) { e.element = el; for (UInt n = 0; n < conn_it->size(); ++n) node_to_elem.insertInRow((*conn_it)(n), e); } } } node_to_elem.endInsertions(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ /** * This function should disappear in the future (used in mesh partitioning) */ void MeshUtils::buildNode2Elements(const Mesh & mesh, CSR & node_to_elem, UInt spatial_dimension) { AKANTU_DEBUG_IN(); if (spatial_dimension == _all_dimensions) spatial_dimension = mesh.getSpatialDimension(); UInt nb_nodes = mesh.getNbNodes(); const Mesh::ConnectivityTypeList & type_list = mesh.getConnectivityTypeList(); Mesh::ConnectivityTypeList::const_iterator it; UInt nb_types = type_list.size(); UInt nb_good_types = 0; Vector nb_nodes_per_element(nb_types); UInt ** conn_val = new UInt *[nb_types]; Vector nb_element(nb_types); for (it = type_list.begin(); it != type_list.end(); ++it) { ElementType type = *it; if (Mesh::getSpatialDimension(type) != spatial_dimension) continue; nb_nodes_per_element[nb_good_types] = Mesh::getNbNodesPerElement(type); conn_val[nb_good_types] = mesh.getConnectivity(type, _not_ghost).storage(); nb_element[nb_good_types] = mesh.getConnectivity(type, _not_ghost).getSize(); nb_good_types++; } AKANTU_DEBUG_ASSERT( nb_good_types != 0, "Some elements must be found in right dimension to compute facets!"); /// array for the node-element list node_to_elem.resizeRows(nb_nodes); node_to_elem.clearRows(); /// count number of occurrence of each node for (UInt t = 0; t < nb_good_types; ++t) { for (UInt el = 0; el < nb_element[t]; ++el) { UInt el_offset = el * nb_nodes_per_element[t]; for (UInt n = 0; n < nb_nodes_per_element[t]; ++n) { ++node_to_elem.rowOffset(conn_val[t][el_offset + n]); } } } node_to_elem.countToCSR(); node_to_elem.resizeCols(); node_to_elem.beginInsertions(); /// rearrange element to get the node-element list for (UInt t = 0, linearized_el = 0; t < nb_good_types; ++t) for (UInt el = 0; el < nb_element[t]; ++el, ++linearized_el) { UInt el_offset = el * nb_nodes_per_element[t]; for (UInt n = 0; n < nb_nodes_per_element[t]; ++n) node_to_elem.insertInRow(conn_val[t][el_offset + n], linearized_el); } node_to_elem.endInsertions(); delete[] conn_val; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::buildNode2ElementsElementTypeMap(const Mesh & mesh, CSR & node_to_elem, const ElementType & type, const GhostType & ghost_type) { AKANTU_DEBUG_IN(); UInt nb_nodes = mesh.getNbNodes(); UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(type); UInt nb_elements = mesh.getConnectivity(type, ghost_type).getSize(); UInt * conn_val = mesh.getConnectivity(type, ghost_type).storage(); /// array for the node-element list node_to_elem.resizeRows(nb_nodes); node_to_elem.clearRows(); /// count number of occurrence of each node for (UInt el = 0; el < nb_elements; ++el) { UInt el_offset = el * nb_nodes_per_element; for (UInt n = 0; n < nb_nodes_per_element; ++n) ++node_to_elem.rowOffset(conn_val[el_offset + n]); } /// convert the occurrence array in a csr one node_to_elem.countToCSR(); node_to_elem.resizeCols(); node_to_elem.beginInsertions(); /// save the element index in the node-element list for (UInt el = 0; el < nb_elements; ++el) { UInt el_offset = el * nb_nodes_per_element; for (UInt n = 0; n < nb_nodes_per_element; ++n) { node_to_elem.insertInRow(conn_val[el_offset + n], el); } } node_to_elem.endInsertions(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::buildFacets(Mesh & mesh) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh.getSpatialDimension(); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh.lastType(spatial_dimension - 1, gt_facet); for (; it != end; ++it) { mesh.getConnectivity(*it, *gt).resize(0); // \todo inform the mesh event handler } } buildFacetsDimension(mesh, mesh, true, spatial_dimension); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::buildAllFacets(const Mesh & mesh, Mesh & mesh_facets, - UInt to_dimension, - ElementSynchronizer * synchronizer) { + UInt to_dimension) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh.getSpatialDimension(); - buildAllFacets(mesh, mesh_facets, spatial_dimension, to_dimension, - synchronizer); + buildAllFacets(mesh, mesh_facets, spatial_dimension, to_dimension); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::buildAllFacets(const Mesh & mesh, Mesh & mesh_facets, - UInt from_dimension, UInt to_dimension, - ElementSynchronizer * synchronizer) { + UInt from_dimension, UInt to_dimension) { AKANTU_DEBUG_IN(); AKANTU_DEBUG_ASSERT( mesh_facets.isMeshFacets(), "The mesh_facets should be initialized with initMeshFacets"); - const ElementTypeMapArray * prank_to_element = NULL; + const ElementTypeMapArray * prank_to_element = nullptr; - if (synchronizer) { - synchronizer->buildPrankToElement(); - prank_to_element = &synchronizer->getPrankToElement(); + if (mesh.isDistributed()) { + prank_to_element = &(mesh.getElementSynchronizer().getPrankToElement()); } /// generate facets buildFacetsDimension(mesh, mesh_facets, false, from_dimension, prank_to_element); /// copy nodes type MeshAccessor mesh_accessor_facets(mesh_facets); mesh_accessor_facets.getNodesType().copy(mesh.getNodesType()); /// sort facets and generate sub-facets for (UInt i = from_dimension - 1; i > to_dimension; --i) { buildFacetsDimension(mesh_facets, mesh_facets, false, i, prank_to_element); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::buildFacetsDimension( const Mesh & mesh, Mesh & mesh_facets, bool boundary_only, UInt dimension, const ElementTypeMapArray * prank_to_element) { AKANTU_DEBUG_IN(); // save the current parent of mesh_facets and set it temporarly to mesh since // mesh is the one containing the elements for which mesh_facets has the // sub-elements // example: if the function is called with mesh = mesh_facets const Mesh * mesh_facets_parent = nullptr; try { mesh_facets_parent = &mesh_facets.getMeshParent(); } catch (...) { } mesh_facets.defineMeshParent(mesh); MeshAccessor mesh_accessor(mesh_facets); UInt spatial_dimension = mesh.getSpatialDimension(); const Array & mesh_facets_nodes = mesh_facets.getNodes(); const Array::const_vector_iterator mesh_facets_nodes_it = mesh_facets_nodes.begin(spatial_dimension); CSR node_to_elem; buildNode2Elements(mesh, node_to_elem, dimension); Array counter; std::vector connected_elements; // init the SubelementToElement data to improve performance for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; Mesh::type_iterator first = mesh.firstType(dimension, ghost_type); Mesh::type_iterator last = mesh.lastType(dimension, ghost_type); for (; first != last; ++first) { ElementType type = *first; mesh_accessor.getSubelementToElement(type, ghost_type); Vector facet_types = mesh.getAllFacetTypes(type); for (UInt ft = 0; ft < facet_types.size(); ++ft) { ElementType facet_type = facet_types(ft); mesh_accessor.getElementToSubelement(facet_type, ghost_type); mesh_accessor.getConnectivity(facet_type, ghost_type); } } } Element current_element; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; GhostType facet_ghost_type = ghost_type; current_element.ghost_type = ghost_type; Mesh::type_iterator first = mesh.firstType(dimension, ghost_type); Mesh::type_iterator last = mesh.lastType(dimension, ghost_type); for (; first != last; ++first) { ElementType type = *first; Vector facet_types = mesh.getAllFacetTypes(type); current_element.type = type; for (UInt ft = 0; ft < facet_types.size(); ++ft) { ElementType facet_type = facet_types(ft); UInt nb_element = mesh.getNbElement(type, ghost_type); Array> * element_to_subelement = &mesh_facets.getElementToSubelement(facet_type, ghost_type); Array * connectivity_facets = &mesh_facets.getConnectivity(facet_type, ghost_type); UInt nb_facet_per_element = mesh.getNbFacetsPerElement(type, ft); const Array & element_connectivity = mesh.getConnectivity(type, ghost_type); const Matrix facet_local_connectivity = mesh.getFacetLocalConnectivity(type, ft); UInt nb_nodes_per_facet = connectivity_facets->getNbComponent(); Vector facet(nb_nodes_per_facet); for (UInt el = 0; el < nb_element; ++el) { current_element.element = el; for (UInt f = 0; f < nb_facet_per_element; ++f) { for (UInt n = 0; n < nb_nodes_per_facet; ++n) facet(n) = element_connectivity(el, facet_local_connectivity(f, n)); UInt first_node_nb_elements = node_to_elem.getNbCols(facet(0)); counter.resize(first_node_nb_elements); counter.clear(); // loop over the other nodes to search intersecting elements, // which are the elements that share another node with the // starting element after first_node CSR::iterator first_node_elements = node_to_elem.begin(facet(0)); CSR::iterator first_node_elements_end = node_to_elem.end(facet(0)); UInt local_el = 0; for (; first_node_elements != first_node_elements_end; ++first_node_elements, ++local_el) { for (UInt n = 1; n < nb_nodes_per_facet; ++n) { CSR::iterator node_elements_begin = node_to_elem.begin(facet(n)); CSR::iterator node_elements_end = node_to_elem.end(facet(n)); counter(local_el) += std::count(node_elements_begin, node_elements_end, *first_node_elements); } } // counting the number of elements connected to the facets and // taking the minimum element number, because the facet should // be inserted just once UInt nb_element_connected_to_facet = 0; Element minimum_el = ElementNull; connected_elements.clear(); for (UInt el_f = 0; el_f < first_node_nb_elements; el_f++) { Element real_el = node_to_elem(facet(0), el_f); if (counter(el_f) == nb_nodes_per_facet - 1) { ++nb_element_connected_to_facet; minimum_el = std::min(minimum_el, real_el); connected_elements.push_back(real_el); } } if (minimum_el == current_element) { bool full_ghost_facet = false; UInt n = 0; while (n < nb_nodes_per_facet && mesh.isPureGhostNode(facet(n))) ++n; if (n == nb_nodes_per_facet) full_ghost_facet = true; if (!full_ghost_facet) { if (!boundary_only || (boundary_only && nb_element_connected_to_facet == 1)) { std::vector elements; // build elements_on_facets: linearized_el must come first // in order to store the facet in the correct direction // and avoid to invert the sign in the normal computation elements.push_back(current_element); /// boundary facet if (nb_element_connected_to_facet == 1) elements.push_back(ElementNull); /// internal facet else if (nb_element_connected_to_facet == 2) { elements.push_back(connected_elements[1]); /// check if facet is in between ghost and normal /// elements: if it's the case, the facet is either /// ghost or not ghost. The criterion to decide this /// is arbitrary. It was chosen to check the processor /// id (prank) of the two neighboring elements. If /// prank of the ghost element is lower than prank of /// the normal one, the facet is not ghost, otherwise /// it's ghost GhostType gt[2] = {_not_ghost, _not_ghost}; for (UInt el = 0; el < connected_elements.size(); ++el) gt[el] = connected_elements[el].ghost_type; if (gt[0] + gt[1] == 1) { if (prank_to_element) { UInt prank[2]; for (UInt el = 0; el < 2; ++el) { UInt current_el = connected_elements[el].element; ElementType current_type = connected_elements[el].type; GhostType current_gt = connected_elements[el].ghost_type; const Array & prank_to_el = (*prank_to_element)(current_type, current_gt); prank[el] = prank_to_el(current_el); } bool ghost_one = (gt[0] != _ghost); if (prank[ghost_one] > prank[!ghost_one]) facet_ghost_type = _not_ghost; else facet_ghost_type = _ghost; connectivity_facets = &mesh_facets.getConnectivity( facet_type, facet_ghost_type); element_to_subelement = &mesh_facets.getElementToSubelement( facet_type, facet_ghost_type); } } } /// facet of facet else { for (UInt i = 1; i < nb_element_connected_to_facet; ++i) { elements.push_back(connected_elements[i]); } } element_to_subelement->push_back(elements); connectivity_facets->push_back(facet); /// current facet index UInt current_facet = connectivity_facets->getSize() - 1; /// loop on every element connected to current facet and /// insert current facet in the first free spot of the /// subelement_to_element vector for (UInt elem = 0; elem < elements.size(); ++elem) { Element loc_el = elements[elem]; if (loc_el.type != _not_defined) { Array & subelement_to_element = mesh_facets.getSubelementToElement(loc_el.type, loc_el.ghost_type); UInt nb_facet_per_loc_element = subelement_to_element.getNbComponent(); for (UInt f_in = 0; f_in < nb_facet_per_loc_element; ++f_in) { if (subelement_to_element(loc_el.element, f_in).type == _not_defined) { subelement_to_element(loc_el.element, f_in).type = facet_type; subelement_to_element(loc_el.element, f_in).element = current_facet; subelement_to_element(loc_el.element, f_in) .ghost_type = facet_ghost_type; break; } } } } /// reset connectivity in case a facet was found in /// between ghost and normal elements if (facet_ghost_type != ghost_type) { facet_ghost_type = ghost_type; connectivity_facets = &mesh_accessor.getConnectivity( facet_type, facet_ghost_type); element_to_subelement = &mesh_accessor.getElementToSubelement(facet_type, facet_ghost_type); } } } } } } } } } // restore the parent of mesh_facet if (mesh_facets_parent) mesh_facets.defineMeshParent(*mesh_facets_parent); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::renumberMeshNodes(Mesh & mesh, Array & local_connectivities, UInt nb_local_element, UInt nb_ghost_element, ElementType type, Array & old_nodes_numbers) { AKANTU_DEBUG_IN(); UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(type); std::map renumbering_map; for (UInt i = 0; i < old_nodes_numbers.getSize(); ++i) { renumbering_map[old_nodes_numbers(i)] = i; } /// renumber the nodes renumberNodesInConnectivity(local_connectivities, (nb_local_element + nb_ghost_element) * nb_nodes_per_element, renumbering_map); std::map::iterator it = renumbering_map.begin(); std::map::iterator end = renumbering_map.end(); old_nodes_numbers.resize(renumbering_map.size()); for (; it != end; ++it) { old_nodes_numbers(it->second) = it->first; } renumbering_map.clear(); MeshAccessor mesh_accessor(mesh); /// copy the renumbered connectivity to the right place Array & local_conn = mesh_accessor.getConnectivity(type); local_conn.resize(nb_local_element); memcpy(local_conn.storage(), local_connectivities.storage(), nb_local_element * nb_nodes_per_element * sizeof(UInt)); Array & ghost_conn = mesh_accessor.getConnectivity(type, _ghost); ghost_conn.resize(nb_ghost_element); memcpy(ghost_conn.storage(), local_connectivities.storage() + nb_local_element * nb_nodes_per_element, nb_ghost_element * nb_nodes_per_element * sizeof(UInt)); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::renumberNodesInConnectivity( Array & list_nodes, UInt nb_nodes, std::map & renumbering_map) { AKANTU_DEBUG_IN(); UInt * connectivity = list_nodes.storage(); UInt new_node_num = renumbering_map.size(); for (UInt n = 0; n < nb_nodes; ++n, ++connectivity) { UInt & node = *connectivity; std::map::iterator it = renumbering_map.find(node); if (it == renumbering_map.end()) { UInt old_node = node; renumbering_map[old_node] = new_node_num; node = new_node_num; ++new_node_num; } else { node = it->second; } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::purifyMesh(Mesh & mesh) { AKANTU_DEBUG_IN(); std::map renumbering_map; RemovedNodesEvent remove_nodes(mesh); Array & nodes_removed = remove_nodes.getList(); for (UInt gt = _not_ghost; gt <= _ghost; ++gt) { GhostType ghost_type = (GhostType)gt; Mesh::type_iterator it = mesh.firstType(_all_dimensions, ghost_type, _ek_not_defined); Mesh::type_iterator end = mesh.lastType(_all_dimensions, ghost_type, _ek_not_defined); for (; it != end; ++it) { ElementType type(*it); UInt nb_nodes_per_element = Mesh::getNbNodesPerElement(type); Array & connectivity = mesh.getConnectivity(type, ghost_type); UInt nb_element(connectivity.getSize()); renumberNodesInConnectivity( connectivity, nb_element * nb_nodes_per_element, renumbering_map); } } Array & new_numbering = remove_nodes.getNewNumbering(); std::fill(new_numbering.begin(), new_numbering.end(), UInt(-1)); std::map::iterator it = renumbering_map.begin(); std::map::iterator end = renumbering_map.end(); for (; it != end; ++it) { new_numbering(it->first) = it->second; } for (UInt i = 0; i < new_numbering.getSize(); ++i) { if (new_numbering(i) == UInt(-1)) nodes_removed.push_back(i); } mesh.sendEvent(remove_nodes); AKANTU_DEBUG_OUT(); } #if defined(AKANTU_COHESIVE_ELEMENT) /* -------------------------------------------------------------------------- */ UInt MeshUtils::insertCohesiveElements( Mesh & mesh, Mesh & mesh_facets, const ElementTypeMapArray & facet_insertion, Array & doubled_nodes, Array & new_elements, bool only_double_facets) { UInt spatial_dimension = mesh.getSpatialDimension(); UInt elements_to_insert = updateFacetToDouble(mesh_facets, facet_insertion); if (elements_to_insert > 0) { if (spatial_dimension == 1) { doublePointFacet(mesh, mesh_facets, doubled_nodes); } else { doubleFacet(mesh, mesh_facets, spatial_dimension - 1, doubled_nodes, true); findSubfacetToDouble(mesh, mesh_facets); if (spatial_dimension == 2) { doubleSubfacet<2>(mesh, mesh_facets, doubled_nodes); } else if (spatial_dimension == 3) { doubleFacet(mesh, mesh_facets, 1, doubled_nodes, false); findSubfacetToDouble(mesh, mesh_facets); doubleSubfacet<3>(mesh, mesh_facets, doubled_nodes); } } if (!only_double_facets) updateCohesiveData(mesh, mesh_facets, new_elements); } return elements_to_insert; } #endif /* -------------------------------------------------------------------------- */ void MeshUtils::doubleNodes(Mesh & mesh, const std::vector & old_nodes, Array & doubled_nodes) { AKANTU_DEBUG_IN(); Array & position = mesh.getNodes(); UInt spatial_dimension = mesh.getSpatialDimension(); UInt old_nb_nodes = position.getSize(); UInt new_nb_nodes = old_nb_nodes + old_nodes.size(); UInt old_nb_doubled_nodes = doubled_nodes.getSize(); UInt new_nb_doubled_nodes = old_nb_doubled_nodes + old_nodes.size(); position.resize(new_nb_nodes); doubled_nodes.resize(new_nb_doubled_nodes); Array::iterator> position_begin = position.begin(spatial_dimension); for (UInt n = 0; n < old_nodes.size(); ++n) { UInt new_node = old_nb_nodes + n; /// store doubled nodes doubled_nodes(old_nb_doubled_nodes + n, 0) = old_nodes[n]; doubled_nodes(old_nb_doubled_nodes + n, 1) = new_node; /// update position std::copy(position_begin + old_nodes[n], position_begin + old_nodes[n] + 1, position_begin + new_node); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::doubleFacet(Mesh & mesh, Mesh & mesh_facets, UInt facet_dimension, Array & doubled_nodes, bool facet_mode) { AKANTU_DEBUG_IN(); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh_facets.firstType(facet_dimension, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(facet_dimension, gt_facet); for (; it != end; ++it) { ElementType type_facet = *it; Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); UInt nb_facet_to_double = f_to_double.getSize(); if (nb_facet_to_double == 0) continue; ElementType type_subfacet = Mesh::getFacetType(type_facet); const UInt nb_subfacet_per_facet = Mesh::getNbFacetsPerElement(type_facet); GhostType gt_subfacet = _casper; Array> * f_to_subfacet = NULL; Array & subfacet_to_facet = mesh_facets.getSubelementToElement(type_facet, gt_facet); Array & conn_facet = mesh_facets.getConnectivity(type_facet, gt_facet); UInt nb_nodes_per_facet = conn_facet.getNbComponent(); UInt old_nb_facet = conn_facet.getSize(); UInt new_nb_facet = old_nb_facet + nb_facet_to_double; conn_facet.resize(new_nb_facet); subfacet_to_facet.resize(new_nb_facet); UInt new_facet = old_nb_facet - 1; Element new_facet_el(type_facet, 0, gt_facet); Array::iterator> subfacet_to_facet_begin = subfacet_to_facet.begin(nb_subfacet_per_facet); Array::iterator> conn_facet_begin = conn_facet.begin(nb_nodes_per_facet); for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { UInt old_facet = f_to_double(facet); ++new_facet; /// adding a new facet by copying original one /// copy connectivity in new facet std::copy(conn_facet_begin + old_facet, conn_facet_begin + old_facet + 1, conn_facet_begin + new_facet); /// update subfacet_to_facet std::copy(subfacet_to_facet_begin + old_facet, subfacet_to_facet_begin + old_facet + 1, subfacet_to_facet_begin + new_facet); new_facet_el.element = new_facet; /// loop on every subfacet for (UInt sf = 0; sf < nb_subfacet_per_facet; ++sf) { Element & subfacet = subfacet_to_facet(old_facet, sf); if (subfacet == ElementNull) continue; if (gt_subfacet != subfacet.ghost_type) { gt_subfacet = subfacet.ghost_type; f_to_subfacet = &mesh_facets.getElementToSubelement( type_subfacet, subfacet.ghost_type); } /// update facet_to_subfacet array (*f_to_subfacet)(subfacet.element).push_back(new_facet_el); } } /// update facet_to_subfacet and _segment_3 facets if any if (!facet_mode) { updateSubfacetToFacet(mesh_facets, type_facet, gt_facet, true); updateFacetToSubfacet(mesh_facets, type_facet, gt_facet, true); updateQuadraticSegments(mesh, mesh_facets, type_facet, gt_facet, doubled_nodes); } else updateQuadraticSegments(mesh, mesh_facets, type_facet, gt_facet, doubled_nodes); } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ UInt MeshUtils::updateFacetToDouble( Mesh & mesh_facets, const ElementTypeMapArray & facet_insertion) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh_facets.getSpatialDimension(); UInt nb_facets_to_double = 0.; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh_facets.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, gt_facet); for (; it != end; ++it) { ElementType type_facet = *it; const Array & f_insertion = facet_insertion(type_facet, gt_facet); Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); Array> & element_to_facet = mesh_facets.getElementToSubelement(type_facet, gt_facet); ElementType el_type = _not_defined; GhostType el_gt = _casper; UInt nb_facet_per_element = 0; Element old_facet_el(type_facet, 0, gt_facet); Array * facet_to_element = NULL; for (UInt f = 0; f < f_insertion.getSize(); ++f) { if (f_insertion(f) == false) continue; ++nb_facets_to_double; if (element_to_facet(f)[1].type == _not_defined #if defined(AKANTU_COHESIVE_ELEMENT) || element_to_facet(f)[1].kind == _ek_cohesive #endif ) { AKANTU_DEBUG_WARNING("attempt to double a facet on the boundary"); continue; } f_to_double.push_back(f); UInt new_facet = mesh_facets.getNbElement(type_facet, gt_facet) + f_to_double.getSize() - 1; old_facet_el.element = f; /// update facet_to_element vector Element & elem_to_update = element_to_facet(f)[1]; UInt el = elem_to_update.element; if (elem_to_update.ghost_type != el_gt || elem_to_update.type != el_type) { el_type = elem_to_update.type; el_gt = elem_to_update.ghost_type; facet_to_element = &mesh_facets.getSubelementToElement(el_type, el_gt); nb_facet_per_element = facet_to_element->getNbComponent(); } Element * f_update = std::find(facet_to_element->storage() + el * nb_facet_per_element, facet_to_element->storage() + el * nb_facet_per_element + nb_facet_per_element, old_facet_el); AKANTU_DEBUG_ASSERT( facet_to_element->storage() + el * nb_facet_per_element != facet_to_element->storage() + el * nb_facet_per_element + nb_facet_per_element, "Facet not found"); f_update->element = new_facet; /// update elements connected to facet std::vector first_facet_list = element_to_facet(f); element_to_facet.push_back(first_facet_list); /// set new and original facets as boundary facets element_to_facet(new_facet)[0] = element_to_facet(new_facet)[1]; element_to_facet(f)[1] = ElementNull; element_to_facet(new_facet)[1] = ElementNull; } } } AKANTU_DEBUG_OUT(); return nb_facets_to_double; } /* -------------------------------------------------------------------------- */ void MeshUtils::resetFacetToDouble(Mesh & mesh_facets) { AKANTU_DEBUG_IN(); for (UInt g = _not_ghost; g <= _ghost; ++g) { GhostType gt = (GhostType)g; Mesh::type_iterator it = mesh_facets.firstType(_all_dimensions, gt); Mesh::type_iterator end = mesh_facets.lastType(_all_dimensions, gt); for (; it != end; ++it) { ElementType type = *it; mesh_facets.getDataPointer("facet_to_double", type, gt, 1, false); mesh_facets.getDataPointer>( "facets_to_subfacet_double", type, gt, 1, false); mesh_facets.getDataPointer>( "elements_to_subfacet_double", type, gt, 1, false); mesh_facets.getDataPointer>( "subfacets_to_subsubfacet_double", type, gt, 1, false); } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MeshUtils::findSubfacetToDouble(Mesh & mesh, Mesh & mesh_facets) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh_facets.getSpatialDimension(); if (spatial_dimension == 1) return; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh_facets.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, gt_facet); for (; it != end; ++it) { ElementType type_facet = *it; Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); UInt nb_facet_to_double = f_to_double.getSize(); if (nb_facet_to_double == 0) continue; ElementType type_subfacet = Mesh::getFacetType(type_facet); GhostType gt_subfacet = _casper; ElementType type_subsubfacet = Mesh::getFacetType(type_subfacet); GhostType gt_subsubfacet = _casper; Array * conn_subfacet = NULL; Array * sf_to_double = NULL; Array> * sf_to_subfacet_double = NULL; Array> * f_to_subfacet_double = NULL; Array> * el_to_subfacet_double = NULL; UInt nb_subfacet = Mesh::getNbFacetsPerElement(type_facet); UInt nb_subsubfacet; UInt nb_nodes_per_sf_el; if (subsubfacet_mode) { nb_nodes_per_sf_el = Mesh::getNbNodesPerElement(type_subsubfacet); nb_subsubfacet = Mesh::getNbFacetsPerElement(type_subfacet); } else nb_nodes_per_sf_el = Mesh::getNbNodesPerElement(type_subfacet); Array & subfacet_to_facet = mesh_facets.getSubelementToElement(type_facet, gt_facet); Array> & element_to_facet = mesh_facets.getElementToSubelement(type_facet, gt_facet); Array * subsubfacet_to_subfacet = NULL; UInt old_nb_facet = subfacet_to_facet.getSize() - nb_facet_to_double; Element current_facet(type_facet, 0, gt_facet); std::vector element_list; std::vector facet_list; std::vector * subfacet_list; if (subsubfacet_mode) subfacet_list = new std::vector; /// map to filter subfacets Array> * facet_to_subfacet = NULL; /// this is used to make sure that both new and old facets are /// checked UInt facets[2]; /// loop on every facet for (UInt f_index = 0; f_index < 2; ++f_index) { for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { facets[bool(f_index)] = f_to_double(facet); facets[!bool(f_index)] = old_nb_facet + facet; UInt old_facet = facets[0]; UInt new_facet = facets[1]; Element & starting_element = element_to_facet(new_facet)[0]; current_facet.element = old_facet; /// loop on every subfacet for (UInt sf = 0; sf < nb_subfacet; ++sf) { Element & subfacet = subfacet_to_facet(old_facet, sf); if (subfacet == ElementNull) continue; if (gt_subfacet != subfacet.ghost_type) { gt_subfacet = subfacet.ghost_type; if (subsubfacet_mode) { subsubfacet_to_subfacet = &mesh_facets.getSubelementToElement( type_subfacet, gt_subfacet); } else { conn_subfacet = &mesh_facets.getConnectivity(type_subfacet, gt_subfacet); sf_to_double = &mesh_facets.getData( "facet_to_double", type_subfacet, gt_subfacet); f_to_subfacet_double = &mesh_facets.getData>( "facets_to_subfacet_double", type_subfacet, gt_subfacet); el_to_subfacet_double = &mesh_facets.getData>( "elements_to_subfacet_double", type_subfacet, gt_subfacet); facet_to_subfacet = &mesh_facets.getElementToSubelement( type_subfacet, gt_subfacet); } } if (subsubfacet_mode) { /// loop on every subsubfacet for (UInt ssf = 0; ssf < nb_subsubfacet; ++ssf) { Element & subsubfacet = (*subsubfacet_to_subfacet)(subfacet.element, ssf); if (subsubfacet == ElementNull) continue; if (gt_subsubfacet != subsubfacet.ghost_type) { gt_subsubfacet = subsubfacet.ghost_type; conn_subfacet = &mesh_facets.getConnectivity(type_subsubfacet, gt_subsubfacet); sf_to_double = &mesh_facets.getData( "facet_to_double", type_subsubfacet, gt_subsubfacet); sf_to_subfacet_double = &mesh_facets.getData>( "subfacets_to_subsubfacet_double", type_subsubfacet, gt_subsubfacet); f_to_subfacet_double = &mesh_facets.getData>( "facets_to_subfacet_double", type_subsubfacet, gt_subsubfacet); el_to_subfacet_double = &mesh_facets.getData>( "elements_to_subfacet_double", type_subsubfacet, gt_subsubfacet); facet_to_subfacet = &mesh_facets.getElementToSubelement( type_subsubfacet, gt_subsubfacet); } UInt global_ssf = subsubfacet.element; Vector subsubfacet_connectivity( conn_subfacet->storage() + global_ssf * nb_nodes_per_sf_el, nb_nodes_per_sf_el); /// check if subsubfacet is to be doubled if (findElementsAroundSubfacet( mesh, mesh_facets, starting_element, current_facet, subsubfacet_connectivity, element_list, facet_list, subfacet_list) == false && removeElementsInVector(*subfacet_list, (*facet_to_subfacet)(global_ssf)) == false) { sf_to_double->push_back(global_ssf); sf_to_subfacet_double->push_back(*subfacet_list); f_to_subfacet_double->push_back(facet_list); el_to_subfacet_double->push_back(element_list); } } } else { const UInt global_sf = subfacet.element; Vector subfacet_connectivity( conn_subfacet->storage() + global_sf * nb_nodes_per_sf_el, nb_nodes_per_sf_el); /// check if subfacet is to be doubled if (findElementsAroundSubfacet( mesh, mesh_facets, starting_element, current_facet, subfacet_connectivity, element_list, facet_list) == false && removeElementsInVector( facet_list, (*facet_to_subfacet)(global_sf)) == false) { sf_to_double->push_back(global_sf); f_to_subfacet_double->push_back(facet_list); el_to_subfacet_double->push_back(element_list); } } } } } if (subsubfacet_mode) delete subfacet_list; } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ #if defined(AKANTU_COHESIVE_ELEMENT) void MeshUtils::updateCohesiveData(Mesh & mesh, Mesh & mesh_facets, Array & new_elements) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh.getSpatialDimension(); bool third_dimension = spatial_dimension == 3; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh_facets.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, gt_facet); for (; it != end; ++it) { ElementType type_facet = *it; Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); UInt nb_facet_to_double = f_to_double.getSize(); if (nb_facet_to_double == 0) continue; ElementType type_cohesive = FEEngine::getCohesiveElementType(type_facet); Array * facet_to_coh_element = mesh_facets.getSubelementToElementPointer(type_cohesive, gt_facet); Array & conn_facet = mesh_facets.getConnectivity(type_facet, gt_facet); Array * conn_cohesive = mesh.getConnectivityPointer(type_cohesive, gt_facet); UInt nb_nodes_per_facet = Mesh::getNbNodesPerElement(type_facet); Array> & element_to_facet = mesh_facets.getElementToSubelement(type_facet, gt_facet); UInt old_nb_cohesive_elements = conn_cohesive->getSize(); UInt new_nb_cohesive_elements = conn_cohesive->getSize() + nb_facet_to_double; UInt old_nb_facet = element_to_facet.getSize() - nb_facet_to_double; facet_to_coh_element->resize(new_nb_cohesive_elements); conn_cohesive->resize(new_nb_cohesive_elements); UInt new_elements_old_size = new_elements.getSize(); new_elements.resize(new_elements_old_size + nb_facet_to_double); Element c_element(type_cohesive, 0, gt_facet, _ek_cohesive); Element f_element(type_facet, 0, gt_facet); UInt facets[2]; for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { /// (in 3D cohesive elements connectivity is inverted) facets[third_dimension] = f_to_double(facet); facets[!third_dimension] = old_nb_facet + facet; UInt cohesive_element = old_nb_cohesive_elements + facet; /// store doubled facets f_element.element = facets[0]; (*facet_to_coh_element)(cohesive_element, 0) = f_element; f_element.element = facets[1]; (*facet_to_coh_element)(cohesive_element, 1) = f_element; /// modify cohesive elements' connectivity for (UInt n = 0; n < nb_nodes_per_facet; ++n) { (*conn_cohesive)(cohesive_element, n) = conn_facet(facets[0], n); (*conn_cohesive)(cohesive_element, n + nb_nodes_per_facet) = conn_facet(facets[1], n); } /// update element_to_facet vectors c_element.element = cohesive_element; element_to_facet(facets[0])[1] = c_element; element_to_facet(facets[1])[1] = c_element; /// add cohesive element to the element event list new_elements(new_elements_old_size + facet) = c_element; } } } AKANTU_DEBUG_OUT(); } #endif /* -------------------------------------------------------------------------- */ void MeshUtils::doublePointFacet(Mesh & mesh, Mesh & mesh_facets, Array & doubled_nodes) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh.getSpatialDimension(); if (spatial_dimension != 1) return; Array & position = mesh.getNodes(); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_facet = *gt; Mesh::type_iterator it = mesh_facets.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, gt_facet); for (; it != end; ++it) { ElementType type_facet = *it; Array & conn_facet = mesh_facets.getConnectivity(type_facet, gt_facet); Array> & element_to_facet = mesh_facets.getElementToSubelement(type_facet, gt_facet); const Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); UInt nb_facet_to_double = f_to_double.getSize(); UInt old_nb_facet = element_to_facet.getSize() - nb_facet_to_double; UInt new_nb_facet = element_to_facet.getSize(); UInt old_nb_nodes = position.getSize(); UInt new_nb_nodes = old_nb_nodes + nb_facet_to_double; position.resize(new_nb_nodes); conn_facet.resize(new_nb_facet); UInt old_nb_doubled_nodes = doubled_nodes.getSize(); doubled_nodes.resize(old_nb_doubled_nodes + nb_facet_to_double); for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { UInt old_facet = f_to_double(facet); UInt new_facet = old_nb_facet + facet; ElementType type = element_to_facet(new_facet)[0].type; UInt el = element_to_facet(new_facet)[0].element; GhostType gt = element_to_facet(new_facet)[0].ghost_type; UInt old_node = conn_facet(old_facet); UInt new_node = old_nb_nodes + facet; /// update position position(new_node) = position(old_node); conn_facet(new_facet) = new_node; Array & conn_segment = mesh.getConnectivity(type, gt); UInt nb_nodes_per_segment = conn_segment.getNbComponent(); /// update facet connectivity UInt i; for (i = 0; conn_segment(el, i) != old_node && i <= nb_nodes_per_segment; ++i) ; conn_segment(el, i) = new_node; doubled_nodes(old_nb_doubled_nodes + facet, 0) = old_node; doubled_nodes(old_nb_doubled_nodes + facet, 1) = new_node; } } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MeshUtils::updateQuadraticSegments(Mesh & mesh, Mesh & mesh_facets, ElementType type_facet, GhostType gt_facet, Array & doubled_nodes) { AKANTU_DEBUG_IN(); if (type_facet != _segment_3) return; Array & f_to_double = mesh_facets.getData("facet_to_double", type_facet, gt_facet); UInt nb_facet_to_double = f_to_double.getSize(); UInt old_nb_facet = mesh_facets.getNbElement(type_facet, gt_facet) - nb_facet_to_double; Array & conn_facet = mesh_facets.getConnectivity(type_facet, gt_facet); Array> & element_to_facet = mesh_facets.getElementToSubelement(type_facet, gt_facet); /// this ones matter only for segments in 3D Array> * el_to_subfacet_double = NULL; Array> * f_to_subfacet_double = NULL; if (third_dim_segments) { el_to_subfacet_double = &mesh_facets.getData>( "elements_to_subfacet_double", type_facet, gt_facet); f_to_subfacet_double = &mesh_facets.getData>( "facets_to_subfacet_double", type_facet, gt_facet); } std::vector middle_nodes; for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { UInt old_facet = f_to_double(facet); UInt node = conn_facet(old_facet, 2); if (!mesh.isPureGhostNode(node)) middle_nodes.push_back(node); } UInt n = doubled_nodes.getSize(); doubleNodes(mesh, middle_nodes, doubled_nodes); for (UInt facet = 0; facet < nb_facet_to_double; ++facet) { UInt old_facet = f_to_double(facet); UInt old_node = conn_facet(old_facet, 2); if (mesh.isPureGhostNode(old_node)) continue; UInt new_node = doubled_nodes(n, 1); UInt new_facet = old_nb_facet + facet; conn_facet(new_facet, 2) = new_node; if (third_dim_segments) { updateElementalConnectivity(mesh_facets, old_node, new_node, element_to_facet(new_facet)); updateElementalConnectivity(mesh, old_node, new_node, (*el_to_subfacet_double)(facet), &(*f_to_subfacet_double)(facet)); } else { updateElementalConnectivity(mesh, old_node, new_node, element_to_facet(new_facet)); } ++n; } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::updateSubfacetToFacet(Mesh & mesh_facets, ElementType type_subfacet, GhostType gt_subfacet, bool facet_mode) { AKANTU_DEBUG_IN(); Array & sf_to_double = mesh_facets.getData("facet_to_double", type_subfacet, gt_subfacet); UInt nb_subfacet_to_double = sf_to_double.getSize(); /// update subfacet_to_facet vector ElementType type_facet = _not_defined; GhostType gt_facet = _casper; Array * subfacet_to_facet = NULL; UInt nb_subfacet_per_facet = 0; UInt old_nb_subfacet = mesh_facets.getNbElement(type_subfacet, gt_subfacet) - nb_subfacet_to_double; Array> * facet_list = NULL; if (facet_mode) facet_list = &mesh_facets.getData>( "facets_to_subfacet_double", type_subfacet, gt_subfacet); else facet_list = &mesh_facets.getData>( "subfacets_to_subsubfacet_double", type_subfacet, gt_subfacet); Element old_subfacet_el(type_subfacet, 0, gt_subfacet); Element new_subfacet_el(type_subfacet, 0, gt_subfacet); for (UInt sf = 0; sf < nb_subfacet_to_double; ++sf) { old_subfacet_el.element = sf_to_double(sf); new_subfacet_el.element = old_nb_subfacet + sf; for (UInt f = 0; f < (*facet_list)(sf).size(); ++f) { Element & facet = (*facet_list)(sf)[f]; if (facet.type != type_facet || facet.ghost_type != gt_facet) { type_facet = facet.type; gt_facet = facet.ghost_type; subfacet_to_facet = &mesh_facets.getSubelementToElement(type_facet, gt_facet); nb_subfacet_per_facet = subfacet_to_facet->getNbComponent(); } Element * sf_update = std::find( subfacet_to_facet->storage() + facet.element * nb_subfacet_per_facet, subfacet_to_facet->storage() + facet.element * nb_subfacet_per_facet + nb_subfacet_per_facet, old_subfacet_el); AKANTU_DEBUG_ASSERT(subfacet_to_facet->storage() + facet.element * nb_subfacet_per_facet != subfacet_to_facet->storage() + facet.element * nb_subfacet_per_facet + nb_subfacet_per_facet, "Subfacet not found"); *sf_update = new_subfacet_el; } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::updateFacetToSubfacet(Mesh & mesh_facets, ElementType type_subfacet, GhostType gt_subfacet, bool facet_mode) { AKANTU_DEBUG_IN(); Array & sf_to_double = mesh_facets.getData("facet_to_double", type_subfacet, gt_subfacet); UInt nb_subfacet_to_double = sf_to_double.getSize(); Array> & facet_to_subfacet = mesh_facets.getElementToSubelement(type_subfacet, gt_subfacet); Array> * facet_to_subfacet_double = NULL; if (facet_mode) { facet_to_subfacet_double = &mesh_facets.getData>( "facets_to_subfacet_double", type_subfacet, gt_subfacet); } else { facet_to_subfacet_double = &mesh_facets.getData>( "subfacets_to_subsubfacet_double", type_subfacet, gt_subfacet); } UInt old_nb_subfacet = facet_to_subfacet.getSize(); facet_to_subfacet.resize(old_nb_subfacet + nb_subfacet_to_double); for (UInt sf = 0; sf < nb_subfacet_to_double; ++sf) facet_to_subfacet(old_nb_subfacet + sf) = (*facet_to_subfacet_double)(sf); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MeshUtils::doubleSubfacet(Mesh & mesh, Mesh & mesh_facets, Array & doubled_nodes) { AKANTU_DEBUG_IN(); if (spatial_dimension == 1) return; for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType gt_subfacet = *gt; Mesh::type_iterator it = mesh_facets.firstType(0, gt_subfacet); Mesh::type_iterator end = mesh_facets.lastType(0, gt_subfacet); for (; it != end; ++it) { ElementType type_subfacet = *it; Array & sf_to_double = mesh_facets.getData( "facet_to_double", type_subfacet, gt_subfacet); UInt nb_subfacet_to_double = sf_to_double.getSize(); if (nb_subfacet_to_double == 0) continue; AKANTU_DEBUG_ASSERT( type_subfacet == _point_1, "Only _point_1 subfacet doubling is supported at the moment"); Array & conn_subfacet = mesh_facets.getConnectivity(type_subfacet, gt_subfacet); UInt old_nb_subfacet = conn_subfacet.getSize(); UInt new_nb_subfacet = old_nb_subfacet + nb_subfacet_to_double; conn_subfacet.resize(new_nb_subfacet); std::vector nodes_to_double; UInt old_nb_doubled_nodes = doubled_nodes.getSize(); /// double nodes for (UInt sf = 0; sf < nb_subfacet_to_double; ++sf) { UInt old_subfacet = sf_to_double(sf); nodes_to_double.push_back(conn_subfacet(old_subfacet)); } doubleNodes(mesh, nodes_to_double, doubled_nodes); /// add new nodes in connectivity for (UInt sf = 0; sf < nb_subfacet_to_double; ++sf) { UInt new_subfacet = old_nb_subfacet + sf; UInt new_node = doubled_nodes(old_nb_doubled_nodes + sf, 1); conn_subfacet(new_subfacet) = new_node; } /// update facet and element connectivity Array> & f_to_subfacet_double = mesh_facets.getData>("facets_to_subfacet_double", type_subfacet, gt_subfacet); Array> & el_to_subfacet_double = mesh_facets.getData>( "elements_to_subfacet_double", type_subfacet, gt_subfacet); Array> * sf_to_subfacet_double = NULL; if (spatial_dimension == 3) sf_to_subfacet_double = &mesh_facets.getData>( "subfacets_to_subsubfacet_double", type_subfacet, gt_subfacet); for (UInt sf = 0; sf < nb_subfacet_to_double; ++sf) { UInt old_node = doubled_nodes(old_nb_doubled_nodes + sf, 0); UInt new_node = doubled_nodes(old_nb_doubled_nodes + sf, 1); updateElementalConnectivity(mesh, old_node, new_node, el_to_subfacet_double(sf), &f_to_subfacet_double(sf)); updateElementalConnectivity(mesh_facets, old_node, new_node, f_to_subfacet_double(sf)); if (spatial_dimension == 3) updateElementalConnectivity(mesh_facets, old_node, new_node, (*sf_to_subfacet_double)(sf)); } if (spatial_dimension == 2) { updateSubfacetToFacet(mesh_facets, type_subfacet, gt_subfacet, true); updateFacetToSubfacet(mesh_facets, type_subfacet, gt_subfacet, true); } else if (spatial_dimension == 3) { updateSubfacetToFacet(mesh_facets, type_subfacet, gt_subfacet, false); updateFacetToSubfacet(mesh_facets, type_subfacet, gt_subfacet, false); } } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::flipFacets( Mesh & mesh_facets, const ElementTypeMapArray & global_connectivity, GhostType gt_facet) { AKANTU_DEBUG_IN(); UInt spatial_dimension = mesh_facets.getSpatialDimension(); /// get global connectivity for local mesh ElementTypeMapArray global_connectivity_tmp("global_connectivity_tmp", mesh_facets.getID(), mesh_facets.getMemoryID()); mesh_facets.initElementTypeMapArray(global_connectivity_tmp, 1, spatial_dimension - 1, gt_facet, true, _ek_regular, true); mesh_facets.getGlobalConnectivity(global_connectivity_tmp, spatial_dimension - 1, gt_facet); Mesh::type_iterator it = mesh_facets.firstType(spatial_dimension - 1, gt_facet); Mesh::type_iterator end = mesh_facets.lastType(spatial_dimension - 1, gt_facet); /// loop on every facet for (; it != end; ++it) { ElementType type_facet = *it; Array & connectivity = mesh_facets.getConnectivity(type_facet, gt_facet); const Array & g_connectivity = global_connectivity(type_facet, gt_facet); Array> & el_to_f = mesh_facets.getElementToSubelement(type_facet, gt_facet); Array & subfacet_to_facet = mesh_facets.getSubelementToElement(type_facet, gt_facet); UInt nb_subfacet_per_facet = subfacet_to_facet.getNbComponent(); UInt nb_nodes_per_facet = connectivity.getNbComponent(); UInt nb_facet = connectivity.getSize(); UInt nb_nodes_per_P1_facet = Mesh::getNbNodesPerElement(Mesh::getP1ElementType(type_facet)); Array & global_conn_tmp = global_connectivity_tmp(type_facet, gt_facet); Array::iterator> conn_it = connectivity.begin(nb_nodes_per_facet); Array::iterator> gconn_tmp_it = global_conn_tmp.begin(nb_nodes_per_facet); Array::const_iterator> conn_glob_it = g_connectivity.begin(nb_nodes_per_facet); Array::iterator> subf_to_f = subfacet_to_facet.begin(nb_subfacet_per_facet); UInt * conn_tmp_pointer = new UInt[nb_nodes_per_facet]; Vector conn_tmp(conn_tmp_pointer, nb_nodes_per_facet); Element el_tmp; Element * subf_tmp_pointer = new Element[nb_subfacet_per_facet]; Vector subf_tmp(subf_tmp_pointer, nb_subfacet_per_facet); for (UInt f = 0; f < nb_facet; ++f, ++conn_it, ++gconn_tmp_it, ++subf_to_f, ++conn_glob_it) { Vector & gconn_tmp = *gconn_tmp_it; const Vector & conn_glob = *conn_glob_it; Vector & conn_local = *conn_it; /// skip facet if connectivities are the same if (gconn_tmp == conn_glob) continue; /// re-arrange connectivity conn_tmp = conn_local; UInt * begin = conn_glob.storage(); UInt * end = conn_glob.storage() + nb_nodes_per_facet; for (UInt n = 0; n < nb_nodes_per_facet; ++n) { UInt * new_node = std::find(begin, end, gconn_tmp(n)); AKANTU_DEBUG_ASSERT(new_node != end, "Node not found"); UInt new_position = new_node - begin; conn_local(new_position) = conn_tmp(n); } /// if 3D, check if facets are just rotated if (spatial_dimension == 3) { /// find first node UInt * new_node = std::find(begin, end, gconn_tmp(0)); AKANTU_DEBUG_ASSERT(new_node != end, "Node not found"); UInt new_position = new_node - begin; UInt n = 1; /// count how many nodes in the received connectivity follow /// the same order of those in the local connectivity for (; n < nb_nodes_per_P1_facet && gconn_tmp(n) == conn_glob((new_position + n) % nb_nodes_per_P1_facet); ++n) ; /// skip the facet inversion if facet is just rotated if (n == nb_nodes_per_P1_facet) continue; } /// update data to invert facet el_tmp = el_to_f(f)[0]; el_to_f(f)[0] = el_to_f(f)[1]; el_to_f(f)[1] = el_tmp; subf_tmp = (*subf_to_f); (*subf_to_f)(0) = subf_tmp(1); (*subf_to_f)(1) = subf_tmp(0); } delete[] subf_tmp_pointer; delete[] conn_tmp_pointer; } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void MeshUtils::fillElementToSubElementsData(Mesh & mesh) { AKANTU_DEBUG_IN(); if (mesh.getNbElement(mesh.getSpatialDimension() - 1) == 0) { AKANTU_DEBUG_INFO("There are not facets, add them in the mesh file or call " "the buildFacet method."); return; } UInt spatial_dimension = mesh.getSpatialDimension(); ElementTypeMapArray barycenters("barycenter_tmp", mesh.getID(), mesh.getMemoryID()); mesh.initElementTypeMapArray(barycenters, spatial_dimension, _all_dimensions); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { Mesh::type_iterator it = mesh.firstType(_all_dimensions, *gt); Mesh::type_iterator end = mesh.lastType(_all_dimensions, *gt); for (; it != end; ++it) { UInt nb_element = mesh.getNbElement(*it, *gt); Array & barycenters_arr = barycenters(*it, *gt); barycenters_arr.resize(nb_element); Array::vector_iterator bary = barycenters_arr.begin(spatial_dimension); Array::vector_iterator bary_end = barycenters_arr.end(spatial_dimension); for (UInt el = 0; bary != bary_end; ++bary, ++el) { mesh.getBarycenter(el, *it, bary->storage(), *gt); } } } MeshAccessor mesh_accessor(mesh); for (Int sp(spatial_dimension); sp >= 1; --sp) { if (mesh.getNbElement(sp) == 0) continue; for (ghost_type_t::iterator git = ghost_type_t::begin(); git != ghost_type_t::end(); ++git) { Mesh::type_iterator tit = mesh.firstType(sp, *git); Mesh::type_iterator tend = mesh.lastType(sp, *git); for (; tit != tend; ++tit) { mesh_accessor.getSubelementToElement(*tit, *git) .resize(mesh.getNbElement(*tit, *git)); mesh_accessor.getSubelementToElement(*tit, *git).clear(); } tit = mesh.firstType(sp - 1, *git); tend = mesh.lastType(sp - 1, *git); for (; tit != tend; ++tit) { mesh_accessor.getElementToSubelement(*tit, *git) .resize(mesh.getNbElement(*tit, *git)); mesh.getElementToSubelement(*tit, *git).clear(); } } CSR nodes_to_elements; buildNode2Elements(mesh, nodes_to_elements, sp); Element facet_element; for (ghost_type_t::iterator git = ghost_type_t::begin(); git != ghost_type_t::end(); ++git) { Mesh::type_iterator tit = mesh.firstType(sp - 1, *git); Mesh::type_iterator tend = mesh.lastType(sp - 1, *git); facet_element.ghost_type = *git; for (; tit != tend; ++tit) { facet_element.type = *tit; Array> & element_to_subelement = mesh.getElementToSubelement(*tit, *git); const Array & connectivity = mesh.getConnectivity(*tit, *git); Array::const_iterator> fit = connectivity.begin(mesh.getNbNodesPerElement(*tit)); Array::const_iterator> fend = connectivity.end(mesh.getNbNodesPerElement(*tit)); UInt fid = 0; for (; fit != fend; ++fit, ++fid) { const Vector & facet = *fit; facet_element.element = fid; std::map element_seen_counter; UInt nb_nodes_per_facet = mesh.getNbNodesPerElement(Mesh::getP1ElementType(*tit)); for (UInt n(0); n < nb_nodes_per_facet; ++n) { CSR::iterator eit = nodes_to_elements.begin(facet(n)); CSR::iterator eend = nodes_to_elements.end(facet(n)); for (; eit != eend; ++eit) { Element & elem = *eit; std::map::iterator cit = element_seen_counter.find(elem); if (cit != element_seen_counter.end()) { cit->second++; } else { element_seen_counter[elem] = 1; } } } std::vector connected_elements; std::map::iterator cit = element_seen_counter.begin(); std::map::iterator cend = element_seen_counter.end(); for (; cit != cend; ++cit) { if (cit->second == nb_nodes_per_facet) connected_elements.push_back(cit->first); } std::vector::iterator ceit = connected_elements.begin(); std::vector::iterator ceend = connected_elements.end(); for (; ceit != ceend; ++ceit) element_to_subelement(fid).push_back(*ceit); for (UInt ce = 0; ce < connected_elements.size(); ++ce) { Element & elem = connected_elements[ce]; Array & subelement_to_element = mesh_accessor.getSubelementToElement(elem.type, elem.ghost_type); UInt f(0); for (; f < mesh.getNbFacetsPerElement(elem.type) && subelement_to_element(elem.element, f) != ElementNull; ++f) ; AKANTU_DEBUG_ASSERT( f < mesh.getNbFacetsPerElement(elem.type), "The element " << elem << " seems to have too many facets!! (" << f << " < " << mesh.getNbFacetsPerElement(elem.type) << ")"); subelement_to_element(elem.element, f) = facet_element; } } } } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template bool MeshUtils::findElementsAroundSubfacet( const Mesh & mesh, const Mesh & mesh_facets, const Element & starting_element, const Element & end_facet, const Vector & subfacet_connectivity, std::vector & elem_list, std::vector & facet_list, std::vector * subfacet_list) { AKANTU_DEBUG_IN(); /// preallocated stuff before starting bool facet_matched = false; elem_list.clear(); facet_list.clear(); if (third_dim_points) subfacet_list->clear(); elem_list.push_back(starting_element); const Array * facet_connectivity = NULL; const Array * sf_connectivity = NULL; const Array * facet_to_element = NULL; const Array * subfacet_to_facet = NULL; ElementType current_type = _not_defined; GhostType current_ghost_type = _casper; ElementType current_facet_type = _not_defined; GhostType current_facet_ghost_type = _casper; ElementType current_subfacet_type = _not_defined; GhostType current_subfacet_ghost_type = _casper; const Array> * element_to_facet = NULL; const Element * opposing_el = NULL; std::queue elements_to_check; elements_to_check.push(starting_element); /// keep going until there are elements to check while (!elements_to_check.empty()) { /// check current element Element & current_el = elements_to_check.front(); if (current_el.type != current_type || current_el.ghost_type != current_ghost_type) { current_type = current_el.type; current_ghost_type = current_el.ghost_type; facet_to_element = &mesh_facets.getSubelementToElement(current_type, current_ghost_type); } /// loop over each facet of the element for (UInt f = 0; f < facet_to_element->getNbComponent(); ++f) { const Element & current_facet = (*facet_to_element)(current_el.element, f); if (current_facet == ElementNull) continue; if (current_facet_type != current_facet.type || current_facet_ghost_type != current_facet.ghost_type) { current_facet_type = current_facet.type; current_facet_ghost_type = current_facet.ghost_type; element_to_facet = &mesh_facets.getElementToSubelement( current_facet_type, current_facet_ghost_type); facet_connectivity = &mesh_facets.getConnectivity( current_facet_type, current_facet_ghost_type); if (third_dim_points) subfacet_to_facet = &mesh_facets.getSubelementToElement( current_facet_type, current_facet_ghost_type); } /// check if end facet is reached if (current_facet == end_facet) facet_matched = true; /// add this facet if not already passed if (std::find(facet_list.begin(), facet_list.end(), current_facet) == facet_list.end() && hasElement(*facet_connectivity, current_facet, subfacet_connectivity)) { facet_list.push_back(current_facet); if (third_dim_points) { /// check subfacets for (UInt sf = 0; sf < subfacet_to_facet->getNbComponent(); ++sf) { const Element & current_subfacet = (*subfacet_to_facet)(current_facet.element, sf); if (current_subfacet == ElementNull) continue; if (current_subfacet_type != current_subfacet.type || current_subfacet_ghost_type != current_subfacet.ghost_type) { current_subfacet_type = current_subfacet.type; current_subfacet_ghost_type = current_subfacet.ghost_type; sf_connectivity = &mesh_facets.getConnectivity( current_subfacet_type, current_subfacet_ghost_type); } if (std::find(subfacet_list->begin(), subfacet_list->end(), current_subfacet) == subfacet_list->end() && hasElement(*sf_connectivity, current_subfacet, subfacet_connectivity)) subfacet_list->push_back(current_subfacet); } } } else continue; /// consider opposing element if ((*element_to_facet)(current_facet.element)[0] == current_el) opposing_el = &(*element_to_facet)(current_facet.element)[1]; else opposing_el = &(*element_to_facet)(current_facet.element)[0]; /// skip null elements since they are on a boundary if (*opposing_el == ElementNull) continue; /// skip this element if already added if (std::find(elem_list.begin(), elem_list.end(), *opposing_el) != elem_list.end()) continue; /// only regular elements have to be checked if (opposing_el->kind == _ek_regular) elements_to_check.push(*opposing_el); elem_list.push_back(*opposing_el); #ifndef AKANTU_NDEBUG const Array & conn_elem = mesh.getConnectivity(opposing_el->type, opposing_el->ghost_type); AKANTU_DEBUG_ASSERT( hasElement(conn_elem, *opposing_el, subfacet_connectivity), "Subfacet doesn't belong to this element"); #endif } /// erased checked element from the list elements_to_check.pop(); } AKANTU_DEBUG_OUT(); return facet_matched; } /* -------------------------------------------------------------------------- */ -void MeshUtils::buildSegmentToNodeType(const Mesh & mesh, Mesh & mesh_facets, - ElementSynchronizer * synchronizer) { - buildAllFacets(mesh, mesh_facets, 1, synchronizer); +void MeshUtils::buildSegmentToNodeType(const Mesh & mesh, Mesh & mesh_facets) { + buildAllFacets(mesh, mesh_facets, 1); + UInt spatial_dimension = mesh.getSpatialDimension(); + const ElementTypeMapArray & element_to_rank = - synchronizer->getPrankToElement(); + mesh.getElementSynchronizer().getPrankToElement(); Int local_rank = StaticCommunicator::getStaticCommunicator().whoAmI(); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; Mesh::type_iterator it = mesh_facets.firstType(1, ghost_type); Mesh::type_iterator end = mesh_facets.lastType(1, ghost_type); for (; it != end; ++it) { ElementType type = *it; UInt nb_segments = mesh_facets.getNbElement(type, ghost_type); // allocate the data Array & segment_to_nodetype = *(mesh_facets.getDataPointer( "segment_to_nodetype", type, ghost_type)); std::set connected_elements; const Array> & segment_to_2Delement = mesh_facets.getElementToSubelement(type, ghost_type); // loop over segments for (UInt s = 0; s < nb_segments; ++s) { // determine the elements connected to the segment connected_elements.clear(); const std::vector & twoD_elements = segment_to_2Delement(s); if (spatial_dimension == 2) { // if 2D just take the elements connected to the segments connected_elements.insert(twoD_elements.begin(), twoD_elements.end()); } else if (spatial_dimension == 3) { // if 3D a second loop is needed to get to the 3D elements std::vector::const_iterator facet = twoD_elements.begin(); for (; facet != twoD_elements.end(); ++facet) { const std::vector & threeD_elements = mesh_facets.getElementToSubelement( facet->type, facet->ghost_type)(facet->element); connected_elements.insert(threeD_elements.begin(), threeD_elements.end()); } } // get the minimum processor rank associated to the connected // elements and verify if ghost and not ghost elements are // found Int minimum_rank = std::numeric_limits::max(); // two booleans saying if not ghost and ghost elements are found in the // loop bool ghost_found[2]; ghost_found[0] = false; ghost_found[1] = false; std::set::iterator connected_elements_it = connected_elements.begin(); for (; connected_elements_it != connected_elements.end(); ++connected_elements_it) { if (*connected_elements_it == ElementNull) continue; ghost_found[connected_elements_it->ghost_type] = true; const Array & el_to_rank_array = element_to_rank( connected_elements_it->type, connected_elements_it->ghost_type); minimum_rank = std::min(minimum_rank, Int(el_to_rank_array(connected_elements_it->element))); } // if no ghost elements are found the segment is local if (!ghost_found[1]) segment_to_nodetype(s) = -1; // if no not ghost elements are found the segment is pure ghost else if (!ghost_found[0]) segment_to_nodetype(s) = -3; // if the minimum rank is equal to the local rank, the segment is master else if (local_rank == minimum_rank) segment_to_nodetype(s) = -2; // if the minimum rank is less than the local rank, the segment is slave else if (local_rank > minimum_rank) segment_to_nodetype(s) = minimum_rank; else AKANTU_DEBUG_ERROR("The local rank cannot be smaller than the " "minimum rank if both ghost and not ghost " "elements are found"); } } } } /* -------------------------------------------------------------------------- */ UInt MeshUtils::updateLocalMasterGlobalConnectivity(Mesh & mesh, UInt local_nb_new_nodes) { StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Int rank = comm.whoAmI(); Int nb_proc = comm.getNbProc(); if (nb_proc == 1) return local_nb_new_nodes; /// resize global ids array Array & nodes_global_ids = mesh.getGlobalNodesIds(); UInt old_nb_nodes = mesh.getNbNodes() - local_nb_new_nodes; nodes_global_ids.resize(mesh.getNbNodes()); /// compute the number of global nodes based on the number of old nodes Vector old_local_master_nodes(nb_proc); for (UInt n = 0; n < old_nb_nodes; ++n) if (mesh.isLocalOrMasterNode(n)) ++old_local_master_nodes(rank); comm.allGather(old_local_master_nodes); UInt old_global_nodes = std::accumulate(old_local_master_nodes.storage(), old_local_master_nodes.storage() + nb_proc, 0); /// compute amount of local or master doubled nodes Vector local_master_nodes(nb_proc); for (UInt n = old_nb_nodes; n < mesh.getNbNodes(); ++n) if (mesh.isLocalOrMasterNode(n)) ++local_master_nodes(rank); comm.allGather(local_master_nodes); /// update global number of nodes UInt total_nb_new_nodes = std::accumulate( local_master_nodes.storage(), local_master_nodes.storage() + nb_proc, 0); if (total_nb_new_nodes == 0) return 0; /// set global ids of local and master nodes UInt starting_index = std::accumulate(local_master_nodes.storage(), local_master_nodes.storage() + rank, old_global_nodes); for (UInt n = old_nb_nodes; n < mesh.getNbNodes(); ++n) { if (mesh.isLocalOrMasterNode(n)) { nodes_global_ids(n) = starting_index; ++starting_index; } } MeshAccessor mesh_accessor(mesh); mesh_accessor.setNbGlobalNodes(old_global_nodes + total_nb_new_nodes); return total_nb_new_nodes; } /* -------------------------------------------------------------------------- */ // Deactivating -Wunused-parameter #if defined(__INTEL_COMPILER) //#pragma warning ( disable : 383 ) #elif defined(__clang__) // test clang to be sure that when we test for gnu it // is only gnu #elif (defined(__GNUC__) || defined(__GNUG__)) #define GCC_VERSION \ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) #if GCC_VERSION > 40600 #pragma GCC diagnostic push #endif #pragma GCC diagnostic ignored "-Wunused-parameter" #endif /* -------------------------------------------------------------------------- */ void MeshUtils::updateElementalConnectivity( Mesh & mesh, UInt old_node, UInt new_node, const std::vector & element_list, __attribute__((unused)) const std::vector * facet_list) { AKANTU_DEBUG_IN(); ElementType el_type = _not_defined; GhostType gt_type = _casper; Array * conn_elem = NULL; #if defined(AKANTU_COHESIVE_ELEMENT) const Array * cohesive_facets = NULL; #endif UInt nb_nodes_per_element = 0; UInt * n_update = NULL; for (UInt el = 0; el < element_list.size(); ++el) { const Element & elem = element_list[el]; if (elem.type == _not_defined) continue; if (elem.type != el_type || elem.ghost_type != gt_type) { el_type = elem.type; gt_type = elem.ghost_type; conn_elem = &mesh.getConnectivity(el_type, gt_type); nb_nodes_per_element = conn_elem->getNbComponent(); #if defined(AKANTU_COHESIVE_ELEMENT) if (elem.kind == _ek_cohesive) cohesive_facets = &mesh.getMeshFacets().getSubelementToElement(el_type, gt_type); #endif } #if defined(AKANTU_COHESIVE_ELEMENT) if (elem.kind == _ek_cohesive) { AKANTU_DEBUG_ASSERT( facet_list != NULL, "Provide a facet list in order to update cohesive elements"); /// loop over cohesive element's facets for (UInt f = 0, n = 0; f < 2; ++f, n += nb_nodes_per_element / 2) { const Element & facet = (*cohesive_facets)(elem.element, f); /// skip facets if not present in the list if (std::find(facet_list->begin(), facet_list->end(), facet) == facet_list->end()) continue; n_update = std::find( conn_elem->storage() + elem.element * nb_nodes_per_element + n, conn_elem->storage() + elem.element * nb_nodes_per_element + n + nb_nodes_per_element / 2, old_node); AKANTU_DEBUG_ASSERT(n_update != conn_elem->storage() + elem.element * nb_nodes_per_element + n + nb_nodes_per_element / 2, "Node not found in current element"); /// update connectivity *n_update = new_node; } } else { #endif n_update = std::find(conn_elem->storage() + elem.element * nb_nodes_per_element, conn_elem->storage() + elem.element * nb_nodes_per_element + nb_nodes_per_element, old_node); AKANTU_DEBUG_ASSERT(n_update != conn_elem->storage() + elem.element * nb_nodes_per_element + nb_nodes_per_element, "Node not found in current element"); /// update connectivity *n_update = new_node; #if defined(AKANTU_COHESIVE_ELEMENT) } #endif } AKANTU_DEBUG_OUT(); } // Reactivating -Wunused-parameter #if defined(__INTEL_COMPILER) //#pragma warning ( disable : 383 ) #elif defined(__clang__) // test clang to be sure that when we test for gnu it // is only gnu #elif defined(__GNUG__) #if GCC_VERSION > 40600 #pragma GCC diagnostic pop #else #pragma GCC diagnostic warning "-Wunused-parameter" #endif #endif /* -------------------------------------------------------------------------- */ __END_AKANTU__ // LocalWords: ElementType diff --git a/src/mesh_utils/mesh_utils.hh b/src/mesh_utils/mesh_utils.hh index 5d436d6b5..329ed0586 100644 --- a/src/mesh_utils/mesh_utils.hh +++ b/src/mesh_utils/mesh_utils.hh @@ -1,247 +1,244 @@ /** * @file mesh_utils.hh * * @author Guillaume Anciaux * @author Dana Christen * @author David Simon Kammer * @author Nicolas Richart * @author Leonardo Snozzi * @author Marco Vocialta * * @date creation: Fri Jun 18 2010 * @date last modification: Fri Oct 02 2015 * * @brief All mesh utils necessary for various tasks * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "mesh.hh" #include "aka_csr.hh" /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ #ifndef __AKANTU_MESH_UTILS_HH__ #define __AKANTU_MESH_UTILS_HH__ /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ class MeshUtils { /* ------------------------------------------------------------------------ */ /* Methods */ /* ------------------------------------------------------------------------ */ public: /// build a CSR that contains for each node the linearized number of /// the connected elements of a given spatial dimension static void buildNode2Elements(const Mesh & mesh, CSR & node_to_elem, UInt spatial_dimension = _all_dimensions); /// build a CSR that contains for each node the list of connected /// elements of a given spatial dimension static void buildNode2Elements(const Mesh & mesh, CSR & node_to_elem, UInt spatial_dimension = _all_dimensions); /// build a CSR that contains for each node the number of /// the connected elements of a given ElementType static void buildNode2ElementsElementTypeMap(const Mesh & mesh, CSR & node_to_elem, const ElementType & type, const GhostType & ghost_type = _not_ghost); /// build the facets elements on the boundaries of a mesh static void buildFacets(Mesh & mesh); /// build all the facets elements: boundary and internals and store them in /// the mesh_facets for element of dimension from_dimension to to_dimension static void buildAllFacets(const Mesh & mesh, Mesh & mesh_facets, - UInt from_dimension, UInt to_dimension, - ElementSynchronizer * synchronizer = NULL); + UInt from_dimension, UInt to_dimension); /// build all the facets elements: boundary and internals and store them in /// the mesh_facets static void buildAllFacets(const Mesh & mesh, Mesh & mesh_facets, - UInt to_dimension = 0, - ElementSynchronizer * synchronizer = NULL); + UInt to_dimension = 0); /// build facets for a given spatial dimension static void buildFacetsDimension( const Mesh & mesh, Mesh & mesh_facets, bool boundary_only, UInt dimension, - const ElementTypeMapArray * prank_to_element = NULL); + const ElementTypeMapArray * prank_to_element = nullptr); /// take the local_connectivity array as the array of local and ghost /// connectivity, renumber the nodes and set the connectivity of the mesh static void renumberMeshNodes(Mesh & mesh, Array & local_connectivities, UInt nb_local_element, UInt nb_ghost_element, ElementType type, Array & old_nodes); /// compute pbc pair for a given direction static void computePBCMap(const Mesh & mymesh, const UInt dir, std::map & pbc_pair); /// compute pbc pair for a surface pair static void computePBCMap(const Mesh & mymesh, const std::pair & surface_pair, std::map & pbc_pair); /// remove not connected nodes /!\ this functions renumbers the nodes. static void purifyMesh(Mesh & mesh); #if defined(AKANTU_COHESIVE_ELEMENT) /// function to insert cohesive elements on the selected facets /// @return number of facets that have been doubled static UInt insertCohesiveElements(Mesh & mesh, Mesh & mesh_facets, const ElementTypeMapArray & facet_insertion, Array & doubled_nodes, Array & new_elements, bool only_double_facets); #endif /// fill the subelement to element and the elements to subelements data static void fillElementToSubElementsData(Mesh & mesh); /// flip facets based on global connectivity static void flipFacets(Mesh & mesh_facets, const ElementTypeMapArray & global_connectivity, GhostType gt_facet); /// provide list of elements around a node and check if a given /// facet is reached template static bool findElementsAroundSubfacet( const Mesh & mesh, const Mesh & mesh_facets, const Element & starting_element, const Element & end_facet, const Vector & subfacet_connectivity, std::vector & elem_list, std::vector & facet_list, - std::vector * subfacet_list = NULL); + std::vector * subfacet_list = nullptr); /// function to check if a node belongs to a given element static inline bool hasElement(const Array & connectivity, const Element & el, const Vector & nodes); /// reset facet_to_double arrays in the Mesh static void resetFacetToDouble(Mesh & mesh_facets); /// associate a node type to each segment in the mesh - static void buildSegmentToNodeType(const Mesh & mesh, Mesh & mesh_facets, - ElementSynchronizer * synchronizer); + static void buildSegmentToNodeType(const Mesh & mesh, Mesh & mesh_facets); /// update local and master global connectivity when new nodes are added static UInt updateLocalMasterGlobalConnectivity(Mesh & mesh, UInt old_nb_nodes); private: /// match pairs that are on the associated pbc's static void matchPBCPairs(const Mesh & mymesh, const UInt dir, Array & selected_left, Array & selected_right, std::map & pbc_pair); /// function used by all the renumbering functions static void renumberNodesInConnectivity(Array & list_nodes, UInt nb_nodes, std::map & renumbering_map); /// update facet_to_subfacet static void updateFacetToSubfacet(Mesh & mesh_facets, ElementType type_subfacet, GhostType gt_subfacet, bool facet_mode); /// update subfacet_to_facet static void updateSubfacetToFacet(Mesh & mesh_facets, ElementType type_subfacet, GhostType gt_subfacet, bool facet_mode); /// function to double a given facet and update the list of doubled /// nodes static void doubleFacet(Mesh & mesh, Mesh & mesh_facets, UInt facet_dimension, Array & doubled_nodes, bool facet_mode); /// function to double a subfacet given start and end index for /// local facet_to_subfacet vector, and update the list of doubled /// nodes template static void doubleSubfacet(Mesh & mesh, Mesh & mesh_facets, Array & doubled_nodes); /// double a node static void doubleNodes(Mesh & mesh, const std::vector & old_nodes, Array & doubled_nodes); /// fill facet_to_double array in the mesh /// returns the number of facets to be doubled static UInt updateFacetToDouble(Mesh & mesh_facets, const ElementTypeMapArray & facet_insertion); /// find subfacets to be doubled template static void findSubfacetToDouble(Mesh & mesh, Mesh & mesh_facets); /// double facets (points) in 1D static void doublePointFacet(Mesh & mesh, Mesh & mesh_facets, Array & doubled_nodes); #if defined(AKANTU_COHESIVE_ELEMENT) /// update cohesive element data static void updateCohesiveData(Mesh & mesh, Mesh & mesh_facets, Array & new_elements); #endif /// update elemental connectivity after doubling a node inline static void updateElementalConnectivity(Mesh & mesh, UInt old_node, UInt new_node, const std::vector & element_list, const std::vector * facet_list = NULL); /// double middle nodes if facets are _segment_3 template static void updateQuadraticSegments(Mesh & mesh, Mesh & mesh_facets, ElementType type_facet, GhostType gt_facet, Array & doubled_nodes); /// remove elements on a vector inline static bool removeElementsInVector(const std::vector & elem_to_remove, std::vector & elem_list); /* ------------------------------------------------------------------------ */ /* Accessors */ /* ------------------------------------------------------------------------ */ public: /* ------------------------------------------------------------------------ */ /* Class Members */ /* ------------------------------------------------------------------------ */ private: }; /* -------------------------------------------------------------------------- */ /* inline functions */ /* -------------------------------------------------------------------------- */ #include "mesh_utils_inline_impl.cc" __END_AKANTU__ #endif /* __AKANTU_MESH_UTILS_HH__ */ diff --git a/src/model/solid_mechanics/materials/material_elastic.cc b/src/model/solid_mechanics/materials/material_elastic.cc index 2f2474e5f..9d6979933 100644 --- a/src/model/solid_mechanics/materials/material_elastic.cc +++ b/src/model/solid_mechanics/materials/material_elastic.cc @@ -1,259 +1,255 @@ /** * @file material_elastic.cc * * @author Lucas Frerot * @author Daniel Pino Muñoz * @author Nicolas Richart * @author Marco Vocialta * * @date creation: Fri Jun 18 2010 * @date last modification: Thu Oct 15 2015 * * @brief Specialization of the material class for the elastic material * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "material_elastic.hh" #include "solid_mechanics_model.hh" /* -------------------------------------------------------------------------- */ - __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ template MaterialElastic::MaterialElastic(SolidMechanicsModel & model, const ID & id) : Material(model, id), Parent(model, id), was_stiffness_assembled(false) { AKANTU_DEBUG_IN(); this->initialize(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template MaterialElastic::MaterialElastic(SolidMechanicsModel & model, __attribute__((unused)) UInt a_dim, const Mesh & mesh, FEEngine & fe_engine, const ID & id) : Material(model, dim, mesh, fe_engine, id), Parent(model, dim, mesh, fe_engine, id), was_stiffness_assembled(false) { AKANTU_DEBUG_IN(); this->initialize(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::initialize() { this->registerParam("lambda", lambda, _pat_readable, "First Lamé coefficient"); this->registerParam("mu", mu, _pat_readable, "Second Lamé coefficient"); this->registerParam("kapa", kpa, _pat_readable, "Bulk coefficient"); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::initMaterial() { AKANTU_DEBUG_IN(); Parent::initMaterial(); if (dim == 1) this->nu = 0.; this->updateInternalParameters(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::updateInternalParameters() { MaterialThermal::updateInternalParameters(); this->lambda = this->nu * this->E / ((1 + this->nu) * (1 - 2 * this->nu)); this->mu = this->E / (2 * (1 + this->nu)); this->kpa = this->lambda + 2. / 3. * this->mu; this->was_stiffness_assembled = false; } /* -------------------------------------------------------------------------- */ template <> void MaterialElastic<2>::updateInternalParameters() { MaterialThermal<2>::updateInternalParameters(); this->lambda = this->nu * this->E / ((1 + this->nu) * (1 - 2 * this->nu)); this->mu = this->E / (2 * (1 + this->nu)); if (this->plane_stress) this->lambda = this->nu * this->E / ((1 + this->nu) * (1 - this->nu)); this->kpa = this->lambda + 2. / 3. * this->mu; this->was_stiffness_assembled = false; } /* -------------------------------------------------------------------------- */ template void MaterialElastic::computeStress(ElementType el_type, GhostType ghost_type) { AKANTU_DEBUG_IN(); Parent::computeStress(el_type, ghost_type); Array::const_scalar_iterator sigma_th_it = this->sigma_th(el_type, ghost_type).begin(); if (!this->finite_deformation) { MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); const Real & sigma_th = *sigma_th_it; this->computeStressOnQuad(grad_u, sigma, sigma_th); ++sigma_th_it; MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; } else { /// finite gradus Matrix E(spatial_dimension, spatial_dimension); MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); /// compute E this->template gradUToGreenStrain(grad_u, E); const Real & sigma_th = *sigma_th_it; /// compute second Piola-Kirchhoff stress tensor this->computeStressOnQuad(E, sigma, sigma_th); ++sigma_th_it; MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::computeTangentModuli( - __attribute__((unused)) const ElementType & el_type, - Array & tangent_matrix, - __attribute__((unused)) GhostType ghost_type) { + const ElementType & el_type, Array & tangent_matrix, GhostType ghost_type) { AKANTU_DEBUG_IN(); MATERIAL_TANGENT_QUADRATURE_POINT_LOOP_BEGIN(tangent_matrix); this->computeTangentModuliOnQuad(tangent); MATERIAL_TANGENT_QUADRATURE_POINT_LOOP_END; this->was_stiffness_assembled = true; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template Real MaterialElastic::getPushWaveSpeed( - __attribute__((unused)) const Element & element) const { + const Element &) const { return sqrt((lambda + 2 * mu) / this->rho); } /* -------------------------------------------------------------------------- */ template Real MaterialElastic::getShearWaveSpeed( - __attribute__((unused)) const Element & element) const { + const Element &) const { return sqrt(mu / this->rho); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::computePotentialEnergy( ElementType el_type, GhostType ghost_type) { AKANTU_DEBUG_IN(); MaterialThermal::computePotentialEnergy(el_type, ghost_type); if (ghost_type != _not_ghost) return; - Array::scalar_iterator epot = - this->potential_energy(el_type, ghost_type).begin(); + + auto epot = this->potential_energy(el_type, ghost_type).begin(); if (!this->finite_deformation) { MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); this->computePotentialEnergyOnQuad(grad_u, sigma, *epot); ++epot; MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; } else { Matrix E(spatial_dimension, spatial_dimension); MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); this->template gradUToGreenStrain(grad_u, E); this->computePotentialEnergyOnQuad(E, sigma, *epot); ++epot; MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void MaterialElastic::computePotentialEnergyByElement( ElementType type, UInt index, Vector & epot_on_quad_points) { - Array::matrix_iterator gradu_it = - this->gradu(type).begin(spatial_dimension, spatial_dimension); - Array::matrix_iterator gradu_end = + auto gradu_it = this->gradu(type).begin(spatial_dimension, spatial_dimension); + auto gradu_end = this->gradu(type).begin(spatial_dimension, spatial_dimension); - Array::matrix_iterator stress_it = + auto stress_it = this->stress(type).begin(spatial_dimension, spatial_dimension); if (this->finite_deformation) - stress_it = this->piola_kirchhoff_2(type) - .begin(spatial_dimension, spatial_dimension); + stress_it = this->piola_kirchhoff_2(type).begin(spatial_dimension, + spatial_dimension); UInt nb_quadrature_points = this->model->getFEEngine().getNbIntegrationPoints(type); gradu_it += index * nb_quadrature_points; gradu_end += (index + 1) * nb_quadrature_points; stress_it += index * nb_quadrature_points; Real * epot_quad = epot_on_quad_points.storage(); Matrix grad_u(spatial_dimension, spatial_dimension); for (; gradu_it != gradu_end; ++gradu_it, ++stress_it, ++epot_quad) { if (this->finite_deformation) this->template gradUToGreenStrain(*gradu_it, grad_u); else grad_u.copy(*gradu_it); this->computePotentialEnergyOnQuad(grad_u, *stress_it, *epot_quad); } } /* -------------------------------------------------------------------------- */ INSTANTIATE_MATERIAL(MaterialElastic); __END_AKANTU__ diff --git a/src/model/solid_mechanics/materials/material_elastic.hh b/src/model/solid_mechanics/materials/material_elastic.hh index fd011833f..f28f92293 100644 --- a/src/model/solid_mechanics/materials/material_elastic.hh +++ b/src/model/solid_mechanics/materials/material_elastic.hh @@ -1,158 +1,158 @@ /** * @file material_elastic.hh * * @author Lucas Frerot * @author Daniel Pino Muñoz * @author Nicolas Richart * * @date creation: Fri Jun 18 2010 * @date last modification: Sun Nov 15 2015 * * @brief Material isotropic elastic * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "material_thermal.hh" #include "plane_stress_toolbox.hh" /* -------------------------------------------------------------------------- */ #ifndef __AKANTU_MATERIAL_ELASTIC_HH__ #define __AKANTU_MATERIAL_ELASTIC_HH__ namespace akantu { /** * Material elastic isotropic * * parameters in the material files : * - E : Young's modulus (default: 0) * - nu : Poisson's ratio (default: 1/2) * - Plane_Stress : if 0: plane strain, else: plane stress (default: 0) */ template class MaterialElastic : public PlaneStressToolbox> { /* ------------------------------------------------------------------------ */ /* Constructors/Destructors */ /* ------------------------------------------------------------------------ */ private: typedef PlaneStressToolbox> Parent; public: MaterialElastic(SolidMechanicsModel & model, const ID & id = ""); MaterialElastic(SolidMechanicsModel & model, UInt dim, const Mesh & mesh, FEEngine & fe_engine, const ID & id = ""); virtual ~MaterialElastic() {} protected: void initialize(); /* ------------------------------------------------------------------------ */ /* Methods */ /* ------------------------------------------------------------------------ */ public: virtual void initMaterial(); /// constitutive law for all element of a type - virtual void computeStress(ElementType el_type, - GhostType ghost_type = _not_ghost); + void computeStress(ElementType el_type, + GhostType ghost_type = _not_ghost) override; /// compute the tangent stiffness matrix for an element type - virtual void computeTangentModuli(const ElementType & el_type, - Array & tangent_matrix, - GhostType ghost_type = _not_ghost); + void computeTangentModuli(const ElementType & el_type, + Array & tangent_matrix, + GhostType ghost_type = _not_ghost) override; /// compute the elastic potential energy - virtual void computePotentialEnergy(ElementType el_type, - GhostType ghost_type = _not_ghost); + void computePotentialEnergy(ElementType el_type, + GhostType ghost_type = _not_ghost) override; virtual void computePotentialEnergyByElement(ElementType type, UInt index, Vector & epot_on_quad_points); /// compute the p-wave speed in the material - virtual Real getPushWaveSpeed(const Element & element) const; + Real getPushWaveSpeed(const Element & element) const override; /// compute the s-wave speed in the material virtual Real getShearWaveSpeed(const Element & element) const; protected: /// constitutive law for a given quadrature point inline void computeStressOnQuad(const Matrix & grad_u, Matrix & sigma, const Real sigma_th = 0) const; /// compute the tangent stiffness matrix for an element inline void computeTangentModuliOnQuad(Matrix & tangent) const; /// recompute the lame coefficient if E or nu changes virtual void updateInternalParameters(); static inline void computePotentialEnergyOnQuad(const Matrix & grad_u, const Matrix & sigma, Real & epot); virtual bool hasStiffnessMatrixChanged() { return (! was_stiffness_assembled); } /* ------------------------------------------------------------------------ */ /* Accessors */ /* ------------------------------------------------------------------------ */ public: /// get first Lame constant AKANTU_GET_MACRO(Lambda, lambda, Real); /// get second Lame constant AKANTU_GET_MACRO(Mu, mu, Real); /// get bulk modulus AKANTU_GET_MACRO(Kappa, kpa, Real); /* ------------------------------------------------------------------------ */ /* Class Members */ /* ------------------------------------------------------------------------ */ protected: /// First Lamé coefficient Real lambda; /// Second Lamé coefficient (shear modulus) Real mu; /// Bulk modulus Real kpa; /// defines if the stiffness was computed bool was_stiffness_assembled; }; } // akantu #include "material_elastic_inline_impl.cc" #endif /* __AKANTU_MATERIAL_ELASTIC_HH__ */ diff --git a/src/model/solid_mechanics/materials/material_finite_deformation/material_neohookean_inline_impl.cc b/src/model/solid_mechanics/materials/material_finite_deformation/material_neohookean_inline_impl.cc index feae8f7a9..e7761ae20 100644 --- a/src/model/solid_mechanics/materials/material_finite_deformation/material_neohookean_inline_impl.cc +++ b/src/model/solid_mechanics/materials/material_finite_deformation/material_neohookean_inline_impl.cc @@ -1,193 +1,190 @@ /** * @file material_neohookean_inline_impl.cc * * @author Daniel Pino Muñoz * * @date creation: Mon Apr 08 2013 * @date last modification: Sun Oct 19 2014 * * @brief Implementation of the inline functions of the material elastic * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ #include #include #include "material_neohookean.hh" -using std::cout; -using std::endl; - /* -------------------------------------------------------------------------- */ template inline void MaterialNeohookean::computeDeltaStressOnQuad( __attribute__((unused)) const Matrix & grad_u, __attribute__((unused)) const Matrix & grad_delta_u, __attribute__((unused)) Matrix & delta_S) {} //! computes the second piola kirchhoff stress, called S template inline void MaterialNeohookean::computeStressOnQuad(Matrix & grad_u, Matrix & S, const Real & C33) { // Neo hookean book Matrix F(dim, dim); Matrix C(dim, dim); // Right green Matrix Cminus(dim, dim); // Right green this->template gradUToF(grad_u, F); this->rightCauchy(F, C); Real J = F.det() * sqrt(C33); // the term sqrt(C33) corresponds to the off // plane strain (2D plane stress) // std::cout<<"det(F) -> "< & C) : NewtonRaphsonFunctor(name), lambda(lambda), mu(mu), C(C) {} inline Real f(Real x) const { return (this->lambda / 2. * (std::log(x) + std::log(this->C(0, 0) * this->C(1, 1) - Math::pow<2>(this->C(0, 1)))) + this->mu * (x - 1.)); } inline Real f_prime(Real x) const { AKANTU_DEBUG_ASSERT(std::abs(x) > Math::getTolerance(), "x is zero (x should be the off plane right Cauchy" << " measure in this function so you made a mistake" << " somewhere else that lead to a zero here!!!"); return (this->lambda / (2. * x) + this->mu); } private: const Real & lambda; const Real & mu; const Matrix & C; }; /* -------------------------------------------------------------------------- */ template inline void MaterialNeohookean::computeThirdAxisDeformationOnQuad( Matrix & grad_u, Real & c33_value) { // Neo hookean book Matrix F(dim, dim); Matrix C(dim, dim); // Right green this->template gradUToF(grad_u, F); this->rightCauchy(F, C); Math::NewtonRaphson nr(1e-5, 100); c33_value = nr.solve( C33_NR("Neohookean_plan_stress", this->lambda, this->mu, C), c33_value); } /* -------------------------------------------------------------------------- */ template inline void MaterialNeohookean::computePiolaKirchhoffOnQuad(const Matrix & E, Matrix & S) { Real trace = E.trace(); /// trace = (\nabla u)_{kk} /// \sigma_{ij} = \lambda * (\nabla u)_{kk} * \delta_{ij} + \mu * (\nabla /// u_{ij} + \nabla u_{ji}) for (UInt i = 0; i < dim; ++i) for (UInt j = 0; j < dim; ++j) S(i, j) = (i == j) * lambda * trace + 2.0 * mu * E(i, j); } /* -------------------------------------------------------------------------- */ template inline void MaterialNeohookean::computeFirstPiolaKirchhoffOnQuad( const Matrix & grad_u, const Matrix & S, Matrix & P) { Matrix F(dim, dim); Matrix C(dim, dim); // Right green this->template gradUToF(grad_u, F); // first Piola-Kirchhoff is computed as the product of the deformation // gracient // tensor and the second Piola-Kirchhoff stress tensor P = F * S; } /**************************************************************************************/ /* Computation of the potential energy for a this neo hookean material */ template inline void MaterialNeohookean::computePotentialEnergyOnQuad( const Matrix & grad_u, Real & epot) { Matrix F(dim, dim); Matrix C(dim, dim); // Right green this->template gradUToF(grad_u, F); this->rightCauchy(F, C); Real J = F.det(); // std::cout<<"det(F) -> "< inline void MaterialNeohookean::computeTangentModuliOnQuad( Matrix & tangent, Matrix & grad_u, const Real & C33) { // Neo hookean book UInt cols = tangent.cols(); UInt rows = tangent.rows(); Matrix F(dim, dim); Matrix C(dim, dim); Matrix Cminus(dim, dim); this->template gradUToF(grad_u, F); this->rightCauchy(F, C); Real J = F.det() * sqrt(C33); // std::cout<<"det(F) -> "<::vec[m][0]; UInt j = VoigtHelper::vec[m][1]; for (UInt n = 0; n < cols; n++) { UInt k = VoigtHelper::vec[n][0]; UInt l = VoigtHelper::vec[n][1]; // book belytchko tangent(m, n) = lambda * Cminus(i, j) * Cminus(k, l) + (mu - lambda * log(J)) * (Cminus(i, k) * Cminus(j, l) + Cminus(i, l) * Cminus(k, j)); } } } /* -------------------------------------------------------------------------- */ diff --git a/src/model/solid_mechanics/materials/material_plastic/material_linear_isotropic_hardening.cc b/src/model/solid_mechanics/materials/material_plastic/material_linear_isotropic_hardening.cc index 2dd8d27e5..6757554d1 100644 --- a/src/model/solid_mechanics/materials/material_plastic/material_linear_isotropic_hardening.cc +++ b/src/model/solid_mechanics/materials/material_plastic/material_linear_isotropic_hardening.cc @@ -1,216 +1,203 @@ /** * @file material_linear_isotropic_hardening.cc * * @author Ramin Aghababaei * @author Lucas Frerot * @author Benjamin Paccaud * @author Daniel Pino Muñoz * @author Nicolas Richart * * @date creation: Mon Apr 07 2014 * @date last modification: Tue Aug 18 2015 * - * @brief Specialization of the material class for isotropic finite deformation linear hardening plasticity + * @brief Specialization of the material class for isotropic finite deformation + * linear hardening plasticity * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "material_linear_isotropic_hardening.hh" #include "solid_mechanics_model.hh" __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ -template -MaterialLinearIsotropicHardening::MaterialLinearIsotropicHardening(SolidMechanicsModel & model, - const ID & id) : - Material(model, id), MaterialPlastic(model, id) { +template +MaterialLinearIsotropicHardening::MaterialLinearIsotropicHardening( + SolidMechanicsModel & model, const ID & id) + : Material(model, id), MaterialPlastic(model, id) { AKANTU_DEBUG_IN(); - + AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ -template -MaterialLinearIsotropicHardening::MaterialLinearIsotropicHardening( - SolidMechanicsModel & model, - UInt dim, - const Mesh & mesh, - FEEngine & fe_engine, - const ID & id) : - - Material(model, dim, mesh, fe_engine, id), - MaterialPlastic(model, dim, mesh, fe_engine, id) -{} +template +MaterialLinearIsotropicHardening:: + MaterialLinearIsotropicHardening(SolidMechanicsModel & model, UInt dim, + const Mesh & mesh, FEEngine & fe_engine, + const ID & id) + : + Material(model, dim, mesh, fe_engine, id), + MaterialPlastic(model, dim, mesh, fe_engine, id) {} /* -------------------------------------------------------------------------- */ -template -void MaterialLinearIsotropicHardening::computeStress(ElementType el_type, GhostType ghost_type) { +template +void MaterialLinearIsotropicHardening::computeStress( + ElementType el_type, GhostType ghost_type) { AKANTU_DEBUG_IN(); MaterialThermal::computeStress(el_type, ghost_type); // infinitesimal and finite deformation - Array::iterator<> sigma_th_it = - this->sigma_th(el_type, ghost_type).begin(); + auto sigma_th_it = this->sigma_th(el_type, ghost_type).begin(); - Array::iterator<> previous_sigma_th_it = - this->sigma_th.previous(el_type, ghost_type).begin(); + auto previous_sigma_th_it = + this->sigma_th.previous(el_type, ghost_type).begin(); - Array::matrix_iterator previous_gradu_it = - this->gradu.previous(el_type, ghost_type).begin(spatial_dimension, spatial_dimension); + auto previous_gradu_it = this->gradu.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::matrix_iterator previous_stress_it = - this->stress.previous(el_type, ghost_type).begin(spatial_dimension, spatial_dimension); + auto previous_stress_it = this->stress.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::matrix_iterator inelastic_strain_it = - this->inelastic_strain(el_type, ghost_type).begin(spatial_dimension,spatial_dimension); + auto inelastic_strain_it = this->inelastic_strain(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::matrix_iterator previous_inelastic_strain_it = - this->inelastic_strain.previous(el_type, ghost_type).begin(spatial_dimension,spatial_dimension); + auto previous_inelastic_strain_it = + this->inelastic_strain.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::iterator<> iso_hardening_it = - this->iso_hardening(el_type, ghost_type).begin(); - - Array::iterator<> previous_iso_hardening_it = - this->iso_hardening.previous(el_type, ghost_type).begin(); - + auto iso_hardening_it = this->iso_hardening(el_type, ghost_type).begin(); + auto previous_iso_hardening_it = + this->iso_hardening.previous(el_type, ghost_type).begin(); // // Finite Deformations // if (this->finite_deformation) { - Array::matrix_iterator previous_piola_kirchhoff_2_it = - this->piola_kirchhoff_2.previous(el_type, ghost_type).begin(spatial_dimension, spatial_dimension); - - Array::matrix_iterator green_strain_it = - this->green_strain(el_type, ghost_type).begin(spatial_dimension,spatial_dimension); + auto previous_piola_kirchhoff_2_it = + this->piola_kirchhoff_2.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); + + auto green_strain_it = this->green_strain(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); - Matrix & inelastic_strain_tensor = *inelastic_strain_it; - Matrix & previous_inelastic_strain_tensor = *previous_inelastic_strain_it; - Matrix & previous_grad_u = *previous_gradu_it; - Matrix & previous_sigma = *previous_piola_kirchhoff_2_it; + auto & inelastic_strain_tensor = *inelastic_strain_it; + auto & previous_inelastic_strain_tensor = *previous_inelastic_strain_it; + auto & previous_grad_u = *previous_gradu_it; + auto & previous_sigma = *previous_piola_kirchhoff_2_it; - Matrix & green_strain = *green_strain_it; + auto & green_strain = *green_strain_it; this->template gradUToGreenStrain(grad_u, green_strain); - Matrix previous_green_strain(spatial_dimension,spatial_dimension); - this->template gradUToGreenStrain(previous_grad_u, previous_green_strain); - Matrix F_tensor(spatial_dimension,spatial_dimension); - this->template gradUToF(grad_u,F_tensor); - - computeStressOnQuad(green_strain, - previous_green_strain, - sigma, - previous_sigma, - inelastic_strain_tensor, - previous_inelastic_strain_tensor, - *iso_hardening_it, - *previous_iso_hardening_it, - *sigma_th_it, - *previous_sigma_th_it, - F_tensor); - - ++sigma_th_it; - ++inelastic_strain_it; - ++iso_hardening_it; - ++previous_sigma_th_it; - //++previous_stress_it; - ++previous_gradu_it; - ++green_strain_it; - ++previous_inelastic_strain_it; - ++previous_iso_hardening_it; - ++previous_piola_kirchhoff_2_it; - - MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; + Matrix previous_green_strain(spatial_dimension, spatial_dimension); + this->template gradUToGreenStrain(previous_grad_u, + previous_green_strain); + Matrix F_tensor(spatial_dimension, spatial_dimension); + this->template gradUToF(grad_u, F_tensor); + + computeStressOnQuad(green_strain, previous_green_strain, sigma, + previous_sigma, inelastic_strain_tensor, + previous_inelastic_strain_tensor, *iso_hardening_it, + *previous_iso_hardening_it, *sigma_th_it, + *previous_sigma_th_it, F_tensor); - } + ++sigma_th_it; + ++inelastic_strain_it; + ++iso_hardening_it; + ++previous_sigma_th_it; + //++previous_stress_it; + ++previous_gradu_it; + ++green_strain_it; + ++previous_inelastic_strain_it; + ++previous_iso_hardening_it; + ++previous_piola_kirchhoff_2_it; + + MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; + + } // Infinitesimal deformations else { MATERIAL_STRESS_QUADRATURE_POINT_LOOP_BEGIN(el_type, ghost_type); - Matrix & inelastic_strain_tensor = *inelastic_strain_it; - Matrix & previous_inelastic_strain_tensor = *previous_inelastic_strain_it; - Matrix & previous_grad_u = *previous_gradu_it; - Matrix & previous_sigma = *previous_stress_it; - - computeStressOnQuad(grad_u, - previous_grad_u, - sigma, - previous_sigma, - inelastic_strain_tensor, - previous_inelastic_strain_tensor, - *iso_hardening_it, - *previous_iso_hardening_it, - *sigma_th_it, - *previous_sigma_th_it); + auto & inelastic_strain_tensor = *inelastic_strain_it; + auto & previous_inelastic_strain_tensor = *previous_inelastic_strain_it; + auto & previous_grad_u = *previous_gradu_it; + auto & previous_sigma = *previous_stress_it; + + computeStressOnQuad( + grad_u, previous_grad_u, sigma, previous_sigma, inelastic_strain_tensor, + previous_inelastic_strain_tensor, *iso_hardening_it, + *previous_iso_hardening_it, *sigma_th_it, *previous_sigma_th_it); ++sigma_th_it; ++inelastic_strain_it; ++iso_hardening_it; ++previous_sigma_th_it; ++previous_stress_it; ++previous_gradu_it; ++previous_inelastic_strain_it; ++previous_iso_hardening_it; MATERIAL_STRESS_QUADRATURE_POINT_LOOP_END; } - + AKANTU_DEBUG_OUT(); } - /* -------------------------------------------------------------------------- */ -template -void MaterialLinearIsotropicHardening::computeTangentModuli(__attribute__((unused)) const ElementType & el_type, - Array & tangent_matrix, - __attribute__((unused)) GhostType ghost_type) { +template +void MaterialLinearIsotropicHardening::computeTangentModuli( + const ElementType & el_type, Array & tangent_matrix, + GhostType ghost_type) { AKANTU_DEBUG_IN(); - Array::const_matrix_iterator previous_gradu_it = - this->gradu.previous(el_type, ghost_type).begin(spatial_dimension, spatial_dimension); + auto previous_gradu_it = this->gradu.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::const_matrix_iterator previous_stress_it = - this->stress.previous(el_type, ghost_type).begin(spatial_dimension, spatial_dimension); + auto previous_stress_it = this->stress.previous(el_type, ghost_type) + .begin(spatial_dimension, spatial_dimension); - Array::const_scalar_iterator iso_hardening= this->iso_hardening(el_type, ghost_type).begin(); + auto iso_hardening = this->iso_hardening(el_type, ghost_type).begin(); MATERIAL_TANGENT_QUADRATURE_POINT_LOOP_BEGIN(tangent_matrix); - computeTangentModuliOnQuad(tangent, grad_u, *previous_gradu_it, sigma_tensor, *previous_stress_it, *iso_hardening); + computeTangentModuliOnQuad(tangent, grad_u, *previous_gradu_it, sigma_tensor, + *previous_stress_it, *iso_hardening); ++previous_gradu_it; ++previous_stress_it; ++iso_hardening; MATERIAL_TANGENT_QUADRATURE_POINT_LOOP_END; + this->was_stiffness_assembled = true; + AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ INSTANTIATE_MATERIAL(MaterialLinearIsotropicHardening); __END_AKANTU__ diff --git a/src/model/solid_mechanics/materials/material_plastic/material_plastic.hh b/src/model/solid_mechanics/materials/material_plastic/material_plastic.hh index d4072311e..45b9107c7 100644 --- a/src/model/solid_mechanics/materials/material_plastic/material_plastic.hh +++ b/src/model/solid_mechanics/materials/material_plastic/material_plastic.hh @@ -1,142 +1,142 @@ /** * @file material_plastic.hh * * @author Daniel Pino Muñoz * @author Nicolas Richart * * @date creation: Fri Jun 18 2010 * @date last modification: Thu Oct 08 2015 * * @brief Common interface for plastic materials * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "material_elastic.hh" /* -------------------------------------------------------------------------- */ #ifndef __AKANTU_MATERIAL_PLASTIC_HH__ #define __AKANTU_MATERIAL_PLASTIC_HH__ __BEGIN_AKANTU__ /** * Parent class for the plastic constitutive laws * parameters in the material files : * - h : Hardening parameter (default: 0) * - sigmay : Yield stress */ template class MaterialPlastic : public MaterialElastic { /* ------------------------------------------------------------------------ */ /* Constructors/Destructors */ /* ------------------------------------------------------------------------ */ public: MaterialPlastic(SolidMechanicsModel & model, const ID & id = ""); MaterialPlastic(SolidMechanicsModel & model, UInt a_dim, const Mesh & mesh, FEEngine & fe_engine, const ID & id = ""); protected: void initialize(); /* ------------------------------------------------------------------------ */ /* Methods */ /* ------------------------------------------------------------------------ */ public: /// get the energy specifying the type for the time step - virtual Real getEnergy(std::string type); + Real getEnergy(std::string type) override; /// Compute the plastic energy virtual void updateEnergies(ElementType el_type, GhostType ghost_type = _not_ghost); /// Compute the true potential energy - virtual void computePotentialEnergy(ElementType el_type, GhostType ghost_type); + void computePotentialEnergy(ElementType el_type, GhostType ghost_type) override; protected: /// compute the stress and inelastic strain for the quadrature point inline void computeStressAndInelasticStrainOnQuad(const Matrix & grad_u, const Matrix & previous_grad_u, Matrix & sigma, const Matrix & previous_sigma, Matrix & inelas_strain, const Matrix & previous_inelas_strain, const Matrix & delta_inelastic_strain) const; inline void computeStressAndInelasticStrainOnQuad(const Matrix & delta_grad_u, Matrix & sigma, const Matrix & previous_sigma, Matrix & inelas_strain, const Matrix & previous_inelas_strain, const Matrix & delta_inelastic_strain) const; /// get the plastic energy for the time step Real getPlasticEnergy(); /* ------------------------------------------------------------------------ */ /* Accessors */ /* ------------------------------------------------------------------------ */ public: /* ------------------------------------------------------------------------ */ /* Class Members */ /* ------------------------------------------------------------------------ */ protected: /// Yield stresss Real sigma_y; /// hardening modulus Real h; /// isotropic hardening, r InternalField iso_hardening; /// inelastic strain arrays ordered by element types (inelastic deformation) InternalField inelastic_strain; /// Plastic energy InternalField plastic_energy; /// @todo : add a coefficient beta that will multiply the plastic energy increment /// to compute the energy converted to heat /// Plastic energy increment InternalField d_plastic_energy; }; /* -------------------------------------------------------------------------- */ /* inline functions */ /* -------------------------------------------------------------------------- */ #include "material_plastic_inline_impl.cc" __END_AKANTU__ #endif /* __AKANTU_MATERIAL_PLASTIC_HH__ */ diff --git a/src/model/solid_mechanics/solid_mechanics_model.cc b/src/model/solid_mechanics/solid_mechanics_model.cc index b134ffc57..e911db3fe 100644 --- a/src/model/solid_mechanics/solid_mechanics_model.cc +++ b/src/model/solid_mechanics/solid_mechanics_model.cc @@ -1,1513 +1,1514 @@ /** * @file solid_mechanics_model.cc * * @author Ramin Aghababaei * @author Guillaume Anciaux * @author Aurelia Isabel Cuba Ramos * @author David Simon Kammer * @author Daniel Pino Muñoz * @author Nicolas Richart * @author Clement Roux * @author Marco Vocialta * * @date creation: Tue Jul 27 2010 * @date last modification: Tue Jan 19 2016 * * @brief Implementation of the SolidMechanicsModel class * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "solid_mechanics_model.hh" #include "aka_math.hh" #include "element_group.hh" #include "element_synchronizer.hh" #include "group_manager_inline_impl.cc" #include "static_communicator.hh" #include "synchronizer_registry.hh" #include "sparse_matrix.hh" #include "dumpable_inline_impl.hh" #ifdef AKANTU_USE_IOHELPER #include "dumper_element_partition.hh" #include "dumper_elemental_field.hh" #include "dumper_field.hh" #include "dumper_homogenizing_field.hh" #include "dumper_internal_material_field.hh" #include "dumper_iohelper.hh" #include "dumper_material_padders.hh" #include "dumper_paraview.hh" #endif #ifdef AKANTU_DAMAGE_NON_LOCAL #include "non_local_manager.hh" #endif /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ const SolidMechanicsModelOptions default_solid_mechanics_model_options(_explicit_lumped_mass, false); /* -------------------------------------------------------------------------- */ /** * A solid mechanics model need a mesh and a dimension to be created. the model * by it self can not do a lot, the good init functions should be called in * order to configure the model depending on what we want to do. * * @param mesh mesh representing the model we want to simulate * @param dim spatial dimension of the problem, if dim = 0 (default value) the * dimension of the problem is assumed to be the on of the mesh * @param id an id to identify the model */ SolidMechanicsModel::SolidMechanicsModel(Mesh & mesh, UInt dim, const ID & id, const MemoryID & memory_id) : Model(mesh, dim, id, memory_id), BoundaryCondition(), f_m2a(1.0), displacement(NULL), previous_displacement(NULL), displacement_increment(NULL), mass(NULL), velocity(NULL), acceleration(NULL), external_force(NULL), internal_force(NULL), blocked_dofs(NULL), current_position(NULL), mass_matrix(NULL), velocity_damping_matrix(NULL), stiffness_matrix(NULL), jacobian_matrix(NULL), material_index("material index", id, memory_id), material_local_numbering("material local numbering", id, memory_id), material_selector(new DefaultMaterialSelector(material_index)), is_default_material_selector(true), increment_flag(false), are_materials_instantiated(false), non_local_manager(NULL) { //, pbc_synch(NULL) { AKANTU_DEBUG_IN(); this->registerFEEngineObject("SolidMechanicsFEEngine", mesh, spatial_dimension); this->mesh.registerEventHandler(*this); #if defined(AKANTU_USE_IOHELPER) this->mesh.registerDumper("paraview_all", id, true); this->mesh.addDumpMesh(mesh, spatial_dimension, _not_ghost, _ek_regular); #endif this->initDOFManager(); this->registerDataAccessor(*this); if (this->mesh.isDistributed()) { auto & synchronizer = this->mesh.getElementSynchronizer(); this->registerSynchronizer(synchronizer, _gst_material_id); this->registerSynchronizer(synchronizer, _gst_smm_mass); this->registerSynchronizer(synchronizer, _gst_smm_stress); this->registerSynchronizer(synchronizer, _gst_smm_boundary); this->registerSynchronizer(synchronizer, _gst_for_dump); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ SolidMechanicsModel::~SolidMechanicsModel() { AKANTU_DEBUG_IN(); if (is_default_material_selector) { delete material_selector; material_selector = NULL; } for (auto & internal : this->registered_internals) { delete internal.second; } #ifdef AKANTU_DAMAGE_NON_LOCAL delete non_local_manager; non_local_manager = NULL; #endif // delete pbc_synch; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::setTimeStep(Real time_step, const ID & solver_id) { Model::setTimeStep(time_step, solver_id); #if defined(AKANTU_USE_IOHELPER) this->mesh.getDumper().setTimeStep(time_step); #endif } /* -------------------------------------------------------------------------- */ /* Initialization */ /* -------------------------------------------------------------------------- */ /** * This function groups many of the initialization in on function. For most of * basics case the function should be enough. The functions initialize the * model, the internal vectors, set them to 0, and depending on the parameters * it also initialize the explicit or implicit solver. * * @param material_file the file containing the materials to use * @param method the analysis method wanted. See the akantu::AnalysisMethod for * the different possibilities */ void SolidMechanicsModel::initFull(const ModelOptions & options) { Model::initFull(options); const SolidMechanicsModelOptions & smm_options = dynamic_cast(options); this->method = smm_options.analysis_method; // initialize the vectors this->initArrays(); if (!this->hasDefaultSolver()) this->initNewSolver(this->method); // initialize pbc if (this->pbc_pair.size() != 0) this->initPBC(); #ifdef AKANTU_DAMAGE_NON_LOCAL /// create the non-local manager object for non-local damage computations std::stringstream nl_manager_name; nl_manager_name << "NLManager" << this->id; this->non_local_manager = new NonLocalManager(*this, nl_manager_name.str(), this->memory_id); #endif // initialize the materials if (this->parser->getLastParsedFile() != "") { this->instantiateMaterials(); } if (!smm_options.no_init_materials) { this->initMaterials(); } // if (increment_flag) this->initBC(*this, *displacement, *displacement_increment, *external_force); // else // this->initBC(*this, *displacement, *external_force); } /* -------------------------------------------------------------------------- */ TimeStepSolverType SolidMechanicsModel::getDefaultSolverType() const { return _tsst_dynamic_lumped; } /* -------------------------------------------------------------------------- */ ModelSolverOptions SolidMechanicsModel::getDefaultSolverOptions( const TimeStepSolverType & type) const { ModelSolverOptions options; switch (type) { case _tsst_dynamic_lumped: { options.non_linear_solver_type = _nls_lumped; options.integration_scheme_type["displacement"] = _ist_central_difference; options.solution_type["displacement"] = IntegrationScheme::_acceleration; break; } case _tsst_static: { options.non_linear_solver_type = _nls_newton_raphson; options.integration_scheme_type["displacement"] = _ist_pseudo_time; options.solution_type["displacement"] = IntegrationScheme::_not_defined; break; } case _tsst_dynamic: { if (this->method == _explicit_consistent_mass) { options.non_linear_solver_type = _nls_newton_raphson; options.integration_scheme_type["displacement"] = _ist_central_difference; options.solution_type["displacement"] = IntegrationScheme::_acceleration; } else { options.non_linear_solver_type = _nls_newton_raphson; options.integration_scheme_type["displacement"] = _ist_trapezoidal_rule_2; options.solution_type["displacement"] = IntegrationScheme::_displacement; } break; } } return options; } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::initNewSolver(const AnalysisMethod & method) { ID solver_name; TimeStepSolverType tss_type; this->method = method; switch (this->method) { case _explicit_lumped_mass: { solver_name = "explicit_lumped"; tss_type = _tsst_dynamic_lumped; break; } case _explicit_consistent_mass: { solver_name = "explicit"; tss_type = _tsst_dynamic; break; } case _static: { solver_name = "static"; tss_type = _tsst_static; break; } case _implicit_dynamic: { solver_name = "implicit"; tss_type = _tsst_dynamic; break; } } if (!this->hasSolver(solver_name)) { ModelSolverOptions options = this->getDefaultSolverOptions(tss_type); this->getNewSolver(solver_name, tss_type, options.non_linear_solver_type); this->setIntegrationScheme(solver_name, "displacement", options.integration_scheme_type["displacement"], options.solution_type["displacement"]); this->setDefaultSolver(solver_name); } } /* -------------------------------------------------------------------------- */ template void SolidMechanicsModel::allocNodalField(Array *& array, __attribute__((unused)) UInt nb_component, const ID & name) { if (array == NULL) { UInt nb_nodes = mesh.getNbNodes(); std::stringstream sstr_disp; sstr_disp << id << ":" << name; array = &(alloc(sstr_disp.str(), nb_nodes, spatial_dimension, T())); } } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::initSolver( TimeStepSolverType time_step_solver_type, __attribute__((unused)) NonLinearSolverType non_linear_solver_type) { DOFManager & dof_manager = this->getDOFManager(); /* ------------------------------------------------------------------------ */ // for alloc type of solvers this->allocNodalField(this->displacement, spatial_dimension, "displacement"); this->allocNodalField(this->previous_displacement, spatial_dimension, "previous_displacement"); this->allocNodalField(this->displacement_increment, spatial_dimension, "displacement_increment"); this->allocNodalField(this->internal_force, spatial_dimension, "internal_force"); this->allocNodalField(this->external_force, spatial_dimension, "external_force"); this->allocNodalField(this->blocked_dofs, spatial_dimension, "blocked_dofs"); this->allocNodalField(this->current_position, spatial_dimension, "current_position"); /* ------------------------------------------------------------------------ */ if (!dof_manager.hasDOFs("displacement")) { dof_manager.registerDOFs("displacement", *this->displacement, _dst_nodal); dof_manager.registerBlockedDOFs("displacement", *this->blocked_dofs); dof_manager.registerDOFsIncrement("displacement", *this->displacement_increment); dof_manager.registerDOFsPrevious("displacement", *this->previous_displacement); } /* ------------------------------------------------------------------------ */ // for dynamic if (time_step_solver_type == _tsst_dynamic || time_step_solver_type == _tsst_dynamic_lumped) { this->allocNodalField(this->velocity, spatial_dimension, "velocity"); this->allocNodalField(this->acceleration, spatial_dimension, "acceleration"); if (!dof_manager.hasDOFsDerivatives("displacement", 1)) { dof_manager.registerDOFsDerivative("displacement", 1, *this->velocity); dof_manager.registerDOFsDerivative("displacement", 2, *this->acceleration); } } if (time_step_solver_type == _tsst_dynamic || time_step_solver_type == _tsst_static) { if (!dof_manager.hasMatrix("K")) { dof_manager.getNewMatrix("K", _symmetric); } if (!dof_manager.hasMatrix("J")) { dof_manager.getNewMatrix("J", "K"); } } } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::initParallel(MeshPartition & partition, // DataAccessor * data_accessor) // { // AKANTU_DEBUG_IN(); // if (data_accessor == NULL) // data_accessor = this; // synch_parallel = &createParallelSynch(partition, *data_accessor); // synch_registry->registerSynchronizer(*synch_parallel, _gst_material_id); // synch_registry->registerSynchronizer(*synch_parallel, _gst_smm_mass); // synch_registry->registerSynchronizer(*synch_parallel, _gst_smm_stress); // synch_registry->registerSynchronizer(*synch_parallel, _gst_smm_boundary); // synch_registry->registerSynchronizer(*synch_parallel, _gst_for_dump); // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::initFEEngineBoundary() { FEEngine & fem_boundary = getFEEngineBoundary(); fem_boundary.initShapeFunctions(_not_ghost); fem_boundary.initShapeFunctions(_ghost); fem_boundary.computeNormalsOnIntegrationPoints(_not_ghost); fem_boundary.computeNormalsOnIntegrationPoints(_ghost); } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::initArraysPreviousDisplacment() { // AKANTU_DEBUG_IN(); // this->setIncrementFlagOn(); // if (not this->previous_displacement) { // this->allocNodalField(this->previous_displacement, spatial_dimension, // "previous_displacement"); // this->getDOFManager().registerDOFsPrevious("displacement", // *this->previous_displacement); // } // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ /** * Allocate all the needed vectors. By default their are not necessarily set to * 0 */ void SolidMechanicsModel::initArrays() { AKANTU_DEBUG_IN(); for (auto ghost_type : ghost_types) { for (auto type : mesh.elementTypes(spatial_dimension, ghost_type, _ek_not_defined)) { UInt nb_element = mesh.getNbElement(type, ghost_type); this->material_index.alloc(nb_element, 1, type, ghost_type); this->material_local_numbering.alloc(nb_element, 1, type, ghost_type); } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ /** * Initialize the model,basically it pre-compute the shapes, shapes derivatives * and jacobian * */ void SolidMechanicsModel::initModel() { /// \todo add the current position as a parameter to initShapeFunctions for /// large deformation getFEEngine().initShapeFunctions(_not_ghost); getFEEngine().initShapeFunctions(_ghost); } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::initPBC() { // Model::initPBC(); // registerPBCSynchronizer(); // // as long as there are ones on the diagonal of the matrix, we can put // // boudandary true for slaves // std::map::iterator it = pbc_pair.begin(); // std::map::iterator end = pbc_pair.end(); // UInt dim = mesh.getSpatialDimension(); // while (it != end) { // for (UInt i = 0; i < dim; ++i) // (*blocked_dofs)((*it).first, i) = true; // ++it; // } // } // /* -------------------------------------------------------------------------- // */ // void SolidMechanicsModel::registerPBCSynchronizer() { // pbc_synch = new PBCSynchronizer(pbc_pair); // synch_registry->registerSynchronizer(*pbc_synch, _gst_smm_uv); // synch_registry->registerSynchronizer(*pbc_synch, _gst_smm_mass); // synch_registry->registerSynchronizer(*pbc_synch, _gst_smm_res); // synch_registry->registerSynchronizer(*pbc_synch, _gst_for_dump); // // changeLocalEquationNumberForPBC(pbc_pair, mesh.getSpatialDimension()); // } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::assembleResidual() { AKANTU_DEBUG_IN(); /* ------------------------------------------------------------------------ */ // computes the internal forces this->assembleInternalForces(); /* ------------------------------------------------------------------------ */ this->getDOFManager().assembleToResidual("displacement", *this->external_force, 1); this->getDOFManager().assembleToResidual("displacement", *this->internal_force, -1); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::assembleJacobian() { this->assembleStiffnessMatrix(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::predictor() {} /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::corrector() {} /* -------------------------------------------------------------------------- */ /** * This function computes the internal forces as F_{int} = \int_{\Omega} N * \sigma d\Omega@f$ */ void SolidMechanicsModel::assembleInternalForces() { AKANTU_DEBUG_IN(); AKANTU_DEBUG_INFO("Assemble the internal forces"); this->internal_force->clear(); // compute the stresses of local elements AKANTU_DEBUG_INFO("Compute local stresses"); for (auto & material : materials) { material->computeAllStresses(_not_ghost); } #ifdef AKANTU_DAMAGE_NON_LOCAL /* ------------------------------------------------------------------------ */ /* Computation of the non local part */ this->non_local_manager->computeAllNonLocalStresses(); #endif // communicate the stresses AKANTU_DEBUG_INFO("Send data for residual assembly"); this->asynchronousSynchronize(_gst_smm_stress); // assemble the forces due to local stresses AKANTU_DEBUG_INFO("Assemble residual for local elements"); for (auto & material : materials) { material->assembleInternalForces(_not_ghost); } // finalize communications AKANTU_DEBUG_INFO("Wait distant stresses"); this->waitEndSynchronize(_gst_smm_stress); // assemble the stresses due to ghost elements AKANTU_DEBUG_INFO("Assemble residual for ghost elements"); for (auto & material : materials) { material->assembleInternalForces(_ghost); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::assembleStiffnessMatrix() { AKANTU_DEBUG_IN(); AKANTU_DEBUG_INFO("Assemble the new stiffness matrix."); // Check if materials need to recompute the matrix bool need_to_reassemble = false; for (auto & material : materials) { need_to_reassemble |= material->hasStiffnessMatrixChanged(); } if (need_to_reassemble) { this->getDOFManager().getMatrix("K").clear(); // call compute stiffness matrix on each local elements for (auto & material : materials) { material->assembleStiffnessMatrix(_not_ghost); } } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::updateCurrentPosition() { AKANTU_DEBUG_IN(); this->current_position->copy(this->mesh.getNodes()); auto cpos_it = this->current_position->begin(spatial_dimension); auto cpos_end = this->current_position->end(spatial_dimension); auto disp_it = this->displacement->begin(spatial_dimension); for (; cpos_it != cpos_end; ++cpos_it, ++disp_it) { *cpos_it += *disp_it; } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::initializeUpdateResidualData() { // AKANTU_DEBUG_IN(); // UInt nb_nodes = mesh.getNbNodes(); // internal_force->resize(nb_nodes); // /// copy the forces in residual for boundary conditions // this->getDOFManager().assembleToResidual("displacement", // *this->external_force); // // start synchronization // this->asynchronousSynchronize(_gst_smm_uv); // this->waitEndSynchronize(_gst_smm_uv); // this->updateCurrentPosition(); // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ /* Explicit scheme */ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::computeStresses() { // if (isExplicit()) { // // start synchronization // this->asynchronousSynchronize(_gst_smm_uv); // this->waitEndSynchronize(_gst_smm_uv); // // compute stresses on all local elements for each materials // std::vector::iterator mat_it; // for (mat_it = materials.begin(); mat_it != materials.end(); ++mat_it) { // Material & mat = **mat_it; // mat.computeAllStresses(_not_ghost); // } // #ifdef AKANTU_DAMAGE_NON_LOCAL // /* Computation of the non local part */ // this->non_local_manager->computeAllNonLocalStresses(); // #endif // } else { // std::vector::iterator mat_it; // for (mat_it = materials.begin(); mat_it != materials.end(); ++mat_it) { // Material & mat = **mat_it; // mat.computeAllStressesFromTangentModuli(_not_ghost); // } // } // } /* -------------------------------------------------------------------------- */ /* Implicit scheme */ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ // /** // * Initialize the solver and create the sparse matrices needed. // * // */ // void SolidMechanicsModel::initSolver(__attribute__((unused)) // SolverOptions & options) { // UInt nb_global_nodes = mesh.getNbGlobalNodes(); // jacobian_matrix = &(this->getDOFManager().getNewMatrix("jacobian", // _symmetric)); // // jacobian_matrix->buildProfile(mesh, *dof_synchronizer, // spatial_dimension); // if (!isExplicit()) { // delete stiffness_matrix; // std::stringstream sstr_sti; // sstr_sti << id << ":stiffness_matrix"; // stiffness_matrix = &(this->getDOFManager().getNewMatrix("stiffness", // _symmetric)); // } // if (solver) solver->initialize(options); // } // /* -------------------------------------------------------------------------- // */ // void SolidMechanicsModel::initJacobianMatrix() { // // @todo make it more flexible: this is an ugly patch to treat the case of // non // // fix profile of the K matrix // delete jacobian_matrix; // jacobian_matrix = &(this->getDOFManager().getNewMatrix("jacobian", // "stiffness")); // std::stringstream sstr_solv; sstr_solv << id << ":solver"; // delete solver; // solver = new SolverMumps(*jacobian_matrix, sstr_solv.str()); // if(solver) // solver->initialize(_solver_no_options); // } /* -------------------------------------------------------------------------- */ /** * Initialize the implicit solver, either for dynamic or static cases, * * @param dynamic */ // void SolidMechanicsModel::initImplicit(bool dynamic) { // AKANTU_DEBUG_IN(); // method = dynamic ? _implicit_dynamic : _static; // if (!increment) // setIncrementFlagOn(); // initSolver(); // // if(method == _implicit_dynamic) { // // if(integrator) delete integrator; // // integrator = new TrapezoidalRule2(); // // } // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ // SparseMatrix & SolidMechanicsModel::initVelocityDampingMatrix() { // return this->getDOFManager().getNewMatrix("velocity_damping", "jacobian"); // } // /* -------------------------------------------------------------------------- // */ // void SolidMechanicsModel::implicitPred() { // AKANTU_DEBUG_IN(); // if(previous_displacement) previous_displacement->copy(*displacement); // if(method == _implicit_dynamic) // integrator->integrationSchemePred(time_step, // *displacement, // *velocity, // *acceleration, // *blocked_dofs); // AKANTU_DEBUG_OUT(); // } // /* -------------------------------------------------------------------------- // */ // void SolidMechanicsModel::implicitCorr() { // AKANTU_DEBUG_IN(); // if(method == _implicit_dynamic) { // integrator->integrationSchemeCorrDispl(time_step, // *displacement, // *velocity, // *acceleration, // *blocked_dofs, // *increment); // } else { // UInt nb_nodes = displacement->getSize(); // UInt nb_degree_of_freedom = displacement->getNbComponent() * nb_nodes; // Real * incr_val = increment->storage(); // Real * disp_val = displacement->storage(); // bool * boun_val = blocked_dofs->storage(); // for (UInt j = 0; j < nb_degree_of_freedom; ++j, ++disp_val, ++incr_val, // ++boun_val){ // *incr_val *= (1. - *boun_val); // *disp_val += *incr_val; // } // } // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::updateIncrement() { // AKANTU_DEBUG_IN(); // auto incr_it = this->displacement_increment->begin(spatial_dimension); // auto incr_end = this->displacement_increment->end(spatial_dimension); // auto disp_it = this->displacement->begin(spatial_dimension); // auto prev_disp_it = this->previous_displacement->begin(spatial_dimension); // for (; incr_it != incr_end; ++incr_it) { // *incr_it = *disp_it; // *incr_it -= *prev_disp_it; // } // AKANTU_DEBUG_OUT(); // } // /* -------------------------------------------------------------------------- // */ void SolidMechanicsModel::updatePreviousDisplacement() { // AKANTU_DEBUG_IN(); // AKANTU_DEBUG_ASSERT( // previous_displacement, // "The previous displacement has to be initialized." // << " Are you working with Finite or Ineslactic deformations?"); // previous_displacement->copy(*displacement); // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::updateDataForNonLocalCriterion( ElementTypeMapReal & criterion) { const ID field_name = criterion.getName(); for (auto & material : materials) { - if (material->isInternal(field_name, _ek_regular)) - for (UInt g = _not_ghost; g <= _ghost; ++g) { - GhostType ghost_type = (GhostType)g; - material->flattenInternal(field_name, criterion, ghost_type, - _ek_regular); - } + if (!material->isInternal(field_name, _ek_regular)) + continue; + + for (auto ghost_type : ghost_types) { + material->flattenInternal(field_name, criterion, ghost_type, + _ek_regular); + } } } /* -------------------------------------------------------------------------- */ /* Information */ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -void SolidMechanicsModel::synchronizeBoundaries() { - AKANTU_DEBUG_IN(); - this->synchronize(_gst_smm_boundary); - AKANTU_DEBUG_OUT(); -} +// void SolidMechanicsModel::synchronizeBoundaries() { +// AKANTU_DEBUG_IN(); +// this->synchronize(_gst_smm_boundary); +// AKANTU_DEBUG_OUT(); +// } -/* -------------------------------------------------------------------------- */ -void SolidMechanicsModel::synchronizeResidual() { - AKANTU_DEBUG_IN(); - this->synchronize(_gst_smm_res); - AKANTU_DEBUG_OUT(); -} +// /* -------------------------------------------------------------------------- */ +// void SolidMechanicsModel::synchronizeResidual() { +// AKANTU_DEBUG_IN(); +// this->synchronize(_gst_smm_res); +// AKANTU_DEBUG_OUT(); +// } /* -------------------------------------------------------------------------- */ // void SolidMechanicsModel::setIncrementFlagOn() { // AKANTU_DEBUG_IN(); // if (!displacement_increment) { // this->allocNodalField(displacement_increment, spatial_dimension, // "displacement_increment"); // this->getDOFManager().registerDOFsIncrement("displacement", // *this->displacement_increment); // } // increment_flag = true; // AKANTU_DEBUG_OUT(); // } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getStableTimeStep() { AKANTU_DEBUG_IN(); Real min_dt = getStableTimeStep(_not_ghost); /// reduction min over all processors StaticCommunicator::getStaticCommunicator().allReduce(min_dt, _so_min); AKANTU_DEBUG_OUT(); return min_dt; } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getStableTimeStep(const GhostType & ghost_type) { AKANTU_DEBUG_IN(); Real min_dt = std::numeric_limits::max(); this->updateCurrentPosition(); Element elem; elem.ghost_type = ghost_type; elem.kind = _ek_regular; for (auto type : mesh.elementTypes(spatial_dimension, ghost_type, _ek_regular)) { elem.type = type; UInt nb_nodes_per_element = mesh.getNbNodesPerElement(type); UInt nb_element = mesh.getNbElement(type); auto mat_indexes = material_index(type, ghost_type).begin(); auto mat_loc_num = material_local_numbering(type, ghost_type).begin(); Array X(0, nb_nodes_per_element * spatial_dimension); FEEngine::extractNodalToElementField(mesh, *current_position, X, type, _not_ghost); auto X_el = X.begin(spatial_dimension, nb_nodes_per_element); for (UInt el = 0; el < nb_element; ++el, ++X_el, ++mat_indexes, ++mat_loc_num) { elem.element = *mat_loc_num; Real el_h = getFEEngine().getElementInradius(*X_el, type); Real el_c = this->materials[*mat_indexes]->getCelerity(elem); Real el_dt = el_h / el_c; min_dt = std::min(min_dt, el_dt); } } AKANTU_DEBUG_OUT(); return min_dt; } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getKineticEnergy() { AKANTU_DEBUG_IN(); Real ekin = 0.; UInt nb_nodes = mesh.getNbNodes(); if (this->getDOFManager().hasLumpedMatrix("M")) { auto m_it = this->mass->begin(spatial_dimension); auto m_end = this->mass->end(spatial_dimension); auto v_it = this->velocity->begin(spatial_dimension); for (UInt n = 0; m_it != m_end; ++n, ++m_it, ++v_it) { const Vector & v = *v_it; const Vector & m = *m_it; Real mv2 = 0; bool is_local_node = mesh.isLocalOrMasterNode(n); // bool is_not_pbc_slave_node = !isPBCSlaveNode(n); bool count_node = is_local_node; // && is_not_pbc_slave_node; if (count_node) { for (UInt i = 0; i < spatial_dimension; ++i) { if (m(i) > std::numeric_limits::epsilon()) mv2 += v(i) * v(i) * m(i); } } ekin += mv2; } } else if (this->getDOFManager().hasMatrix("M")) { Array Mv(nb_nodes, spatial_dimension); this->getDOFManager().getMatrix("M").matVecMul(*this->velocity, Mv); Array::const_vector_iterator mv_it = Mv.begin(spatial_dimension); Array::const_vector_iterator mv_end = Mv.end(spatial_dimension); Array::const_vector_iterator v_it = this->velocity->begin(spatial_dimension); for (; mv_it != mv_end; ++mv_it, ++v_it) { ekin += v_it->dot(*mv_it); } } else { AKANTU_DEBUG_ERROR("No function called to assemble the mass matrix."); } StaticCommunicator::getStaticCommunicator().allReduce(ekin, _so_sum); AKANTU_DEBUG_OUT(); return ekin * .5; } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getKineticEnergy(const ElementType & type, UInt index) { AKANTU_DEBUG_IN(); UInt nb_quadrature_points = getFEEngine().getNbIntegrationPoints(type); Array vel_on_quad(nb_quadrature_points, spatial_dimension); Array filter_element(1, 1, index); getFEEngine().interpolateOnIntegrationPoints(*velocity, vel_on_quad, spatial_dimension, type, _not_ghost, filter_element); Array::vector_iterator vit = vel_on_quad.begin(spatial_dimension); Array::vector_iterator vend = vel_on_quad.end(spatial_dimension); Vector rho_v2(nb_quadrature_points); Real rho = materials[material_index(type)(index)]->getRho(); for (UInt q = 0; vit != vend; ++vit, ++q) { rho_v2(q) = rho * vit->dot(*vit); } AKANTU_DEBUG_OUT(); return .5 * getFEEngine().integrate(rho_v2, type, index); } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getExternalWork() { AKANTU_DEBUG_IN(); auto incr_or_velo_it = this->velocity->begin(spatial_dimension); if (this->method == _static) { incr_or_velo_it = this->displacement_increment->begin(spatial_dimension); } auto ext_force_it = external_force->begin(spatial_dimension); auto int_force_it = internal_force->begin(spatial_dimension); auto boun_it = blocked_dofs->begin(spatial_dimension); Real work = 0.; UInt nb_nodes = this->mesh.getNbNodes(); for (UInt n = 0; n < nb_nodes; ++n, ++ext_force_it, ++int_force_it, ++boun_it, ++incr_or_velo_it) { const auto & int_force = *int_force_it; const auto & ext_force = *ext_force_it; const auto & boun = *boun_it; const auto & incr_or_velo = *incr_or_velo_it; bool is_local_node = this->mesh.isLocalOrMasterNode(n); // bool is_not_pbc_slave_node = !this->isPBCSlaveNode(n); bool count_node = is_local_node; // && is_not_pbc_slave_node; if (count_node) { for (UInt i = 0; i < this->spatial_dimension; ++i) { if (boun(i)) work -= int_force(i) * incr_or_velo(i); else work += ext_force(i) * incr_or_velo(i); } } } StaticCommunicator::getStaticCommunicator().allReduce(work, _so_sum); if (this->method != _static) work *= this->getTimeStep(); AKANTU_DEBUG_OUT(); return work; } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getEnergy(const std::string & energy_id) { AKANTU_DEBUG_IN(); if (energy_id == "kinetic") { return getKineticEnergy(); } else if (energy_id == "external work") { return getExternalWork(); } Real energy = 0.; for (auto & material : materials) energy += material->getEnergy(energy_id); /// reduction sum over all processors StaticCommunicator::getStaticCommunicator().allReduce(energy, _so_sum); AKANTU_DEBUG_OUT(); return energy; } /* -------------------------------------------------------------------------- */ Real SolidMechanicsModel::getEnergy(const std::string & energy_id, const ElementType & type, UInt index) { AKANTU_DEBUG_IN(); if (energy_id == "kinetic") { return getKineticEnergy(type, index); } UInt mat_index = this->material_index(type, _not_ghost)(index); UInt mat_loc_num = this->material_local_numbering(type, _not_ghost)(index); Real energy = this->materials[mat_index]->getEnergy(energy_id, type, mat_loc_num); AKANTU_DEBUG_OUT(); return energy; } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::onElementsAdded(const Array & element_list, const NewElementsEvent & event) { AKANTU_DEBUG_IN(); this->getFEEngine().initShapeFunctions(_not_ghost); this->getFEEngine().initShapeFunctions(_ghost); for (auto ghost_type : ghost_types) { for (auto type : mesh.elementTypes(spatial_dimension, ghost_type, _ek_not_defined)) { UInt nb_element = this->mesh.getNbElement(type, ghost_type); if (!material_index.exists(type, ghost_type)) { this->material_index.alloc(nb_element, 1, type, ghost_type); this->material_local_numbering.alloc(nb_element, 1, type, ghost_type); } else { this->material_index(type, ghost_type).resize(nb_element); this->material_local_numbering(type, ghost_type).resize(nb_element); } } } ElementTypeMapArray filter("new_element_filter", this->getID(), this->getMemoryID()); for (auto & elem : element_list) { if (!filter.exists(elem.type, elem.ghost_type)) filter.alloc(0, 1, elem.type, elem.ghost_type); filter(elem.type, elem.ghost_type).push_back(elem.element); } this->assignMaterialToElements(&filter); for (auto & material : materials) material->onElementsAdded(element_list, event); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::onElementsRemoved( __attribute__((unused)) const Array & element_list, const ElementTypeMapArray & new_numbering, const RemovedElementsEvent & event) { this->getFEEngine().initShapeFunctions(_not_ghost); this->getFEEngine().initShapeFunctions(_ghost); for (auto & material : materials) { material->onElementsRemoved(element_list, new_numbering, event); } } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::onNodesAdded(const Array & nodes_list, __attribute__((unused)) const NewNodesEvent & event) { AKANTU_DEBUG_IN(); UInt nb_nodes = mesh.getNbNodes(); if (displacement) displacement->resize(nb_nodes, 0.); if (mass) mass->resize(nb_nodes, 0.); if (velocity) velocity->resize(nb_nodes, 0.); if (acceleration) acceleration->resize(nb_nodes, 0.); if (external_force) external_force->resize(nb_nodes, 0.); if (internal_force) internal_force->resize(nb_nodes, 0.); if (blocked_dofs) blocked_dofs->resize(nb_nodes, 0.); if (previous_displacement) previous_displacement->resize(nb_nodes, 0.); if (displacement_increment) displacement_increment->resize(nb_nodes, 0.); for (auto & material : materials) { material->onNodesAdded(nodes_list, event); } AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::onNodesRemoved(__attribute__((unused)) const Array & element_list, const Array & new_numbering, __attribute__((unused)) const RemovedNodesEvent & event) { if (displacement) mesh.removeNodesFromArray(*displacement, new_numbering); if (mass) mesh.removeNodesFromArray(*mass, new_numbering); if (velocity) mesh.removeNodesFromArray(*velocity, new_numbering); if (acceleration) mesh.removeNodesFromArray(*acceleration, new_numbering); if (internal_force) mesh.removeNodesFromArray(*internal_force, new_numbering); if (external_force) mesh.removeNodesFromArray(*external_force, new_numbering); if (blocked_dofs) mesh.removeNodesFromArray(*blocked_dofs, new_numbering); // if (increment_acceleration) // mesh.removeNodesFromArray(*increment_acceleration, new_numbering); if (displacement_increment) mesh.removeNodesFromArray(*displacement_increment, new_numbering); if (previous_displacement) mesh.removeNodesFromArray(*previous_displacement, new_numbering); // if (method != _explicit_lumped_mass) { // this->initSolver(); // } } /* -------------------------------------------------------------------------- */ bool SolidMechanicsModel::isInternal(const std::string & field_name, const ElementKind & element_kind) { /// check if at least one material contains field_id as an internal for (auto & material : materials) { bool is_internal = material->isInternal(field_name, element_kind); if (is_internal) return true; } return false; } /* -------------------------------------------------------------------------- */ ElementTypeMap SolidMechanicsModel::getInternalDataPerElem(const std::string & field_name, const ElementKind & element_kind) { if (!(this->isInternal(field_name, element_kind))) AKANTU_EXCEPTION("unknown internal " << field_name); for (auto & material : materials) { if (material->isInternal(field_name, element_kind)) return material->getInternalDataPerElem(field_name, element_kind); } return ElementTypeMap(); } /* -------------------------------------------------------------------------- */ ElementTypeMapArray & SolidMechanicsModel::flattenInternal(const std::string & field_name, const ElementKind & kind, const GhostType ghost_type) { std::pair key(field_name, kind); if (this->registered_internals.count(key) == 0) { this->registered_internals[key] = new ElementTypeMapArray(field_name, this->id, this->memory_id); } ElementTypeMapArray * internal_flat = this->registered_internals[key]; for (auto type : mesh.elementTypes(spatial_dimension, ghost_type, kind)) { if (internal_flat->exists(type, ghost_type)) { auto & internal = (*internal_flat)(type, ghost_type); // internal.clear(); internal.resize(0); } } for (auto & material : materials) { if (material->isInternal(field_name, kind)) material->flattenInternal(field_name, *internal_flat, ghost_type, kind); } return *internal_flat; } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::flattenAllRegisteredInternals( const ElementKind & kind) { ElementKind _kind; ID _id; for (auto & internal : this->registered_internals) { std::tie(_id, _kind) = internal.first; if (kind == _kind) this->flattenInternal(_id, kind); } } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::onDump() { this->flattenAllRegisteredInternals(_ek_regular); } /* -------------------------------------------------------------------------- */ #ifdef AKANTU_USE_IOHELPER dumper::Field * SolidMechanicsModel::createElementalField( const std::string & field_name, const std::string & group_name, bool padding_flag, const UInt & spatial_dimension, const ElementKind & kind) { dumper::Field * field = NULL; if (field_name == "partitions") field = mesh.createElementalField( mesh.getConnectivities(), group_name, spatial_dimension, kind); else if (field_name == "material_index") field = mesh.createElementalField( material_index, group_name, spatial_dimension, kind); else { // this copy of field_name is used to compute derivated data such as // strain and von mises stress that are based on grad_u and stress std::string field_name_copy(field_name); if (field_name == "strain" || field_name == "Green strain" || field_name == "principal strain" || field_name == "principal Green strain") field_name_copy = "grad_u"; else if (field_name == "Von Mises stress") field_name_copy = "stress"; bool is_internal = this->isInternal(field_name_copy, kind); if (is_internal) { ElementTypeMap nb_data_per_elem = this->getInternalDataPerElem(field_name_copy, kind); ElementTypeMapArray & internal_flat = this->flattenInternal(field_name_copy, kind); field = mesh.createElementalField( internal_flat, group_name, spatial_dimension, kind, nb_data_per_elem); if (field_name == "strain") { dumper::ComputeStrain * foo = new dumper::ComputeStrain(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } else if (field_name == "Von Mises stress") { dumper::ComputeVonMisesStress * foo = new dumper::ComputeVonMisesStress(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } else if (field_name == "Green strain") { dumper::ComputeStrain * foo = new dumper::ComputeStrain(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } else if (field_name == "principal strain") { dumper::ComputePrincipalStrain * foo = new dumper::ComputePrincipalStrain(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } else if (field_name == "principal Green strain") { dumper::ComputePrincipalStrain * foo = new dumper::ComputePrincipalStrain(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } // treat the paddings if (padding_flag) { if (field_name == "stress") { if (spatial_dimension == 2) { dumper::StressPadder<2> * foo = new dumper::StressPadder<2>(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } } else if (field_name == "strain" || field_name == "Green strain") { if (spatial_dimension == 2) { dumper::StrainPadder<2> * foo = new dumper::StrainPadder<2>(*this); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } } } // homogenize the field dumper::ComputeFunctorInterface * foo = dumper::HomogenizerProxy::createHomogenizer(*field); field = dumper::FieldComputeProxy::createFieldCompute(field, *foo); } } return field; } /* -------------------------------------------------------------------------- */ dumper::Field * SolidMechanicsModel::createNodalFieldReal(const std::string & field_name, const std::string & group_name, bool padding_flag) { std::map *> real_nodal_fields; real_nodal_fields["displacement"] = this->displacement; real_nodal_fields["mass"] = this->mass; real_nodal_fields["velocity"] = this->velocity; real_nodal_fields["acceleration"] = this->acceleration; real_nodal_fields["external_force"] = this->external_force; real_nodal_fields["internal_force"] = this->internal_force; real_nodal_fields["increment"] = this->displacement_increment; if (field_name == "force") { AKANTU_EXCEPTION("The 'force' field has been renamed in 'external_force'"); } else if (field_name == "residual") { AKANTU_EXCEPTION( "The 'residual' field has been replaced by 'internal_force'"); } dumper::Field * field = NULL; if (padding_flag) field = this->mesh.createNodalField(real_nodal_fields[field_name], group_name, 3); else field = this->mesh.createNodalField(real_nodal_fields[field_name], group_name); return field; } /* -------------------------------------------------------------------------- */ dumper::Field * SolidMechanicsModel::createNodalFieldBool( const std::string & field_name, const std::string & group_name, __attribute__((unused)) bool padding_flag) { std::map *> uint_nodal_fields; uint_nodal_fields["blocked_dofs"] = blocked_dofs; dumper::Field * field = NULL; field = mesh.createNodalField(uint_nodal_fields[field_name], group_name); return field; } /* -------------------------------------------------------------------------- */ #else /* -------------------------------------------------------------------------- */ dumper::Field * SolidMechanicsModel::createElementalField( __attribute__((unused)) const std::string & field_name, __attribute__((unused)) const std::string & group_name, __attribute__((unused)) bool padding_flag, __attribute__((unused)) const UInt & spatial_dimension, __attribute__((unused)) const ElementKind & kind) { return NULL; } /* -------------------------------------------------------------------------- */ dumper::Field * SolidMechanicsModel::createNodalFieldReal( __attribute__((unused)) const std::string & field_name, __attribute__((unused)) const std::string & group_name, __attribute__((unused)) bool padding_flag) { return NULL; } /* -------------------------------------------------------------------------- */ dumper::Field * SolidMechanicsModel::createNodalFieldBool( __attribute__((unused)) const std::string & field_name, __attribute__((unused)) const std::string & group_name, __attribute__((unused)) bool padding_flag) { return NULL; } #endif /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::dump(const std::string & dumper_name) { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(dumper_name); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::dump(const std::string & dumper_name, UInt step) { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(dumper_name, step); } /* ------------------------------------------------------------------------- */ void SolidMechanicsModel::dump(const std::string & dumper_name, Real time, UInt step) { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(dumper_name, time, step); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::dump() { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::dump(UInt step) { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(step); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::dump(Real time, UInt step) { this->onDump(); EventManager::sendEvent(SolidMechanicsModelEvent::BeforeDumpEvent()); mesh.dump(time, step); } /* -------------------------------------------------------------------------- */ void SolidMechanicsModel::printself(std::ostream & stream, int indent) const { std::string space; for (Int i = 0; i < indent; i++, space += AKANTU_INDENT) ; stream << space << "Solid Mechanics Model [" << std::endl; stream << space << " + id : " << id << std::endl; stream << space << " + spatial dimension : " << spatial_dimension << std::endl; stream << space << " + fem [" << std::endl; getFEEngine().printself(stream, indent + 2); stream << space << AKANTU_INDENT << "]" << std::endl; stream << space << " + nodals information [" << std::endl; displacement->printself(stream, indent + 2); mass->printself(stream, indent + 2); velocity->printself(stream, indent + 2); acceleration->printself(stream, indent + 2); external_force->printself(stream, indent + 2); internal_force->printself(stream, indent + 2); blocked_dofs->printself(stream, indent + 2); stream << space << AKANTU_INDENT << "]" << std::endl; stream << space << " + material information [" << std::endl; material_index.printself(stream, indent + 2); stream << space << AKANTU_INDENT << "]" << std::endl; stream << space << " + materials [" << std::endl; for (auto & material : materials) { material->printself(stream, indent + 1); } stream << space << AKANTU_INDENT << "]" << std::endl; stream << space << "]" << std::endl; } /* -------------------------------------------------------------------------- */ __END_AKANTU__ diff --git a/src/model/solid_mechanics/solid_mechanics_model.hh b/src/model/solid_mechanics/solid_mechanics_model.hh index a6f5ffb9e..b9f85ba2d 100644 --- a/src/model/solid_mechanics/solid_mechanics_model.hh +++ b/src/model/solid_mechanics/solid_mechanics_model.hh @@ -1,803 +1,800 @@ /** * @file solid_mechanics_model.hh * * @author Guillaume Anciaux * @author Daniel Pino Muñoz * @author Nicolas Richart * * @date creation: Tue Jul 27 2010 * @date last modification: Tue Jan 19 2016 * * @brief Model of Solid Mechanics * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #ifndef __AKANTU_SOLID_MECHANICS_MODEL_HH__ #define __AKANTU_SOLID_MECHANICS_MODEL_HH__ /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "aka_types.hh" #include "boundary_condition.hh" #include "data_accessor.hh" #include "dumpable.hh" #include "integrator_gauss.hh" #include "material_selector.hh" #include "mesh.hh" #include "model.hh" #include "shape_lagrange.hh" #include "solid_mechanics_model_event_handler.hh" /* -------------------------------------------------------------------------- */ namespace akantu { class Material; class DumperIOHelper; class NonLocalManager; -} +} // namespace akantu /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ struct SolidMechanicsModelOptions : public ModelOptions { SolidMechanicsModelOptions( AnalysisMethod analysis_method = _explicit_lumped_mass, bool no_init_materials = false) : analysis_method(analysis_method), no_init_materials(no_init_materials) { } AnalysisMethod analysis_method; bool no_init_materials; }; extern const SolidMechanicsModelOptions default_solid_mechanics_model_options; class SolidMechanicsModel : public Model, public DataAccessor, public DataAccessor, public MeshEventHandler, public BoundaryCondition, public EventHandlerManager { /* ------------------------------------------------------------------------ */ /* Constructors/Destructors */ /* ------------------------------------------------------------------------ */ public: class NewMaterialElementsEvent : public NewElementsEvent { public: AKANTU_GET_MACRO_NOT_CONST(MaterialList, material, Array &); AKANTU_GET_MACRO(MaterialList, material, const Array &); protected: Array material; }; typedef FEEngineTemplate MyFEEngineType; protected: typedef EventHandlerManager EventManager; public: SolidMechanicsModel(Mesh & mesh, UInt spatial_dimension = _all_dimensions, const ID & id = "solid_mechanics_model", const MemoryID & memory_id = 0); virtual ~SolidMechanicsModel(); /* ------------------------------------------------------------------------ */ /* Methods */ /* ------------------------------------------------------------------------ */ public: /// initialize completely the model - virtual void initFull( - const ModelOptions & options = default_solid_mechanics_model_options); + void initFull( + const ModelOptions & options = default_solid_mechanics_model_options) override; /// initialize the fem object needed for boundary conditions void initFEEngineBoundary(); /// register the tags associated with the parallel synchronizer // virtual void initParallel(MeshPartition * partition, // DataAccessor * data_accessor = NULL); /// allocate all vectors virtual void initArrays(); /// allocate all vectors - //void initArraysPreviousDisplacment(); + // void initArraysPreviousDisplacment(); /// initialize all internal arrays for materials virtual void initMaterials(); /// initialize the model virtual void initModel(); /// init PBC synchronizer // void initPBC(); /// initialize a new solver and sets it as the default one to use void initNewSolver(const AnalysisMethod & method); /// function to print the containt of the class virtual void printself(std::ostream & stream, int indent = 0) const; protected: /// allocate an array if needed template void allocNodalField(Array *& array, UInt nb_component, const ID & name); /* ------------------------------------------------------------------------ */ /* PBC */ /* ------------------------------------------------------------------------ */ public: /// change the equation number for proper assembly when using PBC // void changeEquationNumberforPBC(std::map & pbc_pair); /// synchronize Residual for output - void synchronizeResidual(); + // void synchronizeResidual(); protected: /// register PBC synchronizer // void registerPBCSynchronizer(); /* ------------------------------------------------------------------------ */ /* Solver interface */ /* ------------------------------------------------------------------------ */ public: /// assembles the stiffness matrix, - void assembleStiffnessMatrix(); + virtual void assembleStiffnessMatrix(); /// assembles the internal forces in the array internal_forces - void assembleInternalForces(); + virtual void assembleInternalForces(); -private: +protected: /// callback for the solver, this adds f_{ext} - f_{int} to the residual - virtual void assembleResidual(); + void assembleResidual() override; + /// callback for the solver, this assembles the stiffness matrix - virtual void assembleJacobian(); + void assembleJacobian() override; /// callback for the solver, this is called at beginning of solve - virtual void predictor(); + void predictor() override; /// callback for the solver, this is called at end of solve - virtual void corrector(); + void corrector() override; /// Callback for the model to instantiate the matricees when needed - virtual void initSolver(TimeStepSolverType time_step_solver_type, - NonLinearSolverType non_linear_solver_type); + void initSolver(TimeStepSolverType time_step_solver_type, + NonLinearSolverType non_linear_solver_type) override; protected: /* ------------------------------------------------------------------------ */ - virtual TimeStepSolverType getDefaultSolverType() const; + TimeStepSolverType getDefaultSolverType() const override; /* ------------------------------------------------------------------------ */ - virtual ModelSolverOptions - getDefaultSolverOptions(const TimeStepSolverType & type) const; + ModelSolverOptions + getDefaultSolverOptions(const TimeStepSolverType & type) const override; /* ------------------------------------------------------------------------ */ /* Explicit */ /* ------------------------------------------------------------------------ */ // public: // /// initialize the stuff for the explicit scheme // void initExplicit(AnalysisMethod analysis_method = // _explicit_lumped_mass); // bool isExplicit() { // return method == _explicit_lumped_mass || // method == _explicit_consistent_mass; // } // /// initialize the array needed by updateResidual (residual, // current_position) // void initializeUpdateResidualData(); /// update the current position vector void updateCurrentPosition(); // /// assemble the residual for the explicit scheme // virtual void updateResidual(bool need_initialize = true); // /** // * \brief compute the acceleration from the residual // * this function is the explicit equivalent to solveDynamic in implicit // * In the case of lumped mass just divide the residual by the mass // * In the case of not lumped mass call // solveDynamic<_acceleration_corrector> // */ // void updateAcceleration(); /// Update the increment of displacement // void updateIncrement(); // /// Copy the actuel displacement into previous displacement // void updatePreviousDisplacement(); // /// Save stress and strain through EventManager // void saveStressAndStrainBeforeDamage(); // /// Update energies through EventManager // void updateEnergiesAfterDamage(); // /// Solve the system @f[ A x = \alpha b @f] with A a lumped matrix // void solveLumped(Array & x, const Array & A, // const Array & b, const Array & blocked_dofs, // Real alpha); // /// explicit integration predictor // void explicitPred(); // /// explicit integration corrector // void explicitCorr(); // public: // void solveStep(); // /* // ------------------------------------------------------------------------ // */ // /* Implicit */ // /* // ------------------------------------------------------------------------ // */ // public: // /// initialize the solver and the jacobian_matrix (called by // initImplicit) // void initSolver(); // /// initialize the stuff for the implicit solver // void initImplicit(bool dynamic = false); // /// solve Ma = f to get the initial acceleration // void initialAcceleration(); // /// assemble the stiffness matrix // void assembleStiffnessMatrix(); // public: // /** // * solve a step (predictor + convergence loop + corrector) using the // * the given convergence method (see akantu::SolveConvergenceMethod) // * and the given convergence criteria (see // * akantu::SolveConvergenceCriteria) // **/ // template // bool solveStep(Real tolerance, UInt max_iteration = 100); // template // bool solveStep(Real tolerance, Real & error, UInt max_iteration = 100, // bool do_not_factorize = false); // public: // /** // * solve Ku = f using the the given convergence method (see // * akantu::SolveConvergenceMethod) and the given convergence // * criteria (see akantu::SolveConvergenceCriteria) // **/ // template // bool solveStatic(Real tolerance, UInt max_iteration, // bool do_not_factorize = false); // /// create and return the velocity damping matrix // SparseMatrix & initVelocityDampingMatrix(); // /// implicit time integration predictor // void implicitPred(); // /// implicit time integration corrector // void implicitCorr(); // /// compute the Cauchy stress on user demand. // void computeCauchyStresses(); // // /// compute A and solve @f[ A\delta u = f_ext - f_int @f] // // template // // void solve(Array &increment, Real block_val = 1., // // bool need_factorize = true, bool has_profile_changed = // false); // protected: // /// finish the computation of residual to solve in increment // void updateResidualInternal(); // /// compute the support reaction and store it in force // void updateSupportReaction(); // private: // /// re-initialize the J matrix (to use if the profile of K changed) // void initJacobianMatrix(); /* ------------------------------------------------------------------------ */ - virtual void updateDataForNonLocalCriterion(ElementTypeMapReal & criterion); + void updateDataForNonLocalCriterion(ElementTypeMapReal & criterion) override; -public: +//public: /// Update the stresses for the computation of the residual of the Stiffness /// matrix in the case of finite deformation - void computeStresses(); + //void computeStresses(); /// synchronize the ghost element boundaries values - void synchronizeBoundaries(); + // void synchronizeBoundaries(); /* ------------------------------------------------------------------------ */ /* Materials (solid_mechanics_model_material.cc) */ /* ------------------------------------------------------------------------ */ public: /// registers all the custom materials of a given type present in the input /// file template void registerNewCustomMaterials(const ID & mat_type); /// register an empty material of a given type template Material & registerNewEmptyMaterial(const std::string & name); // /// Use a UIntData in the mesh to specify the material to use per element // void setMaterialIDsFromIntData(const std::string & data_name); /// reassigns materials depending on the material selector virtual void reassignMaterial(); /// apply a constant eigen_grad_u on all quadrature points of a given material virtual void applyEigenGradU(const Matrix & prescribed_eigen_grad_u, const ID & material_name, const GhostType ghost_type = _not_ghost); protected: /// register a material in the dynamic database template Material & registerNewMaterial(const ParserSection & mat_section); /// read the material files to instantiate all the materials void instantiateMaterials(); /// set the element_id_by_material and add the elements to the good materials void assignMaterialToElements(const ElementTypeMapArray * filter = NULL); /// reinitialize dof_synchronizer and solver (either in implicit or /// explicit) when cohesive elements are inserted void reinitializeSolver(); /* ------------------------------------------------------------------------ */ /* Mass (solid_mechanics_model_mass.cc) */ /* ------------------------------------------------------------------------ */ public: /// assemble the lumped mass matrix void assembleMassLumped(); /// assemble the mass matrix for consistent mass resolutions void assembleMass(); protected: /// assemble the lumped mass matrix for local and ghost elements void assembleMassLumped(GhostType ghost_type); /// assemble the mass matrix for either _ghost or _not_ghost elements void assembleMass(GhostType ghost_type); /// fill a vector of rho void computeRho(Array & rho, ElementType type, GhostType ghost_type); /// compute the kinetic energy Real getKineticEnergy(); Real getKineticEnergy(const ElementType & type, UInt index); /// compute the external work (for impose displacement, the velocity should be /// given too) Real getExternalWork(); /* ------------------------------------------------------------------------ */ /* Data Accessor inherited members */ /* ------------------------------------------------------------------------ */ public: - inline virtual UInt getNbData(const Array & elements, - const SynchronizationTag & tag) const; + inline UInt getNbData(const Array & elements, + const SynchronizationTag & tag) const override; - inline virtual void packData(CommunicationBuffer & buffer, - const Array & elements, - const SynchronizationTag & tag) const; + inline void packData(CommunicationBuffer & buffer, + const Array & elements, + const SynchronizationTag & tag) const override; - inline virtual void unpackData(CommunicationBuffer & buffer, - const Array & elements, - const SynchronizationTag & tag); + inline void unpackData(CommunicationBuffer & buffer, + const Array & elements, + const SynchronizationTag & tag) override; - inline virtual UInt getNbData(const Array & dofs, - const SynchronizationTag & tag) const; + inline UInt getNbData(const Array & dofs, + const SynchronizationTag & tag) const override; - inline virtual void packData(CommunicationBuffer & buffer, - const Array & dofs, - const SynchronizationTag & tag) const; + inline void packData(CommunicationBuffer & buffer, const Array & dofs, + const SynchronizationTag & tag) const override; - inline virtual void unpackData(CommunicationBuffer & buffer, - const Array & dofs, - const SynchronizationTag & tag); + inline void unpackData(CommunicationBuffer & buffer, const Array & dofs, + const SynchronizationTag & tag) override; protected: inline void splitElementByMaterial(const Array & elements, Array * elements_per_mat) const; /* ------------------------------------------------------------------------ */ /* Mesh Event Handler inherited members */ /* ------------------------------------------------------------------------ */ protected: - virtual void onNodesAdded(const Array & nodes_list, - const NewNodesEvent & event); - virtual void onNodesRemoved(const Array & element_list, - const Array & new_numbering, - const RemovedNodesEvent & event); - virtual void onElementsAdded(const Array & nodes_list, - const NewElementsEvent & event); - virtual void - onElementsRemoved(const Array & element_list, - const ElementTypeMapArray & new_numbering, - const RemovedElementsEvent & event); - - virtual void onElementsChanged( - __attribute__((unused)) const Array & old_elements_list, - __attribute__((unused)) const Array & new_elements_list, - __attribute__((unused)) const ElementTypeMapArray & new_numbering, - __attribute__((unused)) const ChangedElementsEvent & event){}; + void onNodesAdded(const Array & nodes_list, + const NewNodesEvent & event) override; + void onNodesRemoved(const Array & element_list, + const Array & new_numbering, + const RemovedNodesEvent & event) override; + void onElementsAdded(const Array & nodes_list, + const NewElementsEvent & event) override; + void onElementsRemoved(const Array & element_list, + const ElementTypeMapArray & new_numbering, + const RemovedElementsEvent & event) override; + + void onElementsChanged(const Array &, const Array &, + const ElementTypeMapArray &, + const ChangedElementsEvent &) override{}; /* ------------------------------------------------------------------------ */ /* Dumpable interface (kept for convenience) and dumper relative functions */ /* ------------------------------------------------------------------------ */ public: virtual void onDump(); //! decide wether a field is a material internal or not bool isInternal(const std::string & field_name, const ElementKind & element_kind); #ifndef SWIG //! give the amount of data per element virtual ElementTypeMap getInternalDataPerElem(const std::string & field_name, const ElementKind & kind); //! flatten a given material internal field ElementTypeMapArray & flattenInternal(const std::string & field_name, const ElementKind & kind, const GhostType ghost_type = _not_ghost); //! flatten all the registered material internals void flattenAllRegisteredInternals(const ElementKind & kind); #endif - virtual dumper::Field * createNodalFieldReal(const std::string & field_name, + dumper::Field * createNodalFieldReal(const std::string & field_name, const std::string & group_name, - bool padding_flag); + bool padding_flag) override; - virtual dumper::Field * createNodalFieldBool(const std::string & field_name, + dumper::Field * createNodalFieldBool(const std::string & field_name, const std::string & group_name, - bool padding_flag); + bool padding_flag) override; - virtual dumper::Field * createElementalField(const std::string & field_name, + dumper::Field * createElementalField(const std::string & field_name, const std::string & group_name, bool padding_flag, const UInt & spatial_dimension, - const ElementKind & kind); + const ElementKind & kind) override; virtual void dump(const std::string & dumper_name); virtual void dump(const std::string & dumper_name, UInt step); virtual void dump(const std::string & dumper_name, Real time, UInt step); - virtual void dump(); + void dump() override; virtual void dump(UInt step); virtual void dump(Real time, UInt step); /* ------------------------------------------------------------------------ */ /* Accessors */ /* ------------------------------------------------------------------------ */ public: /// return the dimension of the system space AKANTU_GET_MACRO(SpatialDimension, spatial_dimension, UInt); /// get the current value of the time step // AKANTU_GET_MACRO(TimeStep, time_step, Real); /// set the value of the time step - virtual void setTimeStep(Real time_step, const ID & solver_id = ""); + void setTimeStep(Real time_step, const ID & solver_id = "") override; /// void setTimeStep(Real time_step); /// return the of iterations done in the last solveStep // AKANTU_GET_MACRO(NumberIter, n_iter, UInt); /// get the value of the conversion from forces/ mass to acceleration AKANTU_GET_MACRO(F_M2A, f_m2a, Real); /// set the value of the conversion from forces/ mass to acceleration AKANTU_SET_MACRO(F_M2A, f_m2a, Real); /// get the SolidMechanicsModel::displacement vector AKANTU_GET_MACRO(Displacement, *displacement, Array &); /// get the SolidMechanicsModel::previous_displacement vector AKANTU_GET_MACRO(PreviousDisplacement, *previous_displacement, Array &); /// get the SolidMechanicsModel::current_position vector \warn only consistent /// after a call to SolidMechanicsModel::updateCurrentPosition AKANTU_GET_MACRO(CurrentPosition, *current_position, const Array &); /// get the SolidMechanicsModel::increment vector \warn only consistent if /// SolidMechanicsModel::setIncrementFlagOn has been called before AKANTU_GET_MACRO(Increment, *displacement_increment, Array &); /// get the lumped SolidMechanicsModel::mass vector AKANTU_GET_MACRO(Mass, *mass, Array &); /// get the SolidMechanicsModel::velocity vector AKANTU_GET_MACRO(Velocity, *velocity, Array &); /// get the SolidMechanicsModel::acceleration vector, updated by /// SolidMechanicsModel::updateAcceleration AKANTU_GET_MACRO(Acceleration, *acceleration, Array &); /// get the SolidMechanicsModel::force vector (external forces) AKANTU_GET_MACRO(Force, *external_force, Array &); /// get the SolidMechanicsModel::internal_force vector (internal forces) AKANTU_GET_MACRO(InternalForce, *internal_force, Array &); /// get the SolidMechanicsModel::blocked_dofs vector AKANTU_GET_MACRO(BlockedDOFs, *blocked_dofs, Array &); /// get the SolidMechnicsModel::incrementAcceleration vector // AKANTU_GET_MACRO(IncrementAcceleration, *increment_acceleration, // Array &); /// get the value of the SolidMechanicsModel::increment_flag AKANTU_GET_MACRO(IncrementFlag, increment_flag, bool); /// get a particular material (by material index) inline Material & getMaterial(UInt mat_index); /// get a particular material (by material index) inline const Material & getMaterial(UInt mat_index) const; /// get a particular material (by material name) inline Material & getMaterial(const std::string & name); /// get a particular material (by material name) inline const Material & getMaterial(const std::string & name) const; /// get a particular material id from is name inline UInt getMaterialIndex(const std::string & name) const; /// give the number of materials inline UInt getNbMaterials() const { return materials.size(); } inline void setMaterialSelector(MaterialSelector & selector); /// give the material internal index from its id Int getInternalIndexFromID(const ID & id) const; /// compute the stable time step Real getStableTimeStep(); /// get the energies Real getEnergy(const std::string & energy_id); /// compute the energy for energy Real getEnergy(const std::string & energy_id, const ElementType & type, UInt index); /** * @brief set the SolidMechanicsModel::increment_flag to on, the activate the * update of the SolidMechanicsModel::increment vector */ - //void setIncrementFlagOn(); + // void setIncrementFlagOn(); // /// get the stiffness matrix // AKANTU_GET_MACRO(StiffnessMatrix, *stiffness_matrix, SparseMatrix &); // /// get the global jacobian matrix of the system // AKANTU_GET_MACRO(GlobalJacobianMatrix, *jacobian_matrix, const SparseMatrix // &); // /// get the mass matrix // AKANTU_GET_MACRO(MassMatrix, *mass_matrix, SparseMatrix &); // /// get the velocity damping matrix // AKANTU_GET_MACRO(VelocityDampingMatrix, *velocity_damping_matrix, // SparseMatrix &); /// get the FEEngine object to integrate or interpolate on the boundary inline FEEngine & getFEEngineBoundary(const ID & name = ""); // /// get integrator // AKANTU_GET_MACRO(Integrator, *integrator, const IntegrationScheme2ndOrder // &); // /// get synchronizer - // AKANTU_GET_MACRO(Synchronizer, *synch_parallel, const ElementSynchronizer &); + // AKANTU_GET_MACRO(Synchronizer, *synch_parallel, const ElementSynchronizer + // &); AKANTU_GET_MACRO(MaterialByElement, material_index, const ElementTypeMapArray &); /// vectors containing local material element index for each global element /// index AKANTU_GET_MACRO_BY_ELEMENT_TYPE_CONST(MaterialByElement, material_index, UInt); AKANTU_GET_MACRO_BY_ELEMENT_TYPE(MaterialByElement, material_index, UInt); AKANTU_GET_MACRO_BY_ELEMENT_TYPE_CONST(MaterialLocalNumbering, material_local_numbering, UInt); AKANTU_GET_MACRO_BY_ELEMENT_TYPE(MaterialLocalNumbering, material_local_numbering, UInt); /// Get the type of analysis method used AKANTU_GET_MACRO(AnalysisMethod, method, AnalysisMethod); /// get the non-local manager AKANTU_GET_MACRO(NonLocalManager, *non_local_manager, NonLocalManager &); protected: friend class Material; protected: /// compute the stable time step Real getStableTimeStep(const GhostType & ghost_type); /* ------------------------------------------------------------------------ */ /* Class Members */ /* ------------------------------------------------------------------------ */ protected: /// number of iterations // UInt n_iter; /// time step // Real time_step; /// conversion coefficient form force/mass to acceleration Real f_m2a; /// displacements array Array * displacement; /// displacements array at the previous time step (used in finite deformation) Array * previous_displacement; /// increment of displacement Array * displacement_increment; /// lumped mass array Array * mass; /// velocities array Array * velocity; /// accelerations array Array * acceleration; /// accelerations array // Array * increment_acceleration; /// external forces array Array * external_force; /// internal forces array Array * internal_force; /// array specifing if a degree of freedom is blocked or not Array * blocked_dofs; /// array of current position used during update residual Array * current_position; /// mass matrix SparseMatrix * mass_matrix; /// velocity damping matrix SparseMatrix * velocity_damping_matrix; /// stiffness matrix SparseMatrix * stiffness_matrix; /// jacobian matrix @f[A = cM + dD + K@f] with @f[c = \frac{1}{\beta \Delta /// t^2}, d = \frac{\gamma}{\beta \Delta t} @f] SparseMatrix * jacobian_matrix; /// Arrays containing the material index for each element ElementTypeMapArray material_index; /// Arrays containing the position in the element filter of the material /// (material's local numbering) ElementTypeMapArray material_local_numbering; #ifdef SWIGPYTHON public: #endif /// list of used materials std::vector> materials; /// mapping between material name and material internal id std::map materials_names_to_id; #ifdef SWIGPYTHON protected: #endif /// class defining of to choose a material MaterialSelector * material_selector; /// define if it is the default selector or not bool is_default_material_selector; // /// integration scheme of second order used // IntegrationScheme2ndOrder *integrator; /// flag defining if the increment must be computed or not bool increment_flag; /// analysis method check the list in akantu::AnalysisMethod AnalysisMethod method; /// tells if the material are instantiated bool are_materials_instantiated; typedef std::map, ElementTypeMapArray *> flatten_internal_map; /// map a registered internals to be flattened for dump purposes flatten_internal_map registered_internals; /// pointer to non-local manager: For non-local continuum damage computations NonLocalManager * non_local_manager; /// pointer to the pbc synchronizer // PBCSynchronizer * pbc_synch; }; /* -------------------------------------------------------------------------- */ namespace BC { namespace Neumann { typedef FromHigherDim FromStress; typedef FromSameDim FromTraction; -} -} +} // namespace Neumann +} // namespace BC __END_AKANTU__ /* -------------------------------------------------------------------------- */ /* inline functions */ /* -------------------------------------------------------------------------- */ #include "material.hh" #include "parser.hh" __BEGIN_AKANTU__ #include "solid_mechanics_model_inline_impl.cc" #include "solid_mechanics_model_tmpl.hh" /// standard output stream operator inline std::ostream & operator<<(std::ostream & stream, const SolidMechanicsModel & _this) { _this.printself(stream); return stream; } __END_AKANTU__ #include "material_selector_tmpl.hh" #endif /* __AKANTU_SOLID_MECHANICS_MODEL_HH__ */ diff --git a/src/model/solid_mechanics/solid_mechanics_model_cohesive/solid_mechanics_model_cohesive_inline_impl.cc b/src/model/solid_mechanics/solid_mechanics_model_cohesive/solid_mechanics_model_cohesive_inline_impl.cc index 56839164b..c9fbee16c 100644 --- a/src/model/solid_mechanics/solid_mechanics_model_cohesive/solid_mechanics_model_cohesive_inline_impl.cc +++ b/src/model/solid_mechanics/solid_mechanics_model_cohesive/solid_mechanics_model_cohesive_inline_impl.cc @@ -1,319 +1,310 @@ /** * @file solid_mechanics_model_cohesive_inline_impl.cc * * @author Mauro Corrado * @author Marco Vocialta * * @date creation: Fri Jan 18 2013 * @date last modification: Thu Jan 14 2016 * * @brief Implementation of inline functions for the Cohesive element model * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ #include #include "material_cohesive.hh" #ifndef __AKANTU_SOLID_MECHANICS_MODEL_COHESIVE_INLINE_IMPL_CC__ #define __AKANTU_SOLID_MECHANICS_MODEL_COHESIVE_INLINE_IMPL_CC__ __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ template bool SolidMechanicsModelCohesive::solveStepCohesive(Real tolerance, Real & error, UInt max_iteration, bool load_reduction, Real tol_increase_factor, bool do_not_factorize) { EventManager::sendEvent(SolidMechanicsModelEvent::BeforeSolveStepEvent(method)); this->implicitPred(); bool insertion_new_element = true; bool converged = false; Array * displacement_tmp = NULL; Array * velocity_tmp = NULL; Array * acceleration_tmp = NULL; StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Int prank = comm.whoAmI(); /// Loop for the insertion of new cohesive elements while (insertion_new_element) { if (is_extrinsic) { /** * If in extrinsic the solution of the previous incremental step * is saved in temporary arrays created for displacements, * velocities and accelerations. Such arrays are used to find * the solution with the Newton-Raphson scheme (this is done by * pointing the pointer "displacement" to displacement_tmp). In * this way, inside the array "displacement" is kept the * solution of the previous incremental step, and in * "displacement_tmp" is saved the current solution. */ Array * tmp_swap; if(!displacement_tmp) { displacement_tmp = new Array(*(this->displacement)); } else { displacement_tmp->resize(this->displacement->getSize()); displacement_tmp->copy(*(this->displacement)); } tmp_swap = displacement_tmp; displacement_tmp = this->displacement; this->displacement = tmp_swap; if(!velocity_tmp) { velocity_tmp = new Array(*(this->velocity)); } else { velocity_tmp->resize(this->velocity->getSize()); velocity_tmp->copy(*(this->velocity)); } tmp_swap = velocity_tmp; velocity_tmp = this->velocity; this->velocity = tmp_swap; if(!acceleration_tmp) { acceleration_tmp = new Array(*(this->acceleration)); } else { acceleration_tmp->resize(this->acceleration->getSize()); acceleration_tmp->copy(*(this->acceleration)); } tmp_swap = acceleration_tmp; acceleration_tmp = this->acceleration; this->acceleration = tmp_swap; } this->updateResidual(); AKANTU_DEBUG_ASSERT(stiffness_matrix != NULL, "You should first initialize the implicit solver and assemble the stiffness matrix"); bool need_factorize = !do_not_factorize; if (method ==_implicit_dynamic) { AKANTU_DEBUG_ASSERT(mass_matrix != NULL, "You should first initialize the implicit solver and assemble the mass matrix"); } switch (cmethod) { case _scm_newton_raphson_tangent: case _scm_newton_raphson_tangent_not_computed: break; case _scm_newton_raphson_tangent_modified: this->assembleStiffnessMatrix(); break; default: AKANTU_DEBUG_ERROR("The resolution method " << cmethod << " has not been implemented!"); } UInt iter = 0; converged = false; error = 0.; if(criteria == _scc_residual) { converged = this->testConvergence (tolerance, error); if(converged) return converged; } /// Loop to solve the nonlinear system do { if (cmethod == _scm_newton_raphson_tangent) this->assembleStiffnessMatrix(); solve (*increment, 1., need_factorize); this->implicitCorr(); this->updateResidual(); converged = this->testConvergence (tolerance, error); iter++; AKANTU_DEBUG_INFO("[" << criteria << "] Convergence iteration " << std::setw(std::log10(max_iteration)) << iter << ": error " << error << (converged ? " < " : " > ") << tolerance); switch (cmethod) { case _scm_newton_raphson_tangent: need_factorize = true; break; case _scm_newton_raphson_tangent_not_computed: case _scm_newton_raphson_tangent_modified: need_factorize = false; break; default: AKANTU_DEBUG_ERROR("The resolution method " << cmethod << " has not been implemented!"); } } while (!converged && iter < max_iteration); /** * This is to save the obtained result and proceed with the * simulation even if the error is higher than the pre-fixed * tolerance. This is done only after loading reduction * (load_reduction = true). */ // if (load_reduction && (error < tolerance * tol_increase_factor)) converged = true; if ((error < tolerance * tol_increase_factor)) converged = true; if (converged) { - // EventManager::sendEvent(SolidMechanicsModelEvent::AfterSolveStepEvent(method)); - // !!! add sendEvent to call computeCauchyStress !!!! - - if (prank==0){ - std::cout << "Error after convergence: " << error << std::endl; - std::cout << "no. of iterations: " << iter << std::endl; - } + } else if(iter == max_iteration) { if (prank==0){ AKANTU_DEBUG_WARNING("[" << criteria << "] Convergence not reached after " << std::setw(std::log10(max_iteration)) << iter << " iteration" << (iter == 1 ? "" : "s") << "!" << std::endl); - std::cout << "Error after NON convergence: " << error << std::endl; } } if (is_extrinsic) { /** * If is extrinsic the pointer "displacement" is moved back to * the array displacement. In this way, the array displacement is * correctly resized during the checkCohesiveStress function (in * case new cohesive elements are added). This is possible * because the procedure called by checkCohesiveStress does not * use the displacement field (the correct one is now stored in * displacement_tmp), but directly the stress field that is * already computed. */ Array * tmp_swap; tmp_swap = displacement_tmp; displacement_tmp = this->displacement; this->displacement = tmp_swap; tmp_swap = velocity_tmp; velocity_tmp = this->velocity; this->velocity = tmp_swap; tmp_swap = acceleration_tmp; acceleration_tmp = this->acceleration; this->acceleration = tmp_swap; /// If convergence is reached, call checkCohesiveStress in order /// to check if cohesive elements have to be introduced if (converged){ UInt new_cohesive_elements = checkCohesiveStress(); if(new_cohesive_elements == 0){ insertion_new_element = false; } else { insertion_new_element = true; - if (prank==0) - std::cout << "No. cohesive elements inserted = " << new_cohesive_elements << std::endl; } } } if (!converged && load_reduction) insertion_new_element = false; /** * If convergence is not reached, there is the possibility to * return back to the main file and reduce the load. Before doing * this, a pre-fixed value as to be defined for the parameter * delta_max of the cohesive elements introduced in the current * incremental step. This is done by calling the function * checkDeltaMax. */ if (!converged) { insertion_new_element = false; for (UInt m = 0; m < materials.size(); ++m) { try { MaterialCohesive & mat = dynamic_cast(*materials[m]); mat.checkDeltaMax(_not_ghost); } catch(std::bad_cast&) { } } } } //end loop for the insertion of new cohesive elements /** * When the solution to the current incremental step is computed (no * more cohesive elements have to be introduced), call the function * to compute the energies. */ if ((is_extrinsic && converged)) { for(UInt m = 0; m < materials.size(); ++m) { try { MaterialCohesive & mat = dynamic_cast(*materials[m]); mat.computeEnergies(); } catch (std::bad_cast & bce) { } } EventManager::sendEvent(SolidMechanicsModelEvent::AfterSolveStepEvent(method)); /** * The function resetVariables is necessary to correctly set a * variable that permit to decrease locally the penalty parameter * for compression. */ for (UInt m = 0; m < materials.size(); ++m) { try { MaterialCohesive & mat = dynamic_cast(*materials[m]); mat.resetVariables(_not_ghost); } catch(std::bad_cast&) { } } /// The correct solution is saved this->displacement->copy(*displacement_tmp); this->velocity ->copy(*velocity_tmp); this->acceleration->copy(*acceleration_tmp); } delete displacement_tmp; delete velocity_tmp; delete acceleration_tmp; return insertion_new_element; } __END_AKANTU__ #if defined (AKANTU_PARALLEL_COHESIVE_ELEMENT) # include "solid_mechanics_model_cohesive_parallel_inline_impl.cc" #endif #endif /* __AKANTU_SOLID_MECHANICS_MODEL_COHESIVE_INLINE_IMPL_CC__ */ diff --git a/src/solver/sparse_matrix_aij.cc b/src/solver/sparse_matrix_aij.cc index 526552327..9f8e3f1c7 100644 --- a/src/solver/sparse_matrix_aij.cc +++ b/src/solver/sparse_matrix_aij.cc @@ -1,225 +1,225 @@ /** * @file sparse_matrix_aij.cc * * @author Nicolas Richart * * @date Tue Aug 18 16:31:23 2015 * * @brief Implementation of the AIJ sparse matrix * * @section LICENSE * * Copyright (©) 2010-2011 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "sparse_matrix_aij.hh" #include "dof_manager_default.hh" #include "dof_synchronizer.hh" #include "terms_to_assemble.hh" /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ __BEGIN_AKANTU__ /* -------------------------------------------------------------------------- */ SparseMatrixAIJ::SparseMatrixAIJ(DOFManagerDefault & dof_manager, const MatrixType & matrix_type, const ID & id) : SparseMatrix(dof_manager, matrix_type, id), dof_manager(dof_manager), irn(0, 1, id + ":irn"), jcn(0, 1, id + ":jcn"), a(0, 1, id + ":a"), profile_release(1), value_release(1) {} /* -------------------------------------------------------------------------- */ SparseMatrixAIJ::SparseMatrixAIJ(const SparseMatrixAIJ & matrix, const ID & id) : SparseMatrix(matrix, id), dof_manager(matrix.dof_manager), irn(matrix.irn, true, id + ":irn"), jcn(matrix.jcn, true, id + ":jcn"), a(matrix.a, true, id + ":a"), profile_release(1), value_release(1) {} /* -------------------------------------------------------------------------- */ SparseMatrixAIJ::~SparseMatrixAIJ() {} /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::applyBoundary(Real block_val) { AKANTU_DEBUG_IN(); // clang-format off const auto & blocked_dofs = this->dof_manager.getGlobalBlockedDOFs(); auto irn_it = irn.begin(); auto jcn_it = jcn.begin(); auto a_it = a.begin(); auto a_end = a.end(); for (;a_it != a_end; ++a_it, ++irn_it, ++jcn_it) { UInt ni = this->dof_manager.globalToLocalEquationNumber(*irn_it - 1); UInt nj = this->dof_manager.globalToLocalEquationNumber(*jcn_it - 1); if (blocked_dofs(ni) || blocked_dofs(nj)) { *a_it = *irn_it != *jcn_it ? 0. : this->dof_manager.isLocalOrMasterDOF(ni) ? block_val : 0.; } } this->value_release++; // clang-format on AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::saveProfile(const std::string & filename) const { AKANTU_DEBUG_IN(); std::ofstream outfile; outfile.open(filename.c_str()); UInt m = this->size; outfile << "%%MatrixMarket matrix coordinate pattern"; if (this->matrix_type == _symmetric) outfile << " symmetric"; else outfile << " general"; outfile << std::endl; outfile << m << " " << m << " " << this->nb_non_zero << std::endl; for (UInt i = 0; i < this->nb_non_zero; ++i) { outfile << this->irn.storage()[i] << " " << this->jcn.storage()[i] << " 1" << std::endl; } outfile.close(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::saveMatrix(const std::string & filename) const { AKANTU_DEBUG_IN(); // open and set the properties of the stream std::ofstream outfile; outfile.open(filename.c_str()); outfile.precision(std::numeric_limits::digits10); // write header outfile << "%%MatrixMarket matrix coordinate real"; if (this->matrix_type == _symmetric) outfile << " symmetric"; else outfile << " general"; outfile << std::endl; outfile << this->size << " " << this->size << " " << this->nb_non_zero << std::endl; // write content for (UInt i = 0; i < this->nb_non_zero; ++i) { outfile << this->irn(i) << " " << this->jcn(i) << " " << this->a(i) << std::endl; } // time to end outfile.close(); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::matVecMul(const Array & x, Array & y, Real alpha, Real beta) const { AKANTU_DEBUG_IN(); y *= beta; auto i_it = this->irn.begin(); auto j_it = this->jcn.begin(); auto a_it = this->a.begin(); auto a_end = this->a.end(); - auto x_it = x.begin(); - auto y_it = y.begin(); + auto x_it = x.begin_reinterpret(x.getSize() * x.getNbComponent()); + auto y_it = y.begin_reinterpret(x.getSize() * x.getNbComponent()); for (; a_it != a_end; ++i_it, ++j_it, ++a_it) { Int i = this->dof_manager.globalToLocalEquationNumber(*i_it - 1); Int j = this->dof_manager.globalToLocalEquationNumber(*j_it - 1); const Real & A = *a_it; y_it[i] += alpha * A * x_it[j]; if ((this->matrix_type == _symmetric) && (i != j)) y_it[j] += alpha * A * x_it[i]; } if (this->dof_manager.hasSynchronizer()) this->dof_manager.getSynchronizer().reduceSynchronize(y); AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::copyContent(const SparseMatrix & matrix) { AKANTU_DEBUG_IN(); const SparseMatrixAIJ & mat = dynamic_cast(matrix); AKANTU_DEBUG_ASSERT(nb_non_zero == mat.getNbNonZero(), "The to matrix don't have the same profiles"); memcpy(a.storage(), mat.getA().storage(), nb_non_zero * sizeof(Real)); this->value_release++; AKANTU_DEBUG_OUT(); } /* -------------------------------------------------------------------------- */ template void SparseMatrixAIJ::addMeToTemplated(MatrixType & B, Real alpha) const { auto i_it = this->irn.begin(); auto j_it = this->jcn.begin(); auto a_it = this->a.begin(); auto a_end = this->a.end(); for (; a_it != a_end; ++a_it, ++i_it, ++j_it) { const Int & i = *i_it; const Int & j = *j_it; const Real & A_ij = *a_it; B.addToMatrix(i - 1, j - 1, alpha * A_ij); } } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::addMeTo(SparseMatrix & B, Real alpha) const { if (SparseMatrixAIJ * B_aij = dynamic_cast(&B)) { this->addMeToTemplated(*B_aij, alpha); } else { // this->addMeToTemplated(*this, alpha); } } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::mul(Real alpha) { this->a *= alpha; this->value_release++; } /* -------------------------------------------------------------------------- */ void SparseMatrixAIJ::clear() { a.set(0.); this->value_release++; } __END_AKANTU__ diff --git a/test/test_common/test_types.cc b/test/test_common/test_types.cc index a12efd442..8ffe2c84f 100644 --- a/test/test_common/test_types.cc +++ b/test/test_common/test_types.cc @@ -1,355 +1,355 @@ /** * @file test_types.cc * * @author Nicolas Richart * * @date creation: Fri May 15 2015 * @date last modification: Sat Jul 11 2015 * * @brief Test the types declared in aka_types.hh * * @section LICENSE * * Copyright (©) 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) Laboratory * (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "aka_types.hh" #include #include #include using namespace akantu; const Real tolerance = 1e-15; std::string itoa(UInt a) { std::stringstream sstr; sstr << a; return sstr.str(); } UInt testcounter = 0; struct wrap_error : std::runtime_error { wrap_error(const std::string & msg) : std::runtime_error(msg) {} }; struct size_error : std::runtime_error { size_error(const std::string & msg) : std::runtime_error(msg) {} }; struct data_error : std::runtime_error { data_error(const std::string & msg, UInt i) : std::runtime_error(msg), index(i) {} UInt index; }; template void compare_storages_with_ref(const type & a, Real * ref, UInt size, UInt line, const std::string & txt) { std::cout << std::setw(3) << (testcounter++) << ": " << std::setw(10) << txt << " - " << a << " - wrapped: " << std::boolalpha << a.isWrapped() << std::endl; if (a.size() != size) throw size_error("the size is not correct " + itoa(a.size()) + " instead of " + itoa(size) + " [Test at line: " + itoa(line) + "]"); Real * a_ptr = a.storage(); for (UInt i = 0; i < a.size(); ++i) { if (!((std::abs(a_ptr[i]) < tolerance && std::abs(ref[i]) < tolerance) || std::abs((a_ptr[i] - ref[i]) / a_ptr[i]) < tolerance)) { std::stringstream txt; txt << " std::abs(" << a_ptr[i] << " - " << ref[i] << " [= " << std::abs(a_ptr[i] - ref[i]) << "] ) > " << tolerance; throw data_error("storage differs at index " + itoa(i) + " [Test at line: " + itoa(line) + "]" + txt.str(), i); } } if (a_ptr == ref && !a.isWrapped()) throw wrap_error( "the storage should be wrapped but it is not [Test at line: " + itoa(line) + "]"); if (a_ptr != ref && a.isWrapped()) throw wrap_error( "the storage should not be wrapped but it is [Test at line: " + itoa(line) + "]"); } #define COMPARE(a, aref, txt) \ compare_storages_with_ref(a, aref, sizeof(aref) / sizeof(aref[0]), __LINE__, \ txt) #define COMPARE_STORAGE(a, aref, txt) \ compare_storages_with_ref(a, aref.storage(), aref.size(), __LINE__, txt) const UInt ref_size = 10; // clang-format off /* -------------------------------------------------------------------------- */ void test_constructor() { std::cout << "=== Test constructors ===" << std::endl; Real ref1[ref_size] = { 0. }; Real ref2[ref_size] = { 1563.58, 1563.58, 1563.58, 1563.58, 1563.58, 1563.58, 1563.58, 1563.58, 1563.58, 1563.58 }; Real ref3[ref_size] = { 23.1594, 79.6184, 77.9052, 47.9922, 12.8674, 37.1445, 64.8991, 80.3364, 98.4064, 73.7858 }; std::cout << "-- Vectors: " << std::endl; Vector v0 = { 23.1594, 79.6184, 77.9052, 47.9922, 12.8674, 37.1445, 64.8991, 80.3364, 98.4064, 73.7858 }; ; COMPARE ( v0, ref3, "init_list" ); Vector v1(ref_size); COMPARE ( v1, ref1, "normal" ); Vector v2(ref_size, 1563.58); COMPARE ( v2, ref2, "defval" ); Vector v3(ref3, ref_size); COMPARE ( v3, ref3, "wrapped" ); Vector v3dcw(v3); COMPARE ( v3dcw, ref3, "wdeepcopy" ); Vector v3scw(v3, false); COMPARE ( v3scw, ref3, "wshallow" ); Vector v3dc(v3dcw); COMPARE_STORAGE( v3dc, v3dcw, "deepcopy" ); Vector v3sc(v3dcw, false); COMPARE_STORAGE( v3sc, v3dcw, "shallow" ); VectorProxy vp1(ref3, ref_size); Vector v4(vp1); COMPARE ( v4, ref3, "proxyptr" ); VectorProxy vp2(v3dcw); Vector v5(vp2); COMPARE_STORAGE( v5, v3dcw, "proxyvdc" ); VectorProxy vp3(v3scw); Vector v6(vp3); COMPARE ( v6, ref3, "proxyvsc" ); /* ------------------------------------------------------------------------ */ std::cout << "-- Matrices: " << std::endl; Matrix m0 = {{23.1594, 37.1445}, {79.6184, 64.8991}, {77.9052, 80.3364}, {47.9922, 98.4064}, {12.8674, 73.7858}}; COMPARE ( m0, ref3 , "init_list" ); Matrix m1(5, 2); COMPARE ( m1, ref1 , "normal" ); Matrix m1t(2, 5); COMPARE ( m1t, ref1 , "tnormal" ); Matrix m2(5, 2, 1563.58); COMPARE ( m2, ref2 , "defval" ); Matrix m2t(2, 5, 1563.58); COMPARE ( m2t, ref2 , "tdefval" ); Matrix m3(ref3, 5, 2); COMPARE ( m3, ref3 , "wrapped" ); Matrix m3t(ref3, 2, 5); COMPARE ( m3t, ref3 , "twrapped" ); Matrix m3dcw(m3); COMPARE ( m3dcw, ref3 , "wdeepcopy" ); Matrix m3scw(m3, false); COMPARE ( m3scw, ref3 , "wshallow" ); Matrix m3dc(m3dcw); COMPARE_STORAGE( m3dc, m3dcw , "deepcopy" ); Matrix m3sc(m3dcw, false); COMPARE_STORAGE( m3sc, m3dcw , "shallow" ); Matrix m3tdcw(m3t); COMPARE (m3tdcw, ref3 , "twdeepcopy"); Matrix m3tscw(m3t, false); COMPARE (m3tscw, ref3 , "twshallow" ); Matrix m3tdc(m3tdcw); COMPARE_STORAGE( m3tdc, m3tdcw, "tdeepcopy" ); Matrix m3tsc(m3tdcw, false); COMPARE_STORAGE( m3tsc, m3tdcw, "tshallow" ); MatrixProxy mp1(ref3, 5, 2); Matrix m4(mp1); COMPARE ( m4, ref3, "proxyptr" ); MatrixProxy mp2(m3dcw); Matrix m5(mp2); COMPARE_STORAGE( m5, m3dcw, "proxyvdc" ); MatrixProxy mp3(m3scw); Matrix m6(mp3); COMPARE ( m6, ref3, "proxyvsc" ); MatrixProxy mp1t(ref3, 2, 5); Matrix m4t(mp1t); COMPARE ( m4t, ref3, "tproxyptr" ); MatrixProxy mp2t(m3tdcw); Matrix m5t(mp2t); COMPARE_STORAGE( m5t, m3tdcw, "tproxyvdc" ); MatrixProxy mp3t(m3tscw); Matrix m6t(mp3t); COMPARE ( m6t, ref3, "tproxyvsc" ); } /* -------------------------------------------------------------------------- */ void test_equal_and_accessors() { std::cout << "=== Test operator=() ===" << std::endl; Real ref[ref_size] = { 23.1594, 79.6184, 77.9052, 47.9922, 12.8674, 37.1445, 64.8991, 80.3364, 98.4064, 73.7858 }; Real mod[ref_size] = { 98.7982, 72.1227, 19.7815, 57.6722, 47.1088, 14.9865, 13.3171, 62.7973, 33.9493, 98.3052 }; std::cout << "-- Vectors: " << std::endl; Vector v (ref, ref_size); Vector vm(mod, ref_size); Vector vref1(v); Vector v1; v1 = vref1; COMPARE_STORAGE(v1, vref1, "simple=" ); for (UInt i = 0; i < ref_size; ++i) v1 (i) = mod[i]; COMPARE (v1, mod, "s_acces" ); COMPARE_STORAGE(vref1, v, "refcheck1"); Vector v2 = vref1; COMPARE_STORAGE(v2, vref1, "construc="); for (UInt i = 0; i < ref_size; ++i) v2 (i) = mod[i]; COMPARE (v2, mod, "c_acces" ); COMPARE_STORAGE(vref1, v, "refcheck2"); Vector vref2(vref1, false); Vector v1w; v1w = vref2; COMPARE_STORAGE(v1w, vref1, "w_simple=" ); for (UInt i = 0; i < ref_size; ++i) v1w(i) = mod[i]; COMPARE (v1w, mod, "ws_acces" ); try { COMPARE(vref2, ref, "refcheck3"); } catch(wrap_error &) {} Vector v2w = vref2; COMPARE_STORAGE(v2w, vref1, "w_constru="); for (UInt i = 0; i < ref_size; ++i) v2w(i) = mod[i]; COMPARE (v2w, mod, "wc_acces" ); try { COMPARE(vref2, ref, "refcheck4"); } catch(wrap_error &) {} VectorProxy vp1(vref1); Vector v3; v3 = vp1; COMPARE_STORAGE(v3, vref1, "p_simple=" ); for (UInt i = 0; i < ref_size; ++i) v3(i) = mod[i]; COMPARE (v3, mod, "ps_acces" ); COMPARE_STORAGE(vref1, v, "refcheck5"); Vector v4 = vp1; COMPARE_STORAGE(v4, vref1, "p_constru="); for (UInt i = 0; i < ref_size; ++i) v4(i) = mod[i]; try { COMPARE(v4, mod, "pc_acces" ); } catch (wrap_error &) {} COMPARE(vref1, mod, "refcheck6"); try { COMPARE(vref2, mod, "refcheck7"); } catch(wrap_error &) {} vref2 = v; VectorProxy vp2(vref2); Vector v3w; v3w = vp2; COMPARE_STORAGE(v3w, vref1, "pw_simpl="); for (UInt i = 0; i < ref_size; ++i) v3w(i) = mod[i]; COMPARE (v3w, mod, "pws_acces"); try { COMPARE(vref2, ref, "refcheck8"); } catch(wrap_error &) {} Vector v4w = vp2; COMPARE_STORAGE( v4w, vref1, "pw_constr="); for (UInt i = 0; i < ref_size; ++i) v4w(i) = mod[i]; try { COMPARE(v4w, mod, "pwc_acces"); } catch (wrap_error &) {} COMPARE_STORAGE(v4w, vref2, "refcheck9"); try { COMPARE(vref2, mod, "refcheck10"); } catch(wrap_error &) {} vref1 = v; Real store[ref_size] = {0., 0., 0., 0., 0., 0., 0., 0., 0., 0.}; Vector vs(store, 10); VectorProxy vp3(vs); vp3 = vref1; - try { COMPARE_STORAGE(vs, vref1, "vp_equal_v"); } catch(wrap_error &) {} + try { COMPARE(vref1, store, "vp_equal_v"); } catch(wrap_error &) {} Vector vref3(vm); - VectorProxy vp4(vref3); + VectorProxy vp4 = vref3; vp3 = vp4; try { COMPARE(vs, mod, "vp_equal_vp"); } catch(wrap_error &) {} /* ------------------------------------------------------------------------ */ std::cout << "-- Matrices: " << std::endl; Matrix m (ref, 5, 2); Matrix mt(ref, 2, 5); Matrix m1 (5, 2); Matrix m1t(2, 5); for (UInt i = 0; i < 5; ++i) { for (UInt j = 0; j < 2; ++j) { m1(i, j) = ref[i + j*5]; m1t(j, i) = ref[j + i*2]; } } COMPARE_STORAGE( m1, m, "access" ); COMPARE_STORAGE(m1t, m, "t_access"); Matrix mm (mod, 5, 2); Matrix mmt(mod, 2, 5); Matrix m2(m); Matrix m3(m); for (UInt j = 0; j < 2; ++j) { Vector v = m2(j); for (UInt i = 0; i < 5; ++i) v(i) = mm(i, j); } COMPARE_STORAGE(m2, mm, "slicing"); for (UInt j = 0; j < 2; ++j) m3(j) = mm(j); COMPARE_STORAGE(m3, mm, "slic_slic"); COMPARE(mm, mod, "refcheck"); Real mod_1[ref_size] = { 98.7982, 72.1227, 197.815, 57.6722, 47.1088, 14.9865, 13.3171, 627.973, 33.9493, 98.3052 }; Matrix m4 (mm); m4 (2,0) = 197.815; m4 (2,1) = 627.973; COMPARE(m4, mod_1, "partial"); Matrix m4t(mmt); m4t(0,1) = 197.815; m4t(1,3) = 627.973; COMPARE(m4t, mod_1, "t_partial"); } /* -------------------------------------------------------------------------- */ void test_simple_operators() { std::cout << "=== Test simple operation ===" << std::endl; Real ref[ref_size] = { 23.1594, 79.6184, 77.9052, 47.9922, 12.8674, 37.1445, 64.8991, 80.3364, 98.4064, 73.7858 }; Real mod[ref_size] = { 98.7982, 72.1227, 19.7815, 57.6722, 47.1088, 14.9865, 13.3171, 62.7973, 33.9493, 98.3052 }; Real ref_div[ref_size] = { 1.163905920192984e+00, 4.001326766509196e+00, 3.915227661071464e+00, 2.411910744798472e+00, 6.466680068348578e-01, 1.866745401547894e+00, 3.261589104432606e+00, 4.037410795054780e+00, 4.945542265554328e+00, 3.708201829329581e+00 }; Real ref_tim[ref_size] = { 4.608257412000000e+02, 1.584246923200000e+03, 1.550157669600000e+03, 9.549487955999999e+02, 2.560355252000000e+02, 7.391012610000000e+02, 1.291362291800000e+03, 1.598533687200000e+03, 1.958090547200000e+03, 1.468189848400000e+03 }; Real ref_p_mod[ref_size] = { 1.219576000000000e+02, 1.517411000000000e+02, 9.768670000000000e+01, 1.056644000000000e+02, 5.997620000000001e+01, 5.213100000000000e+01, 7.821620000000000e+01, 1.431337000000000e+02, 1.323557000000000e+02, 1.720910000000000e+02 }; Real ref_m_mod[ref_size] = { -7.563879999999999e+01, 7.495699999999999e+00, 5.812369999999999e+01, -9.680000000000000e+00, -3.424140000000000e+01, 2.215800000000000e+01, 5.158200000000001e+01, 1.753910000000000e+01, 6.445710000000000e+01, -2.451940000000000e+01 }; std::cout << "-- Vectors: " << std::endl; Vector v (ref, ref_size); Vector vm(mod, ref_size); Vector vref(v); Vector vmod(vm); Vector v1 = vref / 19.898; COMPARE(v1, ref_div, "v / s" ); Vector v2 = vref * 19.898; COMPARE(v2, ref_tim, "v * s" ); Vector v3 = 19.898 * vref; COMPARE(v3, ref_tim, "s * v" ); Vector v4 = vref + vmod; COMPARE(v4, ref_p_mod, "v1 + v2" ); Vector v5 = vref - vmod; COMPARE(v5, ref_m_mod, "v1 - v2" ); Vector v6 = vref; v6 *= 19.898; COMPARE(v6, ref_tim, "v *= s" ); Vector v7 = vref; v7 /= 19.898; COMPARE(v7, ref_div, "v /= s" ); Vector v8 = vref; v8 += vmod; COMPARE(v8, ref_p_mod, "v1 += v2"); Vector v9 = vref; v9 -= vmod; COMPARE(v9, ref_m_mod, "v1 -= v2"); std::cout << "-- Matrices: " << std::endl; Matrix m (ref, 5, 2); Matrix mm(mod, 5, 2); Matrix mref(m); Matrix mmod(mm); Matrix m1 = mref / 19.898; COMPARE(m1, ref_div, "m / s" ); Matrix m2 = mref * 19.898; COMPARE(m2, ref_tim, "m * s" ); Matrix m3 = 19.898 * mref; COMPARE(m3, ref_tim, "s * m" ); Matrix m4 = mref + mmod; COMPARE(m4, ref_p_mod, "m1 + m2" ); Matrix m5 = mref - mmod; COMPARE(m5, ref_m_mod, "m1 - m2" ); Matrix m6 = mref; m6 *= 19.898; COMPARE(m6, ref_tim, "m *= s" ); Matrix m7 = mref; m7 /= 19.898; COMPARE(m7, ref_div, "m /= s" ); Matrix m8 = mref; m8 += mmod; COMPARE(m8, ref_p_mod, "m1 += m2"); Matrix m9 = mref; m9 -= mmod; COMPARE(m9, ref_m_mod, "m1 -= m2"); } // clang-format on /* -------------------------------------------------------------------------- */ int main() { test_constructor(); test_equal_and_accessors(); test_simple_operators(); return 0; } diff --git a/test/test_io/test_dumper/test_dumper.cc b/test/test_io/test_dumper/test_dumper.cc index d2ca33a2c..b1524b039 100644 --- a/test/test_io/test_dumper/test_dumper.cc +++ b/test/test_io/test_dumper/test_dumper.cc @@ -1,162 +1,153 @@ /** * @file test_dumper.cc * * @author David Simon Kammer * * @date creation: Tue Sep 02 2014 * @date last modification: Sun Oct 19 2014 * * @brief test dumper * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ -#include "solid_mechanics_model.hh" +#include "dumper_nodal_field.hh" +#include "dumper_paraview.hh" #include "dumper_text.hh" #include "dumper_variable.hh" -#include "dumper_paraview.hh" -#include "dumper_nodal_field.hh" +#include "solid_mechanics_model.hh" using namespace akantu; - -int main(int argc, char *argv[]) { +int main(int argc, char * argv[]) { initialize("input_file.dat", argc, argv); UInt spatial_dimension = 3; Mesh mesh(spatial_dimension); mesh.read("test_dumper.msh"); - mesh.createGroupsFromMeshData("physical_names"); SolidMechanicsModel model(mesh); MeshDataMaterialSelector mat_selector("physical_names", model); - model.setMaterialSelector(mat_selector); + model.setMaterialSelector(mat_selector); model.initFull(); - model.setIncrementFlagOn(); - model.updateResidual(); - + model.assembleInternalForces(); + Real time_step = 0.1; const Array & coord = mesh.getNodes(); - Array & disp = model.getDisplacement(); - Array & bound = model.getBlockedDOFs(); + Array & disp = model.getDisplacement(); + Array & bound = model.getBlockedDOFs(); - for (UInt n=0; n(model.getDisplacement(), - 0, - 0, - &(mesh.getElementGroup("Bottom").getNodes()))); + mesh.getElementGroup("Bottom").getElements(), + mesh.getElementGroup("Bottom").getNodes()); + prvdumper.registerField("displacement", + new dumper::NodalField( + model.getDisplacement(), 0, 0, + &(mesh.getElementGroup("Bottom").getNodes()))); prvdumper.dump(0); } - DumperText txtdumper("text_bottom", iohelper::_tdm_csv); txtdumper.setDirectory("paraview"); txtdumper.setPrecision(8); txtdumper.setTimeStep(time_step); txtdumper.registerFilteredMesh(mesh, - mesh.getElementGroup("Bottom").getElements(), - mesh.getElementGroup("Bottom").getNodes()); + mesh.getElementGroup("Bottom").getElements(), + mesh.getElementGroup("Bottom").getNodes()); txtdumper.registerField("displacement", - new dumper::NodalField(model.getDisplacement(), - 0, - 0, - &(mesh.getElementGroup("Bottom").getNodes()))); + new dumper::NodalField( + model.getDisplacement(), 0, 0, + &(mesh.getElementGroup("Bottom").getNodes()))); txtdumper.registerField("blocked_dofs", - new dumper::NodalField(model.getBlockedDOFs(), - 0, - 0, - &(mesh.getElementGroup("Bottom").getNodes()))); - + new dumper::NodalField( + model.getBlockedDOFs(), 0, 0, + &(mesh.getElementGroup("Bottom").getNodes()))); + Real pot_energy = 1.2345567891; - Vector gforces(2,1.); + Vector gforces(2, 1.); txtdumper.registerVariable("potential_energy", - new dumper::Variable(pot_energy)); + new dumper::Variable(pot_energy)); txtdumper.registerVariable("global_forces", - new dumper::Variable< Vector >(gforces)); + new dumper::Variable>(gforces)); // dump a first time before the main loop model.dumpGroup("Bottom"); txtdumper.dump(); Real time = 0.; - for (UInt i=1; i<5; ++i) { + for (UInt i = 1; i < 5; ++i) { pot_energy += 2.; gforces(0) += 0.1; gforces(1) += 0.2; // pre -> cor // increment time after all steps of integration time += time_step; // dump after time increment - if (i%2 == 0) { - txtdumper.dump(time,i); + if (i % 2 == 0) { + txtdumper.dump(time, i); model.dumpGroup("Bottom"); - + // parallel test - for (UInt p=0; p * * @date creation: Fri Sep 18 2015 * * @brief Test to verify that the node type is correctly associated to * the segments in parallel * * @section LICENSE * * Copyright (©) 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) Laboratory * (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ -#include "mesh_utils.hh" #include "element_synchronizer.hh" +#include "mesh_utils.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; int main(int argc, char * argv[]) { initialize(argc, argv); UInt spatial_dimension = 3; Mesh mesh(spatial_dimension); StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Int psize = comm.getNbProc(); Int prank = comm.whoAmI(); - ElementSynchronizer * dist = NULL; // partition the mesh if (prank == 0) { mesh.read("mesh.msh"); - MeshPartitionScotch partition(mesh, spatial_dimension); - partition.partitionate(psize); - dist = ElementSynchronizer::createDistributedSynchronizerMesh( - mesh, &partition); - } else { - dist = - ElementSynchronizer::createDistributedSynchronizerMesh(mesh, NULL); } + mesh.distribute(); + // compute the node types for each segment Mesh mesh_facets(mesh.initMeshFacets()); - MeshUtils::buildSegmentToNodeType(mesh, mesh_facets, dist); + MeshUtils::buildSegmentToNodeType(mesh, mesh_facets); // verify that the number of segments per node type makes sense std::map nb_facets_per_nodetype; UInt nb_segments = 0; - for (ghost_type_t::iterator gt = ghost_type_t::begin(); - gt != ghost_type_t::end(); ++gt) { - GhostType ghost_type = *gt; - + for (auto ghost_type : ghost_types) { const Array & segment_to_nodetype = mesh_facets.getData("segment_to_nodetype", _segment_2, ghost_type); // count the number of segments per node type - for (UInt s = 0; s < segment_to_nodetype.getSize(); ++s) { - if (nb_facets_per_nodetype.find(segment_to_nodetype(s)) == - nb_facets_per_nodetype.end()) - nb_facets_per_nodetype[segment_to_nodetype(s)] = 1; + for (auto & stn : segment_to_nodetype) { + if (nb_facets_per_nodetype.find(stn) == nb_facets_per_nodetype.end()) + nb_facets_per_nodetype[stn] = 1; else - ++nb_facets_per_nodetype[segment_to_nodetype(s)]; + ++nb_facets_per_nodetype[stn]; } nb_segments += segment_to_nodetype.getSize(); } // checking the solution if (nb_segments != 24) AKANTU_DEBUG_ERROR("The number of segments is wrong"); if (prank == 0) { if (nb_facets_per_nodetype[-1] != 3 || nb_facets_per_nodetype[-2] != 9 || nb_facets_per_nodetype[-3] != 12) AKANTU_DEBUG_ERROR( "The segments of processor 0 have the wrong node type"); if (nb_facets_per_nodetype.size() > 3) AKANTU_DEBUG_ERROR("Processor 0 cannot have any slave segment"); } if (prank == psize - 1 && nb_facets_per_nodetype.find(-2) != nb_facets_per_nodetype.end()) AKANTU_DEBUG_ERROR("The last processor must not have any master facets"); finalize(); return 0; } diff --git a/test/test_model/test_model_solver/test_model_solver.cc b/test/test_model/test_model_solver/test_model_solver.cc index 325e996a4..f0d9a3f81 100644 --- a/test/test_model/test_model_solver/test_model_solver.cc +++ b/test/test_model/test_model_solver/test_model_solver.cc @@ -1,164 +1,155 @@ /** * @file test_dof_manager_default.cc * * @author Nicolas Richart * * @date Wed Feb 24 12:28:44 2016 * * @brief Test default dof manager * * @section LICENSE * * Copyright (©) 2010-2011 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_random_generator.hh" #include "dof_manager.hh" #include "dof_synchronizer.hh" #include "mesh.hh" #include "mesh_accessor.hh" #include "model_solver.hh" #include "non_linear_solver_newton_raphson.hh" #include "sparse_matrix.hh" #include "sparse_solver_mumps.hh" /* -------------------------------------------------------------------------- */ #include "test_model_solver_my_model.hh" /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ using namespace akantu; static void genMesh(Mesh & mesh, UInt nb_nodes); static void printResults(MyModel & model, UInt nb_nodes); Real F = -10; /* -------------------------------------------------------------------------- */ int main(int argc, char * argv[]) { initialize(argc, argv); UInt prank = StaticCommunicator::getStaticCommunicator().whoAmI(); std::cout << std::setprecision(7); UInt global_nb_nodes = 100; Mesh mesh(1); RandGenerator::seed(1); if (prank == 0) { genMesh(mesh, global_nb_nodes); } - std::cout << prank << RandGenerator::seed() << std::endl; + //std::cout << prank << RandGenerator::seed() << std::endl; mesh.distribute(); MyModel model(F, mesh, false); - UInt node = 0; - for (auto pos : mesh.getNodes()) { - std::cout << prank << " " << node << " pos: " << pos << " [" - << mesh.getNodeGlobalId(node) << "] " << mesh.getNodeType(node) - << " -- " << model.forces(node) << " " << model.blocked(node) - << std::endl; - ++node; - } - model.getNewSolver("static", _tsst_static, _nls_newton_raphson); model.setIntegrationScheme("static", "disp", _ist_pseudo_time); NonLinearSolver & solver = model.getDOFManager().getNonLinearSolver("static"); solver.set("max_iterations", 2); model.solveStep(); dynamic_cast( model.getDOFManager().getNonLinearSolver("static")) .getSolver() .analysis(); printResults(model, global_nb_nodes); finalize(); return EXIT_SUCCESS; } /* -------------------------------------------------------------------------- */ void genMesh(Mesh & mesh, UInt nb_nodes) { MeshAccessor mesh_accessor(mesh); Array & nodes = mesh_accessor.getNodes(); Array & conn = mesh_accessor.getConnectivity(_segment_2); nodes.resize(nb_nodes); for (UInt n = 0; n < nb_nodes; ++n) { nodes(n, _x) = n * (1. / (nb_nodes - 1)); } conn.resize(nb_nodes - 1); for (UInt n = 0; n < nb_nodes - 1; ++n) { conn(n, 0) = n; conn(n, 1) = n + 1; } } /* -------------------------------------------------------------------------- */ void printResults(MyModel & model, UInt nb_nodes) { UInt prank = StaticCommunicator::getStaticCommunicator().whoAmI(); auto & sync = dynamic_cast(model.getDOFManager()) .getSynchronizer(); if (prank == 0) { Array global_displacement(nb_nodes); Array global_forces(nb_nodes); Array global_blocked(nb_nodes); sync.gather(model.forces, global_forces); sync.gather(model.displacement, global_displacement); sync.gather(model.blocked, global_blocked); auto force_it = global_forces.begin(); auto disp_it = global_displacement.begin(); auto blocked_it = global_blocked.begin(); std::cout << "node" << ", " << std::setw(8) << "disp" << ", " << std::setw(8) << "force" << ", " << std::setw(8) << "blocked" << std::endl; UInt node = 0; for (; disp_it != global_displacement.end(); ++disp_it, ++force_it, ++blocked_it, ++node) { std::cout << node << ", " << std::setw(8) << *disp_it << ", " << std::setw(8) << *force_it << ", " << std::setw(8) << *blocked_it << std::endl; std::cout << std::flush; } } else { sync.gather(model.forces); sync.gather(model.displacement); sync.gather(model.blocked); } } diff --git a/test/test_model/test_model_solver/test_model_solver.verified b/test/test_model/test_model_solver/test_model_solver.verified index 2a32ce385..d4684354d 100644 --- a/test/test_model/test_model_solver/test_model_solver.verified +++ b/test/test_model/test_model_solver/test_model_solver.verified @@ -1,12 +1,101 @@ node, disp, force, blocked 0, 0, 0, 1 -1, 1, 0, 0 -2, 2, 0, 0 -3, 3, 0, 0 -4, 4, 0, 0 -5, 5, 0, 0 -6, 6, 0, 0 -7, 7, 0, 0 -8, 8, 0, 0 -9, 9, 0, 0 -10, 10, 10, 0 +1, -0.1010101, 0, 0 +2, -0.2020202, 0, 0 +3, -0.3030303, 0, 0 +4, -0.4040404, 0, 0 +5, -0.5050505, 0, 0 +6, -0.6060606, 0, 0 +7, -0.7070707, 0, 0 +8, -0.8080808, 0, 0 +9, -0.9090909, 0, 0 +10, -1.010101, 0, 0 +11, -1.111111, 0, 0 +12, -1.212121, 0, 0 +13, -1.313131, 0, 0 +14, -1.414141, 0, 0 +15, -1.515152, 0, 0 +16, -1.616162, 0, 0 +17, -1.717172, 0, 0 +18, -1.818182, 0, 0 +19, -1.919192, 0, 0 +20, -2.020202, 0, 0 +21, -2.121212, 0, 0 +22, -2.222222, 0, 0 +23, -2.323232, 0, 0 +24, -2.424242, 0, 0 +25, -2.525253, 0, 0 +26, -2.626263, 0, 0 +27, -2.727273, 0, 0 +28, -2.828283, 0, 0 +29, -2.929293, 0, 0 +30, -3.030303, 0, 0 +31, -3.131313, 0, 0 +32, -3.232323, 0, 0 +33, -3.333333, 0, 0 +34, -3.434343, 0, 0 +35, -3.535354, 0, 0 +36, -3.636364, 0, 0 +37, -3.737374, 0, 0 +38, -3.838384, 0, 0 +39, -3.939394, 0, 0 +40, -4.040404, 0, 0 +41, -4.141414, 0, 0 +42, -4.242424, 0, 0 +43, -4.343434, 0, 0 +44, -4.444444, 0, 0 +45, -4.545455, 0, 0 +46, -4.646465, 0, 0 +47, -4.747475, 0, 0 +48, -4.848485, 0, 0 +49, -4.949495, 0, 0 +50, -5.050505, 0, 0 +51, -5.151515, 0, 0 +52, -5.252525, 0, 0 +53, -5.353535, 0, 0 +54, -5.454545, 0, 0 +55, -5.555556, 0, 0 +56, -5.656566, 0, 0 +57, -5.757576, 0, 0 +58, -5.858586, 0, 0 +59, -5.959596, 0, 0 +60, -6.060606, 0, 0 +61, -6.161616, 0, 0 +62, -6.262626, 0, 0 +63, -6.363636, 0, 0 +64, -6.464646, 0, 0 +65, -6.565657, 0, 0 +66, -6.666667, 0, 0 +67, -6.767677, 0, 0 +68, -6.868687, 0, 0 +69, -6.969697, 0, 0 +70, -7.070707, 0, 0 +71, -7.171717, 0, 0 +72, -7.272727, 0, 0 +73, -7.373737, 0, 0 +74, -7.474747, 0, 0 +75, -7.575758, 0, 0 +76, -7.676768, 0, 0 +77, -7.777778, 0, 0 +78, -7.878788, 0, 0 +79, -7.979798, 0, 0 +80, -8.080808, 0, 0 +81, -8.181818, 0, 0 +82, -8.282828, 0, 0 +83, -8.383838, 0, 0 +84, -8.484848, 0, 0 +85, -8.585859, 0, 0 +86, -8.686869, 0, 0 +87, -8.787879, 0, 0 +88, -8.888889, 0, 0 +89, -8.989899, 0, 0 +90, -9.090909, 0, 0 +91, -9.191919, 0, 0 +92, -9.292929, 0, 0 +93, -9.393939, 0, 0 +94, -9.494949, 0, 0 +95, -9.59596, 0, 0 +96, -9.69697, 0, 0 +97, -9.79798, 0, 0 +98, -9.89899, 0, 0 +99, -10, -10, 0 diff --git a/test/test_model/test_model_solver/test_model_solver_dynamic_explicit.verified b/test/test_model/test_model_solver/test_model_solver_dynamic_explicit.verified index 79604763a..4ef78f49e 100644 --- a/test/test_model/test_model_solver/test_model_solver_dynamic_explicit.verified +++ b/test/test_model/test_model_solver/test_model_solver_dynamic_explicit.verified @@ -1,2002 +1,202 @@ - time, disp, velo, reac, wext, epot, ekin, total - 0, 0, 0, -0, 0, 0, 0, 0 - 0.001, 0, -1.962, -0,0.0192472, 0,0.0048118,-0.0144354 - 0.002,-0.003924,-5.72904, -0,0.0754491,0.00153978,0.0410428,-0.0328666 - 0.003,-0.0114581,-9.04404, -0,0.164171,0.012774,0.102604,-0.0487932 - 0.004,-0.0220121,-11.6659, -0,0.278614,0.0452231,0.172681,-0.0607089 - 0.005,-0.0347899,-13.4355, -0,0.410416,0.106783,0.235979,-0.0676538 - 0.006,-0.0488831,-14.2928, -0,0.550628,0.196298,0.284868,-0.0694632 - 0.007,-0.0633755,-14.2811, -0,0.690726,0.302603,0.321327,-0.0667962 - 0.008,-0.0774452,-13.5374, -0,0.823528,0.408548,0.354051,-0.0609292 - 0.009,-0.0904504, -12.272, -0,0.943916,0.497889,0.392622,-0.0534054 - 0.01,-0.101989,-10.7378, -0, 1.04925,0.561539,0.442033,-0.0456807 - 0.011,-0.111926,-9.19645, -0, 1.13947,0.600169,0.500411,-0.0388906 - 0.012,-0.120382,-7.88413, -0, 1.21681,0.622205,0.560823,-0.0337852 - 0.013,-0.127694,-6.98202, -0, 1.28531,0.638742,0.615775,-0.0307905 - 0.014,-0.134346,-6.59599, -0, 1.35001,0.658295,0.661618,-0.030101 - 0.015,-0.140886,-6.74725, -0, 1.4162,0.684108,0.700376,-0.0317203 - 0.016,-0.147841,-7.37528, -0, 1.48856,0.715003,0.738129,-0.0354243 - 0.017,-0.155637,-8.35188, -0, 1.57049,0.748646,0.781148,-0.0406935 - 0.018,-0.164544,-9.50425, -0, 1.66372,0.784851,0.832177,-0.0466972 - 0.019,-0.174645,-10.6431, -0, 1.76813,0.826726,0.889014,-0.0523937 - 0.02,-0.185831,-11.5916, -0, 1.88185,0.878992, 0.94611,-0.0567458 - 0.021,-0.197828,-12.2118, -0, 2.00164,0.944612,0.998052,-0.0589804 - 0.022,-0.210254,-12.4226, -0, 2.12351, 1.02193, 1.04279,-0.0587893 - 0.023,-0.222674,-12.2103, -0, 2.24329, 1.10422, 1.08269,-0.0563845 - 0.024,-0.234675,-11.6269, -0, 2.35735, 1.18204, 1.12292,-0.0523941 - 0.025,-0.245927,-10.7795, -0, 2.4631, 1.24722, 1.16823,-0.0476515 - 0.026,-0.256234,-9.81192, -0, 2.55935, 1.29628, 1.2201,-0.0429745 - 0.027,-0.265551,-8.88061, -0, 2.64647, 1.33144, 1.27601,-0.0390177 - 0.028,-0.273995,-8.13048, -0, 2.72623, 1.3589, 1.33111,-0.036229 - 0.029,-0.281812,-7.67281, -0, 2.8015, 1.38543, 1.38119,-0.0348789 - 0.03,-0.28934, -7.5693, -0, 2.87576, 1.4154, 1.42525,-0.0351001 - 0.031,-0.296951,-7.82422, -0, 2.95251, 1.44968, 1.46595,-0.0368863 - 0.032,-0.304989,-8.38568, -0, 3.03478, 1.48685, 1.50789,-0.0400451 - 0.033,-0.313722,-9.15552, -0, 3.12459, 1.52568, 1.55476,-0.044148 - 0.034, -0.3233, -10.006, -0, 3.22275, 1.56703, 1.60718,-0.0485375 - 0.035,-0.333734,-10.8007, -0, 3.32871, 1.6139, 1.66238,-0.0524287 - 0.036,-0.344901,-11.4158, -0, 3.4407, 1.66964, 1.71597,-0.0550897 - 0.037,-0.356566,-11.7594, -0, 3.55606, 1.73533, 1.76469,-0.0560356 - 0.038,-0.36842,-11.7846, -0, 3.67166, 1.80821, 1.8083,-0.0551571 - 0.039,-0.380135,-11.4961, -0, 3.78444, 1.88203, 1.84968,-0.0527282 - 0.04,-0.391412,-10.9474, -0, 3.89183, 1.94957, 1.89297,-0.0492985 - 0.041,-0.40203, -10.232, -0, 3.99221, 2.00563, 1.94106,-0.0455222 - 0.042,-0.411876,-9.46688, -0, 4.08508, 2.04923, 1.99385,-0.0420011 - 0.043,-0.420964,-8.77433, -0, 4.17116, 2.08358, 2.04838,-0.0391959 - 0.044,-0.429425,-8.26213, -0, 4.25221, 2.11408, 2.10072,-0.0374136 - 0.045,-0.437488,-8.00715, -0, 4.33076, 2.14557, 2.14835,-0.0368368 - 0.046,-0.445439,-8.04396, -0, 4.40967, 2.18045, 2.19167,-0.0375424 - 0.047,-0.453576, -8.3603, -0, 4.49168, 2.2185, 2.2337,-0.0394826 - 0.048,-0.46216, -8.9001, -0, 4.57899, 2.25839, 2.27816,-0.0424378 - 0.049,-0.471376,-9.57318, -0, 4.67291, 2.29969, 2.32723,-0.0459849 - 0.05,-0.481306,-10.2702, -0, 4.77366, 2.34389, 2.38024,-0.0495292 - 0.051,-0.491916,-10.8803, -0, 4.88039, 2.39385, 2.43412,-0.0524161 - 0.052,-0.503067,-11.3084, -0, 4.99133, 2.45187, 2.48536,-0.0540936 - 0.053,-0.514533,-11.4904, -0, 5.10405, 2.51768, 2.5321,-0.0542631 - 0.054,-0.526047, -11.402, -0, 5.2159, 2.58767, 2.57527,-0.0529545 - 0.055,-0.537337,-11.0624, -0, 5.32442, 2.65598, 2.61795,-0.0504967 - 0.056,-0.548172,-10.5299, -0, 5.42772, 2.71686, 2.66346,-0.0474016 - 0.057,-0.558397,-9.89248, -0, 5.52477, 2.76721, 2.71334,-0.0442182 - 0.058,-0.567957,-9.25311, -0, 5.61554, 2.80769, 2.76644,-0.0414175 - 0.059,-0.576903,-8.71322, -0, 5.70102, 2.84201, 2.81966,-0.0393428 - 0.06,-0.585384,-8.35677, -0, 5.783, 2.87488, 2.8699,-0.0382159 - 0.061,-0.593617,-8.23723, -0, 5.8638, 2.90973, 2.91591,-0.0381619 - 0.062,-0.601858,-8.36965, -0, 5.94591, 2.94765, 2.95905,-0.0392134 - 0.063,-0.610356,-8.72892, -0, 6.03154, 2.98787, 3.00239,-0.04128 - 0.064,-0.619316,-9.25438, -0, 6.12233, 3.02937, 3.04885,-0.0441063 - 0.065,-0.628865,-9.85999, -0, 6.21905, 3.0724, 3.09939,-0.0472609 - 0.066,-0.639036,-10.4484, -0, 6.32155, 3.11889, 3.15247,-0.0501908 - 0.067,-0.649762,-10.9263, -0, 6.42874, 3.17138, 3.20502,-0.0523404 - 0.068,-0.660888,-11.2197, -0, 6.5388, 3.23115, 3.25435,-0.0532976 - 0.069,-0.672201,-11.2845, -0, 6.6495, 3.29683, 3.29977,-0.052907 - 0.07,-0.683457,-11.1139, -0, 6.75853, 3.36425, 3.34298,-0.0513024 - 0.071,-0.694429,-10.7383, -0, 6.86387, 3.42802, 3.387,-0.0488487 - 0.072,-0.704934,-10.2203, -0, 6.96413, 3.48378, 3.43434,-0.0460236 - 0.073,-0.714869,-9.64421, -0, 7.05874, 3.53004, 3.48541,-0.0432942 - 0.074,-0.724222,-9.10238, -0, 7.14804, 3.56864, 3.53836,-0.0410361 - 0.075,-0.733074,-8.68045, -0, 7.23319, 3.60346, 3.59022,-0.0395108 - 0.076,-0.741583,-8.44385, -0, 7.31603, 3.63843, 3.63872,-0.0388814 - 0.077,-0.749962,-8.42775, -0, 7.3987, 3.67581, 3.68367,-0.0392306 - 0.078,-0.758439,-8.63182, -0, 7.48338, 3.71579, 3.72704,-0.040551 - 0.079,-0.767225,-9.02077, -0, 7.57188, 3.7574, 3.77177,-0.0427094 - 0.08,-0.77648,-9.53041, -0, 7.66537, 3.80006, 3.81989,-0.0454148 - 0.081,-0.786286,-10.0782, -0, 7.76424, 3.84463, 3.87137,-0.0482288 - 0.082,-0.796637,-10.5765, -0, 7.86799, 3.89324, 3.92411,-0.0506382 - 0.083,-0.807439,-10.9468, -0, 7.97538, 3.94793, 3.97527,-0.0521781 - 0.084,-0.81853,-11.1317, -0, 8.08458, 4.00901, 4.02302,-0.0525576 - 0.085,-0.829703,-11.1039, -0, 8.19351, 4.07416, 4.06761,-0.0517388 - 0.086,-0.840738,-10.8705, -0, 8.30015, 4.13897, 4.11125,-0.049933 - 0.087,-0.851444, -10.471, -0, 8.40287, 4.19867, 4.15668,-0.0475231 - 0.088,-0.86168,-9.97079, -0, 8.50069, 4.25022, 4.20552,-0.0449491 - 0.089,-0.871385,-9.45068, -0, 8.5934, 4.2935, 4.25729,-0.0426074 - 0.09,-0.880581,-8.99361, -0, 8.68162, 4.33109, 4.30973,-0.0407987 - 0.091,-0.889372,-8.67161, -0, 8.76669, 4.36678, 4.36019,-0.0397235 - 0.092,-0.897925,-8.53443, -0, 8.85042, 4.40366, 4.40725,-0.0395019 - 0.093,-0.906441,-8.60187, -0, 8.9348, 4.44301, 4.45161,-0.0401808 - 0.094,-0.915128,-8.86099, -0, 9.02173, 4.48443, 4.49558,-0.0417138 - 0.095,-0.924163, -9.2685, -0, 9.11265, 4.52701, 4.54171,-0.0439257 - 0.096,-0.933665,-9.75797, -0, 9.20838, 4.57069, 4.59119,-0.0464937 - 0.097,-0.943679,-10.2506, -0, 9.30893, 4.61681, 4.64315,-0.0489787 - 0.098,-0.954167, -10.668, -0, 9.41359, 4.66746, 4.69522,-0.0509133 - 0.099,-0.965015,-10.9445, -0, 9.52095, 4.72405, 4.74498,-0.051921 - 0.1,-0.976056,-11.0375, -0, 9.62923, 4.78596, 4.79145,-0.0518209 - 0.101,-0.98709, -10.934, -0, 9.73649, 4.85015, 4.83567,-0.050672 - 0.102,-0.997924,-10.6524, -0, 9.84099, 4.9122, 4.88005,-0.0487411 - 0.103, -1.0084,-10.2395, -0, 9.94144, 4.96816, 4.92687,-0.0464135 - 0.104, -1.0184,-9.76205, -0, 10.0372, 5.01622, 4.9769,-0.0440872 - 0.105,-1.02792,-9.29686, -0, 10.1284, 5.05737, 5.02894,-0.0420956 - 0.106, -1.037,-8.91787, -0, 10.2159, 5.09464, 5.08057,-0.0406787 - 0.107,-1.04575,-8.68459, -0, 10.3011, 5.13145, 5.12965,-0.0399907 - 0.108,-1.05437,-8.63281, -0, 10.3858, 5.17004, 5.17562,-0.0401174 - 0.109,-1.06302,-8.76909, -0, 10.4718, 5.21092, 5.21981,-0.0410722 - 0.11, -1.0719, -9.07, -0, 10.5608, 5.25336, 5.26465,-0.0427698 - 0.111,-1.08116,-9.48609, -0, 10.6538, 5.29671, 5.31214,-0.0449942 - 0.112,-1.09088,-9.95006, -0, 10.7514, 5.34142, 5.36263,-0.0473974 - 0.113,-1.10106,-10.3876, -0, 10.8534, 5.38915, 5.41465,-0.0495496 - 0.114,-1.11165,-10.7292, -0, 10.9586, 5.44177, 5.4658,-0.0510365 - 0.115,-1.12252,-10.9213, -0, 11.0657, 5.49994, 5.51423,-0.0515704 - 0.116,-1.13349,-10.9346, -0, 11.173, 5.56217, 5.55977,-0.0510696 - 0.117,-1.14439,-10.7686, -0, 11.2786, 5.62495, 5.60403,-0.0496719 - 0.118,-1.15503,-10.4512, -0, 11.3812, 5.68412, 5.64937,-0.0476806 - 0.119,-1.16529,-10.0342, -0, 11.4796, 5.73665, 5.69749,-0.0454695 - 0.12, -1.1751,-9.58509, -0, 11.5736, 5.78188, 5.74837,-0.0433922 - 0.121,-1.18446,-9.17553, -0, 11.6637, 5.82165, 5.80028,-0.0417258 - 0.122,-1.19345,-8.87048, -0, 11.7507, 5.85911, 5.85091,-0.0406611 - 0.123, -1.2022,-8.71771, -0, 11.8362, 5.89716, 5.89872,-0.0403159 - 0.124,-1.21089,-8.74031, -0, 11.9219, 5.93726, 5.94393,-0.0407461 - 0.125,-1.21968,-8.93325, -0, 12.0096, 5.9793, 5.98833,-0.0419321 - 0.126,-1.22875,-9.26443, -0, 12.1005, 6.02249, 6.03422,-0.0437487 - 0.127,-1.23821,-9.67996, -0, 12.1954, 6.06654, 6.08293,-0.045943 - 0.128,-1.24811, -10.113, -0, 12.2946, 6.11238, 6.13409,-0.0481503 - 0.129,-1.25844,-10.4943, -0, 12.3976, 6.1618, 6.18581,-0.0499611 - 0.13, -1.2691,-10.7635, -0, 12.5032, 6.21625, 6.23589,-0.051022 - 0.131,-1.27996,-10.8787, -0, 12.6099, 6.27562, 6.28313,-0.0511332 - 0.132,-1.29086,-10.8226, -0, 12.7161, 6.33765, 6.3281,-0.0503015 - 0.133,-1.30161,-10.6054, -0, 12.8201, 6.39862, 6.37274,-0.0487263 - 0.134,-1.31207,-10.2631, -0, 12.9208, 6.45486, 6.41918,-0.0467298 - 0.135,-1.32214,-9.85101, -0, 13.0174, 6.50431, 6.46844,-0.0446644 - 0.136,-1.33177,-9.43548, -0, 13.11, 6.54734, 6.51979,-0.0428377 - 0.137,-1.34101,-9.08272, -0, 13.1991, 6.58635, 6.57125,-0.0414779 - 0.138,-1.34994,-8.84852, -0, 13.2859, 6.62438, 6.62076,-0.0407356 - 0.139, -1.3587,-8.76934, -0, 13.3719, 6.66372, 6.66749,-0.0406989 - 0.14,-1.36747,-8.85669, -0, 13.4588, 6.70509, 6.71231,-0.0413954 - 0.141,-1.37642,-9.09546, -0, 13.548, 6.748, 6.75725,-0.0427713 - 0.142,-1.38567,-9.44648, -0, 13.6407, 6.79177, 6.80425,-0.044662 - 0.143,-1.39531,-9.85302, -0, 13.7373, 6.83657, 6.85399,-0.046783 - 0.144,-1.40537,-10.2498, -0, 13.8379, 6.88368, 6.90545,-0.0487634 - 0.145,-1.41581,-10.5738, -0, 13.9416, 6.93482, 6.95658,-0.050225 - 0.146,-1.42652,-10.7736, -0, 14.0473, 6.99091, 7.00552,-0.050882 - 0.147,-1.43736,-10.8184, -0, 14.1534, 7.05102, 7.0518,-0.0506202 - 0.148,-1.44816,-10.7021, -0, 14.2584, 7.11235, 7.09656,-0.0495225 - 0.149,-1.45876,-10.4442, -0, 14.3609, 7.17119, 7.14186,-0.0478334 - 0.15,-1.46904,-10.0869, -0, 14.4598, 7.22453, 7.18943,-0.045879 - 0.151,-1.47893,-9.68785, -0, 14.5549, 7.27131, 7.23958,-0.0439826 - 0.152,-1.48842,-9.31089, -0, 14.6462, 7.31275, 7.29106,-0.0424072 - 0.153,-1.49756,-9.01602, -0, 14.7347, 7.35153, 7.3418,-0.0413385 - 0.154,-1.50645,-8.84973, -0, 14.8215, 7.39039, 7.39019,-0.0408945 - 0.155,-1.51526,-8.83771, -0, 14.9082, 7.43095, 7.43609,-0.0411374 - 0.156,-1.52413,-8.98087, -0, 14.9963, 7.47335, 7.48087,-0.0420663 - 0.157,-1.53322,-9.25538, -0, 15.0871, 7.51691, 7.52658,-0.0435916 - 0.158,-1.54264,-9.61663, -0, 15.1814, 7.56121, 7.57469,-0.0455115 - 0.159,-1.55245,-10.0064, -0, 15.2796, 7.60687, 7.62519,-0.0475167 - 0.16,-1.56265,-10.3625, -0, 15.3812, 7.65538, 7.67661,-0.0492416 - 0.161,-1.57318,-10.6281, -0, 15.4855, 7.70823, 7.72692,-0.0503505 - 0.162,-1.58391,-10.7616, -0, 15.5911, 7.76566, 7.77478,-0.0506295 - 0.163, -1.5947,-10.7424, -0, 15.6964, 7.82604, 7.82036,-0.0500446 - 0.164,-1.60539,-10.5746, -0, 15.8002, 7.8862, 7.86524,-0.0487425 - 0.165,-1.61585,-10.2858, -0, 15.9011, 7.94269, 7.9114,-0.0469961 - 0.166,-1.62596,-9.92288, -0, 15.9984, 7.99328, 7.96004,-0.0451235 - 0.167,-1.63569, -9.5441, -0, 16.0921, 8.03784, 8.01081,-0.0434139 - 0.168,-1.64505,-9.21001, -0, 16.1824, 8.07824, 8.06208,-0.0420887 - 0.169,-1.65411,-8.97364, -0, 16.2704, 8.11722, 8.11193,-0.0412974 - 0.17, -1.663,-8.87213, -0, 16.3575, 8.15706, 8.15928,-0.0411311 - 0.171,-1.67186,-8.92085, -0, 16.445, 8.19872, 8.20464,-0.0416273 - 0.172,-1.68084,-9.11118, -0, 16.5344, 8.24192, 8.2497,-0.0427554 - 0.173,-1.69008, -9.4119, -0, 16.6267, 8.28598, 8.29634,-0.0443893 - 0.174,-1.69967,-9.77442, -0, 16.7226, 8.33085, 8.34545,-0.0462931 - 0.175,-1.70963,-10.1405, -0, 16.8221, 8.37751, 8.39641,-0.0481423 - 0.176,-1.71995,-10.4518, -0, 16.9246, 8.42754, 8.44748,-0.0495882 - 0.177,-1.73053,-10.6589, -0, 17.0292, 8.48199, 8.49683,-0.0503469 - 0.178,-1.74126,-10.7293, -0, 17.1344, 8.54041, 8.54373,-0.0502784 - 0.179,-1.75199,-10.6527, -0, 17.2389, 8.60056, 8.58894,-0.0494216 - 0.18,-1.76257, -10.442, -0, 17.3414, 8.65915, 8.63424,-0.0479727 - 0.181,-1.77288,-10.1316, -0, 17.4408, 8.71317, 8.68137,-0.0462193 - 0.182,-1.78283,-9.77159, -0, 17.5366, 8.76124, 8.73091,-0.044461 - 0.183,-1.79242, -9.4197, -0, 17.629, 8.80407, 8.78199,-0.0429512 - 0.184,-1.80167,-9.13202, -0, 17.7186, 8.84395, 8.83278,-0.0418733 - 0.185,-1.81068, -8.9541, -0, 17.8064, 8.88345, 8.88164,-0.0413468 - 0.186,-1.81958,-8.91374, -0, 17.8939, 8.92431, 8.92814,-0.0414391 - 0.187,-1.82851,-9.01665, -0, 17.9823, 8.96691, 8.97326,-0.0421631 - 0.188,-1.83761,-9.24562, -0, 18.073, 9.01071, 9.01887,-0.0434564 - 0.189, -1.847,-9.56345, -0, 18.1669, 9.05521, 9.06649,-0.0451569 - 0.19,-1.85674,-9.91895, -0, 18.2642, 9.10074, 9.11642, -0.047 - 0.191,-1.86684,-10.2552, -0, 18.3648, 9.14858, 9.16753,-0.0486565 - 0.192,-1.87725,-10.5186, -0, 18.468, 9.20015, 9.21799,-0.0498062 - 0.193,-1.88788,-10.6676, -0, 18.5726, 9.25601, 9.26636,-0.0502245 - 0.194,-1.89859,-10.6789, -0, 18.6774, 9.31501, 9.3125,-0.0498438 - 0.195,-1.90923,-10.5514, -0, 18.7809, 9.37447, 9.35764,-0.0487668 - 0.196,-1.91969,-10.3063, -0, 18.882, 9.43115, 9.4036,-0.0472252 - 0.197,-1.92985, -9.9832, -0, 18.9799, 9.4827, 9.4517,-0.045508 - 0.198,-1.93966,-9.63409, -0, 19.0744, 9.52858, 9.50195,-0.0438901 - 0.199,-1.94912,-9.31483, -0, 19.1658, 9.57019, 9.55302,-0.0425885 - 0.2,-1.95828,-9.07621, -0, 19.2548, 9.60997, 9.60311,-0.0417538 - 0.201,-1.96727,-8.95592,-5.06637e-279, 19.3427, 9.65021, 9.651,-0.0414798 - 0.202, -1.9762,-8.97255,-1.95055e-276, 19.4307, 9.69205, 9.69686,-0.0418121 - 0.203,-1.98521,-9.12279,-3.7634e-274, 19.5202, 9.73541, 9.74207,-0.0427376 - 0.204,-1.99444,-9.38199,-4.85178e-272, 19.6122, 9.77967, 9.78842,-0.0441606 - 0.205,-2.00398,-9.70824,-4.70186e-270, 19.7075, 9.82461, 9.83699,-0.0458847 - 0.206,-2.01386,-10.0491,-3.65352e-268, 19.8061, 9.87095, 9.88749,-0.0476243 - 0.207,-2.02408,-10.3502,-2.37112e-266, 19.9076, 9.92009, 9.93845,-0.0490564 - 0.208,-2.03456,-10.5636,-1.32199e-264, 20.0112, 9.9732, 9.98813,-0.0499003 - 0.209, -2.0452,-10.6557,-6.46375e-263, 20.1158, 10.0302, 10.0356,-0.0499949 - 0.21,-2.05587,-10.6123,-2.81554e-261, 20.2199, 10.0893, 10.0812,-0.0493419 - 0.211,-2.06643, -10.441,-1.10625e-259, 20.3223, 10.1476, 10.1266,-0.048096 - 0.212,-2.07675,-10.1698,-3.96023e-258, 20.4221, 10.2022, 10.1733,-0.0465112 - 0.213,-2.08677,-9.84248,-1.30246e-256, 20.5186, 10.2514, 10.2223,-0.044867 - 0.214,-2.09644,-9.51149,-3.96284e-255, 20.6119, 10.2955, 10.273,-0.0434092 - 0.215,-2.10579,-9.22969,-1.12209e-253, 20.7025, 10.3363, 10.3238,-0.0423209 - 0.216, -2.1149,-9.04186,-2.97194e-252, 20.7912, 10.3764, 10.3731,-0.0417238 - 0.217,-2.12387,-8.97753,-7.3957e-251, 20.8792, 10.4175, 10.4201,-0.04169 - 0.218,-2.13285, -9.0464,-1.73597e-249, 20.968, 10.4602, 10.4656,-0.0422431 - 0.219,-2.14197,-9.23687,-3.85685e-248, 21.0586, 10.5041, 10.5111,-0.0433422 - 0.22,-2.15133,-9.51797,-8.13559e-247, 21.152, 10.5488, 10.5583,-0.0448574 - 0.221, -2.161,-9.84442,-1.63386e-245, 21.2485, 10.5942, 10.6077,-0.0465618 - 0.222,-2.17101,-10.1639,-3.13178e-244, 21.3482, 10.6415, 10.6585,-0.0481578 - 0.223,-2.18133,-10.4254,-5.74257e-243, 21.4505, 10.6921, 10.7091,-0.0493404 - 0.224,-2.19187,-10.5875,-1.00938e-241, 21.5544, 10.7466, 10.7579,-0.0498768 - 0.225, -2.2025,-10.6248,-1.70393e-240, 21.6586, 10.8044, 10.8045,-0.0496717 - 0.226,-2.21311,-10.5318,-2.76728e-239, 21.7619, 10.8632, 10.8499,-0.0487892 - 0.227,-2.22357,-10.3239,-4.33065e-238, 21.8632, 10.92, 10.8958,-0.0474244 - 0.228,-2.23376,-10.0349,-6.54018e-237, 21.9617, 10.9724, 10.9434,-0.0458405 - 0.229,-2.24364,-9.71129,-9.54459e-236, 22.0569, 11.0194, 10.9932,-0.0442998 - 0.23,-2.25319,-9.40483,-1.34774e-234, 22.1492, 11.0621, 11.044,-0.0430168 - 0.231,-2.26245, -9.1644,-1.84355e-233, 22.2391, 11.1026, 11.0943,-0.0421437 - 0.232,-2.27151,-9.02809,-2.44558e-232, 22.3276, 11.1432, 11.1427,-0.0417778 - 0.233, -2.2805,-9.01723,-3.14945e-231, 22.4161, 11.1852, 11.189,-0.0419712 - 0.234,-2.28955,-9.13299,-3.94127e-230, 22.5057, 11.2286, 11.2344,-0.0427246 - 0.235,-2.29877,-9.35636,-4.79717e-229, 22.5975, 11.273, 11.2805,-0.0439669 - 0.236,-2.30826,-9.65122,-5.68399e-228, 22.6922, 11.318, 11.3286,-0.0455349 - 0.237,-2.31807,-9.97018,-6.56136e-227, 22.79, 11.3641, 11.3787,-0.0471769 - 0.238, -2.3282,-10.2622,-7.3848e-226, 22.8906, 11.4126, 11.4295,-0.0485936 - 0.239, -2.3386,-10.4808,-8.10968e-225, 22.9935, 11.4646, 11.4794,-0.0495088 - 0.24,-2.34916,-10.5914,-8.69535e-224, 23.0974, 11.5203, 11.5273,-0.0497444 - 0.241,-2.35978,-10.5767,-9.10904e-223, 23.2011, 11.5785, 11.5734,-0.0492697 - 0.242,-2.37032,-10.4397,-9.32887e-222, 23.3035, 11.6365, 11.6188,-0.0482025 - 0.243,-2.38066,-10.2027,-9.34571e-221, 23.4036, 11.6915, 11.6653,-0.0467662 - 0.244,-2.39072, -9.9039,-9.16362e-220, 23.5008, 11.7417, 11.7138,-0.045222 - 0.245,-2.40047,-9.59137,-8.79885e-219, 23.5949, 11.7869, 11.7641,-0.043809 - 0.246, -2.4099,-9.31504,-8.27772e-218, 23.6863, 11.8287, 11.8149,-0.0427109 - 0.247, -2.4191,-9.11887,-7.63368e-217, 23.7757, 11.8692, 11.8644,-0.0420526 - 0.248,-2.42814,-9.03386,-6.90396e-216, 23.8643, 11.9105, 11.9119,-0.0419104 - 0.249,-2.43716,-9.07314,-6.12631e-215, 23.9533, 11.9532, 11.9578,-0.0423168 - 0.25,-2.44629,-9.22993,-5.33607e-214, 24.0439, 11.9973, 12.0034,-0.0432477 - 0.251,-2.45562,-9.47873,-4.564e-213, 24.1369, 12.042, 12.0502,-0.0446004 - 0.252,-2.46525,-9.77945,-3.83479e-212, 24.2328, 12.0875, 12.0992,-0.0461806 - 0.253,-2.47518,-10.0838,-3.16647e-211, 24.3317, 12.1344, 12.1496,-0.0477193 - 0.254,-2.48541,-10.3433,-2.57042e-210, 24.4332, 12.1841, 12.2002,-0.0489265 - 0.255,-2.49587,-10.5166,-2.05202e-209, 24.5364, 12.2374, 12.2494,-0.0495644 - 0.256,-2.50645,-10.5763,-1.61159e-208, 24.6401, 12.2941, 12.2965,-0.0495137 - 0.257,-2.51702,-10.5135,-1.24556e-207, 24.7433, 12.3523, 12.3422,-0.0488044 - 0.258,-2.52747,-10.3385,-9.47647e-207, 24.8447, 12.4091, 12.3879,-0.0475981 - 0.259, -2.5377,-10.0798,-7.0996e-206, 24.9436, 12.4622, 12.4352,-0.0461339 - 0.26,-2.54763,-9.77901,-5.23905e-205, 25.0395, 12.5103, 12.4845,-0.0446623 - 0.261,-2.55726,-9.48433,-3.80912e-204, 25.1325, 12.554, 12.5351,-0.0433958 - 0.262, -2.5666,-9.24279,-2.72942e-203, 25.2232, 12.5952, 12.5855,-0.0424892 - 0.263,-2.57574,-9.09276,-1.92798e-202, 25.3124, 12.6361, 12.6342,-0.0420435 - 0.264,-2.58479,-9.05785,-1.34287e-201, 25.4013, 12.6781, 12.681,-0.0421163 - 0.265,-2.59386, -9.1432,-9.22512e-201, 25.491, 12.7216, 12.7266,-0.0427197 - 0.266,-2.60307,-9.33473,-6.252e-200, 25.5825, 12.7661, 12.7726,-0.0438026 - 0.267,-2.61253,-9.60144,-4.18096e-199, 25.6767, 12.8112, 12.8203,-0.0452304 - 0.268,-2.62228,-9.90046,-2.75957e-198, 25.7738, 12.8571, 12.8699,-0.0467816 - 0.269,-2.63233,-10.1839,-1.79808e-197, 25.8737, 12.905, 12.9206,-0.0481794 - 0.27,-2.64265,-10.4066,-1.15684e-196, 25.9758, 12.956, 12.9707,-0.0491536 - 0.271,-2.65314,-10.5332,-7.35056e-196, 26.0792, 13.0106, 13.019,-0.0495126 - 0.272,-2.66371,-10.5438,-4.61358e-195, 26.1826, 13.0679, 13.0655,-0.0491974 - 0.273,-2.67423,-10.4371,-2.86096e-194, 26.285, 13.1256, 13.1111,-0.0482921 - 0.274,-2.68459,-10.2307,-1.75316e-193, 26.3854, 13.181, 13.1573,-0.0469912 - 0.275,-2.69469,-9.95787,-1.06181e-192, 26.483, 13.2321, 13.2054,-0.0455385 - 0.276, -2.7045,-9.66238,-6.35719e-192, 26.5778, 13.2783, 13.2553,-0.0441667 - 0.277,-2.71402,-9.39155,-3.76316e-191, 26.67, 13.3209, 13.306,-0.0430608 - 0.278,-2.72328,-9.18853,-2.20284e-190, 26.7601, 13.362, 13.3558,-0.0423491 - 0.279,-2.73239, -9.0855,-1.27534e-189, 26.8492, 13.4034, 13.4037,-0.0421122 - 0.28,-2.74146,-9.09856,-7.30383e-189, 26.9385, 13.4462, 13.4499,-0.0423897 - 0.281,-2.75059,-9.22522,-4.13835e-188, 27.029, 13.4902, 13.4956,-0.0431717 - 0.282,-2.75991,-9.44483,-2.32017e-187, 27.1216, 13.5351, 13.5422,-0.0443783 - 0.283,-2.76948,-9.72199,-1.28734e-186, 27.217, 13.5805, 13.5907,-0.0458436 - 0.284,-2.77935,-10.0122,-7.06982e-186, 27.3152, 13.6271, 13.6408,-0.0473257 - 0.285, -2.7895,-10.2691,-3.84352e-185, 27.416, 13.6761, 13.6913,-0.0485494 - 0.286,-2.79989,-10.4518,-2.06878e-184, 27.5185, 13.7284, 13.7408,-0.0492744 - 0.287,-2.81041,-10.5313,-1.10261e-183, 27.6218, 13.7841, 13.7884,-0.0493613 - 0.288,-2.82095,-10.4954,-5.81979e-183, 27.7248, 13.8416, 13.8344,-0.0488094 - 0.289, -2.8314, -10.35,-3.04248e-182, 27.8263, 13.8984, 13.8801,-0.047749 - 0.29,-2.84165,-10.1189,-1.57557e-181, 27.9256, 13.9521, 13.9271,-0.0463959 - 0.291,-2.85164, -9.8393,-8.08331e-181, 28.0221, 14.0012, 13.9759,-0.044989 - 0.292,-2.86133,-9.55594,-4.10899e-180, 28.1158, 14.0459, 14.0262,-0.043739 - 0.293,-2.87075,-9.31414,-2.06978e-179, 28.2072, 14.0878, 14.0766,-0.0428036 - 0.294,-2.87996,-9.15237,-1.03325e-178, 28.297, 14.129, 14.1257,-0.0422878 - 0.295,-2.88905, -9.0962,-5.11249e-178, 28.3862, 14.171, 14.1729,-0.0422543 - 0.296,-2.89815,-9.15424,-2.50754e-177, 28.476, 14.2145, 14.2188,-0.0427244 - 0.297,-2.90736,-9.31684,-1.21926e-176, 28.5674, 14.259, 14.2647,-0.0436639 - 0.298,-2.91678,-9.55767,-5.87799e-176, 28.6612, 14.3042, 14.312,-0.0449627 - 0.299,-2.92648, -9.838,-2.80987e-175, 28.7577, 14.35, 14.3613,-0.046427 - 0.3,-2.93646,-10.1129,-1.33202e-174, 28.8569, 14.3974, 14.4117,-0.0478015 - 0.301, -2.9467,-10.3385,-6.26251e-174, 28.9583, 14.4476, 14.4619,-0.0488235 - 0.302,-2.95714, -10.479,-2.92037e-173, 29.0611, 14.5012, 14.5106,-0.0492913 - 0.303,-2.96766,-10.5121,-1.3509e-172, 29.1643, 14.5577, 14.5575,-0.0491207 - 0.304,-2.97816,-10.4329,-6.19926e-172, 29.2666, 14.615, 14.6033,-0.0483648 - 0.305,-2.98853,-10.2545,-2.82248e-171, 29.3672, 14.6706, 14.6494,-0.0471906 - 0.306,-2.99867,-10.0057,-1.27507e-170, 29.4654, 14.7224, 14.6971,-0.0458244 - 0.307,-3.00854,-9.72639,-5.71588e-170, 29.5608, 14.7697, 14.7466,-0.0444927 - 0.308,-3.01812,-9.46138,-2.54285e-169, 29.6536, 14.8131, 14.7971,-0.0433815 - 0.309,-3.02746,-9.25292,-1.12274e-168, 29.7444, 14.8547, 14.8471,-0.0426231 - 0.31,-3.03663,-9.13413,-4.92035e-168, 29.834, 14.8962, 14.8954,-0.0423024 - 0.311,-3.04573, -9.1237,-2.14045e-167, 29.9235, 14.939, 14.942,-0.0424652 - 0.312,-3.05488,-9.22293,-9.24358e-167, 30.0139, 14.9831, 14.9878,-0.0431131 - 0.313,-3.06418,-9.41564,-3.96311e-166, 30.1063, 15.028, 15.0341,-0.0441858 - 0.314,-3.07371,-9.67073,-1.68704e-165, 30.2012, 15.0734, 15.0822,-0.0455429 - 0.315,-3.08352,-9.94726,-7.13082e-165, 30.2988, 15.1198, 15.132,-0.0469673 - 0.316, -3.0936, -10.201,-2.99303e-164, 30.3988, 15.1682, 15.1825,-0.0481994 - 0.317,-3.10392,-10.3914,-1.24759e-163, 30.5008, 15.2196, 15.2322,-0.0489989 - 0.318,-3.11438,-10.4884,-5.16475e-163, 30.6037, 15.2743, 15.2801,-0.0492095 - 0.319, -3.1249,-10.4767,-2.12362e-162, 30.7064, 15.3312, 15.3265,-0.0488026 - 0.32,-3.13534,-10.3585,-8.67326e-162, 30.8081, 15.3879, 15.3723,-0.0478789 - 0.321,-3.14561,-10.1531,-3.51881e-161, 30.9077, 15.4421, 15.419,-0.0466314 - 0.322,-3.15564,-9.89344,-1.41823e-160, 31.0047, 15.492, 15.4674,-0.0452873 - 0.323, -3.1654, -9.6213,-5.67883e-160, 31.0991, 15.5376, 15.5174,-0.044055 - 0.324,-3.17489,-9.38015,-2.25925e-159, 31.1911, 15.5802, 15.5678,-0.0430953 - 0.325,-3.18416,-9.20842,-8.93073e-159, 31.2815, 15.6217, 15.6172,-0.0425177 - 0.326, -3.1933,-9.13333,-3.50797e-158, 31.3711, 15.6639, 15.6648,-0.0423893 - 0.327,-3.20243,-9.16658,-1.36929e-157, 31.461, 15.7073, 15.711,-0.0427394 - 0.328,-3.21164,-9.30252,-5.31169e-157, 31.5522, 15.7518, 15.7568,-0.0435479 - 0.329,-3.22103,-9.51912,-2.04782e-156, 31.6456, 15.797, 15.8039,-0.0447262 - 0.33,-3.23068,-9.78154,-7.84693e-156, 31.7416, 15.8428, 15.8527,-0.0461057 - 0.331,-3.24059,-10.0477,-2.98867e-155, 31.8401, 15.8898, 15.9028,-0.0474522 - 0.332,-3.25077,-10.2751,-1.1315e-154, 31.9409, 15.9393, 15.9531,-0.0485117 - 0.333,-3.26114,-10.4275,-4.25841e-154, 32.0432, 15.992, 16.0022,-0.0490752 - 0.334,-3.27163,-10.4808,-1.59325e-153, 32.1461, 16.0476, 16.0494,-0.0490368 - 0.335,-3.28211,-10.4267,-5.92636e-153, 32.2483, 16.1045, 16.0954,-0.0484206 - 0.336,-3.29248,-10.2743,-2.19169e-152, 32.3491, 16.1603, 16.1415,-0.0473671 - 0.337,-3.30265,-10.0482,-8.05903e-152, 32.4477, 16.2128, 16.1888,-0.0460847 - 0.338,-3.31258,-9.78462,-2.94658e-151, 32.5437, 16.2609, 16.238,-0.0447934 - 0.339,-3.32222,-9.52593,-1.07129e-150, 32.6371, 16.3052, 16.2883,-0.0436799 - 0.34,-3.33163,-9.31338,-3.87323e-150, 32.7285, 16.3473, 16.3383,-0.0428808 - 0.341,-3.34085,-9.18081,-1.39263e-149, 32.8186, 16.389, 16.387,-0.0424854 - 0.342,-3.34999,-9.14915,-4.97982e-149, 32.9083, 16.4318, 16.434,-0.042545 - 0.343,-3.35915,-9.22317,-1.77105e-148, 32.9988, 16.4758, 16.4799,-0.0430709 - 0.344,-3.36844,-9.39074,-6.26475e-148, 33.0909, 16.5207, 16.5262,-0.0440193 - 0.345,-3.37793,-9.62481,-2.20422e-147, 33.1853, 16.5662, 16.5739,-0.0452729 - 0.346,-3.38768,-9.88779,-7.71441e-147, 33.2823, 16.6124, 16.6233,-0.0466378 - 0.347,-3.39771,-10.1376,-2.68575e-146, 33.3818, 16.6603, 16.6736,-0.0478707 - 0.348,-3.40796,-10.3343,-9.30173e-146, 33.4832, 16.7109, 16.7235,-0.0487332 - 0.349,-3.41837,-10.4467,-3.2049e-145, 33.5857, 16.7647, 16.7719,-0.0490552 - 0.35,-3.42885, -10.457,-1.09859e-144, 33.6882, 16.8209, 16.8185,-0.0487829 - 0.351,-3.43929, -10.364,-3.7467e-144, 33.7899, 16.8775, 16.8644,-0.0479891 - 0.352,-3.44958,-10.1826,-1.27136e-143, 33.8898, 16.932, 16.9109,-0.0468439 - 0.353,-3.45965, -9.9423,-4.29253e-143, 33.9873, 16.9828, 16.959,-0.0455621 - 0.354,-3.46947,-9.68149,-1.44211e-142, 34.0823, 17.0293, 17.0087,-0.0443495 - 0.355,-3.47902,-9.44195,-4.82109e-142, 34.1749, 17.0726, 17.059,-0.04337 - 0.356,-3.48835, -9.2619,-1.60386e-141, 34.2658, 17.1144, 17.1086,-0.0427375 - 0.357,-3.49754,-9.16993,-5.30985e-141, 34.3557, 17.1566, 17.1566,-0.0425239 - 0.358,-3.50669,-9.18049,-1.74947e-140, 34.4458, 17.2, 17.203,-0.0427649 - 0.359, -3.5159, -9.2916,-5.73662e-140, 34.537, 17.2445, 17.249,-0.0434526 - 0.36,-3.52527,-9.48524,-1.87217e-139, 34.63, 17.2898, 17.2957,-0.0445172 - 0.361,-3.53487,-9.73023,-6.08127e-139, 34.7255, 17.3355, 17.3442,-0.045813 - 0.362,-3.54473,-9.98729,-1.96614e-138, 34.8234, 17.3823, 17.3941,-0.0471264 - 0.363,-3.55485,-10.2153,-6.32735e-138, 34.9237, 17.4311, 17.4443,-0.0482137 - 0.364,-3.56516,-10.3779,-2.0269e-137, 35.0255, 17.4829, 17.4937,-0.0488613 - 0.365, -3.5756,-10.4494,-6.46341e-137, 35.128, 17.5377, 17.5413,-0.0489441 - 0.366,-3.58606,-10.4184,-2.05175e-136, 35.2302, 17.5942, 17.5875,-0.0484598 - 0.367,-3.59644,-10.2904,-6.48384e-136, 35.3311, 17.65, 17.6336,-0.0475225 - 0.368,-3.60664,-10.0859,-2.03987e-135, 35.4301, 17.7031, 17.6806,-0.0463229 - 0.369,-3.61661,-9.83789,-6.38922e-135, 35.5266, 17.7521, 17.7294,-0.0450732 - 0.37,-3.62632, -9.5861,-1.99243e-134, 35.6206, 17.7972, 17.7794,-0.0439609 - 0.371,-3.63578,-9.37077,-6.18617e-134, 35.7125, 17.8398, 17.8296,-0.0431265 - 0.372,-3.64506, -9.2262,-1.91239e-133, 35.803, 17.8818, 17.8786,-0.0426643 - 0.373,-3.65424, -9.1753,-5.88659e-133, 35.8931, 17.9245, 17.9259,-0.0426302 - 0.374,-3.66341,-9.22597,-1.80424e-132, 35.9836, 17.9685, 17.972,-0.0430441 - 0.375,-3.67269,-9.36982,-5.50657e-132, 36.0755, 18.0134, 18.0182,-0.0438763 - 0.376,-3.68215,-9.58363,-1.67355e-131, 36.1695, 18.0589, 18.0656,-0.0450299 - 0.377,-3.69186,-9.83304,-5.06498e-131, 36.266, 18.105, 18.1147,-0.0463333 - 0.378,-3.70182,-10.0781,-1.52656e-130, 36.3648, 18.1524, 18.1648,-0.0475595 - 0.379,-3.71201,-10.2797,-4.582e-130, 36.4657, 18.2024, 18.2148,-0.0484742 - 0.38,-3.72238,-10.4057,-1.36968e-129, 36.5678, 18.2554, 18.2635,-0.0488965 - 0.381,-3.73282,-10.4362,-4.07769e-129, 36.6701, 18.3109, 18.3105,-0.0487499 - 0.382,-3.74325,-10.3665,-1.20908e-128, 36.7718, 18.3672, 18.3566,-0.0480802 - 0.383,-3.75356,-10.2081,-3.57067e-128, 36.872, 18.422, 18.4029,-0.0470352 - 0.384,-3.76366,-9.98648,-1.0503e-127, 36.9699, 18.4735, 18.4506,-0.0458164 - 0.385,-3.77353,-9.73725,-3.07722e-127, 37.0655, 18.5208, 18.5,-0.0446263 - 0.386,-3.78314,-9.50029,-8.98037e-127, 37.1587, 18.5648, 18.5502,-0.0436313 - 0.387,-3.79253,-9.31344,-2.61055e-126, 37.25, 18.6071, 18.6,-0.0429502 - 0.388,-3.80177,-9.20642,-7.55934e-126, 37.3403, 18.6494, 18.6483,-0.0426597 - 0.389,-3.81094,-9.19613,-2.18052e-125, 37.4305, 18.6927, 18.6951,-0.042801 - 0.39,-3.82016,-9.28397,-6.26575e-125, 37.5216, 18.7372, 18.7411,-0.0433764 - 0.391,-3.82951,-9.45564,-1.79363e-124, 37.6144, 18.7824, 18.7877,-0.0443327 - 0.392,-3.83907,-9.68349,-5.11504e-124, 37.7094, 18.8281, 18.8357,-0.0455454 - 0.393,-3.84888,-9.93099,-1.45323e-123, 37.8068, 18.8747, 18.8853,-0.0468209 - 0.394,-3.85893,-10.1585,-4.11337e-123, 37.9065, 18.923, 18.9355,-0.047927 - 0.395,-3.86919,-10.3298,-1.15998e-122, 38.0078, 18.9741, 18.9851,-0.0486476 - 0.396,-3.87959,-10.4175,-3.25912e-122, 38.11, 19.0281, 19.0331,-0.0488419 - 0.397,-3.89003, -10.408,-9.1235e-122, 38.2121, 19.084, 19.0796,-0.0484823 - 0.398,-3.90041,-10.3029,-2.54473e-121, 38.3132, 19.1399, 19.1257,-0.047658 - 0.399,-3.91063,-10.1193,-7.07213e-121, 38.4124, 19.1934, 19.1725,-0.0465411 - 0.4,-3.92065,-9.88676,-1.95839e-120, 38.5094, 19.2432, 19.2209,-0.0453351 - 0.401,-3.93041,-9.64251,-5.40374e-120, 38.604, 19.2891, 19.2707,-0.0442275 - 0.402,-3.93993,-9.42564,-1.48576e-119, 38.6965, 19.3323, 19.3208,-0.0433632 - 0.403,-3.94926,-9.27074,-4.07073e-119, 38.7874, 19.3745, 19.3701,-0.0428409 - 0.404,-3.95847,-9.20239,-1.1114e-118, 38.8777, 19.4172, 19.4178,-0.0427216 - 0.405,-3.96766,-9.23132,-3.02383e-118, 38.9683, 19.4611, 19.4641,-0.0430319 - 0.406,-3.97693,-9.35265,-8.19859e-118, 39.06, 19.506, 19.5103,-0.0437547 - 0.407,-3.98637,-9.54677,-2.21526e-117, 39.1537, 19.5515, 19.5574,-0.0448113 - 0.408,-3.99603,-9.78248,-5.9652e-117, 39.2496, 19.5975, 19.6061,-0.0460509 - 0.409,-4.00593, -10.022,-1.60084e-116, 39.3479, 19.6446, 19.656,-0.0472634 - 0.41,-4.01607,-10.2271,-4.28155e-116, 39.4483, 19.6939, 19.7061,-0.0482202 - 0.411,-4.02639, -10.365,-1.14129e-115, 39.55, 19.7461, 19.7551,-0.0487324 - 0.412, -4.0368,-10.4139,-3.03205e-115, 39.6521, 19.801, 19.8024,-0.0487032 - 0.413,-4.04722,-10.3661,-8.02852e-115, 39.7538, 19.857, 19.8487,-0.048153 - 0.414,-4.05753,-10.2296,-2.11885e-114, 39.8542, 19.912, 19.8949,-0.047207 - 0.415,-4.06768,-10.0264,-5.57364e-114, 39.9525, 19.9641, 19.9423,-0.0460526 - 0.416,-4.07759,-9.78906,-1.46137e-113, 40.0485, 20.0123, 19.9913,-0.0448879 - 0.417,-4.08725,-9.55565,-3.81918e-113, 40.1423, 20.057, 20.0414,-0.0438819 - 0.418, -4.0967,-9.36345,-9.94902e-113, 40.2341, 20.0997, 20.0913,-0.043158 - 0.419,-4.10598,-9.24307,-2.58343e-112, 40.3248, 20.142, 20.14,-0.0427976 - 0.42,-4.11518,-9.21359,-6.68692e-112, 40.4152, 20.1853, 20.1871,-0.0428473 - 0.421,-4.12441,-9.27949,-1.72536e-111, 40.5062, 20.2297, 20.2332,-0.0433179 - 0.422,-4.13374,-9.43001,-4.43773e-111, 40.5987, 20.275, 20.2796,-0.0441708 - 0.423,-4.14327,-9.64091,-1.13784e-110, 40.6933, 20.3207, 20.3274,-0.0453007 - 0.424,-4.15303,-9.87834,-2.90835e-110, 40.7902, 20.3671, 20.3766,-0.0465335 - 0.425,-4.16302,-10.1043,-7.4108e-110, 40.8894, 20.4149, 20.4268,-0.0476497 - 0.426,-4.17323,-10.2827,-1.88254e-109, 40.9902, 20.4653, 20.4765,-0.0484332 - 0.427,-4.18359,-10.3851,-4.76749e-109, 41.0921, 20.5186, 20.5248,-0.0487296 - 0.428, -4.194,-10.3954,-1.20368e-108, 41.1941, 20.574, 20.5716,-0.0484886 - 0.429,-4.20438,-10.3121,-3.0298e-108, 41.2952, 20.6297, 20.6177,-0.0477746 - 0.43,-4.21463,-10.1487,-7.60339e-108, 41.3948, 20.6837, 20.6644,-0.0467407 - 0.431,-4.22468,-9.93161,-1.90238e-107, 41.4922, 20.7342, 20.7124,-0.0455811 - 0.432,-4.23449,-9.69558,-4.74558e-107, 41.5873, 20.7809, 20.762,-0.0444821 - 0.433,-4.24407,-9.47839,-1.1803e-106, 41.6803, 20.8246, 20.8121,-0.0435927 - 0.434,-4.25345,-9.31469,-2.92694e-106, 41.7717, 20.8671, 20.8616,-0.0430165 - 0.435, -4.2627,-9.23053,-7.23701e-106, 41.8623, 20.9099, 20.9096,-0.0428192 - 0.436,-4.27191,-9.23918,-1.78417e-105, 41.9529, 20.9537, 20.9562,-0.0430335 - 0.437,-4.28118,-9.33903,-4.38581e-105, 42.0445, 20.9985, 21.0023,-0.043653 - 0.438,-4.29059,-9.51393,-1.075e-104, 42.1378, 21.044, 21.0492,-0.0446151 - 0.439,-4.30021,-9.73575,-2.62735e-104, 42.2333, 21.09, 21.0976,-0.0457888 - 0.44,-4.31006,-9.96893,-6.40301e-104, 42.3311, 21.1369, 21.1473,-0.0469808 - 0.441,-4.32014,-10.1762,-1.55602e-103, 42.431, 21.1856, 21.1974,-0.0479702 - 0.442,-4.33041,-10.3244,-3.77065e-103, 42.5323, 21.2371, 21.2466,-0.0485625 - 0.443,-4.34079,-10.3901,-9.1116e-103, 42.6342, 21.2912, 21.2943,-0.0486429 - 0.444,-4.35119, -10.363,-2.19561e-102, 42.7358, 21.3469, 21.3407,-0.0482079 - 0.445,-4.36152,-10.2475,-5.27601e-102, 42.8364, 21.4021, 21.3869,-0.0473601 - 0.446,-4.37169,-10.0623,-1.2643e-101, 42.9351, 21.4547, 21.4341,-0.046272 - 0.447,-4.38164,-9.83728,-3.02133e-101, 43.0316, 21.5037, 21.4828,-0.0451362 - 0.448,-4.39136,-9.60836,-7.20034e-101, 43.1258, 21.5491, 21.5327,-0.0441235 - 0.449,-4.40086,-9.41218,-1.71128e-100, 43.2182, 21.5922, 21.5826,-0.0433623 - 0.45,-4.41019,-9.28003,-4.0561e-100, 43.3092, 21.6347, 21.6316,-0.0429384 - 0.451,-4.41942,-9.23286,-9.58787e-100, 43.3998, 21.6779, 21.679,-0.0429035 - 0.452,-4.42865,-9.27805,-2.2603e-99, 43.4908, 21.7223, 21.7253,-0.043276 - 0.453,-4.43798,-9.40816,-5.31432e-99, 43.5831, 21.7675, 21.7716,-0.0440297 - 0.454,-4.44747, -9.6022,-1.24615e-98, 43.6773, 21.8132, 21.819,-0.0450772 - 0.455,-4.45718,-9.82903,-2.91437e-98, 43.7737, 21.8594, 21.868,-0.046263 - 0.456,-4.46713,-10.0523,-6.79784e-98, 43.8723, 21.907, 21.918,-0.047381 - 0.457,-4.47728,-10.2364,-1.58146e-97, 43.9728, 21.9567, 21.9678,-0.0482176 - 0.458, -4.4876,-10.3519,-3.66951e-97, 44.0743, 22.0092, 22.0165,-0.0486072 - 0.459,-4.49799,-10.3806,-8.4924e-97, 44.1761, 22.0641, 22.0636,-0.0484787 - 0.46,-4.50836, -10.318,-1.96033e-96, 44.2774, 22.1197, 22.1098,-0.0478727 - 0.461,-4.51862,-10.1743,-4.51345e-96, 44.3772, 22.1739, 22.1563,-0.0469228 - 0.462,-4.52871,-9.97273,-1.03651e-95, 44.475, 22.2251, 22.2041,-0.0458124 - 0.463,-4.53857,-9.74559,-2.37429e-95, 44.5706, 22.2726, 22.2533,-0.0447261 - 0.464, -4.5482,-9.52923,-5.42487e-95, 44.6641, 22.3169, 22.3033,-0.0438164 - 0.465,-4.55763,-9.35822,-1.23637e-94, 44.7559, 22.3597, 22.353,-0.043192 - 0.466,-4.56692,-9.25978,-2.8107e-94, 44.8467, 22.4025, 22.4013,-0.0429231 - 0.467,-4.57615,-9.24949,-6.37372e-94, 44.9375, 22.4462, 22.4482,-0.0430482 - 0.468,-4.58541,-9.32882,-1.44175e-93, 45.029, 22.491, 22.4944,-0.0435696 - 0.469,-4.59481,-9.48489,-3.25319e-93, 45.122, 22.5365, 22.5411,-0.0444397 - 0.47,-4.60438,-9.69258,-7.32247e-93, 45.2171, 22.5824, 22.5891,-0.0455455 - 0.471,-4.61419, -9.9186,-1.64414e-92, 45.3144, 22.6291, 22.6386,-0.0467109 - 0.472,-4.62422,-10.1268,-3.68262e-92, 45.4138, 22.6774, 22.6886,-0.0477239 - 0.473,-4.63444,-10.2839,-8.22844e-92, 45.5146, 22.7282, 22.7381,-0.0483867 - 0.474,-4.64479,-10.3649,-1.83411e-91, 45.6163, 22.7817, 22.7861,-0.0485692 - 0.475,-4.65517,-10.3571,-4.07837e-91, 45.7179, 22.8369, 22.8328,-0.0482454 - 0.476, -4.6655,-10.2618,-9.047e-91, 45.8186, 22.8921, 22.879,-0.0474952 - 0.477, -4.6757,-10.0945,-2.00209e-90, 45.9176, 22.9452, 22.9259,-0.0464755 - 0.478,-4.68569,-9.88213,-4.42007e-90, 46.0146, 22.9949, 22.9743,-0.0453723 - 0.479,-4.69546,-9.65863,-9.73523e-90, 46.1093, 23.041, 23.0239,-0.0443574 - 0.48,-4.70501,-9.45979,-2.13914e-89, 46.2021, 23.0846, 23.0739,-0.0435638 - 0.481,-4.71438,-9.31735,-4.68933e-89, 46.2935, 23.1273, 23.1231,-0.0430823 - 0.482,-4.72364,-9.25394,-1.02557e-88, 46.3843, 23.1705, 23.1708,-0.0429693 - 0.483,-4.73289,-9.27955,-2.23776e-88, 46.4753, 23.2148, 23.2173,-0.0432496 - 0.484, -4.7422,-9.38989,-4.87138e-88, 46.5674, 23.2599, 23.2636,-0.0439081 - 0.485,-4.75167,-9.56715,-1.05801e-87, 46.6613, 23.3056, 23.3108,-0.0448734 - 0.486,-4.76134,-9.78286,-2.2926e-87, 46.7573, 23.3518, 23.3595,-0.0460083 - 0.487,-4.77123,-10.0025,-4.95649e-87, 46.8554, 23.399, 23.4093,-0.0471206 - 0.488,-4.78134,-10.1909,-1.06913e-86, 46.9554, 23.4482, 23.4592,-0.0480007 - 0.489,-4.79162, -10.318,-2.30093e-86, 47.0566, 23.5, 23.5081,-0.0484749 - 0.49,-4.80198,-10.3637,-4.94076e-86, 47.1583, 23.5543, 23.5555,-0.0484532 - 0.491,-4.81234,-10.3207,-1.05854e-85, 47.2595, 23.6097, 23.6019,-0.0479529 - 0.492,-4.82262,-10.1963,-2.26282e-85, 47.3595, 23.6642, 23.6483,-0.047088 - 0.493,-4.83274,-10.0103,-4.82642e-85, 47.4577, 23.7159, 23.6957,-0.04603 - 0.494,-4.84264,-9.79271,-1.02715e-84, 47.5538, 23.7642, 23.7447,-0.0449605 - 0.495,-4.85232,-9.57832,-2.18115e-84, 47.6478, 23.8091, 23.7946,-0.0440351 - 0.496, -4.8618,-9.40139,-4.62145e-84, 47.74, 23.8523, 23.8444,-0.0433678 - 0.497,-4.87112,-9.29013,-9.77058e-84, 47.8311, 23.8951, 23.893,-0.0430333 - 0.498,-4.88038,-9.26219,-2.06117e-83, 47.922, 23.9388, 23.9401,-0.0430751 - 0.499,-4.88965,-9.32187,-4.33874e-83, 48.0134, 23.9835, 23.9865,-0.0435037 - 0.5,-4.89902,-9.45946,-9.11324e-83, 48.1062, 24.0289, 24.033,-0.044284 - 0.501,-4.90857, -9.6528,-1.91005e-82, 48.2009, 24.0748, 24.0808,-0.0453203 - 0.502,-4.91833,-9.87089,-3.99471e-82, 48.2978, 24.1214, 24.1299,-0.0464531 - 0.503,-4.92831,-10.0788,-8.33676e-82, 48.3966, 24.1692, 24.1799,-0.0474811 - 0.504,-4.93849,-10.2433,-1.73614e-81, 48.4971, 24.2194, 24.2295,-0.0482052 - 0.505, -4.9488,-10.3383,-3.60786e-81, 48.5985, 24.2722, 24.2778,-0.0484826 - 0.506,-4.95916,-10.3486,-7.48164e-81, 48.7001, 24.327, 24.3248,-0.0482657 - 0.507,-4.96949,-10.2728,-1.54821e-80, 48.8008, 24.3822, 24.371,-0.0476127 - 0.508,-4.97971,-10.1232,-3.19709e-80, 48.9001, 24.4357, 24.4178,-0.0466637 - 0.509,-4.98974,-9.92378,-6.58828e-80, 48.9975, 24.4861, 24.4658,-0.0455969 - 0.51,-4.99955,-9.70659,-1.35483e-79, 49.0927, 24.5329, 24.5152,-0.0445843 - 0.511,-5.00915,-9.50636,-2.78036e-79, 49.186, 24.577, 24.5652,-0.0437632 - 0.512,-5.01857,-9.35505,-5.69404e-79, 49.2777, 24.6199, 24.6146,-0.0432296 - 0.513,-5.02786,-9.27677,-1.16372e-78, 49.3687, 24.6631, 24.6626,-0.0430442 - 0.514,-5.03712,-9.28387,-2.37348e-78, 49.4598, 24.7072, 24.7094,-0.0432379 - 0.515,-5.04643,-9.37506,-4.83102e-78, 49.5518, 24.7523, 24.7556,-0.0438049 - 0.516,-5.05587, -9.5356,-9.81319e-78, 49.6453, 24.798, 24.8026,-0.0446886 - 0.517, -5.0655,-9.73969,-1.98931e-77, 49.7409, 24.8442, 24.851,-0.0457689 - 0.518,-5.07535,-9.95462,-4.02458e-77, 49.8385, 24.8911, 24.9005,-0.0468682 - 0.519,-5.08541, -10.146,-8.1258e-77, 49.9381, 24.9398, 24.9505,-0.047783 - 0.52,-5.09564,-10.2833,-1.63736e-76, 50.0389, 24.991, 24.9996,-0.0483333 - 0.521,-5.10598,-10.3447,-3.29273e-76, 50.1404, 25.0447, 25.0474,-0.0484123 - 0.522,-5.11633,-10.3205,-6.60857e-76, 50.2417, 25.0997, 25.0939,-0.0480156 - 0.523,-5.12662,-10.2148,-1.32373e-75, 50.3419, 25.1544, 25.1403,-0.0472367 - 0.524,-5.13676,-10.0445,-2.64629e-75, 50.4404, 25.2067, 25.1875,-0.0462342 - 0.525,-5.14671,-9.83707,-5.27987e-75, 50.5369, 25.2556, 25.2361,-0.0451859 - 0.526,-5.15644,-9.62572,-1.05138e-74, 50.6313, 25.3012, 25.2859,-0.0442496 - 0.527,-5.16596,-9.44422,-2.08954e-74, 50.724, 25.3448, 25.3357,-0.0435442 - 0.528,-5.17532,-9.32153,-4.14476e-74, 50.8154, 25.3877, 25.3846,-0.0431496 - 0.529, -5.1846,-9.27717,-8.20556e-74, 50.9064, 25.4313, 25.4321,-0.0431137 - 0.53,-5.19388,-9.31806,-1.62137e-73, 50.9979, 25.4759, 25.4785,-0.043454 - 0.531,-5.20324,-9.43751,-3.19758e-73, 51.0904, 25.5213, 25.525,-0.0441469 - 0.532,-5.21275,-9.61628,-6.29406e-73, 51.1848, 25.5672, 25.5724,-0.0451123 - 0.533,-5.22247,-9.82568,-1.23655e-72, 51.2812, 25.6136, 25.6213,-0.0462074 - 0.534,-5.23241,-10.0322,-2.42478e-72, 51.3796, 25.6612, 25.6712,-0.0472421 - 0.535,-5.24254,-10.2028,-4.7458e-72, 51.4797, 25.7108, 25.7209,-0.0480187 - 0.536,-5.25281,-10.3103,-9.27105e-72, 51.5808, 25.7629, 25.7695,-0.0483834 - 0.537,-5.26316,-10.3376,-1.80773e-71, 51.6822, 25.8172, 25.8167,-0.0482694 - 0.538,-5.27349,-10.2805,-3.51824e-71, 51.7831, 25.8723, 25.8631,-0.047713 - 0.539,-5.28372,-10.1483,-6.83453e-71, 51.8826, 25.9261, 25.9097,-0.0468369 - 0.54,-5.29378,-9.96233,-1.32521e-70, 51.9804, 25.9771, 25.9574,-0.0458105 - 0.541,-5.30364, -9.7523,-2.56482e-70, 52.076, 26.0246, 26.0066,-0.0448047 - 0.542,-5.31329,-9.55189,-4.95484e-70, 52.1697, 26.0693, 26.0565,-0.0439608 - 0.543,-5.32275, -9.3931,-9.55442e-70, 52.2619, 26.1125, 26.106,-0.04338 - 0.544,-5.33207,-9.30126,-1.83901e-69, 52.3531, 26.1557, 26.1543,-0.0431278 - 0.545,-5.34135, -9.2909,-3.53322e-69, 52.4443, 26.1997, 26.2013,-0.0432398 - 0.546,-5.35066,-9.36355,-6.77591e-69, 52.5361, 26.2447, 26.2477,-0.0437191 - 0.547,-5.36008,-9.50743,-1.29712e-68, 52.6294, 26.2904, 26.2945,-0.0445219 - 0.548,-5.36967,-9.69942,-2.47859e-68, 52.7246, 26.3365, 26.3425,-0.0455444 - 0.549,-5.37947,-9.90873,-4.7277e-68, 52.8218, 26.3833, 26.3919,-0.0466241 - 0.55,-5.38949,-10.1019,-9.00154e-68, 52.9209, 26.4315, 26.4418,-0.0475648 - 0.551,-5.39968, -10.248,-1.71083e-67, 53.0214, 26.4821, 26.4911,-0.0481828 - 0.552,-5.40998,-10.3239,-3.24582e-67, 53.1227, 26.5352, 26.5391,-0.0483567 - 0.553,-5.42033,-10.3174,-6.14711e-67, 53.2239, 26.5899, 26.5859,-0.048061 - 0.554,-5.43062,-10.2299,-1.16212e-66, 53.3242, 26.6446, 26.6323,-0.047369 - 0.555,-5.44079,-10.0754,-2.19312e-66, 53.4231, 26.6974, 26.6793,-0.0464254 - 0.556,-5.45077,-9.87874,-4.13154e-66, 53.52, 26.747, 26.7276,-0.0454025 - 0.557,-5.46054,-9.67146,-7.76965e-66, 53.6149, 26.7932, 26.7772,-0.0444599 - 0.558,-5.47011,-9.48669,-1.45859e-65, 53.7079, 26.8372, 26.827,-0.0437214 - 0.559,-5.47952,-9.35393,-2.73344e-65, 53.7997, 26.8803, 26.8761,-0.0432717 - 0.56,-5.48882,-9.29432,-5.11367e-65, 53.8909, 26.9238, 26.9239,-0.0431633 - 0.561, -5.4981,-9.31726,-9.55006e-65, 53.9823, 26.9683, 26.9705,-0.0434197 - 0.562,-5.50745,-9.41892,-1.78046e-64, 54.0747, 27.0137, 27.0169,-0.0440275 - 0.563,-5.51694,-9.58292,-3.31368e-64, 54.1687, 27.0596, 27.0642,-0.0449211 - 0.564,-5.52662,-9.78293,-6.1567e-64, 54.2646, 27.1059, 27.1128,-0.0459737 - 0.565,-5.53651,-9.98691,-1.14194e-63, 54.3626, 27.1532, 27.1625,-0.0470074 - 0.566,-5.54659,-10.1623,-2.11447e-63, 54.4623, 27.2022, 27.2122,-0.0478277 - 0.567,-5.55683, -10.281,-3.90863e-63, 54.5632, 27.2538, 27.2611,-0.0482723 - 0.568,-5.56716,-10.3242,-7.21295e-63, 54.6644, 27.3076, 27.3086,-0.0482568 - 0.569,-5.57748,-10.2851,-1.32883e-62, 54.7653, 27.3624, 27.3551,-0.0477962 - 0.57,-5.58773,-10.1702,-2.44399e-62, 54.8651, 27.4165, 27.4016,-0.0469953 - 0.571,-5.59782,-9.99786,-4.48748e-62, 54.9632, 27.4681, 27.4491,-0.0460132 - 0.572,-5.60772,-9.79581,-8.22585e-62, 55.0593, 27.5163, 27.498,-0.0450187 - 0.573,-5.61741,-9.59638,-1.50535e-61, 55.1534, 27.5615, 27.5478,-0.0441568 - 0.574,-5.62691,-9.43144,-2.75027e-61, 55.246, 27.605, 27.5974,-0.0435337 - 0.575,-5.63628,-9.32731,-5.01643e-61, 55.3375, 27.6482, 27.646,-0.0432195 - 0.576,-5.64557,-9.30053,-9.13481e-61, 55.4287, 27.6922, 27.6933,-0.0432548 - 0.577,-5.65488,-9.35524,-1.6607e-60, 55.5205, 27.7371, 27.7397,-0.0436498 - 0.578,-5.66428,-9.48255,-3.0142e-60, 55.6135, 27.7828, 27.7864,-0.0443725 - 0.579,-5.67384,-9.66199,-5.46192e-60, 55.7083, 27.8288, 27.8341,-0.0453347 - 0.58, -5.6836,-9.86479,-9.88126e-60, 55.805, 27.8754, 27.8832,-0.0463885 - 0.581,-5.69357,-10.0585,-1.78474e-59, 55.9037, 27.9233, 27.933,-0.0473468 - 0.582,-5.70372,-10.2121,-3.21837e-59, 56.0039, 27.9733, 27.9826,-0.0480242 - 0.583, -5.714,-10.3012,-5.79424e-59, 56.105, 28.0258, 28.0309,-0.0482869 - 0.584,-5.72432,-10.3116,-1.0415e-58, 56.2061, 28.0801, 28.0779,-0.0480895 - 0.585,-5.73462,-10.2418,-1.86908e-58, 56.3066, 28.1348, 28.1243,-0.0474852 - 0.586,-5.74481,-10.1031,-3.34889e-58, 56.4057, 28.188, 28.1711,-0.0466036 - 0.587,-5.75483,-9.91776,-5.99079e-58, 56.503, 28.2382, 28.2192,-0.0456106 - 0.588,-5.76464,-9.71552,-1.06998e-57, 56.5983, 28.2851, 28.2685,-0.0446663 - 0.589,-5.77426,-9.52873,-1.90802e-57, 56.6918, 28.3296, 28.3183,-0.0438993 - 0.59, -5.7837,-9.38723,-3.39707e-57, 56.7839, 28.3728, 28.3676,-0.0433992 - 0.591,-5.79303,-9.31355,-6.03868e-57, 56.8752, 28.4163, 28.4157,-0.0432232 - 0.592,-5.80233,-9.31936,-1.07176e-56, 56.9667, 28.4607, 28.4625, -0.0434 - 0.593,-5.81167, -9.4036,-1.89922e-56, 57.0589, 28.506, 28.5089,-0.0439251 - 0.594,-5.82113,-9.55267,-3.36028e-56, 57.1526, 28.5519, 28.556,-0.0447462 - 0.595,-5.83078,-9.74262,-5.93609e-56, 57.2482, 28.5981, 28.6043,-0.045752 - 0.596,-5.84062,-9.94303,-1.04701e-55, 57.3457, 28.6452, 28.6538,-0.0467775 - 0.597,-5.85066,-10.1218,-1.84388e-55, 57.445, 28.6938, 28.7036,-0.047633 - 0.598,-5.86086,-10.2505,-3.24223e-55, 57.5456, 28.7448, 28.7527,-0.0481502 - 0.599,-5.87116,-10.3085,-5.69228e-55, 57.6467, 28.798, 28.8004,-0.0482285 - 0.6,-5.88148,-10.2867,-9.97847e-55, 57.7476, 28.8526, 28.8471,-0.0478626 - 0.601,-5.89174,-10.1888,-1.74654e-54, 57.8476, 28.9068, 28.8936,-0.0471389 - 0.602,-5.90186,-10.0304,-3.05232e-54, 57.946, 28.9589, 28.9409,-0.046205 - 0.603, -5.9118,-9.83711,-5.32626e-54, 58.0425, 29.0078, 28.9894,-0.0452265 - 0.604,-5.92153,-9.63977,-9.28018e-54, 58.137, 29.0536, 29.0391,-0.0443511 - 0.605,-5.93108,-9.46998,-1.61449e-53, 58.2299, 29.0975, 29.0888,-0.0436903 - 0.606,-5.94047,-9.35482,-2.80451e-53, 58.3217, 29.1408, 29.1376,-0.0433188 - 0.607,-5.94979,-9.31263,-4.86439e-53, 58.4131, 29.1846, 29.1852,-0.0432819 - 0.608, -5.9591,-9.35002,-8.42458e-53, 58.5048, 29.2295, 29.2317,-0.0435961 - 0.609,-5.96849,-9.46088,-1.45686e-52, 58.5976, 29.2751, 29.2783,-0.04424 - 0.61,-5.97802,-9.62738,-2.51561e-52, 58.692, 29.3211, 29.3258,-0.0451395 - 0.611,-5.98774, -9.8228,-4.33732e-52, 58.7884, 29.3676, 29.3746,-0.0461619 - 0.612,-5.99766,-10.0159,-7.46716e-52, 58.8867, 29.4152, 29.4243,-0.0471298 - 0.613,-6.00777,-10.1757,-1.28365e-51, 58.9865, 29.4647, 29.474,-0.0478585 - 0.614,-6.01802,-10.2768,-2.20344e-51, 59.0873, 29.5165, 29.5226,-0.0482035 - 0.615,-6.02833,-10.3031,-3.77672e-51, 59.1884, 29.5704, 29.5698,-0.0481015 - 0.616,-6.03862,-10.2505,-6.46385e-51, 59.2889, 29.625, 29.6163,-0.0475852 - 0.617,-6.04883,-10.1276,-1.10467e-50, 59.3883, 29.6785, 29.663,-0.0467687 - 0.618,-6.05888,-9.95414,-1.88513e-50, 59.4859, 29.7293, 29.7108,-0.0458099 - 0.619,-6.06873,-9.75789,-3.21232e-50, 59.5817, 29.7769, 29.7599,-0.0448687 - 0.62,-6.07839,-9.57028,-5.46595e-50, 59.6755, 29.8218, 29.8096,-0.0440777 - 0.621,-6.08788,-9.42131,-9.28718e-50, 59.768, 29.8653, 29.8591,-0.0435319 - 0.622,-6.09724,-9.33471,-1.57571e-49, 59.8595, 29.9088, 29.9074,-0.0432927 - 0.623,-6.10654,-9.32424,-2.66957e-49, 59.951, 29.9531, 29.9545,-0.0433941 - 0.624,-6.11588,-9.39145,-4.51632e-49, 60.0431, 29.9984, 30.0009,-0.043839 - 0.625,-6.12533,-9.52546,-7.62967e-49, 60.1366, 30.0442, 30.0478,-0.0445873 - 0.626,-6.13493,-9.70475,-1.28708e-48, 60.2318, 30.0904, 30.0958,-0.0455426 - 0.627,-6.14474,-9.90058,-2.16815e-48, 60.3289, 30.1373, 30.1451,-0.0465531 - 0.628,-6.15474,-10.0816,-3.64715e-48, 60.4278, 30.1855, 30.1949,-0.0474356 - 0.629, -6.1649,-10.2189,-6.12637e-48, 60.5281, 30.2359, 30.2442,-0.0480177 - 0.63,-6.17517,-10.2907,-1.02763e-47, 60.629, 30.2886, 30.2922,-0.048185 - 0.631,-6.18548,-10.2854,-1.72132e-47, 60.7299, 30.3429, 30.3391,-0.0479124 - 0.632,-6.19574,-10.2042,-2.87921e-47, 60.83, 30.3972, 30.3856,-0.0472677 - 0.633,-6.20589,-10.0601,-4.80924e-47, 60.9287, 30.4497, 30.4326,-0.0463857 - 0.634,-6.21586,-9.87618,-8.02179e-47, 61.0256, 30.4992, 30.4809,-0.0454278 - 0.635,-6.22564,-9.68201,-1.33616e-46, 61.1206, 30.5457, 30.5304,-0.0445437 - 0.636,-6.23523, -9.5086,-2.22251e-46, 61.2139, 30.5899, 30.5801,-0.0438496 - 0.637,-6.24466,-9.38366,-3.69168e-46, 61.3059, 30.6333, 30.6292,-0.0434253 - 0.638, -6.254,-9.32707,-6.12354e-46, 61.3974, 30.6771, 30.677,-0.0433205 - 0.639,-6.26331,-9.34778,-1.01433e-45, 61.4891, 30.7218, 30.7237,-0.0435573 - 0.64,-6.27269,-9.44236,-1.67788e-45, 61.5817, 30.7674, 30.7702,-0.0441237 - 0.641, -6.2822,-9.59557,-2.77167e-45, 61.6759, 30.8134, 30.8175,-0.0449589 - 0.642,-6.29188,-9.78282,-4.57222e-45, 61.7718, 30.8598, 30.8661,-0.0459447 - 0.643,-6.30176,-9.97412,-7.53213e-45, 61.8697, 30.9071, 30.9157,-0.0469147 - 0.644,-6.31183,-10.1389,-1.23913e-44, 61.9691, 30.9561, 30.9653,-0.0476865 - 0.645,-6.32204,-10.2508,-2.03574e-44, 62.0697, 31.0074, 31.0142,-0.0481075 - 0.646,-6.33233,-10.2921,-3.33993e-44, 62.1707, 31.0609, 31.0617,-0.0480973 - 0.647,-6.34263,-10.2562,-5.47222e-44, 62.2713, 31.1153, 31.1083,-0.0476692 - 0.648,-6.35285,-10.1491,-8.95369e-44, 62.3709, 31.169, 31.1549,-0.0469207 - 0.649,-6.36292,-9.98789,-1.46303e-43, 62.4688, 31.2204, 31.2025,-0.0460004 - 0.65,-6.37282, -9.7985,-2.38738e-43, 62.565, 31.2686, 31.2513,-0.0450669 - 0.651,-6.38252,-9.61124,-3.89051e-43, 62.6592, 31.314, 31.3009,-0.0442565 - 0.652,-6.39204,-9.45604,-6.33153e-43, 62.752, 31.3578, 31.3505,-0.0436693 - 0.653,-6.40143,-9.35768,-1.02903e-42, 62.8438, 31.4013, 31.3991,-0.0433713 - 0.654,-6.41076,-9.33178,-1.67021e-42, 62.9353, 31.4455, 31.4464,-0.0434011 - 0.655, -6.4201,-9.38238,-2.70729e-42, 63.0274, 31.4907, 31.493,-0.0437685 - 0.656,-6.42952,-9.50127,-4.38249e-42, 63.1206, 31.5365, 31.5397,-0.0444441 - 0.657, -6.4391,-9.66934,-7.08486e-42, 63.2155, 31.5826, 31.5875,-0.0453456 - 0.658,-6.44886,-9.85964,-1.14385e-41, 63.3122, 31.6294, 31.6365,-0.0463349 - 0.659,-6.45882,-10.0417,-1.8443e-41, 63.4107, 31.6772, 31.6862,-0.0472365 - 0.66,-6.46895,-10.1865,-2.96977e-41, 63.5106, 31.7271, 31.7356,-0.0478759 - 0.661,-6.47919,-10.2708,-4.77578e-41, 63.6114, 31.7793, 31.784,-0.0481269 - 0.662,-6.48949,-10.2814,-7.67002e-41, 63.7122, 31.8332, 31.8311,-0.0479458 - 0.663,-6.49975,-10.2165,-1.23021e-40, 63.8125, 31.8875, 31.8776,-0.0473814 - 0.664,-6.50992,-10.0868,-1.9706e-40, 63.9114, 31.9404, 31.9245,-0.0465551 - 0.665,-6.51993,-9.91299,-3.15246e-40, 64.0087, 31.9905, 31.9725,-0.0456225 - 0.666,-6.52975, -9.723,-5.03659e-40, 64.104, 32.0376, 32.0217,-0.0447342 - 0.667,-6.53937, -9.5472,-8.0364e-40, 64.1977, 32.0822, 32.0715,-0.0440112 - 0.668,-6.54884,-9.41368,-1.28063e-39, 64.29, 32.1258, 32.1207,-0.0435385 - 0.669, -6.5582,-9.34372,-2.0381e-39, 64.3817, 32.1696, 32.1688,-0.0433698 - 0.67,-6.56753,-9.34842,-3.23943e-39, 64.4734, 32.2142, 32.2157,-0.0435327 - 0.671, -6.5769,-9.42691,-5.14224e-39, 64.5659, 32.2596, 32.2622,-0.0440232 - 0.672,-6.58638,-9.56654,-8.15228e-39, 64.6597, 32.3056, 32.3093,-0.0447928 - 0.673,-6.59603,-9.74488,-1.29077e-38, 64.7553, 32.352, 32.3576,-0.0457374 - 0.674,-6.60587,-9.93337,-2.04111e-38, 64.8528, 32.3991, 32.407,-0.0467023 - 0.675, -6.6159,-10.1019,-3.22351e-38, 64.9519, 32.4477, 32.4567,-0.0475093 - 0.676,-6.62608,-10.2234,-5.08438e-38, 65.0522, 32.4984, 32.5057,-0.0479995 - 0.677,-6.63635,-10.2787,-8.00934e-38, 65.153, 32.5514, 32.5536,-0.0480775 - 0.678,-6.64663, -10.259,-1.2601e-37, 65.2536, 32.6056, 32.6003,-0.0477372 - 0.679,-6.65686,-10.1675,-1.98e-37, 65.3534, 32.6594, 32.6469,-0.0470592 - 0.68,-6.66697, -10.019,-3.10724e-37, 65.4517, 32.7113, 32.6942,-0.0461816 - 0.681, -6.6769,-9.83728,-4.87012e-37, 65.5482, 32.7602, 32.7427,-0.0452606 - 0.682,-6.68664,-9.65148,-7.62356e-37, 65.6429, 32.8062, 32.7923,-0.0444353 - 0.683, -6.6962, -9.4913,-1.19188e-36, 65.736, 32.8503, 32.8419,-0.043811 - 0.684,-6.70563, -9.3823,-1.86106e-36, 65.828, 32.8938, 32.8907,-0.0434584 - 0.685,-6.71497,-9.34185,-2.90234e-36, 65.9197, 32.9379, 32.9383,-0.0434203 - 0.686,-6.72431,-9.37631,-4.52058e-36, 66.0116, 32.983, 32.985,-0.0437129 - 0.687,-6.73372,-9.48005,-7.03233e-36, 66.1046, 33.0287, 33.0316,-0.0443162 - 0.688,-6.74327, -9.6364,-1.09261e-35, 66.1992, 33.0749, 33.0791,-0.0451613 - 0.689,-6.75299,-9.82028,-1.69548e-35, 66.2955, 33.1215, 33.1279,-0.0461236 - 0.69,-6.76291,-10.0022,-2.62774e-35, 66.3936, 33.1691, 33.1775,-0.0470365 - 0.691, -6.773,-10.1532,-4.06758e-35, 66.4932, 33.2184, 33.2271,-0.0477258 - 0.692,-6.78322,-10.2491,-6.2886e-35, 66.5938, 33.2701, 33.2756,-0.0480549 - 0.693, -6.7935,-10.2746,-9.71042e-35, 66.6946, 33.3236, 33.323,-0.047963 - 0.694,-6.80377,-10.2258,-1.49758e-34, 66.7949, 33.3778, 33.3696,-0.0474802 - 0.695,-6.81395,-10.1106,-2.30678e-34, 66.8941, 33.431, 33.4163,-0.046713 - 0.696,-6.82399,-9.94751,-3.5489e-34, 66.9917, 33.4817, 33.4641,-0.0458101 - 0.697,-6.83384,-9.76265,-5.45319e-34, 67.0874, 33.5294, 33.5131,-0.0449223 - 0.698,-6.84351,-9.58563,-8.36907e-34, 67.1815, 33.5745, 33.5628,-0.0441749 - 0.699,-6.85301,-9.44473,-1.28285e-33, 67.2741, 33.6183, 33.6122,-0.0436578 - 0.7, -6.8624,-9.36244,-1.96403e-33, 67.366, 33.662, 33.6605,-0.0434293 - 0.701,-6.87174,-9.35183,-3.00325e-33, 67.4577, 33.7065, 33.7077,-0.0435216 - 0.702, -6.8811,-9.41448,-4.58681e-33, 67.5501, 33.7519, 33.7542,-0.0439379 - 0.703,-6.89057,-9.54029,-6.9969e-33, 67.6436, 33.7979, 33.8011,-0.044641 - 0.704,-6.90019,-9.70904,-1.06605e-32, 67.7389, 33.8442, 33.8492,-0.0455404 - 0.705,-6.90999,-9.89369,-1.62227e-32, 67.836, 33.8911, 33.8984,-0.0464936 - 0.706,-6.91997,-10.0647,-2.46576e-32, 67.9347, 33.9393, 33.948,-0.047328 - 0.707,-6.93012,-10.1947,-3.7433e-32, 68.0347, 33.9896, 33.9973,-0.0478805 - 0.708,-6.94036,-10.2631,-5.67597e-32, 68.1354, 34.042, 34.0453,-0.0480425 - 0.709,-6.95064,-10.2589,-8.59619e-32, 68.236, 34.0959, 34.0923,-0.0477893 - 0.71,-6.96088,-10.1829,-1.30033e-31, 68.3359, 34.1499, 34.1389,-0.047184 - 0.711,-6.97101,-10.0474,-1.96464e-31, 68.4345, 34.2022, 34.186,-0.0463534 - 0.712,-6.98098,-9.87418,-2.96481e-31, 68.5313, 34.2516, 34.2343,-0.0454495 - 0.713,-6.99076,-9.69091,-4.46884e-31, 68.6264, 34.2982, 34.2836,-0.0446138 - 0.714,-7.00036,-9.52693,-6.72788e-31, 68.7199, 34.3426, 34.3333,-0.0439566 - 0.715,-7.00981,-9.40844,-1.01169e-30, 68.8122, 34.3863, 34.3823,-0.0435533 - 0.716,-7.01917,-9.35432,-1.51951e-30, 68.9039, 34.4304, 34.4301,-0.0434512 - 0.717,-7.02852,-9.37314,-2.27954e-30, 68.9959, 34.4753, 34.4769,-0.0436715 - 0.718,-7.03792,-9.46178,-3.4157e-30, 69.0887, 34.521, 34.5235,-0.0442033 - 0.719,-7.04744,-9.60597,-5.11212e-30, 69.1829, 34.5671, 34.5709,-0.0449898 - 0.72,-7.05713,-9.78259,-7.6421e-30, 69.2789, 34.6136, 34.6194,-0.0459199 - 0.721,-7.06701,-9.96334,-1.14108e-29, 69.3766, 34.6609, 34.6689,-0.0468369 - 0.722,-7.07706,-10.1193,-1.70181e-29, 69.4759, 34.7099, 34.7185,-0.0475684 - 0.723,-7.08725,-10.2256,-2.53511e-29, 69.5762, 34.761, 34.7673,-0.0479699 - 0.724,-7.09751,-10.2653,-3.77205e-29, 69.6769, 34.8141, 34.8149,-0.0479645 - 0.725,-7.10778,-10.2322,-5.60599e-29, 69.7773, 34.8682, 34.8616,-0.0475637 - 0.726,-7.11797,-10.1316,-8.32189e-29, 69.8767, 34.9216, 34.9082,-0.0468589 - 0.727,-7.12804,-9.97968,-1.23392e-28, 69.9746, 34.9728, 34.9558,-0.0459903 - 0.728,-7.13793,-9.80087,-1.82747e-28, 70.0707, 35.0211, 35.0045,-0.0451077 - 0.729,-7.14764,-9.62376,-2.70339e-28, 70.1652, 35.0667, 35.0541,-0.0443402 - 0.73,-7.15718,-9.47668,-3.99453e-28, 70.2581, 35.1107, 35.1036,-0.0437828 - 0.731, -7.1666,-9.38309,-5.89552e-28, 70.3502, 35.1545, 35.1522,-0.0434983 - 0.732,-7.17595,-9.35789,-8.69115e-28, 70.442, 35.1989, 35.1996,-0.0435232 - 0.733,-7.18531,-9.40501,-1.27977e-27, 70.5342, 35.2442, 35.2462,-0.0438674 - 0.734,-7.19476,-9.51682,-1.8823e-27, 70.6276, 35.2901, 35.293,-0.0445034 - 0.735,-7.20434,-9.67536,-2.76533e-27, 70.7225, 35.3364, 35.3408,-0.0453541 - 0.736,-7.21411,-9.85521,-4.05796e-27, 70.8192, 35.3832, 35.3897,-0.0462894 - 0.737,-7.22406,-10.0276,-5.94801e-27, 70.9176, 35.431, 35.4394,-0.0471436 - 0.738,-7.23416,-10.1649,-8.70841e-27, 71.0173, 35.4808, 35.4887,-0.0477515 - 0.739,-7.24438,-10.2454,-1.27353e-26, 71.1178, 35.5327, 35.5371,-0.0479929 - 0.74,-7.25465, -10.256,-1.86032e-26, 71.2184, 35.5863, 35.5842,-0.0478256 - 0.741, -7.2649,-10.1954,-2.71438e-26, 71.3184, 35.6403, 35.6308,-0.047295 - 0.742,-7.27504,-10.0732,-3.95603e-26, 71.4172, 35.6929, 35.6778,-0.0465151 - 0.743,-7.28504,-9.90912,-5.75912e-26, 71.5144, 35.743, 35.7258,-0.0456331 - 0.744,-7.29486,-9.72938,-8.37453e-26, 71.6099, 35.7901, 35.775,-0.0447916 - 0.745, -7.3045,-9.56278,-1.21639e-25, 71.7037, 35.835, 35.8246,-0.0441056 - 0.746,-7.31399,-9.43593,-1.7648e-25, 71.7963, 35.8788, 35.8738,-0.0436556 - 0.747,-7.32337,-9.36906,-2.55756e-25, 71.8882, 35.9228, 35.9219,-0.0434929 - 0.748,-7.33273,-9.37279,-3.70227e-25, 71.9801, 35.9676, 35.9689,-0.0436439 - 0.749,-7.34212,-9.44641,-5.35329e-25, 72.0728, 36.0132, 36.0155,-0.0441052 - 0.75,-7.35162,-9.57808,-7.73189e-25, 72.1668, 36.0593, 36.0626,-0.0448313 - 0.751,-7.36128,-9.74665,-1.11548e-24, 72.2624, 36.1057, 36.1109,-0.0457244 - 0.752,-7.37111,-9.92513,-1.6075e-24, 72.3597, 36.1529, 36.1602,-0.0466386 - 0.753,-7.38113, -10.085,-2.31396e-24, 72.4587, 36.2014, 36.2098,-0.0474049 - 0.754,-7.39128,-10.2006,-3.32715e-24, 72.5587, 36.252, 36.2588,-0.0478726 - 0.755,-7.40153,-10.2537,-4.77864e-24, 72.6593, 36.3047, 36.3067,-0.0479506 - 0.756,-7.41179,-10.2357,-6.85569e-24, 72.7597, 36.3586, 36.3535,-0.0476321 - 0.757, -7.422,-10.1497,-9.82458e-24, 72.8593, 36.4121, 36.4002,-0.0469926 - 0.758,-7.43209,-10.0095,-1.40635e-23, 72.9575, 36.4638, 36.4475,-0.0461626 - 0.759,-7.44202,-9.83755,-2.01089e-23, 73.054, 36.5127, 36.496,-0.0452899 - 0.76,-7.45176,-9.66146,-2.87212e-23, 73.1488, 36.5588, 36.5455,-0.0445067 - 0.761,-7.46134,-9.50934,-4.09765e-23, 73.2421, 36.6031, 36.595,-0.0439129 - 0.762,-7.47078, -9.4055,-5.83962e-23, 73.3343, 36.6469, 36.6438,-0.0435761 - 0.763,-7.48015,-9.36647,-8.31292e-23, 73.4262, 36.6913, 36.6914,-0.0435369 - 0.764,-7.48952,-9.39842,-1.18207e-22, 73.5184, 36.7364, 36.7382,-0.043811 - 0.765,-7.49895,-9.49613,-1.679e-22, 73.6116, 36.7823, 36.7849,-0.04438 - 0.766,-7.50851, -9.6439,-2.38222e-22, 73.7062, 36.8286, 36.8324,-0.0451791 - 0.767,-7.51824,-9.81804,-3.37623e-22, 73.8025, 36.8752, 36.8812,-0.0460907 - 0.768,-7.52814,-9.99066,-4.77975e-22, 73.9005, 36.9228, 36.9307,-0.0469573 - 0.769,-7.53822,-10.1342,-6.75927e-22, 73.9999, 36.9721, 36.9802,-0.0476135 - 0.77,-7.54841,-10.2257,-9.54812e-22, 74.1002, 37.0236, 37.0287,-0.0479294 - 0.771,-7.55867,-10.2506,-1.34728e-21, 74.2008, 37.0768, 37.0761,-0.0478463 - 0.772,-7.56891, -10.205,-1.89899e-21, 74.3009, 37.1307, 37.1228,-0.0473918 - 0.773,-7.57908,-10.0963,-2.67369e-21, 74.4, 37.1836, 37.1696,-0.0466665 - 0.774,-7.58911,-9.94202,-3.76032e-21, 74.4975, 37.2342, 37.2174,-0.0458108 - 0.775,-7.59896,-9.76679,-5.28278e-21, 74.5933, 37.282, 37.2664,-0.0449682 - 0.776,-7.60864, -9.5987,-7.41355e-21, 74.6875, 37.3272, 37.316,-0.0442575 - 0.777,-7.61816,-9.46461,-1.03924e-20, 74.7803, 37.3712, 37.3653,-0.0437646 - 0.778,-7.62757,-9.38593,-1.45523e-20, 74.8724, 37.4152, 37.4136,-0.0435449 - 0.779,-7.63693,-9.37515,-2.03552e-20, 74.9644, 37.4599, 37.4608,-0.0436293 - 0.78,-7.64632,-9.43392,-2.8441e-20, 75.0569, 37.5054, 37.5075,-0.0440213 - 0.781, -7.6558,-9.55275,-3.96956e-20, 75.1506, 37.5515, 37.5544,-0.0446858 - 0.782,-7.66543,-9.71256,-5.53437e-20, 75.2459, 37.5979, 37.6025,-0.0455379 - 0.783,-7.67523,-9.88775,-7.70767e-20, 75.3429, 37.6449, 37.6516,-0.0464427 - 0.784, -7.6852,-10.0503,-1.07228e-19, 75.4415, 37.6931, 37.7012,-0.0472363 - 0.785,-7.69533,-10.1742,-1.49011e-19, 75.5413, 37.7432, 37.7504,-0.047764 - 0.786,-7.70555,-10.2397,-2.06853e-19, 75.6417, 37.7954, 37.7985,-0.0479217 - 0.787,-7.71581,-10.2364,-2.86836e-19, 75.7422, 37.849, 37.8455,-0.0476853 - 0.788,-7.72602, -10.165,-3.97316e-19, 75.8419, 37.9026, 37.8921,-0.0471136 - 0.789,-7.73613,-10.0368,-5.49756e-19, 75.9403, 37.9547, 37.9393,-0.0463265 - 0.79, -7.7461, -9.8726,-7.59862e-19, 76.0372, 38.0042, 37.9875,-0.0454684 - 0.791,-7.75588,-9.69857,-1.04913e-18, 76.1323, 38.0508, 38.0368,-0.0446738 - 0.792,-7.76549,-9.54257,-1.44697e-18, 76.2259, 38.0955, 38.0864,-0.0440477 - 0.793,-7.77497,-9.42953,-1.99352e-18, 76.3185, 38.1394, 38.1354,-0.0436621 - 0.794,-7.78435,-9.37747,-2.74355e-18, 76.4104, 38.1836, 38.1833,-0.0435621 - 0.795,-7.79372,-9.39464,-3.77171e-18, 76.5026, 38.2287, 38.2301,-0.0437683 - 0.796,-7.80314, -9.4782,-5.17962e-18, 76.5956, 38.2745, 38.2768,-0.0442706 - 0.797,-7.81268,-9.61472,-7.10543e-18, 76.6899, 38.3207, 38.3242,-0.0450155 - 0.798,-7.82237,-9.78229,-9.73681e-18, 76.7859, 38.3673, 38.3727,-0.0458982 - 0.799,-7.83224,-9.95408,-1.33284e-17, 76.8835, 38.4147, 38.4221,-0.0467702 - 0.8,-7.84228,-10.1026,-1.82252e-17, 76.9826, 38.4636, 38.4716,-0.0474677 - 0.801,-7.85245,-10.2042,-2.48944e-17, 77.0827, 38.5145, 38.5204,-0.0478528 - 0.802,-7.86269,-10.2426,-3.39677e-17, 77.1832, 38.5674, 38.568,-0.0478516 - 0.803,-7.87293,-10.2118,-4.62985e-17, 77.2834, 38.6211, 38.6148,-0.0474743 - 0.804,-7.88311,-10.1168,-6.3038e-17, 77.3826, 38.6743, 38.6615,-0.0468069 - 0.805,-7.89317, -9.9728,-8.5738e-17, 77.4805, 38.7254, 38.7091,-0.0459823 - 0.806,-7.90306, -9.803,-1.16488e-16, 77.5766, 38.7737, 38.7578,-0.045143 - 0.807,-7.91277,-9.63453,-1.58097e-16, 77.6711, 38.8194, 38.8073,-0.0444119 - 0.808,-7.92233,-9.49432,-2.14341e-16, 77.7643, 38.8637, 38.8567,-0.0438798 - 0.809,-7.93176,-9.40477,-2.90283e-16, 77.8565, 38.9076, 38.9053,-0.0436065 - 0.81,-7.94113,-9.38012,-3.92714e-16, 77.9486, 38.9522, 38.9527,-0.0436272 - 0.811,-7.95052,-9.42424,-5.30722e-16, 78.041, 38.9976, 38.9994,-0.0439513 - 0.812,-7.95998, -9.53,-7.16467e-16, 78.1345, 39.0437, 39.0463,-0.0445535 - 0.813,-7.96958,-9.68039,-9.6619e-16, 78.2295, 39.09, 39.0941,-0.0453609 - 0.814,-7.97934,-9.85133,-1.30157e-15, 78.3261, 39.1369, 39.143,-0.0462501 - 0.815,-7.98928,-10.0154,-1.75149e-15, 78.4244, 39.1848, 39.1925,-0.0470639 - 0.816,-7.99937,-10.1465,-2.35445e-15, 78.5239, 39.2344, 39.2419,-0.0476451 - 0.817,-8.00958,-10.2236,-3.16161e-15, 78.6242, 39.2861, 39.2902,-0.0478785 - 0.818,-8.01982,-10.2345,-4.24097e-15, 78.7246, 39.3395, 39.3374,-0.0477232 - 0.819,-8.03004,-10.1774,-5.68279e-15, 78.8244, 39.3931, 39.3841,-0.0472215 - 0.82,-8.04018,-10.0617,-7.60671e-15, 78.9231, 39.4456, 39.4311,-0.0464815 - 0.821,-8.05017,-9.90591,-1.01712e-14, 79.0203, 39.4956, 39.4791,-0.0456426 - 0.822,-8.05999,-9.73494,-1.35858e-14, 79.1158, 39.5428, 39.5282,-0.0448411 - 0.823,-8.06964,-9.57618,-1.81274e-14, 79.2098, 39.5878, 39.5778,-0.0441865 - 0.824,-8.07914,-9.45501,-2.41617e-14, 79.3025, 39.6318, 39.6269,-0.0437558 - 0.825,-8.08855,-9.39074,-3.21706e-14, 79.3946, 39.676, 39.675,-0.0435981 - 0.826,-8.09792,-9.39359,-4.27888e-14, 79.4868, 39.721, 39.7221,-0.0437388 - 0.827,-8.10734,-9.46303,-5.68514e-14, 79.5796, 39.7667, 39.7688,-0.0441749 - 0.828,-8.11685,-9.58786,-7.54556e-14, 79.6737, 39.8129, 39.8159,-0.0448638 - 0.829,-8.12651,-9.74807,-1.00042e-13, 79.7693, 39.8594, 39.8642,-0.0457129 - 0.83,-8.13634,-9.91798,-1.32499e-13, 79.8666, 39.9066, 39.9134,-0.0465836 - 0.831,-8.14635,-10.0704,-1.753e-13, 79.9654, 39.9551, 39.963,-0.0473152 - 0.832,-8.15649, -10.181,-2.31683e-13, 80.0653, 40.0056, 40.012,-0.0477638 - 0.833,-8.16671,-10.2322,-3.05875e-13, 80.1656, 40.058, 40.0598,-0.047842 - 0.834,-8.17695,-10.2158,-4.03399e-13, 80.2659, 40.1116, 40.1067,-0.0475423 - 0.835,-8.18714,-10.1345,-5.31455e-13, 80.3653, 40.1649, 40.1535,-0.046936 - 0.836,-8.19722,-10.0014,-6.9942e-13, 80.4634, 40.2164, 40.2008,-0.0461468 - 0.837,-8.20714,-9.83789,-9.19496e-13, 80.5599, 40.2653, 40.2493,-0.0453155 - 0.838,-8.21689, -9.6701,-1.20754e-12, 80.6548, 40.3115, 40.2987,-0.0445683 - 0.839,-8.22648,-9.52488,-1.58414e-12, 80.7482, 40.356, 40.3482,-0.0440006 - 0.84,-8.23594,-9.42543,-2.076e-12, 80.8407, 40.4001, 40.3969,-0.0436771 - 0.841,-8.24533,-9.38759,-2.71769e-12, 80.9328, 40.4445, 40.4446,-0.0436369 - 0.842,-8.25472,-9.41735,-3.55397e-12, 81.0251, 40.4899, 40.4914,-0.0438949 - 0.843,-8.26417,-9.50985,-4.64266e-12, 81.1184, 40.5358, 40.5382,-0.0444344 - 0.844,-8.27374,-9.65024,-6.05844e-12, 81.2131, 40.5822, 40.5857,-0.0451938 - 0.845,-8.28347,-9.81601,-7.89759e-12, 81.3094, 40.6289, 40.6344,-0.046062 - 0.846,-8.29337,-9.98063,-1.02842e-11, 81.4073, 40.6765, 40.6839,-0.0468888 - 0.847,-8.30343,-10.1178,-1.33777e-11, 81.5066, 40.7257, 40.7333,-0.0475169 - 0.848,-8.31361,-10.2055,-1.73835e-11, 81.6067, 40.777, 40.7819,-0.0478215 - 0.849,-8.32384,-10.2299,-2.25648e-11, 81.707, 40.83, 40.8293,-0.0477462 - 0.85,-8.33407,-10.1872,-2.92593e-11, 81.807, 40.8836, 40.876,-0.0473162 - 0.851,-8.34422,-10.0841,-3.78999e-11, 81.9059, 40.9363, 40.9229,-0.0466269 - 0.852,-8.35424,-9.93739,-4.904e-11, 82.0034, 40.9869, 40.9707,-0.045812 - 0.853,-8.36409,-9.77045,-6.33874e-11, 82.0992, 41.0346, 41.0196,-0.045008 - 0.854,-8.37378,-9.61002,-8.18455e-11, 82.1935, 41.08, 41.0691,-0.0443289 - 0.855,-8.38331,-9.48177,-1.05566e-10, 82.2865, 41.1243, 41.1184,-0.0438566 - 0.856,-8.39274,-9.40615,-1.36018e-10, 82.3788, 41.1684, 41.1668,-0.0436444 - 0.857,-8.40212, -9.3952,-1.75067e-10, 82.471, 41.2132, 41.214,-0.0437219 - 0.858,-8.41153,-9.45059,-2.25088e-10, 82.5637, 41.2589, 41.2607,-0.0440927 - 0.859,-8.42102,-9.56339,-2.89093e-10, 82.6575, 41.305, 41.3077,-0.0447241 - 0.86,-8.43066,-9.71549,-3.70904e-10, 82.7528, 41.3515, 41.3558,-0.0455353 - 0.861,-8.44046,-9.88253,-4.75362e-10, 82.8498, 41.3985, 41.4048,-0.0463983 - 0.862,-8.45042,-10.0378,-6.0859e-10, 82.9482, 41.4467, 41.4544,-0.0471571 - 0.863,-8.46053,-10.1564,-7.78328e-10, 83.0479, 41.4967, 41.5035,-0.0476635 - 0.864,-8.47073,-10.2195,-9.94347e-10, 83.1481, 41.5487, 41.5516,-0.0478177 - 0.865,-8.48097,-10.2171,-1.26897e-09, 83.2483, 41.6021, 41.5987,-0.0475958 - 0.866,-8.49117,-10.1495,-1.61771e-09, 83.3479, 41.6555, 41.6454,-0.0470532 - 0.867,-8.50127,-10.0278,-2.06009e-09, 83.4463, 41.7074, 41.6926,-0.0463038 - 0.868,-8.51122,-9.87133,-2.62065e-09, 83.5431, 41.7568, 41.7408,-0.0454852 - 0.869,-8.52101,-9.70526,-3.33019e-09, 83.6383, 41.8036, 41.79,-0.044726 - 0.87,-8.53063,-9.55613,-4.2273e-09, 83.7321, 41.8484, 41.8396,-0.0441265 - 0.871,-8.54012,-9.44776,-5.36036e-09, 83.8248, 41.8925, 41.8885,-0.0437561 - 0.872,-8.54953,-9.39745,-6.78984e-09, 83.9169, 41.9369, 41.9364,-0.0436578 - 0.873,-8.55892,-9.41316,-8.59132e-09, 84.0093, 41.9821, 41.9833,-0.0438516 - 0.874,-8.56836,-9.49232,-1.08591e-08, 84.1024, 42.028, 42.0301,-0.0443282 - 0.875, -8.5779,-9.62218,-1.37108e-08, 84.1968, 42.0743, 42.0775,-0.0450373 - 0.876, -8.5876,-9.78193,-1.72929e-08, 84.2928, 42.121, 42.1259,-0.0458791 - 0.877,-8.59747,-9.94599,-2.17873e-08, 84.3903, 42.1684, 42.1753,-0.0467123 - 0.878,-8.60749,-10.0881,-2.74203e-08, 84.4893, 42.2172, 42.2247,-0.0473804 - 0.879,-8.61764,-10.1856,-3.44727e-08, 84.5892, 42.268, 42.2735,-0.0477515 - 0.88,-8.62786,-10.2229,-4.32922e-08, 84.6895, 42.3206, 42.3212,-0.0477542 - 0.881,-8.63809,-10.1942,-5.43095e-08, 84.7895, 42.3741, 42.368,-0.0473973 - 0.882,-8.64825, -10.104,-6.80571e-08, 84.8886, 42.4271, 42.4148,-0.0467623 - 0.883, -8.6583,-9.96694,-8.51925e-08, 84.9864, 42.478, 42.4624,-0.0459758 - 0.884,-8.66819,-9.80493,-1.06527e-07, 85.0826, 42.5263, 42.5111,-0.0451739 - 0.885,-8.67791,-9.64392,-1.33061e-07, 85.1772, 42.5722, 42.5605,-0.0444743 - 0.886,-8.68747,-9.50964,-1.66023e-07, 85.2705, 42.6166, 42.6099,-0.0439639 - 0.887,-8.69693,-9.42355,-2.06926e-07, 85.3629, 42.6608, 42.6584,-0.0437002 - 0.888,-8.70632,-9.39936,-2.57626e-07, 85.4551, 42.7055, 42.7059,-0.043717 - 0.889,-8.71573,-9.44085,-3.20401e-07, 85.5478, 42.7511, 42.7527,-0.0440238 - 0.89, -8.7252,-9.54134,-3.98038e-07, 85.6414, 42.7972, 42.7996,-0.0445966 - 0.891,-8.73481,-9.68467,-4.93949e-07, 85.7364, 42.8436, 42.8474,-0.0453662 - 0.892,-8.74457,-9.84788,-6.12302e-07, 85.833, 42.8905, 42.8962,-0.0462156 - 0.893, -8.7545,-10.0048,-7.58185e-07, 85.9311, 42.9384, 42.9457,-0.0469946 - 0.894,-8.76458,-10.1305,-9.37798e-07, 86.0305, 42.988, 42.995,-0.0475526 - 0.895,-8.77476,-10.2047,-1.15869e-06, 86.1306, 43.0395, 43.0433,-0.0477793 - 0.896,-8.78499,-10.2158,-1.43005e-06, 86.2308, 43.0926, 43.0906,-0.0476347 - 0.897, -8.7952,-10.1619,-1.76301e-06, 86.3305, 43.146, 43.1373,-0.0471582 - 0.898,-8.80532,-10.0518,-2.17112e-06, 86.4291, 43.1983, 43.1844,-0.0464527 - 0.899, -8.8153,-9.90322,-2.67074e-06, 86.5263, 43.2482, 43.2324,-0.0456514 - 0.9,-8.82512,-9.73985,-3.28173e-06, 86.6218, 43.2955, 43.2814,-0.0448844 - 0.901,-8.83478,-9.58788,-4.02803e-06, 86.7159, 43.3407, 43.3309,-0.044257 - 0.902, -8.8443, -9.4716,-4.93859e-06, 86.8088, 43.3849, 43.3801,-0.0438429 - 0.903,-8.85372,-9.40957,-6.04827e-06, 86.9011, 43.4292, 43.4282,-0.0436894 - 0.904,-8.86312,-9.41163,-7.39908e-06, 86.9934, 43.4743, 43.4753,-0.0438209 - 0.905,-8.87255, -9.4774,-9.04151e-06, 87.0864, 43.5202, 43.522,-0.0442351 - 0.906,-8.88207,-9.59628,-1.10362e-05, 87.1805, 43.5664, 43.5692,-0.0448916 - 0.907,-8.89174,-9.74921,-1.3456e-05, 87.2762, 43.613, 43.6175,-0.0457024 - 0.908,-8.90157,-9.91169,-1.6388e-05, 87.3734, 43.6602, 43.6666,-0.0465353 - 0.909,-8.91156,-10.0577,-1.99365e-05, 87.4721, 43.7087, 43.7161,-0.0472369 - 0.91,-8.92169, -10.164,-2.42262e-05, 87.5718, 43.759, 43.7651,-0.0476692 - 0.911,-8.93189,-10.2135,-2.94059e-05, 87.672, 43.8113, 43.813,-0.0477477 - 0.912,-8.94211,-10.1985,-3.56527e-05, 87.772, 43.8646, 43.8599,-0.0474645 - 0.913,-8.95229,-10.1213,-4.3178e-05, 87.8713, 43.9177, 43.9067,-0.0468871 - 0.914,-8.96236,-9.99448,-5.22324e-05, 87.9694, 43.9691, 43.9541,-0.0461335 - 0.915,-8.97228,-9.83826,-6.31141e-05, 88.0659, 44.018, 44.0026,-0.0453382 - 0.916,-8.98203,-9.67769,-7.61763e-05, 88.1608, 44.0643, 44.0519,-0.0446222 - 0.917,-8.99163,-9.53846,-9.18372e-05, 88.2544, 44.109, 44.1013,-0.0440771 - 0.918,-9.00111, -9.4428,-0.000110592, 88.347, 44.1532, 44.1501,-0.0437651 - 0.919,-9.01052,-9.40597,-0.000133024, 88.4393, 44.1978, 44.1977,-0.0437238 - 0.92,-9.01992,-9.43379,-0.000159824, 88.5318, 44.2433, 44.2446,-0.0439678 - 0.921,-9.02938,-9.52174,-0.000191802, 88.6253, 44.2893, 44.2914,-0.0444813 - 0.922,-9.03896,-9.65569,-0.000229914, 88.72, 44.3357, 44.339,-0.0452063 - 0.923, -9.0487,-9.81417,-0.000275281, 88.8162, 44.3825, 44.3877,-0.0460365 - 0.924,-9.05859,-9.97181,-0.00032922, 88.9141, 44.4302, 44.4371,-0.0468289 - 0.925,-9.06864,-10.1034,-0.000393271, 89.0132, 44.4793, 44.4864,-0.0474324 - 0.926, -9.0788,-10.1879,-0.000469238, 89.1131, 44.5304, 44.535,-0.0477274 - 0.927,-9.08902,-10.2119,-0.000559227, 89.2133, 44.5832, 44.5825,-0.047659 - 0.928,-9.09922,-10.1716,-0.000665697, 89.3131, 44.6366, 44.6293,-0.0472506 - 0.929,-9.10936,-10.0736,-0.00079151, 89.4119, 44.6891, 44.6762,-0.0465928 - 0.93,-9.11937,-9.93343,-0.000939996, 89.5094, 44.7395, 44.724,-0.0458133 - 0.931,-9.12923,-9.77371,-0.00111502, 89.6052, 44.7873, 44.7729,-0.0450431 - 0.932,-9.13892,-9.61997,-0.00132108, 89.6996, 44.8329, 44.8223,-0.0443914 - 0.933,-9.14847,-9.49678,-0.00156337, 89.7928, 44.8773, 44.8716,-0.043937 - 0.934,-9.15791,-9.42381,-0.00184789, 89.8852, 44.9216, 44.9199,-0.0437312 - 0.935,-9.16731,-9.41268,-0.00218159, 89.9776, 44.9666, 44.9672,-0.0438025 - 0.936,-9.17674,-9.46509,-0.00257249, 90.0704, 45.0123, 45.014,-0.0441548 - 0.937,-9.18624,-9.57261,-0.00302978, 90.1643, 45.0586, 45.061,-0.0447571 - 0.938,-9.19588,-9.71797,-0.00356408, 90.2597, 45.1051, 45.109,-0.0455326 - 0.939,-9.20568, -9.8779,-0.00418755, 90.3566, 45.1522, 45.158,-0.0463592 - 0.94,-9.21564,-10.0268,-0.00491413, 90.4549, 45.2003, 45.2075,-0.0470875 - 0.941,-9.22573,-10.1409,-0.00575978, 90.5544, 45.2502, 45.2566,-0.0475755 - 0.942,-9.23592,-10.2019,-0.00674273, 90.6545, 45.302, 45.3047,-0.0477269 - 0.943,-9.24614,-10.2002,-0.00788379, 90.7545, 45.3552, 45.3519,-0.0475178 - 0.944,-9.25632,-10.1361,-0.00920665, 90.854, 45.4083, 45.3986,-0.0470008 - 0.945,-9.26641,-10.0199,-0.0107382, 90.9523, 45.4601, 45.4459,-0.0462843 - 0.946,-9.27636, -9.8703,-0.0125092, 91.0491, 45.5095, 45.4941,-0.0455003 - 0.947,-9.28615,-9.71119,-0.0145541, 91.1444, 45.5563, 45.5433,-0.0447719 - 0.948,-9.29578,-9.56805,-0.0169122, 91.2382, 45.6013, 45.5927,-0.0441957 - 0.949,-9.30529,-9.46375,-0.0196278, 91.3311, 45.6456, 45.6416,-0.0438384 - 0.95,-9.31471,-9.41493,-0.0227509, 91.4234, 45.6902, 45.6895,-0.0437415 - 0.951,-9.32412,-9.42934,-0.0263378, 91.5159, 45.7355, 45.7365,-0.0439243 - 0.952,-9.33357,-9.50461,-0.0304516, 91.6092, 45.7815, 45.7833,-0.0443785 - 0.953,-9.34312,-9.62864,-0.0351633, 91.7036, 45.8278, 45.8307,-0.045056 - 0.954,-9.35283,-9.78154,-0.0405522, 91.7996, 45.8746, 45.8792,-0.045862 - 0.955,-9.36269,-9.93883,-0.0467071, 91.8971, 45.922, 45.9285,-0.0466612 - 0.956, -9.3727,-10.0754,-0.053727, 91.9959, 45.9708, 45.9779,-0.0473038 - 0.957,-9.38284,-10.1693,-0.0617221, 92.0957, 46.0214, 46.0266,-0.0476628 - 0.958,-9.39304,-10.2057,-0.070815, 92.1958, 46.0739, 46.0743,-0.0476691 - 0.959,-9.40325,-10.1788,-0.0811416, 92.2957, 46.1271, 46.1212,-0.0473302 - 0.96, -9.4134,-10.0929,-0.0928522, 92.3947, 46.1799, 46.168,-0.0467238 - 0.961,-9.42344,-9.96187,-0.106113, 92.4924, 46.2308, 46.2156,-0.0459707 - 0.962,-9.43332, -9.8067,-0.121107, 92.5886, 46.2792, 46.2642,-0.0452017 - 0.963,-9.44305,-9.65222,-0.138037, 92.6833, 46.3252, 46.3136,-0.0445297 - 0.964,-9.45263,-9.52313,-0.157123, 92.7767, 46.3698, 46.3629,-0.0440383 - 0.965, -9.4621,-9.44005,-0.178608, 92.8693, 46.4142, 46.4114,-0.0437831 - 0.966,-9.47151,-9.41622,-0.202756, 92.9617, 46.4591, 46.4588,-0.0437966 - 0.967,-9.48093,-9.45538,-0.229857, 93.0545, 46.5048, 46.5056,-0.0440882 - 0.968,-9.49042,-9.55122,-0.260225, 93.1481, 46.551, 46.5525,-0.0446353 - 0.969,-9.50003,-9.68834,-0.294201, 93.2432, 46.5977, 46.6002,-0.0453723 - 0.97,-9.50979,-9.84477,-0.332153, 93.3398, 46.6447, 46.6489,-0.0461871 - 0.971,-9.51972,-9.99549,-0.374482, 93.4378, 46.6928, 46.6981,-0.046936 - 0.972,-9.52979,-10.1164,-0.421615, 93.5371, 46.7425, 46.7471,-0.0474746 - 0.973,-9.53995,-10.1882,-0.474014, 93.637, 46.7941, 46.7952,-0.0476963 - 0.974,-9.55016,-10.1994,-0.532172, 93.7371, 46.8473, 46.8422,-0.047562 - 0.975,-9.56035,-10.1483,-0.596617, 93.8366, 46.9009, 46.8886,-0.0471089 - 0.976,-9.57046,-10.0432,-0.667909, 93.9351, 46.9536, 46.9352,-0.046435 - 0.977,-9.58044,-9.90092,-0.746643, 94.0323, 47.0041, 46.9825,-0.0456681 - 0.978,-9.59026,-9.74423,-0.833449, 94.1279, 47.0521, 47.0308,-0.0449334 - 0.979,-9.59993,-9.59822,-0.928989, 94.222, 47.0984, 47.0793,-0.0443318 - 0.98,-9.60946,-9.48622,-1.03396, 94.3151, 47.1439, 47.1273,-0.0439348 - 0.981, -9.6189,-9.42612,-1.14909, 94.4076, 47.1898, 47.174,-0.0437878 - 0.982,-9.62831,-9.42747,-1.27514, 94.5, 47.2366, 47.2195,-0.0439146 - 0.983,-9.63775,-9.48999,-1.41289, 94.5931, 47.2845, 47.2643,-0.0443133 - 0.984,-9.64729,-9.60362,-1.56316, 94.6873, 47.3333, 47.3091,-0.0449458 - 0.985,-9.65696,-9.75014,-1.72678, 94.783, 47.3829, 47.3544,-0.0457281 - 0.986,-9.66679,-9.90609,-1.90459, 94.8802, 47.4336, 47.4001,-0.0465339 - 0.987,-9.67677,-10.0465,-2.09747, 94.9787, 47.4861, 47.4454,-0.047216 - 0.988,-9.68688, -10.149,-2.30628, 95.0783, 47.5412, 47.4894,-0.0476416 - 0.989,-9.69707,-10.1971,-2.53189, 95.1783, 47.5991, 47.5315,-0.0477291 - 0.99,-9.70728,-10.1833,-2.77517, 95.2782, 47.659, 47.5717,-0.0474703 - 0.991,-9.71744,-10.1098,-3.03697, 95.3774, 47.72, 47.6105,-0.0469291 - 0.992, -9.7275,-9.98844,-3.31811, 95.4754, 47.7806, 47.6486,-0.0462185 - 0.993,-9.73741,-9.83866,-3.61939, 95.5719, 47.8404, 47.6861,-0.0454677 - 0.994,-9.74717,-9.68445,-3.94155, 95.6669, 47.8995, 47.7227,-0.044793 - 0.995,-9.75678,-9.55047,-4.28529, 95.7606, 47.9589, 47.7574,-0.0442828 - 0.996,-9.76627,-9.45813,-4.65123, 95.8534, 48.0201, 47.7893,-0.0439967 - 0.997, -9.7757,-9.42215,-5.03991, 95.9458, 48.0842, 47.8177,-0.0439712 - 0.998,-9.78512,-9.44824,-5.45177, 96.0385, 48.1517, 47.8425,-0.0442204 - 0.999, -9.7946,-9.53215,-5.88717, 96.132, 48.2229, 47.8644,-0.0447294 - 1,-9.80418,-9.66041,-6.34632, 96.2268, 48.2978, 47.8836,-0.0454425 - 1.001,-9.81392,-9.81247,-6.82928, 96.323, 48.3766, 47.9002,-0.0462581 - 1.002,-9.82381,-9.96398, -7.336, 96.4208, 48.4601, 47.9136,-0.0470388 - 1.003,-9.83384,-10.0907,-7.86622, 96.5198, 48.5493, 47.9228,-0.0476389 - 1.004,-9.84399,-10.1724,-8.41951, 96.6196, 48.6449, 47.9267,-0.0479427 - 1.005,-9.85419,-10.1961,-8.99526, 96.7196, 48.7468, 47.9249,-0.0478963 - 1.006,-9.86438, -10.158,-9.59262, 96.8192, 48.8544, 47.9173,-0.0475208 - 1.007,-9.87451,-10.0643,-10.2106, 96.918, 48.9664, 47.9047,-0.0469023 - 1.008,-9.88451,-9.93001,-10.8478, 97.0154, 49.0818, 47.8874,-0.0461627 - 1.009,-9.89437,-9.77667,-11.5027, 97.1113, 49.2003, 47.8656,-0.0454273 - 1.01,-9.90406,-9.62881,-12.1737, 97.2058, 49.3222, 47.8387,-0.0448008 - 1.011,-9.91362,-9.51007,-12.8585, 97.299, 49.4487, 47.806,-0.0443588 - 1.012,-9.92308,-9.43941,-13.5551, 97.3917, 49.5807, 47.7668,-0.0441504 - 1.013, -9.9325,-9.42809,-14.2607, 97.4841, 49.7188, 47.7212,-0.0442029 - 1.014,-9.94194,-9.47786,-14.9726, 97.5771, 49.8628, 47.6698,-0.0445201 - 1.015,-9.95146,-9.58069,-15.6878, 97.6711, 50.0124, 47.6137,-0.0450726 - 1.016, -9.9611, -9.7201,-16.4031, 97.7665, 50.1668, 47.5539,-0.0457872 - 1.017, -9.9709,-9.87374,-17.1148, 97.8633, 50.3258, 47.491,-0.046547 - 1.018,-9.98085, -10.017,-17.8194, 97.9616, 50.4894, 47.4249,-0.0472092 - 1.019,-9.99093,-10.1271,-18.5129, 98.0609, 50.6577, 47.3556,-0.0476376 - 1.02,-10.0011,-10.1863,-19.1914, 98.1609, 50.8299, 47.2832,-0.0477399 - 1.021,-10.0113,-10.1853,-19.8507, 98.2608, 51.005, 47.2083,-0.0474934 - 1.022,-10.0215,-10.1243,-20.4867, 98.3601, 51.1809, 47.1323,-0.0469489 - 1.023,-10.0316,-10.0131,-21.0951, 98.4583, 51.3553, 47.0568,-0.0462117 - 1.024,-10.0415,-9.86946,-21.6717, 98.5551, 51.5265, 46.9832,-0.0454099 - 1.025,-10.0513,-9.71649,-22.2124, 98.6505, 51.6936, 46.9122,-0.0446637 - 1.026,-10.0609,-9.57864, -22.713, 98.7444, 51.8565, 46.8438,-0.0440678 - 1.027,-10.0704,-9.47791,-23.1698, 98.8374, 52.0157, 46.778,-0.0436878 - 1.028,-10.0799,-9.43039, -23.579, 98.9299, 52.1717, 46.7147,-0.0435655 - 1.029,-10.0893,-9.44363,-23.9372, 99.0226, 52.3243, 46.6545,-0.0437208 - 1.03,-10.0988,-9.51544,-24.2415, 99.1159, 52.4733, 46.5984,-0.0441469 - 1.031,-10.1083, -9.6343,-24.4892, 99.2104, 52.6184, 46.5473,-0.0447988 - 1.032, -10.118,-9.78113, -24.678, 99.3064, 52.7593, 46.5015,-0.045586 - 1.033,-10.1279,-9.93244,-24.8064, 99.4038, 52.8968, 46.4606,-0.0463785 - 1.034,-10.1379, -10.064,-24.8732, 99.5025, 53.0318, 46.4237,-0.0470316 - 1.035, -10.148,-10.1549,-24.8778, 99.6022, 53.1654, 46.3894,-0.0474215 - 1.036,-10.1582,-10.1904,-24.8205, 99.7021, 53.298, 46.3566,-0.0474796 - 1.037,-10.1684,-10.1652,-24.7021, 99.8018, 53.4297, 46.325,-0.0472104 - 1.038,-10.1785,-10.0831, -24.524, 99.9008, 53.5599, 46.2942,-0.0466856 - 1.039,-10.1886,-9.95745,-24.2886, 99.9984, 53.6883, 46.2642,-0.0460186 - 1.04,-10.1985,-9.80833,-23.9987, 100.095, 53.815, 46.2343,-0.0453323 - 1.041,-10.2082,-9.65963,-23.6582, 100.189, 53.9412, 46.2035,-0.0447331 - 1.042,-10.2178,-9.53511,-23.2715, 100.283, 54.0685, 46.1702,-0.044299 - 1.043,-10.2273,-9.45468,-22.8435, 100.376, 54.1986, 46.133,-0.0440814 - 1.044,-10.2367,-9.43115,-22.3802, 100.468, 54.3329, 46.0912,-0.0441101 - 1.045,-10.2461,-9.46823,-21.8877, 100.561, 54.4718, 46.0449,-0.044393 - 1.046,-10.2556,-9.55993,-21.3729, 100.655, 54.6153, 45.9947,-0.0449083 - 1.047,-10.2652,-9.69153, -20.843, 100.75, 54.7629, 45.9415,-0.0455935 - 1.048, -10.275,-9.84196,-20.3058, 100.847, 54.9144, 45.8858,-0.0463422 - 1.049,-10.2849,-9.98713,-19.7689, 100.944, 55.0697, 45.8278,-0.0470181 - 1.05, -10.295,-10.1038,-19.2405, 101.044, 55.2288, 45.7673,-0.0474846 - 1.051,-10.3051,-10.1734,-18.7284, 101.143, 55.3911, 45.7046,-0.0476417 - 1.052,-10.3153,-10.1849,-18.2404, 101.243, 55.5553, 45.6406,-0.0474545 - 1.053,-10.3255,-10.1363,-17.7843, 101.343, 55.7193, 45.5766,-0.046962 - 1.054,-10.3356,-10.0356,-17.3671, 101.441, 55.8807, 45.5142,-0.0462616 - 1.055,-10.3456,-9.89895,-16.9955, 101.538, 56.0377, 45.4551,-0.0454797 - 1.056,-10.3554,-9.74819,-16.6757, 101.634, 56.1893, 45.3999,-0.0447397 - 1.057,-10.3651,-9.60745,-16.4127, 101.728, 56.3354, 45.3486,-0.0441415 - 1.058,-10.3746,-9.49924,-16.2109, 101.821, 56.477, 45.3007,-0.0437553 - 1.059,-10.3841,-9.44082,-16.0736, 101.914, 56.6149, 45.2555,-0.0436252 - 1.06,-10.3935,-9.44151,-16.0031, 102.007, 56.7501, 45.2128,-0.0437732 - 1.061, -10.403,-9.50112,-16.0005, 102.1, 56.883, 45.1726,-0.0441959 - 1.062,-10.4125,-9.61008,-16.0656, 102.194, 57.0142, 45.1351,-0.0448537 - 1.063,-10.4222,-9.75091,-16.1969, 102.29, 57.1443, 45.0998,-0.0456622 - 1.064, -10.432,-9.90105,-16.3918, 102.387, 57.2746, 45.0658,-0.0464957 - 1.065, -10.442,-10.0365,-16.6465, 102.485, 57.4068, 45.0314,-0.0472074 - 1.066,-10.4521,-10.1356,-16.9558, 102.585, 57.5422, 44.9949,-0.0476647 - 1.067,-10.4623,-10.1825,-17.3135, 102.685, 57.6819, 44.955,-0.0477839 - 1.068,-10.4724,-10.1698,-17.7124, 102.784, 57.8257, 44.9112,-0.047553 - 1.069,-10.4826,-10.0996,-18.1442, 102.884, 57.9727, 44.8638,-0.0470307 - 1.07,-10.4926,-9.98313,-18.6001, 102.981, 58.1218, 44.8133,-0.0463248 - 1.071,-10.5026,-9.83908,-19.0706, 103.078, 58.2719, 44.7605,-0.0455602 - 1.072,-10.5123,-9.69051,-19.5458, 103.173, 58.4226, 44.7056,-0.0448514 - 1.073,-10.5219,-9.56119,-20.0155, 103.267, 58.5739, 44.6486,-0.0442875 - 1.074,-10.5314,-9.47179,-20.4698, 103.36, 58.7261, 44.5897,-0.0439309 - 1.075,-10.5409,-9.43655,-20.8987, 103.452, 58.879, 44.5295,-0.0438225 - 1.076,-10.5503,-9.46107,-21.2929, 103.545, 59.0319, 44.4693,-0.043982 - 1.077,-10.5598,-9.54137,-21.6437, 103.639, 59.1837, 44.4107,-0.044401 - 1.078,-10.5694,-9.66456,-21.9434, 103.734, 59.3333, 44.3553,-0.0450314 - 1.079,-10.5791,-9.81089,-22.1852, 103.83, 59.4801, 44.3039,-0.0457793 - 1.08, -10.589,-9.95695,-22.3637, 103.927, 59.6243, 44.2566,-0.0465149 - 1.081, -10.599,-10.0794,-22.4749, 104.026, 59.7666, 44.2127,-0.0470985 - 1.082,-10.6092,-10.1586,-22.5165, 104.126, 59.9075, 44.1711,-0.0474167 - 1.083,-10.6194, -10.182,-22.4876, 104.226, 60.0476, 44.1309,-0.0474136 - 1.084,-10.6295,-10.1459,-22.3891, 104.325, 60.1866, 44.0917,-0.0471045 - 1.085,-10.6397,-10.0561,-22.2236, 104.424, 60.3244, 44.0531,-0.046566 - 1.086,-10.6497,-9.92702,-21.9954, 104.521, 60.4606, 44.0149,-0.0459094 - 1.087,-10.6595,-9.77936,-21.7104, 104.617, 60.5959, 43.9763,-0.0452497 - 1.088,-10.6692,-9.63673,-21.3759, 104.712, 60.7314, 43.9358,-0.0446831 - 1.089,-10.6788,-9.52194,-21.0005, 104.805, 60.8688, 43.8922,-0.0442787 - 1.09,-10.6883,-9.45333, -20.594, 104.898, 61.0094, 43.8446,-0.0440825 - 1.091,-10.6977,-9.44182, -20.167, 104.991, 61.1539, 43.7927,-0.044121 - 1.092,-10.7071, -9.4892,-19.7308, 105.084, 61.302, 43.7374,-0.0444007 - 1.093,-10.7167,-9.58785,-19.2969, 105.178, 61.4529, 43.6801,-0.0448977 - 1.094,-10.7263,-9.72193,-18.8769, 105.273, 61.6054, 43.6223,-0.0455479 - 1.095,-10.7361,-9.86997, -18.482, 105.37, 61.7587, 43.5651,-0.046246 - 1.096,-10.7461,-10.0083, -18.123, 105.468, 61.9123, 43.5091,-0.0468611 - 1.097,-10.7561,-10.1148,-17.8095, 105.567, 62.0657, 43.4544,-0.047268 - 1.098,-10.7663,-10.1724,-17.5501, 105.667, 62.2184, 43.4015,-0.0473822 - 1.099,-10.7765, -10.172,-17.3519, 105.767, 62.3693, 43.3506,-0.0471839 - 1.1,-10.7866,-10.1138,-17.2204, 105.866, 62.5169, 43.3026,-0.0467216 - 1.101,-10.7967, -10.007, -17.159, 105.964, 62.6603, 43.258,-0.046094 - 1.102,-10.8066,-9.86876,-17.1693, 106.061, 62.7989, 43.2169,-0.0454193 - 1.103,-10.8164,-9.72129,-17.2509, 106.157, 62.9335, 43.1783,-0.0448064 - 1.104,-10.8261,-9.58813,-17.4011, 106.251, 63.0656, 43.1407,-0.044338 - 1.105,-10.8356,-9.49058,-17.6154, 106.344, 63.1974, 43.1022,-0.0440682 - 1.106,-10.8451, -9.4442,-17.8871, 106.436, 63.331, 43.0614,-0.0440281 - 1.107,-10.8545,-9.45637, -18.208, 106.529, 63.4676, 43.0173,-0.0442297 - 1.108, -10.864,-9.52508,-18.5683, 106.623, 63.6078, 42.9702,-0.044661 - 1.109,-10.8736,-9.63929, -18.957, 106.717, 63.7515, 42.9204,-0.0452766 - 1.11,-10.8833, -9.7807, -19.362, 106.813, 63.8985, 42.8687,-0.0459902 - 1.111,-10.8931,-9.92667,-19.7708, 106.91, 64.0486, 42.8152,-0.0466811 - 1.112,-10.9031,-10.0539,-20.1707, 107.009, 64.2017, 42.7602,-0.0472164 - 1.113,-10.9132,-10.1419,-20.5491, 107.109, 64.3572, 42.7039,-0.0474854 - 1.114,-10.9234,-10.1768,-20.8942, 107.208, 64.5139, 42.6471,-0.0474317 - 1.115,-10.9336, -10.153,-21.1951, 107.308, 64.6699, 42.5911,-0.0470692 - 1.116,-10.9437,-10.0744,-21.4423, 107.407, 64.8231, 42.5373,-0.0464755 - 1.117,-10.9537,-9.95355,-21.6278, 107.505, 64.9717, 42.4871,-0.0457671 - 1.118,-10.9636,-9.80985,-21.7459, 107.601, 65.1148, 42.4409,-0.0450668 - 1.119,-10.9733,-9.66631, -21.793, 107.696, 65.2528, 42.3983,-0.0444782 - 1.12,-10.9829,-9.54587,-21.7675, 107.789, 65.3872, 42.3579,-0.0440748 - 1.121,-10.9924,-9.46778,-21.6706, 107.882, 65.52, 42.3182,-0.0439011 - 1.122,-11.0019, -9.4445,-21.5057, 107.975, 65.653, 42.2778,-0.0439787 - 1.123,-11.0113,-9.47969,-21.2786, 108.068, 65.7874, 42.236,-0.0443075 - 1.124,-11.0208,-9.56767,-20.9971, 108.162, 65.9243, 42.1925,-0.0448587 - 1.125,-11.0305,-9.69433,-20.6711, 108.257, 66.064, 42.1472,-0.0455655 - 1.126,-11.0402,-9.83938,-20.3117, 108.353, 66.207, 42.0999,-0.0463211 - 1.127,-11.0501, -9.9796,-19.9317, 108.451, 66.354, 42.0502,-0.0469924 - 1.128,-11.0602,-10.0926,-19.5443, 108.55, 66.505, 41.9977,-0.0474483 - 1.129,-11.0703,-10.1603,-19.1631, 108.65, 66.6595, 41.9427,-0.0475955 - 1.13,-11.0805,-10.1719,-18.8015, 108.75, 66.8163, 41.8859,-0.0474053 - 1.131,-11.0907,-10.1256,-18.4724, 108.849, 66.973, 41.829,-0.0469207 - 1.132,-11.1008,-10.0289,-18.1874, 108.947, 67.1274, 41.7737,-0.0462415 - 1.133,-11.1107,-9.89725,-17.9567, 109.044, 67.2773, 41.7216,-0.0454942 - 1.134,-11.1206,-9.75178,-17.7885, 109.14, 67.4221, 41.6732, -0.0448 - 1.135,-11.1302,-9.61576,-17.6887, 109.234, 67.5619, 41.6282,-0.0442549 - 1.136,-11.1398,-9.51092,-17.6608, 109.328, 67.6982, 41.5856,-0.043923 - 1.137,-11.1493,-9.45401,-17.7056, 109.42, 67.8326, 41.544,-0.0438407 - 1.138,-11.1587,-9.45408,-17.8213, 109.513, 67.9667, 41.5025,-0.0440214 - 1.139,-11.1682,-9.51107,-18.0034, 109.607, 68.1015, 41.4606,-0.0444534 - 1.14,-11.1777,-9.61582,-18.2448, 109.701, 68.2379, 41.4178,-0.0450914 - 1.141,-11.1874,-9.75153,-18.5363, 109.797, 68.3768, 41.3739,-0.0458496 - 1.142,-11.1972,-9.89648,-18.8666, 109.894, 68.519, 41.328,-0.0466054 - 1.143,-11.2072,-10.0275, -19.223, 109.992, 68.6652, 41.2795,-0.04722 - 1.144,-11.2173,-10.1236,-19.5917, 110.091, 68.8157, 41.228,-0.0475718 - 1.145,-11.2274,-10.1694,-19.9585, 110.191, 68.97, 41.1734,-0.04759 - 1.146,-11.2376,-10.1578, -20.309, 110.291, 69.1263, 41.1171,-0.0472749 - 1.147,-11.2477,-10.0905,-20.6297, 110.39, 69.2823, 41.0606,-0.0466957 - 1.148,-11.2578,-9.97842, -20.908, 110.488, 69.4357, 41.0059,-0.0459678 - 1.149,-11.2677,-9.83951, -21.133, 110.584, 69.5846, 40.9543,-0.0452206 - 1.15,-11.2775,-9.69601,-21.2959, 110.679, 69.7285, 40.9061,-0.0445684 - 1.151,-11.2871,-9.57085,-21.3904, 110.773, 69.868, 40.861,-0.0440957 - 1.152,-11.2966,-9.48406,-21.4128, 110.866, 70.0044, 40.8178,-0.0438557 - 1.153,-11.3061,-9.44946,-21.3625, 110.959, 70.1394, 40.7756,-0.0438755 - 1.154,-11.3155,-9.47256,-21.2417, 111.052, 70.2742, 40.7334,-0.0441586 - 1.155, -11.325,-9.54961,-21.0555, 111.145, 70.4099, 40.6909,-0.0446801 - 1.156,-11.3346,-9.66823,-20.8117, 111.24, 70.5473, 40.6476,-0.045378 - 1.157,-11.3443,-9.80942,-20.5205, 111.337, 70.6873, 40.603,-0.0461499 - 1.158,-11.3542,-9.95059,-20.1942, 111.434, 70.8309, 40.5564,-0.0468632 - 1.159,-11.3642,-10.0691,-19.8465, 111.533, 70.9786, 40.5069,-0.0473823 - 1.16,-11.3744,-10.1462,-19.4918, 111.632, 71.1304, 40.4544,-0.0476033 - 1.161,-11.3845,-10.1693,-19.1453, 111.732, 71.2853, 40.3994,-0.0474835 - 1.162,-11.3947, -10.135,-18.8215, 111.832, 71.4413, 40.3433,-0.0470532 - 1.163,-11.4048,-10.0488,-18.5341, 111.93, 71.5959, 40.2879,-0.0464042 - 1.164,-11.4148,-9.92439,-18.2954, 112.028, 71.7469, 40.235,-0.0456614 - 1.165,-11.4247,-9.78183,-18.1153, 112.124, 71.8931, 40.1855,-0.0449502 - 1.166,-11.4344, -9.6439,-18.0016, 112.218, 72.0344, 40.1394,-0.0443728 - 1.167,-11.4439,-9.53265, -17.959, 112.312, 72.172, 40.0957,-0.043999 - 1.168,-11.4534,-9.46585,-17.9892, 112.405, 72.3074, 40.0532,-0.0438687 - 1.169,-11.4629,-9.45415,-18.0905, 112.497, 72.4423, 40.0109,-0.0439976 - 1.17,-11.4723,-9.49937,-18.2585, 112.59, 72.578, 39.9681,-0.0443773 - 1.171,-11.4819,-9.59423,-18.4854, 112.685, 72.7153, 39.9243,-0.0449687 - 1.172,-11.4915,-9.72352,-18.7612, 112.78, 72.855, 39.8792,-0.045694 - 1.173,-11.5013,-9.86653,-19.0733, 112.877, 72.9979, 39.8324,-0.0464389 - 1.174,-11.5113,-10.0004,-19.4076, 112.975, 73.1445, 39.7833,-0.0470691 - 1.175,-11.5213,-10.1037,-19.7492, 113.074, 73.295, 39.7315,-0.0474613 - 1.176,-11.5315,-10.1599,-20.0825, 113.174, 73.4487, 39.6774,-0.0475369 - 1.177,-11.5416,-10.1601,-20.3925, 113.273, 73.604, 39.622,-0.0472849 - 1.178,-11.5518,-10.1043,-20.6651, 113.372, 73.7587, 39.5669,-0.0467637 - 1.179,-11.5619,-10.0015,-20.8878, 113.471, 73.9104, 39.5141,-0.0460812 - 1.18,-11.5718, -9.8682,-21.0507, 113.567, 74.0574, 39.4646,-0.0453634 - 1.181,-11.5816,-9.72565,-21.1463, 113.663, 74.1993, 39.4187,-0.0447244 - 1.182,-11.5912,-9.59672,-21.1704, 113.757, 74.3371, 39.3756,-0.0442485 - 1.183,-11.6008,-9.50201,-21.1221, 113.85, 74.4724, 39.3337,-0.0439879 - 1.184,-11.6102,-9.45663,-21.0037, 113.943, 74.6072, 39.2917,-0.0439683 - 1.185,-11.6197,-9.46781,-20.8211, 114.036, 74.7431, 39.2485,-0.044194 - 1.186,-11.6292,-9.53371,-20.5831, 114.129, 74.8812, 39.2035,-0.0446452 - 1.187,-11.6388,-9.64374,-20.3009, 114.224, 75.0219, 39.1567,-0.0452706 - 1.188,-11.6485,-9.78027,-19.9883, 114.32, 75.1657, 39.1082,-0.0459819 - 1.189,-11.6583,-9.92143,-19.6601, 114.417, 75.3126, 39.0579,-0.0466606 - 1.19,-11.6683,-10.0447,-19.3321, 114.516, 75.4627, 39.0058,-0.0471795 - 1.191,-11.6784,-10.1303,-19.0202, 114.615, 75.6155, 38.9522,-0.0474357 - 1.192,-11.6886,-10.1646,-18.7394, 114.715, 75.7695, 38.8979,-0.0473796 - 1.193,-11.6987,-10.1421,-18.5031, 114.814, 75.9231, 38.8442,-0.0470295 - 1.194,-11.7089,-10.0666,-18.3229, 114.913, 76.0739, 38.7926,-0.0464638 - 1.195,-11.7189,-9.95009,-18.2073, 115.011, 76.2205, 38.7443,-0.0457957 - 1.196,-11.7288,-9.81127,-18.1618, 115.107, 76.3622, 38.6996,-0.0451417 - 1.197,-11.7385,-9.67237,-18.1886, 115.202, 76.4997, 38.6574,-0.0445966 - 1.198,-11.7481, -9.5556,-18.2861, 115.296, 76.635, 38.6163,-0.0442244 - 1.199,-11.7576,-9.47961,-18.4493, 115.389, 76.7701, 38.5744,-0.0440608 - 1.2,-11.7671,-9.45653,-18.6698, 115.481, 76.907, 38.5302,-0.0441216 - 1.201,-11.7765,-9.48999,-18.9365, 115.574, 77.0467, 38.4833,-0.0444045 - 1.202, -11.786,-9.57461, -19.236, 115.668, 77.1896, 38.4338,-0.0448847 - 1.203,-11.7957,-9.69681,-19.5529, 115.763, 77.3354, 38.3826,-0.0455051 - 1.204,-11.8054, -9.837,-19.8712, 115.86, 77.4835, 38.3303,-0.0461739 - 1.205,-11.8153,-9.97276,-20.1748, 115.958, 77.6334, 38.2776,-0.0467747 - 1.206,-11.8254,-10.0824,-20.4483, 116.057, 77.7846, 38.2249,-0.0471926 - 1.207,-11.8355,-10.1483,-20.6776, 116.156, 77.9362, 38.1727,-0.0473449 - 1.208,-11.8457,-10.1601,-20.8511, 116.256, 78.087, 38.1217,-0.0472058 - 1.209,-11.8558,-10.1159,-20.9602, 116.355, 78.2355, 38.0729,-0.0468121 - 1.21,-11.8659,-10.0228,-20.9991, 116.453, 78.3805, 38.0267,-0.0462494 - 1.211,-11.8759,-9.89576,-20.9663, 116.551, 78.5216, 37.9833,-0.045624 - 1.212,-11.8857,-9.75508,-20.8634, 116.646, 78.6596, 37.9416,-0.0450355 - 1.213,-11.8954, -9.6233,-20.6962, 116.741, 78.796, 37.9001,-0.0445599 - 1.214,-11.9049,-9.52149,-20.4734, 116.834, 78.933, 37.8568,-0.0442472 - 1.215,-11.9144,-9.46591,-20.2071, 116.927, 79.0723, 37.8105,-0.044128 - 1.216,-11.9239,-9.46541,-19.9113, 117.02, 79.2149, 37.7607,-0.0442194 - 1.217,-11.9334,-9.52001,-19.6018, 117.113, 79.3605, 37.7081,-0.0445229 - 1.218,-11.9429,-9.62096,-19.2951, 117.208, 79.5083, 37.6543,-0.0450146 - 1.219,-11.9526,-9.75205,-19.0076, 117.303, 79.657, 37.6006,-0.0456343 - 1.22,-11.9624, -9.8923,-18.7545, 117.4, 79.8056, 37.5483,-0.0462857 - 1.221,-11.9724,-10.0193,-18.5495, 117.499, 79.9538, 37.4979,-0.046851 - 1.222,-11.9825,-10.1127,-18.4033, 117.598, 80.1011, 37.4494,-0.0472201 - 1.223,-11.9926,-10.1576,-18.3239, 117.697, 80.2476, 37.4025,-0.0473209 - 1.224,-12.0028,-10.1469,-18.3153, 117.797, 80.3927, 37.3571,-0.0471396 - 1.225,-12.0129,-10.0823,-18.3777, 117.896, 80.5362, 37.3129,-0.0467208 - 1.226,-12.0229,-9.97421,-18.5077, 117.994, 80.6779, 37.2696,-0.04615 - 1.227,-12.0329,-9.83996,-18.6979, 118.09, 80.8183, 37.2264,-0.0455269 - 1.228,-12.0426,-9.70102,-18.9377, 118.185, 80.9584, 37.1821,-0.0449426 - 1.229,-12.0523,-9.57962,-19.2138, 118.279, 81.0994, 37.1355,-0.0444691 - 1.23,-12.0618,-9.49517,-19.5108, 118.373, 81.2425, 37.0858,-0.0441599 - 1.231,-12.0712,-9.46114,-19.8122, 118.465, 81.3881, 37.0332,-0.0440551 - 1.232,-12.0807,-9.48293,-20.1012, 118.558, 81.5354, 36.9787,-0.0441812 - 1.233,-12.0902,-9.55702,-20.3617, 118.652, 81.6833, 36.9243,-0.0445424 - 1.234,-12.0998, -9.6715,-20.5792, 118.747, 81.8302, 36.8717,-0.0451065 - 1.235,-12.1096,-9.80805,-20.7415, 118.843, 81.9753, 36.8221,-0.045796 - 1.236,-12.1194,-9.94479,-20.8398, 118.941, 82.1186, 36.7756,-0.0464941 - 1.237,-12.1294,-10.0599,-20.8685, 119.039, 82.2608, 36.7316,-0.047068 - 1.238,-12.1396,-10.1349,-20.8263, 119.139, 82.403, 36.6885,-0.0474028 - 1.239,-12.1497,-10.1579,-20.7156, 119.239, 82.5459, 36.6452,-0.0474331 - 1.24,-12.1599,-10.1252,-20.5431, 119.338, 82.69, 36.6007,-0.0471592 - 1.241, -12.17,-10.0422,-20.3187, 119.436, 82.8351, 36.5546,-0.0466419 - 1.242, -12.18,-9.92206,-20.0553, 119.534, 82.9807, 36.507,-0.0459807 - 1.243,-12.1898,-9.78412,-19.7684, 119.63, 83.1266, 36.4578,-0.0452866 - 1.244,-12.1995,-9.65043,-19.4744, 119.724, 83.2726, 36.4071,-0.0446609 - 1.245,-12.2091,-9.54236,-19.1905, 119.818, 83.4188, 36.3549,-0.0441856 - 1.246,-12.2186,-9.47719, -18.933, 119.911, 83.5651, 36.3019,-0.043923 - 1.247,-12.2281, -9.4653,-18.7169, 120.004, 83.7107, 36.2491,-0.0439158 - 1.248,-12.2375,-9.50855,-18.5547, 120.097, 83.855, 36.1979,-0.0441822 - 1.249,-12.2471,-9.59998,-18.4557, 120.191, 83.9973, 36.1493,-0.0447034 - 1.25,-12.2567,-9.72492,-18.4257, 120.287, 84.1374, 36.1038,-0.0454133 - 1.251,-12.2665,-9.86337,-18.4662, 120.383, 84.2763, 36.0609,-0.0461976 - 1.252,-12.2765,-9.99318,-18.5746, 120.481, 84.4154, 36.0191,-0.0469116 - 1.253,-12.2865,-10.0936,-18.7444, 120.58, 84.5566, 35.9764,-0.0474134 - 1.254,-12.2967,-10.1486,-18.9653, 120.68, 84.7011, 35.9313,-0.0476011 - 1.255,-12.3068,-10.1493,-19.2241, 120.78, 84.8492, 35.883,-0.047441 - 1.256, -12.317,-10.0958,-19.5051, 120.879, 84.9998, 35.8318,-0.0469738 - 1.257, -12.327,-9.99667,-19.7916, 120.977, 85.1513, 35.7791,-0.0462987 - 1.258,-12.3369,-9.86773,-20.0663, 121.073, 85.3018, 35.7261,-0.0455436 - 1.259,-12.3467,-9.72965,-20.3128, 121.169, 85.4501, 35.674,-0.044834 - 1.26,-12.3564,-9.60454,-20.5161, 121.263, 85.5954, 35.6235,-0.0442724 - 1.261, -12.366,-9.51239,-20.6641, 121.356, 85.738, 35.5746,-0.0439308 - 1.262,-12.3754,-9.46791, -20.748, 121.449, 85.8783, 35.5272,-0.0438517 - 1.263,-12.3849,-9.47817,-20.7628, 121.542, 86.017, 35.4813,-0.0440494 - 1.264,-12.3944,-9.54151,-20.7078, 121.636, 86.1549, 35.4366,-0.044506 - 1.265, -12.404,-9.64773,-20.5865, 121.731, 86.2927, 35.3927,-0.0451643 - 1.266,-12.4137,-9.77982,-20.4065, 121.827, 86.4316, 35.3489,-0.0459251 - 1.267,-12.4235,-9.91664,-20.1791, 121.924, 86.5731, 35.3041,-0.0466566 - 1.268,-12.4335,-10.0363,-19.9183, 122.022, 86.718, 35.257,-0.0472202 - 1.269,-12.4436,-10.1197,-19.6404, 122.122, 86.867, 35.207,-0.0475044 - 1.27,-12.4538,-10.1534,-19.3626, 122.221, 87.0193, 35.1544,-0.0474563 - 1.271,-12.4639,-10.1322,-19.1022, 122.321, 87.1731, 35.1003,-0.0470958 - 1.272, -12.474,-10.0595,-18.8753, 122.419, 87.326, 35.0467,-0.046507 - 1.273, -12.484,-9.94699, -18.696, 122.517, 87.4757, 34.9953,-0.0458113 - 1.274,-12.4939,-9.81261,-18.5755, 122.613, 87.6209, 34.947,-0.0451331 - 1.275,-12.5037,-9.67792,-18.5211, 122.708, 87.7616, 34.9018,-0.0445739 - 1.276,-12.5133,-9.56446,-18.5362, 122.802, 87.8991, 34.8585,-0.0441999 - 1.277,-12.5228,-9.49036,-18.6195, 122.895, 88.0353, 34.8156,-0.0440454 - 1.278,-12.5322,-9.46744,-18.7657, 122.988, 88.1722, 34.7715,-0.0441204 - 1.279,-12.5417,-9.49933,-18.9654, 123.081, 88.3111, 34.7255,-0.0444157 - 1.28,-12.5512,-9.58088,-19.2056, 123.175, 88.4526, 34.6774,-0.0449003 - 1.281,-12.5609,-9.69901,-19.4711, 123.27, 88.5969, 34.6277,-0.0455141 - 1.282,-12.5706, -9.8348,-19.7449, 123.367, 88.7436, 34.5768,-0.0461669 - 1.283,-12.5805,-9.96652,-20.0093, 123.464, 88.8924, 34.5252,-0.046748 - 1.284,-12.5906,-10.0731,-20.2475, 123.563, 89.0426, 34.4735,-0.0471501 - 1.285,-12.6007,-10.1375,-20.4442, 123.663, 89.1933, 34.4221,-0.0472976 - 1.286,-12.6109,-10.1495,-20.5868, 123.762, 89.3432, 34.3718,-0.0471682 - 1.287, -12.621,-10.1072,-20.6663, 123.861, 89.4911, 34.3234,-0.0467978 - 1.288,-12.6311,-10.0174,-20.6777, 123.96, 89.6359, 34.2774,-0.0462662 - 1.289, -12.641,-9.89445,-20.6203, 124.057, 89.7775, 34.2336,-0.0456712 - 1.29,-12.6509,-9.75812,-20.4981, 124.152, 89.9165, 34.1908,-0.0451037 - 1.291,-12.6605,-9.63019,-20.3192, 124.247, 90.0547, 34.1475,-0.0446328 - 1.292,-12.6701,-9.53113,-20.0954, 124.34, 90.194, 34.102,-0.0443061 - 1.293,-12.6796,-9.47674,-19.8416, 124.433, 90.3358, 34.0534,-0.0441563 - 1.294,-12.6891,-9.47569,-19.5743, 124.526, 90.4804, 34.0017,-0.0442075 - 1.295,-12.6986,-9.52812,-19.3114, 124.62, 90.6271, 33.9482,-0.044471 - 1.296,-12.7081,-9.62559,-19.0699, 124.714, 90.7746, 33.8947,-0.0449336 - 1.297,-12.7178,-9.75247, -18.866, 124.81, 90.9215, 33.8429,-0.045544 - 1.298,-12.7276,-9.88846, -18.713, 124.907, 91.067, 33.7936,-0.0462098 - 1.299,-12.7376,-10.0118,-18.6209, 125.005, 91.2113, 33.747,-0.0468115 - 1.3,-12.7477,-10.1028,-18.5957, 125.104, 91.3548, 33.7022,-0.0472306 - 1.301,-12.7578,-10.1468, -18.639, 125.204, 91.4983, 33.658,-0.047382 - 1.302,-12.7679, -10.137,-18.7476, 125.303, 91.6424, 33.6135,-0.0472371 - 1.303,-12.7781,-10.0749,-18.9143, 125.402, 91.7871, 33.5681,-0.046829 - 1.304,-12.7881,-9.97043,-19.1275, 125.5, 91.9322, 33.5214,-0.0462378 - 1.305, -12.798, -9.8404,-19.3729, 125.596, 92.0775, 33.4733,-0.0455668 - 1.306,-12.8078,-9.70562,-19.6339, 125.692, 92.223, 33.4237,-0.0449193 - 1.307,-12.8174,-9.58763,-19.8927, 125.786, 92.3686, 33.3727,-0.0443847 - 1.308, -12.827, -9.5053, -20.132, 125.879, 92.5142, 33.3206,-0.0440348 - 1.309,-12.8364,-9.47176,-20.3354, 125.972, 92.6595, 33.2684,-0.0439228 - 1.31,-12.8459,-9.49235,-20.4892, 126.065, 92.8037, 33.2172,-0.0440797 - 1.311,-12.8554,-9.56373,-20.5831, 126.159, 92.9461, 33.1682,-0.0445034 - 1.312, -12.865,-9.67444,-20.6109, 126.254, 93.0865, 33.122,-0.0451463 - 1.313,-12.8748,-9.80675,-20.5707, 126.35, 93.2257, 33.0782,-0.04591 - 1.314,-12.8846,-9.93948,-20.4654, 126.447, 93.3651, 33.0356,-0.046657 - 1.315,-12.8946,-10.0514,-20.3025, 126.546, 93.5064, 32.9923,-0.0472391 - 1.316,-12.9047,-10.1246,-20.0934, 126.645, 93.6512, 32.9466,-0.047536 - 1.317,-12.9149,-10.1475,-19.8524, 126.745, 93.7996, 32.8977,-0.0474891 - 1.318, -12.925,-10.1163,-19.5965, 126.844, 93.9509, 32.8461,-0.0471158 - 1.319,-12.9351,-10.0362,-19.3433, 126.943, 94.1031, 32.793,-0.0465016 - 1.32,-12.9451,-9.91998,-19.1104, 127.04, 94.2539, 32.7401,-0.0457721 - 1.321, -12.955,-9.78625, -18.914, 127.136, 94.4018, 32.689,-0.0450588 - 1.322,-12.9647,-9.65641,-18.7677, 127.231, 94.546, 32.6401,-0.0444722 - 1.323,-12.9743,-9.55124,-18.6815, 127.324, 94.6868, 32.5934,-0.0440888 - 1.324,-12.9838,-9.48753,-18.6614, 127.417, 94.8254, 32.548,-0.0439507 - 1.325,-12.9933,-9.47545,-18.7086, 127.51, 94.963, 32.5033,-0.0440702 - 1.326,-13.0027,-9.51689,-18.8196, 127.604, 95.1009, 32.4583,-0.0444321 - 1.327,-13.0123,-9.60517,-18.9865, 127.698, 95.2401, 32.4128,-0.0449905 - 1.328,-13.0219,-9.72615,-19.1974, 127.793, 95.3815, 32.3661,-0.0456661 - 1.329,-13.0317,-9.86045,-19.4373, 127.89, 95.5256, 32.3181,-0.0463497 - 1.33,-13.0417,-9.98658,-19.6891, 127.988, 95.6727, 32.2684,-0.0469196 - 1.331,-13.0517,-10.0844,-19.9349, 128.087, 95.8226, 32.2171,-0.047269 - 1.332,-13.0618,-10.1382,-20.1573, 128.186, 95.9743, 32.1648,-0.0473349 - 1.333, -13.072,-10.1395,-20.3405, 128.286, 96.1261, 32.1126,-0.0471153 - 1.334,-13.0821,-10.0881,-20.4714, 128.385, 96.2761, 32.062,-0.0466676 - 1.335,-13.0922,-9.99227, -20.541, 128.483, 96.4227, 32.0141,-0.0460881 - 1.336,-13.1021,-9.86734,-20.5443, 128.58, 96.5652, 31.9689,-0.0454826 - 1.337,-13.1119,-9.73334,-20.4813, 128.675, 96.7044, 31.9258,-0.0449404 - 1.338,-13.1216,-9.61171,-20.3565, 128.769, 96.842, 31.8829,-0.0445229 - 1.339,-13.1311,-9.52187,-20.1793, 128.863, 96.9801, 31.8385,-0.0442659 - 1.34,-13.1406,-9.47819,-19.9624, 128.956, 97.1205, 31.7912,-0.0441901 - 1.341,-13.1501,-9.48761,-19.7216, 129.049, 97.2637, 31.7409,-0.0443078 - 1.342,-13.1596,-9.54859,-19.4745, 129.143, 97.4095, 31.6884,-0.0446203 - 1.343,-13.1692,-9.65133, -19.239, 129.237, 97.5566, 31.6355,-0.045106 - 1.344,-13.1789,-9.77937,-19.0321, 129.333, 97.7038, 31.5837,-0.045709 - 1.345,-13.1887,-9.91222,-18.8689, 129.43, 97.8501, 31.5339,-0.0463377 - 1.346,-13.1987,-10.0286,-18.7612, 129.529, 97.9955, 31.4864,-0.0468794 - 1.347,-13.2088, -10.11,-18.7167, 129.628, 98.1402, 31.4405,-0.0472281 - 1.348,-13.2189,-10.1433,-18.7385, 129.727, 98.2846, 31.3955,-0.0473133 - 1.349,-13.2291,-10.1233, -18.825, 129.827, 98.4291, 31.3506,-0.0471192 - 1.35,-13.2392,-10.0531,-18.9695, 129.925, 98.5736, 31.3051,-0.0466862 - 1.351,-13.2492, -9.9442,-19.1613, 130.023, 98.7182, 31.2587,-0.046095 - 1.352,-13.2591,-9.81387,-19.3862, 130.119, 98.8629, 31.2109,-0.0454442 - 1.353,-13.2688,-9.68302,-19.6274, 130.214, 99.0077, 31.1617,-0.0448302 - 1.354,-13.2784,-9.57258,-19.8672, 130.308, 99.1528, 31.111,-0.044337 - 1.355, -13.288,-9.50019,-20.0876, 130.401, 99.2982, 31.0591,-0.0440325 - 1.356,-13.2974, -9.4774,-20.2724, 130.494, 99.4432, 31.0071,-0.0439682 - 1.357,-13.3069,-9.50783, -20.408, 130.588, 99.5871, 30.9563,-0.0441717 - 1.358,-13.3164,-9.58656,-20.4842, 130.682, 99.7292, 30.9078,-0.0446348 - 1.359,-13.3261,-9.70098,-20.4957, 130.777, 99.8695, 30.862,-0.0453006 - 1.36,-13.3358,-9.83275,-20.4415, 130.873, 100.009, 30.8183,-0.0460619 - 1.361,-13.3457,-9.96078,-20.3261, 130.971, 100.149, 30.7752,-0.0467762 - 1.362,-13.3558,-10.0646,-20.1581, 131.07, 100.291, 30.731,-0.0472983 - 1.363,-13.3659,-10.1276,-19.9503, 131.169, 100.437, 30.6842,-0.0475191 - 1.364, -13.376,-10.1398,-19.7185, 131.269, 100.587, 30.6342,-0.0473966 - 1.365,-13.3862,-10.0992,-19.4801, 131.368, 100.739, 30.5819,-0.0469657 - 1.366,-13.3962,-10.0124,-19.2533, 131.466, 100.891, 30.5289,-0.0463248 - 1.367,-13.4062,-9.89329,-19.0551, 131.563, 101.04, 30.4769,-0.0456041 - 1.368, -13.416,-9.76094,-18.9005, 131.659, 101.187, 30.4271,-0.0449315 - 1.369,-13.4257,-9.63653,-18.8011, 131.753, 101.329, 30.3798,-0.0444077 - 1.37,-13.4353,-9.53995,-18.7644, 131.847, 101.468, 30.3343,-0.044096 - 1.371,-13.4448,-9.48664, -18.793, 131.94, 101.606, 30.2897,-0.0440251 - 1.372,-13.4543,-9.48509,-18.8847, 132.033, 101.744, 30.2448,-0.0441959 - 1.373,-13.4638, -9.5355,-19.0321, 132.126, 101.883, 30.199,-0.0445847 - 1.374,-13.4733,-9.62978, -19.224, 132.221, 102.024, 30.1518,-0.0451411 - 1.375, -13.483,-9.75282,-19.4456, 132.317, 102.167, 30.1033,-0.0457859 - 1.376,-13.4928,-9.88491,-19.6797, 132.414, 102.314, 30.0536,-0.0464164 - 1.377,-13.5028,-10.0049,-19.9082, 132.512, 102.462, 30.0028,-0.0469226 - 1.378,-13.5128,-10.0937,-20.1138, 132.611, 102.612, 29.9515,-0.047213 - 1.379, -13.523, -10.137,-20.2804, 132.71, 102.762, 29.9004,-0.0472388 - 1.38,-13.5331, -10.128,-20.3953, 132.809, 102.912, 29.8504,-0.0470067 - 1.381,-13.5432,-10.0681,-20.4498, 132.908, 103.059, 29.8024,-0.0465736 - 1.382,-13.5533, -9.967,-20.4397, 133.006, 103.203, 29.7567,-0.0460265 - 1.383,-13.5632,-9.84085, -20.366, 133.103, 103.344, 29.7127,-0.0454564 - 1.384,-13.5729,-9.70986,-20.2346, 133.198, 103.484, 29.6691,-0.0449391 - 1.385,-13.5826,-9.59498,-20.0557, 133.292, 103.623, 29.6243,-0.0445289 - 1.386,-13.5921,-9.51458,-19.8436, 133.385, 103.764, 29.5768,-0.0442644 - 1.387,-13.6016,-9.48148,-19.6148, 133.478, 103.908, 29.5264,-0.0441769 - 1.388,-13.6111,-9.50095,-19.3872, 133.571, 104.053, 29.4738,-0.0442917 - 1.389,-13.6206,-9.56984,-19.1787, 133.665, 104.2, 29.4208,-0.0446194 - 1.39,-13.6302,-9.67709,-19.0057, 133.76, 104.346, 29.369,-0.0451391 - 1.391, -13.64,-9.80552,-18.8816, 133.856, 104.491, 29.3199,-0.0457859 - 1.392,-13.6498,-9.93457,-18.8161, 133.954, 104.634, 29.2736,-0.0464531 - 1.393,-13.6598,-10.0436,-18.8143, 134.052, 104.776, 29.2292,-0.047012 - 1.394,-13.6699,-10.1152,-18.8761, 134.152, 104.919, 29.1853,-0.0473458 - 1.395,-13.6801,-10.1379,-18.9965, 134.251, 105.063, 29.1404,-0.0473823 - 1.396,-13.6902,-10.1082,-19.1659, 134.35, 105.21, 29.0936,-0.0471135 - 1.397,-13.7003,-10.0308,-19.3706, 134.449, 105.357, 29.045,-0.0465952 - 1.398,-13.7103,-9.91811,-19.5945, 134.546, 105.505, 28.9948,-0.0459279 - 1.399,-13.7201,-9.78823,-19.8195, 134.642, 105.653, 28.944,-0.0452294 - 1.4,-13.7298,-9.66193,-20.0279, 134.737, 105.799, 28.8931,-0.0446115 - 1.401,-13.7394,-9.55939,-20.2029, 134.831, 105.944, 28.8427,-0.0441643 - 1.402, -13.749,-9.49702,-20.3307, 134.924, 106.087, 28.7933,-0.0439515 - 1.403,-13.7584,-9.48475,-20.4011, 135.017, 106.228, 28.7451,-0.0440075 - 1.404,-13.7679, -9.5245,-20.4087, 135.11, 106.368, 28.6984,-0.0443333 - 1.405,-13.7775, -9.6099,-20.3529, 135.205, 106.507, 28.653,-0.0448894 - 1.406,-13.7871,-9.72724,-20.2384, 135.3, 106.646, 28.6084,-0.0455918 - 1.407,-13.7969,-9.85773,-20.0746, 135.397, 106.787, 28.5635,-0.0463191 - 1.408,-13.8069,-9.98049,-19.8747, 135.495, 106.931, 28.5171,-0.0469336 - 1.409,-13.8169,-10.0759,-19.6549, 135.593, 107.078, 28.4682,-0.0473144 - 1.41, -13.827,-10.1287,-19.4331, 135.693, 107.228, 28.417,-0.0473902 - 1.411,-13.8372,-10.1305,-19.2273, 135.792, 107.381, 28.3643,-0.0471582 - 1.412,-13.8473, -10.081, -19.054, 135.891, 107.532, 28.3119,-0.0466827 - 1.413,-13.8573,-9.98826,-18.9273, 135.989, 107.682, 28.2614,-0.0460713 - 1.414,-13.8673,-9.86703,-18.8574, 136.086, 107.827, 28.2139,-0.0454417 - 1.415,-13.8771,-9.73676,-18.8498, 136.181, 107.967, 28.1691,-0.0448923 - 1.416,-13.8867, -9.6183, -18.905, 136.276, 108.106, 28.1257,-0.0444869 - 1.417,-13.8963,-9.53059,-19.0184, 136.369, 108.243, 28.0818,-0.0442575 - 1.418,-13.9058,-9.48762,-19.1806, 136.462, 108.382, 28.036,-0.0442151 - 1.419,-13.9153,-9.49625,-19.3782, 136.555, 108.524, 27.9875,-0.0443606 - 1.42,-13.9248,-9.55506,-19.5949, 136.649, 108.668, 27.9367,-0.0446857 - 1.421,-13.9344, -9.6546,-19.8129, 136.744, 108.814, 27.8848,-0.0451642 - 1.422,-13.9441,-9.77892,-20.0143, 136.84, 108.961, 27.8331,-0.0457424 - 1.423,-13.9539,-9.90813,-20.1825, 136.937, 109.108, 27.7829,-0.0463366 - 1.424,-13.9639,-10.0216,-20.3038, 137.035, 109.254, 27.7344,-0.0468445 - 1.425, -13.974,-10.1011,-20.3682, 137.134, 109.4, 27.6875,-0.0471696 - 1.426,-13.9841, -10.134,-20.3705, 137.234, 109.545, 27.6417,-0.0472472 - 1.427,-13.9942, -10.115,-20.3107, 137.333, 109.69, 27.5962,-0.0470616 - 1.428,-14.0043,-10.0473,-20.1939, 137.432, 109.834, 27.5505,-0.0466486 - 1.429,-14.0143,-9.94168,-20.0299, 137.529, 109.979, 27.5041,-0.0460821 - 1.43,-14.0242,-9.81507,-19.8323, 137.625, 110.123, 27.4566,-0.0454541 - 1.431, -14.034,-9.68774,-19.6178, 137.72, 110.268, 27.4077,-0.0448569 - 1.432,-14.0436,-9.58005,-19.4042, 137.814, 110.413, 27.3573,-0.0443735 - 1.433,-14.0531,-9.50922,-19.2094, 137.908, 110.558, 27.306,-0.0440734 - 1.434,-14.0626,-9.48654,-19.0495, 138.001, 110.702, 27.2545,-0.04401 - 1.435,-14.0721,-9.51562,-18.9379, 138.094, 110.846, 27.2043,-0.0442122 - 1.436,-14.0816,-9.59176,-18.8838, 138.188, 110.987, 27.1562,-0.0446711 - 1.437,-14.0913,-9.70275,-18.8916, 138.283, 111.128, 27.1105,-0.0453281 - 1.438,-14.1011,-9.83082,-18.9605, 138.38, 111.267, 27.0665,-0.0460739 - 1.439,-14.1109,-9.95547,-19.0846, 138.478, 111.408, 27.0228,-0.0467658 - 1.44, -14.121,-10.0568,-19.2534, 138.576, 111.551, 26.9774,-0.047261 - 1.441,-14.1311,-10.1185,-19.4525, 138.675, 111.699, 26.9294,-0.0474561 - 1.442,-14.1412,-10.1309,-19.6651, 138.775, 111.849, 26.8785,-0.0473162 - 1.443,-14.1513,-10.0919,-19.8731, 138.874, 112.001, 26.8259,-0.0468835 - 1.444,-14.1614,-10.0079, -20.059, 138.972, 112.152, 26.7734,-0.0462604 - 1.445,-14.1713,-9.89227,-20.2071, 139.069, 112.301, 26.7227,-0.0455765 - 1.446,-14.1812,-9.76356,-20.3049, 139.165, 112.445, 26.6746,-0.0449533 - 1.447,-14.1909,-9.64237,-20.3442, 139.259, 112.586, 26.629,-0.0444798 - 1.448,-14.2005,-9.54808,-20.3218, 139.353, 112.724, 26.5847,-0.0442055 - 1.449, -14.21,-9.49575,-20.2397, 139.446, 112.862, 26.5403,-0.0441473 - 1.45,-14.2194,-9.49371,-20.1051, 139.539, 113.001, 26.4944,-0.0442994 - 1.451, -14.229,-9.54226,-19.9295, 139.633, 113.142, 26.4465,-0.0446405 - 1.452,-14.2385,-9.63361,-19.7281, 139.727, 113.285, 26.3969,-0.0451313 - 1.453,-14.2482, -9.7531,-19.5181, 139.823, 113.431, 26.3463,-0.0457105 - 1.454, -14.258,-9.88161,-19.3175, 139.92, 113.578, 26.2955,-0.0462945 - 1.455, -14.268,-9.99858,-19.1435, 140.018, 113.726, 26.2451,-0.0467881 - 1.456, -14.278,-10.0853, -19.011, 140.117, 113.874, 26.1957,-0.0471045 - 1.457,-14.2882,-10.1279,-18.9313, 140.216, 114.022, 26.1475,-0.0471877 - 1.458,-14.2983,-10.1197,-18.9112, 140.316, 114.168, 26.1005,-0.0470268 - 1.459,-14.3084,-10.0619,-18.9521, 140.414, 114.313, 26.0546,-0.0466562 - 1.46,-14.3184,-9.96388,-19.0506, 140.512, 114.457, 26.0093,-0.046143 - 1.461,-14.3283, -9.8413, -19.198, 140.609, 114.599, 25.9639,-0.0455676 - 1.462,-14.3381, -9.7138,-19.3813, 140.704, 114.742, 25.9174,-0.0450083 - 1.463,-14.3477,-9.60178,-19.5847, 140.798, 114.885, 25.8689,-0.0445346 - 1.464,-14.3573,-9.52313,-19.7905, 140.892, 115.029, 25.8184,-0.0442076 - 1.465,-14.3668,-9.49042,-19.9809, 140.985, 115.174, 25.7665,-0.0440809 - 1.466,-14.3763,-9.50885,-20.1392, 141.078, 115.319, 25.7145,-0.0441941 - 1.467,-14.3858,-9.57543,-20.2519, 141.172, 115.463, 25.6641,-0.0445587 - 1.468,-14.3954,-9.67949,-20.3092, 141.267, 115.606, 25.6163,-0.045141 - 1.469,-14.4052,-9.80435,-20.3062, 141.363, 115.746, 25.5711,-0.0458535 - 1.47, -14.415,-9.93003,-20.2433, 141.461, 115.887, 25.5274,-0.046565 - 1.471, -14.425,-10.0364,-20.1261, 141.559, 116.028, 25.4834,-0.0471287 - 1.472,-14.4351,-10.1065, -19.965, 141.658, 116.173, 25.4375,-0.0474225 - 1.473,-14.4452,-10.1292,-19.7743, 141.758, 116.321, 25.3888,-0.0473848 - 1.474,-14.4554,-10.1007,-19.5706, 141.857, 116.472, 25.3376,-0.047031 - 1.475,-14.4654,-10.0258,-19.3719, 141.955, 116.623, 25.2852,-0.0464459 - 1.476,-14.4754,-9.91643,-19.1956, 142.052, 116.773, 25.2334,-0.0457551 - 1.477,-14.4853, -9.7901,-19.0573, 142.148, 116.92, 25.1836,-0.0450892 - 1.478, -14.495,-9.66704, -18.969, 142.243, 117.062, 25.1361,-0.044554 - 1.479,-14.5046,-9.56692,-18.9383, 142.337, 117.202, 25.0905,-0.0442168 - 1.48,-14.5141,-9.50576, -18.968, 142.43, 117.34, 25.0457,-0.0441074 - 1.481,-14.5236, -9.4933,-19.0552, 142.523, 117.479, 25.0004,-0.0442258 - 1.482,-14.5331, -9.5315,-19.1921, 142.617, 117.618, 24.9538,-0.0445499 - 1.483,-14.5427,-9.61422,-19.3664, 142.711, 117.76, 24.9057,-0.0450367 - 1.484,-14.5524, -9.7282,-19.5627, 142.807, 117.905, 24.8564,-0.0456208 - 1.485,-14.5621,-9.85519,-19.7635, 142.903, 118.051, 24.8062,-0.0462163 - 1.486,-14.5721,-9.97486,-19.9509, 143.001, 118.199, 24.7557,-0.046727 - 1.487,-14.5821,-10.0681,-20.1082, 143.1, 118.347, 24.7055,-0.0470654 - 1.488,-14.5922, -10.12,-20.2216, 143.199, 118.496, 24.6561,-0.0471748 - 1.489,-14.6023,-10.1222,-20.2809, 143.298, 118.644, 24.6078,-0.0470424 - 1.49,-14.6124,-10.0746,-20.2811, 143.397, 118.79, 24.561,-0.0467011 - 1.491,-14.6225, -9.9846,-20.2222, 143.495, 118.934, 24.5155,-0.0462154 - 1.492,-14.6324,-9.86678,-20.1096, 143.592, 119.076, 24.4705,-0.0456629 - 1.493,-14.6422,-9.73995,-19.9535, 143.688, 119.217, 24.425,-0.0451179 - 1.494,-14.6519,-9.62441, -19.768, 143.782, 119.36, 24.3778,-0.0446447 - 1.495,-14.6615,-9.53863,-19.5698, 143.876, 119.503, 24.3283,-0.0442991 - 1.496, -14.671,-9.49632,-19.3767, 143.969, 119.648, 24.2769,-0.0441324 - 1.497,-14.6805, -9.5042,-19.2061, 144.062, 119.793, 24.2247,-0.0441873 - 1.498, -14.69,-9.56099,-19.0733, 144.156, 119.938, 24.1733,-0.0444855 - 1.499,-14.6996,-9.65757,-18.9902, 144.251, 120.081, 24.1243,-0.0450087 - 1.5,-14.7093,-9.77847,-18.9641, 144.346, 120.223, 24.0781,-0.0456864 - 1.501,-14.7191,-9.90433,-18.9974, 144.444, 120.363, 24.0339,-0.0463986 - 1.502,-14.7291, -10.015,-19.0869, 144.542, 120.505, 23.9901,-0.0470008 - 1.503,-14.7392,-10.0928,-19.2243, 144.641, 120.648, 23.945,-0.047362 - 1.504,-14.7493,-10.1254,-19.3972, 144.74, 120.795, 23.8973,-0.0474031 - 1.505,-14.7594,-10.1074,-19.5897, 144.839, 120.945, 23.8469,-0.0471201 - 1.506,-14.7695,-10.0419,-19.7844, 144.938, 121.096, 23.795,-0.0465821 - 1.507,-14.7795,-9.93939,-19.9636, 145.035, 121.246, 23.743,-0.0459077 - 1.508,-14.7894,-9.81621, -20.111, 145.132, 121.394, 23.6926,-0.045229 - 1.509,-14.7991,-9.69212,-20.2132, 145.227, 121.538, 23.6444,-0.04466 - 1.51,-14.8088,-9.58697, -20.261, 145.321, 121.678, 23.5982,-0.0442779 - 1.511,-14.8183,-9.51756,-20.2501, 145.414, 121.817, 23.5531,-0.0441204 - 1.512,-14.8278,-9.49497,-20.1818, 145.507, 121.955, 23.5079,-0.0441932 - 1.513,-14.8373,-9.52278,-20.0623, 145.601, 122.095, 23.4616,-0.0444774 - 1.514,-14.8468,-9.59652,-19.9026, 145.695, 122.236, 23.4139,-0.0449332 - 1.515,-14.8565,-9.70435,-19.7176, 145.79, 122.38, 23.3648,-0.0454995 - 1.516,-14.8663,-9.82901,-19.5242, 145.886, 122.525, 23.3149,-0.0460943 - 1.517,-14.8761,-9.95055,-19.3401, 145.984, 122.673, 23.2645,-0.0466238 - 1.518,-14.8862,-10.0495,-19.1823, 146.083, 122.821, 23.2143,-0.0469991 - 1.519,-14.8962,-10.1101,-19.0653, 146.182, 122.97, 23.1648,-0.0471571 - 1.52,-14.9064,-10.1227,-18.9997, 146.281, 123.118, 23.1164,-0.0470759 - 1.521,-14.9165,-10.0852,-18.9914, 146.38, 123.264, 23.0693,-0.0467786 - 1.522,-14.9265,-10.0038,-19.0412, 146.478, 123.408, 23.0235,-0.0463225 - 1.523,-14.9365,-9.89136,-19.1443, 146.575, 123.551, 22.9784,-0.0457822 - 1.524,-14.9463,-9.76602, -19.291, 146.671, 123.693, 22.9328,-0.0452319 - 1.525, -14.956, -9.6478,-19.4678, 146.766, 123.835, 22.8857,-0.0447384 - 1.526,-14.9656, -9.5556,-19.6581, 146.859, 123.979, 22.8365,-0.0443604 - 1.527,-14.9751,-9.50416,-19.8443, 146.953, 124.123, 22.7854,-0.0441519 - 1.528,-14.9846,-9.50166,-20.0092, 147.046, 124.268, 22.7334,-0.04416 - 1.529,-14.9941,-9.54849,-20.1374, 147.14, 124.413, 22.6821,-0.0444121 - 1.53,-15.0037,-9.63711,-20.2171, 147.234, 124.556, 22.633,-0.044898 - 1.531,-15.0134,-9.75333,-20.2411, 147.33, 124.698, 22.5866,-0.0455554 - 1.532,-15.0232,-9.87854, -20.207, 147.427, 124.838, 22.5422,-0.0462704 - 1.533,-15.0332, -9.9927,-20.1184, 147.525, 124.979, 22.4983,-0.0468995 - 1.534,-15.0432,-10.0776,-19.9835, 147.624, 125.123, 22.4532,-0.0473063 - 1.535,-15.0533,-10.1196, -19.815, 147.723, 125.27, 22.4054,-0.0474016 - 1.536,-15.0635,-10.1121,-19.6288, 147.822, 125.42, 22.3551,-0.0471702 - 1.537,-15.0736,-10.0562,-19.4423, 147.921, 125.571, 22.303,-0.046672 - 1.538,-15.0836,-9.96103, -19.273, 148.018, 125.721, 22.2511,-0.0460211 - 1.539,-15.0935,-9.84175,-19.1368, 148.115, 125.869, 22.2008,-0.0453492 - 1.54,-15.1033,-9.71747,-19.0462, 148.21, 126.013, 22.1528,-0.0447723 - 1.541,-15.1129,-9.60808,-19.0099, 148.305, 126.153, 22.107,-0.0443692 - 1.542,-15.1225,-9.53104, -19.031, 148.398, 126.292, 22.0621,-0.0441786 - 1.543, -15.132,-9.49868,-19.1075, 148.491, 126.43, 22.017,-0.0442068 - 1.544,-15.1415,-9.51614,-19.2321, 148.585, 126.57, 21.9704,-0.044438 - 1.545, -15.151,-9.58058,-19.3929, 148.679, 126.712, 21.9222,-0.0448401 - 1.546,-15.1606,-9.68168,-19.5746, 148.774, 126.856, 21.8725,-0.0453634 - 1.547,-15.1704,-9.80324,-19.7601, 148.87, 127.002, 21.8221,-0.0459383 - 1.548,-15.1802, -9.9258,-19.9319, 148.967, 127.149, 21.7718,-0.0464795 - 1.549,-15.1902,-10.0298,-20.0736, 149.065, 127.297, 21.7221,-0.0468984 - 1.55,-15.2003,-10.0985,-20.1719, 149.165, 127.444, 21.6733,-0.0471229 - 1.551,-15.2104,-10.1211,-20.2176, 149.264, 127.591, 21.6256,-0.047115 - 1.552,-15.2205,-10.0938,-20.2065, 149.363, 127.737, 21.579,-0.0468797 - 1.553,-15.2306,-10.0212,-20.1397, 149.461, 127.882, 21.5331,-0.0464607 - 1.554,-15.2406,-9.91491,-20.0237, 149.558, 128.025, 21.4874,-0.0459267 - 1.555,-15.2504,-9.79186,-19.8696, 149.655, 128.168, 21.441,-0.0453552 - 1.556,-15.2602,-9.67179,-19.6922, 149.749, 128.311, 21.3931,-0.0448221 - 1.557,-15.2698, -9.5739,-19.5084, 149.843, 128.455, 21.3435,-0.0443973 - 1.558,-15.2793,-9.51385,-19.3358, 149.937, 128.6, 21.2924,-0.044144 - 1.559,-15.2888, -9.5012,-19.1908, 150.03, 128.745, 21.241,-0.0441147 - 1.56,-15.2983,-9.53795,-19.0872, 150.123, 128.888, 21.1906,-0.0443392 - 1.561,-15.3079,-9.61819,-19.0349, 150.218, 129.031, 21.1422,-0.0448078 - 1.562,-15.3176,-9.72906,-19.0388, 150.313, 129.171, 21.0963,-0.0454581 - 1.563,-15.3273,-9.85281,-19.0983, 150.41, 129.312, 21.052,-0.0461767 - 1.564,-15.3373,-9.96963,-19.2077, 150.508, 129.453, 21.0076,-0.0468197 - 1.565,-15.3473,-10.0608,-19.3564, 150.606, 129.597, 20.9617,-0.04725 - 1.566,-15.3574,-10.1119, -19.53, 150.706, 129.745, 20.9131,-0.0473763 - 1.567,-15.3675,-10.1146,-19.7118, 150.805, 129.896, 20.862,-0.0471804 - 1.568,-15.3776,-10.0686,-19.8842, 150.904, 130.047, 20.8097,-0.0467192 - 1.569,-15.3876,-9.98125,-20.0307, 151.001, 130.197, 20.7581,-0.0461032 - 1.57,-15.3976,-9.86658,-20.1371, 151.098, 130.344, 20.7086,-0.04546 - 1.571,-15.4074,-9.74293,-20.1934, 151.194, 130.487, 20.6617,-0.0448998 - 1.572,-15.4171,-9.63009,-20.1942, 151.288, 130.627, 20.6168,-0.0444951 - 1.573,-15.4266, -9.5461,-20.1394, 151.382, 130.765, 20.5725,-0.0442789 - 1.574,-15.4361,-9.50437,-20.0346, 151.475, 130.904, 20.527,-0.0442559 - 1.575,-15.4456,-9.51155,-19.8899, 151.569, 131.045, 20.4796,-0.0444166 - 1.576,-15.4552,-9.56647,-19.7195, 151.662, 131.188, 20.43,-0.0447427 - 1.577,-15.4648, -9.6603,-19.5399, 151.757, 131.333, 20.3791,-0.0452039 - 1.578,-15.4745,-9.77802,-19.3685, 151.853, 131.479, 20.3281,-0.0457498 - 1.579,-15.4843,-9.90078,-19.2221, 151.95, 131.626, 20.2781,-0.0463062 - 1.58,-15.4943,-10.0089,-19.1148, 152.048, 131.772, 20.2295,-0.0467829 - 1.581,-15.5044,-10.0852,-19.0569, 152.147, 131.918, 20.1823,-0.0470925 - 1.582,-15.5145,-10.1174, -19.054, 152.247, 132.063, 20.136,-0.0471733 - 1.583,-15.5246,-10.1004,-19.1063, 152.346, 132.209, 20.09,-0.0470057 - 1.584,-15.5347, -10.037,-19.2085, 152.444, 132.354, 20.0437,-0.0466173 - 1.585,-15.5447, -9.9373,-19.3507, 152.542, 132.499, 19.9966,-0.0460738 - 1.586,-15.5545, -9.8173,-19.5187, 152.638, 132.644, 19.9485,-0.0454627 - 1.587,-15.5643,-9.69621,-19.6962, 152.733, 132.789, 19.8992,-0.0448775 - 1.588,-15.5739, -9.5934,-19.8658, 152.827, 132.934, 19.849,-0.0444054 - 1.589,-15.5835, -9.5253,-20.0108, 152.921, 133.078, 19.7985,-0.0441204 - 1.59, -15.593,-9.50277,-20.1171, 153.014, 133.221, 19.7485,-0.044076 - 1.591,-15.6025,-9.52941,-20.1744, 153.107, 133.363, 19.6998,-0.0442957 - 1.592, -15.612,-9.60091,-20.1771, 153.201, 133.504, 19.6528,-0.0447604 - 1.593,-15.6217, -9.7058, -20.125, 153.297, 133.644, 19.6074,-0.0454016 - 1.594,-15.6315, -9.8273,-20.0234, 153.393, 133.784, 19.5625,-0.0461056 - 1.595,-15.6413,-9.94596,-19.8824, 153.491, 133.927, 19.5169,-0.0467347 - 1.596,-15.6513,-10.0428,-19.7159, 153.589, 134.073, 19.4693,-0.0471609 - 1.597,-15.6614,-10.1023,-19.5405, 153.688, 134.222, 19.4193,-0.0473017 - 1.598,-15.6715,-10.1151,-19.3733, 153.787, 134.373, 19.3676,-0.0471423 - 1.599,-15.6817, -10.079,-19.2309, 153.886, 134.524, 19.3157,-0.0467362 - 1.6,-15.6917,-9.99994,-19.1274, 153.984, 134.673, 19.2653,-0.0461837 - 1.601,-15.7017,-9.89054,-19.0729, 154.081, 134.818, 19.2175,-0.0455973 - 1.602,-15.7115,-9.76833,-19.0726, 154.177, 134.96, 19.1722,-0.0450712 - 1.603,-15.7212,-9.65286,-19.1266, 154.272, 135.099, 19.1281,-0.044665 - 1.604,-15.7308,-9.56259,-19.2293, 154.366, 135.238, 19.0835,-0.0444068 - 1.605,-15.7403,-9.51196,-19.3705, 154.459, 135.378, 19.0368,-0.0443071 - 1.606,-15.7498,-9.50902,-19.5361, 154.552, 135.521, 18.9874,-0.0443727 - 1.607,-15.7593,-9.55423,-19.7096, 154.646, 135.665, 18.9361,-0.0446091 - 1.608,-15.7689,-9.64033,-19.8737, 154.741, 135.811, 18.8842,-0.0450109 - 1.609,-15.7786,-9.75351,-20.0121, 154.836, 135.957, 18.8335,-0.0455451 - 1.61,-15.7884,-9.87565,-20.1111, 154.933, 136.102, 18.7848,-0.0461413 - 1.611,-15.7984,-9.98722, -20.161, 155.031, 136.246, 18.7384,-0.0466974 - 1.612,-15.8084,-10.0704,-20.1567, 155.13, 136.39, 18.6932,-0.0471012 - 1.613,-15.8185,-10.1118,-20.0989, 155.229, 136.534, 18.6479,-0.0472623 - 1.614,-15.8286, -10.105,-19.9934, 155.328, 136.68, 18.6016,-0.0471392 - 1.615,-15.8387, -10.051,-19.8509, 155.427, 136.827, 18.5536,-0.046752 - 1.616,-15.8487,-9.95842,-19.6856, 155.525, 136.974, 18.5042,-0.0461752 - 1.617,-15.8586, -9.8422,-19.5142, 155.621, 137.122, 18.454,-0.0455169 - 1.618,-15.8684,-9.72091,-19.3539, 155.717, 137.268, 18.4037,-0.0448926 - 1.619,-15.8781,-9.61394,-19.2207, 155.811, 137.412, 18.3541,-0.0444038 - 1.62,-15.8876, -9.5384,-19.1279, 155.904, 137.555, 18.3055,-0.0441243 - 1.621,-15.8972,-9.50635,-19.0847, 155.998, 137.696, 18.2579,-0.0440949 - 1.622,-15.9067,-9.52288,-19.0954, 156.091, 137.836, 18.2112,-0.0443202 - 1.623,-15.9162,-9.58533,-19.1589, 156.185, 137.975, 18.1651,-0.0447667 - 1.624,-15.9258,-9.68368,-19.2686, 156.28, 138.116, 18.1189,-0.045364 - 1.625,-15.9356,-9.80217,-19.4134, 156.376, 138.258, 18.0721,-0.0460104 - 1.626,-15.9454,-9.92185,-19.5786, 156.474, 138.403, 18.024,-0.0465907 - 1.627,-15.9554,-10.0236,-19.7476, 156.572, 138.551, 17.9744,-0.0469999 - 1.628,-15.9655, -10.091,-19.9032, 156.671, 138.7, 17.9237,-0.0471692 - 1.629,-15.9756,-10.1135,-20.0299, 156.77, 138.85, 17.8728,-0.0470823 - 1.63,-15.9857,-10.0875,-20.1148, 156.869, 138.999, 17.823,-0.0467751 - 1.631,-15.9958, -10.017,-20.1494, 156.967, 139.146, 17.775,-0.0463202 - 1.632,-16.0057,-9.91352,-20.1304, 157.065, 139.29, 17.7291,-0.0458013 - 1.633,-16.0156,-9.79352,-20.0597, 157.161, 139.431, 17.6844,-0.0452921 - 1.634,-16.0253,-9.67623,-19.9446, 157.256, 139.571, 17.6395,-0.0448468 - 1.635,-16.0349, -9.5804,-19.7969, 157.35, 139.712, 17.5929,-0.0445041 - 1.636,-16.0445,-9.52136,-19.6316, 157.443, 139.855, 17.5438,-0.0442982 - 1.637, -16.054,-9.50853,-19.4656, 157.536, 140, 17.4925,-0.044265 - 1.638,-16.0635,-9.54392,-19.3157, 157.63, 140.145, 17.4405,-0.0444364 - 1.639,-16.0731,-9.62185,-19.1971, 157.724, 140.29, 17.3894,-0.0448218 - 1.64,-16.0828,-9.72983,-19.1219, 157.82, 140.434, 17.3407,-0.0453885 - 1.641,-16.0925,-9.85057,-19.0976, 157.916, 140.576, 17.2946,-0.0460511 - 1.642,-16.1025,-9.96474,-19.1266, 158.014, 140.717, 17.2502,-0.0466833 - 1.643,-16.1125,-10.0541,-19.2059, 158.113, 140.86, 17.2057,-0.047148 - 1.644,-16.1226,-10.1043,-19.3273, 158.212, 141.005, 17.1596,-0.0473382 - 1.645,-16.1327,-10.1075,-19.4782, 158.311, 141.153, 17.111,-0.04721 - 1.646,-16.1428, -10.063,-19.6433, 158.41, 141.303, 17.0603,-0.0467957 - 1.647,-16.1528,-9.97816,-19.8055, 158.508, 141.453, 17.0087,-0.0461911 - 1.648,-16.1627,-9.86642,-19.9484, 158.604, 141.601, 16.9578,-0.0455238 - 1.649,-16.1725,-9.74573,-20.0572, 158.7, 141.746, 16.9087,-0.0449184 - 1.65,-16.1822,-9.63539, -20.121, 158.795, 141.889, 16.8616,-0.0444684 - 1.651,-16.1918,-9.55304,-20.1332, 158.888, 142.028, 16.8159,-0.0442267 - 1.652,-16.2013,-9.51185,-20.0926, 158.982, 142.167, 16.7704,-0.0442079 - 1.653,-16.2108,-9.51837,-20.0037, 159.075, 142.306, 16.7242,-0.044399 - 1.654,-16.2204,-9.57154,-19.8755, 159.169, 142.447, 16.6767,-0.0447672 - 1.655, -16.23,-9.66281,-19.7214, 159.264, 142.591, 16.6277,-0.0452625 - 1.656,-16.2397,-9.77757,-19.5572, 159.36, 142.736, 16.5779,-0.0458186 - 1.657,-16.2495,-9.89745,-19.3999, 159.457, 142.883, 16.5278,-0.0463554 - 1.658,-16.2595,-10.0033,-19.2657, 159.555, 143.03, 16.478,-0.0467892 - 1.659,-16.2695,-10.0781,-19.1684, 159.654, 143.178, 16.4291,-0.0470485 - 1.66,-16.2796, -10.11,-19.1179, 159.753, 143.325, 16.3812,-0.0470905 - 1.661,-16.2898,-10.0939,-19.1194, 159.852, 143.471, 16.3343,-0.0469105 - 1.662,-16.2998,-10.0324,-19.1726, 159.95, 143.616, 16.288,-0.0465407 - 1.663,-16.3098,-9.93538, -19.272, 160.048, 143.76, 16.2419,-0.0460405 - 1.664,-16.3197,-9.81834,-19.4071, 160.144, 143.903, 16.1953,-0.0454826 - 1.665,-16.3295,-9.70004, -19.564, 160.239, 144.047, 16.1474,-0.0449429 - 1.666,-16.3391,-9.59939,-19.7262, 160.333, 144.191, 16.098,-0.0444948 - 1.667,-16.3487, -9.5325,-19.8771, 160.427, 144.335, 16.0474,-0.0442064 - 1.668,-16.3582,-9.51003,-20.0008, 160.52, 144.48, 15.9965,-0.044135 - 1.669,-16.3677,-9.53555,-20.0848, 160.614, 144.623, 15.9466,-0.0443149 - 1.67,-16.3772,-9.60496,-20.1202, 160.708, 144.765, 15.8985,-0.0447409 - 1.671,-16.3869,-9.70713,-20.1036, 160.803, 144.905, 15.8525,-0.0453557 - 1.672,-16.3967,-9.82568,-20.0366, 160.9, 145.046, 15.8077,-0.0460512 - 1.673,-16.4065,-9.94166,-19.9265, 160.997, 145.188, 15.7627,-0.0466881 - 1.674,-16.4165,-10.0365,-19.7847, 161.096, 145.332, 15.716,-0.047132 - 1.675,-16.4266,-10.0951,-19.6261, 161.195, 145.48, 15.6669,-0.0472915 - 1.676,-16.4367, -10.108,-19.4673, 161.294, 145.631, 15.6157,-0.0471449 - 1.677,-16.4468,-10.0733,-19.3248, 161.393, 145.782, 15.5638,-0.046743 - 1.678,-16.4569,-9.99642,-19.2134, 161.491, 145.932, 15.5129,-0.0461876 - 1.679,-16.4668,-9.88982,-19.1448, 161.588, 146.078, 15.4644,-0.0455965 - 1.68,-16.4767,-9.77051,-19.1261, 161.684, 146.22, 15.4183,-0.0450689 - 1.681,-16.4864,-9.65759,-19.1591, 161.778, 146.36, 15.3739,-0.0446678 - 1.682, -16.496,-9.56911,-19.2403, 161.872, 146.499, 15.3293,-0.0444203 - 1.683,-16.5055,-9.51922,-19.3611, 161.966, 146.638, 15.2829,-0.044333 - 1.684, -16.515,-9.51587,-19.5087, 162.059, 146.78, 15.2341,-0.0444069 - 1.685,-16.5245,-9.55957,-19.6676, 162.153, 146.925, 15.1832,-0.0446432 - 1.686,-16.5341, -9.6433,-19.8212, 162.247, 147.071, 15.1316,-0.0450348 - 1.687,-16.5438,-9.75364,-19.9532, 162.343, 147.217, 15.0809,-0.0455512 - 1.688,-16.5536,-9.87294,-20.0499, 162.44, 147.362, 15.0321,-0.0461273 - 1.689,-16.5636,-9.98209,-20.1011, 162.538, 147.506, 14.9854,-0.0466665 - 1.69,-16.5736,-10.0637,-20.1016, 162.636, 147.65, 14.9399,-0.0470609 - 1.691,-16.5837,-10.1046,-20.0514, 162.736, 147.794, 14.8945,-0.0472217 - 1.692,-16.5938,-10.0984,-19.9559, 162.835, 147.94, 14.848,-0.0471057 - 1.693,-16.6039,-10.0461,-19.8251, 162.933, 148.086, 14.8,-0.0467301 - 1.694,-16.6139,-9.95601,-19.6731, 163.031, 148.234, 14.7506,-0.0461664 - 1.695,-16.6238,-9.84265,-19.5158, 163.127, 148.381, 14.7005,-0.0455211 - 1.696,-16.6336,-9.72414,-19.3699, 163.223, 148.528, 14.6504,-0.0449093 - 1.697,-16.6432,-9.61942,-19.2508, 163.317, 148.672, 14.601,-0.0444324 - 1.698,-16.6528,-9.54526, -19.171, 163.411, 148.814, 14.5526,-0.0441632 - 1.699,-16.6623,-9.51348,-19.1389, 163.504, 148.955, 14.5053,-0.0441398 - 1.7,-16.6718,-9.52915,-19.1579, 163.598, 149.095, 14.4587,-0.0443634 - 1.701,-16.6814,-9.58974,-19.2257, 163.692, 149.235, 14.4124,-0.0447982 - 1.702, -16.691,-9.68552,-19.3352, 163.787, 149.376, 14.3658,-0.0453738 - 1.703,-16.7008,-9.80115,-19.4747, 163.883, 149.518, 14.3184,-0.0459928 - 1.704,-16.7106,-9.91814,-19.6292, 163.98, 149.664, 14.2699,-0.0465472 - 1.705,-16.7206,-10.0178,-19.7824, 164.078, 149.811, 14.2201,-0.0469405 - 1.706,-16.7307,-10.0841, -19.918, 164.177, 149.961, 14.1697,-0.0471098 - 1.707,-16.7408,-10.1065,-20.0215, 164.277, 150.11, 14.1195,-0.0470394 - 1.708,-16.7509,-10.0815,-20.0821, 164.375, 150.258, 14.0704,-0.0467604 - 1.709,-16.7609,-10.0131,-20.0934, 164.474, 150.404, 14.023,-0.0463356 - 1.71,-16.7709,-9.91226,-20.0542, 164.571, 150.548, 13.9772,-0.0458387 - 1.711,-16.7808, -9.7951,-19.9688, 164.667, 150.69, 13.9322,-0.0453365 - 1.712,-16.7905,-9.68039,-19.8464, 164.762, 150.831, 13.8864,-0.0448824 - 1.713,-16.8001,-9.58648,-19.7001, 164.856, 150.973, 13.8388,-0.0445208 - 1.714,-16.8097,-9.52838,-19.5457, 164.949, 151.116, 13.789,-0.0442955 - 1.715,-16.8192,-9.51535,-19.3995, 165.043, 151.261, 13.7376,-0.0442515 - 1.716,-16.8287,-9.54947,-19.2773, 165.137, 151.406, 13.6861,-0.0444255 - 1.717,-16.8383,-9.62524, -19.192, 165.231, 151.55, 13.6361,-0.0448249 - 1.718,-16.8479,-9.73052,-19.1527, 165.326, 151.692, 13.5886,-0.0454088 - 1.719,-16.8577,-9.84845,-19.1636, 165.423, 151.834, 13.5433,-0.0460814 - 1.72,-16.8676,-9.96016,-19.2233, 165.521, 151.975, 13.4989,-0.0467082 - 1.721,-16.8777,-10.0478,-19.3254, 165.619, 152.118, 13.4537,-0.0471503 - 1.722,-16.8877,-10.0973,-19.4589, 165.718, 152.265, 13.4063,-0.0473072 - 1.723,-16.8979,-10.1009,-19.6094, 165.817, 152.414, 13.3564,-0.0471478 - 1.724,-16.9079,-10.0579,-19.7606, 165.916, 152.564, 13.3049,-0.0467183 - 1.725, -16.918, -9.9753,-19.8964, 166.014, 152.714, 13.2533,-0.0461238 - 1.726,-16.9279, -9.8663,-20.0022, 166.111, 152.862, 13.2034,-0.0454926 - 1.727,-16.9377,-9.74836,-20.0666, 166.206, 153.006, 13.1557,-0.044939 - 1.728,-16.9474,-9.64035,-20.0827, 166.301, 153.146, 13.1101,-0.0445395 - 1.729, -16.957,-9.55953, -20.049, 166.395, 153.285, 13.0652,-0.0443284 - 1.73,-16.9665,-9.51883,-19.9691, 166.488, 153.424, 13.0196,-0.0443081 - 1.731, -16.976,-9.52472,-19.8518, 166.582, 153.565, 12.9722,-0.0444645 - 1.732,-16.9856,-9.57624,-19.7097, 166.675, 153.708, 12.9229,-0.0447763 - 1.733,-16.9952,-9.66512,-19.5583, 166.77, 153.853, 12.8724,-0.0452138 - 1.734,-17.0049,-9.77713,-19.4139, 166.866, 153.999, 12.8218,-0.0457314 - 1.735,-17.0147,-9.89432,-19.2921, 166.963, 154.145, 12.772,-0.0462627 - 1.736,-17.0247,-9.99797, -19.206, 167.061, 154.291, 12.7238,-0.0467247 - 1.737,-17.0347,-10.0715, -19.165, 167.16, 154.436, 12.6768,-0.0470333 - 1.738,-17.0448,-10.1031,-19.1732, 167.259, 154.582, 12.6306,-0.0471244 - 1.739,-17.0549,-10.0879,-19.2299, 167.358, 154.727, 12.5843,-0.0469726 - 1.74, -17.065,-10.0282,-19.3287, 167.457, 154.873, 12.5374,-0.0465989 - 1.741, -17.075,-9.93362,-19.4589, 167.554, 155.018, 12.4895,-0.0460654 - 1.742,-17.0849,-9.81934,-19.6062, 167.65, 155.164, 12.4407,-0.0454614 - 1.743,-17.0946,-9.70363,-19.7547, 167.746, 155.31, 12.3911,-0.0448851 - 1.744,-17.1043,-9.60501,-19.8882, 167.84, 155.454, 12.3412,-0.0444292 - 1.745,-17.1138,-9.53923,-19.9923, 167.933, 155.598, 12.2916,-0.0441686 - 1.746,-17.1233,-9.51679,-20.0557, 168.027, 155.74, 12.2429,-0.0441509 - 1.747,-17.1329,-9.54128,-20.0715, 168.12, 155.881, 12.1953,-0.0443881 - 1.748,-17.1424,-9.60873,-20.0381, 168.215, 156.021, 12.1488,-0.0448489 - 1.749,-17.1521,-9.70833,-19.9593, 168.31, 156.161, 12.103,-0.0454576 - 1.75,-17.1618,-9.82415,-19.8436, 168.406, 156.303, 12.0568,-0.0461038 - 1.751,-17.1717,-9.93763,-19.7039, 168.504, 156.448, 12.0094,-0.0466645 - 1.752,-17.1817,-10.0306,-19.5553, 168.602, 156.595, 11.9603,-0.0470338 - 1.753,-17.1918,-10.0883,-19.4141, 168.701, 156.744, 11.9098,-0.0471498 - 1.754,-17.2019,-10.1014,-19.2958, 168.8, 156.894, 11.8588,-0.0470096 - 1.755, -17.212,-10.0679,-19.2131, 168.899, 157.044, 11.8086,-0.0466633 - 1.756, -17.222,-9.99316,-19.1751, 168.997, 157.19, 11.7604,-0.0461925 - 1.757, -17.232,-9.88916,-19.1858, 169.094, 157.334, 11.7143,-0.0456828 - 1.758,-17.2418,-9.77257,-19.2441, 169.19, 157.475, 11.6694,-0.0452028 - 1.759,-17.2515,-9.66202,-19.3433, 169.285, 157.615, 11.6244,-0.0447979 - 1.76,-17.2611,-9.57521,-19.4727, 169.379, 157.756, 11.5776,-0.0444986 - 1.761,-17.2707,-9.52601,-19.6179, 169.472, 157.899, 11.5284,-0.0443338 - 1.762,-17.2802,-9.52225, -19.763, 169.565, 158.044, 11.4772,-0.0443371 - 1.763,-17.2897,-9.56453,-19.8921, 169.659, 158.189, 11.4255,-0.0445383 - 1.764,-17.2993,-9.64605, -19.991, 169.754, 158.334, 11.3749,-0.0449436 - 1.765, -17.309,-9.75374, -20.049, 169.85, 158.477, 11.3267,-0.0455147 - 1.766,-17.3188,-9.87037,-20.0597, 169.946, 158.619, 11.2809,-0.0461605 - 1.767,-17.3288,-9.97728, -20.022, 170.044, 158.761, 11.2364,-0.0467523 - 1.768,-17.3388,-10.0574,-19.9401, 170.143, 158.904, 11.1914,-0.0471571 - 1.769,-17.3489,-10.0979,-19.8232, 170.242, 159.05, 11.1445,-0.0472792 - 1.77, -17.359,-10.0923,-19.6842, 170.341, 159.199, 11.0951,-0.0470909 - 1.771,-17.3691,-10.0415,-19.5384, 170.44, 159.349, 11.0441,-0.0466404 - 1.772,-17.3791,-9.95379, -19.402, 170.537, 159.498, 10.9927,-0.0460333 - 1.773, -17.389, -9.8431,-19.2899, 170.634, 159.646, 10.9425,-0.0453986 - 1.774,-17.3987,-9.72717,-19.2145, 170.729, 159.79, 10.8944,-0.0448515 - 1.775,-17.4084,-9.62456, -19.184, 170.824, 159.931, 10.8482,-0.0444704 - 1.776, -17.418,-9.55168,-19.2017, 170.917, 160.07, 10.8029,-0.0442905 - 1.777,-17.4275,-9.52015,-19.2657, 171.011, 160.209, 10.7572,-0.044313 - 1.778, -17.437, -9.535,-19.3687, 171.104, 160.35, 10.7101,-0.0445183 - 1.779,-17.4466,-9.59383,-19.4992, 171.198, 160.492, 10.6613,-0.0448754 - 1.78,-17.4562,-9.68721,-19.6429, 171.293, 160.637, 10.6113,-0.0453429 - 1.781, -17.466,-9.80017,-19.7837, 171.389, 160.783, 10.561,-0.0458657 - 1.782,-17.4758,-9.91465, -19.906, 171.487, 160.929, 10.5113,-0.0463736 - 1.783,-17.4858,-10.0123,-19.9964, 171.585, 161.076, 10.4626,-0.0467877 - 1.784,-17.4958,-10.0776,-20.0448, 171.684, 161.222, 10.4152,-0.0470356 - 1.785,-17.5059, -10.1, -20.046, 171.783, 161.367, 10.3685,-0.047068 - 1.786, -17.516, -10.076,-19.9998, 171.882, 161.513, 10.3221,-0.0468731 - 1.787,-17.5261,-10.0095,-19.9116, 171.98, 161.658, 10.2753,-0.0464791 - 1.788,-17.5361, -9.9111,-19.7912, 172.077, 161.803, 10.2278,-0.0459485 - 1.789,-17.5459, -9.7966,-19.6519, 172.173, 161.949, 10.1794,-0.0453651 - 1.79,-17.5557, -9.6843,-19.5095, 172.268, 162.093, 10.13,-0.0448197 - 1.791,-17.5653,-9.59217,-19.3796, 172.362, 162.238, 10.0801,-0.0443989 - 1.792,-17.5748,-9.53494,-19.2768, 172.456, 162.381, 10.0303,-0.0441741 - 1.793,-17.5844,-9.52173,-19.2125, 172.549, 162.524, 9.98131,-0.0441917 - 1.794,-17.5939,-9.55465,-19.1937, 172.643, 162.665, 9.93353,-0.0444616 - 1.795,-17.6035,-9.62839,-19.2226, 172.738, 162.806, 9.88703,-0.0449485 - 1.796,-17.6131,-9.73114,-19.2957, 172.833, 162.946, 9.84125,-0.0455706 - 1.797,-17.6229,-9.84644,-19.4048, 172.93, 163.088, 9.7952,-0.0462117 - 1.798,-17.6328,-9.95586,-19.5377, 173.027, 163.233, 9.74789,-0.0467464 - 1.799,-17.6428,-10.0419,-19.6796, 173.126, 163.38, 9.69878,-0.0470723 - 1.8,-17.6529,-10.0908,-19.8145, 173.225, 163.529, 9.64817,-0.0471368 - 1.801, -17.663,-10.0947,-19.9273, 173.324, 163.68, 9.59714,-0.0469483 - 1.802,-17.6731,-10.0531,-20.0055, 173.422, 163.829, 9.54706,-0.0465675 - 1.803,-17.6831,-9.97265,-20.0404, 173.52, 163.975, 9.49897,-0.0460816 - 1.804,-17.6931,-9.86622,-20.0281, 173.617, 164.118, 9.45297,-0.0455762 - 1.805,-17.7029,-9.75085,-19.9701, 173.713, 164.259, 9.40814,-0.0451151 - 1.806,-17.7126,-9.64501,-19.8729, 173.807, 164.4, 9.36293,-0.0447383 - 1.807,-17.7222,-9.56562,-19.7476, 173.901, 164.541, 9.31589,-0.0444719 - 1.808,-17.7317,-9.52536,-19.6083, 173.995, 164.684, 9.26643,-0.0443429 - 1.809,-17.7412,-9.53065,-19.4706, 174.088, 164.829, 9.21516,-0.0443833 - 1.81,-17.7508,-9.58063,-19.3499, 174.182, 164.974, 9.16359,-0.04462 - 1.811,-17.7604,-9.66726,-19.2599, 174.277, 165.118, 9.1134,-0.0450534 - 1.812,-17.7701,-9.77668,-19.2105, 174.373, 165.262, 9.06559,-0.0456371 - 1.813,-17.7799,-9.89137,-19.2074, 174.47, 165.404, 9.02002,-0.0462736 - 1.814,-17.7899,-9.99298,-19.2506, 174.568, 165.546, 8.97541,-0.0468317 - 1.815,-17.7999,-10.0653,-19.3354, 174.667, 165.689, 8.93007,-0.0471837 - 1.816, -17.81,-10.0967,-19.4521, 174.766, 165.836, 8.88267,-0.0472451 - 1.817,-17.8201,-10.0822,-19.5874, 174.865, 165.985, 8.83296,-0.0470028 - 1.818,-17.8302,-10.0242,-19.7261, 174.963, 166.135, 8.78177,-0.046518 - 1.819,-17.8401,-9.93199,-19.8525, 175.06, 166.284, 8.73063,-0.0459032 - 1.82, -17.85, -9.8203,-19.9525, 175.157, 166.43, 8.68093,-0.0452864 - 1.821,-17.8598,-9.70702,-20.0147, 175.252, 166.574, 8.63332,-0.0447759 - 1.822,-17.8694,-9.61028,-20.0321, 175.346, 166.714, 8.58743,-0.0444396 - 1.823, -17.879,-9.54553, -20.003, 175.44, 166.853, 8.5421,-0.0443033 - 1.824,-17.8885,-9.52313,-19.9306, 175.533, 166.993, 8.49605,-0.0443616 - 1.825,-17.8981,-9.54662,-19.8232, 175.627, 167.134, 8.44843,-0.0445923 - 1.826,-17.9076,-9.61223, -19.693, 175.721, 167.277, 8.39918,-0.0449641 - 1.827,-17.9173,-9.70944,-19.5549, 175.816, 167.422, 8.34896,-0.0454363 - 1.828, -17.927,-9.82268,-19.4244, 175.913, 167.568, 8.29874,-0.0459539 - 1.829,-17.9369,-9.93383,-19.3164, 176.01, 167.714, 8.24938,-0.0464465 - 1.83,-17.9469,-10.0251, -19.243, 176.109, 167.86, 8.20126,-0.0468355 - 1.831, -17.957,-10.0819,-19.2126, 176.207, 168.006, 8.15424,-0.0470496 - 1.832,-17.9671,-10.0952,-19.2284, 176.307, 168.152, 8.10778,-0.0470431 - 1.833,-17.9772,-10.0629,-19.2887, 176.405, 168.297, 8.06124,-0.046809 - 1.834,-17.9872,-9.99012,-19.3865, 176.503, 168.443, 8.0141,-0.046382 - 1.835,-17.9971,-9.88858,-19.5106, 176.6, 168.588, 7.96605,-0.045831 - 1.836, -18.007,-9.77452,-19.6469, 176.696, 168.734, 7.9171,-0.0452456 - 1.837,-18.0167, -9.6662,-19.7798, 176.791, 168.879, 7.86751,-0.0447201 - 1.838,-18.0263,-9.58094,-19.8943, 176.885, 169.023, 7.81779,-0.0443404 - 1.839,-18.0359,-9.53237,-19.9773, 176.978, 169.166, 7.76849,-0.0441724 - 1.84,-18.0454,-9.52823,-20.0195, 177.072, 169.308, 7.72014,-0.0442517 - 1.841,-18.0549,-9.56916, -20.016, 177.166, 169.448, 7.67293,-0.0445743 - 1.842,-18.0645, -9.6486,-19.9674, 177.26, 169.589, 7.62664,-0.0450909 - 1.843,-18.0742,-9.75381,-19.8793, 177.356, 169.73, 7.58057,-0.0457113 - 1.844, -18.084,-9.86795,-19.7618, 177.453, 169.873, 7.53381,-0.0463191 - 1.845,-18.0939,-9.97276,-19.6283, 177.551, 170.018, 7.48565,-0.0467985 - 1.846, -18.104,-10.0515,-19.4942, 177.649, 170.166, 7.43594,-0.0470629 - 1.847,-18.1141,-10.0915,-19.3747, 177.748, 170.316, 7.38528,-0.0470767 - 1.848,-18.1242,-10.0865,-19.2835, 177.847, 170.466, 7.33481,-0.0468597 - 1.849,-18.1342,-10.0373, -19.231, 177.946, 170.614, 7.2857,-0.0464744 - 1.85,-18.1442,-9.95172,-19.2231, 178.043, 170.759, 7.23855,-0.046001 - 1.851,-18.1541,-9.84354,-19.2606, 178.14, 170.901, 7.19303,-0.0455132 - 1.852,-18.1639,-9.73004,-19.3392, 178.235, 171.042, 7.14797,-0.0450658 - 1.853,-18.1736, -9.6294,-19.4498, 178.33, 171.183, 7.10186,-0.0446962 - 1.854,-18.1832, -9.5577,-19.5797, 178.424, 171.326, 7.05365,-0.0444367 - 1.855,-18.1927, -9.5264,-19.7139, 178.517, 171.469, 7.0033,-0.0443239 - 1.856,-18.2022,-9.54047,-19.8371, 178.611, 171.614, 6.95183,-0.0443971 - 1.857,-18.2118,-9.59766,-19.9351, 178.705, 171.759, 6.90089,-0.0446813 - 1.858,-18.2214,-9.68877,-19.9967, 178.8, 171.903, 6.85189,-0.0451647 - 1.859,-18.2312,-9.79923, -20.015, 178.896, 172.045, 6.8053,-0.0457821 - 1.86, -18.241,-9.91135,-19.9878, 178.993, 172.186, 6.76038,-0.0464186 - 1.861, -18.251,-10.0072,-19.9184, 179.091, 172.329, 6.71556,-0.0469362 - 1.862, -18.261,-10.0715,-19.8148, 179.19, 172.474, 6.66922,-0.0472147 - 1.863,-18.2711,-10.0939,-19.6891, 179.289, 172.622, 6.62049,-0.0471905 - 1.864,-18.2812,-10.0708,-19.5556, 179.388, 172.771, 6.56971,-0.0468767 - 1.865,-18.2913,-10.0061,-19.4298, 179.486, 172.922, 6.51823,-0.0463555 - 1.866,-18.3012,-9.91004,-19.3262, 179.583, 173.07, 6.46769,-0.0457484 - 1.867,-18.3111,-9.79803,-19.2567, 179.68, 173.215, 6.41924,-0.0451764 - 1.868,-18.3208,-9.68799,-19.2292, 179.775, 173.357, 6.37294,-0.0447294 - 1.869,-18.3305,-9.59752,-19.2468, 179.869, 173.496, 6.32783,-0.0444536 - 1.87, -18.34,-9.54109,-19.3074, 179.962, 173.636, 6.28242,-0.0443587 - 1.871,-18.3495,-9.52771, -19.404, 180.056, 173.776, 6.23545,-0.0444338 - 1.872,-18.3591,-9.55948,-19.5254, 180.15, 173.918, 6.18649,-0.0446623 - 1.873,-18.3687,-9.63131,-19.6574, 180.244, 174.063, 6.13608,-0.0450244 - 1.874,-18.3783,-9.73169,-19.7848, 180.34, 174.209, 6.08538,-0.0454902 - 1.875,-18.3881,-9.84453,-19.8929, 180.436, 174.355, 6.03558,-0.046009 - 1.876, -18.398,-9.95179,-19.9693, 180.534, 174.5, 5.98734,-0.0465066 - 1.877, -18.408,-10.0363, -20.005, 180.632, 174.645, 5.94055,-0.0468946 - 1.878,-18.4181,-10.0846,-19.9961, 180.731, 174.79, 5.8945,-0.0470918 - 1.879,-18.4282,-10.0889,-19.9437, 180.83, 174.935, 5.84824,-0.0470479 - 1.88,-18.4383,-10.0486,-19.8539, 180.929, 175.081, 5.80103,-0.0467602 - 1.881,-18.4483,-9.97018,-19.7371, 181.026, 175.228, 5.75262,-0.0462771 - 1.882,-18.4582,-9.86615, -19.607, 181.123, 175.374, 5.70327,-0.0456855 - 1.883, -18.468, -9.7532,-19.4787, 181.219, 175.52, 5.65352,-0.0450911 - 1.884,-18.4777,-9.64938, -19.367, 181.314, 175.665, 5.60401,-0.0445961 - 1.885,-18.4873,-9.57132, -19.285, 181.407, 175.808, 5.55521,-0.044282 - 1.886,-18.4969,-9.53147, -19.242, 181.501, 175.949, 5.50731,-0.0441983 - 1.887,-18.5064,-9.53618, -19.243, 181.595, 176.09, 5.46023,-0.0443569 - 1.888,-18.5159,-9.58469,-19.2878, 181.689, 176.23, 5.41362,-0.0447308 - 1.889,-18.5256,-9.66921,-19.3712, 181.783, 176.371, 5.36695,-0.0452565 - 1.89,-18.5353, -9.7762,-19.4833, 181.879, 176.514, 5.31966,-0.0458431 - 1.891,-18.5451,-9.88853,-19.6112, 181.976, 176.659, 5.27136,-0.0463882 - 1.892,-18.5551,-9.98822,-19.7398, 182.074, 176.806, 5.222,-0.0467983 - 1.893,-18.5651,-10.0594,-19.8542, 182.173, 176.954, 5.17199,-0.0470092 - 1.894,-18.5752,-10.0905, -19.941, 182.272, 177.103, 5.12212,-0.0469985 - 1.895,-18.5853,-10.0768,-19.9903, 182.371, 177.251, 5.07319,-0.0467857 - 1.896,-18.5953,-10.0204,-19.9963, 182.469, 177.397, 5.02572,-0.0464203 - 1.897,-18.6053,-9.93036,-19.9584, 182.567, 177.541, 4.97955,-0.0459644 - 1.898,-18.6152,-9.82108,-19.8811, 182.663, 177.684, 4.93388,-0.0454784 - 1.899, -18.625,-9.71006,-19.7735, 182.758, 177.826, 4.88755,-0.0450156 - 1.9,-18.6346,-9.61505,-19.6481, 182.852, 177.968, 4.83961,-0.0446256 - 1.901,-18.6442,-9.55124,-19.5197, 182.946, 178.112, 4.78984,-0.04436 - 1.902,-18.6537,-9.52881,-19.4033, 183.04, 178.256, 4.73892,-0.0442719 - 1.903,-18.6632,-9.55133,-19.3124, 183.133, 178.401, 4.6882,-0.0444038 - 1.904,-18.6728,-9.61516,-19.2578, 183.228, 178.544, 4.63898,-0.0447664 - 1.905,-18.6825,-9.71006,-19.2456, 183.323, 178.686, 4.59192,-0.04532 - 1.906,-18.6922,-9.82083,-19.2772, 183.419, 178.827, 4.54657,-0.0459697 - 1.907,-18.7021,-9.92973, -19.349, 183.517, 178.969, 4.50161,-0.0465826 - 1.908,-18.7121,-10.0193,-19.4523, 183.615, 179.113, 4.45546,-0.0470233 - 1.909,-18.7222,-10.0753,-19.5752, 183.714, 179.26, 4.40708,-0.0471954 - 1.91,-18.7322,-10.0887, -19.703, 183.813, 179.409, 4.35657,-0.0470714 - 1.911,-18.7423,-10.0573,-19.8208, 183.911, 179.56, 4.30509,-0.0466974 - 1.912,-18.7524,-9.98627,-19.9148, 184.009, 179.709, 4.25432,-0.0461728 - 1.913,-18.7623,-9.88689,-19.9741, 184.106, 179.855, 4.20559,-0.045613 - 1.914,-18.7721,-9.77505,-19.9916, 184.202, 179.998, 4.15922,-0.0451147 - 1.915,-18.7819,-9.66863,-19.9655, 184.297, 180.138, 4.1143,-0.0447361 - 1.916,-18.7915,-9.58461,-19.8988, 184.391, 180.277, 4.06924,-0.0444994 - 1.917, -18.801,-9.53638,-19.7995, 184.485, 180.418, 4.02252,-0.0444073 - 1.918,-18.8105, -9.5316,-19.6792, 184.578, 180.56, 3.97348,-0.0444608 - 1.919,-18.8201,-9.57096,-19.5522, 184.672, 180.705, 3.92265,-0.0446653 - 1.92,-18.8297,-9.64809,-19.4335, 184.767, 180.85, 3.87142,-0.0450217 - 1.921,-18.8394,-9.75057,-19.3369, 184.862, 180.996, 3.82131,-0.0455077 - 1.922,-18.8492,-9.86192,-19.2739, 184.959, 181.14, 3.77325,-0.0460631 - 1.923,-18.8591,-9.96426,-19.2518, 185.057, 181.283, 3.7271,-0.0465916 - 1.924,-18.8691,-10.0411,-19.2731, 185.155, 181.427, 3.68181,-0.0469809 - 1.925,-18.8792,-10.0801,-19.3353, 185.254, 181.571, 3.63598,-0.0471364 - 1.926,-18.8893, -10.075,-19.4309, 185.353, 181.718, 3.58857,-0.0470126 - 1.927,-18.8993,-10.0264,-19.5487, 185.452, 181.866, 3.53938,-0.0466295 - 1.928,-18.9093,-9.94194,-19.6747, 185.549, 182.014, 3.48904,-0.0460668 - 1.929,-18.9192,-9.83508,-19.7939, 185.646, 182.161, 3.43866,-0.0454397 - 1.93, -18.929,-9.72273,-19.8924, 185.741, 182.307, 3.38927,-0.044867 - 1.931,-18.9387,-9.62264,-19.9585, 185.835, 182.45, 3.34132,-0.0444433 - 1.932,-18.9482,-9.55061,-19.9845, 185.929, 182.59, 3.29459,-0.0442244 - 1.933,-18.9578, -9.5179,-19.9672, 186.022, 182.73, 3.24837,-0.0442262 - 1.934,-18.9673,-9.52943, -19.909, 186.116, 182.87, 3.20181,-0.0444314 - 1.935,-18.9768,-9.58304,-19.8166, 186.21, 183.011, 3.15432,-0.0447994 - 1.936,-18.9864,-9.66978,-19.7012, 186.305, 183.154, 3.10576,-0.0452725 - 1.937,-18.9962,-9.77537,-19.5763, 186.401, 183.298, 3.0564,-0.0457816 - 1.938, -19.006,-9.88248,-19.4569, 186.498, 183.445, 3.00677,-0.0462516 - 1.939,-19.0159, -9.9735, -19.357, 186.595, 183.591, 2.95744,-0.0466106 - 1.94,-19.0259,-10.0333,-19.2885, 186.694, 183.738, 2.90883,-0.0468008 - 1.941, -19.036,-10.0519,-19.2595, 186.792, 183.885, 2.8611,-0.0467896 - 1.942, -19.046,-10.0255,-19.2733, 186.891, 184.03, 2.81414,-0.0465754 - 1.943, -19.056,-9.95764,-19.3282, 186.988, 184.175, 2.76753,-0.0461865 - 1.944, -19.066,-9.85847,-19.4177, 187.085, 184.319, 2.72073,-0.0456757 - 1.945,-19.0758,-9.74292, -19.531, 187.181, 184.462, 2.67317,-0.045111 - 1.946,-19.0854, -9.6285,-19.6547, 187.275, 184.606, 2.62453,-0.0445685 - 1.947, -19.095,-9.53239, -19.774, 187.369, 184.75, 2.57493,-0.0441253 - 1.948,-19.1045,-9.46875,-19.8748, 187.462, 184.893, 2.52492,-0.0438519 - 1.949, -19.114,-9.44638,-19.9451, 187.554, 185.035, 2.47535,-0.0438002 - 1.95,-19.1234,-9.46737,-19.9765, 187.647, 185.176, 2.42696,-0.0439888 - 1.951,-19.1329,-9.52669,-19.9655, 187.741, 185.316, 2.38003,-0.0443907 - 1.952,-19.1425,-9.61302,-19.9133, 187.835, 185.456, 2.33413,-0.0449287 - 1.953,-19.1521,-9.71056,-19.8263, 187.93, 185.596, 2.28828,-0.0454878 - 1.954,-19.1619,-9.80151,-19.7149, 188.026, 185.739, 2.24135,-0.0459412 - 1.955,-19.1717,-9.86892,-19.5924, 188.123, 185.884, 2.19267,-0.0461843 - 1.956,-19.1816,-9.89938,-19.4734, 188.22, 186.032, 2.14241,-0.0461633 - 1.957,-19.1915,-9.88516,-19.3721, 188.317, 186.18, 2.09157,-0.0458862 - 1.958,-19.2014,-9.82537,-19.3006, 188.414, 186.327, 2.04153,-0.045413 - 1.959,-19.2112,-9.72613,-19.2674, 188.509, 186.471, 1.99336,-0.0448292 - 1.96,-19.2208,-9.59955,-19.2763, 188.603, 186.612, 1.94721,-0.0442169 - 1.961,-19.2304,-9.46174,-19.3263, 188.696, 186.75, 1.90224,-0.0436352 - 1.962,-19.2398,-9.33022,-19.4113, 188.788, 186.888, 1.85694,-0.0431192 - 1.963, -19.249,-9.22109,-19.5211, 188.878, 187.025, 1.80992,-0.0426922 - 1.964,-19.2582,-9.14642,-19.6425, 188.968, 187.165, 1.76067,-0.04238 - 1.965,-19.2673,-9.11228,-19.7609, 189.057, 187.305, 1.70982,-0.0422154 - 1.966,-19.2764,-9.11775,-19.8623, 189.147, 187.445, 1.65886,-0.0422269 - 1.967,-19.2856,-9.15501,-19.9345, 189.236, 187.585, 1.6094,-0.0424154 - 1.968,-19.2947,-9.21059,-19.9689, 189.327, 187.722, 1.5623,-0.0427335 - 1.969, -19.304,-9.26744,-19.9615, 189.418, 187.857, 1.51727,-0.0430817 - 1.97,-19.3133,-9.30767,-19.9131, 189.509, 187.993, 1.47299,-0.0433271 - 1.971,-19.3226,-9.31532,-19.8297, 189.6, 188.129, 1.4278,-0.0433422 - 1.972,-19.3319,-9.27886,-19.7212, 189.691, 188.268, 1.38059,-0.0430454 - 1.973,-19.3412,-9.19304,-19.6009, 189.782, 188.408, 1.33134,-0.0424282 - 1.974,-19.3503,-9.05961,-19.4831, 189.87, 188.548, 1.28113,-0.0415551 - 1.975,-19.3593,-8.88701,-19.3819, 189.958, 188.685, 1.2316,-0.0405381 - 1.976,-19.3681,-8.68895,-19.3095, 190.043, 188.819, 1.18406,-0.0394983 - 1.977,-19.3767,-8.48217,-19.2746, 190.126, 188.949, 1.13891,-0.0385314 - 1.978, -19.385, -8.2837,-19.2812, 190.207, 189.074, 1.09544,-0.0376897 - 1.979,-19.3932,-8.10805,-19.3285, 190.287, 189.198, 1.05231,-0.0369859 - 1.98,-19.4012,-7.96484,-19.4108, 190.365, 189.32, 1.00821,-0.0364085 - 1.981,-19.4092,-7.85721,-19.5181, 190.442, 189.444,0.962577,-0.0359391 - 1.982, -19.417,-7.78124,-19.6375, 190.518, 189.567,0.915838,-0.0355579 - 1.983,-19.4247,-7.72652,-19.7545, 190.594, 189.69,0.869141,-0.0352389 - 1.984,-19.4324,-7.67774,-19.8551, 190.67, 189.811,0.823786,-0.0349378 - 1.985,-19.4401,-7.61707,-19.9273, 190.744, 189.929,0.780614,-0.0345855 - 1.986,-19.4476,-7.52698,-19.9622, 190.818, 190.044,0.739686,-0.0340938 - 1.987,-19.4551,-7.39293,-19.9559, 190.891, 190.157,0.700374,-0.0333742 - 1.988,-19.4624,-7.20564, -19.909, 190.961, 190.267,0.661768,-0.0323638 - 1.989,-19.4695,-6.96252,-19.8274, 191.03, 190.375,0.623173,-0.0310453 - 1.99,-19.4764,-6.66799,-19.7209, 191.095, 190.481,0.584435,-0.0294552 - 1.991,-19.4829,-6.33273,-19.6025, 191.157, 190.583,0.545989,-0.0276743 - 1.992, -19.489,-5.97188,-19.4863, 191.216, 190.681, 0.50864,-0.0258073 - 1.993,-19.4948,-5.60259,-19.3866, 191.271, 190.774,0.473228,-0.0239582 - 1.994,-19.5002,-5.24119,-19.3152, 191.322, 190.86,0.440353,-0.0222097 - 1.995,-19.5053,-4.90052,-19.2808, 191.37, 190.939,0.410241,-0.0206108 - 1.996, -19.51,-4.58789,-19.2874, 191.415, 191.013,0.382777,-0.0191723 - 1.997,-19.5145,-4.30379,-19.3343, 191.457, 191.082,0.357644,-0.0178678 - 1.998,-19.5186,-4.04184,-19.4156, 191.497, 191.146,0.334499,-0.0166396 - 1.999,-19.5226,-3.78978,-19.5215, 191.534, 191.206,0.313129,-0.0154069 - 2,-19.5262,-3.53137,-19.6392, 191.569, 191.261,0.293581,-0.0140795 + time, wext, epot, ekin, total + 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00 + 1.000000e-03, 1.924722e-02, 0.000000e+00, 4.811805e-03, -1.443541e-02 + 2.000000e-03, 7.544910e-02, 1.539778e-03, 4.104277e-02, -3.286655e-02 + 3.000000e-03, 1.641711e-01, 1.277399e-02, 1.026039e-01, -4.879315e-02 + 4.000000e-03, 2.786135e-01, 4.522315e-02, 1.726814e-01, -6.070893e-02 + 5.000000e-03, 4.104158e-01, 1.067830e-01, 2.359790e-01, -6.765376e-02 + 6.000000e-03, 5.506284e-01, 1.962976e-01, 2.848677e-01, -6.946319e-02 + 7.000000e-03, 6.907258e-01, 3.026027e-01, 3.213269e-01, -6.679618e-02 + 8.000000e-03, 8.235280e-01, 4.085476e-01, 3.540512e-01, -6.092923e-02 + 9.000000e-03, 9.439160e-01, 4.978886e-01, 3.926220e-01, -5.340544e-02 + 1.000000e-02, 1.049253e+00, 5.615394e-01, 4.420333e-01, -4.568068e-02 + 1.100000e-02, 1.139471e+00, 6.001689e-01, 5.004111e-01, -3.889055e-02 + 1.200000e-02, 1.216814e+00, 6.222053e-01, 5.608233e-01, -3.378522e-02 + 1.300000e-02, 1.285307e+00, 6.387420e-01, 6.157750e-01, -3.079051e-02 + 1.400000e-02, 1.350014e+00, 6.582947e-01, 6.616184e-01, -3.010097e-02 + 1.500000e-02, 1.416205e+00, 6.841084e-01, 7.003760e-01, -3.172026e-02 + 1.600000e-02, 1.488556e+00, 7.150033e-01, 7.381286e-01, -3.542428e-02 + 1.700000e-02, 1.570488e+00, 7.486463e-01, 7.811484e-01, -4.069348e-02 + 1.800000e-02, 1.663725e+00, 7.848509e-01, 8.321767e-01, -4.669719e-02 + 1.900000e-02, 1.768133e+00, 8.267258e-01, 8.890138e-01, -5.239372e-02 + 2.000000e-02, 1.881847e+00, 8.789917e-01, 9.461098e-01, -5.674575e-02 + 2.100000e-02, 2.001645e+00, 9.446119e-01, 9.980522e-01, -5.898042e-02 + 2.200000e-02, 2.123510e+00, 1.021932e+00, 1.042789e+00, -5.878926e-02 + 2.300000e-02, 2.243293e+00, 1.104220e+00, 1.082689e+00, -5.638445e-02 + 2.400000e-02, 2.357353e+00, 1.182038e+00, 1.122921e+00, -5.239410e-02 + 2.500000e-02, 2.463100e+00, 1.247222e+00, 1.168226e+00, -4.765154e-02 + 2.600000e-02, 2.559355e+00, 1.296283e+00, 1.220098e+00, -4.297453e-02 + 2.700000e-02, 2.646474e+00, 1.331444e+00, 1.276012e+00, -3.901774e-02 + 2.800000e-02, 2.726234e+00, 1.358899e+00, 1.331106e+00, -3.622904e-02 + 2.900000e-02, 2.801504e+00, 1.385433e+00, 1.381192e+00, -3.487894e-02 + 3.000000e-02, 2.875759e+00, 1.415405e+00, 1.425254e+00, -3.510011e-02 + 3.100000e-02, 2.952514e+00, 1.449677e+00, 1.465951e+00, -3.688626e-02 + 3.200000e-02, 3.034778e+00, 1.486848e+00, 1.507885e+00, -4.004507e-02 + 3.300000e-02, 3.124593e+00, 1.525682e+00, 1.554763e+00, -4.414798e-02 + 3.400000e-02, 3.222752e+00, 1.567030e+00, 1.607185e+00, -4.853750e-02 + 3.500000e-02, 3.328707e+00, 1.613902e+00, 1.662376e+00, -5.242873e-02 + 3.600000e-02, 3.440696e+00, 1.669638e+00, 1.715968e+00, -5.508969e-02 + 3.700000e-02, 3.556055e+00, 1.735334e+00, 1.764686e+00, -5.603565e-02 + 3.800000e-02, 3.671663e+00, 1.808207e+00, 1.808298e+00, -5.515709e-02 + 3.900000e-02, 3.784439e+00, 1.882035e+00, 1.849676e+00, -5.272824e-02 + 4.000000e-02, 3.891833e+00, 1.949566e+00, 1.892969e+00, -4.929854e-02 + 4.100000e-02, 3.992209e+00, 2.005627e+00, 1.941059e+00, -4.552221e-02 + 4.200000e-02, 4.085079e+00, 2.049233e+00, 1.993845e+00, -4.200110e-02 + 4.300000e-02, 4.171155e+00, 2.083581e+00, 2.048378e+00, -3.919586e-02 + 4.400000e-02, 4.252207e+00, 2.114075e+00, 2.100718e+00, -3.741365e-02 + 4.500000e-02, 4.330757e+00, 2.145571e+00, 2.148349e+00, -3.683681e-02 + 4.600000e-02, 4.409668e+00, 2.180453e+00, 2.191673e+00, -3.754236e-02 + 4.700000e-02, 4.491683e+00, 2.218500e+00, 2.233700e+00, -3.948263e-02 + 4.800000e-02, 4.578993e+00, 2.258392e+00, 2.278162e+00, -4.243784e-02 + 4.900000e-02, 4.672905e+00, 2.299687e+00, 2.327234e+00, -4.598492e-02 + 5.000000e-02, 4.773656e+00, 2.343889e+00, 2.380238e+00, -4.952919e-02 + 5.100000e-02, 4.880391e+00, 2.393852e+00, 2.434123e+00, -5.241609e-02 + 5.200000e-02, 4.991327e+00, 2.451873e+00, 2.485361e+00, -5.409363e-02 + 5.300000e-02, 5.104048e+00, 2.517682e+00, 2.532103e+00, -5.426309e-02 + 5.400000e-02, 5.215902e+00, 2.587675e+00, 2.575273e+00, -5.295449e-02 + 5.500000e-02, 5.324424e+00, 2.655976e+00, 2.617951e+00, -5.049671e-02 + 5.600000e-02, 5.427722e+00, 2.716861e+00, 2.663460e+00, -4.740164e-02 + 5.700000e-02, 5.524767e+00, 2.767211e+00, 2.713338e+00, -4.421819e-02 + 5.800000e-02, 5.615540e+00, 2.807687e+00, 2.766435e+00, -4.141752e-02 + 5.900000e-02, 5.701017e+00, 2.842012e+00, 2.819662e+00, -3.934282e-02 + 6.000000e-02, 5.782997e+00, 2.874878e+00, 2.869903e+00, -3.821586e-02 + 6.100000e-02, 5.863804e+00, 2.909729e+00, 2.915913e+00, -3.816187e-02 + 6.200000e-02, 5.945910e+00, 2.947649e+00, 2.959048e+00, -3.921337e-02 + 6.300000e-02, 6.031541e+00, 2.987868e+00, 3.002393e+00, -4.127997e-02 + 6.400000e-02, 6.122326e+00, 3.029366e+00, 3.048854e+00, -4.410625e-02 + 6.500000e-02, 6.219053e+00, 3.072399e+00, 3.099393e+00, -4.726090e-02 + 6.600000e-02, 6.321551e+00, 3.118890e+00, 3.152471e+00, -5.019079e-02 + 6.700000e-02, 6.428739e+00, 3.171376e+00, 3.205023e+00, -5.234038e-02 + 6.800000e-02, 6.538804e+00, 3.231154e+00, 3.254352e+00, -5.329761e-02 + 6.900000e-02, 6.649505e+00, 3.296829e+00, 3.299768e+00, -5.290698e-02 + 7.000000e-02, 6.758531e+00, 3.364253e+00, 3.342976e+00, -5.130238e-02 + 7.100000e-02, 6.863874e+00, 3.428021e+00, 3.387004e+00, -4.884867e-02 + 7.200000e-02, 6.964135e+00, 3.483775e+00, 3.434336e+00, -4.602356e-02 + 7.300000e-02, 7.058744e+00, 3.530045e+00, 3.485406e+00, -4.329419e-02 + 7.400000e-02, 7.148039e+00, 3.568642e+00, 3.538360e+00, -4.103614e-02 + 7.500000e-02, 7.233194e+00, 3.603462e+00, 3.590222e+00, -3.951078e-02 + 7.600000e-02, 7.316028e+00, 3.638427e+00, 3.638719e+00, -3.888137e-02 + 7.700000e-02, 7.398704e+00, 3.675808e+00, 3.683666e+00, -3.923058e-02 + 7.800000e-02, 7.483383e+00, 3.715787e+00, 3.727044e+00, -4.055097e-02 + 7.900000e-02, 7.571876e+00, 3.757398e+00, 3.771769e+00, -4.270937e-02 + 8.000000e-02, 7.665370e+00, 3.800060e+00, 3.819894e+00, -4.541484e-02 + 8.100000e-02, 7.764237e+00, 3.844634e+00, 3.871374e+00, -4.822880e-02 + 8.200000e-02, 7.867993e+00, 3.893242e+00, 3.924112e+00, -5.063825e-02 + 8.300000e-02, 7.975381e+00, 3.947930e+00, 3.975273e+00, -5.217807e-02 + 8.400000e-02, 8.084582e+00, 4.009009e+00, 4.023016e+00, -5.255764e-02 + 8.500000e-02, 8.193512e+00, 4.074162e+00, 4.067611e+00, -5.173878e-02 + 8.600000e-02, 8.300152e+00, 4.138970e+00, 4.111248e+00, -4.993296e-02 + 8.700000e-02, 8.402872e+00, 4.198673e+00, 4.156676e+00, -4.752308e-02 + 8.800000e-02, 8.500685e+00, 4.250219e+00, 4.205518e+00, -4.494907e-02 + 8.900000e-02, 8.593396e+00, 4.293497e+00, 4.257291e+00, -4.260745e-02 + 9.000000e-02, 8.681624e+00, 4.331094e+00, 4.309731e+00, -4.079866e-02 + 9.100000e-02, 8.766692e+00, 4.366781e+00, 4.360188e+00, -3.972347e-02 + 9.200000e-02, 8.850415e+00, 4.403659e+00, 4.407254e+00, -3.950187e-02 + 9.300000e-02, 8.934799e+00, 4.443008e+00, 4.451610e+00, -4.018076e-02 + 9.400000e-02, 9.021726e+00, 4.484427e+00, 4.495585e+00, -4.171383e-02 + 9.500000e-02, 9.112650e+00, 4.527010e+00, 4.541714e+00, -4.392571e-02 + 9.600000e-02, 9.208375e+00, 4.570691e+00, 4.591191e+00, -4.649370e-02 + 9.700000e-02, 9.308934e+00, 4.616805e+00, 4.643150e+00, -4.897872e-02 + 9.800000e-02, 9.413588e+00, 4.667457e+00, 4.695217e+00, -5.091327e-02 + 9.900000e-02, 9.520953e+00, 4.724055e+00, 4.744977e+00, -5.192103e-02 + 1.000000e-01, 9.629231e+00, 4.785960e+00, 4.791450e+00, -5.182094e-02 + 1.010000e-01, 9.736493e+00, 4.850148e+00, 4.835673e+00, -5.067197e-02 + 1.020000e-01, 9.840994e+00, 4.912200e+00, 4.880052e+00, -4.874114e-02 + 1.030000e-01, 9.941443e+00, 4.968158e+00, 4.926871e+00, -4.641354e-02 + 1.040000e-01, 1.003721e+01, 5.016221e+00, 4.976901e+00, -4.408719e-02 + 1.050000e-01, 1.012841e+01, 5.057374e+00, 5.028941e+00, -4.209564e-02 + 1.060000e-01, 1.021589e+01, 5.094642e+00, 5.080574e+00, -4.067867e-02 + 1.070000e-01, 1.030109e+01, 5.131446e+00, 5.129654e+00, -3.999074e-02 + 1.080000e-01, 1.038578e+01, 5.170044e+00, 5.175617e+00, -4.011736e-02 + 1.090000e-01, 1.047180e+01, 5.210922e+00, 5.219809e+00, -4.107221e-02 + 1.100000e-01, 1.056078e+01, 5.253361e+00, 5.264649e+00, -4.276975e-02 + 1.110000e-01, 1.065384e+01, 5.296709e+00, 5.312135e+00, -4.499416e-02 + 1.120000e-01, 1.075145e+01, 5.341421e+00, 5.362631e+00, -4.739742e-02 + 1.130000e-01, 1.085335e+01, 5.389147e+00, 5.414654e+00, -4.954964e-02 + 1.140000e-01, 1.095860e+01, 5.441765e+00, 5.465802e+00, -5.103651e-02 + 1.150000e-01, 1.106574e+01, 5.499941e+00, 5.514230e+00, -5.157042e-02 + 1.160000e-01, 1.117301e+01, 5.562169e+00, 5.559771e+00, -5.106959e-02 + 1.170000e-01, 1.127865e+01, 5.624950e+00, 5.604027e+00, -4.967191e-02 + 1.180000e-01, 1.138118e+01, 5.684123e+00, 5.649372e+00, -4.768056e-02 + 1.190000e-01, 1.147961e+01, 5.736648e+00, 5.697494e+00, -4.546955e-02 + 1.200000e-01, 1.157364e+01, 5.781883e+00, 5.748366e+00, -4.339216e-02 + 1.210000e-01, 1.166365e+01, 5.821646e+00, 5.800281e+00, -4.172580e-02 + 1.220000e-01, 1.175067e+01, 5.859105e+00, 5.850906e+00, -4.066105e-02 + 1.230000e-01, 1.183619e+01, 5.897159e+00, 5.898718e+00, -4.031593e-02 + 1.240000e-01, 1.192194e+01, 5.937262e+00, 5.943927e+00, -4.074610e-02 + 1.250000e-01, 1.200957e+01, 5.979304e+00, 5.988335e+00, -4.193206e-02 + 1.260000e-01, 1.210045e+01, 6.022488e+00, 6.034218e+00, -4.374866e-02 + 1.270000e-01, 1.219542e+01, 6.066540e+00, 6.082933e+00, -4.594296e-02 + 1.280000e-01, 1.229462e+01, 6.112381e+00, 6.134091e+00, -4.815033e-02 + 1.290000e-01, 1.239757e+01, 6.161797e+00, 6.185814e+00, -4.996112e-02 + 1.300000e-01, 1.250316e+01, 6.216250e+00, 6.235890e+00, -5.102196e-02 + 1.310000e-01, 1.260988e+01, 6.275615e+00, 6.283133e+00, -5.113320e-02 + 1.320000e-01, 1.271605e+01, 6.337648e+00, 6.328101e+00, -5.030151e-02 + 1.330000e-01, 1.282009e+01, 6.398625e+00, 6.372739e+00, -4.872635e-02 + 1.340000e-01, 1.292077e+01, 6.454861e+00, 6.419180e+00, -4.672983e-02 + 1.350000e-01, 1.301741e+01, 6.504308e+00, 6.468437e+00, -4.466441e-02 + 1.360000e-01, 1.310997e+01, 6.547342e+00, 6.519792e+00, -4.283774e-02 + 1.370000e-01, 1.319907e+01, 6.586347e+00, 6.571248e+00, -4.147793e-02 + 1.380000e-01, 1.328588e+01, 6.624381e+00, 6.620760e+00, -4.073562e-02 + 1.390000e-01, 1.337190e+01, 6.663715e+00, 6.667490e+00, -4.069893e-02 + 1.400000e-01, 1.345879e+01, 6.705086e+00, 6.712307e+00, -4.139541e-02 + 1.410000e-01, 1.354801e+01, 6.747997e+00, 6.757246e+00, -4.277127e-02 + 1.420000e-01, 1.364068e+01, 6.791770e+00, 6.804253e+00, -4.466204e-02 + 1.430000e-01, 1.373734e+01, 6.836567e+00, 6.853993e+00, -4.678304e-02 + 1.440000e-01, 1.383789e+01, 6.883676e+00, 6.905454e+00, -4.876336e-02 + 1.450000e-01, 1.394162e+01, 6.934820e+00, 6.956577e+00, -5.022499e-02 + 1.460000e-01, 1.404731e+01, 6.990905e+00, 7.005525e+00, -5.088203e-02 + 1.470000e-01, 1.415344e+01, 7.051017e+00, 7.051804e+00, -5.062015e-02 + 1.480000e-01, 1.425843e+01, 7.112348e+00, 7.096558e+00, -4.952254e-02 + 1.490000e-01, 1.436089e+01, 7.171194e+00, 7.141859e+00, -4.783344e-02 + 1.500000e-01, 1.445984e+01, 7.224534e+00, 7.189427e+00, -4.587902e-02 + 1.510000e-01, 1.455488e+01, 7.271311e+00, 7.239584e+00, -4.398256e-02 + 1.520000e-01, 1.464622e+01, 7.312746e+00, 7.291064e+00, -4.240718e-02 + 1.530000e-01, 1.473466e+01, 7.351526e+00, 7.341800e+00, -4.133848e-02 + 1.540000e-01, 1.482148e+01, 7.390392e+00, 7.390193e+00, -4.089453e-02 + 1.550000e-01, 1.490818e+01, 7.430951e+00, 7.436090e+00, -4.113741e-02 + 1.560000e-01, 1.499628e+01, 7.473347e+00, 7.480867e+00, -4.206627e-02 + 1.570000e-01, 1.508708e+01, 7.516906e+00, 7.526578e+00, -4.359163e-02 + 1.580000e-01, 1.518141e+01, 7.561212e+00, 7.574691e+00, -4.551149e-02 + 1.590000e-01, 1.527958e+01, 7.606867e+00, 7.625194e+00, -4.751673e-02 + 1.600000e-01, 1.538123e+01, 7.655381e+00, 7.676611e+00, -4.924161e-02 + 1.610000e-01, 1.548550e+01, 7.708229e+00, 7.726916e+00, -5.035053e-02 + 1.620000e-01, 1.559107e+01, 7.765661e+00, 7.774776e+00, -5.062954e-02 + 1.630000e-01, 1.569645e+01, 7.826041e+00, 7.820364e+00, -5.004463e-02 + 1.640000e-01, 1.580019e+01, 7.886200e+00, 7.865245e+00, -4.874245e-02 + 1.650000e-01, 1.590109e+01, 7.942690e+00, 7.911405e+00, -4.699614e-02 + 1.660000e-01, 1.599843e+01, 7.993275e+00, 7.960036e+00, -4.512352e-02 + 1.670000e-01, 1.609206e+01, 8.037839e+00, 8.010809e+00, -4.341392e-02 + 1.680000e-01, 1.618241e+01, 8.078239e+00, 8.062085e+00, -4.208869e-02 + 1.690000e-01, 1.627044e+01, 8.117221e+00, 8.111926e+00, -4.129744e-02 + 1.700000e-01, 1.635748e+01, 8.157064e+00, 8.159285e+00, -4.113111e-02 + 1.710000e-01, 1.644499e+01, 8.198724e+00, 8.204642e+00, -4.162733e-02 + 1.720000e-01, 1.653437e+01, 8.241918e+00, 8.249700e+00, -4.275539e-02 + 1.730000e-01, 1.662670e+01, 8.285980e+00, 8.296335e+00, -4.438932e-02 + 1.740000e-01, 1.672259e+01, 8.330851e+00, 8.345448e+00, -4.629310e-02 + 1.750000e-01, 1.682207e+01, 8.377515e+00, 8.396413e+00, -4.814226e-02 + 1.760000e-01, 1.692460e+01, 8.427537e+00, 8.447477e+00, -4.958815e-02 + 1.770000e-01, 1.702917e+01, 8.481986e+00, 8.496833e+00, -5.034693e-02 + 1.780000e-01, 1.713442e+01, 8.540409e+00, 8.543733e+00, -5.027843e-02 + 1.790000e-01, 1.723892e+01, 8.600565e+00, 8.588937e+00, -4.942161e-02 + 1.800000e-01, 1.734136e+01, 8.659147e+00, 8.634240e+00, -4.797275e-02 + 1.810000e-01, 1.744075e+01, 8.713165e+00, 8.681366e+00, -4.621929e-02 + 1.820000e-01, 1.753661e+01, 8.761236e+00, 8.730913e+00, -4.446102e-02 + 1.830000e-01, 1.762902e+01, 8.804074e+00, 8.781992e+00, -4.295118e-02 + 1.840000e-01, 1.771860e+01, 8.843949e+00, 8.832780e+00, -4.187331e-02 + 1.850000e-01, 1.780644e+01, 8.883452e+00, 8.881643e+00, -4.134683e-02 + 1.860000e-01, 1.789389e+01, 8.924312e+00, 8.928135e+00, -4.143908e-02 + 1.870000e-01, 1.798234e+01, 8.966911e+00, 8.973265e+00, -4.216308e-02 + 1.880000e-01, 1.807304e+01, 9.010711e+00, 9.018871e+00, -4.345642e-02 + 1.890000e-01, 1.816686e+01, 9.055209e+00, 9.066490e+00, -4.515690e-02 + 1.900000e-01, 1.826416e+01, 9.100743e+00, 9.116418e+00, -4.700003e-02 + 1.910000e-01, 1.836476e+01, 9.148575e+00, 9.167532e+00, -4.865647e-02 + 1.920000e-01, 1.846795e+01, 9.200154e+00, 9.217992e+00, -4.980621e-02 + 1.930000e-01, 1.857260e+01, 9.256012e+00, 9.266364e+00, -5.022446e-02 + 1.940000e-01, 1.867736e+01, 9.315012e+00, 9.312505e+00, -4.984383e-02 + 1.950000e-01, 1.878087e+01, 9.374466e+00, 9.357637e+00, -4.876681e-02 + 1.960000e-01, 1.888197e+01, 9.431154e+00, 9.403596e+00, -4.722524e-02 + 1.970000e-01, 1.897991e+01, 9.482701e+00, 9.451700e+00, -4.550804e-02 + 1.980000e-01, 1.907442e+01, 9.528582e+00, 9.501948e+00, -4.389005e-02 + 1.990000e-01, 1.916580e+01, 9.570188e+00, 9.553022e+00, -4.258852e-02 + 2.000000e-01, 1.925484e+01, 9.609975e+00, 9.603108e+00, -4.175376e-02 diff --git a/test/test_model/test_model_solver/test_model_solver_dynamic_implicit.verified b/test/test_model/test_model_solver/test_model_solver_dynamic_implicit.verified index daa6188c9..7ea63512a 100644 --- a/test/test_model/test_model_solver/test_model_solver_dynamic_implicit.verified +++ b/test/test_model/test_model_solver/test_model_solver_dynamic_implicit.verified @@ -1,2002 +1,202 @@ - time, disp, velo, reac, wext, epot, ekin, total - 0, 0, 0, -0, 0, 0, 0, 0 - 0.001,-0.00160554,-3.21108,4.63166e-124,0.0315007,0.000421884,0.00745328,-0.0236255 - 0.002,-0.00768365,-8.94514,-3.6274e-122,0.119252,0.00923947,0.0582619,-0.0517511 - 0.003,-0.0185743,-12.8361,1.34272e-120,0.245175,0.0500032,0.124335,-0.0708363 - 0.004,-0.0321491,-14.3135,-3.11136e-119, 0.38559,0.133399,0.174109,-0.0780829 - 0.005,-0.0460795,-13.5474,5.0335e-118, 0.51849,0.234717,0.209449,-0.0743251 - 0.006,-0.0585263, -11.346,-5.99258e-117,0.629795,0.314663,0.251605,-0.0635275 - 0.007,-0.0686193,-8.84008,5.37549e-116,0.716516,0.357329,0.307951,-0.0512358 - 0.008,-0.0765765,-7.07424,-3.63579e-115,0.785914,0.378845,0.364495,-0.0425743 - 0.009,-0.0834428,-6.65839,1.79972e-114,0.851233, 0.40172,0.408979,-0.0405345 - 0.01,-0.0905724,-7.60083,-5.86967e-114,0.925797,0.432547,0.448093,-0.0451572 - 0.011,-0.0990598,-9.37405,7.11294e-114, 1.01776,0.468325,0.495577,-0.0538549 - 0.012,-0.109333,-11.1731,4.0046e-113, 1.12737, 0.51311,0.551576,-0.0626794 - 0.013,-0.121048,-12.2569,-2.41002e-112, 1.24761,0.575866,0.603745,-0.0679954 - 0.014,-0.133295,-12.2362,3.99743e-112, 1.36764,0.653347,0.646402,-0.0678938 - 0.015,-0.145014,-11.2016,1.24726e-111, 1.47753,0.726379,0.688333,-0.062819 - 0.016,-0.155441,-9.65182,-7.09978e-111, 1.57222,0.778231,0.738766,-0.0552173 - 0.017,-0.164398,-8.26361,4.7108e-111, 1.65328,0.811156,0.793717,-0.0484082 - 0.018,-0.172332,-7.60461,5.27675e-110, 1.72788,0.839967, 0.84274,-0.0451758 - 0.019,-0.180089,-7.90767,-1.29433e-109, 1.80546,0.873971,0.884823,-0.0466623 - 0.02,-0.18854,-8.99423,-2.35216e-109, 1.89369,0.912349,0.929349,-0.0519919 - 0.021,-0.198222, -10.37,1.30016e-108, 1.99542,0.955119,0.981561,-0.0587402 - 0.022,-0.209129,-11.4454,3.86934e-109, 2.1077, 1.00872, 1.03496,-0.0640147 - 0.023,-0.220744,-11.7838,-9.79393e-108, 2.2233, 1.07604, 1.08158,-0.0656749 - 0.024,-0.232274,-11.2763,4.37506e-108, 2.33392, 1.14676, 1.12397,-0.0631855 - 0.025,-0.242998,-10.1718,6.46089e-107, 2.43371, 1.20504, 1.1709,-0.057768 - 0.026,-0.252563,-8.95862,-5.79402e-107, 2.52159, 1.2458, 1.22397,-0.0518172 - 0.027,-0.261118,-8.15093,-4.01703e-106, 2.60155, 1.27819, 1.2755,-0.0478555 - 0.028,-0.26923,-8.07318,4.50952e-106, 2.68075, 1.31285, 1.32042,-0.0474741 - 0.029,-0.277633,-8.73153,2.44714e-105, 2.7664, 1.35192, 1.36378,-0.0507033 - 0.03,-0.28691,-9.82286,-2.74261e-105, 2.86277, 1.39391, 1.4128,-0.0560563 - 0.031,-0.297258,-10.8726,-1.47916e-104, 2.96943, 1.44229, 1.46593,-0.0612051 - 0.032,-0.308413,-11.4394,1.33837e-104, 3.08165, 1.50218, 1.51548,-0.0639853 - 0.033,-0.319783,-11.2995,8.79512e-104, 3.19249, 1.56979, 1.55941,-0.0632994 - 0.034, -0.3307,-10.5338,-4.59906e-104, 3.29583, 1.63209, 1.6042,-0.0595435 - 0.035,-0.340709,-9.48422,-5.03226e-103, 3.38887, 1.67962, 1.65485,-0.0543952 - 0.036,-0.349752,-8.60241,1.37042e-104, 3.47326, 1.71582, 1.70737,-0.05007 - 0.037,-0.358181,-8.25632,2.68965e-102, 3.55426, 1.75083, 1.75506,-0.0483724 - 0.038,-0.366598,-8.57758,1.51455e-102, 3.6384, 1.78976, 1.7987,-0.0499482 - 0.039,-0.375593,-9.41252,-1.29199e-101, 3.73074, 1.83153, 1.84517,-0.0540436 - 0.04,-0.385497,-10.3946,-1.67395e-101, 3.83271, 1.87697, 1.89688,-0.0588605 - 0.041,-0.396246,-11.1043,5.2315e-101, 3.94164, 1.93103, 1.94827,-0.0623419 - 0.042,-0.407423,-11.2481,1.24553e-100, 4.05199, 1.99454, 1.9944,-0.0630472 - 0.043,-0.418436,-10.7786,-1.50696e-100, 4.15773, 2.05858, 2.0384,-0.0607444 - 0.044,-0.42878,-9.90922,-7.3403e-100, 4.25493, 2.1119, 2.08655,-0.0564799 - 0.045,-0.438243,-9.01742,3.78046e-101, 4.3434, 2.15258, 2.13871,-0.0521056 - 0.046,-0.446993,-8.48169,3.48984e-99, 4.4266, 2.18846, 2.18867,-0.0494779 - 0.047,-0.455494,-8.52131,3.32365e-99, 4.5102, 2.22684, 2.23368,-0.0496722 - 0.048,-0.464308,-9.10711,-1.25884e-98, 4.59954, 2.26842, 2.27857,-0.0525456 - 0.049,-0.473852,-9.97915,-2.86088e-98, 4.69743, 2.31239, 2.32822,-0.0568229 - 0.05,-0.484222,-10.7616,2.49741e-98, 4.803, 2.36212, 2.38022,-0.0606608 - 0.051,-0.495165,-11.1243,1.55653e-97, 4.91213, 2.42106, 2.42863,-0.0624398 - 0.052,-0.506188,-10.9216,7.16369e-98, 5.01927, 2.48474, 2.47309,-0.0614457 - 0.053,-0.516774,-10.2506,-5.92819e-97, 5.11983, 2.54247, 2.51921,-0.0581543 - 0.054,-0.526602,-9.40501,-1.03429e-96, 5.21209, 2.58809, 2.57,-0.0540067 - 0.055,-0.535678,-8.74716,1.24183e-96, 5.2979, 2.62581, 2.62131,-0.05078 - 0.056,-0.544328,-8.55297,5.96421e-96, 5.38181, 2.66369, 2.6683,-0.0498275 - 0.057,-0.553053,-8.89658,2.54062e-96, 5.46908, 2.70482, 2.71275,-0.0515129 - 0.058,-0.562312,-9.62248,-2.14463e-95, 5.56348, 2.74813, 2.76028,-0.0550734 - 0.059,-0.572331,-10.4156,-3.93491e-95, 5.66566, 2.79497, 2.81172,-0.0589638 - 0.06,-0.583008,-10.9378,3.38442e-95, 5.77296, 2.84946, 2.86197,-0.0615251 - 0.061,-0.593963,-10.9717,2.06568e-94, 5.88059, 2.9111, 2.9078,-0.0616911 - 0.062,-0.604704,-10.5109,1.5513e-94, 5.9837, 2.9715, 2.95277,-0.059431 - 0.063,-0.614839,-9.75937,-6.02342e-94, 6.07944, 3.02203, 3.00166,-0.0557449 - 0.064,-0.624239,-9.04132,-1.48669e-93, 6.16814, 3.06267, 3.05325,-0.0522229 - 0.065,-0.633091,-8.66153,1.84984e-94, 6.25311, 3.10053, 3.10221,-0.05036 - 0.066,-0.64181,-8.77627,6.07104e-93, 6.3392, 3.14097, 3.14731,-0.0509228 - 0.067,-0.650862,-9.32919,8.40388e-93, 6.43072, 3.18389, 3.19319,-0.0536348 - 0.068,-0.660566,-10.0785,-1.05626e-92, 6.52959, 3.22904, 3.24324,-0.0573102 - 0.069,-0.670957,-10.7025,-4.82761e-92, 6.63458, 3.27975, 3.29446,-0.060371 - 0.07,-0.681777,-10.9376,-3.48409e-92, 6.74188, 3.33823, 3.34212,-0.0615239 - 0.071,-0.69259,-10.6892,1.27106e-91, 6.84674, 3.39947, 3.38697,-0.0603059 - 0.072,-0.70297,-10.0701,3.3112e-91, 6.94553, 3.45425, 3.43401,-0.0572689 - 0.073,-0.712679,-9.34876,5.60841e-92, 7.03724, 3.49865, 3.48486,-0.0537308 - 0.074,-0.721771,-8.83373,-1.13138e-90, 7.1239, 3.53739, 3.53531,-0.0512046 - 0.075,-0.730558, -8.7414,-2.0407e-90, 7.20965, 3.57708, 3.58182,-0.0507517 - 0.076,-0.739481,-9.10542,7.85047e-91, 7.29898, 3.61955, 3.62689,-0.0525373 - 0.077,-0.748917,-9.76475,8.6823e-90, 7.39477, 3.66382, 3.67517,-0.0557713 - 0.078,-0.759016,-10.4348,1.15871e-89, 7.49713, 3.7117, 3.72637,-0.0590579 - 0.079,-0.769649,-10.8301,-1.16887e-89, 7.60338, 3.76661, 3.77577,-0.0609968 - 0.08,-0.780457,-10.7858,-6.08899e-89, 7.70919, 3.82697, 3.82144,-0.0607796 - 0.081,-0.791013,-10.3263,-6.18627e-89, 7.81049, 3.88481, 3.86715,-0.0585259 - 0.082,-0.801002,-9.65253,1.0858e-88, 7.90518, 3.93339, 3.91657,-0.0552208 - 0.083,-0.810356,-9.05402,4.0269e-88, 7.994, 3.97405, 3.96766,-0.0522851 - 0.084,-0.819275,-8.78487,3.17809e-88, 8.08018, 4.01332, 4.01589,-0.050965 - 0.085,-0.828145, -8.9558,-8.40766e-88, 8.16803, 4.05512, 4.06112,-0.0518034 - 0.086,-0.837368,-9.48877,-2.56208e-87, 8.26112, 4.09892, 4.10778,-0.0544176 - 0.087,-0.847188,-10.1525,-1.62284e-87, 8.36071, 4.14497, 4.15808,-0.057673 - 0.088,-0.857596,-10.6626,5.8573e-87, 8.46531, 4.19649, 4.20865,-0.060175 - 0.089,-0.868329,-10.8034,1.58934e-86, 8.5713, 4.25467, 4.25576,-0.060866 - 0.09,-0.87899,-10.5192,8.61031e-87, 8.67449, 4.31404, 4.30098,-0.0594721 - 0.091,-0.889218,-9.93585,-3.78662e-86, 8.77196, 4.36661, 4.34874,-0.0566105 - 0.092,-0.898838, -9.3052,-9.69294e-86, 8.86324, 4.41017, 4.39956,-0.0535172 - 0.093,-0.907939,-8.89663,-4.96045e-86, 8.95052, 4.44972, 4.44929,-0.0515132 - 0.094,-0.916828, -8.8819,2.30243e-85, 9.03765, 4.49072, 4.49549,-0.0514409 - 0.095,-0.925901,-9.26307,5.83404e-85, 9.12852, 4.5341, 4.54112,-0.0533105 - 0.096,-0.935469,-9.87346,3.15268e-85, 9.22538, 4.5791, 4.58997,-0.0563045 - 0.097,-0.945631,-10.4504,-1.32154e-84, 9.3279, 4.62787, 4.6409,-0.0591345 - 0.098,-0.95623,-10.7483,-3.4646e-84, 9.43334, 4.68315, 4.6896,-0.0605957 - 0.099,-0.966926, -10.643,-2.15642e-84, 9.53775, 4.74246, 4.73521,-0.0600791 - 0.1,-0.977339,-10.1835,7.12871e-84, 9.63765, 4.79824, 4.78158,-0.057825 - 0.101,-0.987216,-9.56921,2.02251e-83, 9.73152, 4.84535, 4.83136,-0.0548122 - 0.102,-0.996532,-9.06376,1.51933e-83, 9.82044, 4.88612, 4.88199,-0.0523329 - 0.103, -1.0055,-8.88158,-3.56281e-83, 9.90757, 4.9265, 4.92963,-0.0514393 - 0.104,-1.01449,-9.09722,-1.15301e-82, 9.99681, 4.96927, 4.97504,-0.052497 - 0.105,-1.02385,-9.61486,-1.06218e-82, 10.0911, 5.01373, 5.02237,-0.0550361 - 0.106,-1.03376,-10.2108,1.5972e-82, 10.1913, 5.06054, 5.0728,-0.0579593 - 0.107,-1.04418,-10.6302,6.36183e-82, 10.2956, 5.11279, 5.12278,-0.0600161 - 0.108,-1.05485,-10.6957,7.19553e-82, 10.4005, 5.17069, 5.16947,-0.0603374 - 0.109,-1.06539,-10.3827,-5.91215e-82, 10.5024, 5.22847, 5.21508,-0.0588021 - 0.11,-1.07549,-9.82818,-3.35773e-81, 10.5988, 5.27925, 5.26344,-0.0560824 - 0.111,-1.08504,-9.27098,-4.65849e-81, 10.6897, 5.32222, 5.31415,-0.0533493 - 0.112,-1.09415,-8.94881,1.27343e-81, 10.7775, 5.36249, 5.36325,-0.0517691 - 0.113,-1.10312,-8.99703,1.66822e-80, 10.8658, 5.40451, 5.40925,-0.0520056 - 0.114,-1.11232,-9.39175,2.85655e-80, 10.9579, 5.44855, 5.45541,-0.0539417 - 0.115,-1.12199,-9.96151,5.16655e-81, 11.0556, 5.49418, 5.50471,-0.0567364 - 0.116,-1.13221,-10.4617,-7.60896e-80, 11.1583, 5.54374, 5.55532,-0.0591896 - 0.117,-1.14278,-10.6794,-1.64596e-79, 11.263, 5.59933, 5.60343,-0.0602574 - 0.118,-1.15338,-10.5242,-9.53052e-80, 11.3663, 5.65769, 5.64908,-0.0594962 - 0.119,-1.16367,-10.0654,3.03688e-79, 11.465, 5.71171, 5.69605,-0.0572462 - 0.12,-1.17346,-9.50155,8.82604e-79, 11.5582, 5.75765, 5.74608,-0.0544803 - 0.121,-1.18274,-9.07402,8.45059e-79, 11.6472, 5.79861, 5.79623,-0.0523832 - 0.122,-1.19176,-8.96418,-9.3237e-79, 11.7352, 5.83992, 5.8434,-0.0518445 - 0.123,-1.20085,-9.21632,-4.33913e-78, 11.8256, 5.88344, 5.88906,-0.0530812 - 0.124,-1.21032,-9.71984,-5.89976e-78, 11.9209, 5.92841, 5.93697,-0.055551 - 0.125,-1.22031,-10.2578,9.22181e-79, 12.0216, 5.97594, 5.98743,-0.0581897 - 0.126,-1.23074,-10.6003,1.90356e-77, 12.1256, 6.02883, 6.03685,-0.0598695 - 0.127,-1.24134,-10.6026,3.54316e-77, 12.2296, 6.08643, 6.08325,-0.0598811 - 0.128,-1.25178,-10.2666,1.59614e-77, 12.3303, 6.14277, 6.12928,-0.0582327 - 0.129,-1.26178,-9.73819,-7.0172e-77, 12.4258, 6.19205, 6.17812,-0.055641 - 0.13,-1.27127,-9.24456,-1.87197e-76, 12.5165, 6.23463, 6.22865,-0.0532198 - 0.131,-1.28039,-8.99617,-1.76361e-76, 12.6048, 6.27557, 6.27718,-0.0520014 - 0.132,-1.28944,-9.09717,1.78754e-76, 12.694, 6.3184, 6.32309,-0.0524968 - 0.133,-1.29874,-9.50179,8.6437e-76, 12.7872, 6.36295, 6.36977,-0.0544814 - 0.134, -1.3085, -10.035,1.2447e-75, 12.8856, 6.40915, 6.41941,-0.0570967 - 0.135,-1.31876,-10.4681,7.97835e-77, 12.9883, 6.45946, 6.46966,-0.0592213 - 0.136, -1.3293, -10.617,-3.35221e-75, 13.0925, 6.51527, 6.51728,-0.0599516 - 0.137,-1.33982,-10.4202,-7.05442e-75, 13.1947, 6.5727, 6.56304,-0.0589861 - 0.138,-1.35001,-9.96419,-4.98646e-75, 13.2925, 6.62516, 6.61055,-0.0567495 - 0.139,-1.35971,-9.44566,9.55045e-75, 13.3851, 6.67019, 6.66073,-0.0542061 - 0.14,-1.36898,-9.08647,3.34611e-74, 13.4743, 6.71141, 6.71041,-0.0524443 - 0.141,-1.37804,-9.03885,4.20176e-74, 13.5629, 6.75351, 6.75721,-0.0522107 - 0.142,-1.38722,-9.32093,-6.57437e-75, 13.6544, 6.79762, 6.80316,-0.0535943 - 0.143,-1.39679,-9.80992,-1.29744e-73, 13.7506, 6.84304, 6.85158,-0.0559928 - 0.144,-1.40684,-10.2955,-2.48944e-73, 13.8516, 6.89125, 6.90198,-0.0583747 - 0.145,-1.41727,-10.5704,-1.56268e-73, 13.9553, 6.9447, 6.95088,-0.0597228 - 0.146,-1.42782,-10.5185,3.60298e-73, 14.0585, 7.00193, 6.99709,-0.0594686 - 0.147,-1.43816,-10.1644,1.1721e-72, 14.1582, 7.05693, 7.04354,-0.0577316 - 0.148,-1.44807, -9.6613,1.44269e-72, 14.253, 7.10494, 7.09278,-0.0552639 - 0.149,-1.45752,-9.22511,-1.99374e-73, 14.3435, 7.14729, 7.14307,-0.0531243 - 0.15,-1.46665, -9.0417,-4.32776e-72, 14.4322, 7.18886, 7.1911,-0.0522247 - 0.151,-1.47576,-9.18772,-8.44961e-72, 14.5223, 7.23236, 7.23701,-0.0529409 - 0.152,-1.48516,-9.59861,-5.89235e-72, 14.6165, 7.27733, 7.28419,-0.0549563 - 0.153,-1.49501,-10.0971,1.04743e-71, 14.7155, 7.32407, 7.33405,-0.0574014 - 0.154,-1.50529,-10.4697,3.76499e-71, 14.8182, 7.37508, 7.38393,-0.059229 - 0.155, -1.5158, -10.558,5.05193e-71, 14.9218, 7.43102, 7.43113,-0.0596622 - 0.156,-1.52624,-10.3262,4.9895e-72, 15.0231, 7.48751, 7.47707,-0.0585252 - 0.157,-1.53635,-9.87533,-1.24133e-70, 15.12, 7.53858, 7.52509,-0.0563137 - 0.158,-1.54598,-9.39942,-2.73127e-70, 15.2122, 7.5829, 7.57531,-0.0539793 - 0.159,-1.55523,-9.10194,-2.43408e-70, 15.3015, 7.62444, 7.62452,-0.0525202 - 0.16,-1.56434,-9.10886,2.11394e-70, 15.3908, 7.66723, 7.67105,-0.0525541 - 0.161, -1.5736,-9.41532,1.08576e-69, 15.4832, 7.7118, 7.71735,-0.0540573 - 0.162,-1.58325, -9.8885,1.72622e-69, 15.5802, 7.75764, 7.76619,-0.0563783 - 0.163,-1.59336,-10.3252,7.83048e-70, 15.6815, 7.80652, 7.81646,-0.0585204 - 0.164,-1.60379,-10.5391,-2.86931e-69, 15.7849, 7.86046, 7.86486,-0.0595696 - 0.165,-1.61428,-10.4402,-8.09323e-69, 15.8873, 7.91724, 7.91098,-0.0590841 - 0.166,-1.62454,-10.0725,-9.60204e-69, 15.9861, 7.97097, 7.95787,-0.0572808 - 0.167,-1.63437,-9.59491,7.53522e-70, 16.0802, 8.0179, 8.00741,-0.0549382 - 0.168,-1.64377,-9.21208,2.64859e-68, 16.1706, 8.06015, 8.05741,-0.0530604 - 0.169,-1.65292,-9.08704,5.40838e-68, 16.2598, 8.10232, 8.105,-0.0524471 - 0.17, -1.6621,-9.27169,4.6174e-68, 16.3507, 8.14637, 8.151,-0.0533528 - 0.171,-1.67158,-9.68529,-4.13774e-68, 16.4457, 8.1917, 8.19865,-0.0553815 - 0.172, -1.6815,-10.1498,-2.06347e-67, 16.5453, 8.23898, 8.24866,-0.0576598 - 0.173,-1.69181,-10.4664,-3.31972e-67, 16.648, 8.29064, 8.29812,-0.0592126 - 0.174,-1.70229,-10.5006,-1.77673e-67, 16.751, 8.34661, 8.34499,-0.0593806 - 0.175,-1.71266,-10.2395,4.69048e-67, 16.8514, 8.40214, 8.39119,-0.0580999 - 0.176,-1.72268,-9.79634,1.45013e-66, 16.9475, 8.45196, 8.43965,-0.0559262 - 0.177,-1.73226,-9.36153,1.89659e-66, 17.0394, 8.49574, 8.48983,-0.0537935 - 0.178, -1.7415,-9.12085,3.67202e-67, 17.1288, 8.53765, 8.53858,-0.052613 - 0.179,-1.75065,-9.17607,-4.01158e-66, 17.2189, 8.58104, 8.58494,-0.0528838 - 0.18,-1.75999,-9.50192,-9.48648e-66, 17.3121, 8.62599, 8.6316,-0.0544821 - 0.181,-1.76972,-9.95764,-1.01606e-65, 17.4098, 8.67225, 8.6808,-0.0567174 - 0.182,-1.77987,-10.3477,2.11283e-66, 17.5113, 8.72178, 8.73086,-0.0586308 - 0.183, -1.7903,-10.5058,2.99801e-65, 17.6143, 8.77611, 8.77882,-0.0594064 - 0.184,-1.80073,-10.3657,5.88666e-65, 17.716, 8.83238, 8.82493,-0.0587188 - 0.185,-1.81091,-9.98874,5.12347e-65, 17.814, 8.88488, 8.87226,-0.0568699 - 0.186,-1.82067,-9.53745,-3.6802e-65, 17.9076, 8.93091, 8.92201,-0.0546563 - 0.187,-1.83004,-9.20508,-2.06201e-64, 17.9979, 8.97318, 8.97167,-0.0530261 - 0.188,-1.83921,-9.13307,-3.51101e-64, 18.0875, 9.01591, 9.01889,-0.0526729 - 0.189,-1.84845, -9.3508,-2.4346e-64, 18.1792, 9.06041, 9.06505,-0.0537408 - 0.19,-1.85801,-9.76367,3.43998e-64, 18.275, 9.10607, 9.11315,-0.055766 - 0.191,-1.86799,-10.1942,1.33918e-63, 18.375, 9.15391, 9.16321,-0.0578776 - 0.192,-1.87832,-10.4582,2.03385e-63, 18.4776, 9.20616, 9.21225,-0.0591726 - 0.193,-1.88877,-10.4438,1.08979e-63, 18.58, 9.26206, 9.25888,-0.0591018 - 0.194,-1.89907,-10.1585,-2.63467e-63, 18.6797, 9.31662, 9.30537,-0.0577024 - 0.195,-1.90901,-9.72567,-8.33848e-63, 18.7751, 9.3653, 9.35422,-0.0555796 - 0.196,-1.91854,-9.33115,-1.15447e-62, 18.8666, 9.40871, 9.40429,-0.0536445 - 0.197,-1.92778,-9.14336,-4.59661e-63, 18.9563, 9.45102, 9.4526,-0.0527233 - 0.198,-1.93697,-9.24151,1.81289e-62, 19.047, 9.49493, 9.49886,-0.0532048 - 0.199,-1.94638, -9.5822,5.02769e-62, 19.141, 9.5402, 9.54592,-0.0548759 - 0.2,-1.95618,-10.0186,6.47133e-62, 19.2393, 9.58687, 9.59539,-0.0570163 - 0.201,-1.96637,-10.3636,1.84087e-62, 19.3409, 9.63705, 9.64519,-0.0587086 - 0.202,-1.97679,-10.4702,-1.16182e-61, 19.4437, 9.69167, 9.69276,-0.0592316 - 0.203,-1.98717, -10.294,-2.95567e-61, 19.5446, 9.74734, 9.73894,-0.0583675 - 0.204,-1.99727, -9.9118,-3.6061e-61, 19.6419, 9.79868, 9.7867,-0.0564925 - 0.205,-2.00697, -9.4879,-7.23805e-62, 19.735, 9.84396, 9.83658,-0.0544133 - 0.206,-2.01632,-9.20378,7.05738e-61, 19.8252, 9.88635, 9.88587,-0.0530197 - 0.207,-2.02551,-9.18023,1.70199e-60, 19.9153, 9.9296, 9.93279,-0.0529042 - 0.208,-2.03482,-9.42606,2.00794e-60, 20.0078, 9.97448, 9.97918,-0.05411 - 0.209,-2.04445,-9.83487,3.06901e-61, 20.1043, 10.0205, 10.0277,-0.0561152 - 0.21,-2.05448,-10.2311,-4.10056e-60, 20.2046, 10.0689, 10.0777,-0.0580586 - 0.211,-2.06482,-10.4454,-9.62759e-60, 20.3071, 10.1217, 10.1263,-0.0591097 - 0.212,-2.07523, -10.387,-1.1208e-59, 20.409, 10.1774, 10.1728,-0.0588232 - 0.213,-2.08547,-10.0821,-1.62034e-60, 20.5079, 10.2309, 10.2196,-0.0573281 - 0.214,-2.09534,-9.66238,2.28875e-59, 20.6027, 10.2786, 10.2688,-0.0552691 - 0.215,-2.10482, -9.3077,5.35689e-59, 20.694, 10.3218, 10.3187,-0.0535294 - 0.216,-2.11406,-9.16945,6.2772e-59, 20.7839, 10.3645, 10.3666,-0.0528513 - 0.217, -2.1233,-9.30574,1.10376e-59, 20.8752, 10.4089, 10.4128,-0.0535198 - 0.218,-2.13278,-9.65703,-1.22812e-58, 20.97, 10.4544, 10.4603,-0.0552429 - 0.219,-2.14265,-10.0721,-2.93166e-58, 21.0688, 10.5015, 10.51,-0.0572789 - 0.22,-2.15287,-10.3732,-3.52277e-58, 21.1705, 10.5523, 10.5595,-0.0587558 - 0.221,-2.16327,-10.4321,-8.54475e-59, 21.2729, 10.6071, 10.6067,-0.0590447 - 0.222, -2.1736,-10.2247,6.31937e-58, 21.3732, 10.6621, 10.653,-0.0580274 - 0.223,-2.18363, -9.8409,1.57591e-57, 21.4697, 10.7124, 10.7012,-0.0561448 - 0.224,-2.19328, -9.4456,1.97455e-57, 21.5624, 10.7571, 10.7511,-0.0542058 - 0.225, -2.2026,-9.20789,6.67073e-58, 21.6527, 10.7997, 10.8,-0.0530399 - 0.226,-2.21182,-9.22872,-3.09804e-57, 21.7432, 10.8434, 10.8467,-0.053142 - 0.227,-2.22119,-9.49804,-8.29914e-57, 21.8364, 10.8886, 10.8934,-0.0544631 - 0.228,-2.23088,-9.89959,-1.10032e-56, 21.9335, 10.9349, 10.9422,-0.0564326 - 0.229,-2.24096,-10.2611,-4.99463e-57, 22.0342, 10.9839, 10.9921,-0.0582056 - 0.23,-2.25131,-10.4281,1.42885e-56, 22.1365, 11.0371, 11.0404,-0.0590248 - 0.231,-2.26169, -10.33,4.2651e-56, 22.2378, 11.0925, 11.0867,-0.0585438 - 0.232,-2.27186, -10.01,6.06346e-56, 22.336, 11.1451, 11.1339,-0.0569742 - 0.233,-2.28167,-9.60584,3.54131e-56, 22.4303, 11.1919, 11.1834,-0.0549918 - 0.234,-2.29111,-9.29072,-6.04723e-56, 22.5214, 11.235, 11.233,-0.0534462 - 0.235,-2.30036,-9.19904,-2.12751e-55, 22.6116, 11.2781, 11.2805,-0.0529965 - 0.236,-2.30964,-9.36904,-3.28546e-55, 22.7036, 11.3229, 11.3269,-0.0538303 - 0.237,-2.31919,-9.72691,-2.37711e-55, 22.799, 11.3687, 11.3747,-0.0555857 - 0.238,-2.32911,-10.1188,2.219e-55, 22.8982, 11.4162, 11.4245,-0.0575079 - 0.239,-2.33936, -10.377,1.02235e-54, 23, 11.4676, 11.4737,-0.0587743 - 0.24,-2.34975,-10.3916,1.74012e-54, 23.102, 11.5225, 11.5206,-0.0588459 - 0.241,-2.36002,-10.1574,1.51449e-54, 23.2016, 11.5768, 11.5672,-0.0576971 - 0.242,-2.36999,-9.77558,-5.86863e-55, 23.2975, 11.626, 11.6157,-0.0558244 - 0.243,-2.37958,-9.41007,-4.68126e-54, 23.3898, 11.6702, 11.6656,-0.0540316 - 0.244,-2.38889,-9.21712,-8.95277e-54, 23.4803, 11.7131, 11.7141,-0.0530851 - 0.245,-2.39814,-9.27854,-9.17922e-54, 23.5713, 11.7572, 11.7607,-0.0533864 - 0.246,-2.40756,-9.56702,-1.69257e-55, 23.6651, 11.8027, 11.8076,-0.0548014 - 0.247,-2.41733,-9.95826,2.00706e-53, 23.7628, 11.8493, 11.8568,-0.0567204 - 0.248,-2.42745,-10.2845,4.44293e-53, 23.8637, 11.8989, 11.9065,-0.0583206 - 0.249,-2.43779,-10.4065,5.29828e-53, 23.9658, 11.9525, 11.9544,-0.0589189 - 0.25,-2.44813,-10.2728,1.78661e-53, 24.0666, 12.0076, 12.0007,-0.0582633 - 0.251,-2.45824,-9.94175,-7.80075e-53, 24.1641, 12.0592, 12.0483,-0.0566394 - 0.252,-2.46799,-9.55564,-2.10828e-52, 24.2578, 12.1052, 12.0979,-0.0547456 - 0.253,-2.47741,-9.27987,-2.91119e-52, 24.3489, 12.1482, 12.1473,-0.0533929 - 0.254,-2.48666,-9.23194,-1.75368e-52, 24.4394, 12.1918, 12.1945,-0.0531578 - 0.255,-2.49599,-9.43146,2.54766e-52, 24.532, 12.2369, 12.241,-0.0541365 - 0.256,-2.50561,-9.79212,9.45092e-52, 24.628, 12.2829, 12.2892,-0.0559055 - 0.257,-2.51558, -10.159,1.51937e-51, 24.7277, 12.331, 12.339,-0.0577052 - 0.258,-2.52585,-10.3752,1.27234e-51, 24.8295, 12.3829, 12.3878,-0.0587655 - 0.259,-2.53621,-10.3488,-5.22379e-52, 24.931, 12.4378, 12.4346,-0.0586359 - 0.26,-2.54643, -10.092,-3.92563e-51, 25.03, 12.4913, 12.4813,-0.0573763 - 0.261,-2.55634,-9.71556,-7.49836e-51, 25.1253, 12.5396, 12.5302,-0.05553 - 0.262,-2.56588,-9.38098,-7.95866e-51, 25.2173, 12.5835, 12.58,-0.0538889 - 0.263,-2.57519, -9.2312,-1.22594e-51, 25.3079, 12.6266, 12.6282,-0.0531542 - 0.264,-2.58447,-9.32958,1.45643e-50, 25.3994, 12.6711, 12.6746,-0.0536368 - 0.265,-2.59395, -9.6331,3.47164e-50, 25.4939, 12.7168, 12.7219,-0.0551255 - 0.266,-2.60377,-10.0112,4.49376e-50, 25.5921, 12.7638, 12.7713,-0.0569799 - 0.267,-2.61393,-10.3017,2.39871e-50, 25.6932, 12.814, 12.8208,-0.0584052 - 0.268,-2.62427,-10.3809,-4.40645e-50, 25.795, 12.8679, 12.8683,-0.0587933 - 0.269,-2.63457,-10.2155,-1.48695e-49, 25.8952, 12.9225, 12.9148,-0.0579822 - 0.27,-2.64462,-9.87728,-2.32821e-49, 25.9921, 12.9731, 12.9627,-0.0563232 - 0.271,-2.65431,-9.51153,-1.93741e-49, 26.0854, 13.0185, 13.0124,-0.0545292 - 0.272, -2.6637,-9.27481,7.2153e-50, 26.1764, 13.0616, 13.0615,-0.0533681 - 0.273,-2.67297,-9.26792,5.73652e-49, 26.2673, 13.1056, 13.1084,-0.0533343 - 0.274,-2.68236,-9.49295,1.11004e-48, 26.3605, 13.1509, 13.1551,-0.0544381 - 0.275,-2.69203, -9.8528,1.22243e-48, 26.4571, 13.1972, 13.2037,-0.0562031 - 0.276,-2.70205, -10.193,3.29208e-49, 26.5571, 13.2458, 13.2535,-0.057872 - 0.277,-2.71233,-10.3682,-1.8754e-48, 26.6588, 13.2982, 13.3019,-0.058731 - 0.278,-2.72267,-10.3039,-4.83431e-48, 26.7599, 13.353, 13.3485,-0.0584157 - 0.279,-2.73283,-10.0285,-6.6805e-48, 26.8583, 13.4056, 13.3956,-0.0570651 - 0.28,-2.74268,-9.66069,-4.48937e-48, 26.9531, 13.4531, 13.4447,-0.0552608 - 0.281,-2.75219,-9.35803,4.23283e-48, 27.0449, 13.4967, 13.4944,-0.0537763 - 0.282,-2.76149,-9.24982,1.88203e-47, 27.1356, 13.5402, 13.5422,-0.0532455 - 0.283,-2.77081,-9.38164,3.25837e-47, 27.2276, 13.5851, 13.5886,-0.0538921 - 0.284,-2.78035,-9.69627,3.22303e-47, 27.3228, 13.631, 13.6363,-0.0554354 - 0.285,-2.79022,-10.0584,2.55876e-48, 27.4214, 13.6784, 13.6858,-0.0572118 - 0.286,-2.80041,-10.3131,-6.20613e-47, 27.5226, 13.7291, 13.7351,-0.0584607 - 0.287,-2.81074,-10.3516,-1.42304e-46, 27.6242, 13.7832, 13.7823,-0.0586495 - 0.288, -2.821,-10.1582,-1.84004e-46, 27.7238, 13.8372, 13.8289,-0.0577012 - 0.289,-2.83098,-9.81658,-1.0837e-46, 27.8201, 13.8869, 13.8772,-0.0560255 - 0.29,-2.84063, -9.4733,1.45217e-46, 27.913, 13.9318, 13.9269,-0.0543417 - 0.291, -2.85,-9.27527,5.46573e-46, 28.004, 13.9751, 13.9756,-0.0533703 - 0.292,-2.85929,-9.30669,9.03879e-46, 28.0953, 14.0194, 14.0224,-0.0535245 - 0.293,-2.86872,-9.55335,8.58112e-46, 28.189, 14.065, 14.0693,-0.0547344 - 0.294,-2.87846,-9.90898,1.64746e-47, 28.2863, 14.1116, 14.1182,-0.0564787 - 0.295,-2.88852, -10.221,-1.74387e-45, 28.3865, 14.1607, 14.1679,-0.0580094 - 0.296,-2.89881,-10.3562,-3.88403e-45, 28.4881, 14.2135, 14.216,-0.0586723 - 0.297,-2.90912,-10.2572,-4.96718e-45, 28.5887, 14.268, 14.2625,-0.0581866 - 0.298,-2.91923,-9.96718,-2.94217e-45, 28.6865, 14.3198, 14.3099,-0.0567642 - 0.299,-2.92902, -9.6109,3.75248e-45, 28.7808, 14.3665, 14.3593,-0.0550166 - 0.3,-2.93849, -9.341,1.43481e-44, 28.8724, 14.4101, 14.4087,-0.0536928 - 0.301, -2.9478,-9.27267,2.39613e-44, 28.9634, 14.4539, 14.4562,-0.0533576 - 0.302,-2.95715,-9.43448,2.34279e-44, 29.0559, 14.4991, 14.5027,-0.0541513 - 0.303,-2.96675,-9.75642,2.56357e-45, 29.1517, 14.5452, 14.5507,-0.0557304 - 0.304,-2.97668,-10.1002,-4.23519e-44, 29.2507, 14.593, 14.6003,-0.0574168 - 0.305,-2.98689,-10.3187,-9.87784e-44, 29.352, 14.6442, 14.6493,-0.0584885 - 0.306,-2.99721,-10.3188,-1.31588e-43, 29.4532, 14.6984, 14.6963,-0.058489 - 0.307,-3.00742,-10.1012,-8.89928e-44, 29.5523, 14.7518, 14.7431,-0.0574216 - 0.308,-3.01735, -9.7597,7.16911e-44, 29.648, 14.8006, 14.7917,-0.0557465 - 0.309,-3.02695,-9.44082,3.39511e-43, 29.7406, 14.8451, 14.8413,-0.0541824 - 0.31,-3.03631,-9.28094,6.04118e-43, 29.8317, 14.8886, 14.8897,-0.0533982 - 0.311,-3.04562,-9.34795,6.44983e-43, 29.9234, 14.9333, 14.9364,-0.0537269 - 0.312, -3.0551,-9.61246,1.99617e-43, 30.0177, 14.9791, 14.9836,-0.0550243 - 0.313,-3.06489,-9.96064,-8.65228e-43, 30.1154, 15.026, 15.0327,-0.0567321 - 0.314,-3.07499,-10.2433,-2.31482e-42, 30.2159, 15.0756, 15.0822,-0.0581183 - 0.315,-3.08528,-10.3396,-3.36544e-42, 30.3173, 15.1288, 15.13,-0.0585908 - 0.316,-3.09556, -10.209,-2.76434e-42, 30.4175, 15.183, 15.1765,-0.0579503 - 0.317,-3.10561,-9.90808,6.73739e-43, 30.5147, 15.2339, 15.2243,-0.0564743 - 0.318,-3.11535,-9.56615,7.04974e-42, 30.6085, 15.28, 15.2738,-0.0547972 - 0.319, -3.1248,-9.32965,1.42179e-41, 30.7, 15.3235, 15.3229,-0.0536371 - 0.32,-3.13411,-9.29943,1.72582e-41, 30.7913, 15.3676, 15.3701,-0.0534888 - 0.321,-3.14351,-9.48778,9.62593e-42, 30.8843, 15.4131, 15.4168,-0.0544127 - 0.322,-3.15316,-9.81343,-1.32809e-41, 30.9806, 15.4595, 15.4652,-0.05601 - 0.323,-3.16313,-10.1366,-4.85761e-41, 31.0801, 15.5077, 15.5148,-0.0575952 - 0.324,-3.17336, -10.319,-8.07785e-41, 31.1813, 15.5594, 15.5634,-0.0584899 - 0.325,-3.18366, -10.283,-8.15645e-41, 31.2822, 15.6136, 15.6103,-0.0583135 - 0.326,-3.19383,-10.0448,-1.92973e-41, 31.3807, 15.6663, 15.6573,-0.0571447 - 0.327, -3.2037,-9.70675,1.1959e-40, 31.4759, 15.7143, 15.7061,-0.0554868 - 0.328,-3.21326,-9.41395,3.02456e-40, 31.5683, 15.7585, 15.7557,-0.0540506 - 0.329,-3.22261,-9.29153,4.3076e-40, 31.6594, 15.8022, 15.8038,-0.0534501 - 0.33,-3.23196,-9.39135,3.52116e-40, 31.7516, 15.8472, 15.8504,-0.0539397 - 0.331,-3.24149,-9.67002,-7.47056e-41, 31.8464, 15.8932, 15.8979,-0.0553066 - 0.332,-3.25133,-10.0077,-8.60827e-40, 31.9446, 15.9404, 15.9472,-0.0569632 - 0.333,-3.26146,-10.2598,-1.75355e-39, 32.0452, 15.9905, 15.9965,-0.0581997 - 0.334,-3.27175,-10.3187,-2.17542e-39, 32.1465, 16.044, 16.044,-0.0584882 - 0.335,-3.28199,-10.1596,-1.35145e-39, 32.2461, 16.0978, 16.0906,-0.0577082 - 0.336,-3.29199,-9.85147,1.29332e-39, 32.3428, 16.1479, 16.1387,-0.0561966 - 0.337,-3.30168,-9.52646,5.50973e-39, 32.4362, 16.1934, 16.1882,-0.0546025 - 0.338,-3.31111,-9.32376,9.62858e-39, 32.5277, 16.237, 16.2371,-0.0536082 - 0.339,-3.32043,-9.32974,1.04655e-38, 32.6192, 16.2815, 16.2841,-0.0536375 - 0.34,-3.32987,-9.54123,4.26712e-39, 32.7128, 16.3272, 16.331,-0.0546749 - 0.341,-3.33957,-9.86712,-1.103e-38, 32.8096, 16.3737, 16.3796,-0.0562734 - 0.342,-3.34959,-10.1676,-3.26777e-38, 32.9094, 16.4224, 16.4292,-0.0577473 - 0.343,-3.35983,-10.3142,-5.06357e-38, 33.0105, 16.4746, 16.4775,-0.0584662 - 0.344,-3.37011,-10.2446,-4.8154e-38, 33.111, 16.5287, 16.5243,-0.0581247 - 0.345,-3.38023,-9.98916,-7.83036e-39, 33.209, 16.5806, 16.5715,-0.056872 - 0.346,-3.39005,-9.65784,7.62356e-38, 33.3038, 16.6279, 16.6206,-0.0552469 - 0.347,-3.39958,-9.39259,1.83445e-37, 33.3959, 16.6719, 16.6701,-0.0539458 - 0.348,-3.40893,-9.30674,2.57159e-37, 33.4872, 16.7159, 16.7178,-0.0535247 - 0.349, -3.4183,-9.43652,2.12545e-37, 33.5798, 16.7612, 16.7644,-0.0541613 - 0.35,-3.42788,-9.72576,-2.7962e-38, 33.6752, 16.8074, 16.8123,-0.05558 - 0.351,-3.43777,-10.0502,-4.71962e-37, 33.7738, 16.8549, 16.8617,-0.0571715 - 0.352,-3.44793, -10.271,-9.87442e-37, 33.8746, 16.9056, 16.9107,-0.0582542 - 0.353,-3.45821,-10.2938,-1.2698e-36, 33.9755, 16.9592, 16.958,-0.0583662 - 0.354,-3.46841,-10.1095,-9.02293e-37, 34.0747, 17.0125, 17.0048,-0.0574623 - 0.355,-3.47837,-9.79756,4.4868e-37, 34.1708, 17.0618, 17.0531,-0.0559322 - 0.356,-3.48801,-9.49182,2.72084e-36, 34.2639, 17.1068, 17.1027,-0.0544325 - 0.357,-3.49742,-9.32311,5.1416e-36, 34.3554, 17.1505, 17.1512,-0.053605 - 0.358,-3.50676,-9.36325,6.13252e-36, 34.4473, 17.1953, 17.1981,-0.0538019 - 0.359,-3.51624,-9.59448,3.6957e-36, 34.5414, 17.2412, 17.2452,-0.0549361 - 0.36, -3.526, -9.9173,-3.5593e-36, 34.6387, 17.288, 17.2941,-0.0565195 - 0.361,-3.53605,-10.1933,-1.48965e-35, 34.7387, 17.3372, 17.3436,-0.0578733 - 0.362, -3.5463,-10.3045,-2.60657e-35, 34.8397, 17.3897, 17.3916,-0.0584187 - 0.363,-3.55655,-10.2037,-2.91273e-35, 34.9398, 17.4436, 17.4383,-0.0579245 - 0.364,-3.56662,-9.93474,-1.46817e-35, 35.0373, 17.4948, 17.4859,-0.0566051 - 0.365, -3.5764, -9.6131,2.29191e-35, 35.1316, 17.5414, 17.5351,-0.0550274 - 0.366,-3.58589,-9.37661,7.83509e-35, 35.2236, 17.5854, 17.5844,-0.0538674 - 0.367,-3.59524,-9.32625,1.29291e-34, 35.3151, 17.6296, 17.6318,-0.0536204 - 0.368,-3.60465,-9.48307,1.36757e-34, 35.4081, 17.6752, 17.6785,-0.0543896 - 0.369,-3.61428,-9.77939,5.71348e-35, 35.504, 17.7216, 17.7267,-0.0558431 - 0.37,-3.62421, -10.088,-1.32133e-34, 35.603, 17.7695, 17.7762,-0.0573569 - 0.371, -3.6344,-10.2768,-3.98797e-34, 35.7038, 17.8206, 17.8249,-0.0582829 - 0.372,-3.64467,-10.2653,-6.29861e-34, 35.8045, 17.8743, 17.872,-0.0582264 - 0.373,-3.65483, -10.059,-6.37723e-34, 35.9032, 17.9271, 17.9189,-0.0572143 - 0.374,-3.66473,-9.74661,-2.21881e-34, 35.9988, 17.9756, 17.9676,-0.0556823 - 0.375,-3.67434,-9.46223,7.07482e-34, 36.0916, 18.0203, 18.0171,-0.0542874 - 0.376,-3.68373,-9.32746,1.97374e-33, 36.1832, 18.0642, 18.0654,-0.0536264 - 0.377,-3.69309,-9.39958,3.02233e-33, 36.2754, 18.1093, 18.1121,-0.0539801 - 0.378,-3.70262,-9.64717,2.9655e-33, 36.37, 18.1553, 18.1595,-0.0551945 - 0.379,-3.71242, -9.9638,8.86394e-34, 36.4677, 18.2024, 18.2086,-0.0567476 - 0.38,-3.72251,-10.2138,-3.57861e-33, 36.5679, 18.252, 18.2579,-0.0579737 - 0.381,-3.73276,-10.2903,-9.52801e-33, 36.6689, 18.3049, 18.3056,-0.0583489 - 0.382,-3.74299, -10.161,-1.43128e-32, 36.7686, 18.3585, 18.3523,-0.0577148 - 0.383,-3.75301,-9.88183,-1.37926e-32, 36.8655, 18.409, 18.4002,-0.0563455 - 0.384,-3.76274,-9.57266,-3.78446e-33, 36.9594, 18.455, 18.4496,-0.054829 - 0.385,-3.77221,-9.36588,1.72439e-32, 37.0513, 18.4989, 18.4986,-0.0538148 - 0.386,-3.78157,-9.34973,4.49443e-32, 37.143, 18.5435, 18.5458,-0.0537356 - 0.387,-3.79101,-9.53063,6.69706e-32, 37.2365, 18.5892, 18.5927,-0.0546229 - 0.388,-3.80069,-9.83064,6.42665e-32, 37.3329, 18.6358, 18.6411,-0.0560944 - 0.389,-3.81066, -10.121,1.77523e-32, 37.4322, 18.6841, 18.6906,-0.0575189 - 0.39,-3.82086,-10.2776,-7.94217e-32, 37.5331, 18.7357, 18.7391,-0.0582866 - 0.391,-3.83112,-10.2336,-2.07312e-31, 37.6335, 18.7894, 18.786,-0.0580708 - 0.392,-3.84124,-10.0084,-3.09715e-31, 37.7316, 18.8415, 18.8332,-0.0569662 - 0.393,-3.85109,-9.69884,-3.00014e-31, 37.8268, 18.8893, 18.8821,-0.055448 - 0.394,-3.86066,-9.43768,-9.1159e-32, 37.9194, 18.9337, 18.9315,-0.054167 - 0.395,-3.87005,-9.33655,3.49489e-31, 38.011, 18.9779, 18.9794,-0.053671 - 0.396,-3.87943,-9.43833,9.34851e-31, 38.1035, 19.0232, 19.0262,-0.0541702 - 0.397, -3.889,-9.69894,1.41498e-30, 38.1987, 19.0694, 19.0738,-0.0554485 - 0.398,-3.89886,-10.0064,1.40115e-30, 38.2969, 19.1168, 19.1231,-0.0569567 - 0.399,-3.90897,-10.2291,4.96419e-31, 38.3972, 19.1669, 19.1722,-0.0580487 - 0.4,-3.91922,-10.2718,-1.46292e-30, 38.498, 19.2201, 19.2197,-0.0582582 - 0.401,-3.92942,-10.1167,-4.11621e-30, 38.5972, 19.2733, 19.2664,-0.0574976 - 0.402,-3.93939,-9.83075,-6.37855e-30, 38.6937, 19.3229, 19.3146,-0.056095 - 0.403,-3.94908,-9.53662,-6.52892e-30, 38.7872, 19.3685, 19.3641,-0.0546523 - 0.404,-3.95852,-9.36024,-2.76189e-30, 38.879, 19.4125, 19.4128,-0.0537871 - 0.405,-3.96789,-9.37682,5.76761e-30, 38.971, 19.4573, 19.4598,-0.0538684 - 0.406,-3.97737,-9.57877,1.76562e-29, 39.065, 19.5033, 19.5069,-0.0548591 - 0.407, -3.9871,-9.87921,2.83168e-29, 39.1619, 19.55, 19.5555,-0.0563327 - 0.408,-3.99711,-10.1493,3.02449e-29, 39.2615, 19.5988, 19.605,-0.0576574 - 0.409,-4.00732,-10.2735,1.52739e-29, 39.3622, 19.6508, 19.6532,-0.0582665 - 0.41,-4.01756, -10.199,-2.0989e-29, 39.4623, 19.7044, 19.7,-0.057901 - 0.411,-4.02764,-9.95813,-7.35183e-29, 39.56, 19.7558, 19.7474,-0.0567198 - 0.412,-4.03745,-9.65449,-1.23481e-28, 39.6547, 19.8029, 19.7965,-0.0552304 - 0.413,-4.04698,-9.41815,-1.38723e-28, 39.7471, 19.8472, 19.8458,-0.0540712 - 0.414,-4.05637,-9.35012,-8.26367e-29, 39.8388, 19.8916, 19.8935,-0.0537375 - 0.415,-4.06578,-9.47911,6.73985e-29, 39.9318, 19.9372, 19.9402,-0.0543702 - 0.416, -4.0754,-9.74943,2.95585e-28, 40.0274, 19.9836, 19.9882,-0.0556961 - 0.417,-4.08529, -10.045,5.27215e-28, 40.126, 20.0313, 20.0375,-0.057146 - 0.418,-4.09543,-10.2393,6.27306e-28, 40.2264, 20.0819, 20.0864,-0.058099 - 0.419,-4.10568,-10.2494,4.33872e-28, 40.327, 20.1352, 20.1337,-0.0581483 - 0.42,-4.11584,-10.0713,-1.67256e-28, 40.4258, 20.1879, 20.1806,-0.0572749 - 0.421,-4.12577,-9.78182,-1.13834e-27, 40.5217, 20.2368, 20.229,-0.055855 - 0.422,-4.13541,-9.50508,-2.19518e-27, 40.615, 20.282, 20.2785,-0.0544976 - 0.423,-4.14484,-9.35953,-2.78462e-27, 40.7068, 20.3261, 20.3269,-0.0537837 - 0.424,-4.15422,-9.40715,-2.20204e-27, 40.7991, 20.3712, 20.3738,-0.0540173 - 0.425,-4.16374,-9.62711,1.13786e-28, 40.8935, 20.4173, 20.4211,-0.0550961 - 0.426,-4.17352,-9.92484,4.14563e-27, 40.9909, 20.4643, 20.47,-0.0565565 - 0.427,-4.18357,-10.1727,8.86893e-27, 41.0907, 20.5136, 20.5194,-0.0577723 - 0.428,-4.19379,-10.2647,1.20813e-26, 41.1914, 20.5659, 20.5673,-0.0582237 - 0.429, -4.204,-10.1619,1.07822e-26, 41.2911, 20.6193, 20.6141,-0.0577192 - 0.43,-4.21403,-9.90863,2.29513e-27, 41.3883, 20.67, 20.6618,-0.056477 - 0.431, -4.2238,-9.61375,-1.39553e-26, 41.4826, 20.7166, 20.711,-0.0550306 - 0.432, -4.2333,-9.40357,-3.45419e-26, 41.5748, 20.7608, 20.7601,-0.0539997 - 0.433,-4.24269,-9.36785,-5.09966e-26, 41.6667, 20.8054, 20.8075,-0.0538245 - 0.434,-4.25213, -9.5215,-5.08651e-26, 41.7601, 20.8512, 20.8544,-0.0545781 - 0.435,-4.26179,-9.79829,-2.17996e-26, 41.8563, 20.8978, 20.9026,-0.0559358 - 0.436,-4.27173,-10.0795,4.13872e-26, 41.9551, 20.9458, 20.952,-0.0573149 - 0.437, -4.2819,-10.2446,1.28507e-25, 42.0556, 20.9969, 21.0006,-0.0581251 - 0.438,-4.29213,-10.2234,2.0838e-25, 42.1559, 21.0502, 21.0477,-0.0580208 - 0.439,-4.30225,-10.0252,2.30868e-25, 42.2543, 21.1024, 21.0948,-0.0570487 - 0.44,-4.31213,-9.73535,1.4098e-25, 42.3498, 21.1507, 21.1435,-0.0556271 - 0.441,-4.32174,-9.47812,-9.40478e-26, 42.4428, 21.1955, 21.1929,-0.0543653 - 0.442,-4.33116,-9.36355,-4.50318e-25, 42.5346, 21.2398, 21.241,-0.0538034 - 0.443,-4.34056,-9.44036,-8.19285e-25, 42.6272, 21.2852, 21.2879,-0.0541801 - 0.444,-4.35012,-9.67524,-1.00629e-24, 42.7221, 21.3314, 21.3354,-0.0553322 - 0.445,-4.35994,-9.96728,-7.75463e-25, 42.8199, 21.3787, 21.3845,-0.0567647 - 0.446,-4.37002,-10.1913,5.03845e-26, 42.9199, 21.4284, 21.4337,-0.0578636 - 0.447,-4.38024,-10.2516,1.45043e-24, 43.0205, 21.481, 21.4813,-0.0581594 - 0.448,-4.39043,-10.1227,3.075e-24, 43.1198, 21.5341, 21.5281,-0.0575272 - 0.449,-4.40042,-9.86025,4.2005e-24, 43.2165, 21.5841, 21.5761,-0.0562397 - 0.45,-4.41014,-9.57684,3.85563e-24, 43.3104, 21.6301, 21.6255,-0.0548495 - 0.451,-4.41963,-9.39386,1.17126e-24, 43.4026, 21.6744, 21.6743,-0.0539521 - 0.452,-4.42902,-9.38945,-4.07715e-24, 43.4947, 21.7193, 21.7215,-0.0539304 - 0.453,-4.43849,-9.56508,-1.08915e-23, 43.5885, 21.7652, 21.7685,-0.0547919 - 0.454, -4.4482,-9.84517,-1.67236e-23, 43.6851, 21.812, 21.817,-0.0561657 - 0.455,-4.45818,-10.1096,-1.77476e-23, 43.7843, 21.8604, 21.8664,-0.0574627 - 0.456,-4.46835,-10.2452,-1.00082e-23, 43.8848, 21.9119, 21.9148,-0.0581278 - 0.457,-4.47857,-10.1942,8.56245e-24, 43.9848, 21.9652, 21.9617,-0.0578775 - 0.458,-4.48866,-9.97879,3.57241e-23, 44.0827, 22.0169, 22.009,-0.0568211 - 0.459, -4.4985,-9.69163,6.31115e-23, 44.1778, 22.0644, 22.0579,-0.0554126 - 0.46,-4.50807,-9.45577,7.63969e-23, 44.2705, 22.1091, 22.1072,-0.0542557 - 0.461,-4.51748,-9.37208,5.87092e-23, 44.3625, 22.1535, 22.1551,-0.0538452 - 0.462,-4.52691,-9.47604,-2.25244e-24, 44.4554, 22.1991, 22.2019,-0.0543551 - 0.463,-4.53651,-9.72275,-1.04612e-22, 44.5508, 22.2456, 22.2497,-0.0555653 - 0.464,-4.54637,-10.0063,-2.23542e-22, 44.649, 22.2931, 22.2989,-0.056956 - 0.465,-4.55648,-10.2052,-3.08457e-22, 44.7491, 22.3432, 22.3479,-0.0579315 - 0.466, -4.5667,-10.2345,-2.91702e-22, 44.8495, 22.3961, 22.3953,-0.0580752 - 0.467,-4.57686, -10.082,-1.11999e-22, 44.9484, 22.4488, 22.4423,-0.0573272 - 0.468, -4.5868,-9.81336,2.49504e-22, 45.0447, 22.4981, 22.4905,-0.0560097 - 0.469,-4.59648, -9.5439,7.30695e-22, 45.1383, 22.5437, 22.5399,-0.054688 - 0.47,-4.60595,-9.38893,1.16563e-21, 45.2304, 22.588, 22.5885,-0.0539279 - 0.471,-4.61535,-9.41457,1.2996e-21, 45.3228, 22.6332, 22.6355,-0.0540536 - 0.472,-4.62486,-9.60944,8.59683e-22, 45.417, 22.6793, 22.6827,-0.0550095 - 0.473,-4.63461,-9.88976,-3.18158e-22, 45.514, 22.7262, 22.7314,-0.0563845 - 0.474,-4.64462,-10.1353,-2.13262e-21, 45.6135, 22.7751, 22.7808,-0.057589 - 0.475,-4.65481,-10.2411,-4.09126e-21, 45.7139, 22.827, 22.8289,-0.0581079 - 0.476,-4.66501,-10.1621,-5.29927e-21, 45.8136, 22.8802, 22.8758,-0.0577203 - 0.477,-4.67506, -9.9325,-4.64398e-21, 45.9111, 22.9312, 22.9233,-0.0565941 - 0.478,-4.68485,-9.65094,-1.21083e-21, 46.0057, 22.9781, 22.9724,-0.055213 - 0.479, -4.6944,-9.43806,5.1264e-21, 46.0983, 23.0226, 23.0215,-0.0541689 - 0.48,-4.70381,-9.38487,1.3123e-20, 46.1904, 23.0673, 23.0692,-0.0539079 - 0.481,-4.71326,-9.51379,1.98842e-20, 46.2837, 23.1132, 23.116,-0.0545403 - 0.482, -4.7229,-9.76927,2.12265e-20, 46.3796, 23.1597, 23.1641,-0.0557934 - 0.483, -4.7328,-10.0417,1.29133e-20, 46.4781, 23.2076, 23.2134,-0.0571295 - 0.484,-4.74293,-10.2143,-7.27999e-21, 46.5783, 23.2582, 23.2621,-0.0579763 - 0.485,-4.75315,-10.2135,-3.71598e-20, 46.6785, 23.3111, 23.3094,-0.0579723 - 0.486,-4.76327,-10.0399,-6.83323e-20, 46.777, 23.3634, 23.3564,-0.0571211 - 0.487,-4.77318, -9.7683,-8.63229e-20, 46.8728, 23.4121, 23.4049,-0.0557887 - 0.488,-4.78282,-9.51507,-7.37526e-20, 46.9661, 23.4573, 23.4543,-0.0545466 - 0.489,-4.79227,-9.38864,-1.6967e-20, 47.0582, 23.5017, 23.5026,-0.0539264 - 0.49,-4.80169,-9.44286,8.49212e-20, 47.1509, 23.5471, 23.5496,-0.0541924 - 0.491,-4.81124,-9.65416,2.11444e-19, 47.2456, 23.5934, 23.597,-0.0552288 - 0.492,-4.82103,-9.93175,3.17096e-19, 47.343, 23.6405, 23.6459,-0.0565904 - 0.493,-4.83107,-10.1567,3.37437e-19, 47.4426, 23.6898, 23.6951,-0.0576935 - 0.494,-4.84127,-10.2327,2.0817e-19, 47.543, 23.742, 23.7429,-0.0580665 - 0.495,-4.85145,-10.1276,-1.03845e-19, 47.6424, 23.795, 23.7898,-0.057551 - 0.496,-4.86145,-9.88674,-5.65064e-19, 47.7394, 23.8453, 23.8376,-0.0563696 - 0.497, -4.8712,-9.61352,-1.04943e-18, 47.8337, 23.8918, 23.8869,-0.0550295 - 0.498,-4.88072,-9.42497,-1.34057e-18, 47.9261, 23.9362, 23.9358,-0.0541046 - 0.499,-4.89014,-9.40165,-1.17835e-18, 48.0184, 23.9812, 23.9832,-0.0539902 - 0.5,-4.89961,-9.55321,-3.55056e-19, 48.1121, 24.0272, 24.0302,-0.0547337 - 0.501, -4.9093,-9.81441,1.15377e-18, 48.2084, 24.0739, 24.0785,-0.0560148 - 0.502,-4.91924,-10.0732,3.06433e-18, 48.3072, 24.1221, 24.1278,-0.0572842 - 0.503,-4.92939,-10.2188,4.72782e-18, 48.4074, 24.1731, 24.1763,-0.0579983 - 0.504,-4.93959,-10.1891,5.21043e-18, 48.5074, 24.2261, 24.2234,-0.0578525 - 0.505,-4.94969, -9.9971,3.55551e-18, 48.6054, 24.2779, 24.2706,-0.0569109 - 0.506,-4.95955,-9.72541,-7.83741e-19, 48.7009, 24.3259, 24.3194,-0.0555783 - 0.507,-4.96915,-9.49047,-7.43954e-18, 48.794, 24.3709, 24.3687,-0.0544259 - 0.508, -4.9786,-9.39281,-1.4744e-17, 48.8861, 24.4154, 24.4167,-0.0539469 - 0.509,-4.98803,-9.47395,-1.97129e-17, 48.979, 24.4611, 24.4636,-0.0543449 - 0.51,-4.99762,-9.69882,-1.86281e-17, 49.0742, 24.5075, 24.5113,-0.0554479 - 0.511,-5.00745,-9.97085,-8.30767e-18, 49.172, 24.5549, 24.5603,-0.0567822 - 0.512,-5.01752,-10.1735,1.211e-17, 49.2718, 24.6046, 24.6094,-0.0577761 - 0.513,-5.02772,-10.2201,3.93806e-17, 49.3721, 24.6571, 24.657,-0.0580047 - 0.514,-5.03788, -10.091,6.51821e-17, 49.4711, 24.7097, 24.7039,-0.0573716 - 0.515,-5.04784,-9.84188,7.68821e-17, 49.5676, 24.7594, 24.752,-0.0561496 - 0.516,-5.05755,-9.57958,6.07177e-17, 49.6616, 24.8054, 24.8013,-0.054863 - 0.517,-5.06705,-9.41644,7.36434e-18, 49.754, 24.8499, 24.85,-0.0540628 - 0.518,-5.07647,-9.42213,-8.12283e-17, 49.8464, 24.8951, 24.8972,-0.0540907 - 0.519,-5.08598,-9.59387,-1.86077e-16, 49.9405, 24.9412, 24.9443,-0.0549331 - 0.52, -5.0957,-9.85782,-2.69704e-16, 50.0372, 24.9881, 24.9929,-0.0562278 - 0.521,-5.10568,-10.1008,-2.82115e-16, 50.1363, 25.0367, 25.0422,-0.0574195 - 0.522,-5.11584,-10.2188,-1.75857e-16, 50.2365, 25.0881, 25.0905,-0.0579983 - 0.523,-5.12603,-10.1615,7.13424e-17, 50.3362, 25.1411, 25.1374,-0.0577175 - 0.524,-5.13609,-9.95387,4.32066e-16, 50.4339, 25.1923, 25.1849,-0.0566989 - 0.525,-5.14591, -9.685,8.12644e-16, 50.5289, 25.2397, 25.2338,-0.0553801 - 0.526,-5.15549,-9.47017,1.05641e-15, 50.6218, 25.2845, 25.283,-0.0543264 - 0.527,-5.16492,-9.40125,9.76623e-16, 50.714, 25.3292, 25.3308,-0.0539883 - 0.528,-5.17438,-9.50748,4.21418e-16, 50.8073, 25.3751, 25.3777,-0.0545093 - 0.529, -5.184,-9.74303,-6.39649e-16, 50.9029, 25.4216, 25.4256,-0.0556647 - 0.53,-5.19388,-10.0068,-2.03315e-15, 51.001, 25.4693, 25.4748,-0.0569586 - 0.531,-5.20397,-10.1858,-3.34181e-15, 51.1009, 25.5195, 25.5237,-0.0578367 - 0.532,-5.21417,-10.2036,-3.94815e-15, 51.201, 25.5721, 25.571,-0.0579238 - 0.533, -5.2243,-10.0528,-3.18971e-15, 51.2997, 25.6244, 25.6181,-0.0571841 - 0.534,-5.23422,-9.79832,-6.20507e-16, 51.3958, 25.6734, 25.6664,-0.0559359 - 0.535, -5.2439,-9.54933,3.67507e-15, 51.4895, 25.719, 25.7157,-0.0547146 - 0.536,-5.25338,-9.41241,8.82232e-15, 51.5818, 25.7636, 25.7642,-0.054043 - 0.537,-5.26281,-9.44599,1.30918e-14, 51.6745, 25.809, 25.8113,-0.0542077 - 0.538,-5.27235,-9.63537,1.41656e-14, 51.769, 25.8553, 25.8586,-0.0551366 - 0.539,-5.28211,-9.89916,9.80158e-15, 51.8661, 25.9024, 25.9073,-0.0564306 - 0.54,-5.29213,-10.1243,-1.16931e-15, 51.9654, 25.9513, 25.9566,-0.0575348 - 0.541, -5.3023,-10.2144,-1.77569e-14, 52.0656, 26.0031, 26.0046,-0.057977 - 0.542,-5.31247,-10.1312,-3.6048e-14, 52.165, 26.0559, 26.0515,-0.0575689 - 0.543,-5.32249,-9.91065,-4.92627e-14, 52.2622, 26.1066, 26.0992,-0.0564869 - 0.544,-5.33227,-9.64737,-4.90513e-14, 52.3569, 26.1534, 26.1483,-0.0551955 - 0.545,-5.34182,-9.45421,-2.81506e-14, 52.4496, 26.1981, 26.1973,-0.054248 - 0.546,-5.35125,-9.41375,1.59837e-14, 52.542, 26.2431, 26.2449,-0.0540496 - 0.547,-5.36073,-9.54303,7.757e-14, 52.6356, 26.2891, 26.2918,-0.0546837 - 0.548, -5.3704,-9.78639,1.40436e-13, 52.7316, 26.3358, 26.3399,-0.0558774 - 0.549,-5.38031,-10.0394,1.79177e-13, 52.8301, 26.3837, 26.3892,-0.0571185 - 0.55,-5.39043,-10.1937,1.64758e-13, 52.9301, 26.4343, 26.4379,-0.0578755 - 0.551,-5.40061,-10.1835,7.45903e-14, 53.03, 26.4871, 26.4851,-0.0578252 - 0.552,-5.41071,-10.0133,-9.47399e-14, 53.1282, 26.539, 26.5323,-0.0569905 - 0.553, -5.4206,-9.75641,-3.1593e-13, 53.2239, 26.5874, 26.5808,-0.0557303 - 0.554,-5.43024, -9.5229,-5.25978e-13, 53.3173, 26.6327, 26.6301,-0.054585 - 0.555, -5.4397,-9.41275,-6.33209e-13, 53.4097, 26.6773, 26.6783,-0.0540447 - 0.556,-5.44915, -9.4729,-5.39665e-13, 53.5026, 26.7229, 26.7253,-0.0543397 - 0.557,-5.45872,-9.67728,-1.77675e-13, 53.5975, 26.7694, 26.7728,-0.0553422 - 0.558,-5.46853,-9.93812,4.46956e-13, 53.695, 26.8167, 26.8218,-0.0566216 - 0.559,-5.47857,-10.1436,1.21924e-12, 53.7945, 26.866, 26.8709,-0.0576297 - 0.56,-5.48875,-10.2059,1.90503e-12, 53.8947, 26.9181, 26.9186,-0.0579352 - 0.561, -5.4989,-10.0986,2.18397e-12, 53.9937, 26.9707, 26.9656,-0.0574086 - 0.562,-5.50888,-9.86784,1.73385e-12, 54.0905, 27.0207, 27.0135,-0.0562769 - 0.563,-5.51862,-9.61276,3.58565e-13, 54.1848, 27.0671, 27.0627,-0.0550257 - 0.564,-5.52815,-9.44259,-1.8694e-12, 54.2775, 27.1118, 27.1115,-0.054191 - 0.565,-5.53759,-9.43004,-4.50155e-12, 54.37, 27.1569, 27.1589,-0.0541295 - 0.566,-5.54709,-9.58021,-6.70139e-12, 54.464, 27.2031, 27.206,-0.0548661 - 0.567, -5.5568,-9.82852,-7.38e-12, 54.5604, 27.2499, 27.2543,-0.056084 - 0.568,-5.56674,-10.0685,-5.49924e-12, 54.6591, 27.2983, 27.3036,-0.0572609 - 0.569,-5.57688,-10.1973,-5.05837e-13, 54.7592, 27.3493, 27.352,-0.0578929 - 0.57,-5.58706,-10.1601,7.20981e-12, 54.8588, 27.402, 27.3991,-0.0577103 - 0.571,-5.59712,-9.97302,1.59978e-11, 54.9567, 27.4534, 27.4465,-0.0567928 - 0.572,-5.60697,-9.71648,2.29697e-11, 55.052, 27.5012, 27.4952,-0.0555345 - 0.573,-5.61658,-9.50044,2.45125e-11, 55.1452, 27.5463, 27.5444,-0.0544748 - 0.574,-5.62603,-9.41733,1.73359e-11, 55.2376, 27.5911, 27.5924,-0.0540672 - 0.575,-5.63549, -9.5025,-9.62395e-14, 55.3308, 27.6369, 27.6394,-0.0544849 - 0.576, -5.6451, -9.7192,-2.61163e-11, 55.4262, 27.6835, 27.6871,-0.0555478 - 0.577,-5.65495, -9.9744,-5.4939e-11, 55.524, 27.731, 27.7362,-0.0567996 - 0.578,-5.66502,-10.1588,-7.68897e-11, 55.6237, 27.7808, 27.7852,-0.0577039 - 0.579,-5.67519,-10.1935,-8.02336e-11, 55.7237, 27.8331, 27.8327,-0.0578741 - 0.58,-5.68532,-10.0639,-5.46682e-11, 55.8224, 27.8854, 27.8797,-0.0572386 - 0.581,-5.69527,-9.82584,4.06724e-12, 55.9188, 27.9348, 27.9279,-0.0560709 - 0.582,-5.70497,-9.58141,8.96912e-11, 56.0128, 27.9808, 27.9771,-0.054872 - 0.583,-5.71448,-9.43528,1.8275e-10, 56.1053, 28.0254, 28.0257,-0.0541552 - 0.584,-5.72392,-9.44986,2.5173e-10, 56.198, 28.0709, 28.0729,-0.0542267 - 0.585,-5.73346,-9.61863,2.59244e-10, 56.2924, 28.1172, 28.1202,-0.0550545 - 0.586, -5.7432,-9.86905,1.73315e-10, 56.3892, 28.1642, 28.1688,-0.0562829 - 0.587,-5.75318,-10.0938,-1.81127e-11, 56.4882, 28.2128, 28.218,-0.0573851 - 0.588,-5.76333,-10.1966,-2.9338e-10, 56.5883, 28.2642, 28.2662,-0.0578894 - 0.589,-5.77349,-10.1337,-5.89525e-10, 56.6877, 28.3169, 28.3132,-0.0575809 - 0.59,-5.78353,-9.93229,-8.06571e-10, 56.7851, 28.3678, 28.3607,-0.0565931 - 0.591,-5.79333,-9.67887,-8.27508e-10, 56.88, 28.415, 28.4097,-0.05535 - 0.592,-5.80291,-9.48203,-5.53705e-10, 56.9731, 28.4599, 28.4588,-0.0543845 - 0.593,-5.81237,-9.42596,5.03451e-11, 57.0655, 28.5049, 28.5065,-0.0541095 - 0.594,-5.82185,-9.53444,9.15234e-10, 57.1591, 28.5509, 28.5535,-0.0546416 - 0.595,-5.83149,-9.76073,1.84448e-09, 57.2548, 28.5976, 28.6015,-0.0557516 - 0.596,-5.84138,-10.0077,2.52892e-09, 57.353, 28.6454, 28.6506,-0.0569631 - 0.597,-5.85147,-10.1697,2.60864e-09, 57.4528, 28.6956, 28.6994,-0.0577574 - 0.598,-5.86164,-10.1773,1.78099e-09, 57.5526, 28.748, 28.7468,-0.0577948 - 0.599,-5.87174,-10.0276,-6.41677e-11, 57.651, 28.8, 28.7939,-0.0570607 - 0.6,-5.88165,-9.78503,-2.71911e-09, 57.747, 28.8488, 28.8423,-0.0558707 - 0.601,-5.89132,-9.55352,-5.5924e-09, 57.8407, 28.8944, 28.8915,-0.0547352 - 0.602,-5.90081,-9.43222,-7.75218e-09, 57.9332, 28.9392, 28.9399,-0.0541402 - 0.603,-5.91026, -9.4729,-8.11061e-09, 58.0261, 28.9848, 28.987,-0.0543397 - 0.604,-5.91983,-9.65786,-5.74431e-09, 58.1209, 29.0312, 29.0344,-0.055247 - 0.605,-5.92961,-9.90766,-2.9495e-10, 58.2181, 29.0784, 29.0832,-0.0564723 - 0.606,-5.93962,-10.1152,7.65849e-09, 58.3173, 29.1275, 29.1323,-0.0574904 - 0.607,-5.94978,-10.1918,1.64001e-08, 58.4173, 29.1792, 29.1803,-0.0578657 - 0.608,-5.95992,-10.1047,2.31947e-08, 58.5164, 29.2317, 29.2273,-0.0574386 - 0.609,-5.96992,-9.89155,2.48146e-08, 58.6135, 29.282, 29.2751,-0.0563932 - 0.61,-5.97969,-9.64386,1.8464e-08, 58.7081, 29.3288, 29.3241,-0.0551783 - 0.611,-5.98925,-9.46771,2.94149e-09, 58.8009, 29.3736, 29.373,-0.0543143 - 0.612, -5.9987,-9.43844,-2.02669e-08, 58.8935, 29.4188, 29.4206,-0.0541707 - 0.613, -6.0082,-9.56832,-4.63745e-08, 58.9874, 29.465, 29.4676,-0.0548078 - 0.614,-6.01789,-9.80148,-6.7574e-08, 59.0835, 29.5118, 29.5158,-0.0559514 - 0.615,-6.02781,-10.0379,-7.44821e-08, 59.182, 29.5599, 29.565,-0.0571111 - 0.616,-6.03791,-10.1764,-5.87257e-08, 59.2819, 29.6105, 29.6136,-0.0577902 - 0.617,-6.04808,-10.1577,-1.62426e-08, 59.3815, 29.663, 29.6608,-0.0576987 - 0.618,-6.05815,-9.99017,4.95495e-08, 59.4795, 29.7145, 29.7081,-0.056877 - 0.619,-6.06802,-9.74576,1.25861e-07, 59.5751, 29.7627, 29.7567,-0.0556781 - 0.62,-6.07766,-9.52925,1.91074e-07, 59.6686, 29.8081, 29.8059,-0.0546162 - 0.621,-6.08714,-9.43332,2.18524e-07, 59.7611, 29.853, 29.854,-0.0541456 - 0.622,-6.09661,-9.49884,1.83509e-07, 59.8543, 29.8988, 29.9011,-0.054467 - 0.623,-6.10621,-9.69751,7.24406e-08, 59.9494, 29.9453, 29.9487,-0.0554414 - 0.624,-6.11603,-9.94403,-1.08117e-07, 60.047, 29.9927, 29.9976,-0.0566506 - 0.625,-6.12607,-10.1328,-3.25635e-07, 60.1464, 30.0422, 30.0466,-0.0575763 - 0.626,-6.13622, -10.183,-5.22241e-07, 60.2463, 30.0941, 30.0944,-0.0578226 - 0.627,-6.14635,-10.0734,-6.24086e-07, 60.3451, 30.1464, 30.1414,-0.0572851 - 0.628,-6.15631,-9.85118,-5.59713e-07, 60.4418, 30.1962, 30.1894,-0.0561952 - 0.629,-6.16604, -9.6117,-2.84768e-07, 60.536, 30.2425, 30.2385,-0.0550206 - 0.63,-6.17558,-9.45752,1.9275e-07, 60.6288, 30.2873, 30.2873,-0.0542643 - 0.631,-6.18504,-9.45452,7.94877e-07, 60.7216, 30.3327, 30.3346,-0.0542496 - 0.632,-6.19456,-9.60376,1.37246e-06, 60.8158, 30.379, 30.3818,-0.0549816 - 0.633,-6.20429,-9.84108,1.72691e-06, 60.9123, 30.426, 30.4302,-0.0561457 - 0.634,-6.21424,-10.0647,1.65653e-06, 61.0111, 30.4744, 30.4794,-0.0572426 - 0.635,-6.22436,-10.1789,1.02124e-06, 61.1109, 30.5254, 30.5277,-0.0578028 - 0.636,-6.23452, -10.135,-1.88522e-07, 61.2103, 30.5779, 30.5749,-0.0575871 - 0.637,-6.24456,-9.95191,-1.79961e-06, 61.308, 30.629, 30.6223,-0.0566893 - 0.638,-6.25439,-9.70837,-3.44412e-06, 61.4032, 30.6766, 30.6711,-0.0554947 - 0.639, -6.264,-9.50874,-4.60585e-06, 61.4965, 30.7218, 30.7202,-0.0545155 - 0.64,-6.27347,-9.43843,-4.73185e-06, 61.5891, 30.7668, 30.7681,-0.0541707 - 0.641,-6.28296,-9.52735,-3.39651e-06, 61.6825, 30.8128, 30.8152,-0.0546068 - 0.642,-6.29259,-9.73718,-4.84512e-07, 61.7781, 30.8594, 30.863,-0.055636 - 0.643,-6.30245,-9.97786,3.65946e-06, 61.8759, 30.9071, 30.912,-0.0568166 - 0.644,-6.31251,-10.1463,8.17401e-06, 61.9755, 30.9569, 30.9609,-0.0576427 - 0.645,-6.32267,-10.1704,1.17686e-05, 62.0753, 31.0091, 31.0084,-0.0577611 - 0.646,-6.33277,-10.0402,1.29783e-05, 62.1737, 31.0611, 31.0555,-0.0571223 - 0.647, -6.3427,-9.81158,1.05642e-05, 62.27, 31.1102, 31.1038,-0.056001 - 0.648, -6.3524,-9.58264,3.98356e-06, 62.364, 31.1562, 31.153,-0.054878 - 0.649,-6.36191,-9.45142,-6.1955e-06, 62.4567, 31.201, 31.2015,-0.0542344 - 0.65,-6.37138,-9.47396,-1.80822e-05, 62.5497, 31.2466, 31.2487,-0.0543449 - 0.651,-6.38093,-9.64037,-2.85926e-05, 62.6442, 31.2931, 31.296,-0.0551612 - 0.652,-6.39069,-9.87917,-3.3996e-05, 62.7412, 31.3402, 31.3446,-0.0563325 - 0.653,-6.40068, -10.088,-3.08483e-05, 62.8401, 31.389, 31.3938,-0.0573567 - 0.654,-6.41081,-10.1774,-1.71554e-05, 62.94, 31.4403, 31.4419,-0.0577955 - 0.655,-6.42095,-10.1094,6.51984e-06, 63.0391, 31.4927, 31.4889,-0.0574617 - 0.656,-6.43096,-9.91324,3.63655e-05, 63.1364, 31.5433, 31.5366,-0.0564996 - 0.657,-6.44076,-9.67318,6.53969e-05, 63.2313, 31.5904, 31.5855,-0.0553221 - 0.658,-6.45034,-9.49208,8.45299e-05, 63.3244, 31.6354, 31.6345,-0.0544338 - 0.659,-6.45981, -9.4474,8.46495e-05, 63.4171, 31.6806, 31.6822,-0.0542147 - 0.66,-6.46931,-9.55807,5.9367e-05, 63.5108, 31.7268, 31.7293,-0.0547575 - 0.661,-6.47898,-9.77647,7.847e-06, 63.6067, 31.7736, 31.7773,-0.0558287 - 0.662,-6.48887,-10.0089,-6.31305e-05, 63.7049, 31.8215, 31.8265,-0.0569688 - 0.663,-6.49895,-10.1558,-0.000138744, 63.8046, 31.8717, 31.8751,-0.0576893 - 0.664,-6.50911,-10.1544,-0.000197988, 63.9042, 31.924, 31.9225,-0.0576824 - 0.665,-6.51919,-10.0055,-0.000217976, 64.0023, 31.9757, 31.9697,-0.0569521 - 0.666,-6.52908,-9.77311,-0.000180163, 64.0982, 32.0242, 32.0182,-0.0558123 - 0.667,-6.53874,-9.55687,-7.72297e-05, 64.192, 32.0699, 32.0673,-0.0547516 - 0.668,-6.54825,-9.44936,8.12357e-05, 64.2846, 32.1148, 32.1156,-0.0542243 - 0.669,-6.55772,-9.49646,0.000266302, 64.3778, 32.1606, 32.1627,-0.0544553 - 0.67,-6.56731,-9.67776,0.000432233, 64.4727, 32.2072, 32.2102,-0.0553446 - 0.671, -6.5771,-9.91542,0.000524749, 64.57, 32.2545, 32.259,-0.0565103 - 0.672,-6.58711,-10.1076,0.000494302, 64.6692, 32.3036, 32.3081,-0.0574529 - 0.673,-6.59725, -10.172,0.000311963, 64.769, 32.3552, 32.356,-0.0577689 - 0.674,-6.60738,-10.0813,-1.59681e-05, 64.8679, 32.4075, 32.403,-0.057324 - 0.675,-6.61736,-9.87456,-0.000439268, 64.9647, 32.4575, 32.4509,-0.0563099 - 0.676,-6.62712,-9.64046,-0.000865282, 65.0593, 32.5042, 32.5,-0.0551616 - 0.677,-6.63668,-9.47931,-0.00117313, 65.1523, 32.5491, 32.5488,-0.0543712 - 0.678,-6.64615,-9.46002,-0.00124017, 65.2451, 32.5945, 32.5963,-0.0542766 - 0.679,-6.65567,-9.59064,-0.000976587, 65.3392, 32.6408, 32.6434,-0.0549172 - 0.68,-6.66537,-9.81501,-0.000360492, 65.4355, 32.6878, 32.6917,-0.0560178 - 0.681, -6.6753,-10.0369,0.000536483, 65.5339, 32.736, 32.7409,-0.0571062 - 0.682, -6.6854,-10.1613,0.00154298, 65.6336, 32.7866, 32.7893,-0.0577163 - 0.683,-6.69555,-10.1351,0.00240833, 65.733, 32.8389, 32.8365,-0.0575877 - 0.684, -6.7056,-9.96966,0.00285103, 65.8308, 32.8902, 32.8839,-0.0567763 - 0.685,-6.71545,-9.73612,0.00262931, 65.9263, 32.9382, 32.9326,-0.0556308 - 0.686,-6.72509,-9.53456,0.00161969, 66.0199, 32.9836, 32.9817,-0.0546422 - 0.687,-6.73458,-9.45126,-0.000116334, 66.1126, 33.0286, 33.0297,-0.0542336 - 0.688,-6.74407,-9.52171,-0.00229949, 66.206, 33.0746, 33.0768,-0.0545792 - 0.689,-6.75369,-9.71552,-0.00445185, 66.3013, 33.1213, 33.1245,-0.0555298 - 0.69,-6.76352,-9.94952,-0.00597625, 66.3989, 33.1688, 33.1735,-0.0566775 - 0.691,-6.77356,-10.1234,-0.00628937, 66.4982, 33.2183, 33.2224,-0.0575305 - 0.692, -6.7837,-10.1628,-0.0049856, 66.5979, 33.2701, 33.2701,-0.0577239 - 0.693,-6.79381,-10.0511,-0.00199393, 66.6965, 33.3222, 33.3172,-0.0571758 - 0.694,-6.80375,-9.83627,0.00231696, 66.793, 33.3716, 33.3653,-0.056122 - 0.695,-6.81347,-9.61049,0.00712737, 66.8873, 33.4179, 33.4144,-0.0550146 - 0.696,-6.82301,-9.47048,0.0112753, 66.9802, 33.4629, 33.463,-0.0543279 - 0.697,-6.83249,-9.47608,0.0134854, 67.0732, 33.5085, 33.5103,-0.0543553 - 0.698,-6.84204,-9.62467,0.0126838, 67.1676, 33.5549, 33.5576,-0.0550842 - 0.699,-6.85178,-9.85243,0.0083362, 67.2642, 33.602, 33.6061,-0.0562013 - 0.7,-6.86173,-10.0617,0.000720951, 67.3629, 33.6505, 33.6552,-0.0572277 - 0.701,-6.87184,-10.1629,-0.00895057, 67.4626, 33.7014, 33.7035,-0.057724 - 0.702,-6.88198,-10.1128,-0.0186346, 67.5618, 33.7538, 33.7506,-0.0574783 - 0.703,-6.89201,-9.93308,-0.0258011, 67.6593, 33.8045, 33.7982,-0.0565969 - 0.704,-6.90182,-9.70094,-0.0279887, 67.7545, 33.852, 33.847,-0.0554583 - 0.705,-6.91143,-9.51584,-0.0234675, 67.8478, 33.8973, 33.896,-0.0545504 - 0.706,-6.92092,-9.45698,-0.0118596, 67.9406, 33.9425, 33.9438,-0.0542616 - 0.707,-6.93042,-9.54939,0.00545928, 68.0343, 33.9886, 33.9909,-0.0547149 - 0.708,-6.94007,-9.75328,0.0253284, 68.1299, 34.0354, 34.0389,-0.055715 - 0.709,-6.94994,-9.98118,0.0432303, 68.2279, 34.0831, 34.0879,-0.0568328 - 0.71, -6.96,-10.1354,0.0541649, 68.3273, 34.1331, 34.1366,-0.0575895 - 0.711,-6.97014,-10.1501,0.0538351, 68.4269, 34.1851, 34.1841,-0.0576614 - 0.712,-6.98022,-10.0191,0.039899, 68.5251, 34.2368, 34.2313,-0.0570188 - 0.713,-6.99013,-9.79872,0.0129787, 68.6213, 34.2857, 34.2797,-0.0559379 - 0.714,-6.99982,-9.58348,-0.0228867, 68.7153, 34.3315, 34.3289,-0.0548821 - 0.715,-7.00935,-9.46556,-0.0605709, 68.8081, 34.3766, 34.3773,-0.0543037 - 0.716,-7.01883,-9.49531,-0.0910455, 68.9013, 34.4225, 34.4244,-0.0544497 - 0.717,-7.02841, -9.6598,-0.105281, 68.9961, 34.4691, 34.4717,-0.0552565 - 0.718,-7.03818,-9.88838,-0.0965205, 69.0931, 34.5164, 34.5203,-0.0563777 - 0.719,-7.04817,-10.0831,-0.0624078, 69.192, 34.5651, 34.5695,-0.0573327 - 0.72,-7.05829,-10.1606,-0.0064176, 69.2916, 34.6161, 34.6178,-0.0577127 - 0.721,-7.06841,-10.0878,0.0619194, 69.3906, 34.6682, 34.665,-0.0573557 - 0.722, -7.0784,-9.89615,0.128262, 69.4877, 34.7187, 34.7126,-0.0564158 - 0.723,-7.08819,-9.66788, 0.17613, 69.5825, 34.766, 34.7612,-0.0552961 - 0.724,-7.09777, -9.5008, 0.19058, 69.6757, 34.8115, 34.8098,-0.0544766 - 0.725,-7.10725,-9.46637,0.162141, 69.7686, 34.8568, 34.8575,-0.0543077 - 0.726,-7.11678,-9.57916,0.0900819, 69.8626, 34.9026, 34.9052,-0.0548609 - 0.727,-7.12646,-9.79065,-0.0159282, 69.9586, 34.9488, 34.9539,-0.0558983 - 0.728,-7.13636,-10.0101,-0.136429, 70.0568, 34.9966, 35.0032,-0.0569749 - 0.729,-7.14644,-10.1436,-0.24527, 70.1563, 35.0476, 35.0511,-0.0576296 - 0.73,-7.15658, -10.134,-0.314836, 70.2557, 35.1008, 35.0973,-0.0575826 - 0.731,-7.16664,-9.98567,-0.322447, 70.3537, 35.1529, 35.144,-0.0568549 - 0.732,-7.17651,-9.76228,-0.256546, 70.4495, 35.2006, 35.1931,-0.0557592 - 0.733,-7.18617,-9.55964,-0.121144, 70.5432, 35.2446, 35.2439,-0.0547652 - 0.734,-7.19569,-9.46449,0.0628291, 70.6361, 35.2882, 35.2936,-0.0542985 - 0.735,-7.20518,-9.51745,0.260015, 70.7295, 35.3344, 35.3405,-0.0545583 - 0.736,-7.21478,-9.69563,0.426917, 70.8246, 35.3831, 35.386,-0.0554322 - 0.737,-7.22459,-9.92255,0.520989, 70.9219, 35.4332, 35.4322,-0.0565453 - 0.738, -7.2346, -10.101,0.510713, 71.021, 35.4833, 35.4803,-0.0574204 - 0.739,-7.24473,-10.1545,0.384398, 71.1206, 35.5327, 35.5303,-0.057683 - 0.74,-7.25484,-10.0604,0.155438, 71.2193, 35.5807, 35.5814,-0.0572216 - 0.741, -7.2648,-9.85924,-0.13766, 71.316, 35.6278, 35.632,-0.0562347 - 0.742,-7.27455,-9.63722,-0.437103, 71.4106, 35.6758, 35.6796,-0.0551457 - 0.743,-7.28411, -9.4895,-0.676815, 71.5037, 35.726, 35.7232,-0.0544212 - 0.744,-7.29359,-9.47924,-0.796592, 71.5967, 35.7767, 35.7656,-0.0543708 - 0.745,-7.30314,-9.61066,-0.756468, 71.6909, 35.8236, 35.8123,-0.0550154 - 0.746,-7.31286,-9.82727,-0.547923, 71.7873, 35.8653, 35.866,-0.0560779 - 0.747,-7.32279,-10.0362,-0.199026, 71.8858, 35.9059, 35.9228,-0.0571027 - 0.748,-7.33288, -10.148,0.228282, 71.9854, 35.9527, 35.975,-0.0576509 - 0.749,-7.34301,-10.1148,0.648884, 72.0846, 36.0089, 36.0182,-0.0574885 - 0.75,-7.35305, -9.9512,0.971403, 72.1822, 36.0695, 36.056,-0.0566858 - 0.751,-7.36289, -9.7273, 1.11798, 72.2776, 36.1252, 36.0969,-0.0555876 - 0.752,-7.37252,-9.53912, 1.04264, 72.3712, 36.1699, 36.1466,-0.0546646 - 0.753,-7.38202, -9.4672,0.743861, 72.4641, 36.2055, 36.2043,-0.0543118 - 0.754,-7.39153, -9.5422,0.268182, 72.5577, 36.24, 36.263,-0.0546796 - 0.755,-7.40116,-9.73179,-0.296749, 72.6532, 36.2825, 36.315,-0.0556096 - 0.756,-7.41101,-9.95463,-0.838663, 72.7508, 36.3373, 36.3568,-0.0567026 - 0.757,-7.42104,-10.1152,-1.24361, 72.85, 36.4003, 36.3922,-0.0574903 - 0.758,-7.43117,-10.1449,-1.42049, 72.9496, 36.4615, 36.4304,-0.0576358 - 0.759,-7.44126,-10.0311,-1.32178, 73.048, 36.5112, 36.4797,-0.0570776 - 0.76,-7.45119,-9.82274,-0.955589, 73.1443, 36.5482, 36.5401,-0.0560557 - 0.761, -7.4609,-9.60921,-0.385982, 73.2386, 36.5816, 36.6019,-0.0550084 - 0.762,-7.47045,-9.48196,0.278874, 73.3316, 36.623, 36.6542,-0.0543842 - 0.763,-7.47994,-9.49538, 0.9085, 73.4248, 36.6763, 36.694,-0.05445 - 0.764,-7.48951,-9.64352, 1.3772, 73.5194, 36.7354, 36.7288,-0.0551766 - 0.765,-7.49926,-9.86278, 1.59052, 73.6161, 36.7905, 36.7693,-0.0562521 - 0.766,-7.50922,-10.0591, 1.50525, 73.7148, 36.8376, 36.82,-0.0572152 - 0.767,-7.51932,-10.1485, 1.13833, 73.8144, 36.8802, 36.8765,-0.0576538 - 0.768,-7.52945,-10.0928,0.562873, 73.9134, 36.9242, 36.9318,-0.0573805 - 0.769,-7.53945,-9.91606,-0.107896, 74.0106, 36.9718, 36.9823,-0.0565134 - 0.77,-7.54925,-9.69409,-0.744958, 74.1057, 37.0214, 37.0289,-0.0554247 - 0.771,-7.55886,-9.52206,-1.23055, 74.1992, 37.0707, 37.0739,-0.0545809 - 0.772,-7.56836,-9.47357,-1.48181, 74.2921, 37.119, 37.1188,-0.054343 - 0.773,-7.57788,-9.56924,-1.46588, 74.386, 37.1672, 37.1639,-0.0548123 - 0.774,-7.58755, -9.7679,-1.20341, 74.4818, 37.2163, 37.2097,-0.0557867 - 0.775,-7.59743,-9.98433,-0.76031, 74.5797, 37.2659, 37.257,-0.0568483 - 0.776,-7.60748,-10.1258,-0.230327, 74.6791, 37.3144, 37.3071,-0.0575423 - 0.777,-7.61761,-10.1319,0.286905, 74.7785, 37.3603, 37.3606,-0.057572 - 0.778,-7.62768, -10,0.706915, 74.8766, 37.4039, 37.4158,-0.0569254 - 0.779,-7.63757, -9.787,0.975637, 74.9726, 37.4488, 37.4679,-0.0558804 - 0.78,-7.64726,-9.58408, 1.07579, 75.0666, 37.4993, 37.5124,-0.0548851 - 0.781,-7.65679,-9.47818, 1.02381, 75.1596, 37.5552, 37.55,-0.0543656 - 0.782,-7.66628,-9.51453,0.859212, 75.2529, 37.6106, 37.5878,-0.0545439 - 0.783,-7.67588,-9.67739,0.630132, 75.3478, 37.6584, 37.6341,-0.0553428 - 0.784,-7.68567,-9.89684,0.379539, 75.4449, 37.6981, 37.6904,-0.0564191 - 0.785,-7.69565,-10.0788,0.135899, 75.5438, 37.7365, 37.75,-0.0573117 - 0.786,-7.70577,-10.1454,-0.0894231, 75.6433, 37.7816, 37.8041,-0.0576385 - 0.787,-7.71587,-10.0683,-0.298064, 75.7421, 37.8347, 37.8502,-0.0572601 - 0.788,-7.72585,-9.88063,-0.49596, 75.839, 37.8902, 37.8925,-0.0563396 - 0.789,-7.73562,-9.66295,-0.683563, 75.9338, 37.9423, 37.9363,-0.0552719 - 0.79,-7.74521,-9.50854,-0.848744, 76.0271, 37.9904, 37.9822,-0.0545145 - 0.791, -7.7547,-9.48343,-0.965234, 76.1201, 38.0375, 38.0282,-0.0543914 - 0.792,-7.76424,-9.59823,-0.997627, 76.2143, 38.0854, 38.0739,-0.0549545 - 0.793,-7.77394,-9.80358,-0.911751, 76.3105, 38.1324, 38.1221,-0.0559617 - 0.794,-7.78385,-10.0114,-0.687374, 76.4087, 38.1766, 38.1751,-0.0569812 - 0.795,-7.79392,-10.1327,-0.32919, 76.5081, 38.2191, 38.2314,-0.0575762 - 0.796,-7.80405,-10.1157,0.127696, 76.6073, 38.2639, 38.2859,-0.0574925 - 0.797,-7.81409, -9.9677,0.620187, 76.7051, 38.3143, 38.334,-0.0567667 - 0.798,-7.82395,-9.75237, 1.0677, 76.8008, 38.3698, 38.3753,-0.0557105 - 0.799,-7.83361, -9.562, 1.38854, 76.8946, 38.4264, 38.4134,-0.0547768 - 0.8,-7.84313,-9.47808, 1.51823, 76.9876, 38.4787, 38.4544,-0.0543652 - 0.801,-7.85263,-9.53644, 1.42492, 77.0811, 38.5241, 38.5024,-0.0546514 - 0.802,-7.86226,-9.71188, 1.1178, 77.1764, 38.5642, 38.5567,-0.055512 - 0.803,-7.87208,-9.92914,0.646136, 77.2738, 38.6046, 38.6126,-0.0565776 - 0.804,-7.88209,-10.0951,0.0889257, 77.3728, 38.65, 38.6655,-0.0573916 - 0.805,-7.89221,-10.1387,-0.462104, 77.4723, 38.7003, 38.7144,-0.0576057 - 0.806, -7.9023,-10.0415,-0.921939, 77.5708, 38.7518, 38.7619,-0.0571288 - 0.807,-7.91224,-9.84527,-1.22915, 77.6674, 38.8016, 38.8096,-0.0561662 - 0.808,-7.92198,-9.63415,-1.35613, 77.7619, 38.8513, 38.8554,-0.0551307 - 0.809,-7.93155,-9.49862,-1.31041, 77.8551, 38.9036, 38.897,-0.0544659 - 0.81,-7.94104,-9.49661,-1.12753, 77.9482, 38.9571, 38.9366,-0.0544561 - 0.811,-7.95061,-9.62884,-0.857933, 78.0427, 39.0066, 38.981,-0.0551046 - 0.812,-7.96034, -9.8385,-0.552153, 78.1392, 39.0487, 39.0344,-0.056133 - 0.813,-7.97028,-10.0357,-0.248624, 78.2376, 39.0869, 39.0937,-0.0571002 - 0.814,-7.98036, -10.136,0.0325253, 78.3371, 39.1287, 39.1508,-0.0575921 - 0.815,-7.99048,-10.0965,0.288432, 78.4361, 39.1782, 39.2005,-0.0573986 - 0.816,-8.00049,-9.93439,0.526253, 78.5336, 39.2324, 39.2446,-0.0566034 - 0.817,-8.01032,-9.71919,0.752723, 78.6289, 39.2854, 39.2879,-0.0555478 - 0.818,-8.01995,-9.54314, 0.96451, 78.7225, 39.3351, 39.3327,-0.0546843 - 0.819,-8.02947,-9.48161, 1.143, 78.8156, 39.3839, 39.3773,-0.0543825 - 0.82,-8.03899,-9.56081, 1.25564, 78.9094, 39.434, 39.4206,-0.0547709 - 0.821,-8.04864,-9.74664, 1.26388, 79.005, 39.4843, 39.465,-0.0556824 - 0.822,-8.05849,-9.95938, 1.13526, 79.1027, 39.5317, 39.5143,-0.0567259 - 0.823,-8.06853,-10.1079,0.856073, 79.2018, 39.5748, 39.5696,-0.0574544 - 0.824,-8.07865,-10.1286,0.440224, 79.3012, 39.6162, 39.6274,-0.0575561 - 0.825,-8.08872,-10.0129,-0.0686825, 79.3994, 39.66, 39.6824,-0.0569882 - 0.826,-8.09863,-9.81035,-0.60339, 79.4957, 39.7084, 39.7312,-0.0559949 - 0.827,-8.10834,-9.60794,-1.08589, 79.5899, 39.7606, 39.7743,-0.0550021 - 0.828,-8.11789,-9.49231,-1.44389, 79.683, 39.8137, 39.8149,-0.054435 - 0.829,-8.12739, -9.5129,-1.62637, 79.7763, 39.865, 39.8568,-0.0545359 - 0.83,-8.13698,-9.66071,-1.61411, 79.8711, 39.9142, 39.9016,-0.055261 - 0.831,-8.14674,-9.87229,-1.42217, 79.968, 39.9633, 39.9484,-0.0562987 - 0.832,-8.15671,-10.0569,-1.09402, 80.0666, 40.0132, 39.9962,-0.0572044 - 0.833, -8.1668,-10.1356,-0.689188, 80.1661, 40.0625, 40.046,-0.0575902 - 0.834,-8.17691,-10.0747,-0.268101, 80.2649, 40.1077, 40.0999,-0.0572915 - 0.835, -8.1869, -9.9005,0.121367, 80.362, 40.1481, 40.1575,-0.0564371 - 0.836,-8.19669,-9.68775,0.451956, 80.4571, 40.188, 40.2136,-0.0553936 - 0.837, -8.2063,-9.52762,0.717763, 80.5505, 40.2332, 40.2627,-0.0546081 - 0.838,-8.21581,-9.48863, 0.92808, 80.6436, 40.2852, 40.3039,-0.0544169 - 0.839,-8.22534,-9.58733, 1.09695, 80.7377, 40.3399, 40.3428,-0.054901 - 0.84,-8.23503,-9.78129, 1.23232, 80.8336, 40.3927, 40.385,-0.0558524 - 0.841,-8.24491,-9.98731, 1.32873, 80.9316, 40.4436, 40.4311,-0.0568629 - 0.842,-8.25496,-10.1171, 1.36611, 81.0308, 40.4956, 40.4777,-0.0574998 - 0.843,-8.26508,-10.1153, 1.31539, 81.1301, 40.5489, 40.5237,-0.0574906 - 0.844,-8.27513,-9.98264, 1.14898, 81.228, 40.5987, 40.5725,-0.05684 - 0.845,-8.28501,-9.77623,0.852768, 81.3239, 40.6405, 40.6276,-0.0558276 - 0.846,-8.29469,-9.58452,0.435554, 81.4179, 40.6762, 40.6868,-0.0548872 - 0.847,-8.30423,-9.48962,-0.0675876, 81.511, 40.7133, 40.7433,-0.0544217 - 0.848,-8.31374,-9.53205,-0.599404, 81.6045, 40.7577, 40.7922,-0.0546299 - 0.849,-8.32335,-9.69349,-1.09131, 81.6996, 40.8093, 40.8349,-0.0554217 - 0.85,-8.33315,-9.90464,-1.47803, 81.7968, 40.8638, 40.8765,-0.0564574 - 0.851,-8.34314, -10.075, -1.7118, 81.8956, 40.9186, 40.9197,-0.0572931 - 0.852,-8.35324,-10.1317,-1.77218, 81.995, 40.9741, 40.9633,-0.057571 - 0.853,-8.36333,-10.0505,-1.66856, 82.0936, 41.0303, 41.0061,-0.0571728 - 0.854,-8.37329,-9.86639,-1.43492, 82.1904, 41.0844, 41.0497,-0.0562698 - 0.855,-8.38305,-9.65836,-1.11869, 82.2851, 41.1321, 41.0978,-0.0552494 - 0.856,-8.39264,-9.51553,-0.76725, 82.3785, 41.1719, 41.152,-0.0545488 - 0.857,-8.40215,-9.49899,-0.416292, 82.4717, 41.2073, 41.2099,-0.0544677 - 0.858,-8.41171,-9.61568,-0.0835414, 82.566, 41.2439, 41.2671,-0.0550401 - 0.859,-8.42142,-9.81547,0.230551, 82.6623, 41.2863, 41.32,-0.0560201 - 0.86,-8.43134,-10.0127,0.535817, 82.7605, 41.3352, 41.3683,-0.0569874 - 0.861, -8.4414,-10.1229,0.841853, 82.8598, 41.3888, 41.4135,-0.0575278 - 0.862,-8.45151,-10.0989, 1.14787, 82.9589, 41.444, 41.4575,-0.0574102 - 0.863,-8.46154,-9.95122, 1.43668, 83.0565, 41.4994, 41.5004,-0.0566859 - 0.864,-8.47139,-9.74323, 1.67506, 83.1521, 41.5547, 41.5417,-0.0556657 - 0.865,-8.48104,-9.56408, 1.82085, 83.2459, 41.6094, 41.5818,-0.054787 - 0.866,-8.49057,-9.49047, 1.83442, 83.339, 41.6606, 41.624,-0.0544259 - 0.867,-8.50009,-9.55381, 1.69106, 83.4327, 41.7058, 41.6723,-0.0547366 - 0.868,-8.50973,-9.72681, 1.39019, 83.5282, 41.7453, 41.7273,-0.0555852 - 0.869,-8.51956,-9.93524,0.958187, 83.6256, 41.784, 41.785,-0.0566075 - 0.87,-8.52957,-10.0898,0.443931, 83.7246, 41.8267, 41.8406,-0.0573656 - 0.871,-8.53968,-10.1243,-0.0919024, 83.8239, 41.8737, 41.8927,-0.0575349 - 0.872,-8.54976,-10.0242,-0.590503, 83.9223, 41.9213, 41.944,-0.0570438 - 0.873,-8.55968,-9.83241,-1.00744, 84.0187, 41.967, 41.9956,-0.0561032 - 0.874,-8.56942,-9.63127,-1.32036, 84.1132, 42.0134, 42.0447,-0.0551165 - 0.875,-8.57898,-9.50691,-1.52966, 84.2065, 42.0648, 42.0871,-0.0545066 - 0.876,-8.58849,-9.51251,-1.65241, 84.2998, 42.1215, 42.1238,-0.054534 - 0.877,-8.59807,-9.64553,-1.71178, 84.3944, 42.1785, 42.1608,-0.0551865 - 0.878,-8.60782,-9.84885,-1.72584, 84.491, 42.2313, 42.2036,-0.0561838 - 0.879,-8.61776,-10.0353,-1.69943, 84.5895, 42.2808, 42.2516,-0.0570983 - 0.88,-8.62784, -10.125,-1.62212, 84.6888, 42.3305, 42.3008,-0.0575384 - 0.881,-8.63794,-10.0797,-1.47264, 84.7877, 42.3807, 42.3497,-0.0573162 - 0.882,-8.64794,-9.91894, -1.2285, 84.885, 42.427, 42.4014,-0.0565276 - 0.883,-8.65776,-9.71168,-0.877097, 84.9803, 42.4661, 42.4586,-0.0555109 - 0.884,-8.66739,-9.54677,-0.424753, 85.0739, 42.5005, 42.5187,-0.0547021 - 0.885,-8.67691,-9.49479,0.0998937, 85.1671, 42.5372, 42.5755,-0.0544471 - 0.886,-8.68645,-9.57789,0.649352, 85.261, 42.5808, 42.6253,-0.0548547 - 0.887,-8.69611,-9.76031, 1.16682, 85.3568, 42.6307, 42.6703,-0.0557495 - 0.888,-8.70598,-9.96381, 1.59892, 85.4545, 42.6836, 42.7142,-0.0567477 - 0.889,-8.71601,-10.1012, 1.9076, 85.5536, 42.7384, 42.7578,-0.0574216 - 0.89,-8.72612,-10.1137, 2.07763, 85.6528, 42.7961, 42.7992,-0.0574829 - 0.891,-8.73617,-9.99611, 2.1173, 85.7509, 42.8563, 42.8377,-0.0569061 - 0.892,-8.74607,-9.79893, 2.05241, 85.847, 42.915, 42.876,-0.0559389 - 0.893,-8.75577,-9.60671, 1.91562, 85.9412, 42.9678, 42.9185,-0.0549961 - 0.894,-8.76533,-9.50179, 1.73492, 86.0345, 43.0129, 42.9671,-0.0544814 - 0.895,-8.77484, -9.529, 1.525, 86.1279, 43.053, 43.0203,-0.0546149 - 0.896,-8.78444,-9.67654, 1.28442, 86.2229, 43.092, 43.0755,-0.0553386 - 0.897,-8.79422,-9.88109,0.999353, 86.3198, 43.1325, 43.1309,-0.0563419 - 0.898,-8.80419, -10.055, 0.65245, 86.4184, 43.1745, 43.1867,-0.0571947 - 0.899,-8.81428,-10.1237,0.233659, 86.5178, 43.217, 43.2433,-0.0575319 - 0.9,-8.82437, -10.058,-0.250953, 86.6164, 43.26, 43.2992,-0.0572097 - 0.901,-8.83434,-9.88616,-0.775542, 86.7134, 43.3052, 43.3519,-0.0563668 - 0.902,-8.84413,-9.68187,-1.29749, 86.8084, 43.3543, 43.3987,-0.0553648 - 0.903,-8.85373, -9.5327,-1.76628, 86.9019, 43.4074, 43.4399,-0.054633 - 0.904,-8.86325,-9.50246,-2.13538, 86.9951, 43.462, 43.4787,-0.0544848 - 0.905,-8.87281,-9.60399,-2.37344, 87.0893, 43.5161, 43.5182,-0.0549828 - 0.906, -8.8825,-9.79365, -2.471, 87.1854, 43.5705, 43.559,-0.055913 - 0.907, -8.8924, -9.9901,-2.44074, 87.2834, 43.6271, 43.5994,-0.0568766 - 0.908,-8.90245,-10.1092,-2.31122, 87.3826, 43.6857, 43.6394,-0.0574607 - 0.909,-8.91255, -10.1,-2.11631, 87.4817, 43.7417, 43.6825,-0.0574156 - 0.91,-8.92258,-9.96659,-1.88401, 87.5794, 43.7902, 43.7325,-0.0567613 - 0.911,-8.93245,-9.76626, -1.6283, 87.6752, 43.8305, 43.7889,-0.0557787 - 0.912,-8.94213,-9.58489,-1.34684, 87.7693, 43.8673, 43.8471,-0.054889 - 0.913,-8.95167,-9.50013,-1.02508, 87.8625, 43.9047, 43.9033,-0.0544733 - 0.914,-8.96119, -9.5482,-0.645299, 87.9561, 43.9427, 43.9587,-0.0547091 - 0.915,-8.97082,-9.70835,-0.197194, 88.0514, 43.9799, 44.016,-0.0554946 - 0.916,-8.98063,-9.91187,0.313684, 88.1486, 44.0177, 44.0744,-0.0564929 - 0.917,-8.99062,-10.0715,0.862756, 88.2474, 44.0615, 44.1287,-0.057276 - 0.918,-9.00072, -10.119, 1.40975, 88.3467, 44.1142, 44.175,-0.0575088 - 0.919,-9.01079, -10.034, 1.90756, 88.4451, 44.1726, 44.2154,-0.0570922 - 0.92,-9.02074,-9.85323, 2.31372, 88.5418, 44.2303, 44.2552,-0.0562053 - 0.921,-9.03049,-9.65409, 2.60069, 88.6365, 44.2849, 44.2963,-0.0552285 - 0.922,-9.04008,-9.52195, 2.76159, 88.7299, 44.3393, 44.336,-0.0545803 - 0.923, -9.0496,-9.51334, 2.8095, 88.8232, 44.3966, 44.3721,-0.0545381 - 0.924,-9.05917, -9.6318, 2.77061, 88.9177, 44.4552, 44.4074,-0.0551192 - 0.925, -9.0689,-9.82647, 2.67384, 89.0141, 44.5105, 44.4475,-0.056074 - 0.926,-9.07882,-10.0139, 2.54024, 89.1123, 44.5604, 44.495,-0.0569932 - 0.927,-9.08888,-10.1137, 2.37615, 89.2116, 44.6073, 44.5467,-0.0574831 - 0.928,-9.09898,-10.0834, 2.17221, 89.3105, 44.654, 44.5992,-0.0573343 - 0.929,-9.10899,-9.93598, 1.90851, 89.4079, 44.6987, 44.6526,-0.0566112 - 0.93,-9.11883,-9.73476, 1.56412, 89.5034, 44.7378, 44.71,-0.0556241 - 0.931,-9.12848,-9.56598, 1.1275, 89.5973, 44.7706, 44.7719,-0.0547963 - 0.932,-9.13801, -9.5019,0.604043, 89.6905, 44.8014, 44.8346,-0.054482 - 0.933,-9.14755,-9.56987,0.018132, 89.7844, 44.8358, 44.8937,-0.0548154 - 0.934, -9.1572,-9.74062,-0.591158, 89.8799, 44.8762, 44.9481,-0.0556529 - 0.935,-9.16704,-9.94091,-1.17933, 89.9775, 44.9212, 44.9996,-0.0566353 - 0.936,-9.17706,-10.0849,-1.70758, 90.0764, 44.9695, 45.0496,-0.0573416 - 0.937,-9.18715, -10.111,-2.15196, 90.1756, 45.0214, 45.0967,-0.0574696 - 0.938,-9.19721,-10.0081,-2.50762, 90.2738, 45.078, 45.1388,-0.056965 - 0.939,-9.20713, -9.8205,-2.78664, 90.3701, 45.1384, 45.1757,-0.0560447 - 0.94,-9.21685,-9.62858,-3.01039, 90.4645, 45.1997, 45.2098,-0.0551033 - 0.941,-9.22642,-9.51457,-3.19921, 90.5579, 45.2592, 45.2441,-0.0545441 - 0.942,-9.23594,-9.52723, -3.3629, 90.6513, 45.3166, 45.2801,-0.0546062 - 0.943,-9.24554, -9.661,-3.49561, 90.7461, 45.3733, 45.3176,-0.0552623 - 0.944, -9.2553,-9.85845,-3.57672, 90.8428, 45.4307, 45.3559,-0.0562309 - 0.945,-9.26525,-10.0349,-3.57749, 90.9413, 45.4882, 45.396,-0.0570965 - 0.946,-9.27532,-10.1149,-3.47111, 91.0405, 45.5426, 45.4404,-0.0574887 - 0.947,-9.28541,-10.0642,-3.24259, 91.1392, 45.591, 45.4909,-0.0572399 - 0.948,-9.29539,-9.90461,-2.89501, 91.2364, 45.6331, 45.5469,-0.0564573 - 0.949, -9.3052,-9.70471,-2.44992, 91.3316, 45.6708, 45.6054,-0.0554768 - 0.95,-9.31483,-9.55011,-1.94164, 91.4253, 45.7061, 45.6645,-0.0547185 - 0.951,-9.32435,-9.50701, -1.4076, 91.5186, 45.739, 45.7251,-0.054507 - 0.952,-9.33391,-9.59373,-0.877833, 91.6127, 45.7689, 45.7889,-0.0549324 - 0.953,-9.34359, -9.773,-0.367431, 91.7085, 45.7979, 45.8548,-0.0558117 - 0.954,-9.35346,-9.96793,0.125541, 91.8063, 45.8309, 45.9186,-0.0567679 - 0.955,-9.36349, -10.095,0.616024, 91.9054, 45.8709, 45.9771,-0.0573912 - 0.956,-9.37359,-10.0999, 1.12333, 92.0044, 45.916, 46.031,-0.057415 - 0.957,-9.38363,-9.98056, 1.66099, 92.1023, 45.9621, 46.0834,-0.0568298 - 0.958,-9.39351,-9.78832, 2.22878, 92.1984, 46.0079, 46.1346,-0.0558869 - 0.959,-9.40321,-9.60556, 2.80975, 92.2926, 46.0566, 46.181,-0.0549904 - 0.96,-9.41277,-9.51057, 3.37326, 92.3859, 46.1117, 46.2197,-0.0545245 - 0.961,-9.42229,-9.54393, 3.88316, 92.4795, 46.1722, 46.2527,-0.0546882 - 0.962,-9.43191,-9.69123, 4.30804, 92.5746, 46.2343, 46.2849,-0.0554107 - 0.963, -9.4417,-9.88926, 4.63009, 92.6716, 46.2968, 46.3184,-0.056382 - 0.964,-9.45167,-10.0531, 4.84936, 92.7702, 46.3627, 46.3504,-0.0571857 - 0.965,-9.46176,-10.1127, 4.98208, 92.8694, 46.4337, 46.3783,-0.0574778 - 0.966,-9.47183,-10.0425, 5.05344, 92.968, 46.5062, 46.4046,-0.0571337 - 0.967,-9.48179,-9.87283, 5.08773, 93.0648, 46.5735, 46.435,-0.0563014 - 0.968,-9.49157,-9.67641, 5.09896, 93.1597, 46.6326, 46.4717,-0.0553379 - 0.969,-9.50117,-9.53741, 5.08565, 93.2533, 46.6867, 46.5119,-0.0546562 - 0.97, -9.5107,-9.51532, 5.03127, 93.3466, 46.7396, 46.5525,-0.0545478 - 0.971,-9.52027,-9.61948, 4.91047, 93.441, 46.7908, 46.5951,-0.0550587 - 0.972,-9.52998,-9.80514, 4.69852, 93.5372, 46.8367, 46.6445,-0.0559694 - 0.973,-9.53988,-9.99269, 4.38083, 93.6352, 46.8762, 46.7021,-0.0568893 - 0.974,-9.54993,-10.1018, 3.95902, 93.7343, 46.9123, 46.7646,-0.0574245 - 0.975,-9.56002,-10.0858, 3.45136, 93.8333, 46.948, 46.8279,-0.057346 - 0.976,-9.57004,-9.95167, 2.88745, 93.9309, 46.9815, 46.8927,-0.0566881 - 0.977,-9.57989, -9.757, 2.29903, 94.0266, 47.0088, 46.9621,-0.0557333 - 0.978,-9.58956,-9.58523, 1.71017, 94.1206, 47.0288, 47.037,-0.0548907 - 0.979,-9.59911,-9.50992, 1.13028, 94.2139, 47.0456, 47.1138,-0.0545213 - 0.98,-9.60865,-9.56322,0.552496, 94.3077, 47.0643, 47.1886,-0.0547828 - 0.981,-9.61829,-9.72218,-0.0421727, 94.4031, 47.0865, 47.2611,-0.0555625 - 0.982,-9.62811,-9.91859,-0.676277, 94.5004, 47.1105, 47.3334,-0.0565259 - 0.983, -9.6381,-10.0683, -1.3662, 94.5992, 47.1355, 47.4064,-0.0572601 - 0.984,-9.64819,-10.1072,-2.11467, 94.6983, 47.1635, 47.4774,-0.057451 - 0.985,-9.65826,-10.0188,-2.90826, 94.7966, 47.1965, 47.5431,-0.0570172 - 0.986,-9.66819,-9.84098,-3.72069, 94.8932, 47.2342, 47.6028,-0.0561452 - 0.987,-9.67793,-9.65012,-4.52085, 94.9878, 47.2743, 47.6583,-0.055209 - 0.988,-9.68752,-9.52794, -5.2826, 95.0813, 47.3161, 47.7106,-0.0546097 - 0.989,-9.69705, -9.5267,-5.99278, 95.1748, 47.3615, 47.7587,-0.0546036 - 0.99,-9.70663,-9.64682,-6.65469, 95.2694, 47.4141, 47.8001,-0.0551928 - 0.991,-9.71638,-9.83671,-7.28575, 95.3659, 47.4757, 47.8341,-0.0561242 - 0.992, -9.7263, -10.015,-7.91016, 95.4641, 47.5453, 47.8618,-0.0569986 - 0.993,-9.73636,-10.1053, -8.5493, 95.5633, 47.6208, 47.885,-0.0574414 - 0.994,-9.74645, -10.069,-9.21326, 95.662, 47.7009, 47.9039,-0.0572635 - 0.995,-9.75644,-9.92179,-9.89654, 95.7594, 47.7857, 47.9172,-0.0565415 - 0.996,-9.76627,-9.72687,-10.5796, 95.8548, 47.8757, 47.9235,-0.0555855 - 0.997,-9.77592,-9.56776,-11.2353, 95.9487, 47.9704, 47.9234,-0.054805 - 0.998,-9.78546,-9.51257,-11.8385, 96.042, 48.0683, 47.9191,-0.0545343 - 0.999, -9.795,-9.58484,-12.3748, 96.136, 48.169, 47.9121,-0.0548888 - 1,-9.80467,-9.75349,-12.8451, 96.2317, 48.2744, 47.9016,-0.055716 - 1.001,-9.81452,-9.94618,-13.2656, 96.3293, 48.387, 47.8856,-0.0566612 - 1.002,-9.82454,-10.0803,-13.6615, 96.4281, 48.5068, 47.864,-0.0573192 - 1.003,-9.83463,-10.0986,-14.0578, 96.5272, 48.6306, 47.8392,-0.0574086 - 1.004,-9.84467,-9.99316,-14.4705, 96.6252, 48.7547, 47.8136,-0.0568916 - 1.005,-9.85457, -9.8094,-14.9008, 96.7215, 48.8786, 47.7869,-0.0559903 - 1.006,-9.86429,-9.62609, -15.335, 96.8159, 49.0047, 47.7562,-0.0550911 - 1.007,-9.87386,-9.52173,-15.7495, 96.9093, 49.1342, 47.7206,-0.0545793 - 1.008, -9.8834,-9.54096, -16.12, 97.0029, 49.2655, 47.6828,-0.0546736 - 1.009, -9.893,-9.67542,-16.4299, 97.0978, 49.3966, 47.6459,-0.0553331 - 1.01,-9.90278,-9.86739,-16.6772, 97.1946, 49.5287, 47.6097,-0.0562747 - 1.011,-9.91273,-10.0346,-16.8752, 97.2931, 49.6654, 47.5706,-0.0570948 - 1.012, -9.9228,-10.1054,-17.0478, 97.3922, 49.8077, 47.5271,-0.0574422 - 1.013,-9.93287,-10.0496,-17.2212, 97.4908, 49.9515, 47.4821,-0.0571686 - 1.014,-9.94284,-9.89125,-17.4148, 97.5878, 50.0921, 47.4393,-0.0563917 - 1.015,-9.95264,-9.69822,-17.6343, 97.683, 50.2293, 47.3982,-0.0554449 - 1.016,-9.96227,-9.55326,-17.8704, 97.7767, 50.3672, 47.3548,-0.0547339 - 1.017, -9.9718,-9.51843, -18.102, 97.8701, 50.5082, 47.3073,-0.054563 - 1.018,-9.98136,-9.60852,-18.3047, 97.9643, 50.6505, 47.2588,-0.055005 - 1.019,-9.99106,-9.78483,-18.4598, 98.0603, 50.7913, 47.2132,-0.0558698 - 1.02,-10.0009,-9.97175,-18.5616, 98.1581, 50.9316, 47.1698,-0.0567866 - 1.021, -10.011,-10.0892,-18.6193, 98.2571, 51.0753, 47.1244,-0.0573627 - 1.022,-10.0211,-10.0869,-18.6544, 98.3561, 51.2235, 47.0752,-0.0573516 - 1.023,-10.0311,-9.96604,-18.6928, 98.4538, 51.3719, 47.0252,-0.0567586 - 1.024, -10.041,-9.77842,-18.7555, 98.5497, 51.5156, 46.9784,-0.0558383 - 1.025,-10.0506,-9.60452,-18.8515, 98.644, 51.6551, 46.9339,-0.0549853 - 1.026,-10.0602, -9.5188,-18.9747, 98.7373, 51.7952, 46.8876,-0.0545649 - 1.027,-10.0697,-9.55791,-19.1063, 98.8311, 51.9386, 46.8377,-0.0547567 - 1.028,-10.0794,-9.70496, -19.222, 98.9263, 52.0835, 46.7873,-0.055478 - 1.029,-10.0892,-9.89687,-19.3013, 99.0234, 52.227, 46.74,-0.0564193 - 1.03,-10.0992,-10.0514,-19.3347, 99.122, 52.3699, 46.6949,-0.0571772 - 1.031,-10.1092,-10.1023,-19.3279, 99.2211, 52.5155, 46.6482,-0.0574271 - 1.032,-10.1193, -10.028,-19.2995, 99.3195, 52.6642, 46.5983,-0.0570626 - 1.033,-10.1292,-9.86038, -19.274, 99.4162, 52.8121, 46.5479,-0.0562403 - 1.034, -10.139,-9.67133,-19.2737, 99.5111, 52.9555, 46.5002,-0.055313 - 1.035,-10.1486,-9.54185, -19.31, 99.6047, 53.0953, 46.4547,-0.054678 - 1.036,-10.1581,-9.52737,-19.3797, 99.6982, 53.2358, 46.4078,-0.0546069 - 1.037,-10.1677,-9.63397,-19.4663, 99.7927, 53.3795, 46.3581,-0.0551298 - 1.038,-10.1775,-9.81587,-19.5461, 99.889, 53.525, 46.3079,-0.056022 - 1.039,-10.1874,-9.99508,-19.5972, 99.987, 53.6701, 46.26,-0.0569011 - 1.04,-10.1974,-10.0948,-19.6075, 100.086, 53.8146, 46.214,-0.0573904 - 1.041,-10.2075,-10.0725,-19.5792, 100.185, 53.9606, 46.167,-0.0572807 - 1.042,-10.2175,-9.93771,-19.5281, 100.282, 54.108, 46.1177,-0.0566196 - 1.043,-10.2273,-9.74836,-19.4776, 100.378, 54.2545, 46.0678,-0.0556909 - 1.044, -10.237,-9.58559,-19.4503, 100.472, 54.3975, 46.0197,-0.0548925 - 1.045,-10.2466,-9.51911,-19.4598, 100.565, 54.5377, 45.9731,-0.0545664 - 1.046,-10.2561, -9.5773,-19.5056, 100.659, 54.6784, 45.9261,-0.0548518 - 1.047,-10.2658,-9.73512,-19.5735, 100.755, 54.8219, 45.8773,-0.0556259 - 1.048,-10.2756,-9.92486,-19.6408, 100.852, 54.968, 45.8277,-0.0565566 - 1.049,-10.2856,-10.0652, -19.685, 100.951, 55.1145, 45.7792,-0.057245 - 1.05,-10.2957,-10.0961,-19.6917, 101.05, 55.2605, 45.7321,-0.0573966 - 1.051,-10.3057,-10.0044,-19.6604, 101.148, 55.406, 45.6852,-0.0569468 - 1.052,-10.3156,-9.82953,-19.6043, 101.245, 55.5515, 45.637,-0.056089 - 1.053,-10.3254,-9.64644,-19.5455, 101.339, 55.6964, 45.5876,-0.055191 - 1.054, -10.335,-9.53359,-19.5068, 101.433, 55.8395, 45.5386,-0.0546374 - 1.055,-10.3445,-9.53925,-19.5035, 101.526, 55.9805, 45.4911,-0.0546652 - 1.056,-10.3541,-9.66089,-19.5375, 101.621, 56.1214, 45.4444,-0.0552618 - 1.057,-10.3639,-9.84628,-19.5968, 101.718, 56.2648, 45.3967,-0.0561712 - 1.058,-10.3738, -10.016,-19.6601, 101.816, 56.4116, 45.3474,-0.0570035 - 1.059,-10.3838,-10.0973,-19.7045, 101.915, 56.5597, 45.2979,-0.0574022 - 1.06,-10.3939,-10.0554,-19.7141, 102.014, 56.7063, 45.2501,-0.057197 - 1.061,-10.4039,-9.90849,-19.6861, 102.111, 56.8507, 45.2036,-0.0564763 - 1.062,-10.4137,-9.71951,-19.6313, 102.206, 56.9942, 45.1564,-0.0555494 - 1.063,-10.4234,-9.56947,-19.5705, 102.3, 57.1381, 45.1071,-0.0548134 - 1.064,-10.4329,-9.52261,-19.5265, 102.393, 57.2817, 45.0572,-0.0545836 - 1.065,-10.4425, -9.5989,-19.5158, 102.488, 57.4235, 45.0091,-0.0549578 - 1.066,-10.4521,-9.76555,-19.5425, 102.583, 57.5647, 44.963,-0.0557752 - 1.067, -10.462,-9.95108,-19.5967, 102.681, 57.7082, 44.9161,-0.0566852 - 1.068, -10.472, -10.076,-19.6582, 102.78, 57.8559, 44.8667,-0.057298 - 1.069,-10.4821,-10.0869,-19.7045, 102.879, 58.0051, 44.8164,-0.0573512 - 1.07,-10.4921,-9.97911,-19.7184, 102.977, 58.1517, 44.7683,-0.0568227 - 1.071, -10.502,-9.79902,-19.6951, 103.073, 58.2945, 44.7224,-0.0559393 - 1.072,-10.5117, -9.6238,-19.6434, 103.167, 58.4364, 44.6758,-0.0550799 - 1.073,-10.5213, -9.5285,-19.5829, 103.261, 58.5799, 44.6262,-0.0546125 - 1.074,-10.5308,-9.55389, -19.536, 103.354, 58.7241, 44.5756,-0.054737 - 1.075,-10.5405,-9.68896,-19.5203, 103.45, 58.8666, 44.5275,-0.0553995 - 1.076,-10.5503,-9.87575,-19.5415, 103.546, 59.0081, 44.482,-0.0563157 - 1.077,-10.5602,-10.0342,-19.5915, 103.645, 59.1523, 44.4354,-0.057093 - 1.078,-10.5703,-10.0965,-19.6518, 103.744, 59.3009, 44.3856,-0.0573984 - 1.079,-10.5803, -10.036,-19.6997, 103.842, 59.4504, 44.3348,-0.0571016 - 1.08,-10.5903,-9.87871,-19.7176, 103.939, 59.5961, 44.2868,-0.0563302 - 1.081,-10.6001,-9.69217,-19.6989, 104.034, 59.7374, 44.2415,-0.0554153 - 1.082,-10.6097,-9.55628,-19.6507, 104.128, 59.8784, 44.195,-0.0547487 - 1.083,-10.6192, -9.5292,-19.5912, 104.222, 60.022, 44.1449,-0.0546159 - 1.084,-10.6288,-9.62243,-19.5427, 104.316, 60.1668, 44.0941,-0.0550732 - 1.085,-10.6385,-9.79593,-19.5231, 104.412, 60.3098, 44.0463,-0.0559242 - 1.086,-10.6484,-9.97529,-19.5398, 104.51, 60.4521, 44.001,-0.056804 - 1.087,-10.6584,-10.0837,-19.5863, 104.609, 60.5971, 43.9544,-0.0573356 - 1.088,-10.6685,-10.0747,-19.6452, 104.708, 60.7462, 43.9042,-0.0572917 - 1.089,-10.6785,-9.95239,-19.6943, 104.805, 60.8951, 43.8535,-0.0566916 - 1.09,-10.6884,-9.76916,-19.7154, 104.901, 61.0395, 43.8058,-0.0557929 - 1.091,-10.6981,-9.60359,-19.7007, 104.995, 61.1798, 43.7606,-0.0549808 - 1.092,-10.7077, -9.5266,-19.6559, 105.089, 61.3205, 43.7137,-0.0546031 - 1.093,-10.7172,-9.57108,-19.5978, 105.183, 61.4644, 43.6635,-0.0548213 - 1.094,-10.7268,-9.71786,-19.5482, 105.278, 61.6095, 43.613,-0.0555413 - 1.095,-10.7367,-9.90399,-19.5258, 105.375, 61.7533, 43.5654,-0.0564542 - 1.096,-10.7466,-10.0497,-19.5387, 105.474, 61.8966, 43.52,-0.0571688 - 1.097,-10.7567,-10.0926,-19.5821, 105.573, 62.0425, 43.4729,-0.0573792 - 1.098,-10.7668,-10.0144,-19.6394, 105.671, 62.1913, 43.4228,-0.0569956 - 1.099,-10.7767,-9.84869,-19.6892, 105.768, 62.339, 43.3725,-0.056183 - 1.1,-10.7864, -9.6666,-19.7128, 105.862, 62.4821, 43.3251,-0.0552898 - 1.101,-10.7961, -9.5461,-19.7015, 105.956, 62.6221, 43.2794,-0.0546988 - 1.102,-10.8056,-9.53876,-19.6596, 106.05, 62.763, 43.232,-0.0546628 - 1.103,-10.8152,-9.64762,-19.6031, 106.144, 62.907, 43.1821,-0.0551967 - 1.104,-10.8249,-9.82594,-19.5531, 106.241, 63.0525, 43.1322,-0.0560714 - 1.105,-10.8348,-9.99727,-19.5285, 106.339, 63.1972, 43.0847,-0.0569118 - 1.106,-10.8449,-10.0882,-19.5384, 106.438, 63.3418, 43.0386,-0.0573579 - 1.107, -10.855,-10.0599,-19.5789, 106.536, 63.4881, 42.9912,-0.057219 - 1.108,-10.8649,-9.92457,-19.6347, 106.634, 63.6357, 42.9415,-0.0565552 - 1.109,-10.8748,-9.74027,-19.6848, 106.729, 63.7819, 42.8918,-0.0556512 - 1.11,-10.8844, -9.586,-19.7102, 106.823, 63.9243, 42.8442,-0.0548945 - 1.111, -10.894,-9.52783,-19.7016, 106.917, 64.0645, 42.7978,-0.0546092 - 1.112,-10.9036,-9.59059,-19.6623, 107.011, 64.2057, 42.7503,-0.054917 - 1.113,-10.9132,-9.74728,-19.6072, 107.107, 64.3499, 42.701,-0.0556856 - 1.114,-10.9231, -9.9307,-19.5572, 107.204, 64.4958, 42.6516,-0.0565853 - 1.115,-10.9331,-10.0622,-19.5311, 107.303, 64.6418, 42.6037,-0.0572305 - 1.116,-10.9431,-10.0856,-19.5386, 107.402, 64.7874, 42.5569,-0.0573451 - 1.117,-10.9532, -9.9909,-19.5767, 107.5, 64.9333, 42.5095,-0.0568805 - 1.118,-10.9631,-9.81877,-19.6311, 107.596, 65.0793, 42.4606,-0.0560362 - 1.119,-10.9728,-9.64304, -19.681, 107.691, 65.2241, 42.4113,-0.0551743 - 1.12,-10.9824,-9.53899,-19.7077, 107.784, 65.3664, 42.3631,-0.0546639 - 1.121,-10.9919,-9.55113,-19.7012, 107.878, 65.5071, 42.316,-0.0547234 - 1.122,-11.0016,-9.67415, -19.664, 107.973, 65.6486, 42.2688,-0.0553269 - 1.123,-11.0113,-9.85526,-19.6104, 108.069, 65.793, 42.2203,-0.0562152 - 1.124,-11.0213,-10.0168,-19.5606, 108.168, 65.9398, 42.1709,-0.0570077 - 1.125,-11.0313,-10.0896,-19.5335, 108.267, 66.087, 42.1223,-0.0573648 - 1.126,-11.0414,-10.0426,-19.5392, 108.365, 66.2329, 42.0751,-0.0571341 - 1.127,-11.0513,-9.89596,-19.5754, 108.462, 66.3777, 42.0282,-0.0564149 - 1.128,-11.0612,-9.71263,-19.6284, 108.558, 66.5221, 41.98,-0.0555156 - 1.129,-11.0708,-9.57117,-19.6779, 108.651, 66.6661, 41.9305,-0.0548218 - 1.13,-11.0803,-9.53215,-19.7053, 108.745, 66.8088, 41.8816,-0.0546303 - 1.131,-11.0899,-9.61219,-19.7003, 108.839, 66.9499, 41.8343,-0.0550229 - 1.132,-11.0996,-9.77689,-19.6649, 108.935, 67.0917, 41.7877,-0.0558308 - 1.133,-11.1095,-9.95564,-19.6127, 109.033, 67.2365, 41.7396,-0.0567076 - 1.134,-11.1195,-10.0718,-19.5634, 109.132, 67.3844, 41.69,-0.0572775 - 1.135,-11.1296,-10.0758,-19.5358, 109.23, 67.5325, 41.6407,-0.0572968 - 1.136,-11.1396,-9.96584,-19.5402, 109.328, 67.678, 41.5935,-0.0567576 - 1.137,-11.1495,-9.78925,-19.5749, 109.424, 67.8212, 41.5472,-0.0558915 - 1.138,-11.1592,-9.62171,-19.6265, 109.519, 67.9643, 41.4993,-0.0550697 - 1.139,-11.1688,-9.53497,-19.6755, 109.612, 68.1082, 41.4493,-0.0546442 - 1.14,-11.1783,-9.56613,-19.7032, 109.706, 68.2514, 41.3999,-0.054797 - 1.141,-11.1879,-9.70173,-19.6992, 109.801, 68.3929, 41.3529,-0.0554621 - 1.142,-11.1977,-9.88359,-19.6652, 109.898, 68.535, 41.3069,-0.0563542 - 1.143,-11.2077,-10.0338,-19.6141, 109.997, 68.6807, 41.2589,-0.0570908 - 1.144,-11.2177, -10.088,-19.5655, 110.096, 68.8296, 41.2086,-0.0573566 - 1.145,-11.2278, -10.023,-19.5378, 110.194, 68.9778, 41.1591,-0.0570381 - 1.146,-11.2377,-9.86689,-19.5414, 110.291, 69.1221, 41.1123,-0.0562723 - 1.147,-11.2475,-9.68652, -19.575, 110.386, 69.2638, 41.0665,-0.0553876 - 1.148,-11.2571,-9.55921,-19.6255, 110.48, 69.4064, 41.0184,-0.0547631 - 1.149,-11.2667,-9.53944,-19.6737, 110.573, 69.5506, 40.9678,-0.0546661 - 1.15,-11.2763,-9.63559,-19.7013, 110.668, 69.6942, 40.9183,-0.0551377 - 1.151, -11.286,-9.80637,-19.6978, 110.764, 69.836, 40.8718,-0.0559754 - 1.152,-11.2959,-9.97856,-19.6647, 110.862, 69.9787, 40.8261,-0.05682 - 1.153,-11.3059,-10.0784,-19.6147, 110.961, 70.1255, 40.7777,-0.0573097 - 1.154, -11.316,-10.0632,-19.5669, 111.059, 70.2751, 40.727,-0.0572349 - 1.155, -11.326,-9.93949,-19.5395, 111.157, 70.4225, 40.6776,-0.0566284 - 1.156,-11.3358,-9.76046,-19.5429, 111.253, 70.5653, 40.6315,-0.0557502 - 1.157,-11.3455, -9.6028,-19.5757, 111.347, 70.706, 40.5857,-0.0549769 - 1.158,-11.3551,-9.53405,-19.6252, 111.44, 70.8486, 40.537,-0.0546397 - 1.159,-11.3647,-9.58356,-19.6726, 111.534, 70.9932, 40.4862,-0.0548825 - 1.16,-11.3743,-9.73004,-19.6997, 111.63, 71.1371, 40.437,-0.055601 - 1.161,-11.3841,-9.91065,-19.6963, 111.727, 71.2794, 40.3911,-0.0564869 - 1.162,-11.3941, -10.048,-19.6638, 111.826, 71.4231, 40.3453,-0.0571605 - 1.163,-11.4042,-10.0832,-19.6147, 111.924, 71.5709, 40.2962,-0.0573335 - 1.164,-11.4142,-10.0014,-19.5678, 112.023, 71.7203, 40.2454,-0.0569322 - 1.165,-11.4241,-9.83767,-19.5411, 112.119, 71.8664, 40.1966,-0.056129 - 1.166,-11.4339,-9.66221,-19.5446, 112.214, 72.0078, 40.1508,-0.0552683 - 1.167,-11.4435, -9.5502,-19.5769, 112.308, 72.1482, 40.1047,-0.0547189 - 1.168, -11.453,-9.54959,-19.6256, 112.401, 72.2911, 40.0554,-0.0547159 - 1.169,-11.4627,-9.66053,-19.6719, 112.496, 72.4361, 40.0046,-0.0552601 - 1.17,-11.4724,-9.83541,-19.6982, 112.592, 72.5802, 39.9562,-0.0561179 - 1.171,-11.4823,-9.99926,-19.6945, 112.691, 72.7232, 39.9104,-0.0569215 - 1.172,-11.4924,-10.0819,-19.6623, 112.789, 72.8681, 39.864,-0.0573268 - 1.173,-11.5024, -10.048, -19.614, 112.888, 73.0164, 39.8145,-0.0571605 - 1.174,-11.5124,-9.91214,-19.5682, 112.985, 73.1648, 39.764,-0.0564942 - 1.175,-11.5222,-9.73267,-19.5424, 113.081, 73.3093, 39.7158,-0.0556139 - 1.176,-11.5319,-9.58648,-19.5464, 113.175, 73.4499, 39.67,-0.0548969 - 1.177,-11.5414,-9.53617,-19.5786, 113.268, 73.5905, 39.6233,-0.0546501 - 1.178, -11.551, -9.6032,-19.6265, 113.363, 73.7339, 39.5737,-0.0549789 - 1.179,-11.5607,-9.75877,-19.6718, 113.458, 73.8791, 39.5234,-0.0557419 - 1.18,-11.5705,-9.93616, -19.697, 113.556, 74.0237, 39.4755,-0.056612 - 1.181,-11.5805,-10.0593,-19.6926, 113.654, 74.1677, 39.4295,-0.0572162 - 1.182,-11.5906,-10.0756,-19.6604, 113.753, 74.3136, 39.3825,-0.057296 - 1.183,-11.6006,-9.97808,-19.6128, 113.851, 74.4615, 39.3329,-0.0568176 - 1.184,-11.6105,-9.80863,-19.5681, 113.947, 74.6084, 39.283,-0.0559865 - 1.185,-11.6203, -9.6399,-19.5436, 114.042, 74.7517, 39.2352,-0.0551589 - 1.186,-11.6298,-9.54419,-19.5484, 114.136, 74.892, 39.1889,-0.0546894 - 1.187,-11.6394,-9.56243,-19.5808, 114.229, 75.033, 39.1416,-0.0547789 - 1.188, -11.649,-9.68671,-19.6281, 114.324, 75.1768, 39.0922,-0.0553885 - 1.189,-11.6588, -9.8637,-19.6721, 114.421, 75.3224, 39.0426,-0.0562566 - 1.19,-11.6687,-10.0175,-19.6959, 114.519, 75.4677, 38.9948,-0.0570112 - 1.191,-11.6788,-10.0823,-19.6905, 114.618, 75.6128, 38.9482,-0.057329 - 1.192,-11.6888,-10.0304, -19.658, 114.717, 75.7589, 38.9008,-0.0570744 - 1.193,-11.6988,-9.88411, -19.611, 114.814, 75.9058, 38.8516,-0.0563567 - 1.194,-11.7086,-9.70618,-19.5676, 114.909, 76.0513, 38.8022,-0.055484 - 1.195,-11.7182,-9.57288,-19.5446, 115.003, 76.1937, 38.7543,-0.0548301 - 1.196,-11.7278,-9.54126,-19.5506, 115.096, 76.3343, 38.7075,-0.0546751 - 1.197,-11.7374, -9.6248,-19.5834, 115.191, 76.4758, 38.66,-0.0550848 - 1.198,-11.7471,-9.78761,-19.6301, 115.287, 76.62, 38.6111,-0.0558834 - 1.199, -11.757,-9.95987,-19.6727, 115.385, 76.7661, 38.5618,-0.0567283 - 1.2, -11.767,-10.0678,-19.6949, 115.483, 76.9124, 38.5137,-0.0572577 - 1.201, -11.777,-10.0652,-19.6882, 115.582, 77.0581, 38.4667,-0.0572449 - 1.202, -11.787,-9.95325,-19.6552, 115.68, 77.2038, 38.4193,-0.0566959 - 1.203,-11.7969,-9.78006,-19.6087, 115.776, 77.3493, 38.3706,-0.0558463 - 1.204,-11.8066,-9.61983,-19.5668, 115.87, 77.4936, 38.3214,-0.0550604 - 1.205,-11.8162, -9.5412,-19.5455, 115.964, 77.6359, 38.2731,-0.0546748 - 1.206,-11.8258,-9.57779,-19.5531, 116.058, 77.7768, 38.226,-0.0548542 - 1.207,-11.8354,-9.71383,-19.5864, 116.153, 77.9187, 38.1787,-0.0555215 - 1.208,-11.8452,-9.89095,-19.6325, 116.25, 78.0634, 38.1302,-0.0563903 - 1.209,-11.8552,-10.0332,-19.6737, 116.348, 78.2104, 38.0809,-0.0570882 - 1.21,-11.8652,-10.0798, -19.694, 116.447, 78.3576, 38.0324,-0.0573165 - 1.211,-11.8753,-10.0107,-19.6856, 116.545, 78.5033, 37.9852,-0.0569777 - 1.212,-11.8852,-9.85571, -19.652, 116.642, 78.6478, 37.9382,-0.0562174 - 1.213, -11.895,-9.68125,-19.6061, 116.737, 78.792, 37.8898,-0.0553617 - 1.214,-11.9046, -9.5621,-19.5657, 116.831, 78.9358, 37.8403,-0.0547772 - 1.215,-11.9141,-9.54924,-19.5465, 116.925, 79.0783, 37.7916,-0.0547142 - 1.216,-11.9237, -9.6481,-19.5557, 117.019, 79.2195, 37.7445,-0.0551991 - 1.217,-11.9335,-9.81624,-19.5898, 117.116, 79.3618, 37.6977,-0.0560238 - 1.218,-11.9434,-9.98156,-19.6354, 117.213, 79.5073, 37.6493,-0.0568347 - 1.219,-11.9534,-10.0733,-19.6749, 117.312, 79.6553, 37.5997,-0.0572845 - 1.22,-11.9635,-10.0521, -19.693, 117.411, 79.8029, 37.5508,-0.0571807 - 1.221,-11.9735,-9.92724,-19.6828, 117.508, 79.9478, 37.5039,-0.0565683 - 1.222,-11.9833,-9.75226,-19.6484, 117.604, 80.0909, 37.4573,-0.05571 - 1.223, -11.993,-9.60216,-19.6031, 117.698, 80.2343, 37.4088,-0.0549737 - 1.224,-12.0025,-9.54122,-19.5645, 117.792, 80.3782, 37.3589,-0.0546748 - 1.225,-12.0121,-9.59547,-19.5475, 117.886, 80.5209, 37.3101,-0.0549409 - 1.226,-12.0218,-9.74158,-19.5587, 117.981, 80.6624, 37.2634,-0.0556576 - 1.227,-12.0316,-9.91689,-19.5936, 118.079, 80.8052, 37.217,-0.0565175 - 1.228,-12.0416,-10.0463,-19.6386, 118.177, 80.9519, 37.1683,-0.0571521 - 1.229,-12.0517,-10.0743,-19.6762, 118.276, 81.1007, 37.1181,-0.0572897 - 1.23,-12.0617,-9.98911, -19.692, 118.374, 81.2479, 37.0693,-0.0568718 - 1.231,-12.0716,-9.82725,-19.6797, 118.471, 81.3914, 37.023,-0.0560778 - 1.232,-12.0813,-9.65813,-19.6444, 118.565, 81.5334, 36.9766,-0.0552483 - 1.233,-12.0909,-9.55421,-19.5997, 118.659, 81.6767, 36.9276,-0.0547386 - 1.234,-12.1005,-9.55995,-19.5631, 118.753, 81.8208, 36.8772,-0.0547667 - 1.235,-12.1101,-9.67281,-19.5486, 118.848, 81.9636, 36.8287,-0.0553203 - 1.236,-12.1199,-9.84435,-19.5619, 118.944, 82.1054, 36.7827,-0.0561617 - 1.237,-12.1298, -10.001,-19.5977, 119.042, 82.2492, 36.7362,-0.0569302 - 1.238,-12.1398,-10.0758, -19.642, 119.141, 82.3971, 36.6868,-0.0572967 - 1.239,-12.1499,-10.0366,-19.6776, 119.24, 82.5462, 36.6363,-0.0571045 - 1.24,-12.1599,-9.90035,-19.6908, 119.337, 82.6922, 36.5882,-0.0564364 - 1.241,-12.1697,-9.72553,-19.6763, 119.432, 82.8342, 36.5424,-0.0555789 - 1.242,-12.1793,-9.58705,-19.6401, 119.526, 82.9756, 36.4957,-0.0548996 - 1.243,-12.1889,-9.54418,-19.5962, 119.62, 83.1192, 36.446,-0.0546894 - 1.244,-12.1985,-9.61523,-19.5616, 119.714, 83.2636, 36.3955,-0.0550379 - 1.245,-12.2082,-9.76966,-19.5499, 119.81, 83.4065, 36.3477,-0.0557954 - 1.246, -12.218,-9.94125,-19.5655, 119.908, 83.5488, 36.3021,-0.056637 - 1.247, -12.228,-10.0565,-19.6022, 120.006, 83.6939, 36.2551,-0.0572021 - 1.248,-12.2381, -10.066,-19.6457, 120.105, 83.8426, 36.2051,-0.0572489 - 1.249,-12.2481,-9.96587,-19.6791, 120.203, 83.9912, 36.1547,-0.0567578 - 1.25, -12.258,-9.79903,-19.6893, 120.299, 84.1355, 36.1074,-0.0559394 - 1.251,-12.2677,-9.63703,-19.6726, 120.393, 84.2764, 36.0618,-0.0551448 - 1.252,-12.2773,-9.54926,-19.6354, 120.487, 84.4179, 36.0144,-0.0547143 - 1.253,-12.2869,-9.57325,-19.5924, 120.581, 84.562, 35.9641,-0.054832 - 1.254,-12.2965,-9.69866,-19.5602, 120.676, 84.7066, 35.9141,-0.0554471 - 1.255,-12.3063,-9.87166,-19.5515, 120.773, 84.8496, 35.8671,-0.0562956 - 1.256,-12.3162,-10.0181,-19.5694, 120.871, 84.9927, 35.8215,-0.057014 - 1.257,-12.3263,-10.0753, -19.607, 120.97, 85.1391, 35.7737,-0.0572944 - 1.258,-12.3363,-10.0188,-19.6495, 121.068, 85.2881, 35.7232,-0.0570172 - 1.259,-12.3463,-9.87286,-19.6804, 121.165, 85.4354, 35.6735,-0.0563016 - 1.26, -12.356,-9.70014,-19.6876, 121.26, 85.5781, 35.6268,-0.0554543 - 1.261,-12.3657,-9.57462,-19.6685, 121.354, 85.7184, 35.5811,-0.0548387 - 1.262,-12.3752,-9.55003,-19.6305, 121.448, 85.8604, 35.5328,-0.0547181 - 1.263,-12.3848,-9.63684,-19.5885, 121.543, 86.005, 35.4823,-0.0551439 - 1.264,-12.3946,-9.79776, -19.559, 121.639, 86.1497, 35.433,-0.0559332 - 1.265,-12.4044,-9.96379,-19.5533, 121.736, 86.2931, 35.3866,-0.0567476 - 1.266,-12.4144,-10.0638,-19.5737, 121.835, 86.4373, 35.3405,-0.0572382 - 1.267,-12.4245, -10.055,-19.6121, 121.934, 86.5846, 35.2919,-0.057195 - 1.268,-12.4345,-9.94126,-19.6534, 122.031, 86.7331, 35.2415,-0.0566371 - 1.269,-12.4444,-9.77137,-19.6816, 122.127, 86.8787, 35.1926,-0.0558037 - 1.27,-12.4541,-9.61815,-19.6856, 122.221, 87.0202, 35.1463,-0.0550522 - 1.271,-12.4636,-9.54725, -19.664, 122.315, 87.1605, 35.0999,-0.0547044 - 1.272,-12.4732,-9.58896,-19.6252, 122.409, 87.3032, 35.051,-0.054909 - 1.273,-12.4829,-9.72534,-19.5846, 122.505, 87.4482, 35.0008,-0.0555779 - 1.274,-12.4927,-9.89788,-19.5579, 122.602, 87.593, 34.9523,-0.0564242 - 1.275,-12.5026,-10.0326,-19.5556, 122.7, 87.7371, 34.9059,-0.0570852 - 1.276,-12.5127,-10.0719,-19.5784, 122.799, 87.8824, 34.8592,-0.0572779 - 1.277,-12.5227,-9.99895,-19.6175, 122.897, 88.0299, 34.8102,-0.05692 - 1.278,-12.5327, -9.8451,-19.6574, 122.994, 88.1772, 34.7602,-0.0561654 - 1.279,-12.5424,-9.67634,-19.6825, 123.089, 88.3213, 34.7119,-0.0553376 - 1.28, -12.552,-9.56497,-19.6831, 123.182, 88.4621, 34.6655,-0.0547913 - 1.281,-12.5616,-9.55866,-19.6591, 123.276, 88.6029, 34.6185,-0.0547604 - 1.282,-12.5712,-9.66003,-19.6198, 123.371, 88.7463, 34.5694,-0.0552576 - 1.283,-12.5809,-9.82557,-19.5807, 123.467, 88.8916, 34.5196,-0.0560696 - 1.284,-12.5909,-9.98431,-19.5572, 123.565, 89.0368, 34.4716,-0.0568482 - 1.285,-12.6009,-10.0683,-19.5583, 123.664, 89.1818, 34.425,-0.05726 - 1.286,-12.6109,-10.0415,-19.5836, 123.763, 89.3277, 34.3777,-0.0571287 - 1.287,-12.6209,-9.91558, -19.623, 123.86, 89.4747, 34.3286,-0.0565111 - 1.288,-12.6307,-9.74453,-19.6612, 123.955, 89.6205, 34.2792,-0.0556721 - 1.289,-12.6404,-9.60167,-19.6831, 124.05, 89.7634, 34.2312,-0.0549713 - 1.29, -12.65,-9.54816,-19.6802, 124.143, 89.9042, 34.1844,-0.0547089 - 1.291,-12.6596,-9.60687,-19.6537, 124.237, 90.0456, 34.1369,-0.0549969 - 1.292,-12.6692,-9.75256,-19.6141, 124.333, 90.1895, 34.0879,-0.0557115 - 1.293,-12.6791,-9.92274,-19.5769, 124.43, 90.3352, 34.0387,-0.0565462 - 1.294,-12.6891,-10.0445,-19.5568, 124.529, 90.4812, 33.9907,-0.0571434 - 1.295,-12.6991,-10.0657,-19.5614, 124.628, 90.6268, 33.9437,-0.0572474 - 1.296,-12.7091,-9.97734,-19.5891, 124.726, 90.7727, 33.8962,-0.056814 - 1.297, -12.719,-9.81736,-19.6287, 124.822, 90.9186, 33.8474,-0.0560293 - 1.298,-12.7288,-9.65435,-19.6649, 124.917, 91.0632, 33.7982,-0.0552298 - 1.299,-12.7384,-9.55815,-19.6833, 125.01, 91.2055, 33.7502,-0.0547579 - 1.3,-12.7479,-9.56992,-19.6768, 125.104, 91.3465, 33.703,-0.0548156 - 1.301,-12.7576,-9.68453, -19.648, 125.199, 91.4884, 33.6555,-0.0553778 - 1.302,-12.7673, -9.8528,-19.6084, 125.296, 91.6329, 33.6068,-0.0562032 - 1.303,-12.7773,-10.0026,-19.5734, 125.394, 91.7794, 33.5577,-0.056938 - 1.304,-12.7873,-10.0698,-19.5568, 125.493, 91.9261, 33.5095,-0.0572675 - 1.305,-12.7974,-10.0256,-19.5651, 125.591, 92.0719, 33.4623,-0.0570508 - 1.306,-12.8073,-9.88911,-19.5949, 125.688, 92.2169, 33.4149,-0.0563813 - 1.307,-12.8171,-9.71882,-19.6345, 125.784, 92.3617, 33.3663,-0.055546 - 1.308,-12.8268,-9.58772,-19.6683, 125.878, 92.5056, 33.3172,-0.0549029 - 1.309,-12.8363,-9.55194,-19.6829, 125.971, 92.6478, 33.2689,-0.0547274 - 1.31,-12.8459,-9.62675,-19.6728, 126.066, 92.789, 33.2217,-0.0550944 - 1.311,-12.8556,-9.78001, -19.642, 126.162, 92.9315, 33.1744,-0.0558461 - 1.312,-12.8655, -9.946,-19.6026, 126.259, 93.0768, 33.1258,-0.0566603 - 1.313,-12.8755,-10.0536,-19.5702, 126.358, 93.2242, 33.0765,-0.0571881 - 1.314,-12.8856,-10.0568,-19.5574, 126.457, 93.3712, 33.0281,-0.0572035 - 1.315,-12.8956, -9.9542,-19.5694, 126.554, 93.5164, 32.9811,-0.0567005 - 1.316,-12.9054,-9.78994,-19.6012, 126.65, 93.6604, 32.9339,-0.0558948 - 1.317,-12.9151,-9.63441,-19.6403, 126.745, 93.8043, 32.8853,-0.0551319 - 1.318,-12.9247,-9.55421,-19.6713, 126.839, 93.9479, 32.8358,-0.0547386 - 1.319,-12.9343,-9.58366, -19.682, 126.933, 94.0902, 32.7874,-0.054883 - 1.32, -12.944,-9.71005,-19.6683, 127.028, 94.2317, 32.7406,-0.055503 - 1.321,-12.9537,-9.87917,-19.6356, 127.125, 94.3748, 32.6935,-0.0563325 - 1.322,-12.9637,-10.0185,-19.5969, 127.223, 94.5213, 32.6447,-0.057016 - 1.323,-12.9737,-10.0684,-19.5674, 127.322, 94.6694, 32.595,-0.0572608 - 1.324,-12.9838,-10.0076,-19.5587, 127.42, 94.8162, 32.5468,-0.0569624 - 1.325,-12.9937,-9.86215,-19.5742, 127.517, 94.9603, 32.5002,-0.056249 - 1.326,-13.0035,-9.69447,-19.6077, 127.612, 95.1032, 32.4531,-0.0554266 - 1.327,-13.0131,-9.57641,-19.6459, 127.706, 95.2468, 32.404,-0.0548475 - 1.328,-13.0227,-9.55851,-19.6739, 127.799, 95.3905, 32.3542,-0.0547597 - 1.329,-13.0323,-9.64837,-19.6805, 127.894, 95.5328, 32.3061,-0.0552004 - 1.33, -13.042, -9.8074,-19.6632, 127.99, 95.6746, 32.2598,-0.0559805 - 1.331,-13.0519,-9.96742, -19.629, 128.088, 95.8187, 32.2127,-0.0567654 - 1.332,-13.0619,-10.0599,-19.5913, 128.187, 95.9663, 32.1633,-0.0572189 - 1.333, -13.072,-10.0452,-19.5651, 128.285, 96.1148, 32.1134,-0.057147 - 1.334, -13.082, -9.9298,-19.5606, 128.383, 96.2606, 32.0656,-0.0565809 - 1.335,-13.0918,-9.76314,-19.5795, 128.479, 96.4033, 32.0195,-0.0557634 - 1.336,-13.1015,-9.61668,-19.6144, 128.573, 96.5457, 31.9722,-0.055045 - 1.337,-13.1111,-9.55315,-19.6514, 128.667, 96.6895, 31.9224,-0.0547334 - 1.338,-13.1207, -9.5997,-19.6759, 128.761, 96.8332, 31.8726,-0.0549617 - 1.339,-13.1303,-9.73631,-19.6782, 128.856, 96.9755, 31.8252,-0.0556318 - 1.34,-13.1401,-9.90439,-19.6576, 128.953, 97.1178, 31.7792,-0.0564562 - 1.341,-13.1501,-10.0319,-19.6222, 129.052, 97.2632, 31.7316,-0.0570817 - 1.342,-13.1602,-10.0643, -19.586, 129.151, 97.4119, 31.6815,-0.0572403 - 1.343,-13.1702,-9.98766,-19.5634, 129.249, 97.5599, 31.6318,-0.0568646 - 1.344,-13.1801, -9.835,-19.5632, 129.345, 97.7041, 31.5848,-0.0561159 - 1.345,-13.1899,-9.67175,-19.5854, 129.44, 97.8457, 31.539,-0.0553151 - 1.346,-13.1995,-9.56785,-19.6213, 129.534, 97.9881, 31.4909,-0.0548055 - 1.347, -13.209,-9.56776,-19.6565, 129.628, 98.1323, 31.4405,-0.054805 - 1.348,-13.2187,-9.67146,-19.6772, 129.723, 98.2761, 31.3911,-0.0553137 - 1.349,-13.2284,-9.83443,-19.6752, 129.819, 98.4183, 31.3446,-0.056113 - 1.35,-13.2383,-9.98681,-19.6514, 129.917, 98.5615, 31.2986,-0.0568605 - 1.351,-13.2484,-10.0633,-19.6152, 130.016, 98.7084, 31.2501,-0.0572358 - 1.352,-13.2584,-10.0313,-19.5811, 130.114, 98.8575, 31.1996,-0.0570785 - 1.353,-13.2684,-9.90443,-19.5624, 130.211, 99.0042, 31.1506,-0.0564564 - 1.354,-13.2782,-9.73723,-19.5665, 130.307, 99.1468, 31.1044,-0.0556363 - 1.355,-13.2879,-9.60133,-19.5918, 130.401, 99.2878, 31.0582,-0.0549697 - 1.356,-13.2974,-9.55492,-19.6282, 130.495, 99.4308, 31.0092,-0.0547421 - 1.357, -13.307,-9.61783,-19.6612, 130.589, 99.5754, 30.9586,-0.0550506 - 1.358,-13.3167,-9.76302,-19.6778, 130.685, 99.719, 30.9101,-0.0557628 - 1.359,-13.3266,-9.92824,-19.6715, 130.782, 99.8615, 30.8642,-0.0565732 - 1.36,-13.3365,-10.0427,-19.6448, 130.881, 100.006, 30.8177,-0.0571345 - 1.361,-13.3466,-10.0573,-19.6083, 130.979, 100.154, 30.7682,-0.0572065 - 1.362,-13.3566,-9.96605,-19.5766, 131.077, 100.303, 30.7178,-0.0567586 - 1.363,-13.3665,-9.80796,-19.5622, 131.173, 100.448, 30.6697,-0.0559832 - 1.364,-13.3762,-9.65086,-19.5707, 131.268, 100.589, 30.624,-0.0552126 - 1.365,-13.3858,-9.56205,-19.5987, 131.362, 100.73, 30.5771,-0.054777 - 1.366,-13.3954,-9.57952,-19.6351, 131.456, 100.874, 30.5273,-0.0548627 - 1.367, -13.405,-9.69572,-19.6654, 131.551, 101.019, 30.477,-0.0554327 - 1.368,-13.4148,-9.86079,-19.6776, 131.648, 101.162, 30.4295,-0.0562423 - 1.369,-13.4247, -10.004, -19.667, 131.746, 101.305, 30.3837,-0.0569447 - 1.37,-13.4348, -10.064,-19.6377, 131.845, 101.451, 30.3363,-0.0572389 - 1.371,-13.4448,-10.0151,-19.6016, 131.943, 101.6, 30.2863,-0.0569993 - 1.372,-13.4548,-9.87843,-19.5728, 132.04, 101.747, 30.2364,-0.0563289 - 1.373,-13.4646,-9.71255,-19.5628, 132.135, 101.89, 30.1892,-0.0555152 - 1.374,-13.4742,-9.58855,-19.5756, 132.229, 102.031, 30.1434,-0.054907 - 1.375,-13.4838,-9.55952,-19.6059, 132.323, 102.173, 30.0955,-0.0547646 - 1.376,-13.4934,-9.63782,-19.6417, 132.417, 102.317, 30.0453,-0.0551487 - 1.377,-13.5031,-9.78982,-19.6688, 132.513, 102.462, 29.9958,-0.0558942 - 1.378, -13.513,-9.95033,-19.6765, 132.611, 102.605, 29.949,-0.0566815 - 1.379, -13.523,-10.0506,-19.6617, 132.71, 102.75, 29.9029,-0.0571733 - 1.38, -13.533,-10.0477,-19.6304, 132.808, 102.896, 29.8546,-0.0571589 - 1.381, -13.543,-9.94291,-19.5951, 132.906, 103.045, 29.8044,-0.0566451 - 1.382,-13.5529,-9.78128,-19.5697, 133.002, 103.19, 29.7554,-0.0558524 - 1.383,-13.5626,-9.63209,-19.5644, 133.096, 103.332, 29.7088,-0.0551206 - 1.384,-13.5722,-9.55926,-19.5812, 133.19, 103.473, 29.6624,-0.0547633 - 1.385,-13.5818,-9.59395,-19.6134, 133.284, 103.615, 29.6137,-0.0549335 - 1.386,-13.5914,-9.72123,-19.6481, 133.379, 103.76, 29.5636,-0.0555578 - 1.387,-13.6012,-9.88651,-19.6715, 133.476, 103.905, 29.515,-0.0563685 - 1.388,-13.6112,-10.0189,-19.6744, 133.575, 104.049, 29.4685,-0.057018 - 1.389,-13.6212,-10.0617,-19.6557, 133.673, 104.194, 29.4218,-0.0572279 - 1.39,-13.6312,-9.99661,-19.6228, 133.771, 104.342, 29.3728,-0.0569086 - 1.391,-13.6412,-9.85151, -19.589, 133.868, 104.489, 29.3229,-0.0561968 - 1.392,-13.6509,-9.68862,-19.5675, 133.963, 104.633, 29.2746,-0.0553978 - 1.393,-13.6606,-9.57773, -19.567, 134.057, 104.774, 29.2281,-0.0548539 - 1.394,-13.6701,-9.56633,-19.5875, 134.151, 104.915, 29.1811,-0.054798 - 1.395,-13.6798, -9.6593, -19.621, 134.246, 105.059, 29.132,-0.055254 - 1.396,-13.6895,-9.81681,-19.6539, 134.342, 105.204, 29.0823,-0.0560266 - 1.397,-13.6994,-9.97142,-19.6733, 134.44, 105.349, 29.0343,-0.056785 - 1.398,-13.7094, -10.057,-19.6714, 134.539, 105.494, 28.9877,-0.0572046 - 1.399,-13.7194,-10.0369,-19.6491, 134.637, 105.64, 28.9403,-0.0571061 - 1.4,-13.7294,-9.91986,-19.6152, 134.734, 105.787, 28.8911,-0.0565321 - 1.401,-13.7393,-9.75598,-19.5834, 134.83, 105.933, 28.8418,-0.0557282 - 1.402,-13.7489,-9.61537,-19.5662, 134.924, 106.075, 28.7939,-0.0550385 - 1.403,-13.7585,-9.55808,-19.5705, 135.018, 106.216, 28.7472,-0.0547575 - 1.404,-13.7681,-9.60842,-19.5945, 135.112, 106.358, 28.6996,-0.0550045 - 1.405,-13.7778,-9.74463,-19.6285, 135.208, 106.502, 28.6504,-0.0556726 - 1.406,-13.7876,-9.90827,-19.6591, 135.305, 106.647, 28.6013,-0.0564752 - 1.407,-13.7976,-10.0293, -19.674, 135.404, 106.793, 28.5535,-0.0570688 - 1.408,-13.8076,-10.0561,-19.6674, 135.502, 106.938, 28.5066,-0.0572003 - 1.409,-13.8176,-9.97757,-19.6419, 135.6, 107.084, 28.4588,-0.0568151 - 1.41,-13.8276,-9.82778,-19.6077, 135.696, 107.231, 28.4097,-0.0560804 - 1.411,-13.8373,-9.67125,-19.5786, 135.791, 107.375, 28.3608,-0.0553126 - 1.412,-13.8469,-9.57522, -19.566, 135.885, 107.517, 28.313,-0.0548416 - 1.413,-13.8565,-9.58075, -19.575, 135.979, 107.658, 28.266,-0.0548688 - 1.414,-13.8661,-9.68513,-19.6019, 136.074, 107.801, 28.2181,-0.0553807 - 1.415,-13.8759,-9.84308,-19.6359, 136.171, 107.946, 28.1691,-0.0561555 - 1.416,-13.8858,-9.98624,-19.6636, 136.269, 108.092, 28.1203,-0.0568577 - 1.417,-13.8958,-10.0526,-19.6737, 136.367, 108.238, 28.0725,-0.0571834 - 1.418,-13.9059,-10.0134,-19.6624, 136.466, 108.383, 28.0253,-0.0569909 - 1.419,-13.9158,-9.88521,-19.6343, 136.563, 108.529, 27.9774,-0.0563621 - 1.42,-13.9256,-9.72329,-19.6005, 136.658, 108.674, 27.9285,-0.0555679 - 1.421,-13.9353,-9.59773,-19.5746, 136.752, 108.818, 27.8797,-0.054952 - 1.422,-13.9449,-9.56337,-19.5669, 136.846, 108.959, 27.8319,-0.0547835 - 1.423,-13.9545, -9.6361,-19.5804, 136.941, 109.101, 27.7847,-0.0551402 - 1.424,-13.9642,-9.78585,-19.6097, 137.037, 109.244, 27.7369,-0.0558747 - 1.425, -13.974,-9.94914, -19.643, 137.134, 109.389, 27.688,-0.0566757 - 1.426, -13.984,-10.0561,-19.6671, 137.233, 109.536, 27.6391,-0.0572002 - 1.427,-13.9941,-10.0601,-19.6723, 137.331, 109.683, 27.5913,-0.0572201 - 1.428,-14.0041,-9.95804,-19.6566, 137.429, 109.828, 27.5441,-0.0567193 - 1.429, -14.014, -9.7915,-19.6263, 137.525, 109.973, 27.4963,-0.0559025 - 1.43,-14.0237, -9.6296,-19.5936, 137.62, 110.117, 27.4474,-0.0551084 - 1.431,-14.0333,-9.53981,-19.5716, 137.713, 110.26, 27.3985,-0.0546679 - 1.432,-14.0428,-9.55958,-19.5689, 137.807, 110.402, 27.3507,-0.0547649 - 1.433,-14.0524,-9.68078,-19.5866, 137.902, 110.543, 27.3036,-0.0553594 - 1.434,-14.0622,-9.85332,-19.6177, 137.999, 110.687, 27.2558,-0.0562057 - 1.435,-14.0721,-10.0065,-19.6496, 138.097, 110.833, 27.2068,-0.0569572 - 1.436,-14.0822,-10.0788,-19.6695, 138.196, 110.981, 27.1578,-0.0573117 - 1.437,-14.0922,-10.0432,-19.6697, 138.294, 111.127, 27.1101,-0.0571372 - 1.438,-14.1022,-9.91803, -19.65, 138.392, 111.272, 27.0631,-0.0565231 - 1.439,-14.1121,-9.75785,-19.6183, 138.487, 111.416, 27.0153,-0.0557374 - 1.44,-14.1218,-9.62972,-19.5874, 138.582, 111.561, 26.9661,-0.055109 - 1.441,-14.1314,-9.58427,-19.5696, 138.676, 111.704, 26.917,-0.054886 - 1.442, -14.141,-9.63459, -19.572, 138.77, 111.846, 26.8695,-0.0551328 - 1.443,-14.1507,-9.75183,-19.5936, 138.866, 111.987, 26.8227,-0.0557079 - 1.444,-14.1605,-9.87921,-19.6257, 138.963, 112.132, 26.7747,-0.0563327 - 1.445,-14.1704,-9.95803,-19.6554, 139.061, 112.278, 26.7253,-0.0567193 - 1.446,-14.1804,-9.95425,-19.6709, 139.158, 112.425, 26.6763,-0.0567008 - 1.447,-14.1903,-9.87381,-19.6659, 139.255, 112.57, 26.629,-0.0563062 - 1.448,-14.2001,-9.75976,-19.6427, 139.351, 112.713, 26.5823,-0.0557468 - 1.449,-14.2098,-9.67252,-19.6104, 139.446, 112.856, 26.5341,-0.0553189 - 1.45,-14.2195,-9.66165, -19.582, 139.54, 113.001, 26.4845,-0.0552655 - 1.451,-14.2292,-9.74186,-19.5689, 139.636, 113.145, 26.4357,-0.055659 - 1.452, -14.239,-9.88394,-19.5763, 139.733, 113.288, 26.3887,-0.0563559 - 1.453,-14.2489,-10.0253,-19.6012, 139.831, 113.432, 26.342,-0.0570491 - 1.454, -14.259, -10.096,-19.6335, 139.93, 113.58, 26.2934,-0.0573959 - 1.455,-14.2691,-10.0498,-19.6604, 140.029, 113.728, 26.2435,-0.0571695 - 1.456, -14.279,-9.88682,-19.6709, 140.126, 113.875, 26.1949,-0.05637 - 1.457,-14.2888,-9.65724,-19.6611, 140.221, 114.017, 26.1484,-0.0552439 - 1.458,-14.2984,-9.44472,-19.6348, 140.313, 114.157, 26.1017,-0.0542015 - 1.459,-14.3078,-9.33466,-19.6027, 140.405, 114.298, 26.0528,-0.0536617 - 1.46,-14.3171,-9.38033,-19.5776, 140.497, 114.44, 26.0027,-0.0538857 - 1.461,-14.3266,-9.58038,-19.5695, 140.591, 114.582, 25.9542,-0.0548669 - 1.462,-14.3363,-9.87697,-19.5817, 140.688, 114.724, 25.9078,-0.0563217 - 1.463,-14.3464,-10.1754,-19.6092, 140.788, 114.869, 25.861,-0.0577857 - 1.464,-14.3566, -10.378, -19.641, 140.889, 115.019, 25.812,-0.058779 - 1.465, -14.367,-10.4181,-19.6643, 140.992, 115.17, 25.7623,-0.058976 - 1.466,-14.3774,-10.2832,-19.6697, 141.093, 115.32, 25.7142,-0.0583143 - 1.467,-14.3875,-10.0165,-19.6552, 141.191, 115.466, 25.6677,-0.0570062 - 1.468,-14.3974,-9.69934,-19.6267, 141.286, 115.61, 25.62,-0.0554504 - 1.469,-14.4069,-9.42146,-19.5955, 141.378, 115.754, 25.5703,-0.0540874 - 1.47,-14.4163, -9.2514,-19.5742, 141.469, 115.895, 25.521,-0.0532533 - 1.471,-14.4255,-9.21822,-19.5714, 141.56, 116.032, 25.4743,-0.0530905 - 1.472,-14.4348,-9.30996, -19.588, 141.651, 116.169, 25.4285,-0.0535405 - 1.473,-14.4442,-9.48704,-19.6175, 141.744, 116.309, 25.3804,-0.0544091 - 1.474,-14.4538,-9.70255,-19.6479, 141.839, 116.454, 25.3293,-0.0554662 - 1.475,-14.4636,-9.91934, -19.667, 141.936, 116.601, 25.279,-0.0565295 - 1.476,-14.4736,-10.1166,-19.6672, 142.036, 116.746, 25.2323,-0.0574972 - 1.477,-14.4838,-10.2845,-19.6485, 142.137, 116.891, 25.1876,-0.0583208 - 1.478,-14.4942,-10.4117,-19.6184, 142.239, 117.039, 25.1408,-0.0589448 - 1.479,-14.5046, -10.475, -19.589, 142.341, 117.192, 25.0907,-0.0592549 - 1.48,-14.5151,-10.4386,-19.5721, 142.444, 117.345, 25.0401,-0.0590766 - 1.481,-14.5254,-10.2675,-19.5745, 142.545, 117.495, 24.9915,-0.0582372 - 1.482,-14.5355,-9.94853,-19.5952, 142.642, 117.641, 24.9443,-0.0566727 - 1.483,-14.5452,-9.51199,-19.6258, 142.735, 117.784, 24.8967,-0.0545315 - 1.484,-14.5545, -9.04,-19.6539, 142.824, 117.923, 24.849,-0.0522163 - 1.485,-14.5634,-8.65493,-19.6684, 142.909, 118.056, 24.8026,-0.0503276 - 1.486,-14.5719,-8.48722,-19.6634, 142.992, 118.187, 24.7561,-0.049505 - 1.487,-14.5805,-8.63165, -19.641, 143.077, 118.32, 24.7066,-0.0502134 - 1.488,-14.5894,-9.10726,-19.6102, 143.166, 118.46, 24.6537,-0.0525463 - 1.489,-14.5988,-9.83689,-19.5834, 143.263, 118.605, 24.6022,-0.0561251 - 1.49,-14.6091,-10.6567,-19.5714, 143.367, 118.751, 24.5568,-0.0601462 - 1.491,-14.6201,-11.3556, -19.579, 143.479, 118.899, 24.5158,-0.0635744 - 1.492,-14.6316,-11.7345, -19.603, 143.594, 119.056, 24.4721,-0.0654331 - 1.493,-14.6433,-11.6662,-19.6338, 143.708, 119.222, 24.4209,-0.0650977 - 1.494,-14.6547,-11.1365, -19.659, 143.818, 119.39, 24.3651,-0.0624997 - 1.495,-14.6654,-10.2539,-19.6684, 143.918, 119.548, 24.3119,-0.0581705 - 1.496,-14.6752,-9.22231,-19.6584, 144.009, 119.69, 24.2653,-0.0531106 - 1.497,-14.6839,-8.28743,-19.6329, 144.09, 119.818, 24.2233,-0.048525 - 1.498,-14.6919, -7.6719,-19.6023, 144.165, 119.939, 24.1808,-0.0455058 - 1.499,-14.6995,-7.51958,-19.5789, 144.239, 120.059, 24.1348,-0.0447587 - 1.5,-14.7072,-7.86347,-19.5721, 144.316, 120.186, 24.0841,-0.0464455 - 1.501,-14.7154,-8.62426,-19.5846, 144.401, 120.321, 24.0296,-0.0501771 - 1.502,-14.7246,-9.63606,-19.6113, 144.495, 120.466, 23.9746,-0.05514 - 1.503,-14.7347,-10.6891,-19.6414, 144.6, 120.615, 23.9247,-0.060305 - 1.504,-14.7459,-11.5756,-19.6629, 144.714, 120.766, 23.8834,-0.0646535 - 1.505,-14.7577,-12.1289, -19.667, 144.833, 120.919, 23.8464,-0.0673675 - 1.506,-14.7699,-12.2481,-19.6522, 144.953, 121.081, 23.8039,-0.0679521 - 1.507, -14.782,-11.9092,-19.6245, 145.07, 121.254, 23.7498,-0.0662897 - 1.508,-14.7935,-11.1648,-19.5951, 145.179, 121.428, 23.6888,-0.0626385 - 1.509,-14.8042, -10.136,-19.5757, 145.279, 121.589, 23.6324,-0.0575922 - 1.51,-14.8137,-8.99745,-19.5742, 145.367, 121.727, 23.5877,-0.0520077 - 1.511,-14.8222,-7.95537,-19.5912, 145.445, 121.847, 23.5509,-0.0468962 - 1.512,-14.8298,-7.21667,-19.6197, 145.516, 121.961, 23.5119,-0.0432729 - 1.513,-14.8369,-6.95075,-19.6483, 145.584, 122.078, 23.4644,-0.0419686 - 1.514, -14.844,-7.24923,-19.6654, 145.655, 122.202, 23.4096,-0.0434326 - 1.515,-14.8517,-8.09374,-19.6642, 145.734, 122.334, 23.3532,-0.0475749 - 1.516,-14.8604,-9.34367,-19.6452, 145.826, 122.472, 23.3003,-0.0537059 - 1.517,-14.8704, -10.753,-19.6161, 145.932, 122.618, 23.2531,-0.0606187 - 1.518,-14.8818, -12.018,-19.5886, 146.049, 122.772, 23.2109,-0.0668233 - 1.519,-14.8942,-12.8469,-19.5739, 146.175, 122.934, 23.1703,-0.0708894 - 1.52,-14.9072,-13.0355,-19.5778, 146.303, 123.106, 23.1257,-0.0718144 - 1.521, -14.92,-12.5247,-19.5987, 146.426, 123.282, 23.0744,-0.0693091 - 1.522,-14.9319,-11.4234,-19.6281, 146.538, 123.455, 23.0192,-0.0639068 - 1.523,-14.9426,-9.98507,-19.6542, 146.636, 123.613, 22.9663,-0.0568519 - 1.524,-14.9519,-8.54486,-19.6664, 146.72, 123.751, 22.9191,-0.0497877 - 1.525,-14.9599,-7.43192,-19.6599, 146.793, 123.874, 22.8749,-0.0443287 - 1.526,-14.9671,-6.88452,-19.6373, 146.861, 123.99, 22.8292,-0.0416437 - 1.527, -14.974,-6.99181,-19.6078, 146.929, 124.106, 22.7808,-0.04217 - 1.528,-14.9813,-7.67898,-19.5833, 147.004, 124.226, 22.7329,-0.0455406 - 1.529,-14.9895,-8.73849,-19.5736, 147.09, 124.352, 22.6872,-0.0507375 - 1.53,-14.9988, -9.8955,-19.5827, 147.187, 124.49, 22.6407,-0.0564126 - 1.531,-15.0092,-10.8858,-19.6068, 147.294, 124.643, 22.5895,-0.0612699 - 1.532,-15.0204,-11.5221,-19.6362, 147.407, 124.808, 22.5347,-0.0643912 - 1.533,-15.0321,-11.7309, -19.659, 147.522, 124.975, 22.4822,-0.0654151 - 1.534,-15.0437,-11.5516, -19.666, 147.635, 125.134, 22.4367,-0.0645358 - 1.535, -15.055,-11.1053,-19.6544, 147.744, 125.285, 22.3967,-0.0623464 - 1.536,-15.0659,-10.5453, -19.629, 147.848, 125.433, 22.3556,-0.0595998 - 1.537,-15.0761,-10.0101, -19.6, 147.946, 125.581, 22.3082,-0.0569745 - 1.538,-15.0859,-9.59033,-19.5792, 148.04, 125.731, 22.2545,-0.0549157 - 1.539,-15.0954,-9.31913,-19.5748, 148.132, 125.879, 22.1987,-0.0535855 - 1.54,-15.1046,-9.18167,-19.5888, 148.222, 126.023, 22.1457,-0.0529113 - 1.541,-15.1138,-9.13688,-19.6153, 148.311, 126.16, 22.0981,-0.0526916 - 1.542,-15.1229,-9.14034,-19.6436, 148.401, 126.293, 22.0556,-0.0527086 - 1.543,-15.1321,-9.16038,-19.6624, 148.491, 126.423, 22.0146,-0.0528068 - 1.544,-15.1413,-9.18416, -19.664, 148.581, 126.558, 21.9703,-0.0529235 - 1.545,-15.1505,-9.21549,-19.6478, 148.671, 126.698, 21.9203,-0.0530772 - 1.546,-15.1597,-9.26853,-19.6204, 148.762, 126.842, 21.8664,-0.0533373 - 1.547, -15.169,-9.36146, -19.593, 148.854, 126.987, 21.8135,-0.0537931 - 1.548,-15.1785,-9.51196,-19.5765, 148.947, 127.128, 21.7646,-0.0545313 - 1.549,-15.1881,-9.73334,-19.5776, 149.043, 127.269, 21.7183,-0.0556172 - 1.55, -15.198,-10.0295,-19.5959, 149.141, 127.413, 21.6716,-0.0570696 - 1.551,-15.2082,-10.3872,-19.6238, 149.243, 127.56, 21.624,-0.0588244 - 1.552,-15.2188,-10.7687,-19.6502, 149.349, 127.71, 21.5776,-0.0606957 - 1.553,-15.2297,-11.1076,-19.6642, 149.458, 127.862, 21.5333,-0.062358 - 1.554,-15.2409,-11.3151,-19.6604, 149.569, 128.017, 21.4882,-0.0633757 - 1.555,-15.2522,-11.2985,-19.6403, 149.68, 128.178, 21.4379,-0.0632944 - 1.556,-15.2634,-10.9906, -19.612, 149.787, 128.343, 21.3824,-0.0617843 - 1.557, -15.274,-10.3812, -19.587, 149.889, 128.503, 21.3273,-0.0587948 - 1.558, -15.284,-9.53884,-19.5754, 149.983, 128.65, 21.2784,-0.0546632 - 1.559,-15.2931,-8.61253,-19.5819, 150.067, 128.78, 21.2367,-0.0501196 - 1.56,-15.3013, -7.8053,-19.6038, 150.144, 128.901, 21.1971,-0.0461602 - 1.561,-15.3088,-7.32502,-19.6322, 150.216, 129.019, 21.1533,-0.0438044 - 1.562,-15.3162,-7.32423,-19.6556, 150.288, 129.141, 21.1031,-0.0438005 - 1.563,-15.3238,-7.84833,-19.6645, 150.365, 129.269, 21.0493,-0.0463712 - 1.564,-15.3321,-8.81078,-19.6555, 150.451, 129.404, 20.9961,-0.051092 - 1.565,-15.3415,-10.0065,-19.6321, 150.549, 129.546, 20.9459,-0.0569569 - 1.566,-15.3521,-11.1623,-19.6038, 150.659, 129.698, 20.8984,-0.0626262 - 1.567,-15.3637,-12.0112,-19.5822, 150.777, 129.857, 20.8523,-0.0667902 - 1.568,-15.3759,-12.3667,-19.5759, 150.898, 130.023, 20.8065,-0.0685337 - 1.569,-15.3881,-12.1741,-19.5875, 151.017, 130.189, 20.761,-0.067589 - 1.57, -15.4,-11.5221,-19.6122, 151.13, 130.35, 20.7154,-0.0643909 - 1.571, -15.411,-10.6105, -19.64, 151.234, 130.506, 20.6686,-0.0599196 - 1.572,-15.4212,-9.68588,-19.6596, 151.329, 130.655, 20.6193,-0.0553844 - 1.573,-15.4305,-8.96642,-19.6632, 151.417, 130.799, 20.567,-0.0518555 - 1.574,-15.4393,-8.58094,-19.6492, 151.502, 130.938, 20.5132,-0.0499647 - 1.575,-15.4479, -8.5413,-19.6235, 151.585, 131.074, 20.4613,-0.0497703 - 1.576,-15.4565,-8.75502,-19.5964, 151.671, 131.206, 20.4146,-0.0508185 - 1.577,-15.4654,-9.07085,-19.5789, 151.76, 131.335, 20.3731,-0.0523677 - 1.578,-15.4746,-9.33937,-19.5781, 151.852, 131.466, 20.3326,-0.0536848 - 1.579, -15.484,-9.46629,-19.5943, 151.945, 131.603, 20.2877,-0.0543073 - 1.58,-15.4935,-9.44071,-19.6208, 152.037, 131.747, 20.2363,-0.0541818 - 1.581,-15.5029,-9.33019, -19.647, 152.129, 131.894, 20.1815,-0.0536397 - 1.582,-15.5121,-9.24741,-19.6621, 152.22, 132.038, 20.1285,-0.0532337 - 1.583,-15.5214,-9.30227,-19.6602, 152.311, 132.177, 20.0799,-0.0535028 - 1.584,-15.5309,-9.55775, -19.642, 152.405, 132.316, 20.0335,-0.0547559 - 1.585,-15.5406,-10.0045,-19.6149, 152.503, 132.459, 19.9865,-0.0569473 - 1.586,-15.5509,-10.5617,-19.5899, 152.606, 132.608, 19.9389,-0.0596801 - 1.587,-15.5617,-11.1011,-19.5772, 152.715, 132.76, 19.8932,-0.0623262 - 1.588, -15.573,-11.4859,-19.5819, 152.828, 132.914, 19.8501,-0.0642135 - 1.589,-15.5846,-11.6085, -19.602, 152.942, 133.071, 19.8056,-0.0648148 - 1.59,-15.5961,-11.4184,-19.6293, 153.054, 133.234, 19.7555,-0.0638823 - 1.591,-15.6073,-10.9324,-19.6528, 153.161, 133.4, 19.6998,-0.0614983 - 1.592,-15.6179,-10.2276, -19.663, 153.261, 133.559, 19.6441,-0.0580416 - 1.593,-15.6277,-9.42273,-19.6557, 153.354, 133.706, 19.5941,-0.0540937 - 1.594,-15.6367,-8.65332,-19.6339, 153.439, 133.838, 19.5503,-0.0503197 - 1.595,-15.6451, -8.0479,-19.6066, 153.518, 133.962, 19.5086,-0.0473501 - 1.596, -15.653,-7.70771,-19.5847, 153.593, 134.083, 19.4647,-0.0456815 - 1.597,-15.6607,-7.69146,-19.5772, 153.669, 134.205, 19.4176,-0.0456018 - 1.598,-15.6685,-8.00545,-19.5871, 153.747, 134.331, 19.3688,-0.0471419 - 1.599,-15.6768,-8.59997,-19.6103, 153.832, 134.462, 19.3191,-0.050058 - 1.6,-15.6858,-9.37402,-19.6374, 153.924, 134.601, 19.2683,-0.0538547 - 1.601,-15.6956,-10.1903,-19.6573, 154.024, 134.749, 19.2165,-0.0578584 - 1.602,-15.7061,-10.9003,-19.6621, 154.13, 134.904, 19.1651,-0.0613413 - 1.603,-15.7173, -11.377,-19.6498, 154.242, 135.063, 19.1159,-0.0636791 - 1.604,-15.7287,-11.5452,-19.6254, 154.355, 135.221, 19.0696,-0.0645046 - 1.605,-15.7402,-11.4035,-19.5989, 154.467, 135.377, 19.026,-0.0638092 - 1.606,-15.7514,-11.0249, -19.581, 154.575, 135.53, 18.9837,-0.0619521 - 1.607,-15.7622,-10.5368, -19.579, 154.679, 135.679, 18.9398,-0.0595579 - 1.608,-15.7725,-10.0816,-19.5936, 154.778, 135.829, 18.8912,-0.0573253 - 1.609,-15.7824,-9.77104,-19.6189, 154.873, 135.98, 18.8372,-0.0558021 - 1.61,-15.7921, -9.6493,-19.6446, 154.968, 136.131, 18.7817,-0.055205 - 1.611,-15.8018,-9.67887,-19.6603, 155.063, 136.278, 18.7298,-0.05535 - 1.612,-15.8115,-9.75647,-19.6595, 155.159, 136.42, 18.6833,-0.0557307 - 1.613,-15.8213,-9.75465,-19.6427, 155.254, 136.56, 18.639,-0.0557217 - 1.614,-15.8309,-9.57544,-19.6167, 155.348, 136.7, 18.5931,-0.0548427 - 1.615,-15.8403, -9.1963,-19.5921, 155.439, 136.84, 18.5458,-0.052983 - 1.616,-15.8493,-8.69005,-19.5789, 155.524, 136.973, 18.5002,-0.0504998 - 1.617,-15.8577,-8.20923,-19.5824, 155.604, 137.1, 18.4567,-0.0481414 - 1.618,-15.8658,-7.93812,-19.6012, 155.682, 137.225, 18.4107,-0.0468116 - 1.619,-15.8738,-8.02779,-19.6275, 155.761, 137.356, 18.358,-0.0472515 - 1.62,-15.8821,-8.53726,-19.6508, 155.845, 137.494, 18.3008,-0.0497504 - 1.621, -15.891,-9.40244,-19.6615, 155.937, 137.637, 18.2463,-0.0539941 - 1.622,-15.9009,-10.4456,-19.6553, 156.04, 137.781, 18.1992,-0.0591107 - 1.623,-15.9119,-11.4238,-19.6348, 156.152, 137.931, 18.1571,-0.0639091 - 1.624,-15.9236,-12.1013,-19.6083, 156.27, 138.089, 18.1141,-0.0672322 - 1.625,-15.9359,-12.3206,-19.5867, 156.391, 138.255, 18.0678,-0.0683076 - 1.626, -15.948,-12.0491,-19.5786, 156.509, 138.422, 18.0205,-0.066976 - 1.627,-15.9598,-11.3855,-19.5874, 156.621, 138.583, 17.974,-0.063721 - 1.628,-15.9707,-10.5238,-19.6094, 156.724, 138.738, 17.9268,-0.0594945 - 1.629,-15.9808,-9.68917,-19.6357, 156.819, 138.888, 17.8758,-0.0554006 - 1.63,-15.9902,-9.06733,-19.6555, 156.908, 139.034, 17.8215,-0.0523504 - 1.631,-15.9991,-8.75242,-19.6609, 156.994, 139.175, 17.7679,-0.0508058 - 1.632,-16.0078,-8.72899,-19.6496, 157.08, 139.311, 17.7182,-0.0506909 - 1.633,-16.0167,-8.89251,-19.6263, 157.167, 139.443, 17.6728,-0.0514929 - 1.634,-16.0257,-9.09814,-19.6005, 157.256, 139.574, 17.6296,-0.0525015 - 1.635,-16.0348,-9.21888,-19.5827, 157.347, 139.707, 17.5868,-0.0530938 - 1.636, -16.044,-9.19175,-19.5801, 157.437, 139.841, 17.5428,-0.0529607 - 1.637,-16.0531,-9.03675,-19.5937, 157.526, 139.978, 17.4956,-0.0522004 - 1.638,-16.0621,-8.84401, -19.618, 157.612, 140.116, 17.4446,-0.051255 - 1.639,-16.0709,-8.73598,-19.6431, 157.698, 140.256, 17.3916,-0.0507252 - 1.64,-16.0796,-8.82002,-19.6587, 157.785, 140.394, 17.3397,-0.0511374 - 1.641,-16.0886,-9.14832,-19.6585, 157.874, 140.532, 17.2899,-0.0527477 - 1.642, -16.098,-9.69836,-19.6427, 157.969, 140.674, 17.2403,-0.0554456 - 1.643,-16.1081,-10.3787,-19.6176, 158.071, 140.822, 17.1907,-0.0587826 - 1.644,-16.1188,-11.0556,-19.5936, 158.18, 140.974, 17.1436,-0.0621028 - 1.645,-16.1301,-11.5904,-19.5804, 158.293, 141.127, 17.1016,-0.064726 - 1.646,-16.1419,-11.8749,-19.5833, 158.41, 141.282, 17.0618,-0.0661216 - 1.647,-16.1537,-11.8551,-19.6012, 158.526, 141.442, 17.0178,-0.0660247 - 1.648,-16.1654,-11.5388,-19.6266, 158.639, 141.609, 16.9661,-0.0644728 - 1.649,-16.1767,-10.9876,-19.6494, 158.747, 141.775, 16.9107,-0.0617692 - 1.65,-16.1873,-10.2997,-19.6601, 158.848, 141.932, 16.858,-0.0583954 - 1.651,-16.1973,-9.58798,-19.6545, 158.942, 142.078, 16.8095,-0.0549042 - 1.652,-16.2065,-8.95882,-19.6348, 159.03, 142.217, 16.7611,-0.0518182 - 1.653,-16.2153,-8.49561,-19.6092, 159.113, 142.354, 16.7103,-0.0495461 - 1.654,-16.2236,-8.24685, -19.588, 159.194, 142.486, 16.6604,-0.048326 - 1.655,-16.2319, -8.2201,-19.5799, 159.275, 142.611, 16.6161,-0.0481947 - 1.656,-16.2402,-8.38252,-19.5882, 159.357, 142.731, 16.5768,-0.0489914 - 1.657,-16.2487,-8.66892,-19.6094, 159.442, 142.856, 16.5356,-0.0503962 - 1.658,-16.2575,-8.99752,-19.6348, 159.531, 142.991, 16.4873,-0.052008 - 1.659,-16.2667,-9.29138,-19.6542, 159.622, 143.134, 16.4338,-0.0534494 - 1.66,-16.2761,-9.50065,-19.6596, 159.715, 143.28, 16.3804,-0.0544759 - 1.661,-16.2856, -9.6186,-19.6489, 159.809, 143.425, 16.3296,-0.0550544 - 1.662,-16.2953,-9.68469,-19.6264, 159.904, 143.569, 16.2796,-0.0553786 - 1.663, -16.305,-9.77103,-19.6013, 160, 143.715, 16.2288,-0.0558021 - 1.664,-16.3149,-9.95438,-19.5839, 160.098, 143.862, 16.1791,-0.0567014 - 1.665, -16.325,-10.2818,-19.5813, 160.199, 144.007, 16.1331,-0.0583073 - 1.666,-16.3355,-10.7424,-19.5944, 160.304, 144.153, 16.0907,-0.0605667 - 1.667,-16.3465,-11.2574,-19.6179, 160.414, 144.303, 16.0487,-0.0630925 - 1.668, -16.358,-11.6945,-19.6423, 160.529, 144.46, 16.0042,-0.0652367 - 1.669,-16.3698,-11.9064,-19.6575, 160.646, 144.623, 15.9567,-0.066276 - 1.67,-16.3816,-11.7802,-19.6573, 160.762, 144.79, 15.9063,-0.065657 - 1.671,-16.3932,-11.2823, -19.642, 160.872, 144.956, 15.8534,-0.0632147 - 1.672, -16.404,-10.4806,-19.6177, 160.975, 145.116, 15.7994,-0.0592824 - 1.673, -16.414,-9.53412,-19.5944, 161.069, 145.267, 15.747,-0.05464 - 1.674,-16.4231,-8.65039,-19.5816, 161.153, 145.405, 15.6981,-0.0503053 - 1.675,-16.4315,-8.02353,-19.5845, 161.232, 145.533, 15.6518,-0.0472306 - 1.676,-16.4394,-7.77405,-19.6018, 161.308, 145.657, 15.6057,-0.0460069 - 1.677,-16.4472, -7.9115,-19.6265, 161.386, 145.779, 15.56,-0.0466811 - 1.678,-16.4553,-8.33416,-19.6485, 161.468, 145.903, 15.5165,-0.0487542 - 1.679,-16.4639,-8.86692,-19.6589, 161.555, 146.029, 15.4747,-0.0513674 - 1.68, -16.473,-9.32429,-19.6533, 161.646, 146.162, 15.4303,-0.0536108 - 1.681,-16.4825, -9.5764,-19.6342, 161.74, 146.306, 15.3793,-0.0548474 - 1.682,-16.4921,-9.59371,-19.6093, 161.834, 146.456, 15.3235,-0.0549323 - 1.683,-16.5016,-9.45413,-19.5888, 161.927, 146.604, 15.2687,-0.0542477 - 1.684, -16.511,-9.30967,-19.5812, 162.018, 146.746, 15.2188,-0.0535391 - 1.685,-16.5203,-9.32479,-19.5893, 162.11, 146.885, 15.1713,-0.0536133 - 1.686,-16.5298, -9.6093, -19.61, 162.204, 147.027, 15.1224,-0.0550088 - 1.687,-16.5397,-10.1707,-19.6347, 162.304, 147.173, 15.0728,-0.0577626 - 1.688,-16.5502, -10.904,-19.6534, 162.411, 147.322, 15.0271,-0.0613591 - 1.689,-16.5615,-11.6225,-19.6584, 162.525, 147.473, 14.9868,-0.0648836 - 1.69,-16.5733,-12.1199,-19.6477, 162.644, 147.629, 14.947,-0.0673231 - 1.691,-16.5855,-12.2394,-19.6257, 162.764, 147.795, 14.9013,-0.0679092 - 1.692,-16.5976,-11.9271,-19.6015, 162.881, 147.965, 14.8491,-0.0663777 - 1.693,-16.6092, -11.25,-19.5848, 162.991, 148.133, 14.7951,-0.0630564 - 1.694, -16.62,-10.3724,-19.5826, 163.093, 148.29, 14.7437,-0.058752 - 1.695,-16.6299,-9.50212,-19.5956, 163.186, 148.438, 14.6938,-0.0544831 - 1.696,-16.6391,-8.82368,-19.6186, 163.273, 148.579, 14.6424,-0.0511553 - 1.697,-16.6477,-8.44429,-19.6421, 163.356, 148.716, 14.59,-0.0492944 - 1.698,-16.6561,-8.36887,-19.6565, 163.438, 148.848, 14.5405,-0.0489245 - 1.699,-16.6646,-8.51163, -19.656, 163.521, 148.975, 14.4966,-0.0496247 - 1.7,-16.6732,-8.73717,-19.6408, 163.607, 149.1, 14.4559,-0.050731 - 1.701, -16.682,-8.91466,-19.6171, 163.694, 149.229, 14.4141,-0.0516016 - 1.702, -16.691,-8.96504,-19.5947, 163.782, 149.362, 14.3688,-0.0518487 - 1.703,-16.6999,-8.88534,-19.5826, 163.869, 149.497, 14.3207,-0.0514578 - 1.704,-16.7087,-8.74338,-19.5859, 163.955, 149.634, 14.2709,-0.0507615 - 1.705,-16.7174,-8.64747, -19.603, 164.04, 149.77, 14.2199,-0.050291 - 1.706,-16.7261,-8.70354,-19.6271, 164.125, 149.907, 14.1674,-0.0505661 - 1.707,-16.7349, -8.9759,-19.6482, 164.213, 150.047, 14.1143,-0.051902 - 1.708,-16.7441,-9.46428,-19.6578, 164.306, 150.19, 14.0619,-0.0542975 - 1.709,-16.7539,-10.1035,-19.6518, 164.405, 150.336, 14.0116,-0.0574328 - 1.71,-16.7644,-10.7833,-19.6329, 164.511, 150.486, 13.9642,-0.0607674 - 1.711,-16.7754,-11.3802,-19.6088, 164.623, 150.639, 13.9201,-0.0636953 - 1.712, -16.787,-11.7897,-19.5893, 164.739, 150.794, 13.8784,-0.0657038 - 1.713,-16.7989,-11.9499,-19.5823, 164.856, 150.953, 13.8367,-0.0664895 - 1.714,-16.8108,-11.8513,-19.5908, 164.972, 151.114, 13.7919,-0.0660056 - 1.715,-16.8225,-11.5324,-19.6112, 165.085, 151.277, 13.7435,-0.0644414 - 1.716,-16.8338,-11.0654,-19.6352, 165.194, 151.438, 13.6935,-0.062151 - 1.717,-16.8446,-10.5371,-19.6529, 165.297, 151.594, 13.6433,-0.0595597 - 1.718,-16.8549,-10.0295,-19.6571, 165.395, 151.746, 13.5922,-0.05707 - 1.719,-16.8647,-9.60496,-19.6461, 165.49, 151.896, 13.5384,-0.0549875 - 1.72,-16.8741,-9.29608,-19.6245, 165.581, 152.044, 13.4833,-0.0534724 - 1.721,-16.8833,-9.10262,-19.6011, 165.67, 152.186, 13.4314,-0.0525235 - 1.722,-16.8924,-8.99488,-19.5855, 165.758, 152.321, 13.3856,-0.0519951 - 1.723,-16.9013,-8.92405, -19.584, 165.846, 152.451, 13.3438,-0.0516476 - 1.724,-16.9102,-8.83823,-19.5973, 165.933, 152.58, 13.3013,-0.0512267 - 1.725, -16.919,-8.70119,-19.6198, 166.018, 152.711, 13.256,-0.0505545 - 1.726,-16.9276,-8.50882,-19.6424, 166.101, 152.842, 13.2102,-0.0496109 - 1.727, -16.936,-8.29737,-19.6558, 166.183, 152.969, 13.1657,-0.0485738 - 1.728,-16.9442,-8.13871,-19.6545, 166.263, 153.094, 13.1208,-0.0477955 - 1.729,-16.9523,-8.12132,-19.6391, 166.342, 153.223, 13.0713,-0.0477102 - 1.73,-16.9606,-8.32101,-19.6159, 166.424, 153.359, 13.0161,-0.0486897 - 1.731,-16.9691,-8.77012,-19.5945, 166.51, 153.5, 12.9594,-0.0508926 - 1.732,-16.9782,-9.43638,-19.5835, 166.603, 153.642, 12.9063,-0.0541606 - 1.733, -16.988, -10.221,-19.5875, 166.703, 153.787, 12.8576,-0.0580094 - 1.734,-16.9986,-10.9799,-19.6048, 166.811, 153.938, 12.8104,-0.0617318 - 1.735,-17.0099,-11.5631,-19.6283, 166.924, 154.097, 12.7626,-0.0645921 - 1.736,-17.0216,-11.8605,-19.6483, 167.04, 154.259, 12.7158,-0.0660509 - 1.737,-17.0335,-11.8386,-19.6567, 167.157, 154.418, 12.6726,-0.0659433 - 1.738,-17.0452,-11.5525,-19.6501, 167.27, 154.573, 12.6324,-0.06454 - 1.739,-17.0565,-11.1284,-19.6312, 167.379, 154.726, 12.5908,-0.0624602 - 1.74,-17.0674,-10.7203,-19.6077, 167.484, 154.879, 12.5444,-0.0604583 - 1.741, -17.078,-10.4545,-19.5893, 167.587, 155.034, 12.4934,-0.0591544 - 1.742,-17.0884,-10.3836,-19.5835, 167.689, 155.189, 12.4408,-0.0588068 - 1.743,-17.0989,-10.4664,-19.5927, 167.791, 155.343, 12.3888,-0.0592131 - 1.744,-17.1094,-10.5828, -19.613, 167.895, 155.498, 12.3369,-0.059784 - 1.745, -17.12, -10.58,-19.6362, 167.999, 155.655, 12.2839,-0.0597701 - 1.746,-17.1304,-10.3336,-19.6526, 168.1, 155.811, 12.2307,-0.0585616 - 1.747,-17.1405,-9.80136,-19.6557, 168.196, 155.96, 12.1801,-0.0559509 - 1.748,-17.1499,-9.04816,-19.6441, 168.285, 156.099, 12.1339,-0.0522564 - 1.749,-17.1586,-8.23227,-19.6227, 168.366, 156.226, 12.0915,-0.0482545 - 1.75,-17.1665,-7.55585,-19.6002, 168.44, 156.345, 12.0501,-0.0449366 - 1.751,-17.1738,-7.19701,-19.5859, 168.511, 156.46, 12.0073,-0.0431765 - 1.752,-17.1811,-7.24817,-19.5855, 168.582, 156.576, 11.9626,-0.0434274 - 1.753,-17.1885, -7.6833,-19.5993, 168.657, 156.695, 11.9166,-0.0455618 - 1.754,-17.1966,-8.36676,-19.6216, 168.739, 156.821, 11.8693,-0.0489141 - 1.755,-17.2053,-9.10082,-19.6431, 168.829, 156.956, 11.8198,-0.0525147 - 1.756,-17.2147,-9.69476,-19.6551, 168.924, 157.101, 11.7674,-0.055428 - 1.757,-17.2245,-10.0303,-19.6528, 169.022, 157.253, 11.7124,-0.0570738 - 1.758,-17.2346,-10.0992, -19.637, 169.121, 157.406, 11.6572,-0.0574119 - 1.759,-17.2447,-9.99993,-19.6142, 169.219, 157.558, 11.6043,-0.0569248 - 1.76,-17.2546,-9.89435,-19.5939, 169.316, 157.705, 11.5552,-0.0564069 - 1.761,-17.2645,-9.94205,-19.5843, 169.414, 157.848, 11.5088,-0.0566409 - 1.762,-17.2746,-10.2361,-19.5894, 169.514, 157.992, 11.4637,-0.0580832 - 1.763,-17.2851,-10.7646, -19.607, 169.62, 158.14, 11.4193,-0.0606756 - 1.764,-17.2962,-11.4121,-19.6299, 169.732, 158.292, 11.3761,-0.0638516 - 1.765,-17.3079,-11.9991,-19.6487, 169.849, 158.448, 11.3344,-0.066731 - 1.766,-17.3201,-12.3457,-19.6557, 169.971, 158.61, 11.2925,-0.0684308 - 1.767,-17.3324,-12.3342, -19.648, 170.092, 158.776, 11.2472,-0.0683745 - 1.768,-17.3446,-11.9497,-19.6289, 170.209, 158.945, 11.197,-0.0664886 - 1.769,-17.3562,-11.2833,-19.6062, 170.319, 159.113, 11.1435,-0.0632197 - 1.77,-17.3671,-10.4984,-19.5891, 170.422, 159.273, 11.09,-0.0593699 - 1.771,-17.3772,-9.77456,-19.5848, 170.518, 159.425, 11.0377,-0.0558194 - 1.772,-17.3867,-9.24805,-19.5949, 170.609, 159.57, 10.9854,-0.0532368 - 1.773,-17.3958,-8.97207,-19.6153, 170.697, 159.713, 10.9319,-0.0518832 - 1.774,-17.4048,-8.90833,-19.6376, 170.784, 159.854, 10.8791,-0.0515705 - 1.775,-17.4137,-8.95141,-19.6526, 170.872, 159.99, 10.8307,-0.0517818 - 1.776,-17.4227,-8.97492,-19.6542, 170.96, 160.121, 10.7879,-0.0518971 - 1.777,-17.4316,-8.88145,-19.6418, 171.047, 160.249, 10.7475,-0.0514387 - 1.778,-17.4404,-8.63834,-19.6205, 171.132, 160.377, 10.7053,-0.0502462 - 1.779,-17.4488,-8.28755, -19.599, 171.214, 160.504, 10.6605,-0.0485256 - 1.78,-17.4569,-7.92829,-19.5862, 171.291, 160.629, 10.6156,-0.0467634 - 1.781,-17.4647,-7.68044,-19.5873, 171.367, 160.749, 10.5718,-0.0455477 - 1.782,-17.4724,-7.64309,-19.6018, 171.442, 160.87, 10.5265,-0.0453645 - 1.783,-17.4801,-7.86257,-19.6237, 171.519, 160.996, 10.4759,-0.0464411 - 1.784,-17.4882,-8.31987,-19.6441, 171.6, 161.132, 10.42,-0.0486841 - 1.785,-17.4969,-8.93955,-19.6546, 171.688, 161.273, 10.3634,-0.0517237 - 1.786,-17.5061,-9.61484,-19.6508, 171.782, 161.417, 10.3101,-0.0550359 - 1.787,-17.5161,-10.2391,-19.6344, 171.883, 161.565, 10.2596,-0.0580982 - 1.788,-17.5266,-10.7335,-19.6121, 171.988, 161.719, 10.2088,-0.0605231 - 1.789,-17.5375,-11.0623,-19.5931, 172.097, 161.877, 10.1574,-0.0621359 - 1.79,-17.5486,-11.2347,-19.5852, 172.207, 162.035, 10.1089,-0.0629814 - 1.791,-17.5599,-11.2935,-19.5916, 172.318, 162.188, 10.0659,-0.0632699 - 1.792,-17.5712,-11.2971,-19.6096, 172.428, 162.339, 10.0266,-0.0632876 - 1.793,-17.5825, -11.3,-19.6319, 172.539, 162.49, 9.9862,-0.0633016 - 1.794,-17.5938,-11.3368,-19.6492, 172.651, 162.645, 9.94233,-0.0634823 - 1.795,-17.6052,-11.4136,-19.6546, 172.763, 162.802, 9.89656,-0.0638589 - 1.796,-17.6166,-11.5064,-19.6457, 172.875, 162.96, 9.85093,-0.0643142 - 1.797,-17.6281,-11.5678,-19.6263, 172.989, 163.12, 9.8044,-0.0646154 - 1.798,-17.6397,-11.5393,-19.6043, 173.102, 163.283, 9.75415,-0.0644754 - 1.799,-17.6512,-11.3678,-19.5889, 173.214, 163.45, 9.69951,-0.0636341 - 1.8,-17.6623,-11.0227,-19.5862, 173.322, 163.617, 9.64312,-0.0619414 - 1.801,-17.6731,-10.5093,-19.5975, 173.425, 163.777, 9.58817,-0.0594234 - 1.802,-17.6833,-9.87445,-19.6179, 173.522, 163.93, 9.53557,-0.0563093 - 1.803,-17.6928,-9.20027,-19.6392, 173.612, 164.074, 9.48448,-0.0530025 - 1.804,-17.7017,-8.58689,-19.6526, 173.696, 164.211, 9.4347,-0.0499938 - 1.805,-17.7101,-8.12647,-19.6525, 173.776, 164.341, 9.38721,-0.0477355 - 1.806,-17.7181,-7.87637,-19.6391, 173.853, 164.464, 9.34278,-0.0465088 - 1.807, -17.726,-7.84038,-19.6179, 173.93, 164.583, 9.30084,-0.0463323 - 1.808,-17.7339,-7.96582,-19.5975, 174.008, 164.701, 9.26007,-0.0469475 - 1.809,-17.7419,-8.15966,-19.5865, 174.088, 164.821, 9.21914,-0.0478983 - 1.81,-17.7502,-8.32024,-19.5892, 174.17, 164.944, 9.17674,-0.0486859 - 1.811,-17.7585,-8.37445,-19.6046, 174.252, 165.071, 9.13166,-0.0489518 - 1.812,-17.7668,-8.30728,-19.6263, 174.334, 165.201, 9.08357,-0.0486224 - 1.813,-17.7751, -8.1717,-19.6453, 174.414, 165.332, 9.03339,-0.0479574 - 1.814,-17.7832, -8.0732,-19.6539, 174.493, 165.463, 8.98198,-0.0474742 - 1.815,-17.7913,-8.13253,-19.6486, 174.573, 165.596, 8.92881,-0.0477652 - 1.816,-17.7996,-8.43906,-19.6315, 174.655, 165.733, 8.87307,-0.0492687 - 1.817,-17.8083,-9.01161,-19.6097, 174.744, 165.876, 8.81612,-0.0520771 - 1.818,-17.8177,-9.78261,-19.5922, 174.84, 166.023, 8.76146,-0.0558588 - 1.819,-17.8279,-10.6132,-19.5862, 174.944, 166.173, 8.71135,-0.0599328 - 1.82,-17.8389,-11.3358, -19.594, 175.055, 166.327, 8.66434,-0.0634774 - 1.821,-17.8505,-11.8103,-19.6126, 175.171, 166.488, 8.61756,-0.0658049 - 1.822,-17.8624,-11.9724,-19.6342, 175.288, 166.651, 8.57102,-0.0665999 - 1.823,-17.8743,-11.8566,-19.6498, 175.405, 166.811, 8.52773,-0.0660317 - 1.824, -17.886,-11.5834,-19.6532, 175.518, 166.965, 8.48895,-0.0646918 - 1.825,-17.8974,-11.3144, -19.643, 175.629, 167.115, 8.45101,-0.0633723 - 1.826,-17.9087,-11.1907,-19.6233, 175.739, 167.268, 8.40884,-0.0627658 - 1.827,-17.9199,-11.2783,-19.6022, 175.85, 167.425, 8.36175,-0.0631952 - 1.828,-17.9313,-11.5403,-19.5886, 175.963, 167.585, 8.31357,-0.0644802 - 1.829, -17.943,-11.8486,-19.5879, 176.079, 167.747, 8.26672,-0.0659926 - 1.83, -17.955,-12.0312,-19.6004, 176.197, 167.912, 8.21832,-0.066888 - 1.831, -17.967,-11.9371,-19.6209, 176.314, 168.084, 8.16418,-0.0664266 - 1.832,-17.9787,-11.4966,-19.6411, 176.427, 168.258, 8.10525,-0.0642662 - 1.833,-17.9898,-10.7519,-19.6525, 176.533, 168.425, 8.0474,-0.0606135 - 1.834,-18.0001,-9.84673,-19.6505, 176.629, 168.579, 7.99454,-0.0561734 - 1.835,-18.0095,-8.97824, -19.636, 176.717, 168.721, 7.94448,-0.0519134 - 1.836,-18.0182,-8.32869,-19.6149, 176.799, 168.857, 7.89312,-0.0487274 - 1.837,-18.0263,-8.00194, -19.596, 176.878, 168.989, 7.84105,-0.0471247 - 1.838,-18.0343,-7.98909,-19.5869, 176.956, 169.116, 7.79321,-0.0470617 - 1.839,-18.0424,-8.17599,-19.5915, 177.036, 169.236, 7.75206,-0.0479784 - 1.84,-18.0507,-8.38969,-19.6078, 177.118, 169.355, 7.71398,-0.0490266 - 1.841,-18.0591,-8.46626,-19.6291, 177.201, 169.478, 7.67362,-0.0494022 - 1.842,-18.0675,-8.31437,-19.6466, 177.283, 169.604, 7.63021,-0.0486571 - 1.843,-18.0756, -7.9506,-19.6531, 177.361, 169.727, 7.58713,-0.0468729 - 1.844,-18.0834,-7.49355, -19.646, 177.435, 169.844, 7.54585,-0.044631 - 1.845,-18.0907,-7.11918,-19.6282, 177.504, 169.959, 7.50306,-0.0427947 - 1.846,-18.0977,-6.99475, -19.607, 177.573, 170.076, 7.45473,-0.0421844 - 1.847,-18.1048,-7.21623,-19.5913, 177.644, 170.199, 7.40121,-0.0432708 - 1.848,-18.1123, -7.7726,-19.5874, 177.72, 170.328, 7.34632,-0.0459998 - 1.849,-18.1205,-8.54977,-19.5969, 177.804, 170.462, 7.29232,-0.0498118 - 1.85,-18.1294,-9.37195,-19.6159, 177.896, 170.604, 7.23796,-0.0538446 - 1.851,-18.1392,-10.0642,-19.6366, 177.995, 170.756, 7.18169,-0.0572403 - 1.852,-18.1495,-10.5128,-19.6504, 178.098, 170.913, 7.12492,-0.0594403 - 1.853,-18.1601,-10.7004,-19.6517, 178.203, 171.072, 7.07077,-0.0603606 - 1.854,-18.1708,-10.7056,-19.6399, 178.308, 171.227, 7.02058,-0.060386 - 1.855,-18.1815,-10.6665,-19.6199, 178.412, 171.379, 6.97331,-0.0601942 - 1.856,-18.1921,-10.7247,-19.6001, 178.518, 171.529, 6.92788,-0.0604798 - 1.857, -18.203,-10.9703,-19.5884, 178.625, 171.679, 6.88457,-0.0616847 - 1.858,-18.2142,-11.4086,-19.5898, 178.737, 171.83, 6.84364,-0.0638342 - 1.859,-18.2259,-11.9587,-19.6037, 178.854, 171.984, 6.80401,-0.0665327 - 1.86,-18.2381,-12.4851,-19.6242, 178.977, 172.144, 6.76422,-0.0691147 - 1.861,-18.2508,-12.8464, -19.643, 179.103, 172.308, 6.72376,-0.0708867 - 1.862,-18.2636,-12.9447,-19.6522, 179.23, 172.476, 6.68243,-0.0713691 - 1.863,-18.2765,-12.7575,-19.6482, 179.355, 172.646, 6.63889,-0.0704506 - 1.864, -18.289,-12.3406,-19.6326, 179.476, 172.816, 6.59147,-0.0684058 - 1.865,-18.3011,-11.8049,-19.6118, 179.592, 172.986, 6.54037,-0.0657782 - 1.866,-18.3127,-11.2752,-19.5944, 179.703, 173.152, 6.48767,-0.0631798 - 1.867,-18.3237,-10.8481,-19.5876, 179.809, 173.313, 6.43447,-0.0610849 - 1.868,-18.3344,-10.5633,-19.5942, 179.913, 173.473, 6.3794,-0.059688 - 1.869,-18.3449, -10.397,-19.6114, 180.015, 173.634, 6.32122,-0.0588724 - 1.87,-18.3552,-10.2777,-19.6321, 180.115, 173.795, 6.26205,-0.0582874 - 1.871,-18.3654,-10.1172,-19.6478, 180.215, 173.951, 6.206,-0.0574999 - 1.872,-18.3754,-9.84369, -19.652, 180.311, 174.101, 6.15445,-0.0561584 - 1.873,-18.3851,-9.42746, -19.643, 180.404, 174.245, 6.10472,-0.0541168 - 1.874,-18.3942,-8.88939,-19.6246, 180.491, 174.385, 6.05443,-0.0514776 - 1.875,-18.4028,-8.29292,-19.6043, 180.572, 174.518, 6.00564,-0.0485519 - 1.876,-18.4108,-7.72327,-19.5905, 180.648, 174.64, 5.96234,-0.0457578 - 1.877,-18.4183,-7.26197,-19.5889, 180.719, 174.751, 5.92452,-0.0434951 - 1.878,-18.4254,-6.96495,-19.6001, 180.788, 174.858, 5.88728,-0.0420383 - 1.879,-18.4323,-6.85011,-19.6195, 180.855, 174.967, 5.84671,-0.0414749 - 1.88,-18.4392,-6.89648,-19.6391, 180.922, 175.076, 5.8045,-0.0417024 - 1.881,-18.4462,-7.05385,-19.6507, 180.992, 175.185, 5.76458,-0.0424743 - 1.882,-18.4533,-7.25901,-19.6497, 181.063, 175.293, 5.72641,-0.0434806 - 1.883,-18.4607,-7.45383,-19.6364, 181.136, 175.407, 5.68461,-0.0444362 - 1.884,-18.4682,-7.60091,-19.6164, 181.211, 175.53, 5.63562,-0.0451576 - 1.885,-18.4759,-7.69317,-19.5979, 181.286, 175.658, 5.58228,-0.0456102 - 1.886,-18.4836, -7.7553,-19.5885, 181.362, 175.787, 5.52966,-0.0459149 - 1.887,-18.4914,-7.83667,-19.5922, 181.439, 175.914, 5.47817,-0.046314 - 1.888,-18.4993,-7.99681,-19.6073, 181.517, 176.047, 5.42346,-0.0470995 - 1.889,-18.5074,-8.28669,-19.6276, 181.599, 176.187, 5.36331,-0.0485214 - 1.89, -18.516,-8.73054,-19.6448, 181.684, 176.332, 5.30163,-0.0506985 - 1.891, -18.525,-9.31376,-19.6517, 181.776, 176.478, 5.24401,-0.0535592 - 1.892,-18.5346,-9.98163,-19.6455, 181.874, 176.626, 5.19106,-0.0568351 - 1.893,-18.5449,-10.6509,-19.6288, 181.978, 176.779, 5.13881,-0.0601178 - 1.894,-18.5559,-11.2322,-19.6085, 182.088, 176.94, 5.08522,-0.0629692 - 1.895,-18.5673,-11.6574, -19.593, 182.203, 177.104, 5.03354,-0.0650547 - 1.896,-18.5791,-11.9022,-19.5887, 182.319, 177.265, 4.98794,-0.0662556 - 1.897,-18.5911,-11.9964,-19.5973, 182.437, 177.423, 4.94789,-0.0667173 - 1.898,-18.6031, -12.015,-19.6152, 182.555, 177.579, 4.90898,-0.0668086 - 1.899,-18.6151,-12.0532,-19.6351, 182.673, 177.738, 4.86868,-0.0669962 - 1.9,-18.6272,-12.1911,-19.6487, 182.793, 177.896, 4.82879,-0.0676724 - 1.901,-18.6395,-12.4611,-19.6505, 182.915, 178.054, 4.79171,-0.0689967 - 1.902,-18.6522, -12.831,-19.6396, 183.041, 178.214, 4.75615,-0.0708114 - 1.903,-18.6652,-13.2101,-19.6207, 183.171, 178.38, 4.71827,-0.0726709 - 1.904,-18.6786,-13.4779,-19.6015, 183.303, 178.553, 4.6761,-0.0739843 - 1.905,-18.6921,-13.5269, -19.59, 183.435, 178.73, 4.631,-0.0742245 - 1.906,-18.7055,-13.3039,-19.5909, 183.566, 178.908, 4.58469,-0.0731308 - 1.907,-18.7185,-12.8338,-19.6038, 183.692, 179.084, 4.53656,-0.070825 - 1.908,-18.7311,-12.2154,-19.6233, 183.812, 179.259, 4.48481,-0.0677918 - 1.909, -18.743,-11.5894,-19.6415, 183.925, 179.432, 4.42912,-0.0647213 - 1.91,-18.7543,-11.0887,-19.6508, 184.034, 179.601, 4.37104,-0.0622653 - 1.911,-18.7652,-10.7894,-19.6473, 184.14, 179.767, 4.31206,-0.0607974 - 1.912, -18.776,-10.6816,-19.6326, 184.245, 179.932, 4.25257,-0.0602683 - 1.913,-18.7867,-10.6711,-19.6127, 184.349, 180.097, 4.19275,-0.0602171 - 1.914,-18.7973, -10.615,-19.5959, 184.454, 180.26, 4.13344,-0.0599417 - 1.915,-18.8078,-10.3759, -19.589, 184.555, 180.421, 4.07557,-0.0587689 - 1.916,-18.8179,-9.87759, -19.595, 184.652, 180.576, 4.01952,-0.0563247 - 1.917,-18.8274,-9.13853,-19.6113, 184.742, 180.724, 3.96565,-0.0526997 - 1.918,-18.8361, -8.2704,-19.6311, 184.823, 180.86, 3.915,-0.0484415 - 1.919, -18.844,-7.44078,-19.6464, 184.896, 180.983, 3.86835,-0.0443722 - 1.92,-18.8511,-6.81322,-19.6507, 184.963, 181.097, 3.82497,-0.041294 - 1.921,-18.8578,-6.48711,-19.6423, 185.027, 181.204, 3.7833,-0.0396944 - 1.922,-18.8642,-6.46048,-19.6247, 185.09, 181.307, 3.7431,-0.0395638 - 1.923,-18.8708,-6.63061,-19.6053, 185.155, 181.409, 3.70568,-0.0403983 - 1.924,-18.8775,-6.83303,-19.5919, 185.222, 181.509, 3.67145,-0.0413912 - 1.925,-18.8844,-6.90468,-19.5902, 185.29, 181.61, 3.63811,-0.0417426 - 1.926,-18.8912,-6.74729,-19.6008, 185.356, 181.712, 3.60268,-0.0409706 - 1.927,-18.8978,-6.36662,-19.6193, 185.418, 181.814, 3.56485,-0.0391034 - 1.928,-18.9039,-5.87209,-19.6381, 185.476, 181.913, 3.52673,-0.0366778 - 1.929,-18.9095,-5.43659,-19.6494, 185.529, 182.006, 3.48903,-0.0345417 - 1.93,-18.9149,-5.23127,-19.6485, 185.581, 182.098, 3.44896,-0.0335346 - 1.931,-18.9202,-5.36038,-19.6359, 185.633, 182.196, 3.40328,-0.0341678 - 1.932,-18.9258,-5.82098,-19.6167, 185.69, 182.301, 3.35249,-0.0364271 - 1.933,-18.9319,-6.50325,-19.5989, 185.754, 182.414, 3.30008,-0.0397736 - 1.934,-18.9388,-7.23126,-19.5899, 185.825, 182.534, 3.24763,-0.0433445 - 1.935,-18.9463,-7.82873,-19.5933, 185.902, 182.663, 3.19261,-0.0462751 - 1.936,-18.9543,-8.18465,-19.6078, 185.982, 182.802, 3.13214,-0.0480209 - 1.937,-18.9626,-8.29364,-19.6272, 186.064, 182.947, 3.06766,-0.0485555 - 1.938,-18.9708,-8.25577,-19.6437, 186.144, 183.092, 3.00375,-0.0483697 - 1.939,-18.9791,-8.23625,-19.6503, 186.225, 183.234, 2.94258,-0.048274 - 1.94,-18.9874,-8.40062,-19.6444, 186.308, 183.377, 2.88174,-0.0490802 - 1.941, -18.996,-8.85045,-19.6284, 186.395, 183.525, 2.81846,-0.0512866 - 1.942,-19.0053,-9.58397, -19.609, 186.489, 183.679, 2.75444,-0.0548845 - 1.943,-19.0153,-10.4964,-19.5941, 186.592, 183.838, 2.69435,-0.05936 - 1.944,-19.0263,-11.4192, -19.59, 186.704, 183.999, 2.6402,-0.0638861 - 1.945,-19.0381,-12.1825,-19.5983, 186.823, 184.166, 2.58919,-0.0676302 - 1.946,-19.0505,-12.6774,-19.6155, 186.947, 184.339, 2.53819,-0.0700576 - 1.947,-19.0633,-12.8934,-19.6346, 187.074, 184.514, 2.48838,-0.0711172 - 1.948,-19.0762,-12.9185,-19.6476, 187.201, 184.686, 2.44374,-0.0712407 - 1.949,-19.0891,-12.9025,-19.6492, 187.327, 184.85, 2.40558,-0.0711618 - 1.95, -19.102,-12.9973,-19.6387, 187.455, 185.012, 2.37066,-0.071627 - 1.951,-19.1152,-13.2997,-19.6205, 187.585, 185.177, 2.3354,-0.0731102 - 1.952,-19.1287,-13.8152,-19.6021, 187.721, 185.345, 2.30029,-0.0756389 - 1.953,-19.1429,-14.4582,-19.5912, 187.863, 185.515, 2.26843,-0.0787929 - 1.954,-19.1576,-15.0857,-19.5922, 188.011, 185.688, 2.24056,-0.0818705 - 1.955, -19.173,-15.5512,-19.6047, 188.163, 185.865, 2.21345,-0.0841538 - 1.956,-19.1886,-15.7586,-19.6235, 188.318, 186.049, 2.18359,-0.0851709 - 1.957,-19.2043,-15.6944,-19.6408, 188.472, 186.236, 2.15104,-0.0848564 - 1.958,-19.2199,-15.4295,-19.6495, 188.623, 186.421, 2.1183,-0.0835569 - 1.959,-19.2352,-15.0885, -19.646, 188.771, 186.603, 2.08611,-0.0818841 - 1.96,-19.2501,-14.8021,-19.6317, 188.916, 186.784, 2.05186,-0.0804792 - 1.961,-19.2648,-14.6592,-19.6126, 189.06, 186.968, 2.01268,-0.0797784 - 1.962,-19.2795, -14.677,-19.5966, 189.204, 187.156, 1.9686,-0.0798656 - 1.963,-19.2943,-14.7986,-19.5903, 189.349, 187.347, 1.92185,-0.0804621 - 1.964,-19.3091, -14.918,-19.5963, 189.496, 187.541, 1.87351,-0.0810479 - 1.965, -19.324,-14.9213,-19.6121, 189.642, 187.739, 1.82206,-0.0810639 - 1.966,-19.3389,-14.7278,-19.6311, 189.786, 187.941, 1.76553,-0.0801151 - 1.967,-19.3534,-14.3177,-19.6455, 189.927, 188.145, 1.70405,-0.0781032 - 1.968,-19.3674, -13.735,-19.6493, 190.062, 188.347, 1.63964,-0.0752451 - 1.969,-19.3808,-13.0692, -19.641, 190.19, 188.544, 1.57377,-0.0719795 - 1.97,-19.3936,-12.4216, -19.624, 190.312, 188.737, 1.50604,-0.0688031 - 1.971,-19.4057,-11.8703,-19.6053, 190.428, 188.927, 1.43528,-0.0660991 - 1.972,-19.4174,-11.4462,-19.5928, 190.54, 189.115, 1.36158,-0.0640187 - 1.973,-19.4286,-11.1266,-19.5915, 190.65, 189.301, 1.28656,-0.062451 - 1.974,-19.4396, -10.848,-19.6021, 190.756, 189.483, 1.21187,-0.0610845 - 1.975,-19.4503, -10.531, -19.62, 190.859, 189.662, 1.13794,-0.0595295 - 1.976,-19.4606,-10.1082,-19.6379, 190.958, 189.837, 1.06418,-0.0574558 - 1.977,-19.4705,-9.54609,-19.6483, 191.052, 190.007, 0.99037,-0.0546987 - 1.978,-19.4797,-8.85368,-19.6471, 191.139, 190.17,0.917461,-0.0513024 - 1.979,-19.4881,-8.07724,-19.6346, 191.218, 190.324,0.847025,-0.047494 - 1.98,-19.4958,-7.28395,-19.6161, 191.29, 190.466,0.780005,-0.043603 - 1.981,-19.5027,-6.54063,-19.5992, 191.354, 190.598,0.716147,-0.039957 - 1.982,-19.5089,-5.89421, -19.591, 191.412, 190.72,0.654755,-0.0367863 - 1.983,-19.5146,-5.35954,-19.5948, 191.464, 190.834,0.595971,-0.0341637 - 1.984,-19.5197,-4.91703, -19.609, 191.512, 190.939, 0.54107,-0.0319932 - 1.985,-19.5244,-4.52016,-19.6278, 191.557, 191.035,0.491317,-0.0300465 - 1.986,-19.5287,-4.11017,-19.6433, 191.597, 191.122,0.446663,-0.0280355 - 1.987,-19.5326, -3.6339,-19.6491, 191.633, 191.201, 0.40594,-0.0256994 - 1.988, -19.536,-3.05991,-19.6429, 191.663, 191.271,0.368479,-0.022884 - 1.989,-19.5387,-2.38873,-19.6272, 191.686, 191.331,0.335183,-0.0195919 - 1.99,-19.5407,-1.65413,-19.6086, 191.702, 191.379,0.307551,-0.0159887 - 1.991, -19.542,-0.914541,-19.5947, 191.711, 191.413,0.285756,-0.012361 - 1.992,-19.5426,-0.236329,-19.5913, 191.714, 191.436,0.268274,-0.00903436 - 1.993,-19.5425,0.326715,-19.5999, 191.711, 191.45,0.253729,-0.00627263 - 1.994, -19.542,0.751643,-19.6167, 191.703, 191.456,0.242665,-0.00418836 - 1.995,-19.5411, 1.0561,-19.6349, 191.693, 191.453,0.236809,-0.00269499 - 1.996,-19.5399, 1.29529,-19.6469, 191.68, 191.442,0.236639,-0.00152176 - 1.997,-19.5385, 1.54572,-19.6477, 191.665, 191.424,0.240436,-0.000293403 - 1.998,-19.5368, 1.87993,-19.6371, 191.646, 191.402,0.246255,0.0013459 - 1.999,-19.5347, 2.34027,-19.6194, 191.623, 191.373,0.254326,0.00360385 - 2, -19.532, 2.92114, -19.602, 191.595, 191.335,0.266626,0.00645304 + time, wext, epot, ekin, total + 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00, 0.000000e+00 + 1.000000e-03, 3.150066e-02, 4.218838e-04, 7.453281e-03, -2.362549e-02 + 2.000000e-03, 1.192525e-01, 9.239471e-03, 5.826194e-02, -5.175108e-02 + 3.000000e-03, 2.451748e-01, 5.000320e-02, 1.243353e-01, -7.083630e-02 + 4.000000e-03, 3.855903e-01, 1.333986e-01, 1.741088e-01, -7.808294e-02 + 5.000000e-03, 5.184902e-01, 2.347165e-01, 2.094486e-01, -7.432509e-02 + 6.000000e-03, 6.297949e-01, 3.146627e-01, 2.516047e-01, -6.352752e-02 + 7.000000e-03, 7.165161e-01, 3.573292e-01, 3.079512e-01, -5.123577e-02 + 8.000000e-03, 7.859144e-01, 3.788452e-01, 3.644949e-01, -4.257433e-02 + 9.000000e-03, 8.512332e-01, 4.017200e-01, 4.089786e-01, -4.053454e-02 + 1.000000e-02, 9.257974e-01, 4.325474e-01, 4.480928e-01, -4.515724e-02 + 1.100000e-02, 1.017757e+00, 4.683252e-01, 4.955768e-01, -5.385490e-02 + 1.200000e-02, 1.127365e+00, 5.131100e-01, 5.515759e-01, -6.267943e-02 + 1.300000e-02, 1.247606e+00, 5.758656e-01, 6.037449e-01, -6.799539e-02 + 1.400000e-02, 1.367643e+00, 6.533470e-01, 6.464022e-01, -6.789377e-02 + 1.500000e-02, 1.477531e+00, 7.263791e-01, 6.883326e-01, -6.281901e-02 + 1.600000e-02, 1.572215e+00, 7.782312e-01, 7.387665e-01, -5.521734e-02 + 1.700000e-02, 1.653281e+00, 8.111563e-01, 7.937167e-01, -4.840818e-02 + 1.800000e-02, 1.727882e+00, 8.399669e-01, 8.427397e-01, -4.517579e-02 + 1.900000e-02, 1.805457e+00, 8.739710e-01, 8.848233e-01, -4.666227e-02 + 2.000000e-02, 1.893690e+00, 9.123489e-01, 9.293492e-01, -5.199187e-02 + 2.100000e-02, 1.995420e+00, 9.551186e-01, 9.815613e-01, -5.874022e-02 + 2.200000e-02, 2.107699e+00, 1.008724e+00, 1.034961e+00, -6.401474e-02 + 2.300000e-02, 2.223299e+00, 1.076041e+00, 1.081583e+00, -6.567493e-02 + 2.400000e-02, 2.333920e+00, 1.146764e+00, 1.123970e+00, -6.318554e-02 + 2.500000e-02, 2.433705e+00, 1.205037e+00, 1.170900e+00, -5.776797e-02 + 2.600000e-02, 2.521589e+00, 1.245801e+00, 1.223971e+00, -5.181722e-02 + 2.700000e-02, 2.601550e+00, 1.278193e+00, 1.275502e+00, -4.785548e-02 + 2.800000e-02, 2.680748e+00, 1.312854e+00, 1.320419e+00, -4.747410e-02 + 2.900000e-02, 2.766404e+00, 1.351922e+00, 1.363778e+00, -5.070332e-02 + 3.000000e-02, 2.862766e+00, 1.393913e+00, 1.412797e+00, -5.605629e-02 + 3.100000e-02, 2.969426e+00, 1.442294e+00, 1.465927e+00, -6.120507e-02 + 3.200000e-02, 3.081646e+00, 1.502179e+00, 1.515482e+00, -6.398533e-02 + 3.300000e-02, 3.192495e+00, 1.569786e+00, 1.559409e+00, -6.329939e-02 + 3.400000e-02, 3.295832e+00, 1.632086e+00, 1.604202e+00, -5.954346e-02 + 3.500000e-02, 3.388872e+00, 1.679625e+00, 1.654852e+00, -5.439525e-02 + 3.600000e-02, 3.473261e+00, 1.715823e+00, 1.707368e+00, -5.006997e-02 + 3.700000e-02, 3.554256e+00, 1.750827e+00, 1.755056e+00, -4.837239e-02 + 3.800000e-02, 3.638402e+00, 1.789755e+00, 1.798698e+00, -4.994819e-02 + 3.900000e-02, 3.730739e+00, 1.831530e+00, 1.845165e+00, -5.404359e-02 + 4.000000e-02, 3.832709e+00, 1.876969e+00, 1.896879e+00, -5.886046e-02 + 4.100000e-02, 3.941643e+00, 1.931030e+00, 1.948271e+00, -6.234195e-02 + 4.200000e-02, 4.051987e+00, 1.994543e+00, 1.994397e+00, -6.304718e-02 + 4.300000e-02, 4.157725e+00, 2.058583e+00, 2.038398e+00, -6.074442e-02 + 4.400000e-02, 4.254935e+00, 2.111901e+00, 2.086554e+00, -5.647989e-02 + 4.500000e-02, 4.343396e+00, 2.152578e+00, 2.138712e+00, -5.210559e-02 + 4.600000e-02, 4.426601e+00, 2.188457e+00, 2.188666e+00, -4.947785e-02 + 4.700000e-02, 4.510195e+00, 2.226839e+00, 2.233684e+00, -4.967221e-02 + 4.800000e-02, 4.599536e+00, 2.268423e+00, 2.278567e+00, -5.254556e-02 + 4.900000e-02, 4.697431e+00, 2.312388e+00, 2.328220e+00, -5.682287e-02 + 5.000000e-02, 4.803003e+00, 2.362124e+00, 2.380218e+00, -6.066077e-02 + 5.100000e-02, 4.912132e+00, 2.421059e+00, 2.428633e+00, -6.243976e-02 + 5.200000e-02, 5.019273e+00, 2.484741e+00, 2.473086e+00, -6.144568e-02 + 5.300000e-02, 5.119831e+00, 2.542466e+00, 2.519211e+00, -5.815432e-02 + 5.400000e-02, 5.212094e+00, 2.588089e+00, 2.569998e+00, -5.400672e-02 + 5.500000e-02, 5.297904e+00, 2.625811e+00, 2.621313e+00, -5.077997e-02 + 5.600000e-02, 5.381808e+00, 2.663685e+00, 2.668296e+00, -4.982750e-02 + 5.700000e-02, 5.469084e+00, 2.704824e+00, 2.712747e+00, -5.151287e-02 + 5.800000e-02, 5.563480e+00, 2.748131e+00, 2.760276e+00, -5.507343e-02 + 5.900000e-02, 5.665658e+00, 2.794971e+00, 2.811722e+00, -5.896376e-02 + 6.000000e-02, 5.772957e+00, 2.849465e+00, 2.861968e+00, -6.152507e-02 + 6.100000e-02, 5.880589e+00, 2.911095e+00, 2.907803e+00, -6.169114e-02 + 6.200000e-02, 5.983701e+00, 2.971504e+00, 2.952767e+00, -5.943097e-02 + 6.300000e-02, 6.079440e+00, 3.022033e+00, 3.001663e+00, -5.574486e-02 + 6.400000e-02, 6.168136e+00, 3.062666e+00, 3.053247e+00, -5.222285e-02 + 6.500000e-02, 6.253105e+00, 3.100533e+00, 3.102212e+00, -5.035999e-02 + 6.600000e-02, 6.339201e+00, 3.140966e+00, 3.147312e+00, -5.092279e-02 + 6.700000e-02, 6.430720e+00, 3.183894e+00, 3.193191e+00, -5.363483e-02 + 6.800000e-02, 6.529590e+00, 3.229041e+00, 3.243239e+00, -5.731016e-02 + 6.900000e-02, 6.634582e+00, 3.279749e+00, 3.294462e+00, -6.037095e-02 + 7.000000e-02, 6.741879e+00, 3.338231e+00, 3.342124e+00, -6.152392e-02 + 7.100000e-02, 6.846741e+00, 3.399465e+00, 3.386970e+00, -6.030591e-02 + 7.200000e-02, 6.945528e+00, 3.454246e+00, 3.434013e+00, -5.726888e-02 + 7.300000e-02, 7.037239e+00, 3.498652e+00, 3.484857e+00, -5.373083e-02 + 7.400000e-02, 7.123898e+00, 3.537389e+00, 3.535305e+00, -5.120459e-02 + 7.500000e-02, 7.209651e+00, 3.577080e+00, 3.581820e+00, -5.075175e-02 + 7.600000e-02, 7.298976e+00, 3.619546e+00, 3.626892e+00, -5.253725e-02 + 7.700000e-02, 7.394768e+00, 3.663824e+00, 3.675172e+00, -5.577127e-02 + 7.800000e-02, 7.497133e+00, 3.711703e+00, 3.726372e+00, -5.905786e-02 + 7.900000e-02, 7.603376e+00, 3.766613e+00, 3.775767e+00, -6.099684e-02 + 8.000000e-02, 7.709185e+00, 3.826968e+00, 3.821437e+00, -6.077963e-02 + 8.100000e-02, 7.810487e+00, 3.884807e+00, 3.867154e+00, -5.852588e-02 + 8.200000e-02, 7.905178e+00, 3.933388e+00, 3.916569e+00, -5.522081e-02 + 8.300000e-02, 7.993998e+00, 3.974049e+00, 3.967664e+00, -5.228515e-02 + 8.400000e-02, 8.080178e+00, 4.013324e+00, 4.015889e+00, -5.096498e-02 + 8.500000e-02, 8.168034e+00, 4.055115e+00, 4.061116e+00, -5.180336e-02 + 8.600000e-02, 8.261119e+00, 4.098922e+00, 4.107779e+00, -5.441757e-02 + 8.700000e-02, 8.360715e+00, 4.144965e+00, 4.158077e+00, -5.767297e-02 + 8.800000e-02, 8.465314e+00, 4.196490e+00, 4.208649e+00, -6.017499e-02 + 8.900000e-02, 8.571296e+00, 4.254672e+00, 4.255758e+00, -6.086604e-02 + 9.000000e-02, 8.674490e+00, 4.314039e+00, 4.300978e+00, -5.947208e-02 + 9.100000e-02, 8.771960e+00, 4.366608e+00, 4.348742e+00, -5.661051e-02 + 9.200000e-02, 8.863245e+00, 4.410167e+00, 4.399561e+00, -5.351719e-02 + 9.300000e-02, 8.950521e+00, 4.449718e+00, 4.449289e+00, -5.151316e-02 + 9.400000e-02, 9.037652e+00, 4.490724e+00, 4.495488e+00, -5.144089e-02 + 9.500000e-02, 9.128523e+00, 4.534096e+00, 4.541117e+00, -5.331053e-02 + 9.600000e-02, 9.225381e+00, 4.579105e+00, 4.589972e+00, -5.630447e-02 + 9.700000e-02, 9.327900e+00, 4.627868e+00, 4.640897e+00, -5.913451e-02 + 9.800000e-02, 9.433341e+00, 4.683149e+00, 4.689596e+00, -6.059572e-02 + 9.900000e-02, 9.537749e+00, 4.742463e+00, 4.735207e+00, -6.007910e-02 + 1.000000e-01, 9.637649e+00, 4.798244e+00, 4.781579e+00, -5.782502e-02 + 1.010000e-01, 9.731523e+00, 4.845346e+00, 4.831364e+00, -5.481216e-02 + 1.020000e-01, 9.820438e+00, 4.886116e+00, 4.881989e+00, -5.233289e-02 + 1.030000e-01, 9.907566e+00, 4.926500e+00, 4.929627e+00, -5.143929e-02 + 1.040000e-01, 9.996810e+00, 4.969274e+00, 4.975039e+00, -5.249701e-02 + 1.050000e-01, 1.009113e+01, 5.013727e+00, 5.022368e+00, -5.503606e-02 + 1.060000e-01, 1.019130e+01, 5.060542e+00, 5.072799e+00, -5.795928e-02 + 1.070000e-01, 1.029558e+01, 5.112788e+00, 5.122778e+00, -6.001613e-02 + 1.080000e-01, 1.040051e+01, 5.170695e+00, 5.169474e+00, -6.033736e-02 + 1.090000e-01, 1.050236e+01, 5.228473e+00, 5.215085e+00, -5.880209e-02 + 1.100000e-01, 1.059877e+01, 5.279253e+00, 5.263440e+00, -5.608237e-02 + 1.110000e-01, 1.068972e+01, 5.322221e+00, 5.314153e+00, -5.334932e-02 + 1.120000e-01, 1.077751e+01, 5.362493e+00, 5.363249e+00, -5.176910e-02 + 1.130000e-01, 1.086577e+01, 5.404514e+00, 5.409252e+00, -5.200557e-02 + 1.140000e-01, 1.095790e+01, 5.448551e+00, 5.455412e+00, -5.394170e-02 + 1.150000e-01, 1.105563e+01, 5.494178e+00, 5.504713e+00, -5.673637e-02 + 1.160000e-01, 1.115826e+01, 5.543743e+00, 5.555323e+00, -5.918958e-02 + 1.170000e-01, 1.126302e+01, 5.599329e+00, 5.603434e+00, -6.025745e-02 + 1.180000e-01, 1.136626e+01, 5.657689e+00, 5.649078e+00, -5.949615e-02 + 1.190000e-01, 1.146500e+01, 5.711712e+00, 5.696046e+00, -5.724616e-02 + 1.200000e-01, 1.155821e+01, 5.757653e+00, 5.746081e+00, -5.448025e-02 + 1.210000e-01, 1.164723e+01, 5.798613e+00, 5.796234e+00, -5.238321e-02 + 1.220000e-01, 1.173517e+01, 5.839922e+00, 5.843403e+00, -5.184449e-02 + 1.230000e-01, 1.182558e+01, 5.883442e+00, 5.889059e+00, -5.308121e-02 + 1.240000e-01, 1.192093e+01, 5.928415e+00, 5.936968e+00, -5.555100e-02 + 1.250000e-01, 1.202156e+01, 5.975942e+00, 5.987430e+00, -5.818966e-02 + 1.260000e-01, 1.212555e+01, 6.028830e+00, 6.036852e+00, -5.986951e-02 + 1.270000e-01, 1.222956e+01, 6.086429e+00, 6.083253e+00, -5.988111e-02 + 1.280000e-01, 1.233028e+01, 6.142769e+00, 6.129276e+00, -5.823269e-02 + 1.290000e-01, 1.242581e+01, 6.192051e+00, 6.178117e+00, -5.564098e-02 + 1.300000e-01, 1.251650e+01, 6.234626e+00, 6.228653e+00, -5.321975e-02 + 1.310000e-01, 1.260475e+01, 6.275567e+00, 6.277183e+00, -5.200136e-02 + 1.320000e-01, 1.269399e+01, 6.318403e+00, 6.323095e+00, -5.249677e-02 + 1.330000e-01, 1.278721e+01, 6.362953e+00, 6.369772e+00, -5.448143e-02 + 1.340000e-01, 1.288565e+01, 6.409147e+00, 6.419406e+00, -5.709673e-02 + 1.350000e-01, 1.298834e+01, 6.459458e+00, 6.469663e+00, -5.922128e-02 + 1.360000e-01, 1.309249e+01, 6.515267e+00, 6.517276e+00, -5.995159e-02 + 1.370000e-01, 1.319472e+01, 6.572695e+00, 6.563036e+00, -5.898611e-02 + 1.380000e-01, 1.329247e+01, 6.625164e+00, 6.610552e+00, -5.674952e-02 + 1.390000e-01, 1.338513e+01, 6.670191e+00, 6.660730e+00, -5.420614e-02 + 1.400000e-01, 1.347427e+01, 6.711412e+00, 6.710409e+00, -5.244428e-02 + 1.410000e-01, 1.356294e+01, 6.753515e+00, 6.757212e+00, -5.221072e-02 + 1.420000e-01, 1.365438e+01, 6.797616e+00, 6.803165e+00, -5.359434e-02 + 1.430000e-01, 1.375061e+01, 6.843042e+00, 6.851576e+00, -5.599280e-02 + 1.440000e-01, 1.385161e+01, 6.891253e+00, 6.901981e+00, -5.837467e-02 + 1.450000e-01, 1.395530e+01, 6.944704e+00, 6.950878e+00, -5.972281e-02 + 1.460000e-01, 1.405849e+01, 7.001935e+00, 6.997088e+00, -5.946859e-02 + 1.470000e-01, 1.415820e+01, 7.056932e+00, 7.043541e+00, -5.773160e-02 + 1.480000e-01, 1.425298e+01, 7.104943e+00, 7.092775e+00, -5.526385e-02 + 1.490000e-01, 1.434348e+01, 7.147287e+00, 7.143069e+00, -5.312434e-02 + 1.500000e-01, 1.443218e+01, 7.188858e+00, 7.191096e+00, -5.222471e-02 + 1.510000e-01, 1.452231e+01, 7.232359e+00, 7.237011e+00, -5.294093e-02 + 1.520000e-01, 1.461647e+01, 7.277329e+00, 7.284188e+00, -5.495634e-02 + 1.530000e-01, 1.471553e+01, 7.324069e+00, 7.334055e+00, -5.740144e-02 + 1.540000e-01, 1.481823e+01, 7.375079e+00, 7.383926e+00, -5.922896e-02 + 1.550000e-01, 1.492181e+01, 7.431019e+00, 7.431126e+00, -5.966223e-02 + 1.560000e-01, 1.502311e+01, 7.487508e+00, 7.477074e+00, -5.852518e-02 + 1.570000e-01, 1.511998e+01, 7.538583e+00, 7.525088e+00, -5.631367e-02 + 1.580000e-01, 1.521219e+01, 7.582899e+00, 7.575314e+00, -5.397933e-02 + 1.590000e-01, 1.530148e+01, 7.624441e+00, 7.624522e+00, -5.252020e-02 + 1.600000e-01, 1.539084e+01, 7.667232e+00, 7.671055e+00, -5.255414e-02 + 1.610000e-01, 1.548321e+01, 7.711799e+00, 7.717348e+00, -5.405729e-02 + 1.620000e-01, 1.558021e+01, 7.757645e+00, 7.766188e+00, -5.637828e-02 + 1.630000e-01, 1.568150e+01, 7.806525e+00, 7.816457e+00, -5.852042e-02 + 1.640000e-01, 1.578489e+01, 7.860457e+00, 7.864864e+00, -5.956955e-02 + 1.650000e-01, 1.588731e+01, 7.917245e+00, 7.910980e+00, -5.908412e-02 + 1.660000e-01, 1.598612e+01, 7.970965e+00, 7.957874e+00, -5.728085e-02 + 1.670000e-01, 1.608025e+01, 8.017899e+00, 8.007409e+00, -5.493821e-02 + 1.680000e-01, 1.617062e+01, 8.060149e+00, 8.057407e+00, -5.306043e-02 + 1.690000e-01, 1.625976e+01, 8.102317e+00, 8.104996e+00, -5.244710e-02 + 1.700000e-01, 1.635072e+01, 8.146365e+00, 8.150998e+00, -5.335278e-02 + 1.710000e-01, 1.644573e+01, 8.191696e+00, 8.198651e+00, -5.538152e-02 + 1.720000e-01, 1.654530e+01, 8.238982e+00, 8.248656e+00, -5.765981e-02 + 1.730000e-01, 1.664797e+01, 8.290641e+00, 8.298119e+00, -5.921261e-02 + 1.740000e-01, 1.675098e+01, 8.346612e+00, 8.344990e+00, -5.938058e-02 + 1.750000e-01, 1.685143e+01, 8.402145e+00, 8.391188e+00, -5.809992e-02 + 1.760000e-01, 1.694753e+01, 8.451962e+00, 8.439647e+00, -5.592621e-02 + 1.770000e-01, 1.703937e+01, 8.495745e+00, 8.489833e+00, -5.379348e-02 + 1.780000e-01, 1.712885e+01, 8.537653e+00, 8.538581e+00, -5.261296e-02 + 1.790000e-01, 1.721886e+01, 8.581044e+00, 8.584937e+00, -5.288378e-02 + 1.800000e-01, 1.731208e+01, 8.625992e+00, 8.631604e+00, -5.448208e-02 + 1.810000e-01, 1.740976e+01, 8.672250e+00, 8.680795e+00, -5.671738e-02 + 1.820000e-01, 1.751127e+01, 8.721784e+00, 8.730859e+00, -5.863081e-02 + 1.830000e-01, 1.761434e+01, 8.776110e+00, 8.778820e+00, -5.940635e-02 + 1.840000e-01, 1.771602e+01, 8.832375e+00, 8.824930e+00, -5.871878e-02 + 1.850000e-01, 1.781401e+01, 8.884879e+00, 8.872264e+00, -5.686993e-02 + 1.860000e-01, 1.790758e+01, 8.930907e+00, 8.922012e+00, -5.465633e-02 + 1.870000e-01, 1.799788e+01, 8.973178e+00, 8.971673e+00, -5.302608e-02 + 1.880000e-01, 1.808747e+01, 9.015908e+00, 9.018892e+00, -5.267286e-02 + 1.890000e-01, 1.817920e+01, 9.060409e+00, 9.065054e+00, -5.374083e-02 + 1.900000e-01, 1.827499e+01, 9.106068e+00, 9.113152e+00, -5.576598e-02 + 1.910000e-01, 1.837499e+01, 9.153908e+00, 9.163205e+00, -5.787760e-02 + 1.920000e-01, 1.847759e+01, 9.206163e+00, 9.212250e+00, -5.917263e-02 + 1.930000e-01, 1.858004e+01, 9.262061e+00, 9.258876e+00, -5.910178e-02 + 1.940000e-01, 1.867969e+01, 9.316617e+00, 9.305374e+00, -5.770242e-02 + 1.950000e-01, 1.877510e+01, 9.365305e+00, 9.354218e+00, -5.557959e-02 + 1.960000e-01, 1.886664e+01, 9.408709e+00, 9.404287e+00, -5.364448e-02 + 1.970000e-01, 1.895634e+01, 9.451017e+00, 9.452597e+00, -5.272333e-02 + 1.980000e-01, 1.904700e+01, 9.494928e+00, 9.498863e+00, -5.320476e-02 + 1.990000e-01, 1.914100e+01, 9.540198e+00, 9.545924e+00, -5.487587e-02 + 2.000000e-01, 1.923928e+01, 9.586875e+00, 9.595389e+00, -5.701627e-02 diff --git a/test/test_model/test_solid_mechanics_model/patch_tests/CMakeLists.txt b/test/test_model/test_solid_mechanics_model/patch_tests/CMakeLists.txt index 28f9f60fd..25c01e4bf 100644 --- a/test/test_model/test_solid_mechanics_model/patch_tests/CMakeLists.txt +++ b/test/test_model/test_solid_mechanics_model/patch_tests/CMakeLists.txt @@ -1,68 +1,68 @@ #=============================================================================== # @file CMakeLists.txt # # @author David Simon Kammer # @author Nicolas Richart # # @date creation: Fri Oct 22 2010 # @date last modification: Mon Dec 07 2015 # # @brief configuration for patch tests # # @section LICENSE # # Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de # Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des # Solides) # # Akantu is free software: you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) any # later version. # # Akantu is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with Akantu. If not, see . # # @section DESCRIPTION # #=============================================================================== add_mesh(test_weight_hexa_mesh colone_hexa.geo 3 1) add_mesh(test_weight_tetra_mesh colone_tetra.geo 3 1) register_test(test_weight SOURCES colone_weight.cc DEPENDS test_weight_hexa_mesh test_weight_tetra_mesh FILES_TO_COPY material_colone.dat DIRECTORIES_TO_CREATE paraview/test_weight_hexa paraview/test_weight_tetra PACKAGE core ) #=============================================================================== set(LIST_TYPES segment_2 segment_3 tetrahedron_4 tetrahedron_10 hexahedron_8 hexahedron_20 pentahedron_6 pentahedron_15 ) set(LIST_TYPES_2D triangle_3 triangle_6 quadrangle_4 quadrangle_8 ) add_akantu_test(explicit "Explicit patch tests") add_akantu_test(implicit "Implicit patch tests") -add_akantu_test(lumped_mass "Test the mass lumping") \ No newline at end of file +add_akantu_test(lumped_mass "Test the mass lumping") diff --git a/test/test_model/test_solid_mechanics_model/patch_tests/colone_weight.cc b/test/test_model/test_solid_mechanics_model/patch_tests/colone_weight.cc index 729522bad..aae8a3c5d 100644 --- a/test/test_model/test_solid_mechanics_model/patch_tests/colone_weight.cc +++ b/test/test_model/test_solid_mechanics_model/patch_tests/colone_weight.cc @@ -1,167 +1,163 @@ /** * @file colone_weight.cc * * @author David Simon Kammer * @author Alodie Schneuwly * * @date creation: Mon Aug 09 2010 * @date last modification: Thu Aug 06 2015 * * @brief column test * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ - /* -------------------------------------------------------------------------- */ -#include #include #include +#include /* -------------------------------------------------------------------------- */ #include "solid_mechanics_model.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; -int main(int argc, char *argv[]) { +int main(int argc, char * argv[]) { // chose if you use hexahedron elements bool use_hexa = false; std::stringstream mesh_file; std::stringstream output; std::stringstream energy_file; akantu::ElementType type; - UInt vel_damping_interval; + UInt vel_damping_interval; if (use_hexa) { type = akantu::_hexahedron_8; mesh_file << "colone_hexa.msh"; output << "paraview/test_weight_hexa"; energy_file << "energy_hexa.csv"; - vel_damping_interval =4; - } - else { + vel_damping_interval = 4; + } else { type = akantu::_tetrahedron_4; mesh_file << "colone_tetra.msh"; output << "paraview/test_weight_tetra"; energy_file << "energy_tetra.csv"; vel_damping_interval = 8; } akantu::UInt spatial_dimension = 3; akantu::UInt max_steps = 2000; akantu::Real time_factor = 0.8; akantu::initialize("material_colone.dat", argc, argv); // akantu::Real epot, ekin; akantu::Mesh mesh(spatial_dimension); mesh.read(mesh_file.str().c_str()); akantu::SolidMechanicsModel model(mesh); akantu::UInt nb_nodes = mesh.getNbNodes(); akantu::UInt nb_element = mesh.getNbElement(type); - std::cout << "Nb nodes : " << nb_nodes << " - nb elements : " << nb_element << std::endl; + std::cout << "Nb nodes : " << nb_nodes << " - nb elements : " << nb_element + << std::endl; /// model initialization model.initFull(); std::cout << model.getMaterial(0) << std::endl; model.assembleMassLumped(); /// boundary conditions - const akantu::Array & position = model.getFEEngine().getMesh().getNodes(); + const akantu::Array & position = + model.getFEEngine().getMesh().getNodes(); akantu::Array & boundary = model.getBlockedDOFs(); akantu::Array & force = model.getForce(); const akantu::Array & mass = model.getMass(); akantu::Real z_min = position(0, 2); for (unsigned int i = 0; i < nb_nodes; ++i) { - if(position(i, 2) < z_min) + if (position(i, 2) < z_min) z_min = position(i, 2); } akantu::Real eps = 1e-13; for (akantu::UInt i = 0; i < nb_nodes; ++i) { - if(fabs(position(i, 2) - z_min) <= eps) - boundary(i,2) = true; + if (fabs(position(i, 2) - z_min) <= eps) + boundary(i, 2) = true; else - force(i,2) = -mass(i,0) * 9.81; + force(i, 2) = -mass(i, 0) * 9.81; } akantu::Real time_step = model.getStableTimeStep() * time_factor; std::cout << "Time Step = " << time_step << "s" << std::endl; model.setTimeStep(time_step); - model.updateResidual(); - model.setBaseName("colonne_weight"); model.addDumpField("displacement"); - model.addDumpField("mass" ); - model.addDumpField("velocity" ); + model.addDumpField("mass"); + model.addDumpField("velocity"); model.addDumpField("acceleration"); model.addDumpField("external_force"); model.addDumpField("internal_force"); - model.addDumpField("damage" ); - model.addDumpField("stress" ); - model.addDumpField("strain" ); + model.addDumpField("damage"); + model.addDumpField("stress"); + model.addDumpField("strain"); model.dump(); akantu::Array & velocity = model.getVelocity(); std::ofstream energy; energy.open(energy_file.str().c_str()); energy << "id,epot,ekin,tot" << std::endl; - for(akantu::UInt s = 1; s <= max_steps; ++s) { - - model.explicitPred(); - model.updateResidual(); - model.updateAcceleration(); - model.explicitCorr(); + for (akantu::UInt s = 1; s <= max_steps; ++s) { + model.solveStep(); akantu::Real epot = model.getEnergy("potential"); akantu::Real ekin = model.getEnergy("kinetic"); energy << s << "," << epot << "," << ekin << "," << epot + ekin - << std::endl; + << std::endl; if (s % vel_damping_interval == 0) { for (akantu::UInt i = 0; i < nb_nodes; ++i) { - velocity(i, 0) *= 0.9; - velocity(i, 1) *= 0.9; - velocity(i, 2) *= 0.9; + velocity(i, 0) *= 0.9; + velocity(i, 1) *= 0.9; + velocity(i, 2) *= 0.9; } } - if(s % 1 == 0) model.dump(); - if(s % 10 == 0) std::cout << "passing step " << s << "/" << max_steps << std::endl; + if (s % 1 == 0) + model.dump(); + if (s % 10 == 0) + std::cout << "passing step " << s << "/" << max_steps << std::endl; } akantu::finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/patch_tests/explicit/CMakeLists.txt b/test/test_model/test_solid_mechanics_model/patch_tests/explicit/CMakeLists.txt index d23173990..65765a9a9 100644 --- a/test/test_model/test_solid_mechanics_model/patch_tests/explicit/CMakeLists.txt +++ b/test/test_model/test_solid_mechanics_model/patch_tests/explicit/CMakeLists.txt @@ -1,68 +1,68 @@ #=============================================================================== # @file CMakeLists.txt # # @author David Simon Kammer # @author Nicolas Richart # # @date creation: Fri Oct 22 2010 # @date last modification: Tue Dec 02 2014 # # @brief configuration for the explicit patch test # # @section LICENSE # # Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de # Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des # Solides) # # Akantu is free software: you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) any # later version. # # Akantu is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR # A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with Akantu. If not, see . # # @section DESCRIPTION # #=============================================================================== macro(register_patch_test_anisotropic name ) set(_mat ../data/material_anisotropic.dat) register_test(patch_test_explicit_anisotropic SOURCES patch_test_explicit_anisotropic.cc FILES_TO_COPY ../data/_tetrahedron_4.msh ${_mat} - PACKAGE core + PACKAGE core lapack ) endmacro() register_patch_test_anisotropic("Anisotropic") macro(register_patch_test name type plane_strain) if("${plane_strain}" STREQUAL "false") set(_mat ../data/material_check_stress_plane_stress.dat) else() set(_mat ../data/material_check_stress_plane_strain.dat) endif() register_test(patch_test_explicit_${name} SOURCES patch_test_explicit.cc FILES_TO_COPY ../data/_${type}.msh ${_mat} COMPILE_OPTIONS "TYPE=_${type};PLANE_STRAIN=${plane_strain}" PACKAGE core ) endmacro() foreach(_type ${LIST_TYPES}) register_patch_test(${_type} ${_type} true) endforeach() foreach(_type ${LIST_TYPES_2D}) register_patch_test(plane_strain_${_type} ${_type} true) register_patch_test(plane_stress_${_type} ${_type} false) endforeach() diff --git a/test/test_model/test_solid_mechanics_model/patch_tests/explicit/patch_test_explicit_anisotropic.cc b/test/test_model/test_solid_mechanics_model/patch_tests/explicit/patch_test_explicit_anisotropic.cc index e87145442..1abf98cb1 100644 --- a/test/test_model/test_solid_mechanics_model/patch_tests/explicit/patch_test_explicit_anisotropic.cc +++ b/test/test_model/test_solid_mechanics_model/patch_tests/explicit/patch_test_explicit_anisotropic.cc @@ -1,305 +1,312 @@ /** * @file patch_test_explicit_anisotropic.cc * * @author Till Junge * @author David Simon Kammer * @author Nicolas Richart * @author Cyprien Wolff * * @date creation: Sat Apr 16 2011 * @date last modification: Thu Oct 15 2015 * * @brief patch test for elastic material in solid mechanics model * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include #include "solid_mechanics_model.hh" using namespace akantu; -Real alpha [3][4] = { { 0.01, 0.02, 0.03, 0.04 }, - { 0.05, 0.06, 0.07, 0.08 }, - { 0.09, 0.10, 0.11, 0.12 } }; - -//Stiffness tensor, rotated by hand -Real C[3][3][3][3] = {{{{112.93753505, 1.85842452538e-10, -4.47654358027e-10}, - {1.85847317471e-10, 54.2334345331, -3.69840984824}, - {-4.4764768395e-10, -3.69840984824, 56.848605217}}, - {{1.85847781609e-10, 25.429294233, -3.69840984816}, - {25.429294233, 3.31613847493e-10, -8.38797920011e-11}, - {-3.69840984816, -8.38804581349e-11, -1.97875715813e-10}}, - {{-4.47654358027e-10, -3.69840984816, 28.044464917}, - {-3.69840984816, 2.09374961813e-10, 9.4857455224e-12}, - {28.044464917, 9.48308098714e-12, -2.1367885239e-10}}}, - {{{1.85847781609e-10, 25.429294233, -3.69840984816}, - {25.429294233, 3.31613847493e-10, -8.38793479119e-11}, - {-3.69840984816, -8.38795699565e-11, -1.97876381947e-10}}, - {{54.2334345331, 3.31617400207e-10, 2.09372075233e-10}, - {3.3161562385e-10, 115.552705733, -3.15093728886e-10}, - {2.09372075233e-10, -3.15090176173e-10, 54.2334345333}}, - {{-3.69840984824, -8.38795699565e-11, 9.48219280872e-12}, - {-8.38795699565e-11, -3.1509195253e-10, 25.4292942335}, - {9.48441325477e-12, 25.4292942335, 3.69840984851}}}, - {{{-4.47653469848e-10, -3.69840984816, 28.044464917}, - {-3.69840984816, 2.09374073634e-10, 9.48752187924e-12}, - {28.044464917, 9.48552347779e-12, -2.1367885239e-10}}, - {{-3.69840984824, -8.3884899027e-11, 9.48219280872e-12}, - {-8.3884899027e-11, -3.150972816e-10, 25.4292942335}, - {9.48041645188e-12, 25.4292942335, 3.69840984851}}, - {{56.848605217, -1.97875493768e-10, -2.13681516925e-10}, - {-1.97877270125e-10, 54.2334345333, 3.69840984851}, - {-2.13683293282e-10, 3.69840984851, 112.93753505}}}}; - - +Real alpha[3][4] = {{0.01, 0.02, 0.03, 0.04}, + {0.05, 0.06, 0.07, 0.08}, + {0.09, 0.10, 0.11, 0.12}}; + +// Stiffness tensor, rotated by hand +Real C[3][3][3][3] = { + {{{112.93753505, 1.85842452538e-10, -4.47654358027e-10}, + {1.85847317471e-10, 54.2334345331, -3.69840984824}, + {-4.4764768395e-10, -3.69840984824, 56.848605217}}, + {{1.85847781609e-10, 25.429294233, -3.69840984816}, + {25.429294233, 3.31613847493e-10, -8.38797920011e-11}, + {-3.69840984816, -8.38804581349e-11, -1.97875715813e-10}}, + {{-4.47654358027e-10, -3.69840984816, 28.044464917}, + {-3.69840984816, 2.09374961813e-10, 9.4857455224e-12}, + {28.044464917, 9.48308098714e-12, -2.1367885239e-10}}}, + {{{1.85847781609e-10, 25.429294233, -3.69840984816}, + {25.429294233, 3.31613847493e-10, -8.38793479119e-11}, + {-3.69840984816, -8.38795699565e-11, -1.97876381947e-10}}, + {{54.2334345331, 3.31617400207e-10, 2.09372075233e-10}, + {3.3161562385e-10, 115.552705733, -3.15093728886e-10}, + {2.09372075233e-10, -3.15090176173e-10, 54.2334345333}}, + {{-3.69840984824, -8.38795699565e-11, 9.48219280872e-12}, + {-8.38795699565e-11, -3.1509195253e-10, 25.4292942335}, + {9.48441325477e-12, 25.4292942335, 3.69840984851}}}, + {{{-4.47653469848e-10, -3.69840984816, 28.044464917}, + {-3.69840984816, 2.09374073634e-10, 9.48752187924e-12}, + {28.044464917, 9.48552347779e-12, -2.1367885239e-10}}, + {{-3.69840984824, -8.3884899027e-11, 9.48219280872e-12}, + {-8.3884899027e-11, -3.150972816e-10, 25.4292942335}, + {9.48041645188e-12, 25.4292942335, 3.69840984851}}, + {{56.848605217, -1.97875493768e-10, -2.13681516925e-10}, + {-1.97877270125e-10, 54.2334345333, 3.69840984851}, + {-2.13683293282e-10, 3.69840984851, 112.93753505}}}}; /* -------------------------------------------------------------------------- */ -template -static Matrix prescribed_grad_u() { +template static Matrix prescribed_grad_u() { UInt spatial_dimension = ElementClass::getSpatialDimension(); Matrix grad_u(spatial_dimension, spatial_dimension); for (UInt i = 0; i < spatial_dimension; ++i) { for (UInt j = 0; j < spatial_dimension; ++j) { grad_u(i, j) = alpha[i][j + 1]; } } return grad_u; } -template -static Matrix prescribed_stress() { +template static Matrix prescribed_stress() { UInt spatial_dimension = ElementClass::getSpatialDimension(); Matrix stress(spatial_dimension, spatial_dimension); - //plane strain in 2d + // plane strain in 2d Matrix strain(spatial_dimension, spatial_dimension); - Matrix pstrain; pstrain = prescribed_grad_u(); + Matrix pstrain; + pstrain = prescribed_grad_u(); Real trace = 0; /// symetric part of the strain tensor for (UInt i = 0; i < spatial_dimension; ++i) for (UInt j = 0; j < spatial_dimension; ++j) - strain(i,j) = 0.5 * (pstrain(i, j) + pstrain(j, i)); - + strain(i, j) = 0.5 * (pstrain(i, j) + pstrain(j, i)); - for (UInt i = 0; i < spatial_dimension; ++i) trace += strain(i,i); + for (UInt i = 0; i < spatial_dimension; ++i) + trace += strain(i, i); - for (UInt i = 0 ; i < spatial_dimension ; ++i) { - for (UInt j = 0 ; j < spatial_dimension ; ++j) { + for (UInt i = 0; i < spatial_dimension; ++i) { + for (UInt j = 0; j < spatial_dimension; ++j) { stress(i, j) = 0; - for (UInt k = 0 ; k < spatial_dimension ; ++k) { - for (UInt l = 0 ; l < spatial_dimension ; ++l) { - stress(i, j) += C[i][j][k][l]*strain(k, l); + for (UInt k = 0; k < spatial_dimension; ++k) { + for (UInt l = 0; l < spatial_dimension; ++l) { + stress(i, j) += C[i][j][k][l] * strain(k, l); } } } } return stress; } - #define TYPE _tetrahedron_4 /* -------------------------------------------------------------------------- */ -int main(int argc, char *argv[]) -{ +int main(int argc, char * argv[]) { initialize("material_anisotropic.dat", argc, argv); UInt dim = ElementClass::getSpatialDimension(); const ElementType element_type = TYPE; UInt damping_steps = 600000; UInt damping_interval = 50; Real damping_ratio = 0.99; UInt additional_steps = 20000; UInt max_steps = damping_steps + additional_steps; /// load mesh Mesh my_mesh(dim); - std::stringstream filename; filename << TYPE << ".msh"; + std::stringstream filename; + filename << TYPE << ".msh"; my_mesh.read(filename.str()); UInt nb_nodes = my_mesh.getNbNodes(); /// declaration of model - SolidMechanicsModel my_model(my_mesh); + SolidMechanicsModel model(my_mesh); /// model initialization - my_model.initFull(SolidMechanicsModelOptions(_explicit_lumped_mass)); + model.initFull(SolidMechanicsModelOptions(_explicit_lumped_mass)); + std::cout << model.getMaterial(0) << std::endl; + Real time_step = model.getStableTimeStep() / 5.; + model.setTimeStep(time_step); - std::cout << my_model.getMaterial(0) << std::endl; - Real time_step = my_model.getStableTimeStep()/5.; - my_model.setTimeStep(time_step); - my_model.assembleMassLumped(); - - std::cout << "The number of time steps is: " << max_steps << " (" << time_step << "s)" << std::endl; + std::cout << "The number of time steps is: " << max_steps << " (" << time_step + << "s)" << std::endl; // boundary conditions const Array & coordinates = my_mesh.getNodes(); - Array & displacement = my_model.getDisplacement(); - Array & boundary = my_model.getBlockedDOFs(); + Array & displacement = model.getDisplacement(); + Array & boundary = model.getBlockedDOFs(); MeshUtils::buildFacets(my_mesh); my_mesh.createBoundaryGroupFromGeometry(); // Loop over (Sub)Boundar(ies) // Loop over (Sub)Boundar(ies) - for(GroupManager::const_element_group_iterator it(my_mesh.element_group_begin()); - it != my_mesh.element_group_end(); ++it) { - for(ElementGroup::const_node_iterator nodes_it(it->second->node_begin()); - nodes_it!= it->second->node_end(); ++nodes_it) { + for (GroupManager::const_element_group_iterator it( + my_mesh.element_group_begin()); + it != my_mesh.element_group_end(); ++it) { + for (ElementGroup::const_node_iterator nodes_it(it->second->node_begin()); + nodes_it != it->second->node_end(); ++nodes_it) { UInt n(*nodes_it); std::cout << "Node " << *nodes_it << std::endl; for (UInt i = 0; i < dim; ++i) { - displacement(n, i) = alpha[i][0]; - for (UInt j = 0; j < dim; ++j) { - displacement(n, i) += alpha[i][j + 1] * coordinates(n, j); - } - boundary(n, i) = true; + displacement(n, i) = alpha[i][0]; + for (UInt j = 0; j < dim; ++j) { + displacement(n, i) += alpha[i][j + 1] * coordinates(n, j); + } + boundary(n, i) = true; } } } // Actually, loop over all nodes, since I wanna test a static solution - for (UInt n = 0 ; n < nb_nodes ; ++n) { - for (UInt i = 0 ; i < dim ; ++i) { + for (UInt n = 0; n < nb_nodes; ++n) { + for (UInt i = 0; i < dim; ++i) { displacement(n, i) = alpha[i][0]; - for (UInt j = 0 ; j < dim ; ++j) { - displacement(n, i) += alpha[i][j+1] * coordinates(n, j); + for (UInt j = 0; j < dim; ++j) { + displacement(n, i) += alpha[i][j + 1] * coordinates(n, j); } } } - Array & velocity = my_model.getVelocity(); + Array & velocity = model.getVelocity(); std::ofstream energy; - std::stringstream energy_filename; energy_filename << "energy_" << TYPE << ".csv"; + std::stringstream energy_filename; + energy_filename << "energy_" << TYPE << ".csv"; energy.open(energy_filename.str().c_str()); energy << "id,time,ekin" << std::endl; Real ekin_mean = 0.; /* ------------------------------------------------------------------------ */ /* Main loop */ /* ------------------------------------------------------------------------ */ UInt s; - for(s = 1; s <= max_steps; ++s) { - if(s % 10000 == 0) std::cout << "passing step " << s << "/" << max_steps - << " (" << s*time_step << "s)" < & stress_vect = const_cast &>(my_model.getMaterial(0).getStress(element_type)); - Array & gradu_vect = const_cast &>(my_model.getMaterial(0).getGradU(element_type)); + UInt nb_quadrature_points = model.getFEEngine().getNbIntegrationPoints(TYPE); + Array & stress_vect = + const_cast &>(model.getMaterial(0).getStress(element_type)); + Array & gradu_vect = + const_cast &>(model.getMaterial(0).getGradU(element_type)); - Array::iterator< Matrix > stress_it = stress_vect.begin(dim, dim); - Array::iterator< Matrix > gradu_it = gradu_vect.begin(dim, dim); + Array::iterator> stress_it = stress_vect.begin(dim, dim); + Array::iterator> gradu_it = gradu_vect.begin(dim, dim); - Matrix presc_stress; presc_stress = prescribed_stress(); - Matrix presc_gradu; presc_gradu = prescribed_grad_u(); + Matrix presc_stress; + presc_stress = prescribed_stress(); + Matrix presc_gradu; + presc_gradu = prescribed_grad_u(); UInt nb_element = my_mesh.getNbElement(TYPE); Real gradu_tolerance = 1e-9; Real stress_tolerance = 1e-2; - if(s > max_steps) { + if (s > max_steps) { stress_tolerance = 1e-4; gradu_tolerance = 1e-7; } - for (UInt el = 0; el < nb_element; ++el) { for (UInt q = 0; q < nb_quadrature_points; ++q) { Matrix & stress = *stress_it; Matrix & gradu = *gradu_it; for (UInt i = 0; i < dim; ++i) { for (UInt j = 0; j < dim; ++j) { - if(!(std::abs(gradu(i, j) - presc_gradu(i, j)) < gradu_tolerance)) { - std::cerr << "gradu[" << i << "," << j << "] = " << gradu(i, j) << " but should be = " << presc_gradu(i, j) << " (-" << std::abs(gradu(i, j) - presc_gradu(i, j)) << ") [el : " << el<< " - q : " << q << "]" << std::endl; + if (!(std::abs(gradu(i, j) - presc_gradu(i, j)) < gradu_tolerance)) { + std::cerr << "gradu[" << i << "," << j << "] = " << gradu(i, j) + << " but should be = " << presc_gradu(i, j) << " (-" + << std::abs(gradu(i, j) - presc_gradu(i, j)) + << ") [el : " << el << " - q : " << q << "]" << std::endl; std::cerr << gradu << presc_gradu << std::endl; return EXIT_FAILURE; } - if(!(std::abs(stress(i, j) - presc_stress(i, j)) < stress_tolerance)) { - std::cerr << "stress[" << i << "," << j << "] = " << stress(i, j) << " but should be = " << presc_stress(i, j) << " (-" << std::abs(stress(i, j) - presc_stress(i, j)) << ") [el : " << el<< " - q : " << q << "]" << std::endl; + if (!(std::abs(stress(i, j) - presc_stress(i, j)) < + stress_tolerance)) { + std::cerr << "stress[" << i << "," << j << "] = " << stress(i, j) + << " but should be = " << presc_stress(i, j) << " (-" + << std::abs(stress(i, j) - presc_stress(i, j)) + << ") [el : " << el << " - q : " << q << "]" << std::endl; std::cerr << stress << presc_stress << std::endl; return EXIT_FAILURE; } } } ++stress_it; ++gradu_it; } } - for (UInt n = 0; n < nb_nodes; ++n) { for (UInt i = 0; i < dim; ++i) { Real disp = alpha[i][0]; for (UInt j = 0; j < dim; ++j) { disp += alpha[i][j + 1] * coordinates(n, j); } - if(!(std::abs(displacement(n,i) - disp) < 1e-7)) { - std::cerr << "displacement(" << n << ", " << i <<")=" << displacement(n,i) << " should be equal to " << disp << "(" << displacement(n,i) - disp << ")" << std::endl; + if (!(std::abs(displacement(n, i) - disp) < 1e-7)) { + std::cerr << "displacement(" << n << ", " << i + << ")=" << displacement(n, i) << " should be equal to " + << disp << "(" << displacement(n, i) - disp << ")" + << std::endl; return EXIT_FAILURE; } } } finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/patch_tests/implicit/patch_test_implicit.cc b/test/test_model/test_solid_mechanics_model/patch_tests/implicit/patch_test_implicit.cc index 02adc87ac..ed85df06a 100644 --- a/test/test_model/test_solid_mechanics_model/patch_tests/implicit/patch_test_implicit.cc +++ b/test/test_model/test_solid_mechanics_model/patch_tests/implicit/patch_test_implicit.cc @@ -1,233 +1,249 @@ /** * @file patch_test_implicit.cc * * @author Nicolas Richart * * @date creation: Sat Apr 16 2011 * @date last modification: Thu Oct 15 2015 * * @brief patch test for elastic material in solid mechanics model * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ +#include "non_linear_solver.hh" #include "solid_mechanics_model.hh" +#include "sparse_matrix.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; -Real alpha [3][4] = { { 0.01, 0.02, 0.03, 0.04 }, - { 0.05, 0.06, 0.07, 0.08 }, - { 0.09, 0.10, 0.11, 0.12 } }; +Real alpha[3][4] = {{0.01, 0.02, 0.03, 0.04}, + {0.05, 0.06, 0.07, 0.08}, + {0.09, 0.10, 0.11, 0.12}}; /* -------------------------------------------------------------------------- */ -template +template static Matrix prescribed_strain() { UInt spatial_dimension = ElementClass::getSpatialDimension(); Matrix strain(spatial_dimension, spatial_dimension); for (UInt i = 0; i < spatial_dimension; ++i) { for (UInt j = 0; j < spatial_dimension; ++j) { strain(i, j) = alpha[i][j + 1]; } } return strain; } -template +template static Matrix prescribed_stress() { UInt spatial_dimension = ElementClass::getSpatialDimension(); Matrix stress(spatial_dimension, spatial_dimension); - //plane strain in 2d + // plane strain in 2d Matrix strain(spatial_dimension, spatial_dimension); - Matrix pstrain; pstrain = prescribed_strain(); + Matrix pstrain; + pstrain = prescribed_strain(); Real nu = 0.3; - Real E = 2.1e11; + Real E = 2.1e11; Real trace = 0; /// symetric part of the strain tensor for (UInt i = 0; i < spatial_dimension; ++i) for (UInt j = 0; j < spatial_dimension; ++j) - strain(i,j) = 0.5 * (pstrain(i, j) + pstrain(j, i)); + strain(i, j) = 0.5 * (pstrain(i, j) + pstrain(j, i)); + for (UInt i = 0; i < spatial_dimension; ++i) + trace += strain(i, i); - for (UInt i = 0; i < spatial_dimension; ++i) trace += strain(i,i); - - Real lambda = nu * E / ((1 + nu) * (1 - 2*nu)); - Real mu = E / (2 * (1 + nu)); + Real lambda = nu * E / ((1 + nu) * (1 - 2 * nu)); + Real mu = E / (2 * (1 + nu)); - if(!is_plane_strain) { + if (!is_plane_strain) { std::cout << "toto" << std::endl; - lambda = nu * E / (1 - nu*nu); + lambda = nu * E / (1 - nu * nu); } - if(spatial_dimension == 1) { + if (spatial_dimension == 1) { stress(0, 0) = E * strain(0, 0); } else { for (UInt i = 0; i < spatial_dimension; ++i) for (UInt j = 0; j < spatial_dimension; ++j) { - stress(i, j) = (i == j)*lambda*trace + 2*mu*strain(i, j); + stress(i, j) = (i == j) * lambda * trace + 2 * mu * strain(i, j); } } return stress; } /* -------------------------------------------------------------------------- */ /* -------------------------------------------------------------------------- */ -int main(int argc, char *argv[]) -{ +int main(int argc, char * argv[]) { std::string input_file; - if(PLANE_STRAIN) + if (PLANE_STRAIN) input_file = "material_check_stress_plane_strain.dat"; else input_file = "material_check_stress_plane_stress.dat"; initialize(input_file, argc, argv); UInt dim = ElementClass::getSpatialDimension(); const ElementType element_type = TYPE; /// load mesh - Mesh my_mesh(dim); - - std::stringstream filename; filename << TYPE << ".msh"; - my_mesh.read(filename.str()); + Mesh mesh(dim); - // MeshUtils::purifyMesh(my_mesh); + std::stringstream filename; + filename << TYPE << ".msh"; + mesh.read(filename.str()); - UInt nb_nodes = my_mesh.getNbNodes(); + UInt nb_nodes = mesh.getNbNodes(); /// declaration of model - SolidMechanicsModel my_model(my_mesh); + SolidMechanicsModel model(mesh); /// model initialization - my_model.initFull(SolidMechanicsModelOptions(_static)); + model.initFull(SolidMechanicsModelOptions(_static)); - const Array & coordinates = my_mesh.getNodes(); - Array & displacement = my_model.getDisplacement(); - Array & boundary = my_model.getBlockedDOFs(); - MeshUtils::buildFacets(my_mesh); + const Array & coordinates = mesh.getNodes(); + Array & displacement = model.getDisplacement(); + Array & boundary = model.getBlockedDOFs(); + MeshUtils::buildFacets(mesh); - my_mesh.createBoundaryGroupFromGeometry(); + mesh.createBoundaryGroupFromGeometry(); // Loop over (Sub)Boundar(ies) - for(GroupManager::const_element_group_iterator it(my_mesh.element_group_begin()); - it != my_mesh.element_group_end(); ++it) { - for(ElementGroup::const_node_iterator nodes_it(it->second->node_begin()); - nodes_it!= it->second->node_end(); ++nodes_it) { + for (GroupManager::const_element_group_iterator it( + mesh.element_group_begin()); + it != mesh.element_group_end(); ++it) { + for (ElementGroup::const_node_iterator nodes_it(it->second->node_begin()); + nodes_it != it->second->node_end(); ++nodes_it) { UInt n(*nodes_it); std::cout << "Node " << *nodes_it << std::endl; for (UInt i = 0; i < dim; ++i) { - displacement(n, i) = alpha[i][0]; - for (UInt j = 0; j < dim; ++j) { - displacement(n, i) += alpha[i][j + 1] * coordinates(n, j); - } - boundary(n, i) = true; + displacement(n, i) = alpha[i][0]; + for (UInt j = 0; j < dim; ++j) { + displacement(n, i) += alpha[i][j + 1] * coordinates(n, j); + } + boundary(n, i) = true; } } } /* ------------------------------------------------------------------------ */ /* Static solve */ /* ------------------------------------------------------------------------ */ - my_model.solveStep<_scm_newton_raphson_tangent_modified, _scc_residual>(2e-4, 2); - my_model.getStiffnessMatrix().saveMatrix("clown_matrix.mtx"); + auto & solver = model.getNonLinearSolver(); + solver.set("max_iterations", 2); + solver.set("threshold", 2e-4); + solver.set("convergence_type", _scc_residual); + + model.solveStep(); + model.getDOFManager().getMatrix("K").saveMatrix("clown_matrix.mtx"); /* ------------------------------------------------------------------------ */ /* Checks */ /* ------------------------------------------------------------------------ */ - UInt nb_quadrature_points = my_model.getFEEngine().getNbIntegrationPoints(element_type); + UInt nb_quadrature_points = + model.getFEEngine().getNbIntegrationPoints(element_type); - Array & stress_vect = const_cast &>(my_model.getMaterial(0).getStress(element_type)); - Array & strain_vect = const_cast &>(my_model.getMaterial(0).getGradU(element_type)); + Array & stress_vect = + const_cast &>(model.getMaterial(0).getStress(element_type)); + Array & strain_vect = + const_cast &>(model.getMaterial(0).getGradU(element_type)); Array::matrix_iterator stress_it = stress_vect.begin(dim, dim); Array::matrix_iterator strain_it = strain_vect.begin(dim, dim); - Matrix presc_stress; presc_stress = prescribed_stress(); - Matrix presc_strain; presc_strain = prescribed_strain(); + Matrix presc_stress; + presc_stress = prescribed_stress(); + Matrix presc_strain; + presc_strain = prescribed_strain(); - UInt nb_element = my_mesh.getNbElement(TYPE); + UInt nb_element = mesh.getNbElement(TYPE); Real strain_tolerance = 1e-13; Real stress_tolerance = 1e-13; for (UInt el = 0; el < nb_element; ++el) { for (UInt q = 0; q < nb_quadrature_points; ++q) { Matrix & stress = *stress_it; Matrix & strain = *strain_it; Matrix diff(dim, dim); - diff = strain; + diff = strain; diff -= presc_strain; Real strain_error = diff.norm() / strain.norm(); - if(strain_error > strain_tolerance) { - std::cerr << "strain error: " << strain_error << " > " << strain_tolerance << std::endl; - std::cerr << "strain: " << strain << std::endl - << "prescribed strain: " << presc_strain << std::endl; - return EXIT_FAILURE; + if (strain_error > strain_tolerance) { + std::cerr << "strain error: " << strain_error << " > " + << strain_tolerance << std::endl; + std::cerr << "strain: " << strain << std::endl + << "prescribed strain: " << presc_strain << std::endl; + return EXIT_FAILURE; } else { - std::cerr << "strain error: " << strain_error << " < " << strain_tolerance << std::endl; + std::cerr << "strain error: " << strain_error << " < " + << strain_tolerance << std::endl; } - diff = stress; + diff = stress; diff -= presc_stress; Real stress_error = diff.norm() / stress.norm(); - if(stress_error > stress_tolerance) { - std::cerr << "stress error: " << stress_error << " > " << stress_tolerance << std::endl; - std::cerr << "stress: " << stress << std::endl - << "prescribed stress: " << presc_stress << std::endl; - return EXIT_FAILURE; + if (stress_error > stress_tolerance) { + std::cerr << "stress error: " << stress_error << " > " + << stress_tolerance << std::endl; + std::cerr << "stress: " << stress << std::endl + << "prescribed stress: " << presc_stress << std::endl; + return EXIT_FAILURE; } else { - std::cerr << "stress error: " << stress_error << " < " << stress_tolerance << std::endl; + std::cerr << "stress error: " << stress_error << " < " + << stress_tolerance << std::endl; } ++stress_it; ++strain_it; } } - for (UInt n = 0; n < nb_nodes; ++n) { for (UInt i = 0; i < dim; ++i) { Real disp = alpha[i][0]; for (UInt j = 0; j < dim; ++j) { - disp += alpha[i][j + 1] * coordinates(n, j); + disp += alpha[i][j + 1] * coordinates(n, j); } - if(!(std::abs(displacement(n,i) - disp) < 2e-15)) { - std::cerr << "displacement(" << n << ", " << i <<")=" << displacement(n,i) << " should be equal to " << disp << std::endl; - return EXIT_FAILURE; + if (!(std::abs(displacement(n, i) - disp) < 2e-15)) { + std::cerr << "displacement(" << n << ", " << i + << ")=" << displacement(n, i) << " should be equal to " + << disp << std::endl; + return EXIT_FAILURE; } } } finalize(); return EXIT_SUCCESS; } - diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_local_material.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_local_material.cc index 79a13ea31..cdb09fb33 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_local_material.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_local_material.cc @@ -1,139 +1,121 @@ /** * @file test_local_material.cc * * @author Guillaume Anciaux * @author Marion Estelle Chambart * @author Nicolas Richart * @author Clement Roux * * @date creation: Wed Aug 04 2010 * @date last modification: Thu Oct 15 2015 * * @brief test of the class SolidMechanicsModel with custom local damage on a * notched plate * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ -#include "solid_mechanics_model.hh" #include "local_material_damage.hh" +#include "solid_mechanics_model.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; -int main(int argc, char *argv[]) -{ +int main(int argc, char * argv[]) { akantu::initialize("material.dat", argc, argv); UInt max_steps = 1100; - + const UInt spatial_dimension = 2; Mesh mesh(spatial_dimension); mesh.read("mesh_section_gap.msh"); - mesh.createGroupsFromMeshData("physical_names"); - + SolidMechanicsModel model(mesh); /// model initialization model.initFull(SolidMechanicsModelOptions(_explicit_lumped_mass, true)); model.registerNewCustomMaterials("local_damage"); model.initMaterials(); Real time_step = model.getStableTimeStep(); - model.setTimeStep(time_step/2.5); + model.setTimeStep(time_step / 2.5); model.assembleMassLumped(); std::cout << model << std::endl; /// Dirichlet boundary conditions model.applyBC(BC::Dirichlet::FixedValue(0.0, _x), "Fixed"); // model.applyBC(BC::Dirichlet::FixedValue(0.0, _y), "Fixed"); // Boundary condition (Neumann) - Matrix stress(2,2); + Matrix stress(2, 2); stress.eye(7e5); model.applyBC(BC::Neumann::FromHigherDim(stress), "Traction"); - /*model.setBaseName("damage_local"); - model.addDumpFieldVector("displacement"); - model.addDumpField("velocity" ); - model.addDumpField("acceleration"); - model.addDumpFieldVector("external_force"); - model.addDumpFieldVector("internal_force"); - model.addDumpField("damage" ); - model.addDumpField("stress" ); - model.addDumpField("strain" ); - model.dump();*/ - - for(UInt s = 0; s < max_steps; ++s) { - if(s < 100){ - // Boundary condition (Neumann) + for (UInt s = 0; s < max_steps; ++s) { + if (s < 100) { + // Boundary condition (Neumann) stress.eye(7e5); - model.applyBC(BC::Neumann::FromHigherDim(stress), "Traction"); + model.applyBC(BC::Neumann::FromHigherDim(stress), "Traction"); } model.solveStep(); - - /*epot = model.getPotentialEnergy(); - ekin = model.getKineticEnergy(); - - if(s % 10 == 0) std::cout << s << " " << epot << " " << ekin << " " << epot + ekin - << std::endl; - - if(s % 10 == 0) std::cout << "Step " << s+1 << "/" << max_steps < & lower_bounds = mesh.getLowerBounds(); const Vector & upper_bounds = mesh.getUpperBounds(); Real L = upper_bounds(0) - lower_bounds(0); - const ElementTypeMapArray & filter = model.getMaterial(0).getElementFilter(); - ElementTypeMapArray::type_iterator it = filter.firstType(spatial_dimension); - ElementTypeMapArray::type_iterator end = filter.lastType(spatial_dimension); + const ElementTypeMapArray & filter = + model.getMaterial(0).getElementFilter(); + ElementTypeMapArray::type_iterator it = + filter.firstType(spatial_dimension); + ElementTypeMapArray::type_iterator end = + filter.lastType(spatial_dimension); Vector barycenter(spatial_dimension); bool is_fully_damaged = false; - for(; it != end; ++it) { + for (; it != end; ++it) { UInt nb_elem = mesh.getNbElement(*it); const UInt nb_gp = model.getFEEngine().getNbIntegrationPoints(*it); - Array & material_damage_array = model.getMaterial(0).getArray("damage", *it); + Array & material_damage_array = + model.getMaterial(0).getArray("damage", *it); UInt cpt = 0; - for(UInt nel = 0; nel < nb_elem ; ++nel){ - if (material_damage_array(cpt,0) > 0.9){ - is_fully_damaged = true; - mesh.getBarycenter(nel,*it,barycenter.storage()); - if( (std::abs(barycenter(0)-(L/2)) < (L/10) ) ) { - return EXIT_FAILURE; - } + for (UInt nel = 0; nel < nb_elem; ++nel) { + if (material_damage_array(cpt, 0) > 0.9) { + is_fully_damaged = true; + mesh.getBarycenter(nel, *it, barycenter.storage()); + if ((std::abs(barycenter(0) - (L / 2)) < (L / 10))) { + return EXIT_FAILURE; + } } cpt += nb_gp; } } - if(!is_fully_damaged) + if (!is_fully_damaged) return EXIT_FAILURE; akantu::finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_elasto_plastic_linear_isotropic_hardening/test_material_elasto_plastic_linear_isotropic_hardening.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_elasto_plastic_linear_isotropic_hardening/test_material_elasto_plastic_linear_isotropic_hardening.cc index 472cc0ec9..964db31eb 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_elasto_plastic_linear_isotropic_hardening/test_material_elasto_plastic_linear_isotropic_hardening.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_elasto_plastic_linear_isotropic_hardening/test_material_elasto_plastic_linear_isotropic_hardening.cc @@ -1,79 +1,81 @@ /** * @file test_material_elasto_plastic_linear_isotropic_hardening.cc * * @author Jaehyun Cho * @author Lucas Frerot * * @date creation: Thu Dec 03 2015 * * @brief test for material type elasto plastic linear isotropic hardening using * tension-compression test * * @section LICENSE * * Copyright (©) 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) Laboratory * (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ - #include "solid_mechanics_model.hh" +#include "non_linear_solver.hh" +/* -------------------------------------------------------------------------- */ #include - /* -------------------------------------------------------------------------- */ using namespace akantu; /* -------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { initialize("test_material_elasto_plastic_linear_isotropic_hardening.dat", argc, argv); const UInt spatial_dimension = 2; const Real u_increment = 0.1; const UInt steps = 20; Mesh mesh(spatial_dimension); mesh.read("test_material_elasto_plastic_linear_isotropic_hardening.msh"); - mesh.createGroupsFromMeshData("physical_names"); SolidMechanicsModel model(mesh); model.initFull(SolidMechanicsModelOptions(_static)); + model.getNonLinearSolver("static").set("max_iterations", 300); + model.getNonLinearSolver("static").set("threshold", 1e-6); + model.applyBC(BC::Dirichlet::FixedValue(0.0, _x), "left"); model.applyBC(BC::Dirichlet::FixedValue(0.0, _y), "bottom"); for (UInt i = 0 ; i < steps ; ++i) { model.applyBC(BC::Dirichlet::FixedValue(i * u_increment, _x), "right"); model.solveStep(); Real strainxx = i * u_increment / 10.; const Array & edge_nodes = mesh.getElementGroup("right").getNodes(); Array & residual = model.getInternalForce(); Real reaction = 0; for (UInt n = 0 ; n < edge_nodes.getSize() ; n++) { reaction -= residual(edge_nodes(n), 0); } std::cout << strainxx << "," << reaction << std::endl; } finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_mazars.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_mazars.cc index 047865d5a..ab43b67d9 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_mazars.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_mazars.cc @@ -1,307 +1,294 @@ /** * @file test_material_mazars.cc * * @author Clement Roux * * @date creation: Thu Oct 08 2015 * @date last modification: Tue Dec 08 2015 * * @brief test for material mazars, dissymmetric * * @section LICENSE * * Copyright (©) 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) Laboratory * (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" +#include "material.hh" #include "mesh.hh" #include "mesh_io.hh" #include "solid_mechanics_model.hh" -#include "material.hh" //#include "io_helper_tools.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; - /* -------------------------------------------------------------------------- */ -int main(int argc, char *argv[]) { +int main(int argc, char * argv[]) { debug::setDebugLevel(akantu::dblWarning); akantu::initialize("material_mazars.dat", argc, argv); const UInt spatial_dimension = 3; // ElementType type = _quadrangle_4; ElementType type = _hexahedron_8; // UInt compression_steps = 5e5; // Real max_compression = 0.01; // UInt traction_steps = 1e4; // Real max_traction = 0.001; Mesh mesh(spatial_dimension); mesh.addConnectivityType(type); - Array & nodes = const_cast &>(mesh.getNodes()); - Array & connectivity = const_cast &>(mesh.getConnectivity(type)); + Array & nodes = const_cast &>(mesh.getNodes()); + Array & connectivity = + const_cast &>(mesh.getConnectivity(type)); const Real width = 1; UInt nb_dof = 0; connectivity.resize(1); - if(type == _hexahedron_8) { + if (type == _hexahedron_8) { nb_dof = 8; nodes.resize(nb_dof); - - nodes(0,0) = 0.; - nodes(0,1) = 0.; - nodes(0,2) = 0.; - - nodes(1,0) = width; - nodes(1,1) = 0.; - nodes(1,2) = 0.; - - nodes(2,0) = width; - nodes(2,1) = width; - nodes(2,2) = 0; - - nodes(3,0) = 0; - nodes(3,1) = width; - nodes(3,2) = 0; - - nodes(4,0) = 0.; - nodes(4,1) = 0.; - nodes(4,2) = width; - - nodes(5,0) = width; - nodes(5,1) = 0.; - nodes(5,2) = width; - - nodes(6,0) = width; - nodes(6,1) = width; - nodes(6,2) = width; - - nodes(7,0) = 0; - nodes(7,1) = width; - nodes(7,2) = width; - - connectivity(0,0) = 0; - connectivity(0,1) = 1; - connectivity(0,2) = 2; - connectivity(0,3) = 3; - connectivity(0,4) = 4; - connectivity(0,5) = 5; - connectivity(0,6) = 6; - connectivity(0,7) = 7; + + nodes(0, 0) = 0.; + nodes(0, 1) = 0.; + nodes(0, 2) = 0.; + + nodes(1, 0) = width; + nodes(1, 1) = 0.; + nodes(1, 2) = 0.; + + nodes(2, 0) = width; + nodes(2, 1) = width; + nodes(2, 2) = 0; + + nodes(3, 0) = 0; + nodes(3, 1) = width; + nodes(3, 2) = 0; + + nodes(4, 0) = 0.; + nodes(4, 1) = 0.; + nodes(4, 2) = width; + + nodes(5, 0) = width; + nodes(5, 1) = 0.; + nodes(5, 2) = width; + + nodes(6, 0) = width; + nodes(6, 1) = width; + nodes(6, 2) = width; + + nodes(7, 0) = 0; + nodes(7, 1) = width; + nodes(7, 2) = width; + + connectivity(0, 0) = 0; + connectivity(0, 1) = 1; + connectivity(0, 2) = 2; + connectivity(0, 3) = 3; + connectivity(0, 4) = 4; + connectivity(0, 5) = 5; + connectivity(0, 6) = 6; + connectivity(0, 7) = 7; } else if (type == _quadrangle_4) { nb_dof = 4; nodes.resize(nb_dof); - nodes(0,0) = 0.; - nodes(0,1) = 0.; - - nodes(1,0) = width; - nodes(1,1) = 0; - - nodes(2,0) = width; - nodes(2,1) = width; - - nodes(3,0) = 0.; - nodes(3,1) = width; - - connectivity(0,0) = 0; - connectivity(0,1) = 1; - connectivity(0,2) = 2; - connectivity(0,3) = 3; + nodes(0, 0) = 0.; + nodes(0, 1) = 0.; + + nodes(1, 0) = width; + nodes(1, 1) = 0; + + nodes(2, 0) = width; + nodes(2, 1) = width; + + nodes(3, 0) = 0.; + nodes(3, 1) = width; + + connectivity(0, 0) = 0; + connectivity(0, 1) = 1; + connectivity(0, 2) = 2; + connectivity(0, 3) = 3; } SolidMechanicsModel model(mesh); model.initFull(); Material & mat = model.getMaterial(0); std::cout << mat << std::endl; /// boundary conditions Array & disp = model.getDisplacement(); Array & velo = model.getVelocity(); Array & boun = model.getBlockedDOFs(); for (UInt i = 0; i < nb_dof; ++i) { - boun(i,0) = true; + boun(i, 0) = true; } - // boun(0,1) = true; - // boun(1,1) = true; - // boun(2,1) = true; - - // boun(0,2) = true; - // boun(1,2) = true; - // boun(2,2) = true; - - // disp(1,0) = 0; - // forc(1,0) = atof(argv[2]); - - // velo(0,0) = -atof(argv[2]); - // velo(1,0) = atof(argv[2]); - - model.assembleMassLumped(); Real time_step = model.getStableTimeStep() * .5; - //Real time_step = 1e-5; + // Real time_step = 1e-5; - std::cout << "Time Step = " << time_step << "s - nb elements : " << mesh.getNbElement(type) << std::endl; + std::cout << "Time Step = " << time_step + << "s - nb elements : " << mesh.getNbElement(type) << std::endl; model.setTimeStep(time_step); - model.updateResidual(); std::ofstream energy; energy.open("energies_and_scalar_mazars.csv"); - energy << "id,rtime,epot,ekin,u,wext,kin+pot,D,strain_xx,strain_yy,stress_xx,stress_yy,edis,tot" << std::endl; + energy << "id,rtime,epot,ekin,u,wext,kin+pot,D,strain_xx,strain_yy,stress_xx," + "stress_yy,edis,tot" + << std::endl; /// Set dumper model.setBaseName("uniaxial_comp-trac_mazars"); model.addDumpFieldVector("displacement"); - model.addDumpField("velocity" ); + model.addDumpField("velocity"); model.addDumpField("acceleration"); - model.addDumpField("damage" ); - model.addDumpField("strain" ); - model.addDumpField("stress" ); - model.addDumpField("partitions" ); + model.addDumpField("damage"); + model.addDumpField("strain"); + model.addDumpField("stress"); + model.addDumpField("partitions"); model.dump(); const Array & strain = mat.getGradU(type); const Array & stress = mat.getStress(type); const Array & damage = mat.getArray("damage", type); /* ------------------------------------------------------------------------ */ /* Main loop */ /* ------------------------------------------------------------------------ */ Real wext = 0.; - Real sigma_max=0, sigma_min=0; + Real sigma_max = 0, sigma_min = 0; Real max_disp; Real stress_xx_compression_1; - UInt nb_steps = 7e5/150; + UInt nb_steps = 7e5 / 150; Real adisp = 0; - for(UInt s = 0; s < nb_steps; ++s) { - if(s == 0) { + for (UInt s = 0; s < nb_steps; ++s) { + if (s == 0) { max_disp = 0.003; - adisp = -(max_disp * 8./nb_steps) /2.; - std::cout << "Step " << s << " compression: " << max_disp <::epsilon()) { - disp(i,0) += adisp; - velo(i,0) = adisp / time_step; + if (std::abs(nodes(i, 0) - width) < + std::numeric_limits::epsilon()) { + disp(i, 0) += adisp; + velo(i, 0) = adisp / time_step; } } - std::cout << "S: " << s << "/" << nb_steps << " inc disp: " << adisp << " disp: " << std::setw(5) << disp(2,0) << "\r" << std::flush; + std::cout << "S: " << s << "/" << nb_steps << " inc disp: " << adisp + << " disp: " << std::setw(5) << disp(2, 0) << "\r" << std::flush; - model.explicitPred(); - model.updateResidual(); - model.updateAcceleration(); - model.explicitCorr(); + model.solveStep(); - Real epot = model.getEnergy("potential"); - Real ekin = model.getEnergy("kinetic"); - Real edis = model.getEnergy("dissipated"); + Real epot = model.getEnergy("potential"); + Real ekin = model.getEnergy("kinetic"); + Real edis = model.getEnergy("dissipated"); wext += model.getEnergy("external work"); - /*for (UInt i = 0; i < nb_dof; ++i) { - wext += boun(i,0) * forc(i,0) * velo(i,0) * time_step; - }*/ - - sigma_max = std::max(sigma_max,stress(0,0)); - sigma_min = std::min(sigma_min,stress(0,0)); - if(s % 10 == 0) - energy << s << "," // 1 - << s*time_step << "," // 2 - << epot << "," // 3 - << ekin << "," // 4 - << disp(2,0) << "," // 5 - << wext << "," // 6 - << epot + ekin << "," // 7 - << damage(0) << "," // 8 - << strain(0,0) << "," // 9 - << strain(0,3) << "," // 11 - << stress(0,0) << "," // 10 - << stress(0,3) << "," // 10 - << edis << "," // 12 - << epot + ekin + edis // 13 - << std::endl; - - if(s % 100 == 0) + sigma_max = std::max(sigma_max, stress(0, 0)); + sigma_min = std::min(sigma_min, stress(0, 0)); + if (s % 10 == 0) + energy << s << "," // 1 + << s * time_step << "," // 2 + << epot << "," // 3 + << ekin << "," // 4 + << disp(2, 0) << "," // 5 + << wext << "," // 6 + << epot + ekin << "," // 7 + << damage(0) << "," // 8 + << strain(0, 0) << "," // 9 + << strain(0, 3) << "," // 11 + << stress(0, 0) << "," // 10 + << stress(0, 3) << "," // 10 + << edis << "," // 12 + << epot + ekin + edis // 13 + << std::endl; + + if (s % 100 == 0) model.dump(); } - std::cout << std::endl << "sigma_max = " << sigma_max << ", sigma_min = " << sigma_min << std::endl; + std::cout << std::endl + << "sigma_max = " << sigma_max << ", sigma_min = " << sigma_min + << std::endl; /// Verif the maximal/minimal stress values - if( (std::abs(sigma_max)>std::abs(sigma_min)) || (std::abs(sigma_max-6.24e6)>1e5) - || (std::abs(sigma_min+2.943e7)>1e6) ) + if ((std::abs(sigma_max) > std::abs(sigma_min)) || + (std::abs(sigma_max - 6.24e6) > 1e5) || + (std::abs(sigma_min + 2.943e7) > 1e6)) return EXIT_FAILURE; energy.close(); akantu::finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_orthotropic.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_orthotropic.cc index 090aadca0..e6e632dc8 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_orthotropic.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_orthotropic.cc @@ -1,104 +1,100 @@ /** * @file test_material_orthotropic.cc * * @author Nicolas Richart * * @date creation: Wed Aug 04 2010 * @date last modification: Tue Sep 01 2015 * * @brief test of the class SolidMechanicsModel * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ #include "solid_mechanics_model.hh" using namespace akantu; int main(int argc, char *argv[]) { // akantu::initialize("orthotropic.dat", argc, argv); akantu::initialize("orthotropic.dat", argc, argv); UInt max_steps = 1000; Real epot, ekin; Mesh mesh(2); mesh.read("square.msh"); mesh.createBoundaryGroupFromGeometry(); SolidMechanicsModel model(mesh); /// model initialization model.initFull(); Real time_step = model.getStableTimeStep(); model.setTimeStep(time_step/10.); model.assembleMassLumped(); std::cout << model << std::endl; // Boundary condition (Neumann) Matrix stress(2,2); stress.eye(Real(1e3)); model.applyBC(BC::Neumann::FromHigherDim(stress), "boundary_0"); model.setBaseName ("square-orthotrope" ); model.addDumpFieldVector("displacement"); model.addDumpField ("mass" ); model.addDumpField ("velocity" ); model.addDumpField ("acceleration"); model.addDumpFieldVector("external_force"); model.addDumpFieldVector("internal_force"); model.addDumpField ("stress" ); model.addDumpField ("grad_u" ); model.dump(); std::ofstream energy; energy.open("energy.csv"); energy << "id,epot,ekin,tot" << std::endl; for(UInt s = 0; s < max_steps; ++s) { - model.explicitPred(); - - model.updateResidual(); - model.updateAcceleration(); - model.explicitCorr(); + model.solveStep(); epot = model.getEnergy("potential"); ekin = model.getEnergy("kinetic"); std::cerr << "passing step " << s << "/" << max_steps << std::endl; energy << s << "," << epot << "," << ekin << "," << epot + ekin << std::endl; if(s % 100 == 0) model.dump(); } energy.close(); finalize(); return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_thermal.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_thermal.cc index 074bcfb54..da3db8144 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_thermal.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_thermal.cc @@ -1,97 +1,101 @@ /** * @file test_material_thermal.cc * * @author Lucas Frerot * * @date creation: Wed Aug 04 2010 * @date last modification: Sun Oct 19 2014 * * @brief test of the class akantu::MaterialThermal * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ +#include "non_linear_solver.hh" #include "solid_mechanics_model.hh" - /* -------------------------------------------------------------------------- */ + using namespace akantu; -int main(int argc, char *argv[]) { +int main(int argc, char * argv[]) { debug::setDebugLevel(dblWarning); initialize("material_thermal.dat", argc, argv); Math::setTolerance(1.e-13); Mesh mesh(2); mesh.read("square.msh"); SolidMechanicsModel model(mesh); model.initFull(SolidMechanicsModelOptions(_static)); mesh.computeBoundingBox(); const Vector & min = mesh.getLowerBounds(); const Vector & max = mesh.getUpperBounds(); Array & pos = mesh.getNodes(); Array & boundary = model.getBlockedDOFs(); Array & disp = model.getDisplacement(); for (UInt i = 0; i < mesh.getNbNodes(); ++i) { if (Math::are_float_equal(pos(i, 0), min(0))) { boundary(i, 0) = true; } if (Math::are_float_equal(pos(i, 1), min(1))) { boundary(i, 1) = true; } } model.setBaseName("test_material_thermal"); model.addDumpField("displacement"); model.addDumpField("strain"); model.addDumpField("stress"); model.addDumpField("delta_T"); - model.solveStatic<_scm_newton_raphson_tangent_modified, _scc_increment>(1e-10, 2); + auto & solver = model.getNonLinearSolver("static"); + solver.set("max_iterations", 2); + solver.set("threshold", 1e-10); + + model.solveStep(); for (UInt i = 0; i < mesh.getNbNodes(); ++i) { - if (Math::are_float_equal(pos(i, 0), max(0)) && Math::are_float_equal(pos(i, 1), max(1))) { - if (!Math::are_float_equal(disp(i, 0), 1.0) || !Math::are_float_equal(disp(i, 1), 1.0)) { - AKANTU_DEBUG_ERROR("Test not passed"); + if (Math::are_float_equal(pos(i, 0), max(0)) && + Math::are_float_equal(pos(i, 1), max(1))) { + if (!Math::are_float_equal(disp(i, 0), 1.0) || + !Math::are_float_equal(disp(i, 1), 1.0)) { + AKANTU_DEBUG_ERROR("Test not passed"); return EXIT_FAILURE; } } } model.dump(); finalize(); std::cout << "Test passed" << std::endl; return EXIT_SUCCESS; } - - - diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation.cc index ba5989297..178c63af5 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation.cc @@ -1,167 +1,171 @@ /** * @file test_material_standard_linear_solid_deviatoric_relaxation.cc * * @author David Simon Kammer * @author Nicolas Richart * @author Vladislav Yastrebov * * @date creation: Mon Aug 09 2010 * @date last modification: Sun Oct 19 2014 * * @brief test of the viscoelastic material: relaxation * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ -#include #include -#include #include +#include +#include /* -------------------------------------------------------------------------- */ #include "solid_mechanics_model.hh" using namespace akantu; -int main(int argc, char *argv[]) -{ - akantu::initialize("material_standard_linear_solid_deviatoric_relaxation.dat", argc, argv); +int main(int argc, char * argv[]) { + akantu::initialize("material_standard_linear_solid_deviatoric_relaxation.dat", + argc, argv); akantu::debug::setDebugLevel(akantu::dblWarning); // sim data Real T = 10.; Real eps = 0.001; const UInt dim = 2; Real sim_time = 25.; Real time_factor = 0.1; Real tolerance = 1e-7; Mesh mesh(dim); mesh.read("test_material_standard_linear_solid_deviatoric_relaxation.msh"); const ElementType element_type = _quadrangle_4; SolidMechanicsModel model(mesh); /* ------------------------------------------------------------------------ */ /* Initialization */ /* ------------------------------------------------------------------------ */ model.initFull(); std::cout << model.getMaterial(0) << std::endl; model.assembleMassLumped(); std::stringstream filename_sstr; - filename_sstr << "test_material_standard_linear_solid_deviatoric_relaxation.out"; + filename_sstr + << "test_material_standard_linear_solid_deviatoric_relaxation.out"; std::ofstream output_data; output_data.open(filename_sstr.str().c_str()); - output_data << "#[1]-time [2]-sigma_analytic [3+]-sigma_measurements" << std::endl; + output_data << "#[1]-time [2]-sigma_analytic [3+]-sigma_measurements" + << std::endl; Material & mat = model.getMaterial(0); const Array & stress = mat.getStress(element_type); - Real Eta = mat.getParam("Eta"); - Real EV = mat.getParam("Ev"); - Real Einf = mat.getParam("Einf"); - Real nu = mat.getParam("nu"); - Real Ginf = Einf/(2*(1+nu)); - Real G = EV/(2*(1+nu)); + Real Eta = mat.get("Eta"); + Real EV = mat.get("Ev"); + Real Einf = mat.get("Einf"); + Real nu = mat.get("nu"); + Real Ginf = Einf / (2 * (1 + nu)); + Real G = EV / (2 * (1 + nu)); Real G0 = G + Ginf; - Real gamma = G/G0; + Real gamma = G / G0; Real tau = Eta / EV; - Real gammainf = Ginf/G0; + Real gammainf = Ginf / G0; UInt nb_nodes = mesh.getNbNodes(); const Array & coordinate = mesh.getNodes(); Array & displacement = model.getDisplacement(); /// Setting time step Real time_step = model.getStableTimeStep() * time_factor; std::cout << "Time Step = " << time_step << "s" << std::endl; model.setTimeStep(time_step); UInt max_steps = sim_time / time_step; UInt out_interval = 1; Real time = 0.; /* ------------------------------------------------------------------------ */ /* Main loop */ /* ------------------------------------------------------------------------ */ - for(UInt s = 0; s <= max_steps; ++s) { + for (UInt s = 0; s <= max_steps; ++s) { - if(s % 1000 == 0) + if (s % 1000 == 0) std::cerr << "passing step " << s << "/" << max_steps << std::endl; time = s * time_step; // impose displacement Real epsilon = 0.; if (time < T) { epsilon = eps * time / T; - } - else { + } else { epsilon = eps; } - for (UInt n=0; n::const_matrix_iterator stress_it = stress.begin(dim, dim); Array::const_matrix_iterator stress_end = stress.end(dim, dim); - for(;stress_it != stress_end; ++stress_it) { - output_data << " " << (*stress_it)(0,1) << " " << (*stress_it)(1,0); - - // test error - Real rel_error_1 = std::abs(((*stress_it)(0,1) - solution) / solution); - Real rel_error_2 = std::abs(((*stress_it)(1,0) - solution) / solution); - if (rel_error_1 > tolerance || rel_error_2 > tolerance) { - std::cerr << "Relative error: " << rel_error_1 << " " << rel_error_2 << std::endl; - return EXIT_FAILURE; - } + for (; stress_it != stress_end; ++stress_it) { + output_data << " " << (*stress_it)(0, 1) << " " << (*stress_it)(1, 0); + + // test error + Real rel_error_1 = std::abs(((*stress_it)(0, 1) - solution) / solution); + Real rel_error_2 = std::abs(((*stress_it)(1, 0) - solution) / solution); + if (rel_error_1 > tolerance || rel_error_2 > tolerance) { + std::cerr << "Relative error: " << rel_error_1 << " " << rel_error_2 + << std::endl; + return EXIT_FAILURE; + } } output_data << std::endl; } } finalize(); std::cout << "Test successful!" << std::endl; return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation_tension.cc b/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation_tension.cc index ed705d5ef..948442f07 100644 --- a/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation_tension.cc +++ b/test/test_model/test_solid_mechanics_model/test_materials/test_material_viscoelastic/test_material_standard_linear_solid_deviatoric_relaxation_tension.cc @@ -1,174 +1,174 @@ /** * @file test_material_standard_linear_solid_deviatoric_relaxation_tension.cc * * @author David Simon Kammer * @author Nicolas Richart * * @date creation: Mon Aug 09 2010 * @date last modification: Sun Oct 19 2014 * * @brief test of the viscoelastic material: relaxation * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include #include #include #include /* -------------------------------------------------------------------------- */ #include "solid_mechanics_model.hh" using namespace akantu; int main(int argc, char *argv[]) { akantu::initialize("material_standard_linear_solid_deviatoric_relaxation.dat", argc, argv); // sim data Real T = 10.; Real eps = 0.001; // const UInt dim = 3; const UInt dim = 2; Real sim_time = 25.; //Real sim_time = 250.; Real time_factor = 0.1; Real tolerance = 1e-5; Mesh mesh(dim); mesh.read("test_material_standard_linear_solid_deviatoric_relaxation.msh"); // mesh_io.read("hexa_structured.msh",mesh); //const ElementType element_type = _hexahedron_8; const ElementType element_type = _quadrangle_4; SolidMechanicsModel model(mesh); /* ------------------------------------------------------------------------ */ /* Initialization */ /* ------------------------------------------------------------------------ */ model.initFull(); std::cout << model.getMaterial(0) << std::endl; model.assembleMassLumped(); - model.updateResidual(); + model.assembleInternalForces(); model.getMaterial(0).setToSteadyState(); std::stringstream filename_sstr; filename_sstr << "test_material_standard_linear_solid_deviatoric_relaxation_tension.out"; std::ofstream output_data; output_data.open(filename_sstr.str().c_str()); output_data << "#[1]-time [2]-sigma_analytic [3+]-sigma_measurements" << std::endl; Material & mat = model.getMaterial(0); const Array & stress = mat.getStress(element_type); - Real Eta = mat.getParam("Eta"); - Real EV = mat.getParam("Ev"); - Real Einf = mat.getParam("Einf"); - Real E0 = mat.getParam("E"); + Real Eta = mat.get("Eta"); + Real EV = mat.get("Ev"); + Real Einf = mat.get("Einf"); + Real E0 = mat.get("E"); - Real kpa = mat.getParam("kapa"); - Real mu = mat.getParam("mu"); + Real kpa = mat.get("kapa"); + Real mu = mat.get("mu"); Real gamma = EV/E0; Real gammainf = Einf/E0; Real tau = Eta / EV; std::cout << "relaxation time = " << tau << std::endl; UInt nb_nodes = mesh.getNbNodes(); const Array & coordinate = mesh.getNodes(); Array & displacement = model.getDisplacement(); /// Setting time step Real time_step = model.getStableTimeStep() * time_factor; std::cout << "Time Step = " << time_step << "s" << std::endl; model.setTimeStep(time_step); UInt max_steps = sim_time / time_step; UInt out_interval = 1; Real time = 0.; /* ------------------------------------------------------------------------ */ /* Main loop */ /* ------------------------------------------------------------------------ */ for(UInt s = 0; s <= max_steps; ++s) { if(s % 1000 == 0) std::cerr << "passing step " << s << "/" << max_steps << std::endl; time = s * time_step; // impose displacement Real epsilon = 0.; if (time < T) { epsilon = eps * time / T; } else { epsilon = eps; } for (UInt n=0; n::const_matrix_iterator stress_it = stress.begin(dim, dim); Array::const_matrix_iterator stress_end = stress.end(dim, dim); for(;stress_it != stress_end; ++stress_it) { output_data << " " << (*stress_it)(1,1); // test error Real rel_error_1 = std::abs(((*stress_it)(1,1) - solution) / solution); if (rel_error_1 > tolerance) { std::cerr << "Relative error: " << rel_error_1 << std::endl; return EXIT_FAILURE; } } output_data << std::endl; } } finalize(); std::cout << "Test successful!" << std::endl; return EXIT_SUCCESS; } diff --git a/test/test_model/test_solid_mechanics_model/test_solid_mechanics_model_reassign_material.cc b/test/test_model/test_solid_mechanics_model/test_solid_mechanics_model_reassign_material.cc index ed85b2a0b..86059709c 100644 --- a/test/test_model/test_solid_mechanics_model/test_solid_mechanics_model_reassign_material.cc +++ b/test/test_model/test_solid_mechanics_model/test_solid_mechanics_model_reassign_material.cc @@ -1,214 +1,209 @@ /** * @file test_solid_mechanics_model_reassign_material.cc * * @author Aurelia Isabel Cuba Ramos * * @date creation: Mon Feb 10 2014 * @date last modification: Wed Feb 25 2015 * * @brief test the function reassign material * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_grid_dynamic.hh" #include "material.hh" #include "solid_mechanics_model.hh" #include "static_communicator.hh" using namespace akantu; class StraightInterfaceMaterialSelector : public MaterialSelector { public: StraightInterfaceMaterialSelector(SolidMechanicsModel & model, const std::string & mat_1_material, const std::string & mat_2_material, bool & horizontal, Real & pos_interface) : model(model), mat_1_material(mat_1_material), mat_2_material(mat_2_material), horizontal(horizontal), pos_interface(pos_interface) { Mesh & mesh = model.getMesh(); UInt spatial_dimension = mesh.getSpatialDimension(); /// store barycenters of all elements mesh.initElementTypeMapArray(barycenters, spatial_dimension, spatial_dimension); for (ghost_type_t::iterator gt = ghost_type_t::begin(); gt != ghost_type_t::end(); ++gt) { GhostType ghost_type = *gt; Element e; e.ghost_type = ghost_type; Mesh::type_iterator it = mesh.firstType(spatial_dimension, ghost_type); Mesh::type_iterator last_type = mesh.lastType(spatial_dimension, ghost_type); for (; it != last_type; ++it) { UInt nb_element = mesh.getNbElement(*it, ghost_type); e.type = *it; Array & barycenter = barycenters(*it, ghost_type); barycenter.resize(nb_element); Array::iterator> bary_it = barycenter.begin(spatial_dimension); for (UInt elem = 0; elem < nb_element; ++elem) { e.element = elem; mesh.getBarycenter(e, *bary_it); ++bary_it; } } } } UInt operator()(const Element & elem) { UInt spatial_dimension = model.getSpatialDimension(); const Vector & bary = barycenters(elem.type, elem.ghost_type) .begin(spatial_dimension)[elem.element]; /// check for a given element on which side of the material interface plane /// the bary center lies and assign corresponding material if (bary(!horizontal) < pos_interface) { return model.getMaterialIndex(mat_1_material); ; } return model.getMaterialIndex(mat_2_material); ; } bool isConditonVerified() { /// check if material has been (re)-assigned correctly Mesh & mesh = model.getMesh(); UInt spatial_dimension = mesh.getSpatialDimension(); GhostType ghost_type = _not_ghost; Mesh::type_iterator it = mesh.firstType(spatial_dimension, ghost_type); Mesh::type_iterator last_type = mesh.lastType(spatial_dimension, ghost_type); for (; it != last_type; ++it) { Array & mat_indexes = model.getMaterialByElement(*it, ghost_type); UInt nb_element = mesh.getNbElement(*it, ghost_type); Array::iterator> bary = barycenters(*it, ghost_type).begin(spatial_dimension); for (UInt elem = 0; elem < nb_element; ++elem, ++bary) { /// compare element_index_by material to material index that should be /// assigned due to the geometry of the interface UInt mat_index; if ((*bary)(!horizontal) < pos_interface) mat_index = model.getMaterialIndex(mat_1_material); else mat_index = model.getMaterialIndex(mat_2_material); if (mat_indexes(elem) != mat_index) /// wrong material index, make test fail return false; } } return true; } void moveInterface(Real & pos_new, bool & horizontal_new) { /// update position and orientation of material interface plane pos_interface = pos_new; horizontal = horizontal_new; model.reassignMaterial(); } protected: SolidMechanicsModel & model; ElementTypeMapArray barycenters; std::string mat_1_material; std::string mat_2_material; bool horizontal; Real pos_interface; }; /* -------------------------------------------------------------------------- */ /* Main */ /* -------------------------------------------------------------------------- */ int main(int argc, char * argv[]) { bool test_passed; debug::setDebugLevel(dblWarning); initialize("two_materials.dat", argc, argv); /// specify position and orientation of material interface plane bool horizontal = true; Real pos_interface = 0.; UInt spatial_dimension = 3; - akantu::StaticCommunicator & comm = - akantu::StaticCommunicator::getStaticCommunicator(); - akantu::Int psize = comm.getNbProc(); - akantu::Int prank = comm.whoAmI(); + StaticCommunicator & comm = + StaticCommunicator::getStaticCommunicator(); + Int prank = comm.whoAmI(); Mesh mesh(spatial_dimension); if (prank == 0) mesh.read("cube_two_materials.msh"); mesh.distribute(); /// model creation SolidMechanicsModel model(mesh); /// assign the two different materials using the /// StraightInterfaceMaterialSelector StraightInterfaceMaterialSelector * mat_selector; mat_selector = new StraightInterfaceMaterialSelector( model, "mat_1", "mat_2", horizontal, pos_interface); model.setMaterialSelector(*mat_selector); model.initFull(SolidMechanicsModelOptions(_static)); MeshUtils::buildFacets(mesh); - // model.setBaseName("test_reassign_material"); - // model.addDumpField("element_index_by_material"); - // model.addDumpField("partitions"); - // model.dump(); /// check if different materials have been assigned correctly test_passed = mat_selector->isConditonVerified(); if (!test_passed) { AKANTU_DEBUG_ERROR("materials not correctly assigned"); return EXIT_FAILURE; } /// change orientation of material interface plane horizontal = false; mat_selector->moveInterface(pos_interface, horizontal); // model.dump(); /// test if material has been reassigned correctly test_passed = mat_selector->isConditonVerified(); if (!test_passed) { AKANTU_DEBUG_ERROR("materials not correctly reassigned"); return EXIT_FAILURE; } finalize(); if (prank == 0) std::cout << "OK: test passed!" << std::endl; return EXIT_SUCCESS; } /* -------------------------------------------------------------------------- */ diff --git a/test/test_solver/test_sparse_matrix_product.cc b/test/test_solver/test_sparse_matrix_product.cc index b46b90064..51c03723d 100644 --- a/test/test_solver/test_sparse_matrix_product.cc +++ b/test/test_solver/test_sparse_matrix_product.cc @@ -1,117 +1,115 @@ /** * @file test_sparse_matrix_product.cc * * @author Nicolas Richart * * @date creation: Fri Jun 17 2011 * @date last modification: Sun Oct 19 2014 * * @brief test the matrix vector product in parallel * * @section LICENSE * * Copyright (©) 2010-2012, 2014, 2015 EPFL (Ecole Polytechnique Fédérale de * Lausanne) Laboratory (LSMS - Laboratoire de Simulation en Mécanique des * Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "mesh.hh" #include "mesh_partition_scotch.hh" #include "element_synchronizer.hh" #include "sparse_matrix.hh" #include "dof_synchronizer.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; /* -------------------------------------------------------------------------- */ int main(int argc, char *argv[]) { initialize(argc, argv); const UInt spatial_dimension = 2; - const UInt nb_dof = 3; + const UInt nb_dof = 2; StaticCommunicator & comm = akantu::StaticCommunicator::getStaticCommunicator(); Int psize = comm.getNbProc(); Int prank = comm.whoAmI(); Mesh mesh(spatial_dimension); - + mesh.read("bar.msh"); mesh.distribute(); UInt nb_nodes = mesh.getNbNodes(); - //UInt nb_global_nodes = mesh.getNbGlobalNodes(); - DOFManagerDefault dof_manager(mesh, "test_dof_manager"); - Array test_synchronize(nb_nodes, spatial_dimension, "Test vector"); + Array test_synchronize(nb_nodes, nb_dof, "Test vector"); dof_manager.registerDOFs("test_synchronize", test_synchronize, _dst_nodal); if (prank == 0) std::cout << "Creating a SparseMatrix" << std::endl; auto & A = dof_manager.getNewMatrix("A", _symmetric); Array dof_vector(nb_nodes, nb_dof, "vector"); if (prank == 0) std::cout << "Filling the matrix" << std::endl; - for (UInt i = 0; i < nb_nodes; ++i) { + for (UInt i = 0; i < nb_nodes*nb_dof; ++i) { if(dof_manager.isLocalOrMasterDOF(i)) A.addToMatrix(i, i, 2.); } std::stringstream str; str << "Matrix_" << prank << ".mtx"; A.saveMatrix(str.str()); for (UInt n = 0; n < nb_nodes; ++n) { for (UInt d = 0; d < nb_dof; ++d) { - dof_vector(n,d) = 1.; + dof_vector(n, d) = 1.; } } if (prank == 0) std::cout << "Computing x = A * x" << std::endl; dof_vector *= A; auto & sync = dynamic_cast(dof_manager) .getSynchronizer(); if (prank == 0) std::cout << "Gathering the results on proc 0" << std::endl; if(psize > 1) { if(prank == 0) { Array gathered; sync.gather(dof_vector, gathered); debug::setDebugLevel(dblTest); std::cout << gathered << std::endl; debug::setDebugLevel(dblWarning); } else { sync.gather(dof_vector); } } else { debug::setDebugLevel(dblTest); std::cout << dof_vector << std::endl; debug::setDebugLevel(dblWarning); } finalize(); return 0; } diff --git a/test/test_solver/test_sparse_matrix_product.verified b/test/test_solver/test_sparse_matrix_product.verified new file mode 100644 index 000000000..e02e37cd6 --- /dev/null +++ b/test/test_solver/test_sparse_matrix_product.verified @@ -0,0 +1,13 @@ +Creating a SparseMatrix +Filling the matrix +Computing x = A * x +Gathering the results on proc 0 +Array [ + + id : vector + + size : 121 + + nb_component : 2 + + allocated size : 121 + + memory size : 1.89KiByte + + values : {{2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}, {2, 2}} +] + diff --git a/test/test_synchronizer/test_data_distribution.cc b/test/test_synchronizer/test_data_distribution.cc index 5a74265da..014f9e63c 100644 --- a/test/test_synchronizer/test_data_distribution.cc +++ b/test/test_synchronizer/test_data_distribution.cc @@ -1,201 +1,197 @@ /** * @file test_data_distribution.cc * * @author Nicolas Richart * * @date creation: Fri Sep 05 2014 * @date last modification: Sun Oct 19 2014 * * @brief Test the mesh distribution on creation of a distributed synchonizer * * @section LICENSE * * Copyright (©) 2014, 2015 EPFL (Ecole Polytechnique Fédérale de Lausanne) * Laboratory (LSMS - Laboratoire de Simulation en Mécanique des Solides) * * Akantu is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free * Software Foundation, either version 3 of the License, or (at your option) any * later version. * * Akantu is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with Akantu. If not, see . * */ /* -------------------------------------------------------------------------- */ #include "aka_common.hh" #include "element_group.hh" #include "element_synchronizer.hh" #include "mesh_partition_mesh_data.hh" #include "aka_random_generator.hh" /* -------------------------------------------------------------------------- */ using namespace akantu; int main(int argc, char * argv[]) { initialize(argc, argv); const UInt spatial_dimension = 3; Mesh mesh_group_after(spatial_dimension, "after"); Mesh mesh_group_before(spatial_dimension, "before"); StaticCommunicator & comm = StaticCommunicator::getStaticCommunicator(); Int psize = comm.getNbProc(); Int prank = comm.whoAmI(); if (prank == 0) { mesh_group_before.read("data_split.msh"); mesh_group_after.read("data_split.msh"); - mesh_group_before.createGroupsFromMeshData("physical_names"); - mesh_group_before.registerData("global_id"); mesh_group_after.registerData("global_id"); for (Mesh::type_iterator tit = mesh_group_after.firstType(_all_dimensions); tit != mesh_group_after.lastType(_all_dimensions); ++tit) { Array & gidb = *(mesh_group_before.getDataPointer("global_id", *tit)); Array & gida = *(mesh_group_after.getDataPointer("global_id", *tit)); Array::scalar_iterator ait = gida.begin(); Array::scalar_iterator bit = gidb.begin(); Array::scalar_iterator end = gida.end(); for (UInt i = 0; ait != end; ++ait, ++i, ++bit) { *bit = i; *ait = i; } } } RandGenerator::seed(1); mesh_group_before.distribute(); RandGenerator::seed(1); mesh_group_after.distribute(); - mesh_group_after.createGroupsFromMeshData("physical_names"); - if (prank == 0) std::cout << mesh_group_after; GroupManager::element_group_iterator grp_ait = mesh_group_after.element_group_begin(); GroupManager::element_group_iterator grp_end = mesh_group_after.element_group_end(); for (; grp_ait != grp_end; ++grp_ait) { std::string grp = grp_ait->first; const ElementGroup & bgrp = mesh_group_before.getElementGroup(grp); const ElementGroup & agrp = *grp_ait->second; for (ghost_type_t::iterator git = ghost_type_t::begin(); git != ghost_type_t::end(); ++git) { GhostType ghost_type = *git; for (Mesh::type_iterator tit = bgrp.firstType(_all_dimensions, ghost_type); tit != bgrp.lastType(_all_dimensions, ghost_type); ++tit) { Array & gidb = *(mesh_group_before.getDataPointer( "global_id", *tit, ghost_type)); Array & gida = *(mesh_group_after.getDataPointer( "global_id", *tit, ghost_type)); Array bgelem(bgrp.getElements(*tit, ghost_type)); Array agelem(agrp.getElements(*tit, ghost_type)); Array::scalar_iterator ait = agelem.begin(); Array::scalar_iterator bit = bgelem.begin(); Array::scalar_iterator end = agelem.end(); for (; ait != end; ++ait, ++bit) { *bit = gidb(*bit); *ait = gida(*ait); } std::sort(bgelem.begin(), bgelem.end()); std::sort(agelem.begin(), agelem.end()); if (!std::equal(bgelem.begin(), bgelem.end(), agelem.begin())) { std::cerr << "The filters array for the group " << grp << " and for the element type " << *tit << ", " << ghost_type << " do not match" << std::endl; debug::setDebugLevel(dblTest); std::cerr << bgelem << std::endl; std::cerr << agelem << std::endl; debug::debugger.exit(EXIT_FAILURE); } } } } GroupManager::node_group_iterator ngrp_ait = mesh_group_after.node_group_begin(); GroupManager::node_group_iterator ngrp_end = mesh_group_after.node_group_end(); for (; ngrp_ait != ngrp_end; ++ngrp_ait) { std::string grp = ngrp_ait->first; const NodeGroup & bgrp = mesh_group_before.getNodeGroup(grp); const NodeGroup & agrp = *ngrp_ait->second; const Array & gidb = mesh_group_before.getGlobalNodesIds(); const Array & gida = mesh_group_after.getGlobalNodesIds(); Array bgnode(0, 1); Array agnode(0, 1); Array::const_scalar_iterator ait = agrp.begin(); Array::const_scalar_iterator bit = bgrp.begin(); Array::const_scalar_iterator end = agrp.end(); for (; ait != end; ++ait, ++bit) { if (psize > 1) { if (mesh_group_before.isLocalOrMasterNode(*bit)) bgnode.push_back(gidb(*bit)); if (mesh_group_after.isLocalOrMasterNode(*ait)) agnode.push_back(gida(*ait)); } } std::sort(bgnode.begin(), bgnode.end()); std::sort(agnode.begin(), agnode.end()); if (!std::equal(bgnode.begin(), bgnode.end(), agnode.begin())) { std::cerr << "The filters array for the group " << grp << " do not match" << std::endl; debug::setDebugLevel(dblTest); std::cerr << bgnode << std::endl; std::cerr << agnode << std::endl; debug::debugger.exit(EXIT_FAILURE); } } mesh_group_after.getElementGroup("inside").setBaseName("after_inside"); mesh_group_after.getElementGroup("inside").dump(); mesh_group_after.getElementGroup("outside").setBaseName("after_outside"); mesh_group_after.getElementGroup("outside").dump(); mesh_group_after.getElementGroup("volume").setBaseName("after_volume"); mesh_group_after.getElementGroup("volume").dump(); mesh_group_before.getElementGroup("inside").setBaseName("before_inside"); mesh_group_before.getElementGroup("inside").dump(); mesh_group_before.getElementGroup("outside").setBaseName("before_outside"); mesh_group_before.getElementGroup("outside").dump(); mesh_group_before.getElementGroup("volume").setBaseName("before_volume"); mesh_group_before.getElementGroup("volume").dump(); finalize(); return EXIT_SUCCESS; }