def calculateEquilibria(self, gmStat, setverb, T, P, x0):

        # setting verbosity (True or False - default), if set to yes, in particular, when getters are called the returned values are displayed in a comprehensive way
        oc.setVerbosity(setverb)

        # set pressure
        oc.setPressure(P)

        # set temperature
        oc.setTemperature(T)

        # set initial molar amounts
        oc.setElementMolarAmounts(x0)

        #Equilibrium
        if gmStat == 'Off':
            oc.calculateEquilibrium(gmstat.Off)
        elif gmStat == 'On':
            oc.calculateEquilibrium(gmstat.On)
        else:
            raise ValueError(
                'No suitable parameter for gmstat found: Choose from On/Off')

        self.gibbs = oc.getGibbsEnergy()
        self.mu = oc.getChemicalPotentials()
        self.cd = oc.getConstituentsDescription()
        self.mass = oc.getScalarResult('B')

        phasesAtEquilibrium = oc.getPhasesAtEquilibrium()
        self.pec = phasesAtEquilibrium.getPhaseElementComposition()
        self.pcc = phasesAtEquilibrium.getPhaseConstituentComposition()
        self.ps = phasesAtEquilibrium.getPhaseSites()
        self.ma = phasesAtEquilibrium.getPhaseMolarAmounts()
def Gm_bulkphase(temperature, elementMolarAmounts):
    # set temperature
    oc.setTemperature(temperature)
    oc.setElementMolarAmounts(elementMolarAmounts)
    Gm_bulkphase = {}
    Gm_bulkphase = oc.calculateEquilibrium(gmStat.On)
    G = oc.getScalarResult('G')
    phase_description = oc.getPhasesAtEquilibrium(
    ).getPhaseConstituentComposition()
    chemicalpotential = oc.getComponentAssociatedResult('MU')
 def phase(self, x, **kwargs):
     """
     The string name of the phase in equilibrium at the conditions.
     """
     phasearray = self.eqfunc(x).Phase.sel(P=self.P, T=self.T, **kwargs)
     return phasearray.values.flatten()
     
     phasesAtEquilibrium=oc.getPhasesAtEquilibrium()
     
     
     self.pec = phasesAtEquilibrium.getPhaseElementComposition()
     self.pcc = phasesAtEquilibrium.getPhaseConstituentComposition() 
     self.ps = phasesAtEquilibrium.getPhaseSites()
     self.ma = phasesAtEquilibrium.getPhaseMolarAmounts()        
     self.mu = oc.getChemicalPotentials()
     self.cd = oc.getConstituentsDescription()
     self.mass=oc.getScalarResult('B')
示例#4
0
    def eqfunc(self, x, calc_value):

        # setting verbosity (True or False - default), if set to yes, in particular, when getters are called the returned values are displayed in a comprehensive way
        oc.setVerbosity(self.setverb)

        # set pressure
        oc.setPressure(self.P)

        # set temperature
        oc.setTemperature(self.T)

        # set initial molar amounts
        oc.setElementMolarAmounts(x)

        #Equilibrium
        oc.calculateEquilibrium(gmstat.Off)

        if calc_value == 'gibbs':
            self.eq_val = oc.getGibbsEnergy()

        elif calc_value == 'mu':
            self.eq_val = oc.getChemicalPotentials()

        elif calc_value == 'cd':
            self.eq_val = oc.getConstituentsDescription()

        elif calc_value == 'mass':
            self.eq_val = oc.getScalarResult('B')

        elif calc_value == 'pec':
            self.eq_val = oc.getPhasesAtEquilibrium(
            ).getPhaseElementComposition()

        elif calc_value == 'pcc':
            self.eq_val = oc.getPhasesAtEquilibrium(
            ).getPhaseConstituentComposition()

        elif calc_value == 'ps':
            self.eq_val = oc.getPhasesAtEquilibrium().getPhaseSites()

        elif calc_value == 'ma':
            self.eq_val = oc.getPhasesAtEquilibrium().getPhaseMolarAmounts()

        return self.eq_val
 def __calculateVolume(self,phaseConstituentComposition,constituentsDescription,endmemberMassDensityLaws, constituentToEndmembersConverter):
     if (len(phaseConstituentComposition) != 1):
         print('error: not a single phase (%s) at equilibrium for molar volume calculation' % list(phaseConstituentComposition.keys()))
         exit()
     constituentMolarFractions=phaseConstituentComposition[list(phaseConstituentComposition.keys())[0]]
     # mass fractions from molar fractions
     if (constituentToEndmembersConverter==None):
         # endmembers are assumed to be the constituents (true if only one sublattice)
         endmemberMassFractions=self.__convertConstituentMolarToMassFractions(constituentMolarFractions,constituentsDescription)
     else:
         # an external converter from constituent molar fractions to endmembers mass fractions is used
         endmemberMassFractions=constituentToEndmembersConverter(constituentMolarFractions, constituentsDescription)
     #print(endmemberMassFractions)
     # ideal mixing law to evaluate mixture density
     density=0.0
     for endmember, massFraction in endmemberMassFractions.items():
         density += massFraction/endmemberMassDensityLaws[endmember](self.__T)
     density=1.0/density
     # total mass (mass is 'B' in OC)
     mass=oc.getScalarResult('B')
     return mass*1E-3/density
