CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > OpenFOAM

y+ and u+ values with low-Re RANS turbulence models: utility + testcase

Register Blogs Members List Search Today's Posts Mark Forums Read

Like Tree52Likes

Reply
 
LinkBack Thread Tools Display Modes
Old   July 11, 2011, 05:55
Default
  #21
Senior Member
 
Florian Krause
Join Date: Mar 2009
Location: Munich
Posts: 103
Rep Power: 8
florian_krause is on a distinguished road
Hi grandgo,
if its a division by zero, then its definitely not in

Code:
yPlus = y.y() * uTauAvg / RASModel->nu();
or in nuEff what you are using. nu is non-zero as well as nuEff = nu + nu_t. By the way, why do you use nuEff to calculate yPlus?

So division by zero happens then in

Code:
uPlus = U / uTauAvg;
which makes sense if I look at the output vaina74 posted: avgUGradWall: 0. Clearly, the velocity gradient at the wall

Code:
U.boundaryField()[patchi].snGrad()
gives you zero.

Now, my question is, why is this? I dont know your case, but is it possible by any chance, that this is at time 0 and you initialize your internal velocity field as (0 0 0)? just a guess...

Best,
Florian
florian_krause is offline   Reply With Quote

Old   July 11, 2011, 07:14
Default
  #22
Member
 
Join Date: Oct 2010
Location: Stuttgart
Posts: 35
Rep Power: 6
grandgo is on a distinguished road
hi florian,

Quote:
By the way, why do you use nuEff to calculate yPlus?
i'm using nuEff, because i need the tool for a LES case.

Quote:
nu is non-zero as well as nuEff = nu + nu_t
are you sure? i commented the "uplus line" out and it didnt work as well. same error message.

Quote:
Now, my question is, why is this? I dont know your case, but is it possible by any chance, that this is at time 0 and you initialize your internal velocity field as (0 0 0)? just a guess...
i changed the internal velocity field a little bit from (0 0 0) to (0.001 0 0), but it's no use. the error occurs not at time t = 0 anyway....


best regards
grandgo
grandgo is offline   Reply With Quote

Old   July 11, 2011, 07:40
Default
  #23
Senior Member
 
Florian Krause
Join Date: Mar 2009
Location: Munich
Posts: 103
Rep Power: 8
florian_krause is on a distinguished road
Hi grandgo,

my understanding is, kinematic viscosity nu shouldn't be zero, since its a physical property, therefore nuEff is not zero. I also think that you should divide by nu and not nuEff even if its a LES case, see

http://www.cfd-online.com/Wiki/Dimen...e_%28y_plus%29

and the source code of the yPlusLES utility.

It really puzzles me where should be a division by zero if you comment out

Code:
uPlus = U / uTauAvg;
since you only divide by nu apart from that.

Is this the only case where you get the error message?

Could you give me a small case where you get the same error message?

Best,
Florian
florian_krause is offline   Reply With Quote

Old   July 11, 2011, 11:50
Default
  #24
Member
 
Join Date: Oct 2010
Location: Stuttgart
Posts: 35
Rep Power: 6
grandgo is on a distinguished road
Quote:
Originally Posted by florian_krause View Post
Hi grandgo,

my understanding is, kinematic viscosity nu shouldn't be zero, since its a physical property, therefore nuEff is not zero. I also think that you should divide by nu and not nuEff even if its a LES case, see

http://www.cfd-online.com/Wiki/Dimen...e_%28y_plus%29

and the source code of the yPlusLES utility.

It really puzzles me where should be a division by zero if you comment out

Code:
uPlus = U / uTauAvg;
since you only divide by nu apart from that.

Is this the only case where you get the error message?

Could you give me a small case where you get the same error message?

Best,
Florian
hi florian,

i don't know why nuEff instead of nu is used in yPlusLES utility. i guess it makes no difference.

and it's not the only case, where i get an error message. i picked the pitzDaily case in incompressible/pisoFoam/les and the same problem there.


