User:RichardTowers
Richard Towers is a GSOC2011 student (Masters of Engineering, Mechanical) from The University of Durham (UK), working on improvements to FPROPS.
Goals
A brief summary of what I hope to achieve over the summer. These points largely follow my GSOC application, feel free to ridicule my youthful ambition.
- All current fluids tested and all discrepancies discovered
- Squashed some bugs!
- Improvements to documentation
- Separated correlation coefficients from program code, load at run-time
- Added support for one other eqn. of state and tested successfully
- Increased confirmed fluid support to 50 fluids
- Added support for a0 (p, h) where p < pt
- Added support for two more eqns. of state, tested successfully
- Added support for pseudo-pure fluids
- Increased confirmed fluid support to 70 fluids
- Added support for at least one mixture
Progress reports
4 June 2011
Record of an email sent by John Pye to Richard:
Looking at Reid, Prausnitz & Poling (I have the 4th edition) it might be that you will have an easier time getting started with Redlich-Kwong equations of state, rather than the Peng-Robinson ones. The EOS is detailed in Section 3-4 "Cubic Equations of State" and the derivation of so-called 'departure functions' is detailed in Example 5-1 "Derive the departure functions for a pure material...". This derivation includes functions for calculation of extensive properties A, S, H, U, G. Some additional partial derivatives should give you Cp, Cv, and then you need also to convert to the intensive properties. How to use these departure functions to calculate is detailed in Section 5-2 "Fundamental Thermodynamic Principles", eg eq 5-2.4.
Let me put the above into the context of the current code. The eq 5-2.5 contains an ideal part (an integral of Cp°), a 'departure function'. The departure functions are functions exclusively of the p-v-T surface, ie the EOS. So given the EOS we can do the maths to work out what these departure functions need to be. This is done for the Helmholtz approach in the file helmholtz.c: see the functions eg helmholtz_h_raw, which shows the ideal and the 'residual' (departure) parts clearly. The residual parts are then implemented further down in that file.
I would propose then that to do a RK or PR EOS, we can keep most of helmholtz.[ch] and simply calculate new functions like helm_resid_tau and so on, specific to the EOS in question. All the current stuff from ideal.c continues to be used as-is, and the saturation calculation also remains as-is. We just need new functions like redkw_resid, redkw_resid_del, redkw_resid_tau, etc.
Doing the maths for those functions will need to be extremely carefully done, as from my experience is very very easy to introduce little calculation errors along the way. A good idea is to make use of tools like wxMaxima or similar, to do some of the maths symbolically, even if only as a double-check for hand-calculation. You then need to take the resulting expressions and work out how to code them efficiently.
We will of course then need to work out suitable data-structrues that allow functions like helmholtz_h_raw (renamed to fprops_h_raw, perhaps) to be common. That will require the HelmholtzData structure to be generalised to contain some pointer to the a struct containing the necessary residual functions, I suspect.
Further to the above, we will have to ponder how to implement support for thermo derivatives (derivs.[ch]). I think that this requires additional functions helmholtz_betap and helmholtz_alphap to be generalised as well. That might be trivial, actually.
Testing
Need to find correct data for comparison. Working version of REFPROP? Literature? Inconsistencies need to be investigated and hopefully fixed.
Improvements to documentation
As part of the build up to starting work I've been reading through the LyX generated help file that comes with ASCEND, Having just finished a dissertation written in LyX and LaTeX/pgf/tikz I could probably help significantly with the general appearance of this document, for example:
![]() |
![]() |
Separating Correlation Coefficients
Coefficients should be stored in human readable files, not as C source. The plan is to create an XML structure for these files and a function to parse the files, loading fluid information at runtime. John suggests using RelaxNG as the schema, I'm not sure whether or not ASCEND already has a preferred cross platform XML parser, to begin with I'll use GNOME's libxml.
Relax NG Grammar
Element names identify the property in question and attributes identify values. The advantage of using attributes instead of node text is that we can specify different attributes (for the same property) that are treated differently, for example: it is sometimes useful to specify the constant ideal term as a multiple of the specific gas constant instead of as an absolute value. fluidSchema.rng
Example XML Fluid File
As an example a fluid file for Hydrogen can be found in hydrogen.xml. Note that the constant term is specified as a multiple of R as described above.
Parser
The minimum requirements of the parser are quite simple, however it would be nice not to have to worry about arranging xml elements in a specific order and some variables are easier to specify as multiples of some other variable. The beginnings of a competent parser are found in parser.c.
Equations of State
Firstly I'll be looking at the Peng-Robinson cubic EOS, possibly adding some other equations in the same family (van der Waals, Redlich-Kwon and Soave for example). See pengrobinson.c and pengrobinson.h for more. Later an attempt might be made at implementing Lee and Kesler's modified Benedict-Webb-Rubin EOS, but this is another job for another day...

