Distillation Curves and Secondary Specifications¶
In this tutorial you will fractionate a straight-run distillate into naphtha, kerosene, diesel and a light gas oil, check each product against the pool it goes to with the Distillation Curves utility, and then let the column find the side draw rates that put the kerosene and diesel end points where you want them.
What you will learn
- How to characterize a petroleum cut from its TBP curve with your own cut points
- How the Distillation Curves utility reports the TBP, ASTM D86, D1160, D2887 and EFV curves of a stream, with its flash point, densities, viscosities and cetane index
- How a curve point becomes a stream property that the spreadsheet, an Adjust or the column can use
- How secondary specifications converge the column on product qualities, and how to choose the variable each one moves
Prerequisites
- Completed Distillation Column
- DWSIM 10.2.12 or later
Process Overview¶
A refinery sells products against specifications written on their distillation curves and a handful of properties: the D86 95 % point and density of a diesel, the flash point and freezing point of a jet fuel. A crude or vacuum tower is therefore run to meet those qualities, and the reflux ratio and draw rates are only the handles that move them.
The feed here is the distillate part of a medium crude (API about 33): everything that boils up to 420 °C, already separated from the residue. The tower splits it into four products:
| Product | Leaves the tower as | Goes to |
|---|---|---|
| Naphtha | distillate from a total condenser | reformer or gasoline pool |
| Kerosene | liquid side draw | jet fuel (Jet A-1) |
| Diesel | liquid side draw | automotive diesel (EN 590) |
| Light gas oil | bottoms | further processing |
The tutorial has two parts. In the first you solve the tower with the draw rates of an ideal cut and read the product curves. In the second you tell the column the D86 95 % points you want for the kerosene and the diesel, and the column moves the two draw rates until it gets them.
graph LR
F["Distillate Feed<br/>60 kg/s, 250 °C"] --> T["T-101<br/>20 stages"]
T --> N["Naphtha"]
T --> K["Kerosene<br/>stage 6"]
T --> D["Diesel<br/>stage 11"]
T --> G["Light Gas Oil"]
Key Design Parameters¶
| Parameter | Value |
|---|---|
| Property Package | Peng-Robinson (PR) |
| Feed | 60 kg/s of straight-run distillate, 250 °C, 2 bar |
| Feed TBP curve | see step 2 (liquid volume basis) |
| Pseudocomponents | 9, cut at 80, 120, 160, 200, 240, 280, 320 and 360 °C |
| Column | 20 stages, total condenser, 1.5 bar at the top, 2.0 bar at the bottom |
| Feed stage | 11 |
| Side draws | kerosene from stage 6, diesel from stage 11, both liquid |
| Condenser | reflux ratio 3 |
| Reboiler | light gas oil rate 29.6 mol/s |
| Draw rates (Part 1) | kerosene 83.5 mol/s, diesel 90.3 mol/s |
| Targets (Part 2) | kerosene D86 95 % = 274 °C, diesel D86 95 % = 374 °C |
The rates of Part 1 are those of an ideal cut: each product takes the feed's molar flow that boils inside its range (kerosene 175 to 245 °C, diesel 245 to 360 °C, light gas oil above 360 °C).
Step-by-Step in the Classic UI¶
1. Set up¶
File > New Chemical Process Model: skip the compounds for now (the characterization creates them), choose Peng-Robinson (PR) as the property package and set the units you prefer. The values below are in °C, bar, kg/s and mol/s.
2. Characterize the distillate¶
Open Tools > Petroleum Characterization (Distillation Curves).
- Step 1, Available Curves: Boiling Point is already checked; leave the other curves unchecked. Curve type
True Boiling Point (TBP) (ASTM D2892), curve basisLiquid Volume. Under Bulk Sample Data, enter an API gravity of41.3. - Step 2, Experimental Data: enter the TBP of the distillate:
| Vol % | 0 | 7.1 | 14.3 | 28.6 | 42.9 | 57.1 | 71.4 | 85.7 | 100 |
|---|---|---|---|---|---|---|---|---|---|
| T (°C) | 36 | 75 | 110 | 160 | 210 | 262 | 312 | 362 | 420 |
- Step 3, Data Plot: check that the curve rises smoothly.
- Step 4, Configure Pseudocomponents: choose Define cut temperatures and enter
80,120,160,200,240,280,320and360, one per line (press Enter after each), in the flowsheet's temperature unit. The first and last points of the curve stay out of the list. These are the cut points of the Python script, so the pseudocomponents of both routes cover the same ranges. - Step 5, View Cuts: nine cuts.
- Step 6, Methods and Correlations: molar weight
Riazi (1986), critical temperature and pressureRiazi-Daubert (1985), acentric factorLee-Kesler (1976), viscosityAbbott (1971). - Step 7, Results: name the stream
Distillate Feedand click Finalize.
The wizard adds the pseudocomponents to the simulation and places a stream with their composition on the flowsheet.

