diff --git a/Cantera/src/thermo/GibbsExcessVPSSTP.cpp b/Cantera/src/thermo/GibbsExcessVPSSTP.cpp index f8606c1d3..e5f9f5754 100644 --- a/Cantera/src/thermo/GibbsExcessVPSSTP.cpp +++ b/Cantera/src/thermo/GibbsExcessVPSSTP.cpp @@ -45,7 +45,7 @@ namespace Cantera { GibbsExcessVPSSTP::GibbsExcessVPSSTP(const GibbsExcessVPSSTP &b) : VPStandardStateTP() { - *this = operator=(b); + GibbsExcessVPSSTP::operator=(b); } /* @@ -56,10 +56,12 @@ namespace Cantera { */ GibbsExcessVPSSTP& GibbsExcessVPSSTP:: operator=(const GibbsExcessVPSSTP &b) { - if (&b != this) { - VPStandardStateTP::operator=(b); + if (&b == this) { + return *this; } + VPStandardStateTP::operator=(b); + moleFractions_ = b.moleFractions_; lnActCoeff_Scaled_ = b.lnActCoeff_Scaled_; dlnActCoeffdT_Scaled_ = b.dlnActCoeffdT_Scaled_; diff --git a/Cantera/src/thermo/IonsFromNeutralVPSSTP.cpp b/Cantera/src/thermo/IonsFromNeutralVPSSTP.cpp index 636940c6b..0dabe7ae4 100644 --- a/Cantera/src/thermo/IonsFromNeutralVPSSTP.cpp +++ b/Cantera/src/thermo/IonsFromNeutralVPSSTP.cpp @@ -141,7 +141,7 @@ namespace Cantera { neutralMoleculePhase_(0), IOwnNThermoPhase_(true) { - *this = operator=(b); + IonsFromNeutralVPSSTP::operator=(b); } /* @@ -152,14 +152,18 @@ namespace Cantera { */ IonsFromNeutralVPSSTP& IonsFromNeutralVPSSTP:: operator=(const IonsFromNeutralVPSSTP &b) { - if (&b != this) { - GibbsExcessVPSSTP::operator=(b); - } + if (&b == this) { + return *this; + } + + GibbsExcessVPSSTP::operator=(b); ionSolnType_ = b.ionSolnType_; numNeutralMoleculeSpecies_ = b.numNeutralMoleculeSpecies_; indexSpecialSpecies_ = b.indexSpecialSpecies_; indexSecondSpecialSpecies_ = b.indexSecondSpecialSpecies_; + fm_neutralMolec_ions_ = b.fm_neutralMolec_ions_; + fm_invert_ionForNeutral = b.fm_invert_ionForNeutral; NeutralMolecMoleFractions_ = b.NeutralMolecMoleFractions_; cationList_ = b.cationList_; numCationSpecies_ = b.numCationSpecies_; @@ -167,21 +171,35 @@ namespace Cantera { numAnionSpecies_ = b.numAnionSpecies_; passThroughList_ = b.passThroughList_; numPassThroughSpecies_ = b.numPassThroughSpecies_; - /* - * This is a shallow copy. We need to figure this out - */ - neutralMoleculePhase_ = b.neutralMoleculePhase_; - if (neutralMoleculePhase_) { - exit(-1); - } - IOwnNThermoPhase_ = b.IOwnNThermoPhase_; + /* + * If we own the underlying neutral molecule phase, then we do a deep + * copy. If not, we do a shallow copy. + */ + if (IOwnNThermoPhase_) { + if (b.neutralMoleculePhase_) { + if (neutralMoleculePhase_) { + delete neutralMoleculePhase_; + } + neutralMoleculePhase_ = (b.neutralMoleculePhase_)->duplMyselfAsThermoPhase(); + } else { + neutralMoleculePhase_ = 0; + } + } else { + neutralMoleculePhase_ = b.neutralMoleculePhase_; + } + + IOwnNThermoPhase_ = b.IOwnNThermoPhase_; moleFractionsTmp_ = b.moleFractionsTmp_; + muNeutralMolecule_ = b.muNeutralMolecule_; + gammaNeutralMolecule_ = b.gammaNeutralMolecule_; + dlnActCoeffdT_NeutralMolecule_ = b.dlnActCoeffdT_NeutralMolecule_; + dlnActCoeffdlnC_NeutralMolecule_ = b.dlnActCoeffdlnC_NeutralMolecule_; return *this; } - /** + /* * * ~IonsFromNeutralVPSSTP(): (virtual) * @@ -191,7 +209,7 @@ namespace Cantera { IonsFromNeutralVPSSTP::~IonsFromNeutralVPSSTP() { if (IOwnNThermoPhase_) { delete neutralMoleculePhase_; - neutralMoleculePhase_=0; + neutralMoleculePhase_ = 0; } } diff --git a/Cantera/src/thermo/IonsFromNeutralVPSSTP.h b/Cantera/src/thermo/IonsFromNeutralVPSSTP.h index 965087d34..f9070fa0c 100644 --- a/Cantera/src/thermo/IonsFromNeutralVPSSTP.h +++ b/Cantera/src/thermo/IonsFromNeutralVPSSTP.h @@ -152,9 +152,9 @@ namespace Cantera { /// Destructor. virtual ~IonsFromNeutralVPSSTP(); - //! Duplication routine for objects which inherit from ThermoPhase. + //! Duplication routine for objects which inherit from ThermoPhase. /*! - * This virtual routine can be used to duplicate thermophase objects + * This virtual routine can be used to duplicate ThermoPhase objects * inherited from ThermoPhase even if the application only has * a pointer to ThermoPhase to work with. */ @@ -720,7 +720,7 @@ namespace Cantera { //! Index of special species int indexSpecialSpecies_; - //! Index of special species + //! Index of special species int indexSecondSpecialSpecies_; //! Formula Matrix for composition of neutral molecules @@ -768,7 +768,7 @@ namespace Cantera { int numCationSpecies_; //! List of the species in this ThermoPhase which are anion species - std::vectoranionList_; + std::vector anionList_; //! Number of anion species int numAnionSpecies_; @@ -785,9 +785,22 @@ namespace Cantera { int numPassThroughSpecies_; public: + //! This is a pointer to the neutral Molecule Phase + /*! + * If the variable, IOwnNThermoPhase_ is true, then we own + * the pointer. If not, then this is considered a shallow pointer. + */ ThermoPhase *neutralMoleculePhase_; - protected: + + private: + + //! If true then we own the underlying neutral Molecule Phase + /*! + * If this is false, then the neutral molecule phase is considered + * as a shallow pointer. + */ bool IOwnNThermoPhase_; + //! ThermoPhase for the cation lattice /*! * Currently this is unimplemented and may be deleted @@ -808,9 +821,6 @@ namespace Cantera { mutable std::vector dlnActCoeffdT_NeutralMolecule_; mutable std::vector dlnActCoeffdlnC_NeutralMolecule_; - private: - - }; diff --git a/Cantera/src/thermo/MargulesVPSSTP.cpp b/Cantera/src/thermo/MargulesVPSSTP.cpp index 21af0007d..2017d8357 100644 --- a/Cantera/src/thermo/MargulesVPSSTP.cpp +++ b/Cantera/src/thermo/MargulesVPSSTP.cpp @@ -75,7 +75,7 @@ namespace Cantera { MargulesVPSSTP::MargulesVPSSTP(const MargulesVPSSTP &b) : GibbsExcessVPSSTP() { - *this = operator=(b); + MargulesVPSSTP::operator=(b); } /* @@ -86,9 +86,11 @@ namespace Cantera { */ MargulesVPSSTP& MargulesVPSSTP:: operator=(const MargulesVPSSTP &b) { - if (&b != this) { - GibbsExcessVPSSTP::operator=(b); + if (&b == this) { + return *this; } + + GibbsExcessVPSSTP::operator=(b); numBinaryInteractions_ = b.numBinaryInteractions_ ; m_HE_b_ij = b.m_HE_b_ij; diff --git a/Cantera/src/thermo/VPStandardStateTP.cpp b/Cantera/src/thermo/VPStandardStateTP.cpp index 0c4dd874e..bc4b85b4d 100644 --- a/Cantera/src/thermo/VPStandardStateTP.cpp +++ b/Cantera/src/thermo/VPStandardStateTP.cpp @@ -60,7 +60,7 @@ namespace Cantera { m_P0(OneAtm), m_VPSS_ptr(0) { - *this = b; + VPStandardStateTP::operator=(b); } /*