Loading Unstructured_mesh/main.cpp +9 −3 Original line number Diff line number Diff line #include <iostream> //#define UNDEBUG #define CONSOLE_COLOURED_OUTPUT #define CONSOLE_COLORED_OUTPUT #include "../src/Debug/Debug.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" Loading Loading @@ -193,7 +193,6 @@ wK3, wK4, wError; template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> void RKMSolver( Problem& problem, Loading Loading @@ -222,13 +221,13 @@ void RKMSolver( tau = finalT - time; run = false; } problem.calculateRHS(time, compData, K1); wK1.start(); 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)); } wK1.lap(); problem.calculateRHS(time, Ktemp, K2); wK2.start(); 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++){ 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(); problem.calculateRHS(time, Ktemp, K5); double error = 0.0; wError.start(); 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) + 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); if (tmpE > error) { error = tmpE; } } wError.lap(); //DBGVAR_CSV(error); error *= tau * (1.0 / 3.0); if (error < delta) { 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() { testHeatConduction1(); Loading src/Traits/TraitsAlgorithm/TraitsAlgorithm.h +35 −15 Original line number Diff line number Diff line Loading @@ -307,7 +307,8 @@ template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type 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> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type 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> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type& typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type abs(TraitT&& op1) noexcept { TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); Loading @@ -870,7 +871,7 @@ typename std::enable_if< >::type abs(const T& arg) noexcept { return std::abs(arg); return abs(arg); } template <typename T> Loading Loading @@ -1022,24 +1023,43 @@ max(const T& array) noexcept { 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> typename std::enable_if< HasDefaultArithmeticTraits<TraitT>::value, double //typename TraitCommonType<TraitT>::type >::type 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( [&res, &op1](unsigned int, const auto& ref, const std::string&) noexcept { auto m = max(ref.getValue(op1)); if (res < m) { res = m; } } ); return res; return ImplMax::max(op1); } Loading Loading
Unstructured_mesh/main.cpp +9 −3 Original line number Diff line number Diff line #include <iostream> //#define UNDEBUG #define CONSOLE_COLOURED_OUTPUT #define CONSOLE_COLORED_OUTPUT #include "../src/Debug/Debug.h" #include "../src/UnstructuredMesh/UnstructuredMesh.h" #include "../src/UnstructuredMesh/MeshFunctions/MeshFunctions.h" Loading Loading @@ -193,7 +193,6 @@ wK3, wK4, wError; template <typename Problem, typename = typename std::enable_if<HasDefaultArithmeticTraits<typename Problem::ResultType>::value>::type> void RKMSolver( Problem& problem, Loading Loading @@ -222,13 +221,13 @@ void RKMSolver( tau = finalT - time; run = false; } problem.calculateRHS(time, compData, K1); wK1.start(); 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)); } wK1.lap(); problem.calculateRHS(time, Ktemp, K2); wK2.start(); 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++){ 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(); problem.calculateRHS(time, Ktemp, K5); double error = 0.0; wError.start(); 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) + 0.8 * K4.template getDataByPos<0>().at(i) - 0.1 * K5.template getDataByPos<0>().at(i))); if (tmpE > error) { error = tmpE; } } wError.lap(); //DBGVAR_CSV(error); error *= tau * (1.0 / 3.0); if (error < delta) { 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() { testHeatConduction1(); Loading
src/Traits/TraitsAlgorithm/TraitsAlgorithm.h +35 −15 Original line number Diff line number Diff line Loading @@ -307,7 +307,8 @@ template <typename TraitT> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type 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> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type 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> typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type& typename std::enable_if<HasDefaultArithmeticTraits<TraitT>::value, TraitT>::type abs(TraitT&& op1) noexcept { TraitsUnaryExpressionProcesor<Abs>::evaluate(op1, op1); Loading @@ -870,7 +871,7 @@ typename std::enable_if< >::type abs(const T& arg) noexcept { return std::abs(arg); return abs(arg); } template <typename T> Loading Loading @@ -1022,24 +1023,43 @@ max(const T& array) noexcept { 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> typename std::enable_if< HasDefaultArithmeticTraits<TraitT>::value, double //typename TraitCommonType<TraitT>::type >::type 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( [&res, &op1](unsigned int, const auto& ref, const std::string&) noexcept { auto m = max(ref.getValue(op1)); if (res < m) { res = m; } } ); return res; return ImplMax::max(op1); } Loading