The API gravity sets the densities
The wizard estimates the specific gravity of each cut and then scales all of them so the mixture has the bulk API gravity you entered. The product densities the utility reports later come from these specific gravities, so the bulk gravity is worth getting right.
3. Specify the feed¶
Open Distillate Feed and set Temperature 250 °C, Pressure 2 bar and Mass Flow 60 kg/s. Keep the composition the wizard wrote.
4. Add the column¶
Add four material streams named Naphtha, Kerosene, Diesel and Light Gas Oil, then a Distillation Column named T-101. In the column editor:
General tab: Number of Stages 20, Condenser/Top Pressure 1.5 bar, Column Pressure Drop 0.5 bar, Steady-State Column Solver Wang-Henke (Bubble Point), Maximum Number of Iterations 200, Convergence Tolerance 0.001.
Connections tab:
- Feeds:
Distillate Feed. - Products:
Naphthaas the distillate andLight Gas Oilas the bottoms. - Side Draws:
KeroseneandDiesel. - Duties: create the condenser and reboiler energy streams.
- Stream-Stage Associations: feed on stage
11, kerosene on stage6, diesel on stage11. - Side Draw Specs: both draws liquid, kerosene
83.5 mol/s, diesel90.3 mol/s. The grid shows them in the flowsheet's molar flow unit: 300.8 and 325.2 kmol/h in the default units.

Specifications tab:
- Condenser: Condenser Type
Total; specificationReflux Ratio,3. - Reboiler: specification
Product Molar Flow Rate,29.6 mol/s.
Why these specifications
With a total condenser and two side draws the column has four degrees of freedom. Here the reflux ratio, the bottoms rate and the two draw rates take them. The naphtha rate follows from the overall balance.
5. Solve¶
Click Solve. The column converges in a few seconds with a condenser duty of about 24 MW and a reboiler duty of about 16 MW.

6. Attach the Distillation Curves utility to each product¶
Open Kerosene, click the Attach Utility button (the star next to the object name) and choose Attach Utility > Distillation Curves. The same utility is also available from Utilities > Distillation Curves: in the window that opens, select Material Streams, Distillation Curves and the stream Kerosene. The utility window opens with the inputs on the left and the results on the right:
- Use the liquid phase only: off. The products are liquids anyway.
- TBP basis:
Liquid volume. - Percents distilled: the default list (0, 5, 10, 30, 50, 70, 90, 95 and 100) is enough here.
- D1160 pressure and EFV pressure: the defaults.
- EFV:
Riazi-Daubert correlation (from D86). The other option,Flash with the property package, is more rigorous and slower.
Click Calculate. The Chart tab plots the TBP, D86, D1160, D2887 and EFV curves together; the Table tab lists them point by point; the property grid below lists the product properties. Copy data places the tables on the clipboard for a spreadsheet.

