43 lines
1.2 KiB
C++
43 lines
1.2 KiB
C++
/**
|
|
* @file checkFinite.cpp Declarations for routines that check for the
|
|
* presence of NaNs in the code.
|
|
*/
|
|
|
|
// This file is part of Cantera. See License.txt in the top-level directory or
|
|
// at http://www.cantera.org/license.txt for license and copyright information.
|
|
|
|
#include "cantera/base/ct_defs.h"
|
|
#include "cantera/base/stringUtils.h"
|
|
#include "cantera/base/ctexceptions.h"
|
|
|
|
namespace Cantera {
|
|
|
|
void checkFinite(const double tmp)
|
|
{
|
|
if (!std::isfinite(tmp)) {
|
|
if (std::isnan(tmp)) {
|
|
throw CanteraError("checkFinite", "found NaN");
|
|
} else if (tmp > 0) {
|
|
throw CanteraError("checkFinite", "found +Inf");
|
|
} else {
|
|
throw CanteraError("checkFinite", "found -Inf");
|
|
}
|
|
}
|
|
}
|
|
|
|
void checkFinite(const std::string& name, double* values, size_t N)
|
|
{
|
|
for (size_t i = 0; i < N; i++) {
|
|
if (!std::isfinite(values[i])) {
|
|
std::string message = name + " contains non-finite elements:\n\n";
|
|
for (size_t j = 0; j < N; j++) {
|
|
if (!std::isfinite(values[j])) {
|
|
message += fmt::format("{}[{}] = {}\n", name, j, values[j]);
|
|
}
|
|
}
|
|
throw CanteraError("checkFinite", message);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|