diff --git a/test_problems/rankine_democxx/.cvsignore b/test_problems/rankine_democxx/.cvsignore new file mode 100644 index 000000000..39563ceb4 --- /dev/null +++ b/test_problems/rankine_democxx/.cvsignore @@ -0,0 +1,10 @@ +.depends +Makefile +csvCode.txt +ct2ctml.log +diff_test.out +liquidvapor.xml +output.txt +rankine +rankine.d + diff --git a/test_problems/rankine_democxx/Makefile.in b/test_problems/rankine_democxx/Makefile.in new file mode 100644 index 000000000..87c6165c7 --- /dev/null +++ b/test_problems/rankine_democxx/Makefile.in @@ -0,0 +1,126 @@ +#!/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 = rankine + +# The object files to be linked together. +OBJS = rankine.o + +# additional flags to be passed to the linker. If your program +# requires other external libraries, put them here +LINK_OPTIONS = @EXTRA_LINK@ + +# This variable determines whether we are making this example in the +# build tree environment or in the install tree environment. +in_CanteraBuildTree = 1 + +############################################################################# + +# 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@ + +# the directory where Cantera include files may be found. +ifeq ($(in_CanteraBuildTree),1) +CANTERA_INCROOTDIR=@ctroot@/build/include +else +CANTERA_INCROOTDIR=@ct_incroot@ +endif +CANTERA_INCLUDES=-I$(CANTERA_INCROOTDIR) -I$(CANTERA_INCROOTDIR)/cantera + +# LOCAL_DEFS = -DDEBUG_CHEMEQUIL +# LOCAL_DEFS = -DEBUG_BASISOPTIMIZE +# +# C++ compile flags +CXX_FLAGS = @CXXFLAGS@ $(CANTERA_INCLUDES) $(LOCAL_DEFS) + +# Ending C++ linking libraries +LCXX_END_LIBS = @LCXX_END_LIBS@ + +# the directory where the Cantera libraries are located +ifeq ($(in_CanteraBuildTree),1) +CANTERA_LIBDIR=@buildlib@ +else +CANTERA_LIBDIR=@ct_libdir@ +endif + +# required Cantera libraries +CANTERA_LIBS = -L$(CANTERA_LIBDIR) @LOCAL_LIBS@ -lctcxx + +ifeq ($(in_CanteraBuildTree),1) +CANTERA_LIBS_DEP = @LOCAL_LIBS_DEP@ $(CANTERA_LIBDIR)/libctcxx.a +else +CANTERA_LIBS_DEP = @INSTALL_LIBS_DEP@ $(CANTERA_LIBDIR)/libctcxx.a +endif +# +# Alternate form of dependencies: (uses a gnu make extensions) +ALT_LIBS_DEP := $(addprefix $(CANTER_LIBDIR), @RAW_LIBS_DEP@ libctcxx.a) + +# flags passed to the C++ compiler/linker for the linking step +LCXX_FLAGS = @CXXFLAGS@ + +# How to compile C++ source files to object files +.cpp.o: + $(CXX) -c $< -I$(CANTERA_INCDIR) $(CXX_FLAGS) + +# How to compile the dependency file +.cpp.d: + @CXX_DEPENDS@ -I$(CANTERA_INCDIR) $(CXX_FLAGS) $*.cpp > $*.d + +# List of dependency files to be created +DEPENDS=$(OBJS:.o=.d) + +# Program Name +PROGRAM = $(PROG_NAME)$(EXE_EXT) + +all: $(PROGRAM) + +$(PROGRAM): $(OBJS) $(CANTERA_LIBS_DEP) + $(CXX) -o $(PROGRAM) $(OBJS) $(LCXX_FLAGS) $(LINK_OPTIONS) \ + $(CANTERA_LIBS) @LIBS@ $(FORT_LIBS) \ + $(LCXX_END_LIBS) + +# +# depends target -> forces recalculation of dependencies +depends: + $(RM) *.d .depends + @MAKE@ .depends + +.depends: $(DEPENDS) + cat *.d > .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@ -s $(PROGRAM) +endif + @ ./runtest + +clean: + $(RM) $(OBJS) $(PROGRAM) $(DEPENDS) .depends + ../../bin/rm_cvsignore + (if test -d SunWS_cache ; then \ + $(RM) -rf SunWS_cache ; \ + fi ) + +ifeq ($(wildcard .depends), .depends) +include .depends +endif diff --git a/test_problems/rankine_democxx/output_blessed.txt b/test_problems/rankine_democxx/output_blessed.txt new file mode 100644 index 000000000..1aec97b1a --- /dev/null +++ b/test_problems/rankine_democxx/output_blessed.txt @@ -0,0 +1,7 @@ + 1 300 101325 -1.58581e+07 3913.25 0 + 2s 300.014 800000 -1.58574e+07 3913.25 0 + 2 300.126 800000 -1.58569e+07 3914.81 0 + 3 443.624 800000 -1.32016e+07 10183 1 + 4s 373.177 101325 -1.3553e+07 10183 0.89 + 4 373.177 101325 -1.34827e+07 10371.4 0.92 +efficiency = 0.105873 diff --git a/test_problems/rankine_democxx/rankine.cpp b/test_problems/rankine_democxx/rankine.cpp new file mode 100644 index 000000000..91f2f059d --- /dev/null +++ b/test_problems/rankine_democxx/rankine.cpp @@ -0,0 +1,100 @@ +// An open Rankine cycle + +#include +#include + +#include +#include // defines class Water + +using namespace Cantera; +using namespace std; + +map h; +map s; +map T; +map P; +map x; +vector states; + +template +void saveState(F& fluid, string name) { + h[name] = fluid.enthalpy_mass(); + s[name] = fluid.entropy_mass(); + T[name] = fluid.temperature(); + P[name] = fluid.pressure(); + x[name] = fluid.vaporFraction(); + states.push_back(name); +} + +void printStates() { + string name; + int n; + int nStates = states.size(); + for (n = 0; n < nStates; n++) { + name = states[n]; + printf(" %5s %10.6g %10.6g %12.6g %12.6g %5.2g \n", + name.c_str(), T[name], P[name], h[name], s[name], x[name]); + } +} + +int openRankine(int np, void* p) { + + double etap = 0.6; // pump isentropic efficiency + double etat = 0.8; // turbine isentropic efficiency + double phigh = 8.0e5; // high pressure + + Water w; + + // begin with water at 300 K, 1 atm + w.setState_TP(300.0, OneAtm); + saveState(w,"1"); + + // pump water to 0.8 MPa + w.setState_SP(s["1"], phigh); + saveState(w,"2s"); + double h2 = (h["2s"] - h["1"])/etap + h["1"]; + w.setState_HP(h2, phigh); + saveState(w,"2"); + + // heat to saturated vapor + w.setState_Psat(phigh, 1.0); + saveState(w,"3"); + + // expand to 1 atm + w.setState_SP(s["3"], OneAtm); + saveState(w,"4s"); + double work_s = h["3"] - h["4s"]; + double work = etat*work_s; + w.setState_HP(h["3"] - work, OneAtm); + saveState(w,"4"); + + printStates(); + + double heat_in = h["3"] - h["2"]; + double efficiency = work/heat_in; + + cout << "efficiency = " << efficiency << endl; +#ifdef WIN32 +#ifndef CXX_DEMO + cout << "press any key to end" << endl; + char ch; + cin >> ch; +#endif +#endif + return 0; +} + + +#ifndef CXX_DEMO +int main() { + + try { + return openRankine(0, 0); + } + catch (CanteraError) { + showErrors(cout); + return -1; + } +} +#endif + diff --git a/test_problems/rankine_democxx/runtest b/test_problems/rankine_democxx/runtest new file mode 100755 index 000000000..550f8159a --- /dev/null +++ b/test_problems/rankine_democxx/runtest @@ -0,0 +1,32 @@ +#!/bin/sh +# +# +temp_success="1" +/bin/rm -f output.txt outputa.txt +testName="rankine" + +################################################################# +# +################################################################# +CANTERA_DATA=${CANTERA_DATA:=../../data/inputs}; export CANTERA_DATA + +CANTERA_BIN=${CANTERA_BIN:=../../bin} +./rankine > output.txt +retnStat=$? +if [ $retnStat != "0" ] +then + temp_success="0" + echo "$testName returned with bad status, $retnStat, check output" +fi + +diff -w output.txt output_blessed.txt > diff_test.out +retnStat=$? +if [ $retnStat = "0" ] +then + echo "successful diff comparison on $testName test" +else + echo "unsuccessful diff comparison on $testName test" + echo "FAILED" > csvCode.txt + temp_success="0" +fi +