Repeat for the other three products. Later, the same Attach Utility button lists the utilities attached to the stream and reopens them.
Where the curves come from
The utility builds the TBP curve from the compounds of the stream: each pseudocomponent occupies its share of the standard liquid volume and boils at its normal boiling point in the middle of that share. The D86, D2887 and D1160 curves follow from the TBP by the API Technical Data Book procedures. A side draw carries small amounts of the lighter and heavier cuts, which show up as tails at the ends of its TBP curve; the D86 conversion smooths them, much as the laboratory test does.
7. Check the products against their pools¶
With the four utilities in place, compare the kerosene with Jet A-1 and the diesel with EN 590:
| Product | Property | Value | Limit | Result |
|---|---|---|---|---|
| Kerosene | flash point (closed cup) | 50.5 °C | at least 38 °C | meets |
| Kerosene | D86 10 % | 176.4 °C | at most 205 °C | meets |
| Kerosene | D86 final boiling point | 300.0 °C | at most 300 °C | at the limit |
| Kerosene | density at 15 °C | 807.2 kg/m³ | 775 to 840 kg/m³ | meets |
| Kerosene | freezing point | −44.7 °C | at most −47 °C | misses |
| Diesel | flash point | 99.8 °C | above 55 °C | meets |
| Diesel | D86 95 % | 378.0 °C | at most 360 °C | misses |
| Diesel | density at 15 °C | 855.9 kg/m³ | 820 to 845 kg/m³ | misses |
| Diesel | calculated cetane index (ASTM D4737) | 52.4 | at least 46 | meets |
The values are those of the Python script. Your wizard cuts estimate their specific gravities with a different correlation than the script, so expect your numbers within a few degrees and a few kg/m³ of these.
The diesel is too heavy for EN 590. A lighter cut lowers its D86 95 % point and its density, which is what Part 2 does.
8. Use a curve point as a stream property¶
Every result of an attached utility is also a property of its stream, named after the utility and the table row, for example DistillationCurves1: D86 95% or DistillationCurves1: Flash Point (Closed Cup). You can read it in the spreadsheet, put it in a stream's property table, sweep it in a sensitivity analysis, or let an Adjust reach a value of it by moving a draw rate.
An Adjust works for one quality at a time and solves the whole flowsheet at each of its steps. When the quality belongs to a column product and the handle belongs to the same column, a secondary specification does the job inside the column.
9. Add the secondary specifications¶
Open T-101, go to Specifications and select the Secondary tab. Click Add twice and fill in the two rows:
| Field | Row 1 | Row 2 |
|---|---|---|
| Active | checked | checked |
| Name | Kerosene D86 95% |
Diesel D86 95% |
| Product | Kerosene |
Diesel |
| Property | D86 95% |
D86 95% |
| Target | 274 °C |
374 °C |
| Tolerance | 0.2 °C |
0.2 °C |
| Variable | Side draw rate: Kerosene |
Side draw rate: Diesel |
| Min | 42 mol/s |
45 mol/s |
| Max | 125 mol/s |
135 mol/s |
The limits keep each draw within half and one and a half times its starting value.

Solve again. The column now runs inside an outer loop: it measures how the two end points respond to the two draw rates, takes Newton steps on the draw rates and solves the whole column at each step. The Calculated column of the grid shows where each property ended, and the flowsheet log reports a warning when a target is not met.

