More than Twenty-Five Years Later, One Afternoon
In 1999, as students at Universidad Simón Bolívar in Caracas, Carlos and I wrote our thesis: a vapor–liquid equilibrium (VLE) library in Visual Basic 6. Give it a mixture of components, an equation of state, and a temperature or pressure, and it would tell you what fraction was liquid, what fraction was vapor, and the composition of each component. It also found the mixture’s critical points — pressure and temperature — which was the tricky part. Thousands of lines of VB6, and it worked.
It was also extremely slow — VB6 wasn’t compiled — and it could only grind out a handful of points, nothing like the surfaces above. In hindsight we should have reached for FORTRAN or C, maybe C++; but it is what it is. I always wanted to come back and make it, at the very least, faster — and able to draw those plots. Then it sat, untouched, for a quarter of a century. Time does go fast.
I was a non-believer in AI for coding. For me AI for coding was a glorified autocomplete that kept handing me an old version of a Go library the ecosystem had already moved past — the model had been trained on stale data. My hunch is that for AI to really pay off in software, the craft itself has to be reorganized around it — the way the factory floor was once reorganized around the electric motor (more on that here).
Back in March, after reading a lot about Claude Code — and a good friend, Sam, telling me to just try it — I got a Claude subscription. One weekend in April I fed it the old VB6, some Pascal from another university project, and the thesis itself (I had to convert it from .doc to .docx — that’s how old it is), and asked it to read the code and tell me how to make it better. It did far more than that: it read the whole thesis, and what floored me is that, for the new code’s test cases, it pulled a table straight out of the thesis — I never asked it to. The planning was an afternoon’s work; the finished thing landed today, the 4th of July — the United States’ 250th birthday. Pure coincidence, but a nice one.
The engine is now github.com/miguelju/vle: a Rust core doing the equation-of-state math, with a Python layer for scripting and notebooks — more than twenty-five years after the first version, and now fast enough to draw everything above.
The pictures the engine can draw
The surfaces at the top of this page come straight out of notebooks/09_3d_phase_surfaces.ipynb in that repo. I picked them for a simple reason: they are beautiful, and the engine drew every point. They are not illustrations — they are output.
The phase-envelope dome
For a single pure substance, the boundary between liquid and vapor is one line on a pressure–temperature chart, ending at a critical point where the two phases become indistinguishable. For a mixture, that line opens up into a phase envelope — a loop whose left edge is the bubble line (where the first bubble of vapor appears) and whose right edge is the dew line (where the first drop of liquid condenses), the two meeting at the mixture’s critical point.1
Now stack one envelope per composition and let the mixture vary from pure ethane to mostly methane, and the loops sweep out a dome. Its ridge is the critical locus — the curve traced by every mixture’s critical point (the cyan line above), here found by the Heidemann–Khalil solver and threaded through the dome by Michelsen continuation. A pure fluid has a single critical point; a mixture has a whole ridge of them, and unlike a pure fluid its two phases can persist above the critical pressure and temperature.1 Watching that ridge rise and fall as you spin the dome is, to a thermodynamicist, the whole story of the mixture in one shape.
The P–x–y sail
The second surface is the classic P–x–y diagram, the first picture every chemical-engineering student meets in a VLE course.2 Fix the temperature, plot pressure against composition, and you get two curves: the bubble line (pressure vs. liquid composition) and the dew line (pressure vs. vapor composition). The region between them is the two-phase envelope; the horizontal gap between the two curves at any pressure is exactly what a distillation column exploits to separate the components.3
Draw one P–x–y at each temperature and stack them, and the bubble surfaces (green rims, liquid) and dew surfaces (orange rims, vapor) billow out like a sail catching wind. This one is methanol/water — a real, strongly non-ideal pair — modeled with a van Laar activity coefficient on the liquid side.
Both graphics are, at heart, the same trick as the flight globe: real coordinates in three dimensions, rotated by a little arithmetic and flattened onto a 2-D canvas, so you can grab them and look around. Drag either one. The difference is that here the three axes are composition, temperature, and pressure — and every vertex is a number that a 1999 thesis, reborn in an afternoon, now knows how to compute.
The dome you can fall off of
All of this is beautiful, but the phase envelope earns its keep somewhere far less abstract: a gas reservoir, a mile underground. If you know the composition of the gas down there — mostly methane, with a tail of heavier hydrocarbons — an engine like this one will draw you the envelope and the critical point for that exact mixture. Those two things are not decoration. They are the operating manual.
A gas-condensate reservoir lives in a narrow window on the pressure–temperature chart: to the right of the mixture’s critical point, but left of the cricondentherm, so that at discovery it is entirely gas, sitting above the dew line.4 Produce it and the pressure falls. Drop below that dew line and something backwards happens — liquid condenses out inside the rock as the pressure decreases, the wrong-way phase change the dome’s dew edge predicts. This is retrograde condensation.4 The heaviest, most valuable hydrocarbons fall out, get pinned in the pores by capillary forces, and choke the gas trying to flow past: a condensate bank that can strangle a well’s deliverability. Operators will tell you that you can kill a reservoir this way.
So the whole game is to keep the gas in one phase for as long as possible — hold the reservoir pressure above the dew line, recycle gas back down to prop it up — and you cannot do that without knowing precisely where the dew line and the critical point sit for your gas. Which is the quiet point of this whole page: the same numbers that make a pretty dome are, to a reservoir engineer, the difference between a field that flows for decades and one you accidentally suffocated.
Source data and notebooks: github.com/miguelju/vle. The 3-D figures reproduced here come from notebooks/09_3d_phase_surfaces.ipynb.
References
-
Penn State e-Education, PNG 520: Phase Behavior of Natural Gas and Condensate Fluids — “Phase Diagrams” and “Binary Systems”: the bubble- and dew-point curves bound the two-phase phase envelope and meet at the critical point, and for a mixture two phases can exist at pressures and temperatures beyond the critical point (the cricondenbar and cricondentherm). courses.ems.psu.edu/png520 ↩ ↩2
-
P-x-y and T-x-y Diagrams for Vapor–Liquid Equilibrium (VLE), Wolfram Demonstrations Project — an interactive treatment of the same bubble/dew construction. demonstrations.wolfram.com ↩
-
Foundations of Chemical and Biological Engineering I (BCcampus Open Publishing), “Pxy Diagram”: the area between the bubble and dew curves is the two-phase region used to design separations such as distillation. pressbooks.bccampus.ca/chbe220 ↩
-
Penn State e-Education, PNG 301: Introduction to Petroleum and Natural Gas Engineering — “Gas Condensate Reservoirs”: the reservoir temperature lies between the mixture’s critical temperature and its cricondentherm, so the fluid begins as a single-phase gas above the dew-point pressure; as pressure falls below the dew point, retrograde condensation drops liquid out inside the reservoir, and maintaining the pressure above the dew point (e.g. by gas recycling) keeps the fluid single-phase. e-education.psu.edu/png301 ↩ ↩2
Más de veinticinco años después, una tarde
En 1999, siendo estudiantes de la Universidad Simón Bolívar en Caracas, Carlos y yo escribimos nuestra tesis: una librería de equilibrio líquido–vapor (ELV) en Visual Basic 6. Le dabas una mezcla de componentes, una ecuación de estado y una temperatura o presión, y te decía qué fracción era líquido, qué fracción era vapor y la composición de cada componente. También calculaba los puntos críticos de la mezcla —presión y temperatura—, que era la parte peliaguda. Miles de líneas de VB6, y funcionaba.
Eso sí, era extremadamente lenta —VB6 no era compilado— y apenas lograba calcular un puñado de puntos, nada parecido a las superficies de arriba. En retrospectiva debimos haber usado FORTRAN o C, quizá C++; pero es lo que hay. Siempre quise volver y hacerla, como mínimo, más rápida —y capaz de dibujar esos gráficos. Después quedó ahí, sin tocarse, durante un cuarto de siglo. El tiempo sí que vuela.
Yo era un descreído de la IA para programar. Par mí, AI para programar era un autocompletado glorificado que una y otra vez me daba una versión vieja de una librería de Go que el ecosistema ya había superado —el modelo estaba entrenado con datos desactualizados—. Mi corazonada es que, para que la IA de verdad rinda en software, hay que reorganizar el oficio mismo a su alrededor —como en su momento se reorganizó la planta de la fábrica alrededor del motor eléctrico (más sobre esto aquí)—.
En marzo de este año, después de leer bastante sobre Claude Code —y de que un buen amigo, Sam, me insistiera en que lo probara—, me hice una suscripción a Claude. Un fin de semana de abril le pasé el viejo VB6, algo de Pascal de otro proyecto de la universidad, y la propia tesis (tuve que convertirla de .doc a .docx —así de vieja es—), y le pedí que revisara el código y me dijera cómo mejorarlo. Hizo mucho más que eso: leyó toda la tesis, y lo que más me impresionó es que, para los casos de prueba del código nuevo, sacó una tabla directamente de la tesis —yo nunca se lo pedí—. La planificación fue cosa de una tarde; el entregable quedó listo hoy, 4 de julio —el cumpleaños número 250 de Estados Unidos—. Pura coincidencia, pero de las bonitas.
El motor ahora es github.com/miguelju/vle: un núcleo en Rust que hace la matemática de la ecuación de estado, con una capa de Python para scripts y notebooks —veinticinco años después de la primera versión, y ahora sí lo bastante rápido para dibujar todo lo de arriba.
Las imágenes que el motor puede dibujar
Las superficies al inicio de esta página salen directamente de notebooks/09_3d_phase_surfaces.ipynb en ese repo. Las escogí por una razón sencilla: son hermosas, y el motor calculó cada punto. No son ilustraciones — son salida del programa.
El domo de la envolvente de fases
Para una sustancia pura, la frontera entre líquido y vapor es una sola línea en un diagrama de presión–temperatura, que termina en un punto crítico donde las dos fases se vuelven indistinguibles. Para una mezcla, esa línea se abre en una envolvente de fases — un lazo cuyo borde izquierdo es la línea de burbuja (donde aparece la primera burbuja de vapor) y cuyo borde derecho es la línea de rocío (donde condensa la primera gota de líquido), uniéndose ambas en el punto crítico de la mezcla.1
Ahora apila una envolvente por composición y deja que la mezcla varíe de etano puro a mayormente metano, y los lazos barren un domo. Su cresta es el lugar geométrico crítico — la curva que trazan los puntos críticos de todas las mezclas (la línea cian de arriba), aquí hallada con el solver de Heidemann–Khalil y enhebrada por el domo mediante continuación de Michelsen. Un fluido puro tiene un solo punto crítico; una mezcla tiene toda una cresta de ellos y, a diferencia de un fluido puro, sus dos fases pueden persistir por encima de la presión y la temperatura críticas.1 Ver esa cresta subir y bajar mientras giras el domo es, para un termodinamicista, toda la historia de la mezcla en una sola forma.
La vela P–x–y
La segunda superficie es el clásico diagrama P–x–y, la primera imagen que todo estudiante de ingeniería química encuentra en un curso de ELV.2 Fija la temperatura, grafica la presión contra la composición y obtienes dos curvas: la línea de burbuja (presión vs. composición del líquido) y la línea de rocío (presión vs. composición del vapor). La región entre ellas es la envolvente de dos fases; la brecha horizontal entre ambas curvas a cualquier presión es exactamente lo que una columna de destilación aprovecha para separar los componentes.3
Dibuja un P–x–y a cada temperatura y apílalos, y las superficies de burbuja (bordes verdes, líquido) y de rocío (bordes naranjas, vapor) se inflan como una vela atrapando el viento. Esta es metanol/agua — un par real y fuertemente no ideal — modelado con un coeficiente de actividad de van Laar en el lado líquido.
Ambos gráficos son, en el fondo, el mismo truco que el globo de vuelos: coordenadas reales en tres dimensiones, rotadas con un poco de aritmética y aplanadas sobre un lienzo 2-D, para que puedas agarrarlas y mirar alrededor. Arrastra cualquiera de las dos. La diferencia es que aquí los tres ejes son composición, temperatura y presión — y cada vértice es un número que una tesis de 1999, renacida en una tarde, hoy sabe calcular.
El domo del que te puedes caer
Todo esto es hermoso, pero la envolvente de fases se gana el pan en un lugar mucho menos abstracto: un yacimiento de gas, a un kilómetro bajo tierra. Si conoces la composición del gas allá abajo —metano en su mayoría, con una cola de hidrocarburos más pesados—, un motor como este te dibuja la envolvente y el punto crítico de esa mezcla exacta. Y esas dos cosas no son adorno: son el manual de operación.
Un yacimiento de gas condensado vive en una ventana estrecha del diagrama presión–temperatura: a la derecha del punto crítico de la mezcla, pero a la izquierda del cricondentherm, de modo que al descubrirlo es gas por completo, por encima de la línea de rocío.4 Prodúcelo y la presión cae. Baja de esa línea de rocío y pasa algo al revés — el líquido condensa dentro de la roca a medida que la presión disminuye, el cambio de fase al revés que predice el borde de rocío del domo. Eso es la condensación retrógrada.4 Los hidrocarburos más pesados y valiosos se caen, quedan atrapados en los poros por fuerzas capilares, y ahogan al gas que intenta pasar: un banco de condensado que puede estrangular la productividad de un pozo. Los operadores te dirán que así puedes matar un yacimiento.
Por eso el juego entero es mantener el gas en una sola fase el mayor tiempo posible —sostener la presión del yacimiento por encima de la línea de rocío, reinyectar gas para apuntalarla— y eso no lo puedes hacer sin saber con precisión dónde están la línea de rocío y el punto crítico de tu gas. Que es el punto silencioso de toda esta página: los mismos números que hacen un domo bonito son, para un ingeniero de yacimientos, la diferencia entre un campo que produce por décadas y uno que asfixiaste sin querer.
Datos y notebooks: github.com/miguelju/vle. Las figuras 3-D reproducidas aquí provienen de notebooks/09_3d_phase_surfaces.ipynb.
Referencias
-
Penn State e-Education, PNG 520: Phase Behavior of Natural Gas and Condensate Fluids — “Phase Diagrams” y “Binary Systems”: las curvas de burbuja y de rocío delimitan la envolvente de fases de dos fases y se unen en el punto crítico, y para una mezcla pueden coexistir dos fases a presiones y temperaturas más allá del punto crítico (el cricondenbar y el cricondentherm). courses.ems.psu.edu/png520 ↩ ↩2
-
P-x-y and T-x-y Diagrams for Vapor–Liquid Equilibrium (VLE), Wolfram Demonstrations Project — un tratamiento interactivo de la misma construcción de burbuja/rocío. demonstrations.wolfram.com ↩
-
Foundations of Chemical and Biological Engineering I (BCcampus Open Publishing), “Pxy Diagram”: el área entre las curvas de burbuja y de rocío es la región de dos fases que se usa para diseñar separaciones como la destilación. pressbooks.bccampus.ca/chbe220 ↩
-
Penn State e-Education, PNG 301: Introduction to Petroleum and Natural Gas Engineering — “Gas Condensate Reservoirs”: la temperatura del yacimiento queda entre la temperatura crítica de la mezcla y su cricondentherm, así que el fluido empieza como gas monofásico por encima de la presión de rocío; al caer la presión por debajo del punto de rocío, la condensación retrógrada deja caer líquido dentro del yacimiento, y mantener la presión por encima del punto de rocío (por ejemplo, reinyectando gas) mantiene el fluido en una sola fase. e-education.psu.edu/png301 ↩ ↩2