
[Sponsors] 
March 6, 2013, 05:07 
Residence time distribution (RTD) for dummies

#1 
New Member
Petr Vaněk
Join Date: Nov 2012
Posts: 7
Rep Power: 4 
Hello foamers,
I'm a total newbie in OpenFOAM and I'm supposed to do a RTD analysis for static mixers with quite a complex geometry. I searched the internet for a week now and I couldn't find the desired information so I'm turning to you, more advanced users. So far I followed a procedure: 1. Steadystate solution of laminar flow with simpleFoam (which I would like to edit in future to calculate also a temperature transfer). 2. I took the U file from the last time folder and copied it into new case folder into 0. 3. I used scalarTransportFoam on calculated velocity field to inject a tracer T at the inlet boundary. And now I got stuck with how to evaluate a concentration of the tracer at the outlet boundary so I could create RTD plot. Could any of you give me a "cook book for dummies" how to proceed with the rest and if there would be any simpler way to deal with it then copying the U file by hand? Thank you very much for any suggestions. 

March 10, 2013, 12:38 

#2  
Assistant Moderator
Bernhard Gschaider
Join Date: Mar 2009
Posts: 3,915
Rep Power: 40 
Quote:
Copying over U: not that I know. There are functionObjects that solve the tracer during the solution of the regular fluid equations, but these won't help you
__________________
Note: I don't use "Friend"feature on this forum out of principle. Ah. And by the way: I'm not on Facebook either. So don't be offended if I don't accept your invitation/friend request 

March 11, 2013, 06:15 

#3 
Senior Member

Hello Vanekp,
Maybe a different approach: if you include a unit source in your scalar transport equation, you get your residence time distribution for the entire volume. In that case, set the value at the inlet at 0, and you will see "fresh" fluid entering. Regards, Tom 

March 11, 2013, 22:22 

#4 
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 543
Rep Power: 18 
Hi Vanekp,
I have done passive scalar transport in a manner similar to what you are doing. To answer your question about the concentration at the boundary:
If you decide to move on to turbulent flow modeling, you need a few more things to correctly calculate the RTD. In scalarTransportFoam, you will need to add the affects of turbulence on your passive scalar through a transport equation similar to Code:
fvm::ddt(C) + fvm::div(phi, C) + fvm::SuSp(fvc::div(phi), C)  fvm::laplacian(D, C)  fvm::laplacian(Dturbulent, C) 

March 13, 2013, 04:11 

#5 
New Member
Petr Vaněk
Join Date: Nov 2012
Posts: 7
Rep Power: 4 
Thank you all for the advice.
I was told the same thing about the patchMassFlowAverage by my colleague. So far I'm interested only in laminar flows, so the adjustment is not yet necessary but in the future I'll have to do it. So I've set up everything according to the advice, I wrote a very simple shell script, which runs the sequence mySimpleFoam (simpleFoam with added solution of temperature) > copying the velocity fields U and phi > running scalarTransportFoam with patchMassFlowAverage function object included. So I'm now able to get the RTD curve quite nicely. But now I'm dealing with problems with the solution. The velocity fields seem to be calculated well and when I run the scalarTransportFoam at the beginning everything seems to go right and at one point the solution goes totally 'bananas' and the Flow Average gets even negative (and even into range of 1e15) which I don't even understant how is it possible to go negative. Do any of you have experince with this kind of behaviour and how to resolve it? 

March 13, 2013, 05:16 

#6 
Senior Member

Hello Vanekp,
Did you also copy the phi file from the latest timestep your simpleFoam run? It is calculated during the simple loop and corrected for conservation of mass instead of interpolated from the velocity field at the startup of scalarTransportFoam. This means you have a divergence free field to start with. You can test this quite easily by running the solver twice, once with and once without the copied phi field. Regards, Tom 

March 13, 2013, 09:44 

#7 
New Member
Petr Vaněk
Join Date: Nov 2012
Posts: 7
Rep Power: 4 
Thank you for the advice.
But yes I have copied both U and phi files. But I found out, that the problem is with the solution as the solution starts to oscilate, so I'm trying to figure out where is the problem, why the solution oscilates 