10. Compare the two solutions¶
| Quantity | Ideal cut (Part 1) | Secondary specifications (Part 2) |
|---|---|---|
| Kerosene draw | 83.5 mol/s | 74.2 mol/s |
| Diesel draw | 90.3 mol/s | 81.9 mol/s |
| Naphtha | 16.0 kg/s, D86 95 % 186.4 °C | 18.5 kg/s, D86 95 % 198.1 °C |
| Kerosene | 13.7 kg/s, D86 95 % 269.7 °C | 12.7 kg/s, D86 95 % 273.9 °C |
| Diesel | 21.1 kg/s, D86 95 % 378.0 °C | 19.5 kg/s, D86 95 % 374.1 °C |
| Light gas oil | 9.2 kg/s | 9.3 kg/s |
| Kerosene flash point | 50.5 °C | 58.0 °C |
| Diesel density at 15 °C | 855.9 kg/m³ | 857.9 kg/m³ |
| Diesel cetane index | 52.4 | 53.2 |
Smaller draws push their light ends up the column. The naphtha grows and gets heavier, the kerosene loses its front end (its flash point rises by 7.5 °C) and gains on its back end, and the diesel loses part of its heavy end to the light gas oil. The diesel density barely moves: with this crude it takes a lighter diesel cut, or a different crude, to bring it inside EN 590.
Choosing Specifications and Variables¶
One variable per specification: each secondary specification moves one free variable of the column: the value of the condenser specification, the value of the reboiler specification, or the rate of a side draw. Two specifications cannot share a variable, and a column with two side draws has at most four.
Pair each property with the handle that drives it: the D86 95 % point of a side draw responds most to its own draw rate, since a larger draw reaches further down into the heavier liquid. Pairing the diesel end point with the kerosene draw would work against a weak and shifting response.
Keep a free rate in the balance: the feed's mass leaves through the four products. When the bottoms rate and both draw rates are fixed, the distillate is fixed as well, and moving one draw changes another product by the same amount. Here the condenser is specified by reflux ratio, so the naphtha absorbs the changes of the two draws.
Watch for non-monotonic responses: a property can pass through a minimum as its variable grows (the diesel end point against the bottoms rate, in this tower, has a minimum near 375 °C). A target on the far side of such a minimum has no solution, and the loop stops at the closest point it finds with a warning. Start from rates near the answer and give limits that keep the variable on one side.
Results and Validation¶
Expected results
With the ideal-cut draws the column converges with a condenser duty of about 24 MW and a reboiler duty of about 16 MW. With the secondary specifications the outer loop takes 2 iterations and 6 column solves, the kerosene D86 95 % point comes to 273.9 °C and the diesel's to 374.1 °C, and both specifications are reported as met.
The numbers above come from the Python script, which builds the pseudocomponents itself from the same cut points. The same flowsheet runs as a test of the DWSIM repository and is published in the DWSIM case library (crude-distillation/straight-run-distillate-curves and straight-run-distillate-secondary-specs).
Automating This Tutorial¶
Files in this repository
- Python script:
examples/advanced/09_distillate_curves_secondary_specs.py - Pre-built flowsheet:
examples/saved/distillate_fractionation.dwxmz(the column of Part 2, with a utility on each product)
import math
import os
import sys
import pythonnet
pythonnet.load("netfx") # DWSIM is a .NET Framework application
import clr # noqa: E402
DWSIM_BIN = os.environ.get("DWSIM_BIN")
if not DWSIM_BIN:
raise SystemExit("Set DWSIM_BIN to the DWSIM installation folder before running.")
for sub in ("", "unitops", "ppacks", "extenders"):
sys.path.append(os.path.join(DWSIM_BIN, sub))
clr.AddReference("DWSIM.Automation")
clr.AddReference("DWSIM.Automation.FluentAPI")
clr.AddReference("DWSIM.Thermodynamics")
clr.AddReference("DWSIM.UnitOperations")
from System import Array, Double # noqa: E402
from DWSIM.Automation.FluentAPI import CompoundExtensions, Flowsheet, PropertyPackages, Q # noqa: E402
from DWSIM.Thermodynamics.Utilities.PetroleumCharacterization.Methods import PropertyMethods # noqa: E402
from DWSIM.Thermodynamics.Utilities.PetroleumProperties import ( # noqa: E402
DistillationCurves, DistillationCurvesUtility, EFVCalculationMethod)
from DWSIM.UnitOperations.UnitOperations.Auxiliary.SepOps import ColumnSecondarySpec # noqa: E402
# Crude TBP (vol % distilled, C) and the cut points of the distillate's pseudocomponents (C)
CRUDE_VOL = [0, 5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95, 100]
CRUDE_TBP = [36, 75, 110, 160, 210, 262, 312, 362, 420, 490, 580, 650, 760]
CUTS = [36, 80, 120, 160, 200, 240, 280, 320, 360, 420]
WATSON_K = 11.8
def vol_at(t_c):
"""Volume percent of the crude distilled at t_c (linear between the TBP points)."""
for i in range(1, len(CRUDE_TBP)):
if t_c <= CRUDE_TBP[i]:
return CRUDE_VOL[i - 1] + (CRUDE_VOL[i] - CRUDE_VOL[i - 1]) * \
(t_c - CRUDE_TBP[i - 1]) / (CRUDE_TBP[i] - CRUDE_TBP[i - 1])
return 100.0
# --- 1. Pseudocomponents and property package -------------------------------------------------
fs = Flowsheet.Create("DistillateFractionation")
cuts = [] # (name, NBP in C, volume share, SG)
x_vol = Array[Double](CRUDE_VOL)
y_tbp = Array[Double](CRUDE_TBP)
for lo, hi in zip(CUTS[:-1], CUTS[1:]):
share = vol_at(hi) - vol_at(lo)
# the cut boils at the TBP of the middle of its volume; SG from a constant Watson K
tb_c = DistillationCurves.InterpolateMonotone(x_vol, y_tbp, (vol_at(hi) + vol_at(lo)) / 2)
tb = tb_c + 273.15
sg = (1.8 * tb) ** (1.0 / 3.0) / WATSON_K
name = f"NBP {tb_c:.0f}C"
fs = CompoundExtensions.WithPseudoComponent(fs, name, Q.Kelvin(tb), sg, PropertyMethods.MW_Riazi(tb, sg))
cuts.append((name, tb_c, share, sg))
fs = fs.WithPropertyPackage(PropertyPackages.PengRobinson)
# --- 2. Feed: 60 kg/s of distillate at 250 C and 2 bar ------------------------------------------
mass_total = sum(share * sg for _, _, share, sg in cuts)
feed = fs.AddMaterialStream("Distillate Feed").At(Q.Kelvin(250.0 + 273.15), Q.Pascal(200000.0))
for name, _, share, sg in cuts:
feed.SetCompoundMassFlow(name, 60.0 * share * sg / mass_total)
# --- 3. Column: 20 stages, total condenser, two liquid side draws ------------------------------
naphtha = fs.AddMaterialStream("Naphtha")
kerosene = fs.AddMaterialStream("Kerosene")
diesel = fs.AddMaterialStream("Diesel")
gasoil = fs.AddMaterialStream("Light Gas Oil")
qc = fs.AddEnergyStream("Condenser Duty")
qr = fs.AddEnergyStream("Reboiler Duty")
# stage numbers count from 0 at the condenser: 10 is the eleventh stage of the column editor
tower = (fs.AddDistillationColumn("T-101")
.WithNumberOfStages(20)
.WithFeed(feed, 10)
.WithDistillate(naphtha)
.WithBottoms(gasoil)
.WithSideDraw(kerosene, 5, Q.MolPerSecond(60.0))
.WithSideDraw(diesel, 10, Q.MolPerSecond(60.0))
.WithCondenserDuty(qc)
.WithReboilerDuty(qr)
.WithTopPressure(Q.Pascal(150000.0))
.WithColumnPressureDrop(Q.Pascal(50000.0))
.WithCondenserSpec("Reflux Ratio", 3.0)
.WithSolvingMethod("Wang-Henke (Bubble Point)"))
col = tower.Object
col.MaxIterations = 200
col.ExternalLoopTolerance = 1e-3
col.InternalLoopTolerance = 1e-3
# Solve the feed, then give the bottoms and the two draws the feed's molar flow of an ideal cut:
# light gas oil above 360 C, kerosene from 175 to 245 C, diesel from 245 to 360 C.
fs.TrySolve()
feed_flows = {c.Name: c.MolarFlow for c in feed.Object.Phases[0].Compounds.Values}
def cut_flow(lo, hi):
return sum(feed_flows[name] for name, tb_c, _, _ in cuts if lo <= tb_c < hi)
def side_draw(stream):
return [s for s in col.MaterialStreams.Values if s.StreamID == stream.Object.Name][0]
col.SetReboilerSpec("Product_Molar_Flow_Rate", cut_flow(360, 2000), "mol/s")
side_draw(kerosene).FlowRate.Value = cut_flow(175, 245)
side_draw(diesel).FlowRate.Value = cut_flow(245, 360)
print(f"Ideal-cut rates: light gas oil {cut_flow(360, 2000):.1f}, kerosene {cut_flow(175, 245):.1f}, "
f"diesel {cut_flow(245, 360):.1f} mol/s")
fs.Solve()
print(f"Condenser duty {qc.EnergyFlowKW / 1000:.1f} MW, reboiler duty {qr.EnergyFlowKW / 1000:.1f} MW")
# --- 4. A Distillation Curves utility on each product --------------------------------------------
products = [naphtha, kerosene, diesel, gasoil]
utilities = []
for i, p in enumerate(products):
util = DistillationCurvesUtility()
util.ID = i + 1
util.Name = "DistillationCurves1"
util.AttachedTo = p.Object
# EFV from the Riazi-Daubert correlation: the flash method is slower and not needed here
util.SetPropertyValue(DistillationCurvesUtility.KeyEFVMethod, int(EFVCalculationMethod.Correlation))
p.Object.AttachedUtilities.Add(util)
utilities.append(util)
def value_c(util, prop):
"""A temperature result of a utility, in C (NaN when the utility has no result)."""
if util.LastResults is None:
return math.nan
return DistillationCurvesUtility.GetValueSI(util.LastResults, prop) - 273.15
def report(title):
print(f"\n{title}")
print(f"{'Product':<14}{'kg/s':>7}{'D86 10%':>9}{'D86 50%':>9}{'D86 95%':>9}{'D86 FBP':>9}"
f"{'Flash':>8}{'d15':>8}{'CCI':>7}{'Freeze':>8}")
for p, util in zip(products, utilities):
util.Update()
pr = util.LastResults.Properties
print(f"{p.Object.GraphicObject.Tag:<14}{p.MassFlowKgPerSecond:7.2f}"
f"{value_c(util, 'D86 10%'):9.1f}{value_c(util, 'D86 50%'):9.1f}"
f"{value_c(util, 'D86 95%'):9.1f}{value_c(util, 'D86 100%'):9.1f}"
f"{pr.FlashPointClosedCup - 273.15:8.1f}{pr.Density15C:8.1f}"
f"{pr.CetaneIndexD4737:7.1f}{pr.FreezingPoint - 273.15:8.1f}")
report("Products with the draws at the ideal cut (C, kg/m3)")
# --- 5. Secondary specifications: kerosene and diesel D86 95 % points --------------------------
k0 = side_draw(kerosene).FlowRate.Value
d0 = side_draw(diesel).FlowRate.Value
specs = []
for product, target_c, draw0 in ((kerosene, 274.0, k0), (diesel, 374.0, d0)):
spec = ColumnSecondarySpec()
spec.Name = product.Object.GraphicObject.Tag + " D86 95%"
spec.ProductStreamID = product.Object.Name
spec.PropertyName = "D86 95%"
spec.TargetValue = target_c + 273.15 # SI: K
spec.Tolerance = 0.2 # K
spec.ManipulatedVariable = ColumnSecondarySpec.ManipulatedVariableType.SideDrawRate
spec.ManipulatedStreamID = product.Object.Name # each draw moves its own end point
spec.MinValue = 0.5 * draw0 # mol/s
spec.MaxValue = 1.5 * draw0
col.SecondarySpecs.Add(spec)
specs.append(spec)
fs.Solve()
print("\nSecondary specifications log:")
for line in col.SecondarySpecsLog:
print(" " + line)
for spec in specs:
print(f"{spec.Name}: target {spec.TargetValue - 273.15:.1f} C, calculated {spec.CalculatedValue - 273.15:.1f} C, "
f"draw {spec.ManipulatedValue:.1f} mol/s, converged {spec.Converged}")
print(f"Kerosene draw {k0:.1f} -> {specs[0].ManipulatedValue:.1f} mol/s, "
f"diesel draw {d0:.1f} -> {specs[1].ManipulatedValue:.1f} mol/s")
report("Products with the secondary specifications (C, kg/m3)")
Output may vary
Results depend on the LLM's reasoning quality and tool-use accuracy. Always verify the simulation matches your intent before relying on the numbers.
In the DWSIM Assistant, build the following simulation:
- Property package Peng-Robinson
- Nine petroleum pseudocomponents from this TBP curve of a straight-run
distillate (liquid volume % / °C): 0/36, 7.1/75, 14.3/110, 28.6/160,
42.9/210, 57.1/262, 71.4/312, 85.7/362, 100/420, cut at 80, 120, 160,
200, 240, 280, 320 and 360 °C, bulk API gravity 41.3
- A stream "Distillate Feed" with that composition, 60 kg/s, 250 °C, 2 bar
- A distillation column "T-101" with 20 stages, a total condenser at
1.5 bar, 0.5 bar of column pressure drop, the feed on stage 11,
distillate "Naphtha", bottoms "Light Gas Oil", liquid side draws
"Kerosene" (stage 6, 83.5 mol/s) and "Diesel" (stage 11, 90.3 mol/s),
reflux ratio 3 and a bottoms rate of 29.6 mol/s, Wang-Henke solver
with tolerances of 0.001
- Solve, attach a Distillation Curves utility to each product and
report the D86 10, 50 and 95 % points, the flash point and the density
at 15 °C of each one
- Then add two secondary specifications to the column: kerosene D86 95 %
at 274 °C moving the kerosene draw rate, diesel D86 95 % at 374 °C
moving the diesel draw rate, tolerance 0.2 °C each; solve again and
report the new draw rates and product properties
Exercises
- Replace the kerosene specification with a flash point of 60 °C (
Flash Point (Closed Cup)) moved by the kerosene draw. How much kerosene do you lose, and what happens to its D86 95 % point? - Bring the diesel density to 845 kg/m³ (
Density @ 15 C) with the diesel draw. Is there a draw rate that does it? Look at the log to see where the loop stopped, and explain why. - Add a third specification: naphtha D86 95 % at 190 °C, moved by the reflux ratio (the condenser specification value). Does the column still converge in a few iterations?
- Switch the EFV method of the diesel utility to the flash calculation and compare the EFV curve with the correlation. Where do they differ most?
Further Reading¶
- API Technical Data Book, Petroleum Refining, 6th ed. (1997): procedures 3A1.1, 3A2.1 and 3A3.1 (distillation curve interconversions) and chapter 2 (product properties)
- M. R. Riazi. (2005). Characterization and Properties of Petroleum Fractions. ASTM Manual MNL50
- ASTM D86, Standard Test Method for Distillation of Petroleum Products and Liquid Fuels at Atmospheric Pressure
- ASTM D4737, Standard Test Method for Calculated Cetane Index by Four Variable Equation
- R. N. Watkins. (1979). Petroleum Refinery Distillation, 2nd ed. Gulf Publishing
- DWSIM User Guide: the Distillation Curves utility and the secondary specifications of the rigorous distillation column
Next Steps¶
You now know how to read a product's distillation curve and how to make the column hit a product quality directly. Continue with the Features Track to explore TEA, LCA, and the AI Assistant.