Modeling a pipe with a large pressure drop
The Pipe model is a concentrated parameter model for pipes. The correlations it uses are applicable only for small pressure drops, i.e. less than 10% of the absolute inlet pressure. If the calculated pressure drop is larger than that, you’ll get a warning.
But what to do if you have a long pipe or a pipe with a large pressure drop ?
The solution is to use a MultiStage unit to put together a number of Pipe units in series, thereby effectively discretizing the unit.
Assume this is your flowsheet definition (in the constructor):
addUnit("Pipe", defaults.relay("DN300", "connection piping")); // ... addStream("StreamLiquid", defaults.relay("S03", "inlet flow"), "RX", "out", "DN300", "in"); addStream("StreamLiquid", defaults.relay("S04", "outlet flow"), "DN300", "out", "BD", "in");
and this is the pipe unit data (in the setup method):
Q("DN300.de").set(300.0, "mm"); Q("DN300.s").set(5.0, "mm"); Q("DN300.L").set(2000.0, "m"); Q("DN300.h").set(0.0, "m"); Q("DN300.eps").set(0.0457, "mm"); Q("DN300.vhConcentrated").set(3.0 * 0.75);
(beware this is C++ code ! check a tutorial if you have no clue how process modeling in C++ is possible !)
So to discretize the Pipe unit you’d merely change the addUnit command creation to create a MultiStage unit (no need to change the addStream statements):
addUnit("MultiStage", defaults.relay("DN300", "connection piping") ("nStreams", 1) ("typeT", "Pipe") ("typeU", "StreamLiquid") ("nStage", 30));
The meaning of the options passed to the addUnit command and ultimately to the constructor of the MultiStage unit is:
- nStreams: this is useful for more complex multi-stream arrangements, in this case each Pipe unit has just one inlet and one outlet so we set it to 1
- typeT: the type of the unit operation model used for each “stage”
- typeU: the type of the stream model which connects the “stages”.
- nStage: the number of stages i.e. of discretization steps
The model setup becomes:
for (int j=; j< I("DN300.nStage"); ++j) { std::string stage("DN300:S[" + std::to_string(j) + "]"); at(stage).Q("de").set(300.0, "mm"); at(stage).Q("s").set(5.0, "mm"); at(stage).Q("L").set(2000.0 / static_cast<double>(I("DN300.nStage")), "m"); at(stage).Q("h").set(0.0, "m"); at(stage).Q("eps").set(0.0457, "mm"); if (j == ) at(stage).Q("vhConcentrated").set(3.0 * 0.75); }
Here we iterate over all the “stages” and set de (external diameter), s (thickness), h (elevation) and eps (rugosity) to the same values as before on all discretization “stages”; the L (length) we divide by the number of “stages”; finally the vhConcentrated (velocity heads associated to the concentrated pressure drops) we place only once in the 1st “stage”.
Done !