From 480829a8a73aa706d52dc938802b721dbec84657 Mon Sep 17 00:00:00 2001 From: Harry Moffat Date: Thu, 6 Jul 2006 21:12:53 +0000 Subject: [PATCH] Added the excess volume test. --- .../cathermo/HMW_graph_VvT/.cvsignore | 11 + .../HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml | 243 ++++++++++++ .../cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp | 348 ++++++++++++++++++ .../cathermo/HMW_graph_VvT/Makefile.in | 116 ++++++ .../cathermo/HMW_graph_VvT/NaCl_Solid.xml | 39 ++ test_problems/cathermo/HMW_graph_VvT/README | 1 + .../cathermo/HMW_graph_VvT/TemperatureTable.h | 129 +++++++ .../cathermo/HMW_graph_VvT/V_standalone.cpp | 182 +++++++++ .../cathermo/HMW_graph_VvT/output_blessed.txt | 39 ++ test_problems/cathermo/HMW_graph_VvT/runtest | 42 +++ .../cathermo/HMW_graph_VvT/sortAlgorithms.cpp | 54 +++ .../cathermo/HMW_graph_VvT/sortAlgorithms.h | 21 ++ 12 files changed, 1225 insertions(+) create mode 100644 test_problems/cathermo/HMW_graph_VvT/.cvsignore create mode 100644 test_problems/cathermo/HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml create mode 100755 test_problems/cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp create mode 100644 test_problems/cathermo/HMW_graph_VvT/Makefile.in create mode 100644 test_problems/cathermo/HMW_graph_VvT/NaCl_Solid.xml create mode 100644 test_problems/cathermo/HMW_graph_VvT/README create mode 100644 test_problems/cathermo/HMW_graph_VvT/TemperatureTable.h create mode 100644 test_problems/cathermo/HMW_graph_VvT/V_standalone.cpp create mode 100644 test_problems/cathermo/HMW_graph_VvT/output_blessed.txt create mode 100755 test_problems/cathermo/HMW_graph_VvT/runtest create mode 100644 test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.cpp create mode 100644 test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.h diff --git a/test_problems/cathermo/HMW_graph_VvT/.cvsignore b/test_problems/cathermo/HMW_graph_VvT/.cvsignore new file mode 100644 index 000000000..da33a5c43 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/.cvsignore @@ -0,0 +1,11 @@ +Makefile +output.txt +outputa.txt +.cvsignore.swp +.depends +HMW_graph_VvT +HMW_graph_VvT.d +V_standalone +diff_test.out +sortAlgorithms.d +table.csv diff --git a/test_problems/cathermo/HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml b/test_problems/cathermo/HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml new file mode 100644 index 000000000..1ca6c066a --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/HMW_NaCl_sp1977_alt.xml @@ -0,0 +1,243 @@ + + + + + + H2O(L) Cl- H+ Na+ OH- + + + 298.15 + 101325.0 + + Na+:6.0954 + Cl-:6.0954 + H+:2.1628E-9 + OH-:1.3977E-6 + + + + + + + + + + + + 0.0765, 0.008946, -3.3158E-6, + -777.03, -4.4706 + + 0.2664, 6.1608E-5, 1.0715E-6 + 0.0 + 0.00127, -4.655E-5, 0.0, + 33.317, 0.09421 + + 2.0 + + + + 0.1775, 0.0, 0.0, 0.0, 0.0 + 0.2945, 0.0, 0.0 + 0.0 + 0.0008, 0.0, 0.0, 0.0, 0.0 + 2.0 + + + + 0.0864, 0.0, 0.0, 0.0, 0.0 + 0.253, 0.0, 0.0 + 0.0 + 0.0044, 0.0, 0.0, 0.0, 0.0 + 2.0 + + + + -0.05 + + + + -0.05 + -0.006 + + + + 0.036 + + + + 0.036 + -0.004 + + + + H2O(L) + + O H C Fe Si N Na Cl + + + + + + + + + + H:2 O:1 + + + + 7.255750050E+01, -6.624454020E-01, 2.561987460E-03, -4.365919230E-06, + 2.781789810E-09, -4.188654990E+04, -2.882801370E+02 + + + + + + 0.018068 + + + + + + Na:1 + +1 + + + + -57993.47558 , 305112.6040 , -592222.1591 , + 401977.9827 , 804.4195980 , 10625.24901 , + -133796.2298 + + + + + + + 0.00834 + + + + + + Cl:1 + -1 + + + + 0.00834 + + + + + 56696.2042 , -297835.978 , 581426.549 , + -401759.991 , -804.301136 , -10873.8257 , + 130650.697 + + + + + + + + H:1 + +1 + + 0.0 + + + + 0.0 + 3 + + 0.0 , 0.0, 0.0 + + + 273.15, 298.15 , 623.15 + + + + + + + + O:1 H:1 + -1 + + + 0.00834 + + + + + 44674.99961 , -234943.0414 , 460522.8260 , + -320695.1836 , -638.5044716 , -8683.955813 , + 102874.2667 + + + + + + + + diff --git a/test_problems/cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp b/test_problems/cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp new file mode 100755 index 000000000..fd1053aa6 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/HMW_graph_VvT.cpp @@ -0,0 +1,348 @@ +/** + * @file HMW_graph_VvT + */ + +/* + * $Author$ + * $Date$ + * $Revision$ + */ +#include + +#ifdef SRCDIRTREE +#include "ct_defs.h" +#include "logger.h" +#include "TemperatureTable.h" +#include "HMWSoln.h" +#include "importCTML.h" +#else +#include "vcsc.h" +#include "cantera/Cantera.h" +#include "vcs_Cantera_input.h" +#include "vcs_Cantera_convert.h" +#include "cantera/kernel/logger.h" +#include "cantera/thermo.h" +#include "TemperatureTable.h" +#include "ThermoPhase.h" +#include "HMWSoln.h" +#include "importCTML.h" + +#endif +using namespace Cantera; + +class fileLog: public Logger { +public: + fileLog(string fName) { + m_fName = fName; + m_fs.open(fName.c_str()); + } + + virtual void write(const string& msg) { + m_fs << msg; + m_fs.flush(); + } + + virtual ~fileLog() { + m_fs.close(); + } + + string m_fName; + ofstream m_fs; + +}; + +void printUsage() { + cout << "usage: HMW_test " << endl; + cout <<" -> Everything is hardwired" << endl; +} + +void pAtable(HMWSoln *HMW) { + int nsp = HMW->nSpecies(); + double acMol[100]; + double mf[100]; + double activities[100]; + double moll[100]; + + HMW->getMolalityActivityCoefficients(acMol); + HMW->getMoleFractions(mf); + HMW->getActivities(activities); + HMW->getMolalities(moll); + string sName; + printf(" Name Activity ActCoeffMolal " + " MoleFract Molality\n"); + for (int k = 0; k < nsp; k++) { + sName = HMW->speciesName(k); + printf("%16s %13g %13g %13g %13g\n", + sName.c_str(), activities[k], acMol[k], mf[k], moll[k]); + } +} + +int main(int argc, char **argv) +{ + + int retn = 0; + int i; + + try { + + char iFile[80]; + strcpy(iFile, "HMW_NaCl.xml"); + if (argc > 1) { + strcpy(iFile, argv[1]); + } + double V0[20], pmV[20]; + + //fileLog *fl = new fileLog("HMW_graph_1.log"); + //setLogger(fl); + + HMWSoln *HMW = new HMWSoln(iFile, "NaCl_electrolyte"); + + + /* + * Load in and initialize the + */ + Cantera::ThermoPhase *solid = newPhase("NaCl_Solid.xml","NaCl(S)"); + + + int nsp = HMW->nSpecies(); + //double acMol[100]; + //double act[100]; + double mf[100]; + double moll[100]; + HMW->getMoleFractions(mf); + string sName; + + TemperatureTable TTable(15, false, 273.15, 25., 0, 0); + + + HMW->setState_TP(298.15, 1.01325E5); + + int i1 = HMW->speciesIndex("Na+"); + int i2 = HMW->speciesIndex("Cl-"); + //int i3 = HMW->speciesIndex("H2O(L)"); + for (i = 0; i < nsp; i++) { + moll[i] = 0.0; + } + HMW->setMolalities(moll); + + + double ISQRT; + double Is = 0.0; + + /* + * Set the Pressure + */ + double pres = OneAtm; + + /* + * Fix the molality + */ + Is = 6.146; + ISQRT = sqrt(Is); + moll[i1] = Is; + moll[i2] = Is; + HMW->setState_TPM(298.15, pres, moll); + double Xmol[30]; + HMW->getMoleFractions(Xmol); + double meanMW = HMW->meanMolecularWeight(); + + /* + * ThermoUnknowns + */ + double T; + + double V0_NaCl, V0_Naplus, V0_Clminus, Delta_V0s, V0_H2O; + double V_NaCl, V_Naplus, V_Clminus, V_H2O; + double molarV0; +#ifdef DEBUG_HKM + FILE *ttt = fopen("table.csv","w"); +#endif + printf("A_V : Comparison to Pitzer's book, p. 99, can be made.\n"); + printf(" Agreement to 3 sig digits \n"); + printf("\n"); + + printf("Delta_V0: Heat Capacity of Solution per mole of salt (standard states)\n"); + printf(" rxn for the ss heat of soln: " + "NaCl(s) -> Na+(aq) + Cl-(aq)\n"); + + printf("\n"); + printf("Delta_Vs: Delta volume of Solution per mole of salt\n"); + printf(" rxn for heat of soln: " + " n1 H2O(l,pure) + n2 NaCl(s) -> n2 MX(aq) + n1 H2O(l) \n"); + printf(" Delta_Hs = (n1 h_H2O_bar + n2 h_MX_bar " + "- n1 h_H2O_0 - n2 h_MX_0)/n2\n"); + printf("\n"); + printf("phiV: phiV, calculated from the program, is checked\n"); + printf(" against analytical formula in V_standalone program.\n"); + printf(" (comparison against Pitzer book, p. 97, eqn. 96)\n"); + + /* + * Create a Table of NaCl Enthalpy Properties as a Function + * of the Temperature + */ + printf("\n\n"); + printf(" T, Pres, Aphi, A_V," + " Delta_V0," + " Delta_Vs, Vex, phiV," + " MolarV, MolarV0\n"); + printf(" Kelvin, bar, sqrt(kg/gmol),sqrt(kg/gmol)cm3/gmol," + "cm**3/gmolSalt," + "cm**3/gmolSalt,cm**3/gmolSoln,cm**3/gmolSalt," + "cm**3/gmol, cm**3/gmol\n"); +#ifdef DEBUG_HKM + fprintf(ttt,"T, Pres, A_V, Vex, phiV, MolarV, MolarV0\n"); + fprintf(ttt,"Kelvin, bar, sqrt(kg/gmol)cm3/gmol, cm3/gmolSoln, cm3/gmolSalt, kJ/gmolSoln," + "kJ/gmolSoln\n"); +#endif + for (i = 0; i < TTable.NPoints + 1; i++) { + if (i == TTable.NPoints) { + T = 323.15; + } else { + T = TTable.T[i]; + } + /* + * RT is in units of J/kmolK + */ + //double RT = GasConstant * T; + + /* + * Make sure we are at the saturation pressure or above. + */ + + double psat = HMW->satPressure(T); + + pres = OneAtm; + if (psat > pres) pres = psat; + + + HMW->setState_TPM(T, pres, moll); + + solid->setState_TP(T, pres); + + /* + * Get the Standard State volumes m3/kmol + */ + solid->getStandardVolumes(V0); + V0_NaCl = V0[0]; + HMW->getStandardVolumes(V0); + V0_H2O = V0[0]; + V0_Naplus = V0[i1]; + V0_Clminus = V0[i2]; + + /* + * Calculate the standard state volume change of solution + * for NaCl(s) -> Na+ + Cl- + * units: m3 / kmol + */ + Delta_V0s = V0_Naplus + V0_Clminus - V0_NaCl; + + double dd = solid->density(); + double MW_NaCl = solid->meanMolecularWeight(); + V_NaCl = MW_NaCl / dd; + //printf("V_NaCl = %g , V0_NaCl = %g %g\n", V_NaCl, V0_NaCl, 1.0/solid->molarDensity()); + + /* + * Get the partial molar volumes + */ + HMW->getPartialMolarVolumes(pmV); + V_H2O = pmV[0]; + V_Naplus = pmV[i1]; + V_Clminus = pmV[i2]; + + + //double Delta_V_Salt = V_NaCl - (V_Naplus + V_Clminus); + + /* + * Calculate the molar volume of solution + */ + double dsoln = HMW->density(); + meanMW = HMW->meanMolecularWeight(); + double molarV = meanMW / dsoln; + //double md = HMW->molarDensity(); + //printf("compare %g %g\n", molarV, 1.0/md); + + /* + * Calculate the delta volume of solution for the reaction + * NaCl(s) -> Na+ + Cl- + */ + double Delta_Vs = (Xmol[0] * V_H2O + + Xmol[i1] * V_Naplus + + Xmol[i2] * V_Clminus + - Xmol[0] * V0_H2O + - Xmol[i1] * V_NaCl); + Delta_Vs /= Xmol[i1]; + + + /* + * Calculate the apparent molar volume, J, from the + * partial molar quantities, units m3/kmol + */ + double Vex = (Xmol[0] * (V_H2O - V0_H2O) + + Xmol[i1] * (V_Naplus - V0_Naplus) + + Xmol[i2] * (V_Clminus - V0_Clminus)); + + /* + * Calculate the apparent relative molal volume, phiV, + * units of m3/kmol + */ + double phiV = Vex / Xmol[i1]; + + double Aphi = HMW->A_Debye_TP(T, pres) / 3.0; + //double AL = HMW->ADebye_L(T,pres); + double Av = HMW->ADebye_V(T, pres) * 1.0E3; + + + molarV0 = 0.0; + for (int k = 0; k < nsp; k++) { + molarV0 += Xmol[k] * V0[k]; + } + + if (i != TTable.NPoints+1) { + printf("%13g, %13g, %13g, %13g, %13g, %13g, " + "%13g, %13g, %13g, %13g\n", + T, pres*1.0E-5, Aphi, Av, Delta_V0s*1.0E3, Delta_Vs*1.0E3, + Vex*1.0E3, phiV*1.0E3, molarV*1.0E3 , molarV0*1.0E3 ); +#ifdef DEBUG_HKM + fprintf(ttt,"%g, %g, %g, %g, %g, %g, %g\n", + T, pres*1.0E-5, Av, Vex*1.0E3, phiV*1.0E3, molarV*1.0E3 , molarV0*1.0E3); +#endif + } + + } + + printf("Breakdown of Volume Calculation at 323.15 K, 1atm:\n"); + + printf(" Species MoleFrac Molal V0 " + " partV (partV - V0)\n"); + printf(" H2O(L)"); + printf("%13g %13g %13g %13g %13g\n", Xmol[0], moll[0], V0_H2O*1.E3, V_H2O*1.E3, + (V_H2O-V0_H2O)*1.E3); + printf(" Na+ "); + printf("%13g %13g %13g %13g %13g\n", Xmol[i1], moll[i1], + V0_Naplus*1.E3 , V_Naplus*1.E3, (V_Naplus -V0_Naplus)*1.E3); + printf(" Cl- "); + printf("%13g %13g %13g %13g %13g\n", Xmol[i2], moll[i2], + V0_Clminus*1.E3, V_Clminus*1.E3, (V_Clminus - V0_Clminus)*1.E3); + + printf(" NaCl(s)"); + printf("%13g %13g %13g %13g\n", 1.0, + V0_NaCl*1.E3 , V_NaCl*1.E3, V_NaCl*1.E3 - V0_NaCl*1.E3); + + + delete HMW; + HMW = 0; + delete solid; + solid = 0; + Cantera::appdelete(); +#ifdef DEBUG_HKM + fclose(ttt); +#endif + return retn; + + } catch (CanteraError) { + printf("caught error\n"); + showErrors(); + Cantera::appdelete(); + return -1; + } +} diff --git a/test_problems/cathermo/HMW_graph_VvT/Makefile.in b/test_problems/cathermo/HMW_graph_VvT/Makefile.in new file mode 100644 index 000000000..506765552 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/Makefile.in @@ -0,0 +1,116 @@ +#!/bin/sh + +############################################################################ +# +# Makefile to compile and link a C++ application to +# Cantera. +# +############################################################################# + +# addition to suffixes +.SUFFIXES : .d + +# the name of the executable program to be created +PROG_NAME = HMW_graph_VvT + +# the object files to be linked together. List those generated from Fortran +# and from C/C++ separately +OBJS = HMW_graph_VvT.o sortAlgorithms.o + +# Location of the current build. Will assume that tests are run +# in the source directory tree location +src_dir_tree = 1 + +# additional flags to be passed to the linker. If your program +# requires other external libraries, put them here +LINK_OPTIONS = @EXTRA_LINK@ + +############################################################################# + +# Check to see whether we are in the msvc++ environment +os_is_win = @OS_IS_WIN@ + +# Fortran libraries +FORT_LIBS = @FLIBS@ + +# the C++ compiler +CXX = @CXX@ + +# C++ compile flags +ifeq ($(src_dir_tree), 1) +CXX_FLAGS = -DSRCDIRTREE @CXXFLAGS@ +else +CXX_FLAGS = @CXXFLAGS@ +endif + +# Ending C++ linking libraries +LCXX_END_LIBS = @LCXX_END_LIBS@ + +# the directory where the Cantera libraries are located +CANTERA_LIBDIR=@buildlib@ + +# required Cantera libraries +CANTERA_LIBS = @LOCAL_LIBS@ -lctcxx + +# the directory where Cantera include files may be found. +ifeq ($(src_dir_tree), 1) +CANTERA_INCDIR=../../../Cantera/src +INCLUDES=-I$(CANTERA_INCDIR) -I$(CANTERA_INCDIR)/thermo +else +CANTERA_INCDIR=@ctroot@/build/include/cantera +INCLUDES=-I$(CANTERA_INCDIR) -I$(CANTERA_INCDIR)/kernel +endif + +# flags passed to the C++ compiler/linker for the linking step +LCXX_FLAGS = -L$(CANTERA_LIBDIR) @LOCAL_LIB_DIRS@ @CXXFLAGS@ + +# How to compile C++ source files to object files +.@CXX_EXT@.@OBJ_EXT@: + $(CXX) -c $< $(INCLUDES) $(CXX_FLAGS) + +# How to compile the dependency file +.cpp.d: + g++ -MM $(INCLUDES) $(CXX_FLAGS) $*.cpp > $*.d + +# List of dependency files to be created +DEPENDS=$(OBJS:.o=.d) + +# Program Name +PROGRAM = $(PROG_NAME)$(EXE_EXT) + +all: $(PROGRAM) .depends V_standalone + +$(PROGRAM): $(OBJS) $(CANTERA_LIBDIR)/libcantera.a \ + $(CANTERA_LIBDIR)/libcaThermo.a + $(CXX) -o $(PROGRAM) $(OBJS) $(LCXX_FLAGS) $(LINK_OPTIONS) \ + $(CANTERA_LIBS) @LIBS@ $(FORT_LIBS) \ + $(LCXX_END_LIBS) + +V_standalone: V_standalone.o + $(CXX) -o V_standalone V_standalone.o \ + $(LCXX_FLAGS) $(LINK_OPTIONS) $(LCXX_END_LIBS) + +# depends target -> forces recalculation of dependencies +depends: + @MAKE@ .depends + +.depends: $(DEPENDS) + cat $(DEPENDS) > .depends + +# Do the test -> For the windows vc++ environment, we have to skip checking on +# whether the program is uptodate, because we don't utilize make +# in that environment to build programs. +test: +ifeq ($(os_is_win), 1) +else + @MAKE@ $(PROGRAM) +endif + ./runtest + +clean: + $(RM) $(OBJS) $(PROGRAM) $(DEPENDS) .depends + ../../../bin/rm_cvsignore + (if test -d SunWS_cache ; then \ + $(RM) -rf SunWS_cache ; \ + fi ) + diff --git a/test_problems/cathermo/HMW_graph_VvT/NaCl_Solid.xml b/test_problems/cathermo/HMW_graph_VvT/NaCl_Solid.xml new file mode 100644 index 000000000..d711be8ff --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/NaCl_Solid.xml @@ -0,0 +1,39 @@ + + + + + + + + + O H C Fe Ca N Na Cl + + NaCl(S) + + 2.165 + + + + + + + + + + + Na:1 Cl:1 + + + + 50.72389, 6.672267, -2.517167, + 10.15934, -0.200675, -427.2115, + 130.3973 + + + + 2.165 + + + + + diff --git a/test_problems/cathermo/HMW_graph_VvT/README b/test_problems/cathermo/HMW_graph_VvT/README new file mode 100644 index 000000000..f22bf8f5e --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/README @@ -0,0 +1 @@ +Check on the enthalpy routines for HMWSoln diff --git a/test_problems/cathermo/HMW_graph_VvT/TemperatureTable.h b/test_problems/cathermo/HMW_graph_VvT/TemperatureTable.h new file mode 100644 index 000000000..70cb2bf56 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/TemperatureTable.h @@ -0,0 +1,129 @@ +/* + * $Id$ + */ +/* + * Copywrite 2004 Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000, there is a non-exclusive license for use of this + * work by or on behalf of the U.S. Government. Export of this program + * may require a license from the United States Government. + */ + +#ifndef TEMPERATURE_TABLE_H +#define TEMPERATURE_TABLE_H +#include "sortAlgorithms.h" +//#include "mdp_allo.h" +#include +using std::vector; + +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +/** + * This Class constructs a vector of temperature from which to make + * a table. + */ +class TemperatureTable { + +public: + int NPoints; + bool Include298; + double Tlow; //!< Min temperature for thermo data fit + double Thigh; //!< Max temperature for thermo table + double DeltaT; + vector T; + int numAddedTs; + vector AddedTempVector; +public: + /* + * Default constructor for TemperatureTable() + */ + TemperatureTable(const int nPts = 14, + const bool inc298 = true, + const double tlow = 300., + const double deltaT = 100., + const int numAdded = 0, + const double *addedTempVector = 0) : + NPoints(nPts), + Include298(inc298), + Tlow(tlow), + DeltaT(deltaT), + T(0), + numAddedTs(numAdded) { + /****************************/ + int i; + // AddedTempVector = mdp_alloc_dbl_1(numAdded, 0.0); + AddedTempVector.resize(numAdded, 0.0); + for (int i = 0; i < numAdded; i++) { + AddedTempVector[i] = addedTempVector[i]; + } + //mdp_copy_dbl_1(AddedTempVector, addedTempVector, numAdded); + // T = mdp_alloc_dbl_1(NPoints, 0.0); + T.resize(NPoints, 0.0); + double TCurrent = Tlow; + for (i = 0; i < NPoints; i++) { + T[i] = TCurrent; + TCurrent += DeltaT; + } + if (Include298) { + T.push_back(298.15); + //mdp_realloc_dbl_1(&T, NPoints+1, NPoints, 298.15); + NPoints++; + } + if (numAdded > 0) { + //mdp_realloc_dbl_1(&T, NPoints+numAdded, NPoints, 0.0); + T.resize( NPoints+numAdded, 0.0); + for (i = 0; i < numAdded; i++) { + T[i+NPoints] = addedTempVector[i]; + } + NPoints += numAdded; + } + + sort_dbl_1(DATA_PTR(T), NPoints); + + + } + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + /* + * Destructor + */ + ~TemperatureTable() { + //mdp_safe_free((void **) &AddedTempVector); + // mdp_safe_free((void **) &T); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + /* + * Overloaded operator[] + * + * return the array value in the vector + */ + double operator[](const int i) { + return T[i]; + } + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + /* + * size() + */ + int size() { + return NPoints; + } +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ + /* + * Block assignment and copy constructors: not needed. + */ +private: + TemperatureTable(const TemperatureTable &); + TemperatureTable& operator=(const TemperatureTable&); +}; +/***********************************************************************/ +/***********************************************************************/ +/***********************************************************************/ +#endif diff --git a/test_problems/cathermo/HMW_graph_VvT/V_standalone.cpp b/test_problems/cathermo/HMW_graph_VvT/V_standalone.cpp new file mode 100644 index 000000000..bc319eb57 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/V_standalone.cpp @@ -0,0 +1,182 @@ + +#include +#include +#include + +using namespace std; + + + +/* + * Values of A_V : tabular form + * units sqrt(kg/gmol)cm3/gmol + */ +double A_V(double temp) { + double retn; + if (temp == 323.15) { + retn = 2.37356; + } else if (temp == 473.15) { + retn = 15.0766; + } else { + printf("A_V unknown temp value %g\n", temp); + exit(-1); + } + return retn; +} + +double Beta0(double temp, int ifunc) { + double q1 = 0.0765; + double q2 = -777.03; + double q3 = -4.4706; + double q4 = 0.008946; + double q5 = -3.3158E-6; + double retn; + double tref = 298.15; + if (ifunc == 0) { + retn = q1 + q2 * (1.0/temp - 1.0/tref) + + q3 * (log(temp/tref)) + q4 * (temp - tref) + + q5 * (temp * temp - tref * tref); + } else if (ifunc == 1) { + retn = (- q2 * 1.0/(temp* temp) + + q3 / temp + + q4 + + 2.0 * temp * q5); + } else if (ifunc == 2) { + retn = ( 2.0 * q2 * 1.0/(temp* temp*temp) + - q3 / (temp*temp) + + 2.0 * q5); + } else if (ifunc == 3) { + retn = 0.0; + } else { + exit(-1); + } + return retn; +} + +double Beta1(double temp, int ifunc) { + double q6 = 0.2664; + double q9 = 6.1608E-5; + double q10 = 1.0715E-6; + double retn; + double tref = 298.15; + if (ifunc == 0) { + retn = q6 + q9 * (temp - tref) + + q10 * (temp * temp - tref * tref); + } else if (ifunc == 1) { + retn = q9 + 2.0 * q10 * temp; + } else if (ifunc == 2) { + retn = 2.0 * q10; + } else if (ifunc == 3) { + retn = 0.0; + } else { + exit(-1); + } + return retn; +} + +double Cphi(double temp, int ifunc) { + double q11 = 0.00127; + double q12 = 33.317; + double q13 = 0.09421; + double q14 = -4.655E-5; + double retn; + double tref = 298.15; + if (ifunc == 0) { + retn = q11 + q12 * (1.0/temp - 1.0/tref) + + q13 * (log(temp/tref)) + q14 * (temp - tref); + } else if (ifunc == 1) { + retn = - q12 / (temp * temp) + + q13 / temp + q14; + } else if (ifunc == 2) { + retn = + 2.0 * q12 / (temp * temp * temp) + - q13 / (temp * temp) ; + } else if (ifunc == 3) { + retn = 0.0; + } else { + exit(-1); + } + return retn; +} + +double calc(double temp, double Iionic) { + /* + * Gas Constant in J gmol-1 K-1 + */ + double GasConst = 8.314472; + + double Aphi = 0.0; + if (temp == 323.15) { + Aphi = 0.4102995331359; + } else if (temp == 473.15) { + Aphi = 0.622777; + } else { + printf("ERROR: unknown temp\n"); + exit(-1); + } + + + /* + * Calculate A_V in sqrt(kg/gmol)cm3/gmol + */ + double Av = A_V(temp); + + double beta0prime3 = Beta0(temp, 3); + printf(" beta0prime3 = %g\n", beta0prime3); + + double beta1prime3 = Beta1(temp, 3); + printf(" beta1prime3 = %g\n", beta1prime3); + + double cphiprime3= Cphi(temp, 3); + printf(" Cphiprime = %g\n", cphiprime3); + + double vm = 1.0; + double vx = 1.0; + double v = vm + vx; + double m = Iionic; + double zm = 1.; + double zx = 1.0; + + double sqrtI = sqrt(Iionic); + + double alpha = 2.0; + double a2 = alpha * alpha; + double b = 1.2; + + double BVmx = beta0prime3 + 2.0 * beta1prime3 / (a2* Iionic) * + (1.0 - (1.0 + alpha * sqrtI) * exp(-alpha*sqrtI) ); + + double CVmx = 0.5 * sqrt(vm * vx) * cphiprime3; + + double phiV = v * zm * zx * (Av/(2.*b)) * log(1 + 1.2 * sqrtI) + + 2 * vm * vx * GasConst * temp *1.0E3 * ( m * BVmx + m * m * CVmx); + + printf(" phiV = %15.8g cm3/gmolSalt\n", phiV); + + double molecWeight = 18.01528; + + double RT = GasConst * temp * 1.0E-3; + + + double xo = 1.0 / (molecWeight/1000. * 2 * m + 1.0); + printf(" no = %g\n", xo); + + return phiV; +} + +main() { + + printf("Standalone test of the apparent relative molal excess volume, phiV:\n"); + printf(" (Check against simple formula in \n"); + printf(" Activity Coefficients in Eletrolyte Solutions, 2nd Ed K. S. Pitzer, " + "CRC Press, Boca Raton, 1991 \n"); + printf("T = 50C\n"); + double Iionic = 6.146; + printf("Ionic Strength = %g\n", Iionic); + + double res = calc(273.15 + 50., Iionic); + printf("T = 200C\n"); + printf("Ionic Strength = %g\n", Iionic); + + res = calc(273.15 + 200., Iionic); + +} diff --git a/test_problems/cathermo/HMW_graph_VvT/output_blessed.txt b/test_problems/cathermo/HMW_graph_VvT/output_blessed.txt new file mode 100644 index 000000000..b72613c52 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/output_blessed.txt @@ -0,0 +1,39 @@ +A_V : Comparison to Pitzer's book, p. 99, can be made. + Agreement to 3 sig digits + +Delta_V0: Heat Capacity of Solution per mole of salt (standard states) + rxn for the ss heat of soln: NaCl(s) -> Na+(aq) + Cl-(aq) + +Delta_Vs: Delta volume of Solution per mole of salt + rxn for heat of soln: n1 H2O(l,pure) + n2 NaCl(s) -> n2 MX(aq) + n1 H2O(l) + Delta_Hs = (n1 h_H2O_bar + n2 h_MX_bar - n1 h_H2O_0 - n2 h_MX_0)/n2 + +phiV: phiV, calculated from the program, is checked + against analytical formula in V_standalone program. + (comparison against Pitzer book, p. 97, eqn. 96) + + + T, Pres, Aphi, A_V, Delta_V0, Delta_Vs, Vex, phiV, MolarV, MolarV0 + Kelvin, bar, sqrt(kg/gmol),sqrt(kg/gmol)cm3/gmol,cm**3/gmolSalt,cm**3/gmolSalt,cm**3/gmolSoln,cm**3/gmolSalt,cm**3/gmol, cm**3/gmol + 273.15, 1.01325, 0.376717, 1.5062, -10.3142, -8.58207, 0.157016, 1.73214, 16.4205, 16.2635 + 298.15, 1.01325, 0.391447, 1.87435, -10.3142, -8.1587, 0.195394, 2.15551, 16.5003, 16.3049 + 323.15, 1.01325, 0.410293, 2.37352, -10.3142, -7.58465, 0.247431, 2.72956, 16.6872, 16.4398 + 348.15, 1.01325, 0.433273, 3.06983, -10.3142, -6.78389, 0.320018, 3.53032, 16.9618, 16.6418 + 373.15, 1.01418, 0.460559, 4.05167, -10.3142, -5.65477, 0.422371, 4.65945, 17.3246, 16.9022 + 398.15, 2.32238, 0.492454, 5.4513, -10.3142, -4.04518, 0.568278, 6.26903, 17.7872, 17.2189 + 423.15, 4.76165, 0.529514, 7.48096, -10.3142, -1.71106, 0.779862, 8.60316, 18.3759, 17.596 + 448.15, 8.92602, 0.572549, 10.4889, -10.3142, 1.74806, 1.09343, 12.0623, 19.1351, 18.0417 + 473.15, 15.5493, 0.622769, 15.0764, -10.3142, 7.02378, 1.57166, 17.338, 20.1415, 18.5698 + 498.15, 25.4972, 0.682036, 22.3389, -10.3142, 15.3757, 2.32875, 25.6899, 21.531, 19.2022 + 523.15, 39.7617, 0.753389, 34.4316, -10.3142, 29.2824, 3.58936, 39.5966, 23.5634, 19.974 + 548.15, 59.4639, 0.842213, 56.0339, -10.3142, 54.1252, 5.84132, 64.4394, 26.7856, 20.9443 + 573.15, 85.879, 0.959258, 98.8138, -10.3142, 103.322, 10.301, 113.637, 32.5242, 22.2232 + 598.15, 120.51, 1.13023, 198.467, -10.3142, 217.925, 20.6895, 228.239, 44.7424, 24.053 + 623.15, 165.294, 1.43872, 494.888, -10.3142, 558.811, 51.5903, 569.125, 78.7661, 27.1758 + 323.15, 1.01325, 0.410293, 2.37352, -10.3142, -7.58465, 0.247431, 2.72956, 16.6872, 16.4398 +Breakdown of Volume Calculation at 323.15 K, 1atm: + Species MoleFrac Molal V0 partV (partV - V0) + H2O(L) 0.818703 0 18.2334 18.1515 -0.0819526 + Na+ 0.0906484 6.146 8.34 10.0749 1.73486 + Cl- 0.0906484 6.146 8.34 10.0749 1.73486 + NaCl(s) 1 26.9942 26.9942 0 diff --git a/test_problems/cathermo/HMW_graph_VvT/runtest b/test_problems/cathermo/HMW_graph_VvT/runtest new file mode 100755 index 000000000..7d2c4b3a2 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/runtest @@ -0,0 +1,42 @@ +#!/bin/sh +# +# +temp_success="1" +/bin/rm -f output.txt outputa.txt + +########################################################################## +prog=HMW_graph_VvT +if test ! -x $prog ; then + echo $prog ' does not exist' + exit -1 +fi +########################################################################## +/bin/rm -f test.out test.diff output.txt + +################################################################# +# +CANTERA_DATA=${CANTERA_DATA:=../../../data/inputs}; export CANTERA_DATA +CANTERA_BIN=${CANTERA_BIN:=../../../bin} + +################################################################# + +$prog HMW_NaCl_sp1977_alt.xml > output.txt +retnStat=$? +if [ $retnStat != "0" ] +then + temp_success="0" + echo "$prog returned with bad status, $retnStat, check output" +fi + +$CANTERA_BIN/exp3to2.sh output.txt > outputa.txt +diff -w outputa.txt output_blessed.txt > diff_test.out +retnStat=$? +if [ $retnStat = "0" ] +then + echo "successful diff comparison on $prog test" +else + echo "unsuccessful diff comparison on $prog test" + echo "FAILED" > csvCode.txt + temp_success="0" +fi + diff --git a/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.cpp b/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.cpp new file mode 100644 index 000000000..d97e51b40 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.cpp @@ -0,0 +1,54 @@ +/* + * @file sortAlgorithms.h + * + * $Author$ + * $Revision$ + * $Date$ + */ +/* + * Copywrite 2004 Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * See file License.txt for licensing information. + */ + +#include "sortAlgorithms.h" + +/**************************************************************/ + +void sort_dbl_1(double * const x, const int n) { + double rra; + int ll = n/2; + int iret = n - 1; + while (1 > 0) { + if (ll > 0) { + ll--; + rra = x[ll]; + } else { + rra = x[iret]; + x[iret] = x[0]; + iret--; + if (iret == 0) { + x[0] = rra; + return; + } + } + int i = ll; + int j = ll + ll + 1; + while (j <= iret) { + if (j < iret) { + if (x[j] < x[j+1]) + j++; + } + if (rra < x[j]) { + x[i] = x[j]; + i = j; + j = j + j + 1; + } else { + j = iret + 1; + } + } + x[i] = rra; + } +} +/*****************************************************/ diff --git a/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.h b/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.h new file mode 100644 index 000000000..72a7fc2a2 --- /dev/null +++ b/test_problems/cathermo/HMW_graph_VvT/sortAlgorithms.h @@ -0,0 +1,21 @@ +/* + * @file sortAlgorithms.h + * + * $Author$ + * $Revision$ + * $Date$ + */ +/* + * Copywrite 2004 Sandia Corporation. Under the terms of Contract + * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government + * retains certain rights in this software. + * See file License.txt for licensing information. + */ + +#ifndef SORTALGORITHMS_H +#define SORTALGORITHMS_H + + +void sort_dbl_1(double * const x, const int n); + +#endif