March 27, 2013, 14:04 

#8 
New Member
Jonas L. Ansoni
Join Date: Jun 2011
Posts: 22
Rep Power: 6 
Hello Foamers!!
I'm calculating the RTD as described by Daniel, using patchMassFlowAverged. However, I need these values to calculate the variance. I made a python script to perform these calculations, but I'm having trouble reading the output file, as shown below: Code:
# Time f_in f_out 0.002 1 0 0.004 1 1.923e122 0.006 13.486e112 0.008 13.193e108 0.01 1 4.059e107 Code:
massFlowAverageC { type patchMassFlowAverage; functionObjectLibs ( "libsimpleFunctionObjects.so" ); fields ( C ); patches ( f_in f_out ); factor 1.0; verbose true; } 

March 27, 2013, 14:15 

#9 
New Member
Jonas L. Ansoni
Join Date: Jun 2011
Posts: 22
Rep Power: 6 
Hello Foamers!!
I'm calculating the RTD as described by Daniel, using patchMassFlowAverged. However, I need these values to calculate the variance. I made a python script to perform these calculations, but I'm having trouble reading the output file, because some columns are getting together, as shown below: Code:
# Time f_in f_out 0.002 1 0 0.004 1 1.923e122 0.006 13.486e112 0.008 13.193e108 0.01 1 4.059e107 Code:
massFlowAverageC { type patchMassFlowAverage; functionObjectLibs ( "libsimpleFunctionObjects.so" ); fields ( C ); patches ( f_in f_out ); factor 1.0; verbose true; } 

March 27, 2013, 15:05 

#10 
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 543
Rep Power: 18 
what about making two function objects, one for f_in and another for f_out? they will be in separate folders and files.


March 27, 2013, 21:50 

#11 
New Member
Jonas L. Ansoni
Join Date: Jun 2011
Posts: 22
Rep Power: 6 
Hi Daniel!
Thank you for your prompt reply. I already tried that. The result was as shown below: Code:
# Time f_out 0.002 0 0.004 1.923e122 0.0063.486e112 0.0083.193e108 Jonas 

April 4, 2013, 05:34 

#12 
New Member
Petr Vaněk
Join Date: Nov 2012
Posts: 7
Rep Power: 4 
I might not be the best to talk, but as I think, it should be possible to write a script that gets these values for you. The number of charakters in the lines is always the same. Might that be an idea?


April 5, 2013, 13:30 

#13 
New Member
Jonas L. Ansoni
Join Date: Jun 2011
Posts: 22
Rep Power: 6 
Good idea vanekp!!!
I did this and worked. Follows the python script to read this archive. Code:
import numpy as np time, c_out = np.genfromtxt(prjDirC, skiprows = 1, delimiter=(13,13), unpack=True) 

May 14, 2014, 15:17 

#14  
New Member
jeicek
Join Date: Nov 2013
Location: Germany
Posts: 18
Rep Power: 3 
Quote:
Can anybody help me?,, How should I implement the patchMassFlowAverage function object? 

May 14, 2014, 15:48 

#15  
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 543
Rep Power: 18 
Quote:
By reading through the post online and trying example like the one at Residence time distribution (RTD) for dummies and looking at the wiki page here. You will need to compile the libraries outlined in the other post ScalarTransportFoam for RTD calculations 

Thread Tools  
Display Modes  


Similar Threads  
Thread  Thread Starter  Forum  Replies  Last Post 
Residence Time Distribution with Periodic Boundary Conditions  sanjose  FLUENT  0  October 18, 2010 10:11 
calculation the residence time distribution by CFX  ahmedsalemy  CFX  4  June 25, 2009 10:40 
How to get residence time distribution?  bigfans  FLUENT  0  April 27, 2009 09:39 
IcoFoam parallel woes  msrinath80  OpenFOAM Running, Solving & CFD  9  July 22, 2007 02:58 
Residence time distribution function  Roustam  Phoenics  3  February 26, 2002 09:47 