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


}
}




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

}
}




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




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