CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Running, Solving & CFD (http://www.cfd-online.com/Forums/openfoam-solving/)
-   -   Swak4Foam/GroovyBC for total pressure in simpleFoam (http://www.cfd-online.com/Forums/openfoam-solving/129672-swak4foam-groovybc-total-pressure-simplefoam.html)

fivos February 10, 2014 13:05

Swak4Foam/GroovyBC for total pressure in simpleFoam
 
Hi to everyone,

I am trying to set up a case where I define the total pressure at the inlet and the static pressure at the outlet of the computational domain. I am working with the simpleFoam solver and since it does not support total pressure BCs I am trying to implement the condition using Groovy BC.

So, since simpleFoam works using kinematic pressure (p/rho) instead of the actual pressure, the formula for the kinematic total pressure is:

ptot = p + 1/2 * |u|^2 (all p refer to kinematic pressures)

thus I have to set on the boundary the value of p = ptot - 1/2* |u|^2. I tried to do so in the following way, but it does not work:

(the following is the relevant entry in the p file of the '0' folder for simpleFoam)
Code:

 
 inlet
    {
        type            groovyBC; 
        variables     
        (
              "ptotal=3444476.5;"
              "umag=average(mag(U()));"
              "pstatic=max(0,ptotal-0.5*pow(umag,2));"
        )
        valueExpression "pstatic";
        value          uniform 3444476.5;
    }

I get errors at mag(U()):

Code:

--> FOAM FATAL ERROR:
 Parser Error for driver PatchValueExpressionDriver at "1.14" :"syntax error, unexpected '('"
"average(mag(U()))"
              ^
---------------|

I have tried using velocity as U, withouth the parenthesis, but still it does not work; it may not crash, but the results I get are incorrect.

How should I define the velocity vector, in order to get the average velocity magnitude on the face, so that I can use it for the calculation?

Thanks in advance.

fivos February 11, 2014 07:10

It seems that the problem I have is more complicated...
I tried to replace the condition at inlet with something much simpler, but it does not work either.

The new boundary condition I use is (as before this is from the p entry in the 0 folder):

inlet
{
type groovyBC;
variables "pressure=6722.237;"
valueExpression "pressure";
value uniform 6722.237;
}

This condition of course is the trivial fixed value. However, upon execution, after the first iteration, the value of pressure at the boundary is 0, which obviously is not what is defined in the groovyBC...

Regarding the compilation of the swak4Foam package, I did not get any errors (apart from the issue with the python configuration, but I am not interested in python integration right now) and I have all the relevant libraries generated.

Of course I have the required libraries included in the controlDict file:

libs (
"libOpenFOAM.so"
"libsimpleSwakFunctionObjects.so"
"libswakFunctionObjects.so"
"libgroovyBC.so"
);

A final note: I am using OpenFoam 2.2.x and for swak4Foam I use the version from Bruno (post#8 - http://www.cfd-online.com/Forums/ope...tml#post434217, as suggested by the relevant page in the wiki http://openfoamwiki.net/index.php/Contrib/swak4Foam).

Any ideas on that?

fivos February 13, 2014 06:57

Ok, after some searching I have found the solution of the problems. First of all when closing the variables section there should be a semicolon.

For the pressure/total pressure boundary conditions it seems that it is more stable to dynamically alter the velocity on the boundary according to the local pressure, instead of pressure itself; the reason is that when fixing pressure at the inlet, there might be development of unphysical recirculation which destabilize the solution. By altering the velocity (and keeping zero gradient for pressure) at inlet the solution is much stabler.

For fixing pressure, by dynamically altering the velocity the condition is:

Code:

 
  inlet
    {
    type            groovyBC;
    value          uniform (-0.65 0 0);
    variables   
    (   
        "ptarget=344447.65;"
        "umag{inlet}=sum(mag(U)*mag(Sf()))/sum(mag(Sf()));"
        "pstat{inlet}=sum(p*mag(Sf()))/sum(mag(Sf()));"
        "pdiff=(ptarget-pstat)/ptarget;"
        "relax=0.1;"
        "uvel=(umag+pdiff*relax);"
    );
    valueExpression    "vector(-uvel,0,0)"; 
    }

Similarly, to fix total pressure by dynamically altering the velocity:

Code:


  inlet
    {
    type            groovyBC;
    value          uniform (-0.5 0 0);
    variables   
    (   
        "ptot_target=344447.65;"
        "umag{inlet}=sum(mag(U)*mag(Sf()))/sum(mag(Sf()));"
        "pstat{inlet}=sum(p*mag(Sf()))/sum(mag(Sf()));"
        "ptot=pstat+0.5*umag*umag;"
        "pdiff=(ptot_target-ptot)/ptot_target;"
        "relax=0.1;"
        "uvel=(umag+pdiff*relax);" 
    );
    valueExpression    "vector(-uvel,0,0)"; 
    }

Note that groovyBC should be installed to use the above with simpleFoam.
Hope it will be useful for others...

gschaider February 13, 2014 20:12

Quote:

Originally Posted by fivos (Post 474778)
Ok, after some searching I have found the solution of the problems. First of all when closing the variables section there should be a semicolon.

For the pressure/total pressure boundary conditions it seems that it is more stable to dynamically alter the velocity on the boundary according to the local pressure, instead of pressure itself; the reason is that when fixing pressure at the inlet, there might be development of unphysical recirculation which destabilize the solution. By altering the velocity (and keeping zero gradient for pressure) at inlet the solution is much stabler.

Just stumbled on this thread. Glad this is solved. Just one question: you really want to calculate these things on "average over the whole patch" and not on a "per face" basis? Because then a valueExpression "ptot-0.5*pow(mag(U),2)" should be sufficient

fivos February 14, 2014 08:44

Hi Bernhard,

The idea to average on the face was to enhance stability. I could (or anyone else interested) try the per face calculation, instead of the per patch averaging and see what I get, but the results I got were really satisfactory. I will keep it in mind for any future calculations.

So thank you for your comment and also I would like to particularly thank you for your contribution as a whole (I refer to swak4Foam).

gschaider February 14, 2014 12:51

Quote:

Originally Posted by fivos (Post 474946)
Hi Bernhard,

The idea to average on the face was to enhance stability. I could (or anyone else interested) try the per face calculation, instead of the per patch averaging and see what I get, but the results I got were really satisfactory. I will keep it in mind for any future calculations.

OK. Depends on the circumstances but maybe using the new pressure only as a fraction might help here. You could introduce a storedVariable pOld and then do in the variables something like (only a sketch): "pNew= <that is 'your' pressure>;" "pVal=f*pNew+(1-f)*pOld;" "pOld=p;". pVal will be used in the valueExpression. If everything runs smooth pVal will approach pNew in a few timesteps. If it doesn't then pVal will at least be 'smoother'

For usage of storedVariables see the incomplete reference guide and examples


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