126 lines
3.2 KiB
C++
126 lines
3.2 KiB
C++
/**
|
|
* @file vcs_util.cpp
|
|
* Internal definitions for utility functions for the VCSnonideal package
|
|
*/
|
|
|
|
// 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/equil/vcs_internal.h"
|
|
#include "cantera/equil/vcs_defs.h"
|
|
#include "cantera/base/stringUtils.h"
|
|
#include "cantera/base/ctexceptions.h"
|
|
#include <cassert>
|
|
#include <cstring>
|
|
|
|
using namespace std;
|
|
|
|
namespace Cantera
|
|
{
|
|
|
|
double vcs_l2norm(const vector_fp& vec)
|
|
{
|
|
if (vec.empty()) {
|
|
return 0.0;
|
|
}
|
|
double sum = 0.0;
|
|
for (const auto& val : vec) {
|
|
sum += val * val;
|
|
}
|
|
return std::sqrt(sum / vec.size());
|
|
}
|
|
|
|
size_t vcs_optMax(const double* x, const double* xSize, size_t j, size_t n)
|
|
{
|
|
size_t largest = j;
|
|
double big = x[j];
|
|
if (xSize) {
|
|
assert(xSize[j] > 0.0);
|
|
big *= xSize[j];
|
|
for (size_t i = j + 1; i < n; ++i) {
|
|
assert(xSize[i] > 0.0);
|
|
if ((x[i] * xSize[i]) > big) {
|
|
largest = i;
|
|
big = x[i] * xSize[i];
|
|
}
|
|
}
|
|
} else {
|
|
for (size_t i = j + 1; i < n; ++i) {
|
|
if (x[i] > big) {
|
|
largest = i;
|
|
big = x[i];
|
|
}
|
|
}
|
|
}
|
|
return largest;
|
|
}
|
|
|
|
const char* vcs_speciesType_string(int speciesStatus, int length)
|
|
{
|
|
switch (speciesStatus) {
|
|
case VCS_SPECIES_COMPONENT:
|
|
return "Component Species";
|
|
case VCS_SPECIES_MAJOR:
|
|
return "Major Species";
|
|
case VCS_SPECIES_MINOR:
|
|
return "Minor Species";
|
|
case VCS_SPECIES_ZEROEDPHASE:
|
|
if (length < 48) {
|
|
return "Set Zeroed-Phase";
|
|
} else {
|
|
return "Purposely Zeroed-Phase Species (not in problem)";
|
|
}
|
|
case VCS_SPECIES_ZEROEDMS:
|
|
if (length < 23) {
|
|
return "Zeroed-MS Phase";
|
|
} else {
|
|
return "Zeroed-MS Phase Species";
|
|
}
|
|
case VCS_SPECIES_ZEROEDSS:
|
|
if (length < 23) {
|
|
return "Zeroed-SS Phase";
|
|
} else {
|
|
return "Zeroed-SS Phase Species";
|
|
}
|
|
case VCS_SPECIES_DELETED:
|
|
if (length < 22) {
|
|
return "Deleted Species";
|
|
} else if (length < 40) {
|
|
return "Deleted-Small Species";
|
|
} else {
|
|
return "Deleted-Small Species in a MS phase";
|
|
}
|
|
case VCS_SPECIES_ACTIVEBUTZERO:
|
|
if (length < 47) {
|
|
return "Tmp Zeroed in MS";
|
|
} else {
|
|
return "Zeroed Species in an active MS phase (tmp)";
|
|
}
|
|
case VCS_SPECIES_STOICHZERO:
|
|
if (length < 56) {
|
|
return "Stoich Zeroed in MS";
|
|
} else {
|
|
return "Zeroed Species in an active MS phase (Stoich Constraint)";
|
|
}
|
|
case VCS_SPECIES_INTERFACIALVOLTAGE:
|
|
if (length < 29) {
|
|
return "InterfaceVoltage";
|
|
} else {
|
|
return "InterfaceVoltage Species";
|
|
}
|
|
default:
|
|
return "unknown species type";
|
|
}
|
|
}
|
|
|
|
bool vcs_doubleEqual(double d1, double d2)
|
|
{
|
|
double denom = fabs(d1) + fabs(d2) + 1.0;
|
|
double fac = fabs(d1 - d2) / denom;
|
|
if (fac > 1.0E-10) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
}
|