예제 #1
0
inline solver::AugRie_SIMD::AugRie_SIMD (
    real i_dryTolerance, real i_gravity, real i_newtonTolerance,
    int i_maxNumberOfNewtonIterations, real i_zeroTolerance
) :
    scalar_solver(i_dryTolerance, i_gravity, i_newtonTolerance, i_maxNumberOfNewtonIterations, i_zeroTolerance),
    newtonTol (i_newtonTolerance),
    maxNumberOfNewtonIterations (i_maxNumberOfNewtonIterations)
#if VECTOR_EXTENSION != VECTOR_NOVEC
    ,
    DryDry_V(SETV_I(DryDry)), WetWet_V(SETV_I(WetWet)),
    DryWetInundation_V(SETV_I(DryWetInundation)), WetDryInundation_V(SETV_I(WetDryInundation)),
    DryWetWallInundation_V(SETV_I(DryWetWallInundation)), DryWetWall_V(SETV_I(DryWetWall)),
    WetDryWallInundation_V(SETV_I(WetDryWallInundation)), WetDryWall_V(SETV_I(WetDryWall)),

    ShockShock_V(SETV_I(ShockShock)), RarefactionRarefaction_V(SETV_I(RarefactionRarefaction)),
    ShockRarefaction_V(SETV_I(ShockRarefaction)), RarefactionShock_V(SETV_I(RarefactionShock)),
    DrySingleRarefaction_V(SETV_I(DrySingleRarefaction)), SingleRarefactionDry_V(SETV_I(SingleRarefactionDry)),

    sqrt_g_v(SETV_R(std::sqrt(i_gravity))),
    zeroTol_v(SETV_R(i_zeroTolerance)),
    zeroTol_v_neg(SETV_R(-i_zeroTolerance)),
    dryTol_v(SETV_R(i_dryTolerance)),
    dryTol_v_neg(SETV_R(-i_dryTolerance)),
    g_v(SETV_R(i_gravity))
#endif /* VECTOR_NOVEC */
{
    #ifndef NDEBUG
    #ifndef SUPPRESS_SOLVER_DEBUG_OUTPUT
    //print some information about the used solver
    std::cout << "  *** solver::AugRie_SIMD created" << std::endl
    << "    zeroTolerance=" << i_zeroTolerance << std::endl
    << "    gravity=" << i_gravity << std::endl
    << "    dryTolerance=" << i_dryTolerance << std::endl
    << "    newtonTolerance=" << i_newtonTolerance << std::endl
    << "    maxNumberOfNewtonIterations=" << maxNumberOfNewtonIterations << std::endl
    << "\n  ***\n\n";
    #endif
    #endif
}
예제 #2
0
/*
 * Check, whether a real_vector contains infinity or NaN
 */
inline bool checkVector (const __m128 x) {
    static const real_vector infinity = SETV_R(std :: numeric_limits<float> :: infinity());
    return MOVEMASK(ANDV_R(CMP_EQ_R(x, x), NOTV_R(CMP_EQ_R(x, infinity)))) == VECTOR_FULL_MASK;
}