In questo notebook usiamo il programma melt.py per studiare il comportamento delle soluzioni solide (in questo caso, si tratta del comportamento alla fusione, ma i principi sono del tutto generali ed applicabili anche al caso transizioni solido/solido).
Volendo trattare soluzioni solide ideali, si è scelto il sistema dell'olivina che presenta solo piccole deviazioni dall'idealità .
Il programma legge un piccolo database (melt_db.dat; file che deve essere presente nello stesso folder del programma e di questo stesso notebook) che contiene i parametri termodinamici delle fasi pure forsterite e fayalite, nonché i parametri dei liquidi di composizione corrispondente alle fasi pure. Il programma legge il database con le stesse routine già viste per il programma gibbs_tp e relativa esercitazione.
Lanciamo il programma.
%run melt.py
%matplotlib inline
Possiamo esaminare i parametri nel database, per le varie fasi, usando il metodo info() per ciascuna fase. Ad esempio, per la forsterite:
fo.info()
Se facciamo lo stesso per il liquido di composizione Mg2SiO4 (foL), vediamo qualcosa di strano...
foL.info()
In particolare vediamo un valore di entropia negativo (cosa assurda dal punto di vista termodinamico) e, anche, il valore di G0 (l'energia libera alle condizioni standard) è minore (in valore relativo: va considerato il segno e non solo il valore assoluto) del G0 della forsterite. Questo vorrebbe dire che a T=298.15 K sarebbe stabile il liquido e non il solido!
Questo perchè, come accade in molti casi, i parametri termodinamici della fase foL non sono termodinamicamente consistenti, anche se sono internamente consistenti (nello specifico database) con quelli della forsterite e descrivono correttamente la relazione tra le due fasi a patto di utilizzarli nell'intervallo di temperatura e pressione per cui sono stati calibrati (e questo intevallo non contiene evidentemente le condizioni standard P/T). Si parla in questi casi di assessment: i parametri termodinamici vengono ottimizzati per riprodurre gli equilibri di fase osservati sperimentalmente, senza porre attenzione al loro significato termodinamico intrinseco. Questa è una faccenda a cui porre sempre particolare attenzione: è in generale pericoloso spingersi col modeling termodinamico al di là dei limiti P/T, e anche X, per i quali i parametri del database sono stati calibrati.
Diamo un'occhiata al comportamento dell'energia libera delle due fasi al variare della temperatura (tra 300 e 2500 K):
t_list=np.linspace(300,2500,20)
g_foL_list=np.array([])
g_fo_list=np.array([])
for it in t_list:
igL=foL.g_tp(it,0.)
ig=fo.g_tp(it,0.)
g_foL_list=np.append(g_foL_list,igL)
g_fo_list=np.append(g_fo_list,ig)
plt.figure()
plt.plot(t_list,g_foL_list,label="liquido")
plt.plot(t_list,g_fo_list,label="solido")
plt.legend(frameon=False)
plt.xlabel("T (K)")
plt.ylabel("G (J/mole)")
plt.show()
In effetti vediamo che l'anomalia per cui Gliq0<Gsol0 si ha solo per temperature vicino all'ambiente. per T più alte, l'energia libera del liquido è maggiore di quella del solido fino a circa 2200 K, dove si ha il crossover e il sistema fonde.
Usiamo la funzione fusion per determinare la temperatura di fusione della forsterite. La funzione richiede i nomi delle due fasi solida e liquida e la pressione (in questo caso, P=0 GPa); il parametro opzionale prt produce la stampa del risultato.
fusion("fo","foL",0,prt=True)
Facciamo lo stesso per la fayalite.
fusion("fa","faL",0,prt=True)
La funzione fusion lavora insieme alla funzione deltaG:
def deltaG(phase,phaseL,it,ip):
gs=eval(phase+'.g_tp(it,ip)')
gl=eval(phaseL+'.g_tp(it,ip)')
dg=gl-gs
return dg**2
def fusion(phase,phaseL,ip,prt=False):
t_ini=1800.
tf=lambda it: deltaG(phase,phaseL,it,ip)
t_fusion=scipy.optimize.minimize(tf,t_ini,tol=0.001)
if prt:
print("Temperatura di fusione: %5.2f K" % t_fusion.x[0])
else:
return t_fusion
la funzione deltaG calcola il quadrato della differenza tra i valori di energia libera del solido e del liquido a una data temperatura (e pressione): restituisce dunque un valore sempre positivo che è pari a zero quando le due energie libere sono uguali (il che si verifica alla temperatura di fusione). La funzione fusion cerca la temperatura alla quale deltaG è minima (cioè zero) che è appunto la temperatura di fusione. La ricerca del minimo viene fatta usando la funzione minimize della libreria scipy.optimize, partendo da un guess iniziale di 1800K (t_ini).
La funzione principale del programma del programma melt.py si chiama proprio melt. Questa determina il diagramma di stato TX che descrive l'equilibrio solido/liquido nel sistema dell'olivina. Il risultato di melt alla pressione ambiente è mostrato nella cella seguente:
melt(nt=20)
La funzione melt, chiamando la funzione composition) ricerca inizialmente le temperature di fusione dei termini puri fo e fa. Imposta poi il calcolo tra queste due temperature, tra le quali le due fasi solida e liquida coesistono certamente. Quindi, per ogni valore di temperatura, ricerca preliminarmente il punto di intersezione (xint) tra le curve μ del solido e del liquido
μs=xfoμ0fo+xfaμ0fa+RT[xfolog(xfo)+xfalog(xfa)]μL=xfoLμ0foL+xfaLμ0faL+RT[xfoLlog(xfoL)+xfaLlog(xfaL)]con xfa=1−xfo e xfaL=1−xfoL. A partire dalla composizione trovata, viene minimizzata l'energia libera della miscela eterogenea delle due fasi solida e liquida, ciascuna con la propria composizione (xs e xL).
G(qs,qL,xs,xL)=qsμs(xs)+qLμL(xL)dove qs e qL sono le quantità (in moli) delle fasi solida e liquida. In questa ricerca del minimo si impone che
A una pressione diversa (per esempio 5 GPa), chiamiamo la funzione melt passandogli il valore di pressione (il default è 0.):
melt(5)
La funzione composition può essere utilizzata da sola, per calcolare ad una certa temperatura, pressione e composizione globale di un componente (fo), le composizioni delle fasi solida e liquida all'equilibrio e la loro abbondanza relativa (in moli). A T=2500 K e P=5 GPa, per una xfo=0.50 (globale: portiamo in fusione una fase 50\%fo - 50\%fa), abbiamo
composition(2100,5,xval=0.5)
Vogliamo ora sfruttare la funzione g_phase per visualizzare le curve di energia libera delle fasi liquida e solida, data una certa temperatura e pressione. Nel caso la temperatura ricada nell'intervallo di coesistenza del solido e del liquido, viene tracciato anche il segmento che rappresenta l'energia libera della miscela eterogenea solido + liquido.
Il primo argomento di g_phase è la temperatura; il secondo è la pressione:
g_phase(2100,5)
A una temperatura più bassa di quella di fusione del componente basso-fondente (fayalite):
g_phase(1600,5)
Vediamo che la curva del solido è sempre sotto quella del liquido per qualunque composizione.
A una temperatura maggiore di quella di fusione del componente alto-fondente (forsterite):
g_phase(2800,5)
l'energia libera del liquido è più bassa di quella del solido per ogni composizione.