Пример #1
0
int main(int argc, char** argv)
{
#if defined(_MSC_VER) && _MSC_VER < 1900
    _set_output_format(_TWO_DIGIT_EXPONENT);
#endif
    int retn = 0;

    try {

        HMWSoln* HMW = new HMWSoln("HMW_NaCl.xml");
        HMW->printCoeffs();

        size_t nsp = HMW->nSpecies();

        double a1 = HMW->AionicRadius(1);
        printf("a1 = %g\n", a1);
        double a2 = HMW->AionicRadius(2);
        printf("a2 = %g\n", a2);
        double mu0[100];
        double moll[100];
        string sName;

        HMW->getMolalities(moll);
        moll[1] = 6.0997;
        moll[2] = 2.1628E-9;
        moll[3] = 6.0997;
        moll[4] =1.3977E-6;
        /*
         * Equalize charge balance and dump into Cl-
         */
        double sum = -moll[1] + moll[2] + moll[3] - moll[4];
        moll[1] += sum;

        HMW->setMolalities(moll);
        HMW->setState_TP(298.15, 1.01325E5);
        pAtable(HMW);

        HMW->setState_TP(298.15, 1.01325E5);
        HMW->getStandardChemPotentials(mu0);
        // translate from J/kmol to kJ/gmol
        for (size_t k = 0; k < nsp; k++) {
            mu0[k] *= 1.0E-6;
        }

        printf("           Species   Standard chemical potentials (kJ/gmol) \n");
        printf("------------------------------------------------------------\n");
        for (size_t k = 0; k < nsp; k++) {
            sName = HMW->speciesName(k);
            printf("%16s %16.9g\n", sName.c_str(), mu0[k]);
        }
        printf("------------------------------------------------------------\n");
        printf(" Some DeltaSS values:               Delta(mu_0)\n");
        double deltaG;
        size_t i1, i2, j1;
        double RT = 8.314472E-3 * 298.15;

        i1 = HMW->speciesIndex("Na+");
        i2 = HMW->speciesIndex("Cl-");
        deltaG = -432.6304 - mu0[i1] - mu0[i2];
        printf(" NaCl(S): Na+ + Cl- -> NaCl(S): %14.7g kJ/gmol \n",
               deltaG);
        printf("                                : %14.7g (dimensionless) \n",
               deltaG/RT);
        printf("                                : %14.7g (dimensionless/ln10) \n",
               deltaG/(RT * log(10.0)));
        printf("            G0(NaCl(S)) = %14.7g (fixed)\n", -432.6304);
        printf("            G0(Na+)     = %14.7g\n", mu0[i1]);
        printf("            G0(Cl-)     = %14.7g\n", mu0[i2]);

        i1 = HMW->speciesIndex("H+");
        i2 = HMW->speciesIndex("H2O(L)");
        j1 = HMW->speciesIndex("OH-");
        if (i1 == npos || i2 == npos || j1 == npos) {
            printf("problems\n");
            exit(-1);
        }
        deltaG = mu0[j1] + mu0[i1] - mu0[i2];
        printf(" OH-: H2O(L) - H+ -> OH-: %14.7g kJ/gmol \n",
               deltaG);
        printf("                                : %14.7g (dimensionless) \n",
               deltaG/RT);
        printf("                                : %14.7g (dimensionless/ln10) \n",
               deltaG/(RT * log(10.0)));
        printf("            G0(OH-)    = %14.7g\n", mu0[j1]);
        printf("            G0(H+)     = %14.7g\n", mu0[i1]);
        printf("            G0(H2O(L)) = %14.7g\n", mu0[i2]);


        printf("------------------------------------------------------------\n");

        delete HMW;
        HMW = 0;
        Cantera::appdelete();

        return retn;

    } catch (CanteraError& err) {
        std::cout << err.what() << std::endl;
        return -1;
    }
}
Пример #2
0
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 Cp0_R[20], pmCp[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];
    for (i = 0; i < 100; i++) {
      acMol[i] = 1.0;
      act[i] = 1.0;
      mf[i] = 0.0;
      act[i] = 0.0;
    }

    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);

    ThermoPhase *hmwtb = (ThermoPhase *)HMW;
    
    ThermoPhase *hmwtbDupl = hmwtb->duplMyselfAsThermoPhase();
    //ThermoPhase *hmwtbDupl = 0;
    HMWSoln *HMW1 = HMW;
    HMWSoln *HMW2 = dynamic_cast<HMWSoln *>(hmwtbDupl);

    for (int itherms = 0; itherms < 2; itherms++) {
      if (itherms ==0) {
	HMW = HMW1;
      } else {
	HMW = HMW2;
      }

      /*
       * ThermoUnknowns
       */
      double T;
 
      double Cp0_NaCl = 0.0, Cp0_Naplus = 0.0, Cp0_Clminus = 0.0, Delta_Cp0s = 0.0, Cp0_H2O = 0.0;
      double Cp_NaCl = 0.0, Cp_Naplus = 0.0, Cp_Clminus = 0.0, Cp_H2O = 0.0;
      double molarCp0;
#ifdef DEBUG_HKM
      FILE *ttt;
      if (itherms ==0) {
	ttt = fopen("table1.csv","w");
      } else {
	ttt = fopen("table2.csv","w");
      }
     
#endif
      printf("A_J/R: Comparison to Pitzer's book, p. 99, can be made.\n");
      printf("        Agreement is within 12 pc \n");
      printf("\n");

      printf("Delta_Cp0: 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_Cps: Delta heat Capacity 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("phiJ:     phiJ, calculated from the program, is checked\n");
      printf("          against analytical formula in J_standalone program.\n");
      printf("          (comparison against Eq. 12, Silvester and Pitzer)\n");

      /*
       * Create a Table of NaCl Enthalpy Properties as a Function
       * of the Temperature
       */
      printf("\n\n");
      printf("            T,          Pres,          Aphi,         A_J/R,"
	     "     Delta_Cp0,"
	     "     Delta_Cps,             J,          phiJ,"
	     "     MolarCp,   MolarCp0\n");
      printf("       Kelvin,           bar, sqrt(kg/gmol), sqrt(kg/gmol),"
	     "   kJ/gmolSalt,"
	     "   kJ/gmolSalt,   kJ/gmolSoln,   kJ/gmolSalt,"
	     "       kJ/gmol,    kJ/gmol\n");
#ifdef DEBUG_HKM
      fprintf(ttt,"T, Pres, A_J/R, Delta_Cp0, Delta_Cps, J, phiJ\n");
      fprintf(ttt,"Kelvin, bar, sqrt(kg/gmol), kJ/gmolSalt, kJ/gmolSalt, kJ/gmolSoln,"
	      "kJ/gmolSalt\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 DeltaH
	 */
   
	solid->getCp_R(Cp0_R);
	Cp0_NaCl = Cp0_R[0] * GasConstant * 1.0E-6;

  
	HMW->getCp_R(Cp0_R);
	Cp0_H2O    = Cp0_R[0] * GasConstant * 1.0E-6;
	Cp0_Naplus = Cp0_R[i1] * GasConstant * 1.0E-6;
	Cp0_Clminus = Cp0_R[i2] * GasConstant * 1.0E-6;
	/*
	 * Calculate the standard state heat of solution
	 * for NaCl(s) -> Na+ + Cl-
	 *   units: kJ/gmolSalt
	 */
 
	Delta_Cp0s = Cp0_Naplus + Cp0_Clminus - Cp0_NaCl;

	pmCp[0] = solid->cp_mole();
  
	Cp_NaCl = pmCp[0] * 1.0E-6;


	HMW->getPartialMolarCp(pmCp);
	Cp_H2O     = pmCp[0]  * 1.0E-6;
	Cp_Naplus  = pmCp[i1] * 1.0E-6;
	Cp_Clminus = pmCp[i2] * 1.0E-6;

	//double Delta_Cp_Salt = Cp_NaCl - (Cp_Naplus + Cp_Clminus);

	double molarCp = HMW->cp_mole() * 1.0E-6; 

	/*
	 * Calculate the heat capacity of solution for the reaction
	 * NaCl(s) -> Na+ + Cl-
	 */
	double Delta_Cps = (Xmol[0]  * Cp_H2O +
			    Xmol[i1] * Cp_Naplus +
			    Xmol[i2] * Cp_Clminus 
			    - Xmol[0] * Cp0_H2O
			    - Xmol[i1] * Cp_NaCl);
	Delta_Cps /= Xmol[i1];
 
   
	/*
	 * Calculate the relative heat capacity, J, from the
	 * partial molar quantities, units J/gmolSolutionK
	 */
	double J = (Xmol[0]  * (Cp_H2O    - Cp0_H2O) +
		    Xmol[i1] * (Cp_Naplus - Cp0_Naplus) +
		    Xmol[i2] * (Cp_Clminus - Cp0_Clminus));

	/*
	 * Calculate the apparent relative molal heat capacity, phiJ,
	 * units of J/gmolSaltAddedK
	 */
	double phiJ = J / Xmol[i1];
		   

	double Aphi = HMW->A_Debye_TP(T, pres) / 3.0;
	//double AL = HMW->ADebye_L(T,pres);
	double AJ = HMW->ADebye_J(T, pres);



	for (int k = 0; k < nsp; k++) {
	  Cp0_R[k] *= GasConstant * 1.0E-6;
	}

	molarCp0 = 0.0;
	for (int k = 0; k < nsp; k++) {
	  molarCp0 += Xmol[k] * Cp0_R[k];
	}

	if (i != TTable.NPoints+1) {
	  printf("%13g, %13g, %13g, %13g, %13g, %13g, "
		 "%13g, %13g, %13g, %13g\n",
		 T, pres*1.0E-5,  Aphi, AJ/GasConstant, Delta_Cp0s, Delta_Cps,
		 J, phiJ, molarCp , molarCp0 );
#ifdef DEBUG_HKM
	  fprintf(ttt,"%g, %g, %g, %g, %g, %g, %g\n",
		  T, pres*1.0E-5, AJ/GasConstant, Delta_Cp0s, Delta_Cps, J, phiJ);
#endif
	}
 
      }

      printf("Breakdown of Heat Capacity Calculation at 323.15 K, 1atm:\n");
    
      printf(" Species     MoleFrac        Molal          Cp0      "
	     "    partCp     (partCp - Cp0)\n");
      printf("  H2O(L)");
      printf("%13g %13g %13g %13g %13g\n", Xmol[0], moll[0], Cp0_H2O , Cp_H2O,  Cp_H2O-Cp0_H2O);
      printf("  Na+   ");
      printf("%13g %13g %13g %13g %13g\n", Xmol[i1], moll[i1], 
	     Cp0_Naplus , Cp_Naplus,  Cp_Naplus -Cp0_Naplus);
      printf("  Cl-   ");
      printf("%13g %13g %13g %13g %13g\n", Xmol[i2], moll[i2], 
	     Cp0_Clminus , Cp_Clminus,  Cp_Clminus - Cp0_Clminus);

      printf(" NaCl(s)");
      printf("%13g               %13g %13g %13g\n", 1.0, 
	     Cp0_NaCl , Cp_NaCl,  Cp_NaCl - Cp0_NaCl);

#ifdef DEBUG_HKM
      fclose(ttt);
#endif

    }

    delete HMW1;
    HMW = 0;
    delete hmwtbDupl;
    hmwtbDupl = 0;
    delete solid;
    solid = 0;
    Cantera::appdelete();


    return retn;

  } catch (CanteraError) {
    printf("caught error\n");
    showErrors();
    Cantera::appdelete();
    return -1;
  }
} 
Пример #3
0
int main(int argc, char** argv)
{

    int retn = 0;
    size_t i;
    string commandFile;
    try {

        char iFile[80];
        strcpy(iFile, "HMW_NaCl.xml");
        if (argc > 1) {
            strcpy(iFile, argv[1]);
        }
        double Temp = 273.15 + 275.;

        double aTemp[7];
        aTemp[0] = 298.15;
        aTemp[1] = 273.15 + 100.;
        aTemp[2] = 273.15 + 150.;
        aTemp[3] = 273.15 + 200.;
        aTemp[4] = 273.15 + 250.;
        aTemp[5] = 273.15 + 275.;
        aTemp[6] = 273.15 + 300.;

        HMWSoln* HMW = new HMWSoln(iFile, "NaCl_electrolyte");

        size_t nsp = HMW->nSpecies();
        double acMol[100];
        double act[100];
        double mf[100];
        double moll[100];

        for (i = 0; i < 100; i++) {
            acMol[i] = 1.0;
            act[i] = 1.0;
            mf[i] = 0.0;
            moll[i] = 0.0;
        }

        HMW->getMoleFractions(mf);
        string sName;
        FILE* ff;
        char fname[64];

        for (int jTemp = 0; jTemp < 7; jTemp++) {
            Temp = aTemp[jTemp];
            sprintf(fname, "T%3.0f.csv", Temp);

            ff = fopen(fname, "w");
            HMW->setState_TP(Temp, 1.01325E5);
            printf("   Temperature = %g K\n", Temp);
            size_t i1 = HMW->speciesIndex("Na+");
            size_t i2 = HMW->speciesIndex("Cl-");
            size_t i3 = HMW->speciesIndex("H2O(L)");
            for (i = 1; i < nsp; i++) {
                moll[i] = 0.0;
            }
            HMW->setState_TPM(Temp, OneAtm, moll);
            double Itop = 10.;
            double Ibot = 0.0;
            double ISQRTtop = sqrt(Itop);
            double ISQRTbot = sqrt(Ibot);
            double ISQRT;
            double Is = 0.0;
            size_t its = 100;
            bool doneSp = false;
            fprintf(ff,"              Is,     sqrtIs,     meanAc,"
                    "  log10(meanAC),     acMol_Na+,"
                    "     acMol_Cl-,   ac_Water, act_Water, OsmoticCoeff\n");
            for (i = 0; i < its; i++) {
                ISQRT = ISQRTtop*((double)i)/(its - 1.0)
                        + ISQRTbot*(1.0 - (double)i/(its - 1.0));

                Is = ISQRT * ISQRT;
                if (!doneSp) {
                    if (Is > 6.146) {
                        Is = 6.146;
                        doneSp = true;
                        i = i - 1;
                    }
                }
                moll[i1] = Is;
                moll[i2] = Is;
                HMW->setMolalities(moll);
                HMW->getMolalityActivityCoefficients(acMol);
                HMW->getActivities(act);
                double oc = HMW->osmoticCoefficient();
                double meanAC = sqrt(acMol[i1] * acMol[i2]);
                fprintf(ff,"%15g, %15g, %15g, %15g, %15g, %15g, %15g, %15g, %15g\n",
                        Is, ISQRT, meanAC, log10(meanAC),
                        acMol[i1], acMol[i2], acMol[i3], act[i3], oc);
            }
            fclose(ff);
        }


        delete HMW;
        HMW = 0;
        Cantera::appdelete();

        return retn;

    } catch (CanteraError& err) {
        std::cout << err.what() << std::endl;
        return -1;
    }
}