Loading Unstructured_mesh/main.cpp +9 −3 Original line number Original line Diff line number Diff line #include <iostream> #include <iostream> //#define UNDEBUG //#define UNDEBUG #define CONSOLE_COLOURED_OUTPUT #define CONSOLE_COLORED_OUTPUT #include "../src/Debug/Debug.h" #include "../src/Debug/Debug.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" Loading Loading @@ -193,7 +193,6 @@ wK3, wK4, wK4, wError; wError; template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> void RKMSolver( void RKMSolver( Problem& problem, Problem& problem, Loading Loading @@ -222,13 +221,13 @@ void RKMSolver( tau = finalT - time; tau = finalT - time; run = false; run = false; } } problem.calculateRHS(time, compData, K1); problem.calculateRHS(time, compData, K1); wK1.start(); wK1.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * (1.0 / 3.0) * K1.template getDataByDim<MeshDimension>().at(i)); Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * (1.0 / 3.0) * K1.template getDataByDim<MeshDimension>().at(i)); } } wK1.lap(); wK1.lap(); problem.calculateRHS(time, Ktemp, K2); problem.calculateRHS(time, Ktemp, K2); wK2.start(); wK2.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Loading @@ -247,19 +246,24 @@ wK4.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * ((0.5 * K1.template getDataByDim<MeshDimension>().at(i)) - (1.5 * K3.template getDataByDim<MeshDimension>().at(i)) + (2.0 * K4.template getDataByPos<0>().at(i)))); Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * ((0.5 * K1.template getDataByDim<MeshDimension>().at(i)) - (1.5 * K3.template getDataByDim<MeshDimension>().at(i)) + (2.0 * K4.template getDataByPos<0>().at(i)))); } } wK4.lap(); wK4.lap(); problem.calculateRHS(time, Ktemp, K5); problem.calculateRHS(time, Ktemp, K5); double error = 0.0; double error = 0.0; wError.start(); wError.start(); for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ double tmpE = max(abs(0.2 * K1.template getDataByPos<0>().at(i) - 0.9 * K3.template getDataByPos<0>().at(i) + double tmpE = max(abs(0.2 * K1.template getDataByPos<0>().at(i) - 0.9 * K3.template getDataByPos<0>().at(i) + 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); if (tmpE > error) { if (tmpE > error) { error = tmpE; error = tmpE; } } } } wError.lap(); wError.lap(); //DBGVAR_CSV(error); error *= tau * (1.0 / 3.0); error *= tau * (1.0 / 3.0); if (error < delta) { if (error < delta) { for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ Loading Loading @@ -409,6 +413,8 @@ DBGVAR(wK1.getResult(),wK2.getResult(),wK3.getResult(),wK4.getResult(),wError.ge } } int main() int main() { { testHeatConduction1(); testHeatConduction1(); Loading src/Traits/TraitsAlgorithm/TraitsAlgorithm.h +35 −15 Original line number Original line Diff line number Diff line Loading @@ -307,7 +307,8 @@ template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type operator-(const TraitT& op1, TraitT&& op2) noexcept { operator-(const TraitT& op1, TraitT&& op2) noexcept { return op2 -= op1; TraitsBinaryExpressionProcesor<BinaryMinus>::evaluate(op2, op1, op2); } } Loading @@ -321,7 +322,7 @@ operator-(TraitT&& op1, const TraitT& op2) noexcept { template <typename TraitT> template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type operator-(TraitT&& op1, TraitT&& op2) noexcept { operator-(TraitT&& op1, TraitT&& op2) noexcept { return op2 -= op1; return op1 -= op2; } } Loading Loading @@ -853,7 +854,7 @@ abs(const TraitT& op1) noexcept { } } template <typename TraitT> template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type& typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type abs(TraitT&& op1) noexcept { abs(TraitT&& op1) noexcept { TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); Loading @@ -870,7 +871,7 @@ typename std::enable_if< >::type >::type abs(const T& arg) noexcept { abs(const T& arg) noexcept { return std::abs(arg); return abs(arg); } } template <typename T> template <typename T> Loading Loading @@ -1022,24 +1023,43 @@ max(const T& array) noexcept { return res; return res; } } namespace ImplMax { template<typename TraitT, unsigned int Index = DefaultArithmeticTraits<TraitT>::size() - 1> typename std::enable_if< Index == 0 , double //typename TraitCommonType<TraitT>::type >::type max(const TraitT& op1){ using ::max; return max(DefaultArithmeticTraits<TraitT>::getTraits().template getValue<Index>(op1)); } template<typename TraitT, unsigned int Index = DefaultArithmeticTraits<TraitT>::size() - 1> typename std::enable_if< (Index > 0) && (Index < DefaultArithmeticTraits<TraitT>::size() - 1) , double >::type max(const TraitT& op1){ return std::max( max(DefaultArithmeticTraits<TraitT>::getTraits().template getAttr<Index - 1>(op1)), DefaultArithmeticTraits<TraitT>::getTraits().template getAttr(get<Index>(op1)) ); } } template <typename TraitT> template <typename TraitT> typename std::enable_if< typename std::enable_if< HasDefaultArithmeticTraits<TraitT>::value, HasDefaultArithmeticTraits<TraitT>::value, double //typename TraitCommonType<TraitT>::type double //typename TraitCommonType<TraitT>::type >::type >::type max(const TraitT& op1) noexcept { max(const TraitT& op1) noexcept { double res = -std::numeric_limits<double>::max(); //typename TraitCommonType<TraitT>::type res = std::numeric_limits<typename TraitCommonType<TraitT>::type>::min(); DefaultArithmeticTraits<TraitT>::getTraits().apply( return ImplMax::max(op1); [&res, &op1](unsigned int, const auto& ref, const std::string&) noexcept { auto m = max(ref.getValue(op1)); if (res < m) { res = m; } } ); return res; } } Loading Loading
Unstructured_mesh/main.cpp +9 −3 Original line number Original line Diff line number Diff line #include <iostream> #include <iostream> //#define UNDEBUG //#define UNDEBUG #define CONSOLE_COLOURED_OUTPUT #define CONSOLE_COLORED_OUTPUT #include "../src/Debug/Debug.h" #include "../src/Debug/Debug.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" Loading Loading @@ -193,7 +193,6 @@ wK3, wK4, wK4, wError; wError; template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> void RKMSolver( void RKMSolver( Problem& problem, Problem& problem, Loading Loading @@ -222,13 +221,13 @@ void RKMSolver( tau = finalT - time; tau = finalT - time; run = false; run = false; } } problem.calculateRHS(time, compData, K1); problem.calculateRHS(time, compData, K1); wK1.start(); wK1.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * (1.0 / 3.0) * K1.template getDataByDim<MeshDimension>().at(i)); Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * (1.0 / 3.0) * K1.template getDataByDim<MeshDimension>().at(i)); } } wK1.lap(); wK1.lap(); problem.calculateRHS(time, Ktemp, K2); problem.calculateRHS(time, Ktemp, K2); wK2.start(); wK2.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Loading @@ -247,19 +246,24 @@ wK4.start(); for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < Ktemp.template getDataByPos<0>().size(); i++){ Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * ((0.5 * K1.template getDataByDim<MeshDimension>().at(i)) - (1.5 * K3.template getDataByDim<MeshDimension>().at(i)) + (2.0 * K4.template getDataByPos<0>().at(i)))); Ktemp.template getDataByPos<0>().at(i) = compData.template getDataByDim<MeshDimension>().at(i) + (tau * ((0.5 * K1.template getDataByDim<MeshDimension>().at(i)) - (1.5 * K3.template getDataByDim<MeshDimension>().at(i)) + (2.0 * K4.template getDataByPos<0>().at(i)))); } } wK4.lap(); wK4.lap(); problem.calculateRHS(time, Ktemp, K5); problem.calculateRHS(time, Ktemp, K5); double error = 0.0; double error = 0.0; wError.start(); wError.start(); for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ double tmpE = max(abs(0.2 * K1.template getDataByPos<0>().at(i) - 0.9 * K3.template getDataByPos<0>().at(i) + double tmpE = max(abs(0.2 * K1.template getDataByPos<0>().at(i) - 0.9 * K3.template getDataByPos<0>().at(i) + 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); if (tmpE > error) { if (tmpE > error) { error = tmpE; error = tmpE; } } } } wError.lap(); wError.lap(); //DBGVAR_CSV(error); error *= tau * (1.0 / 3.0); error *= tau * (1.0 / 3.0); if (error < delta) { if (error < delta) { for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ for (size_t i = 0; i < K4.template getDataByPos<0>().size(); i++){ Loading Loading @@ -409,6 +413,8 @@ DBGVAR(wK1.getResult(),wK2.getResult(),wK3.getResult(),wK4.getResult(),wError.ge } } int main() int main() { { testHeatConduction1(); testHeatConduction1(); Loading
src/Traits/TraitsAlgorithm/TraitsAlgorithm.h +35 −15 Original line number Original line Diff line number Diff line Loading @@ -307,7 +307,8 @@ template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type operator-(const TraitT& op1, TraitT&& op2) noexcept { operator-(const TraitT& op1, TraitT&& op2) noexcept { return op2 -= op1; TraitsBinaryExpressionProcesor<BinaryMinus>::evaluate(op2, op1, op2); } } Loading @@ -321,7 +322,7 @@ operator-(TraitT&& op1, const TraitT& op2) noexcept { template <typename TraitT> template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type operator-(TraitT&& op1, TraitT&& op2) noexcept { operator-(TraitT&& op1, TraitT&& op2) noexcept { return op2 -= op1; return op1 -= op2; } } Loading Loading @@ -853,7 +854,7 @@ abs(const TraitT& op1) noexcept { } } template <typename TraitT> template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type& typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type abs(TraitT&& op1) noexcept { abs(TraitT&& op1) noexcept { TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); Loading @@ -870,7 +871,7 @@ typename std::enable_if< >::type >::type abs(const T& arg) noexcept { abs(const T& arg) noexcept { return std::abs(arg); return abs(arg); } } template <typename T> template <typename T> Loading Loading @@ -1022,24 +1023,43 @@ max(const T& array) noexcept { return res; return res; } } namespace ImplMax { template<typename TraitT, unsigned int Index = DefaultArithmeticTraits<TraitT>::size() - 1> typename std::enable_if< Index == 0 , double //typename TraitCommonType<TraitT>::type >::type max(const TraitT& op1){ using ::max; return max(DefaultArithmeticTraits<TraitT>::getTraits().template getValue<Index>(op1)); } template<typename TraitT, unsigned int Index = DefaultArithmeticTraits<TraitT>::size() - 1> typename std::enable_if< (Index > 0) && (Index < DefaultArithmeticTraits<TraitT>::size() - 1) , double >::type max(const TraitT& op1){ return std::max( max(DefaultArithmeticTraits<TraitT>::getTraits().template getAttr<Index - 1>(op1)), DefaultArithmeticTraits<TraitT>::getTraits().template getAttr(get<Index>(op1)) ); } } template <typename TraitT> template <typename TraitT> typename std::enable_if< typename std::enable_if< HasDefaultArithmeticTraits<TraitT>::value, HasDefaultArithmeticTraits<TraitT>::value, double //typename TraitCommonType<TraitT>::type double //typename TraitCommonType<TraitT>::type >::type >::type max(const TraitT& op1) noexcept { max(const TraitT& op1) noexcept { double res = -std::numeric_limits<double>::max(); //typename TraitCommonType<TraitT>::type res = std::numeric_limits<typename TraitCommonType<TraitT>::type>::min(); DefaultArithmeticTraits<TraitT>::getTraits().apply( return ImplMax::max(op1); [&res, &op1](unsigned int, const auto& ref, const std::string&) noexcept { auto m = max(ref.getValue(op1)); if (res < m) { res = m; } } ); return res; } } Loading