Cloned SEACAS for EXODUS library with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

595 lines
20 KiB

// Copyright(C) 1999-2020 National Technology & Engineering Solutions
// of Sandia, LLC (NTESS). Under the terms of Contract DE-NA0003525 with
// NTESS, the U.S. Government retains certain rights in this software.
//
// See packages/seacas/LICENSE for details
#include "apr_util.h" // for conv_string
#include "aprepro.h" // for Aprepro, symrec, etc
#include "init_structs.h" // for svar_init, var_init
#include <cstddef> // for size_t
#include <cstring> // for strcmp
#include <iomanip> // for operator<<, setw, etc
#include <ostream> // for operator<<, basic_ostream, etc
#include <string> // for char_traits, operator<<, etc
namespace SEAMS {
extern Aprepro *aprepro;
extern bool echo;
// clang-format off
namespace {
std::string &comment()
{
static std::string com = aprepro->getsym("_C_")->value.svar;
return com;
}
void define_var(const char *name, double val, const char *label)
{
aprepro->add_variable(name, val, true);
if (echo) {
*(aprepro->infoStream) << comment() << " 1 " << std::left << std::setw(10) << name
<< "\t= " << std::setw(14) << std::setprecision(7) << val << " "
<< label << '\n';
}
}
void load_conversion(var_init *base, svar_init *label);
constexpr double LBF_TO_N = 4.4482216152605;
constexpr double PI = 3.141592653589793238462643;
//-------------------------------------------------------------------------------------
// SI Units
svar_init si_label[] =
{
{"tout", "second"},
{"lout", "meter"},
{"aout", "m/sec^2"},
{"mout", "kilogram"},
{"fout", "newton"},
{"vout", "meter/sec"},
{"Vout", "meter^3"},
{"dout", "kg/m^3"},
{"eout", "joule (Nm)"},
{"Pout", "watt (Nm/s)"},
{"pout", "Pa"},
{"Tout", "degK"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init si[] =
{
{"m" , 1.},
{"sec" , 1.},
{"kg" , 1.},
{"degK" , 1.},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is cgs units: cm, sec, g
svar_init cgs_label[] =
{
{"tout", "second"},
{"lout", "cm"},
{"aout", "cm/sec^2"},
{"mout", "gram"},
{"fout", "dyne"},
{"vout", "cm/sec"},
{"Vout", "cm^3"},
{"dout", "g/cc"},
{"eout", "erg"},
{"Pout", "erg/sec"},
{"pout", "dyne/cm^2"},
{"Tout", "degK"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init cgs[] =
{
{"m" , 100.},
{"sec" , 1.},
{"kg" , 1000.},
{"degK" , 1.},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is cgs-ev units: cm, sec, g, eV
svar_init cgs_ev_label[] =
{
{"tout", "second"},
{"lout", "cm"},
{"aout", "cm/sec^2"},
{"mout", "gram"},
{"fout", "dyne"},
{"vout", "cm/sec"},
{"Vout", "cm^3"},
{"dout", "g/cc"},
{"eout", "erg"},
{"Pout", "erg/sec"},
{"pout", "dyne/cm^2"},
{"Tout", "eV"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init cgs_ev[] =
{
{"m" , 100.},
{"sec" , 1.},
{"kg" , 1000.},
{"degK" , 1./ 11604.5221},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is the shock units file: cm, usec, g
svar_init shock_label[] =
{
{"tout", "microsecond"},
{"lout", "cm"},
{"aout", "cm/usec^2"},
{"mout", "gram"},
{"fout", "g-cm/usec^2"},
{"vout", "cm/usec"},
{"Vout", "cm^3"},
{"dout", "g/cc"},
{"eout", "g-cm^2/usec^2"},
{"Pout", "g-cm^2/usec^3"},
{"pout", "Mbar"},
{"Tout", "degK"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init shock[] =
{
{"m" , 100.},
{"sec" , 1.0e6},
{"kg" , 1000.},
{"degK" , 1.},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is the "swap" units file: mm, usec, 1e-4g
svar_init swap_label[] =
{
{"tout", "microsecond"},
{"lout", "mm"},
{"aout", "mm/usec^2"},
{"mout", "(1e-4 gram)"},
{"fout", "(1e7 dyne)"},
{"vout", "mm/usec"},
{"Vout", "mm^3"},
{"dout", "(1e-1 g/cc)"},
{"eout", "Mega-erg"},
{"Pout", "Mega-erg/usec"},
{"pout", "kbar"},
{"Tout", "degK"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init swap[] =
{
{"m" , 1'000.},
{"sec" , 1'000'000.},
{"kg" , 10'000'000.},
{"degK" , 1.},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is the ft-lbf-s units file
svar_init ft_lbf_s_label[] =
{
{"tout", "second"},
{"lout", "foot"},
{"aout", "ft/sec^2"},
{"mout", "slug"},
{"fout", "lbf"},
{"vout", "ft/sec"},
{"Vout", "ft^3"},
{"dout", "slug/ft^3"},
{"eout", "ft-lbf"},
{"Pout", "ft-lbf/sec"},
{"pout", "lbf/ft^2"},
{"Tout", "degR"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init ft_lbf_s[] =
{
{"m" , 1./.3048},
{"sec" , 1.},
{"kg" , 1/4.5359237e-1/(9.806650/.3048)},
{"degK" , 1.8},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is the ft-lbm-s units file
svar_init ft_lbm_s_label[] =
{
{"tout", "second"},
{"lout", "foot"},
{"aout", "ft/sec^2"},
{"mout", "lbm"},
{"fout", "poundal"},
{"vout", "ft/sec"},
{"Vout", "ft^3"},
{"dout", "lbm/ft^3"},
{"eout", "ft-poundal"},
{"Pout", "ft-poundal/sec"},
{"pout", "poundal/ft^2"},
{"Tout", "degR"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init ft_lbm_s[] =
{
{"m" , 1./.3048},
{"sec" , 1.},
{"kg" , 1/.45359237},
{"degK" , 1.8},
{"rad" , 1.},
{nullptr, 0}
};
//-------------------------------------------------------------------------------------
// This is the in-lbf-s units file: inch, sec, lbf
svar_init in_lbf_s_label[] =
{
{"tout", "second"},
{"lout", "inch"},
{"aout", "in/sec^2"},
{"mout", "lbf-sec^2/in"},
{"fout", "lbf"},
{"vout", "in/sec"},
{"Vout", "in^3"},
{"dout", "lbf-sec^2/in^4"},
{"eout", "inch-lbf"},
{"Pout", "inch-lbf/sec"},
{"pout", "psi"},
{"Tout", "degR"},
{"Aout", "radian"},
{nullptr, nullptr}
};
var_init in_lbf_s[] =
{
{"m" , 1./2.54e-2},
{"sec" , 1.},
{"kg" , 1/4.5359237e-1/(9.806650/2.54e-2)},
{"degK" , 1.8},
{"rad" , 1.},
{nullptr, 0}
};
struct unit_systems
{
const char *name;
var_init *base;
svar_init *label;
};
unit_systems systems[] =
{
{"si", si, si_label},
{"cgs", cgs, cgs_label},
{"cgs-ev", cgs_ev, cgs_ev_label},
{"shock", shock, shock_label},
{"swap", swap, swap_label},
{"ft-lbf-s", ft_lbf_s, ft_lbf_s_label},
{"ft-lbm-s", ft_lbm_s, ft_lbm_s_label},
{"in-lbf-s", in_lbf_s, in_lbf_s_label},
{nullptr, nullptr, nullptr}
};
} // namespace
const char *do_Units(char *type)
{
SEAMS::conv_string(type);
int i;
for (i = 0; systems[i].name != nullptr; i++) {
if (std::strcmp(type, systems[i].name) == 0) {
break;
}
}
if (systems[i].name != nullptr) {
// Found a match
for (int j = 0; systems[i].label[j].vname != nullptr; j++) {
aprepro->add_variable(systems[i].label[j].vname, systems[i].label[j].value, true);
}
for (int j = 0; systems[i].base[j].vname != nullptr; j++) {
aprepro->add_variable(systems[i].base[j].vname, systems[i].base[j].value, true);
}
load_conversion(systems[i].base, systems[i].label);
return (" ");
}
return ("Aprepro: ERROR: Invalid units system type. Valid types are: 'si', 'cgs', 'cgs-ev', "
"'shock', 'swap', 'ft-lbf-s', 'ft-lbm-s', 'in-lbf-s'");
}
namespace {
void load_conversion(var_init *base, svar_init *label)
{
const char *tout = label[ 0].value;
const char *lout = label[ 1].value;
const char *aout = label[ 2].value;
const char *mout = label[ 3].value;
const char *fout = label[ 4].value;
const char *vout = label[ 5].value;
const char *Vout = label[ 6].value;
const char *dout = label[ 7].value;
const char *eout = label[ 8].value;
const char *Pout = label[ 9].value;
const char *pout = label[10].value;
const char *Tout = label[11].value;
const char *Aout = label[12].value;
double m = base[0].value;
double sec = base[1].value;
double kg = base[2].value;
double degK = base[3].value;
double rad = base[4].value;
double foot = m * 0.3048;
double inch = foot / 12.0;
std::string title_prefix = "\n";
for(size_t i = 0; i < 3; i++) {
title_prefix += comment();
}
title_prefix += " ";
if (echo != 0) {
*(aprepro->infoStream)
<< title_prefix << "Outputs\n" <<
comment() << " " << std::setw(10) << "Time" << ":\t" << tout << "\n" <<
comment() << " " << std::setw(10) << "Length" << ":\t" << lout << "\n" <<
comment() << " " << std::setw(10) << "Accel" << ":\t" << aout << "\n" <<
comment() << " " << std::setw(10) << "Mass" << ":\t" << mout << "\n" <<
comment() << " " << std::setw(10) << "Force" << ":\t" << fout << "\n" <<
comment() << " " << std::setw(10) << "Velocity" << ":\t" << vout << "\n" <<
comment() << " " << std::setw(10) << "Volume" << ":\t" << Vout << "\n" <<
comment() << " " << std::setw(10) << "Density" << ":\t" << dout << "\n" <<
comment() << " " << std::setw(10) << "Energy" << ":\t" << eout << "\n" <<
comment() << " " << std::setw(10) << "Power" << ":\t" << Pout << "\n" <<
comment() << " " << std::setw(10) << "Pressure" << ":\t" << pout << "\n" <<
comment() << " " << std::setw(10) << "Temp" << ":\t" << Tout << "\n" <<
comment() << " " << std::setw(10) << "Angular" << ":\t" << Aout << "\n" <<
comment() << '\n';
}
if (echo != 0) {
*(aprepro->infoStream)
<< title_prefix << "Base Dimensions\n" <<
comment() << " 1 " << std::left << std::setw(10) << "meter" << "\t= "
<< std::setw(14) << std::setprecision(7) << m << " " << lout << "\n" <<
comment() << " 1 " << std::left << std::setw(10) << "second" << "\t= "
<< std::setw(14) << std::setprecision(7) << sec << " " << tout << "\n" <<
comment() << " 1 " << std::left << std::setw(10) << "kg" << "\t= "
<< std::setw(14) << std::setprecision(7) << kg << " " << mout << "\n" <<
comment() << " 1 " << std::left << std::setw(10) << "kelvin" << "\t= "
<< std::setw(14) << std::setprecision(7) << degK << " " << Tout << "\n" <<
comment() << " 1 " << std::left << std::setw(10) << "radian" << "\t= "
<< std::setw(14) << std::setprecision(7) << rad << " " << Aout << '\n';
}
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Binary Prefixes" << '\n';
}
define_var("byte", 1, "byte");
define_var("KiB", 1024.0, "byte");
define_var("MiB", 1024.0*1024.0, "byte");
define_var("GiB", 1024.0*1024.0*1024.0, "byte");
define_var("TiB", 1024.0*1024.0*1024.0*1024.0, "byte");
define_var("PiB", 1024.0*1024.0*1024.0*1024.0*1024.0, "byte");
define_var("EiB", 1024.0*1024.0*1024.0*1024.0*1024.0*1024.0, "byte");
define_var("ZiB", 1024.0*1024.0*1024.0*1024.0*1024.0*1024.0*1024.0, "byte");
define_var("YiB", 1024.0*1024.0*1024.0*1024.0*1024.0*1024.0*1024.0*1024.0, "byte");
define_var("KB", 1.0e03, "byte");
define_var("MB", 1.0e06, "byte");
define_var("GB", 1.0e09, "byte");
define_var("TB", 1.0e12, "byte");
define_var("PB", 1.0e15, "byte");
define_var("EB", 1.0e18, "byte");
define_var("ZB", 1.0e21, "byte");
define_var("YB", 1.0e24, "byte");
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Time (T)" << '\n';
}
define_var("second", sec, tout);
define_var("usec", sec / 1.0e6, tout);
define_var("microsecond", sec / 1.0e6, tout);
define_var("msec", sec / 1.0e3, tout);
define_var("millisecond", sec / 1.0e3, tout);
define_var("minute", 60. * sec, tout);
define_var("hr", 60. * 60. * sec, tout);
define_var("hour", 60. * 60. * sec, tout);
define_var("day", 24. * 60. * 60. * sec, tout);
define_var("yr", 365.25 * 24. * 60. * 60. * sec, tout);
define_var("year", 365.25 * 24. * 60. * 60. * sec, tout);
define_var("decade", 10. * 365.25 * 24. * 60. * 60. * sec, tout);
define_var("century", 100. * 365.25 * 24. * 60. * 60. * sec, tout);
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Length (L)" << '\n';
}
define_var("meter", m, lout);
define_var("metre", m, lout);
define_var("cm", m / 100., lout);
define_var("centimeter", m / 100., lout);
define_var("centimetre", m / 100., lout);
define_var("mm", m / 1000., lout);
define_var("millimeter", m / 1000., lout);
define_var("millimetre", m / 1000., lout);
define_var("um", m / 1.0e6, lout);
define_var("micrometer", m / 1.0e6, lout);
define_var("micrometre", m / 1.0e6, lout);
define_var("km", m * 1000., lout);
define_var("kilometer", m * 1000., lout);
define_var("kilometre", m * 1000., lout);
define_var("ft", foot, lout);
define_var("foot", foot, lout);
define_var("mi", foot * 5280., lout);
define_var("mile", foot * 5280., lout);
define_var("yd", foot * 3, lout);
define_var("yard", foot * 3., lout);
define_var("in", inch, lout);
define_var("inch", inch, lout);
define_var("mil", inch / 1000., lout);
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Acceleration (L/T^2)" << '\n';
}
define_var("ga", 9.806650 * m / (sec*sec), aout);
// Force (ML/T^2)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Force (ML/T^2)" << '\n';
}
define_var("newton", 1.0 * kg*m/(sec*sec), fout);
define_var("N", 1.0 * kg*m/(sec*sec), fout);
define_var("dyne", 1.0e-5 * kg*m/(sec*sec), fout);
define_var("lbf", LBF_TO_N * kg*m/(sec*sec), fout);
define_var("kip", 1000.* LBF_TO_N * kg*m/(sec*sec), fout);
define_var("kgf", 9.806650 * kg*m/(sec*sec), fout);
define_var("gf", 9.806650 * kg*m/(sec*sec)/1000., fout);
define_var("pdl", 1.382550e-1 * kg*m/(sec*sec), fout);
define_var("poundal", 1.382550e-1 * kg*m/(sec*sec), fout);
define_var("ounce", LBF_TO_N * kg*m/(sec*sec)/16.0, fout);
// Mass (M)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Mass (M)" << '\n';
}
define_var("gram", kg / 1000., mout);
define_var("g", kg / 1000., mout);
define_var("lbm", 453.59237 * kg / 1000., mout);
define_var("slug", 453.59237 * kg / 1000. * 32.17404856, mout);
define_var("lbfs2pin", LBF_TO_N * kg/0.0254, mout);
// Velocity (L/T)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Velocity (L/T)" << '\n';
}
define_var("mps", m/sec, vout);
define_var("fps", foot / sec, vout);
define_var("mph", (foot * 5280.) / (60. * 60. * sec), vout);
define_var("ips", (inch) / sec, vout);
define_var("kph", (1000. * m) / (60. * 60. * sec), vout);
define_var("kps", (1000. * m) / sec, vout);
// Volume (L^3)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Volume (L^3)" << '\n';
}
define_var("liter", (m*m*m)/1000., Vout);
define_var("gal", 3.785412 * (m*m*m)/1000., Vout);
define_var("gallon", 3.785412 * (m*m*m)/1000., Vout);
// Density (M/L^3)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Density (M/L^3)" << '\n';
}
define_var("gpcc", (kg/1000.)/((m/100.)*(m/100.)*(m/100.)), dout);
define_var("kgpm3", kg /(m*m*m), dout);
define_var("lbfs2pin4", (LBF_TO_N * kg*m/(sec*sec))*sec*sec / (inch*inch*inch*inch), dout);
define_var("lbmpin3", (453.59237 * kg / 1000.) / (inch*inch*inch), dout);
define_var("lbmpft3", (453.59237 * kg / 1000.) / (foot*foot*foot), dout);
define_var("slugpft3", (453.59237 * kg / 1000. * 32.17404856) / (foot*foot*foot), dout);
// Power: (M L^2 / T^3)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Power (M L^2 / T^3)" << '\n';
}
define_var("W", kg*m/(sec*sec)*m/sec, Pout);
define_var("watt", kg*m/(sec*sec)*m/sec, Pout);
define_var("Hp", kg*m/(sec*sec)*m/sec * 746, Pout); // --- (electric horsepower)
// Energy (ML^2/T^2)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Energy (M L^2 / T^2)" << '\n';
}
define_var("joule", kg*m/(sec*sec)*m, eout);
define_var("J", kg*m/(sec*sec)*m, eout);
define_var("ftlbf", kg*m/(sec*sec)*m * 1.355818, eout);
define_var("Btu", kg*m/(sec*sec)*m * 1.05505585262e3, eout); //--- I18n Table
define_var("erg", kg*m/(sec*sec)*m * 1.0e-7, eout);
define_var("calorie", kg*m/(sec*sec)*m * 4.18680, eout); // --- I18n Table
define_var("kwh", kg*m/(sec*sec)*m * 1000.0 * 60. * 60., eout);
define_var("therm", kg*m/(sec*sec)*m * 1.054804e8, eout); // --- U.S.
define_var("tonTNT", kg*m/(sec*sec)*m * 4.184e9, eout);
// Pressure: (M/L/T^2)
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Pressure (M/L/T^2)" << '\n';
}
define_var("Pa", kg*m/(sec*sec) / (m*m), pout);
define_var("pascal", kg*m/(sec*sec) / (m*m), pout);
define_var("MPa", kg*m/(sec*sec) / (m*m) * 1.0e6, pout);
define_var("GPa", kg*m/(sec*sec) / (m*m) * 1.0e9, pout);
define_var("bar", kg*m/(sec*sec) / (m*m) * 1.0e5, pout);
define_var("kbar", kg*m/(sec*sec) / (m*m) * 1.0e5 * 1.0e3, pout);
define_var("Mbar", kg*m/(sec*sec) / (m*m) * 1.0e5 * 1.0e6, pout);
define_var("psi", LBF_TO_N * kg*m/(sec*sec) / (inch*inch), pout);
define_var("ksi", LBF_TO_N * kg*m/(sec*sec) / (inch*inch) * 1000.0, pout);
define_var("psf", LBF_TO_N * kg*m/(sec*sec) / (foot*foot), pout);
define_var("atm", kg*m/(sec*sec) / (m*m) * 1.013250e5, pout); // --- std atmosphere
define_var("torr", kg*m/(sec*sec) / (m*m) * 1.013250e5 / 760.0, pout);
define_var("mHg", kg*m/(sec*sec) / (m*m) * 1.013250e5 / 760.0 * 1000.0, pout);
define_var("mmHg", kg*m/(sec*sec) / (m*m) * 1.013250e5 / 760.0, pout);
define_var("inHg", kg*m/(sec*sec) / (m*m) * 1.013250e5 / 760.0 * 25.4, pout);
define_var("inH2O", kg*m/(sec*sec) / (m*m) * 249.082, pout);
define_var("ftH2O", kg*m/(sec*sec) / (m*m) * 249.082 * 12.0, pout);
// Temperature:
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Temperature" << '\n';
}
define_var("kelvin", degK, Tout);
define_var("degC", degK, Tout);
define_var("degF", 5./9. * degK, Tout);
define_var("degR", 5./9. * degK, Tout);
define_var("rankine",5./9. * degK, Tout);
define_var("eV", 11604.5221 * degK, Tout);
// Angular
if (echo != 0) {
*(aprepro->infoStream) << title_prefix << "Angular" << '\n';
}
define_var("rev", 2.0 * PI * rad, Aout);
define_var("deg", 2.0 * PI * rad / 360.0, Aout);
define_var("degree", 2.0 * PI * rad / 360.0, Aout);
define_var("arcmin", 2.0 * PI * rad / 360.0 / 60.0, Aout);
define_var("arcsec", 2.0 * PI * rad / 360.0 / 60.0 / 60.0, Aout);
define_var("grade", 2.0 * PI * rad / 360.0 * 0.9, Aout);
}
} // namespace
} // namespace SEAMS