Commit 5543a7f0 authored by Tomáš Jakubec's avatar Tomáš Jakubec
Browse files

fixed error in operator- which gets two rvalues

parent eef17227
Loading
Loading
Loading
Loading
+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"
@@ -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,
@@ -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++){
@@ -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++){
@@ -409,6 +413,8 @@ DBGVAR(wK1.getResult(),wK2.getResult(),wK3.getResult(),wK4.getResult(),wError.ge

}



int main()
{
    testHeatConduction1();
+35 −15
Original line number Diff line number Diff line
@@ -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);

}


@@ -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;
}


@@ -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);
@@ -870,7 +871,7 @@ typename std::enable_if<
>::type
abs(const T& arg) noexcept {

    return  std::abs(arg);
    return  abs(arg);
}

template <typename T>
@@ -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);
}