*** empty log message ***

This commit is contained in:
Dave Goodwin
2004-12-13 18:42:32 +00:00
parent 02074161dc
commit 92c9d54cdb
11 changed files with 251 additions and 245 deletions

View File

@@ -6,6 +6,7 @@
#define DLL_IMPORT __declspec(dllimport)
#define DLL_EXPORT __declspec(dllexport)
#pragma warning(disable:4786)
#pragma warning(disable:4267)
#pragma warning(disable:4503)
#else
#define DLL_EXPORT

View File

@@ -978,7 +978,7 @@ extern "C" {
int DLL_EXPORT showCanteraErrors() {
showErrors();
return 0;
return 0;
}
int DLL_EXPORT addCanteraDirectory(int buflen, char* buf) {

View File

@@ -1,214 +1,219 @@
//
#ifdef WIN32
#pragma warning(disable:4786)
/*Warning messages that are identified as Warning C4786: are created
when MSVC generates extremely long names that it uses for debugging
purposes. The long names are generated by the template expansion
process and the warning messages normally can be ignored. Since these
warnings tend to hide more interesting warning/error messages, you may
wish to suppress the warning*/
when MSVC generates extremely long names that it uses for debugging
purposes. The long names are generated by the template expansion
process and the warning messages normally can be ignored. Since these
warnings tend to hide more interesting warning/error messages, you may
wish to suppress the warning*/
// precompiled headers
#include "stdafx.h"
#endif
#include <cantera/Cantera.h>
#include <cantera/IdealGasMix.h>
#include <cantera/transport.h>
#include <cantera/equilibrium.h>
#include <cantera/onedim.h>
// include additional header files here if needed
#ifdef WIN32
#include <conio.h>
#endif
void demo() {
try {
int i;
IdealGasMix gas("gri30.cti","gri30_mix");
doublereal temp = 300.0; // K
doublereal pressure = 1.0*OneAtm; //atm
doublereal uin=0.3; //m/sec
gas.setState_TPX(temp, pressure, "CH4:1.0, O2:2.0, N2:7.52");
int nsp = gas.nSpecies();
vector_fp x;
x.resize(nsp);
doublereal phi=1.1;
cout << "Enter phi: ";
cin >> phi;
cout << endl;
doublereal C_atoms=1.0;
doublereal H_atoms=4.0;
doublereal ax=C_atoms+H_atoms/4.0;
doublereal fa_stoic=1.0/(4.76*ax);
for(int k=0;k<nsp;k++){
if(k==gas.speciesIndex("CH4")){ x[k]=1.0; }
else if(k==gas.speciesIndex("O2")){ x[k]=0.21/phi/fa_stoic; }
else if(k==gas.speciesIndex("N2")){ x[k]=0.79/phi/fa_stoic; }
else{ x[k]=0.0; }
}
gas.setState_TPX(temp,pressure,x.begin());
doublereal rho_in=gas.density();
double *yin=new double[nsp];
gas.getMassFractions(yin);
int main(int argc, char** argv) {
try {
int i;
// your code goes here
IdealGasMix gas("gri30.cti","gri30_mix");
//IdealGasMix gas("temp_phi_1.0_sp.cti","gas");
doublereal temp = 300.0; // K
doublereal pressure = 1.0*OneAtm; //atm
doublereal uin=0.3; //m/sec
gas.setState_TPX(temp, pressure, "CH4:1.0, O2:2.0, N2:7.52");
int nsp = gas.nSpecies();
vector_fp x;
x.resize(nsp);
doublereal phi=1.1;
cout << "Enter phi: ";
cin >> phi;
cout << endl;
doublereal C_atoms=1.0;
doublereal H_atoms=4.0;
doublereal ax=C_atoms+H_atoms/4.0;
doublereal fa_stoic=1.0/(4.76*ax);
for(int k=0;k<nsp;k++){
if(k==gas.speciesIndex("CH4")){ x[k]=1.0; }
else if(k==gas.speciesIndex("O2")){ x[k]=0.21/phi/fa_stoic; }
else if(k==gas.speciesIndex("N2")){ x[k]=0.79/phi/fa_stoic; }
else{ x[k]=0.0;
}
}
gas.setState_TPX(temp,pressure,x.begin());
doublereal rho_in=gas.density();
//vector<doublereal> yin;
double *yin=new double[nsp];
gas.getMassFractions(yin);
try {
equilibrate(gas,HP);
}
catch (CanteraError) {
showErrors(cout);
}
double *yout=new double[nsp];
gas.getMassFractions(yout);
doublereal rho_out = gas.density();
doublereal Tad=gas.temperature();
cout << phi<<' '<<Tad<<endl;
double Tin=temp;
double Tout=Tad;
double breakpt=0.2;
//============= build each domain ========================
//-------- step 1: create the stagnation flow -------------
AxiStagnFlow flow(&gas);
// create an initial grid
//doublereal z[] = {0.0, 0.001, 0.002, 0.003, 0.004, 0.005, 0.006, 0.007, 0.008, 0.009,0.0095, 0.01};
int nz=5;
doublereal lz=0.02;
doublereal *z=new double[nz+1];
doublereal dz=lz/((doublereal)(nz-1));
for(int iz=0;iz<nz;iz++){
z[iz]=((doublereal)iz)*dz;
}
//add one node onto end of domain to help with zero gradient at outlet
z[nz]=lz*1.05;
nz++;
flow.setupGrid(nz, z);
// specify the objects to use to compute kinetic rates and
// transport properties
Transport* tr = newTransportMgr("Mix", &gas);
flow.setTransport(*tr);
flow.setKinetics(gas);
flow.setPressure(pressure);
//------- step 2: create the inlet -----------------------
Inlet1D inlet;
inlet.setMoleFractions(x.begin());
doublereal mdot=uin*rho_in;
inlet.setMdot(mdot);
inlet.setTemperature(temp);
//------- step 3: create the outlet ---------------------
Outlet1D outlet;
//=================== create the container and insert the domains =====
vector<Domain1D*> domains;
domains.push_back(&inlet);
domains.push_back(&flow);
domains.push_back(&outlet);
OneDim flamesim(domains);
Sim1D flame(domains);
//----------- Supply initial guess----------------------
vector_fp locs;
vector_fp value;
locs.resize(3);
value.resize(3);
//ramp values from inlet to adiabatic flame conditions
// over 70% of domain and then level off at equilibrium
double z1=0.7;
double uout;
uout=inlet.mdot()/rho_out;
uin=inlet.mdot()/rho_in;
locs[0]=0.0; locs[1]=z1; locs[2]=1.0;
value[0]=uin; value[1]=uout; value[2]=uout;
flame.setInitialGuess("u",locs,value);
value[0]=temp; value[1]=Tad; value[2]=Tad;
flame.setInitialGuess("T",locs,value);
for(i=0;i<nsp;i++){
value[0]=yin[i]; value[1]=yout[i]; value[2]=yout[i];
flame.setInitialGuess(gas.speciesName(i),locs,value);
}
inlet.setMoleFractions(x.begin());
inlet.setMdot(mdot);
inlet.setTemperature(temp);
flame.showSolution();
int flowdomain=1;
double ratio=10.0;
double slope=0.2;
double curve=0.02;
double prune=-0.00005;
flame.setRefineCriteria(flowdomain,ratio,slope,curve,prune);
int loglevel=1;
bool refine_grid = true;
/* Solve species*/
flow.fixTemperature();
refine_grid=false;
flame.solve(loglevel,refine_grid);
/* Solve freely propagating flame*/
/* Linearally interpolate to find location where this temperature would exist
temperature at this location will then be fixed for remainder of calculation.*/
flow.solveEnergyEqn();
refine_grid=true;
flame.setFixedTemperature(900.0);
flame.setAdiabaticFlame();
flame.solve(loglevel=1,refine_grid);
int np=flow.nPoints();
vector<doublereal> zvec,Tvec,COvec,CO2vec,Uvec;
printf("\n%9s\t%8s\t%5s\t%7s\n","z (m)", "T (K)", "U (m/s)", "Y(CO)");
for(int n=0;n<np;n++){
Tvec.push_back(flame.value(flowdomain,flow.componentIndex("T"),n));
COvec.push_back(flame.value(flowdomain,flow.componentIndex("CO"),n));
CO2vec.push_back(flame.value(flowdomain,flow.componentIndex("CO2"),n));
Uvec.push_back(flame.value(flowdomain,flow.componentIndex("u"),n));
zvec.push_back(flow.grid(n));
printf("%9.6f\t%8.3f\t%5.3f\t%7.5f\n",flow.grid(n),Tvec[n],Uvec[n],COvec[n]);
}
cout << endl<<"Adiabatic flame temperature from equilibrium is: "<<Tad<<endl;
cout << "Flame speed for phi="<<phi<<" is "<<Uvec[0]<<" m/s."<<endl;
return 0;
equilibrate(gas,HP);
}
catch (CanteraError) {
showErrors(cerr);
cerr << "program terminating." << endl;
return -1;
showErrors(cout);
}
double *yout=new double[nsp];
gas.getMassFractions(yout);
doublereal rho_out = gas.density();
doublereal Tad=gas.temperature();
cout << phi<<' '<<Tad<<endl;
double Tin=temp;
double Tout=Tad;
double breakpt=0.2;
//============= build each domain ========================
//-------- step 1: create the flow -------------
AxiStagnFlow flow(&gas);
// create an initial grid
int nz=5;
doublereal lz=0.02;
doublereal *z=new double[nz+1];
doublereal dz=lz/((doublereal)(nz-1));
for(int iz=0;iz<nz;iz++){
z[iz]=((doublereal)iz)*dz;
}
//add one node onto end of domain to help with zero gradient at outlet
z[nz]=lz*1.05;
nz++;
flow.setupGrid(nz, z);
// specify the objects to use to compute kinetic rates and
// transport properties
Transport* tr = newTransportMgr("Mix", &gas);
flow.setTransport(*tr);
flow.setKinetics(gas);
flow.setPressure(pressure);
//------- step 2: create the inlet -----------------------
Inlet1D inlet;
inlet.setMoleFractions(x.begin());
doublereal mdot=uin*rho_in;
inlet.setMdot(mdot);
inlet.setTemperature(temp);
//------- step 3: create the outlet ---------------------
Outlet1D outlet;
//=================== create the container and insert the domains =====
vector<Domain1D*> domains;
domains.push_back(&inlet);
domains.push_back(&flow);
domains.push_back(&outlet);
OneDim flamesim(domains);
Sim1D flame(domains);
//----------- Supply initial guess----------------------
vector_fp locs;
vector_fp value;
locs.resize(3);
value.resize(3);
//ramp values from inlet to adiabatic flame conditions
// over 70% of domain and then level off at equilibrium
double z1=0.7;
double uout;
uout=inlet.mdot()/rho_out;
uin=inlet.mdot()/rho_in;
locs[0]=0.0; locs[1]=z1; locs[2]=1.0;
value[0]=uin; value[1]=uout; value[2]=uout;
flame.setInitialGuess("u",locs,value);
value[0]=temp; value[1]=Tad; value[2]=Tad;
flame.setInitialGuess("T",locs,value);
for(i=0;i<nsp;i++){
value[0]=yin[i]; value[1]=yout[i]; value[2]=yout[i];
flame.setInitialGuess(gas.speciesName(i),locs,value);
}
inlet.setMoleFractions(x.begin());
inlet.setMdot(mdot);
inlet.setTemperature(temp);
flame.showSolution();
int flowdomain=1;
double ratio=10.0;
double slope=0.2;
double curve=0.02;
double prune=-0.00005;
flame.setRefineCriteria(flowdomain,ratio,slope,curve,prune);
int loglevel=1;
bool refine_grid = true;
/* Solve species*/
flow.fixTemperature();
refine_grid=false;
flame.solve(loglevel,refine_grid);
/* Solve freely propagating flame*/
/* Linearally interpolate to find location where this
temperature would exist. The temperature at this
location will then be fixed for remainder of
calculation.*/
flow.solveEnergyEqn();
refine_grid=true;
flame.setFixedTemperature(900.0);
flame.setAdiabaticFlame();
flame.solve(loglevel=1,refine_grid);
int np=flow.nPoints();
vector<doublereal> zvec,Tvec,COvec,CO2vec,Uvec;
printf("\n%9s\t%8s\t%5s\t%7s\n","z (m)", "T (K)", "U (m/s)", "Y(CO)");
for(int n=0;n<np;n++){
Tvec.push_back(flame.value(flowdomain,flow.componentIndex("T"),n));
COvec.push_back(flame.value(flowdomain,flow.componentIndex("CO"),n));
CO2vec.push_back(flame.value(flowdomain,flow.componentIndex("CO2"),n));
Uvec.push_back(flame.value(flowdomain,flow.componentIndex("u"),n));
zvec.push_back(flow.grid(n));
printf("%9.6f\t%8.3f\t%5.3f\t%7.5f\n",flow.grid(n),Tvec[n],Uvec[n],COvec[n]);
}
cout << endl<<"Adiabatic flame temperature from equilibrium is: "<<Tad<<endl;
cout << "Flame speed for phi="<<phi<<" is "<<Uvec[0]<<" m/s."<<endl;
// return 0;
}
catch (CanteraError) {
showErrors(cerr);
cerr << "program terminating." << endl;
//return -1;
}
}
#ifdef WIN32
int _tmain(int argc, _TCHAR* argv[])
{
return demo();
}
#else
int main() {
return demo();
#endif

View File

@@ -5,8 +5,10 @@ mex -I../../../build/include private/ctmethods.cpp ...
private/xmlmethods.cpp private/phasemethods.cpp ...
private/thermomethods.cpp private/kineticsmethods.cpp ...
private/transportmethods.cpp private/reactormethods.cpp ...
private/reactornetmethods.cpp ...
private/wallmethods.cpp private/flowdevicemethods.cpp ...
private/onedimmethods.cpp private/surfmethods.cpp private/write.cpp ...
private/funcmethods.cpp ...
private/onedimmethods.cpp private/surfmethods.cpp ...
../../../build/lib/i686-pc-win32/clib.lib ...
../../../build/lib/i686-pc-win32/oneD.lib ...
../../../build/lib/i686-pc-win32/zeroD.lib ...
@@ -17,8 +19,6 @@ mex -I../../../build/include private/ctmethods.cpp ...
../../../build/lib/i686-pc-win32/ctlapack.lib ...
../../../build/lib/i686-pc-win32/ctmath.lib ...
../../../build/lib/i686-pc-win32/ctblas.lib ...
../../../build/lib/i686-pc-win32/tpx.lib ...
../../../build/lib/i686-pc-win32/dformd.lib ...
../../../build/lib/i686-pc-win32/dfconsol.lib ...
../../../build/lib/i686-pc-win32/dfport.lib
../../../build/lib/i686-pc-win32/tpx.lib
disp('done.');
exit;

View File

@@ -1,6 +1,6 @@
from distutils.core import setup, Extension
libdir = ['C:/cygwin/home/Dave/dv/sf/cantera/build/lib/i686-pc-win32']
libdir = ['../../build/lib/i686-pc-win32']
setup(name="Cantera",
version="1.5.4",

View File

@@ -3,7 +3,7 @@
* Implementation file for class Constituents
*/
/* $Author$
/* $Author$
* $Date$
* $Revision$
*

View File

@@ -169,7 +169,7 @@ namespace Cantera {
/// Return a const reference to phase n.
//const phase_t& phase(index_t n) const {
// if (!m_init) init();
// if (!m_init) init();
// m_phase[n]->setState_TPX(m_temp,
// m_press, m_moleFractions.begin() + m_spstart[n]);
// return *m_phase[n];

View File

@@ -463,7 +463,7 @@ namespace Cantera {
* a power law expression involving the species vector.
*/
void add(int rxn, const vector_int& k, const vector_fp& order) {
m_n[rxn] = k.size();
m_n[rxn] = static_cast<int>(k.size());
switch (k.size()) {
case 1:
m_loc[rxn] = static_cast<int>(m_c1_list.size());

View File

@@ -35,6 +35,7 @@ using namespace ct;
#ifdef WIN32
#define TYPENAME_KEYWORD
#pragma warning(disable:4267)
#else
#define TYPENAME_KEYWORD typename
#endif

View File

@@ -15,6 +15,7 @@
#ifdef WIN32
#pragma warning(disable:4786)
#pragma warning(disable:4503)
#pragma warning(disable:4267)
#endif
#include <stdlib.h>

View File

@@ -1,33 +1,31 @@
{\rtf1\mac\ansicpg10000\cocoartf102
{\fonttbl\f0\froman\fcharset77 TimesNewRomanPSMT;\f1\ftech\fcharset2 Symbol;\f2\fmodern\fcharset77 CourierNewPSMT;
}
{\colortbl;\red255\green255\blue255;}
\margl1318\margr1318\vieww11740\viewh9860\viewkind1\viewscale100
\deftab720
\pard\pardeftab720\ri2340\sb100\sa100\qj
\f0\fs26 \cf0 \
\pard\pardeftab720\ri2340\sb100\sa100\ql\qnatural
\cf0 Copyright (c) 2001-2004, California Institute of Technology\uc0\u8232 All rights reserved.\
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\
\pard\pardeftab720\ri2340\ql\qnatural
\f1\fs22 \cf0 \
\'b7
\f0\fs26 Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. \
\f1\fs22 \
\'b7
\f0\fs26 Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. \
\f1\fs22 \
\'b7
\f0\fs26 Neither the name of the California Institute of Technology nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. \
\pard\pardeftab720\ri2340\sb100\sa100\ql\qnatural
\cf0 \
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\
\pard\pardeftab720\ri2340\ql\qnatural
\f2\fs22 \cf0 \
\
}
{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f90\froman\fcharset238\fprq2 Times New Roman CE;}
{\f91\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f93\froman\fcharset161\fprq2 Times New Roman Greek;}{\f94\froman\fcharset162\fprq2 Times New Roman Tur;}{\f95\froman\fcharset177\fprq2 Times New Roman (Hebrew);}
{\f96\froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f97\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f98\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 \snext0 Normal;}{\*\cs10 \additive \ssemihidden
Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv
\ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\rsidtbl \rsid602915\rsid8664322}
{\*\generator Microsoft Word 11.0.5604;}{\info{\title Copyright (c) 2001-2004, California Institute of Technology}{\author Dave Goodwin}{\operator Dave Goodwin}{\creatim\yr2004\mo12\dy12\hr16\min15}{\revtim\yr2004\mo12\dy12\hr16\min15}{\version2}
{\edmins3}{\nofpages1}{\nofwords228}{\nofchars1300}{\*\company Caltech}{\nofcharsws1525}{\vern24689}}\margl1318\margr1318 \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\horzdoc\dghspace120\dgvspace120
\dghorigin1701\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot8664322 \fet0\sectd \linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
{\pntxtb (}{\pntxta )}}\pard\plain \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid602915 \fs24\lang1033\langfe1033\cgrid\langnp1033\langfenp1033 {\insrsid8664322\charrsid602915
\par }{\insrsid2033138\charrsid602915 Copyright (c) 2001-2004, California Institute of Technology}{\insrsid602915 . }{\insrsid2033138\charrsid602915 All rights reserved.}{\insrsid2033138
\par }{\insrsid602915\charrsid602915
\par }{\insrsid2033138\charrsid602915 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
\par
\par \u-4064\'3fRedistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
\par
\par Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
\par
\par \u-4064\'3fNeither the name of the California Institute of Technology nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
\par
\par THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, D
A
TA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBIL
ITY OF SUCH DAMAGE.
\par
\par
\par }}