def calculateChemicalPotentialsAndMolarVolumes(tdbFile, suffix):
    print('### calculate U-O chemical potentials ###\n')
    # components
    comps = ['O', 'U']
    # mass density laws (from Barrachin2004)
    constituentDensityLaws = {
        'U1':
        lambda T: 17270.0 - 1.358 * (T - 1408),
        'ZR1':
        lambda T: 6844.51 - 0.609898 * T + 2.05008E-4 * T**2 - 4.47829E-8 * T**
        3 + 3.26469E-12 * T**4,
        'O2U1':
        lambda T: 8860.0 - 9.285E-1 * (T - 3120),
        'O2ZR1':
        lambda T: 5150 - 0.445 * (T - 2983),
        'O1':
        lambda T:
        1.141  # set to meaningless value but ok as, no 'free' oxygen in the considered mixtures
    }
    constituentDensityLaws['U'] = constituentDensityLaws['U1']
    constituentDensityLaws['ZR'] = constituentDensityLaws['ZR1']
    constituentDensityLaws['O'] = constituentDensityLaws['O1']

    # phase names
    phasenames = ['LIQUID', 'LIQUID']
    # pressure
    P = 1E5
    # temperature
    T = 2800
    # composition range (mole fraction of U)
    xmin = 0.4
    xmax = 0.99
    xRange = np.linspace(xmin, xmax, num=60, endpoint=True)

    results = pd.DataFrame(
        columns=['xU', 'muU', 'muO', 'VmU', 'VmO', 'mueqU', 'mueqO'])

    # calculate global equilibrium and retrieve associated chemical potentials
    CoherentGibbsEnergy_OC.initOC(tdbFile, comps)
    model = CoherentGibbsEnergy_OC(T, 1E5, phasenames)
    mueq = model.chemicalpotential([0.5 * (xmin + xmax)])

    # calculate single-phase equilibrium and retrieve associated chemical potentials
    CoherentGibbsEnergy_OC.initOC(tdbFile, comps)
    model = CoherentGibbsEnergy_OC(T, 1E5, phasenames[0])
    for x in xRange:
        print('**** xU=', x)
        mu = model.chemicalpotential([x])
        gibbsEnergy = oc.getScalarResult('G') / oc.getScalarResult('N')
        if ('TAF' in tdbFile):
            functions = model.constantPartialMolarVolumeFunctions(
                [x], constituentDensityLaws, 1E-5,
                constituentToEndmembersConverter)
        else:
            functions = model.constantPartialMolarVolumeFunctions(
                [x], constituentDensityLaws, 1E-5)
        results = results.append(
            {
                'xU': x,
                'muU': mu[1],
                'muO': mu[0],
                'VmU': functions[1](T),
                'VmO': functions[0](T),
                'mueqU': mueq[1],
                'mueqO': mueq[0],
                'Gm': gibbsEnergy
            },
            ignore_index=True)
    # write csv result file
    results.to_csv('macro_liquidMG_UO_chemicalPotentialsAndMolarVolumes' +
                   suffix + '.csv')
# set pressure
oc.setPressure(1E5)

# set temperature
oc.setTemperature(2773)
'''------------------------------------------------------------
COHERENT GIBBS ENERGY CALCUATIONS
------------------------------------------------------------'''

oc.setElementMolarAmounts(x0)

# calculate equilibrium without the grid-minimizer (equilibrium record = eq2)
oc.calculateEquilibrium(gmStat.Off)

phasesAtEquilibrium = oc.getPhasesAtEquilibrium()

pcc = phaseConstituentComposition = phasesAtEquilibrium.getPhaseConstituentComposition(
)

mass = oc.getScalarResult('B')

#
#
#cge = CoherentGibbsEnergy(T, P, db, comps, x0, phasenames, setverb, pathname)
#cge.eqfunc('Off')

#cd=cge.getConstituentsDescription()
#pcc=cge.getPhaseConstituentComposition()
#mass=cge.getMass()

print(mass)