Merged changes from Revision_1.8 into the main trunk

This commit is contained in:
Harry Moffat 2009-09-26 01:53:39 +00:00
commit 95c685dbe7
10 changed files with 227 additions and 56 deletions

View file

@ -38,14 +38,27 @@ namespace Cantera {
public:
//! Type definition for the iterator class that is
//! can be used by Array2D types.
/*!
* this is just equal to vector_fp iterator.
*/
typedef vector_fp::iterator iterator;
//! Type definition for the const_iterator class that is
//! can be used by Array2D types.
/*!
* this is just equal to vector_fp const_iterator.
*/
typedef vector_fp::const_iterator const_iterator;
/**
* Default constructor. Create an empty array.
*/
Array2D() : m_nrows(0), m_ncols(0) { m_data.clear(); }
Array2D() : m_nrows(0), m_ncols(0) {
m_data.clear();
}
//! Constructor.
/*!
@ -86,7 +99,7 @@ namespace Cantera {
return *this;
}
//! resize the array, and fill the new entries with 'v'
//! Resize the array, and fill the new entries with 'v'
/*!
* @param n This is the number of rows
* @param m This is the number of columns in the new matrix
@ -98,7 +111,14 @@ namespace Cantera {
m_data.resize(n*m, v);
}
/// append a column
//! Append a column to the existing matrix using a std vector
/*!
* This operation will add a column onto the existing matrix.
*
* @param c This vector<doublereal> is the entries in the
* column to be added. It must have a length
* equal to m_nrows or greater.
*/
void appendColumn(const vector_fp& c) {
m_ncols++;
m_data.resize(m_nrows*m_ncols);
@ -106,37 +126,66 @@ namespace Cantera {
for (m = 0; m < m_nrows; m++) value(m_ncols, m) = c[m];
}
/// append a column
void appendColumn(doublereal* c) {
//! Append a column to the existing matrix
/*!
* This operation will add a column onto the existing matrix.
*
* @param c This vector of doubles is the entries in the
* column to be added. It must have a length
* equal to m_nrows or greater.
*/
void appendColumn(const doublereal* const c) {
m_ncols++;
m_data.resize(m_nrows*m_ncols);
int m;
for (m = 0; m < m_nrows; m++) value(m_ncols, m) = c[m];
}
/// set the nth row to array rw
void setRow(int n, doublereal* rw) {
//! Set the nth row to array rw
/*!
* @param n Index of the row to be changed
* @param rw Vector for the row. Must have a length of m_ncols.
*/
void setRow(int n, const doublereal* const rw) {
for (int j = 0; j < m_ncols; j++) {
m_data[m_nrows*j + n] = rw[j];
}
}
/// get the nth row
void getRow(int n, doublereal* rw) {
//! Get the nth row and return it in a vector
/*!
* @param n Index of the row to be returned.
* @param rw Return Vector for the operation.
* Must have a length of m_ncols.
*/
void getRow(int n, doublereal* const rw) {
for (int j = 0; j < m_ncols; j++) {
rw[j] = m_data[m_nrows*j + n];
}
}
/// set the values in column m to those in array col
void setColumn(int m, doublereal* col) {
//! Set the values in column m to those in array col
/*!
* A(i,m) = col(i)
*
* @param m Column to set
* @param col pointer to a col vector. Vector
* must have a length of m_nrows.
*/
void setColumn(int m, doublereal* const col) {
for (int i = 0; i < m_nrows; i++) {
m_data[m_nrows*m + i] = col[i];
}
}
/// get the values in column m
void getColumn(int m, doublereal* col) {
//! Get the values in column m
/*!
* col(i) = A(i,m)
*
* @param m Column to set
* @param col pointer to a col vector that will be returned
*/
void getColumn(int m, doublereal* const col) {
for (int i = 0; i < m_nrows; i++) {
col[i] = m_data[m_nrows*m + i];
}
@ -147,10 +196,18 @@ namespace Cantera {
* heap.
*/
virtual ~Array2D(){}
/**
* Evaluate a*x + y.
//! Evaluate z = a*x + y.
/*!
* This function evaluates the AXPY operation, and stores
* the result in the object's Array2D object.
* It's assumed that all 3 objects have the same dimensions,
* but no error checking is done.
*
* @param a scalar to multiply x with
* @param x First Array2D object to be used
* @param y Second Array2D object to be used
*
*/
void axpy(doublereal a, const Array2D& x, const Array2D& y) {
iterator b = begin();
@ -169,20 +226,43 @@ namespace Cantera {
*/
doublereal& operator()( int i, int j) { return value(i,j); }
/**
* Allows retrieving elements using the syntax x = A(i,j).
//! Allows retrieving elements using the syntax x = A(i,j).
/*!
* @param i Index for the row to be retrieved
* @param j Index for the column to be retrieved.
*
* @return Returns the value of the matrix entry
*/
doublereal operator() ( int i, int j) const {return value(i,j);}
doublereal operator() (int i, int j) const {
return value(i,j);
}
//! Returns a changeable reference to position in the matrix
/*!
* This is a key entry. Returns a reference to the matrixes (i,j)
* element. This may be used as an L value.
*
* @param i The row index
* @param j The column index
*
* @return Returns a changeable reference to the matrix entry
*/
doublereal& value(int i, int j) {
return m_data[m_nrows*j + i];
}
//! Returns the value of a single matrix entry
/*!
* This is a key entry. Returns the value of the matrix position (i,j)
* element.
*
* @param i The row index
* @param j The column index
*/
doublereal& value( int i, int j) {return m_data[m_nrows*j + i];}
doublereal value( int i, int j) const {return m_data[m_nrows*j + i];}
doublereal value(int i, int j) const {
return m_data[m_nrows*j + i];
}
/// Number of rows
size_t nRows() const { return m_nrows; }
@ -208,10 +288,25 @@ namespace Cantera {
/// Return a const reference to the data vector
const vector_fp& data() const { return m_data; }
/// Return a pointer to the top of column j, columns are contiguous
/// in memory
//! Return a pointer to the top of column j, columns are contiguous
//! in memory
/*!
* @param j Value of the column
*
* @return Returns a pointer to the top of the column
*/
doublereal * ptrColumn(int j) { return &(m_data[m_nrows*j]); }
const doublereal * ptrColumn(int j) const { return &(m_data[m_nrows*j]); }
//! Return a const pointer to the top of column j, columns are contiguous
//! in memory
/*!
* @param j Value of the column
*
* @return Returns a const pointer to the top of the column
*/
const doublereal * ptrColumn(int j) const {
return &(m_data[m_nrows*j]);
}
protected:
@ -225,7 +320,16 @@ namespace Cantera {
int m_ncols;
};
/// output the array
//! Output the current contents of the Array2D object
/*!
* Example of usage:
* s << m << endl;
*
* @param s Reference to the ostream to write to
* @param m Object of type Array2D that you are querying
*
* @return Returns a reference to the ostream.
*/
inline std::ostream& operator<<(std::ostream& s, const Array2D& m) {
int nr = static_cast<int>(m.nRows());
int nc = static_cast<int>(m.nColumns());

View file

@ -1519,10 +1519,6 @@ protected:
app()->writelog(msg);
}
void writelogAM(const std::string& msg) {
app()->writelog(msg);
}
// Write a message to the screen
void Application::Messages::writelog(const std::string& msg) {
logwriter->write(msg);
@ -1532,9 +1528,6 @@ protected:
void writelog(const char* msg) {
app()->writelog(msg);
}
void writelogAM(const char* msg) {
app()->writelog(msg);
}
// Write a message to the screen
void Application::Messages::writelog(const char* pszmsg) {

View file

@ -39,9 +39,13 @@ namespace Cantera {
std::copy(x.begin(), x.begin() + n, y.begin());
}
/**
* Divide each element of x by the corresponding element of y.
//! Divide each element of x by the corresponding element of y.
/*!
* This function replaces x[n] by x[n]/y[n], for 0 <= n < x.size()
*
* @param x Numerator object of the division operation with template type T
* At the end of the calculation, it contains the result.
* @param y Denominator object of the division template type T
*/
template<class T>
inline void divide_each(T& x, const T& y) {
@ -49,9 +53,15 @@ namespace Cantera {
x.begin(), std::divides<TYPENAME_KEYWORD T::value_type>());
}
/**
* multiply each element of x by the corresponding element of y.
//! Multiply each element of x by the corresponding element of y.
/*!
* This function replaces x[n] by x[n]*y[n], for 0 <= n < x.size()
* This is a templated function with just one template type.
*
* @param x First object of the multiplication with template type T
* At the end of the calculation, it contains the result.
* @param y Second object of the multiplication with template type T
*
*/
template<class T>
inline void multiply_each(T& x, const T& y) {
@ -59,32 +69,52 @@ namespace Cantera {
x.begin(), std::multiplies<TYPENAME_KEYWORD T::value_type>());
}
/**
* Multiply each element of x by scale_factor.
//! Multiply each element of x by scale_factor.
/*!
* This function replaces x[n] by x[n]*scale_factor, for 0 <= n < x.size()
*
* @param x First object of the multiplication with template type T
* At the end of the calculation, it contains the result.
* @param scale_factor scale factor with template type S
*/
template<class T, class S>
inline void scale(T& x, S scale_factor) {
scale(x.begin(), x.end(), x.begin(), scale_factor);
}
/**
//! Return the templated dot product of two objects
/*!
* Returns the sum of x[n]*y[n], for 0 <= n < x.size().
*
* @param x First object of the dot product with template type T
* At the end of the calculation, it contains the result.
* @param y Second object of the dot product with template type T
*/
template<class T>
inline doublereal dot_product(const T& x, const T& y) {
return std::inner_product(x.begin(), x.end(), y.begin(), 0.0);
}
//! Returns the templated dot ratio of two objects
/**
* Returns the sum of x[n]/y[n], for 0 <= n < x.size().
*
* @param x First object of the dot product with template type T
* At the end of the calculation, it contains the result.
* @param y Second object of the dot product with template type T
*/
template<class T>
inline doublereal dot_ratio(const T& x, const T& y) {
return _dot_ratio(x.begin(), x.end(), y.begin(), 0.0);
}
//! Returns a templated addition operation of two objects
/**
* Replaces x[n] by x[n] + y[n] for 0 <= n < x.size()
*
* @param x First object of the addition with template type T
* At the end of the calculation, it contains the result.
* @param y Second object of the addition with template type T
*/
template<class T>
inline void add_each(T& x, const T& y) {
@ -119,9 +149,13 @@ namespace Cantera {
return start_value;
}
/**
* Finds the entry in a vector with maximum absolute
* value, and return this value.
//! Finds the entry in a vector with maximum absolute
//! value, and return this value.
/*!
* @param v Vector to be queried for maximum value, with template type T
*
* @return Returns an object of type T that is the maximum value,
*/
template<class T>
inline T absmax(const std::vector<T>& v) {

View file

@ -496,7 +496,8 @@ namespace Cantera {
//! Adds moles of a certain species to the mixture
/*!
*
* @param indexS Index of the species in the MultiPhase object
* @param addedMoles Value of the moles that are added to the species.
*/
void addSpeciesMoles(const int indexS, const doublereal addedMoles);

View file

@ -474,6 +474,15 @@ namespace VCSnonideal {
*/
void vcs_print_line(const char *str, int num);
//! Returns a const char string representing the type of the
//! species given by the first argument
/*!
* @param speciesStatus Species status integer representing the type
* of the species.
* @param length Maximum length of the string to be returned.
* Shorter values will yield abbreviated strings.
* Defaults to a value of 100.
*/
const char *vcs_speciesType_string(int speciesStatus, int length = 100);
//! Print a string within a given space limit

View file

@ -53,6 +53,16 @@ namespace Cantera {
};
//! Prints out the current internal state of the Crystal ThermoPhase object
/*!
* Example of usage:
* s << x << endl;
*
* @param s Reference to the ostream to write to
* @param x Object of type Crystal that you are querying
*
* @return Returns a reference to the ostream.
*/
inline std::ostream& operator<<(std::ostream& s, Cantera::Crystal& x) {
size_t ip;
for (ip = 0; ip < x.nPhases(); ip++) {

View file

@ -551,7 +551,6 @@ namespace Cantera {
* It can be shown that the expression
*
*
*
* \f[
* B^{\phi}_{ca} = \beta^{(0)}_{ca} + \beta^{(1)}_{ca} \exp{(- \alpha^{(1)}_{ca} \sqrt{I})}
* + \beta^{(2)}_{ca} \exp{(- \alpha^{(2)}_{ca} \sqrt{I} )}
@ -3201,6 +3200,7 @@ namespace Cantera {
//! gamma_o value for the cutoff process at the zero solvent point
doublereal MC_X_o_min_;
//! Parameter in the Molality Exp cutoff treatment
/*!
* This is the slope of the p function at the zero solvent point
@ -3223,10 +3223,16 @@ namespace Cantera {
//! Parameter in the Molality Exp cutoff treatment
doublereal MC_cpCut_;
//! Parameter in the Molality Exp cutoff treatment
doublereal CROP_ln_gamma_o_min;
//! Parameter in the Molality Exp cutoff treatment
doublereal CROP_ln_gamma_o_max;
//! Parameter in the Molality Exp cutoff treatment
doublereal CROP_ln_gamma_k_min;
//! Parameter in the Molality Exp cutoff treatment
doublereal CROP_ln_gamma_k_max;
//! This is a boolean-type vector indicating whether
@ -3500,7 +3506,10 @@ namespace Cantera {
//! Precalculate the IMS Cutoff parameters for typeCutoff = 2
void calcIMSCutoffParams_();
//! Calculate molality cut-off parameters
void calcMCCutoffParams_();
//! Utility function to assign an integer value from a string
//! for the ElectrolyteSpeciesType field.
/*!

View file

@ -335,7 +335,12 @@ namespace Cantera {
//! True if the number species has been set
bool ready() const;
//! Every time the mole fractions have changed, this routine
//! will increment the stateMFNumber
/*!
* @param forceChange If this is true then the stateMFNumber always
* changes. This defaults to false.
*/
void stateMFChangeCalc(bool forceChange = false);
//! Return the state number
@ -423,7 +428,7 @@ namespace Cantera {
};
//! Return the State Mole Fraction Number
inline int State::stateMFNumber() const {
return m_stateNum;
}

View file

@ -127,11 +127,6 @@ namespace Cantera {
void WaterSSTP::constructPhase() {
throw CanteraError("WaterSSTP::constructPhase()", "unimplemented");
}
/*
* @param infile XML file containing the description of the

View file

@ -400,13 +400,24 @@ namespace Cantera {
*/
virtual doublereal vaporFraction() const;
//! Set the temperature of the phase
/*!
* The density and composition of the phase is constant during this
* operator.
*
* @param temp Temperature (Kelvin)
*/
virtual void setTemperature(const doublereal temp);
//! Set the density of the phase
/*!
* The temperature and composition of the phase is constant during this
* operator.
*
* @param dens value of the density in kg m-3
*/
virtual void setDensity(const doublereal dens);
void constructPhase();
//! Initialization of a pure water phase using an
//! xml file.