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