PHengLEI-NCCR/API/Math/include/Math_Limiter.h

203 lines
6.0 KiB
C++

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// PPPPP H H EEEEE N N GGGGG L EEEEE III +
// P P H H E NN N G L E I +
// PPPPP HHHHH EEEEE N N N G GG L EEEEE I +
// P H H E N N N G G L E I +
// P H H EEEEE N N GGGGG LLLLL EEEEE III +
//------------------------------------------------------------------------+
// Platform for Hybrid Engineering Simulation of Flows +
// China Aerodynamics Research and Development Center +
// (C) Copyright, Since 2010 +
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//! @file Math_Limiter.h
//! @brief Limiters' mathematic functions, such as vencat, vanleer, etc.
//! @author Bell, He Xin.
#pragma once
#include "Precision.h"
#include "Math_BasisFunction.h"
#include <cmath>
#include <algorithm>
using namespace std;
namespace PHSPACE
{
//! CheckLimit.
//! @param[in]: value
//! @param[in]: v_min
//! @param[in]: v_max
inline bool CheckLimit(const RDouble &value, const RDouble &v_min, const RDouble &v_max)
{
if (value < v_min || value > v_max) return false;
return true;
}
//! NOLIMITER.
//! @param[in]: x
//! @param[in]: y
inline RDouble NOLIMITER(const RDouble &x)
{
return x;
}
//! MINMOD.
//! @param[in]: x
//! @param[in]: y
inline RDouble MINMOD(const RDouble &x, const RDouble &y)
{
return half * (SIGN(one, x) + SIGN(one, y)) * MIN(ABS(x), ABS(y));
}
//! VANLEER.
//! @param[in]: x
//! @param[in]: y
inline RDouble VANLEER(const RDouble &x, const RDouble &y)
{
const RDouble eps = 1.0e-12;
return (SIGN(one, x) + SIGN(one, y)) * x * y / (ABS(x + y) + eps);
}
//! MIX_MINMOD_VANLEER.
//! @param[in]: x
//! @param[in]: y
inline RDouble MIX_MINMOD_VANLEER(const RDouble &x, const RDouble &y)
{
const RDouble eps = 1.0e-15;
RDouble z, z2, z3, xy2, absx, absy, min_van;
z = half * (SIGN(one, x) + SIGN(one, y));
absx = abs(x);
absy = abs(y);
xy2 = (x + x) * y;
z2 = xy2 / (x * x + y * y + eps);
z3 = xy2 / (absx + absy + eps);
min_van = z * ((one - z2) * min(absx , absy) + z2 * z3);
/*
if (ABS(z) < eps)
{
min_van = 0.0;
}
else
{
absx = abs(x);
absy = abs(y);
xy2 = (x + x) * y;
z2 = xy2 / (x * x + y * y + eps);
z3 = xy2 / (absx + absy + eps);
min_van = z * ((1.0 - z2) * min(absx, absy) + z2 * z3);
}
*/
return min_van;
}
//! VANALBADA.
//! @param[in]: x
//! @param[in]: y
inline RDouble VANALBADA(const RDouble &x, const RDouble &y)
{
//const RDouble eps = 1.0e-7;
//RDouble cx, cy, cd;
//cx = x * x + eps;
//cy = y * y + eps;
//cd = 1.0 / (cx + cy);
//return (cx * y + cy * x) * cd;
const RDouble eps = 1.0e-6;
// RDouble cx, cy, cd;
// cx = x * x + eps;
// cy = y * y + eps;
// cd = 1.0 / (cx + cy);
return 0.5 * (SIGN(one, x) + SIGN(one, y)) * ((x * y)* ABS(x + y)) / (x * x + y * y + eps);
}
//! VANALBADACLZ.
//! @param[in]: x
//! @param[in]: y
inline RDouble VANALBADACLZ(const RDouble &x, const RDouble &y)
{
const RDouble eps = 1.0e-6;
RDouble cx, cy, cd;
cx = x * x + eps;
cy = y * y + eps;
cd = 1.0 / (cx + cy);
return 0.5 * (SIGN(one, x) + SIGN(one, y)) * (cx * y + cy * x) * cd;
}
//! SMOOTH.
//! @param[in]: x
//! @param[in]: y
inline RDouble SMOOTH(const RDouble &x, const RDouble &y)
{
const RDouble eps = 1.0e-6;
RDouble Smooth= (2. * x * y + eps) / (x * x + y * y + eps); //0.5 * (SIGN(1.0, x) + SIGN(1.0, y)) *
return Smooth;
}
//! SMOOTHTURB.
//! @param[in]: x
//! @param[in]: y
inline RDouble SMOOTHTURB(const RDouble &x, const RDouble &y)
{
const RDouble eps = 1.0e-6;
RDouble Smooth = (2. * x * y) / (x * x + y * y + eps); //0.5 * (SIGN(1.0, x) + SIGN(1.0, y)) *
return Smooth;
}
//! THIRD_ORDER_SMOOTH.
//! @param[in]: x
//! @param[in]: y
inline RDouble THIRD_ORDER_SMOOTH(const RDouble &x, const RDouble &y)
{
const RDouble eps2 = 1.0e-6;
RDouble Smooth1 = x * (y * y + 2.0 * eps2) + y * (2.0 * x * x + eps2);
RDouble Smooth2 = 2.0 * x * x - x * y + 2.0 * y * y + 3.0 * eps2;
RDouble Smooth = Smooth1 / Smooth2;
return Smooth;
}
//! THIRD_ORDER_MINMOD_SMOOTH.
//! @param[in]: x
//! @param[in]: y
inline RDouble THIRD_ORDER_MINMOD_SMOOTH(const RDouble &x, const RDouble &y)
{
const RDouble eps2 = 1.0e-6;
RDouble Smooth1 = x * (y * y + 2.0 * eps2) + y * (2.0 * x * x + eps2);
RDouble Smooth2 = 2.0 * x * x - x * y + 2.0 * y * y + 3.0 * eps2;
RDouble Smooth = 0.5 * (SIGN(one, x) + SIGN(one, y)) * Smooth1 / Smooth2;
return Smooth;
}
//! VenFun.
//! @param[in]: x
//! @param[in]: y
//! @param[in]: eps
inline RDouble VenFun(const RDouble &x, const RDouble &y, const RDouble &eps)
{
RDouble x2 = x * x;
RDouble xy = x * y;
RDouble y2 = y * y;
return ((x2 + eps + 2.0 * xy) / (x2 + 2.0 * y2 + xy + eps));
}
PH_DEFINE_BINARY_FUNCTION(PH_MinMod, MINMOD)
PH_DEFINE_BINARY_FUNCTION(PH_Vanleer, VANLEER)
PH_DEFINE_BINARY_FUNCTION(PH_Vanalbada, VANALBADA)
PH_DEFINE_BINARY_FUNCTION(PH_VanalbadaCLZ, VANALBADACLZ)
PH_DEFINE_BINARY_FUNCTION(PH_Smooth, SMOOTH)
PH_DEFINE_BINARY_FUNCTION(PH_Third_Order_Smooth, THIRD_ORDER_SMOOTH)
PH_DEFINE_BINARY_FUNCTION(PH_Third_Order_Minmod_Smooth, THIRD_ORDER_MINMOD_SMOOTH)
PH_DEFINE_BINARY_FUNCTION(PH_Smooth_turb, SMOOTHTURB)
PH_DEFINE_BINARY_FUNCTION(PH_Min_Van, MIX_MINMOD_VANLEER)
PH_DECLARE_ARRAY_BINARY(MinMod, PH_MinMod)
PH_DECLARE_ARRAY_BINARY(Vanleer, PH_Vanleer)
PH_DECLARE_ARRAY_BINARY(Vanalbada, PH_Vanalbada)
PH_DECLARE_ARRAY_BINARY(VanalbadaCLZ, PH_VanalbadaCLZ)
PH_DECLARE_ARRAY_BINARY(Smooth, PH_Smooth)
PH_DECLARE_ARRAY_BINARY(Third_Order_SMOOTH, PH_Third_Order_Smooth)
PH_DECLARE_ARRAY_BINARY(Third_Order_Minmod_Smooth, PH_Third_Order_Minmod_Smooth)
PH_DECLARE_ARRAY_BINARY(Smoothturb, PH_Smooth_turb)
PH_DECLARE_ARRAY_BINARY(Minvan, PH_Min_Van)
}