best,
grandgo
grandgo is offline   Reply With Quote

Old   July 11, 2011, 13:50
Default
  #25
Senior Member
 
Florian Krause
Join Date: Mar 2009
Location: Munich
Posts: 103
Rep Power: 8
florian_krause is on a distinguished road
Thats weird! I just run the pitzDaily case a few second until t=0.017 (random) and used my own plusPostLES utility-it works!

Here are the relevant code snippets of my plusPostLES:

Code:
int main(int argc, char *argv[])
{
    timeSelector::addOptions();

    #include "setRootCase.H"
#   include "createTime.H"
    instantList timeDirs = timeSelector::select0(runTime, args);
#   include "createMesh.H"

    forAll(timeDirs, timeI)
    {
        runTime.setTime(timeDirs[timeI], timeI);
        Info<< "Time = " << runTime.timeName() << endl;
        fvMesh::readUpdateState state = mesh.readUpdate();

        wallDist y(mesh, true);
        // Wall distance
        if (timeI == 0 || state != fvMesh::UNCHANGED)
        {
            Info<< "Calculating wall distance\n" << endl;
            Info<< "Writing wall distance to field "
                << y.name() << nl << endl;
            y.write();
        }

...

#       include "createPhi.H"

        singlePhaseTransportModel laminarTransport(U, phi);

        autoPtr<incompressible::LESModel> sgsModel
        (
            incompressible::LESModel::New(U, phi, laminarTransport)
        );

        volScalarField::GeometricBoundaryField d = nearWallDist(mesh).y();
        volScalarField nuEff = sgsModel->nuEff();

        const fvPatchList& patches = mesh.boundary();
        
        dimensionedScalar utauAvg("utauAvg", dimVelocity, 0);

        scalar nPatch = 0;
                
        forAll(patches, patchi)
        {
            const fvPatch& currPatch = patches[patchi];

            if (typeid(currPatch) == typeid(wallFvPatch))
            {
                yPlus.boundaryField()[patchi] =
                    d[patchi]
                   *sqrt
                    (
                        sgsModel->nu().boundaryField()[patchi]
                       *mag(UMean.boundaryField()[patchi].snGrad())
                    )
                   /sgsModel->nu().boundaryField()[patchi];
                const scalarField& Yp = yPlus.boundaryField()[patchi];

                uTau.boundaryField()[patchi] =
                  sqrt
                  (
            sgsModel->nu()
                   *mag(UMean.boundaryField()[patchi].snGrad())
                   );

                const fvPatchScalarField& utauWall = 
                  uTau.boundaryField()[patchi];
                
                dimensionedScalar utauTmp("utauTmp", dimVelocity, average(utauWall));
                
                utauAvg += utauTmp;

                nPatch ++;

                Info<< "Patch " << patchi
                    << " named " << currPatch.name()
                    << " y+ : min: " << min(Yp) << " max: " << max(Yp)
                    << " average: " << average(Yp) 
                    << " avgUMeanGradWall: " <<  average(mag(UMean.boundaryField()[patchi].snGrad())) << nl << endl;
            }
        }

        utauAvg /= nPatch; 
        
        Info << "Avg. shear velocity is: "
             << utauAvg << "; # of walls: " << nPatch << "." << endl;
       

        yStar = y.y() * utauAvg / sgsModel->nu();
        uStar = U / utauAvg;
Maybe some more info. I am using OF-1.7.x and didn't set any additional FPE options in my bashrc file.

Sorry, at the moment there is nothing else coming to my mind what might cause the error.

Regards,
Florian
florian_krause is offline   Reply With Quote

Old   July 11, 2011, 14:22
Default
  #26
Member
 
Join Date: Oct 2010
Location: Stuttgart
Posts: 35
Rep Power: 6
grandgo is on a distinguished road
Quote:
Originally Posted by florian_krause View Post
Thats weird! I just run the pitzDaily case a few second until t=0.017 (random) and used my own plusPostLES utility-it works!

Here are the relevant code snippets of my plusPostLES:

Code:
int main(int argc, char *argv[])
{
    timeSelector::addOptions();

    #include "setRootCase.H"
#   include "createTime.H"
    instantList timeDirs = timeSelector::select0(runTime, args);
#   include "createMesh.H"

    forAll(timeDirs, timeI)
    {
        runTime.setTime(timeDirs[timeI], timeI);
        Info<< "Time = " << runTime.timeName() << endl;
        fvMesh::readUpdateState state = mesh.readUpdate();

        wallDist y(mesh, true);
        // Wall distance
        if (timeI == 0 || state != fvMesh::UNCHANGED)
        {
            Info<< "Calculating wall distance\n" << endl;
            Info<< "Writing wall distance to field "
                << y.name() << nl << endl;
            y.write();
        }

...

#       include "createPhi.H"

        singlePhaseTransportModel laminarTransport(U, phi);

        autoPtr<incompressible::LESModel> sgsModel
        (
            incompressible::LESModel::New(U, phi, laminarTransport)
        );

        volScalarField::GeometricBoundaryField d = nearWallDist(mesh).y();
        volScalarField nuEff = sgsModel->nuEff();

        const fvPatchList& patches = mesh.boundary();
        
        dimensionedScalar utauAvg("utauAvg", dimVelocity, 0);

        scalar nPatch = 0;
                
        forAll(patches, patchi)
        {
            const fvPatch& currPatch = patches[patchi];

            if (typeid(currPatch) == typeid(wallFvPatch))
            {
                yPlus.boundaryField()[patchi] =
                    d[patchi]
                   *sqrt
                    (
                        sgsModel->nu().boundaryField()[patchi]
                       *mag(UMean.boundaryField()[patchi].snGrad())
                    )
                   /sgsModel->nu().boundaryField()[patchi];
                const scalarField& Yp = yPlus.boundaryField()[patchi];

                uTau.boundaryField()[patchi] =
                  sqrt
                  (
            sgsModel->nu()
                   *mag(UMean.boundaryField()[patchi].snGrad())
                   );

                const fvPatchScalarField& utauWall = 
                  uTau.boundaryField()[patchi];
                
                dimensionedScalar utauTmp("utauTmp", dimVelocity, average(utauWall));
                
                utauAvg += utauTmp;

                nPatch ++;

                Info<< "Patch " << patchi
                    << " named " << currPatch.name()
                    << " y+ : min: " << min(Yp) << " max: " << max(Yp)
                    << " average: " << average(Yp) 
                    << " avgUMeanGradWall: " <<  average(mag(UMean.boundaryField()[patchi].snGrad())) << nl << endl;
            }
        }

        utauAvg /= nPatch; 
        
        Info << "Avg. shear velocity is: "
             << utauAvg << "; # of walls: " << nPatch << "." << endl;
       

        yStar = y.y() * utauAvg / sgsModel->nu();
        uStar = U / utauAvg;
Maybe some more info. I am using OF-1.7.x and didn't set any additional FPE options in my bashrc file.

Sorry, at the moment there is nothing else coming to my mind what might cause the error.

Regards,
Florian
hi florian,

why are you using UMean now? and what's Umean?

and whats the difference between utauavg and utauavg.value() ?
grandgo is offline   Reply With Quote

Old   July 11, 2011, 15:41
Default
  #27
Senior Member
 
Florian Krause
Join Date: Mar 2009
Location: Munich
Posts: 103
Rep Power: 8
florian_krause is on a distinguished road
Quote:
why are you using UMean now? and what's Umean?
sorry for the confusion with UMean in the code snippet... I used the utility for a fully developed turbulent pipe flow and time-averaged the velocity field. With that I calculated the mean (time-averaged) velocity gradient at the wall... I only wanted to show you the code of the utility I used for the pitzDaily case.

Quote:
and whats the difference between utauavg and utauavg.value() ?
I don't understand what you mean by this! Are you talking about this one

Code:
utauAvg += utauTmp;
Its just a dimensionScalar with the dimensions of velocity, see defintion of utauTmp. Its not a class with a member value().

Regards,
Florian
florian_krause is offline   Reply With Quote

Old   July 11, 2011, 15:50
Default
  #28
Member
 
Join Date: Oct 2010
Location: Stuttgart
Posts: 35
Rep Power: 6
grandgo is on a distinguished road
Quote:
Originally Posted by florian_krause View Post
sorry for the confusion with UMean in the code snippet... I used the utility for a fully developed turbulent pipe flow and time-averaged the velocity field. With that I calculated the mean (time-averaged) velocity gradient at the wall... I only wanted to show you the code of the utility I used for the pitzDaily case.

I don't understand what you mean by this! Are you talking about this one

Code:
utauAvg += utauTmp;
Its just a dimensionScalar with the dimensions of velocity, see defintion of utauTmp. Its not a class with a member value().

Regards,
Florian
no, in the original code you user this code
Code:
Info << "  avg. friction velocity uTau is: "
             << uTauAvg.value() << " (averaged over " << nPatch << " wall(s))" << nl <<endl;
i'm just wondering...

i don't know what the problem could be. i'm a newbie in c++ programming

the utility would fit perfectly to what i need.
i just go on trying and testing

best
grandgo
grandgo is offline   Reply With Quote

Old   July 11, 2011, 16:13
Default
  #29
Senior Member
 
Florian Krause
Join Date: Mar 2009
Location: Munich
Posts: 103
Rep Power: 8
florian_krause is on a distinguished road
Quote:
Its just a dimensionScalar with the dimensions of velocity, see defintion of utauTmp. Its not a class with a member value().
OK now I should say sorry for the non-sense...

It is a class, would have to check the documentation for the exact definition... but think it comes from the generic dimensioned Type class dimensioned<Type> with member function value(). That means, if you only use uTauAvg it will output name, value and dimension.

Even I am not a C++ expert...
sorry again!
florian_krause is offline   Reply With Quote

Old   July 13, 2011, 05:09
Default
  #30
Member
 
Join Date: Oct 2010
Location: Stuttgart
Posts: 35
Rep Power: 6
grandgo is on a distinguished road
hi florian,

i'm struggling with the modification

the thing is: i'm not changing much at all and it still doesn't work.

here is what i changed in the createFields.H file:

Code:
        autoPtr<incompressible::LESModel> sgsModel
        (
            incompressible::LESModel::New(U, phi, laminarTransport)
        );
and in the .C file i substituted RASModel->nu() with sgsModel->nu().
that's all.

the openfoam version is 1.7.1.
i used the utility with the tutorial case: /incompressible/pisoFoam/les/pitzDaily, too. no chance.

i dont understand this.

EDIT: i think, my problem is history.

these two lines in the modified utility caused the problems in my case:

Code:
1) yPlus = y.y() * uTauAvg / nuEff;
2) uPlus = U / uTauAvg;
the problem with the first line was, that i used nuEff instead of sgsModel->nu(). and nuEff did become zero (nuEff = nu + nuSgs, with negative values of nuSgs possible). so i changed to sgsModel->nu().

the second line caused problems, because uTauAvg was zero at time = 0. as florian assumed, my 0/U internelField value is (0 0 0). so the solution is either to change the internalField value, or, as i did, change the code of the utility a little bit:


Code:
timeSelector::addOptions(false, true);
now the 0 directory is excluded in the calculation and everything is fine.

best
grandgo

Last edited by grandgo; July 13, 2011 at 12:15.
grandgo is offline   Reply With Quote

Old   November 17, 2011, 18:05
Default plusPostRANSUtitility for OF 2.0
  #31
New Member
 
Jörn Nathan
Join Date: Aug 2011
Location: Montréal
Posts: 11
Rep Power: 6
jona is on a distinguished road
Hi *,

for converting the code of Florian to OF 2.0, "RASModel->nu()" had to be explicitely treated as "volScalarField&".

The corrected code is attached.

Have fun,

Jona
Attached Files
File Type: zip plusPostRANSUtility2.0.zip (3.3 KB, 235 views)
owayz, calim_cfd and Sunxing like this.
jona is offline   Reply With Quote

Old   March 8, 2012, 06:28
Default
  #32
New Member
 
Elia Daniele
Join Date: Mar 2010
Location: Oldenburg
Posts: 21
Rep Power: 7
fakekarma is on a distinguished road
Hi jona,

I've tried to build the utility as follow:

:~/OpenFOAM/OpenFOAM-2.0.1/applications/utilities/postProcessing/wall/plusPostRANS$ wmake libso
wmakeLnInclude: linking include files to ./lnInclude
Making dependency list for source file plusPostRANS.C
SOURCE=plusPostRANS.C ; g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3 -DNoRepository -ftemplate-depth-100 -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/meshTools/lnInclude -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/transportModels -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/turbulenceModels -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/turbulenceModels/incompressible/RAS/RASModel -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/turbulenceModels/incompressible/LES/LESModel -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/turbulenceModels/LES/LESdeltas/lnInclude -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/finiteVolume/lnInclude -IlnInclude -I. -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/OpenFOAM/lnInclude -I/home/ag-peinke/OpenFOAM/OpenFOAM-2.1.0/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o Make/linux64GccDPOpt/plusPostRANS.o
'libNULL.so' is up to date.

so it seems to be no error, but I should now use it it, since it doesn't work simply typing plusPostRANS in the case folder. Should I do something more???

Thanks for your help,

Cheers,

Elia
fakekarma is offline   Reply With Quote

Old   March 8, 2012, 18:29
Default
  #33
Senior Member
 
Wouter van der Meer
Join Date: May 2009
Location: Elahuizen, Netherlands
Posts: 132
Rep Power: 8
wouter is on a distinguished road
hello,

type wmake, not wmake libso

hope this works
Wouter
wouter is offline   Reply With Quote

Old   March 9, 2012, 03:47
Default
  #34
New Member
 
Elia Daniele
Join Date: Mar 2010
Location: Oldenburg
Posts: 21
Rep Power: 7
fakekarma is on a distinguished road
Hallo Wouter,
with the command "wmake" works as it should for compiling.
Thanks very much.

Elia
fakekarma is offline   Reply With Quote

Old   April 16, 2012, 17:24
Default
  #35
Senior Member
 
chegdan's Avatar
 
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 548
Rep Power: 18
chegdan will become famous soon enough
Hello All,

First of all, thanks to Florian for making this, I have used some other yPlus utilities floating around here and this one was particularly interesting. I was attempting to get a uPlus and yPlus for something other than a pipe flow and I have been reading this thread thinking about the problem. Have made a modification to the plusPostRANSUtility utility provided (for OF 2.1.x) and I nearly get the same answer on Florian's test case (running pisoFoam) with my utility and his. However, it is (edit was) dreadfully slow since it searches for the nearest uTau over all wall faces for each cell.

Right now it calculates a new y value (we will call it cellToFaceDistance), compares it to the current already calculated y value created using wallDist, and if there is a user specified fraction difference (i.e. (cellToFaceDistance-y)/cellToFaceDistance) than it is close enough and grabs that uTau for that cell and stops searching.

I have uploaded the code to github and it can be downloaded with

Code:
git clone git://github.com/chegdan/yPlusUplus.git
It is currently made for OF 2.1.x

EDIT: However, after thinking a bit...I'm not quite sure if this sort of u+ vs y+ is useful in cases where there is boundary layer separation around objects. For something where the streamlines are nice close to the object, it makes sense. For something with separation, it may not be best to non-dimensionalize the velocity field with respect to the friction velocity but the mean velocity. Either way, it was a good bit of code and if anyone can find it useful, enjoy.

Cheers.
Dan
atg likes this.
__________________
Dan

Find me on twitter @dancombest and LinkedIn

Last edited by chegdan; April 17, 2012 at 21:06. Reason: adding more detail
chegdan is offline   Reply With Quote

Old   April 21, 2012, 12:58
Default
  #36
New Member
 
Arnout
Join Date: Nov 2010
Posts: 23
Rep Power: 6
The King is on a distinguished road
Hi! Did you found the error. I get the same, nothing found yet...
The King is offline   Reply With Quote

Old   June 11, 2012, 10:11
Default
  #37
Member
 
Eysteinn Helgason
Join Date: Sep 2009
Location: Gothenburg, Sweden
Posts: 52
Rep Power: 7
eysteinn is on a distinguished road
Quote:
Originally Posted by florian_krause View Post
Dear all,

This issue was already discussed in some length in various threads. Therefore I finally reviewed and attached my plusPostRANS utility.

It calculates y+ and u+ values when using one of the available low-Re RANS turbulence models. I hope the code as well as the output will be self-explaining

I also attached a case. It is a straight pipe (wedge) with periodic inlet/outlet boundary conditions. The Reynolds number based on the mean axial velocity is Re=5300. You can run the case using pisoFoam.

I would appreciate any feedback, it might be still improved at some point!

Best regards,
Florian
Hi Florian,

I have one question regarding your example case.
I noticed that you use zero gradient for epsilon and nut at the wall. Can you ellaborate on why that is?
(I somehow expected epsilon = 1e-9 or something small as you are solving for epsilon tilda and calculated for nut.)

Best regards,
Eysteinn
eysteinn is offline   Reply With Quote

Old   July 24, 2012, 22:33
Default
  #38
Senior Member
 
Awais Ali
Join Date: Feb 2010
Location: Germany
Posts: 127
Rep Power: 8
owayz is on a distinguished road
Send a message via MSN to owayz
Hi Jona and Florian,
Thanks for the utility I am sure it will help a lot of people.
I am also interested in calculating the y+ for my case. But I have compressible simulation.
I want to know two things:
1- If its a transient simulation shouldn't we use the mean values of U, rho and other variables?
2- How could I extend this utility to calculate the same numbers of compressible flow?

Regards,
Ali
owayz is offline   Reply With Quote

Old   July 26, 2012, 08:42
Default Compressible y+
  #39
Senior Member
 
Awais Ali
Join Date: Feb 2010
Location: Germany
Posts: 127
Rep Power: 8
owayz is on a distinguished road
Send a message via MSN to owayz
Hi,
I have made some small changes in the utility, developed by Florian/Jona. I have tried to make it work with compressible simulations.
Please check it, if you see its working as it is supposed to work.
Regards,
Awais Ali
P.S: For my case it reports a very low y+ values on the wall (unexpectedly). But the value that it writes seems to be Ok.
Attached Files
File Type: zip compressiblePlusPostRANS.zip (6.4 KB, 48 views)
owayz is offline   Reply With Quote

Old   August 13, 2012, 18:56
Default compressibleyPlusLES
  #40
Senior Member
 
Awais Ali
Join Date: Feb 2010
Location: Germany
Posts: 127
Rep Power: 8
owayz is on a distinguished road
Send a message via MSN to owayz
Hi All,
I have written this utility (again by modifying the utility previously developed) to calculate y+ and u+ values for compressible LES simulation.
Please let me know if you find this utility working. For me its working fine. I have used on my own case. The yPlus values are as they were expected to be.

Regards,
Awais
Attached Files
File Type: zip compressibleyPlusLES.zip (3.5 KB, 63 views)
owayz is offline   Reply With Quote

Reply

Tags
low-re rans, y+ value

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Low values of Lift force vmlxb6 CFX 1 February 2, 2011 06:13
Incompressible Turbulence models achinta OpenFOAM 4 May 27, 2010 10:35
turbulence models? haider FLUENT 0 March 8, 2006 00:58
Turbulence Models and external flow. Alan FLUENT 3 November 22, 2005 05:46
Turbulence boundary values lego CFX 9 October 25, 2002 11:55


All times are GMT -4. The time now is 01:10.