CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   Degassing Boundary Condition (https://www.cfd-online.com/Forums/openfoam-programming-development/166566-degassing-boundary-condition.html)

 Lokati February 12, 2016 03:11

Degassing Boundary Condition

Hey guys,

i am using interFoam and i want to implement a very simple degassing boundary condition.
I would like to use pressureInletOuteltVelocity-BC or inletOutlet-BC or directionMixed-BC.
I want an outlet-BC which only lets the fluid (Gas and Liquid) out, if the alpha-value is < 0.2.

I think accesing to the patch values of alpha is not the main problem.
The most important problem is which boundary should I use?
And how do I have to change the variables of the BC? (valuefraction, phip, refValue, refGradient, or maybe other variables?

Best regards,

Timucin

 Lokati February 14, 2016 07:47

Detail information/example

For example pressureInletOutletVelocity:

The main Part ist this:
************************************************** **********

void Foam::pressureInletOutletVelocityFvPatchVectorFiel d::updateCoeffs()
{
if (updated())
{
return;
}

const fvsPatchField<scalar>& phip =
patch().lookupPatchField<surfaceScalarField, scalar>(phiName_);

valueFraction() = neg(phip)*(I - sqr(patch().nf()));

directionMixedFvPatchVectorField::updateCoeffs();
directionMixedFvPatchVectorField::evaluate();
}

************************************************** **********

So here is my idea, but i need help for this (i think simple problem):

void Foam::pressureInletOutletVelocityFvPatchVectorFiel d::updateCoeffs()
{
if (updated())
{
return;
}

const fvsPatchField<scalar>& phip =
patch().lookupPatchField<surfaceScalarField, scalar>(phiName_);

]const fvPatchField<scalar>& alpha1 = patch().lookupPatchField<volScalarField, scalar>("alpha1");
forAll (*this, i)
{

if (alpha1[i] < 0.2)
{

valueFraction[i]= 0;
(but it does not work, because it is a tensor, maybe i have do something with the values of the variable phip?? or patch.nf??or something else with valueFraction??? )

}

}

}

valueFraction() = neg(phip)*(I - sqr(patch().nf()));

directionMixedFvPatchVectorField::updateCoeffs();
directionMixedFvPatchVectorField::evaluate();
}

Best regards

Timucin

 bigphil February 15, 2016 05:40

Hi Lokati,

I'm not sure I fully follow what you are trying to do, but to get your code to compile you can set the valueFraction to be a zero symmTensor:

Quote:
 Originally Posted by Lokati (Post 585106) [code] ... forAll(*this, i) { if (alpha1[i] < 0.2) { valueFraction[i]= symmTensor::zero; } } ... // but this line would overwrite the valueFraction... valueFraction() = neg(phip)*(I - sqr(patch().nf())); directionMixedFvPatchVectorField::updateCoeffs(); directionMixedFvPatchVectorField::evaluate(); }
Philip

 Lokati February 15, 2016 06:01

Hi Phil,

in really simple words:

Let fluid out if alpha < 0.2
Do not let fluid out if alpha > 0.2.

I think this would be an outlet boundary condition, which acts like a fixedValue (nothing of the fluid goes out) for alpha values > 0.2.

But if the alpha value is < 0.2 the boundary should let fluid out.
Please let me know, if there is still something unclear.

Best regards,
Timucin

 Lokati February 15, 2016 08:09

Hi Philip,

thank you for the line:
[I]valueFraction= symmTensor::zero;
But this has not the effect that i need.

I would like to implement an outlet boundary condition, which lets the fluid out, if the alpha value is < 0.2 and forbid the fluid to get out, if the value is > 0.2.

Maybe i just have to include/add the alpha value somewhere in this line:

valueFraction() = neg(phip)*(I - sqr(patch().nf()));

But where do i have to change something in that line to achieve that kind of outlet boundary.

in simple words:

if alpha < 0.2 fluid can get out
if alpha > 0.2 fluid can not get out

Best regards,

Timucin

 chriss85 February 15, 2016 10:06

I am also interested in this topic. Currently I'm using source terms in the first cell layer next to the boundary, but this is problematic because it leads to the requirement to include additional source terms in the enthalpy equation and the handling of the momentum is also complicated. In my case, I know a specific evaporation/ablation rate in mass/area/time. Using the patch face areas this quantity can be converted to a mass source term. The question is how to include this in a boundary condition? It also needs to work with supersonic flows in my case.

 Lokati February 18, 2016 04:28

Hey people,

Best regards,
Timucin

 Lokati February 24, 2016 09:29

Hey guys,

in the BC pressureNormalInletOutletVelocity.H there is written:
A zero-gradient condiion is applied for outflow.....

What do i have to do if i want to switch between fixedValue and zeroGradient depending on the alpha value (interFoam)?

In the BC freestream there is a switch between fixedValue and zeroGradient but i do not understand how it is done in detail and how i could use it for my problem with interFoam (and alpha values).

In simple words:
I need a BC for velocity which changes between fixedValue and zeroGradient depending on the alphaValue (interFoam)?

Best regards,
Timucin

 bigphil February 24, 2016 15:23

Quote:
 Originally Posted by Lokati (Post 586668) Hey guys, in the BC pressureNormalInletOutletVelocity.H there is written: A zero-gradient condiion is applied for outflow..... What do i have to do if i want to switch between fixedValue and zeroGradient depending on the alpha value (interFoam)? In the BC freestream there is a switch between fixedValue and zeroGradient but i do not understand how it is done in detail and how i could use it for my problem with interFoam (and alpha values). In simple words: I need a BC for velocity which changes between fixedValue and zeroGradient depending on the alphaValue (interFoam)? Best regards, Timucin
Hi,

You could do the following:
Code:

```forAll(*this, faceI) {     if (alpha[faceI] > 0.2)     {         // Set face to fixedValue in all three directions         valueFraction()[faceI] = I;         // Set fixedValue on the face to whatever you like         refValue()[faceI] = vector(1,2,3);     }     else     {         // Set face to fixedGradient in all three directions         valueFraction()[faceI] = symmTensor::zero;         // Set fixedGradient on the face to whatever you like (zero if you like)         refGrad()[faceI] = vector::zero;     } }```
Note: if you wanted to set the normal component of velocity as opposed to the entire vector, you can set valueFraction to "sqr(patch().nf())": this would set the normal component to fixedValue and the tangential components would be fixedGradient. The valueFraction lets you blend between fixedValue and fixedGradient.

Philip

 Lokati February 25, 2016 09:15

Hi Philip,

May I ask you one more thing?

The absolut correct implementation I need would be to use “valueFraction = sqr(patch().nf())” in the for-loop.
But how do I have to add valueFraction = sqr(patch().nf()) in the for-loop?

Example:

forAll (*this, faceI)
{
if (alpha[faceI] > 0.2)
{
valueFraction()[faceI] = sqr(patch().nf());
}

else

{
valueFraction()[faceI] = symmTensor::zero;
}
}

I can not compile this example. In the line “valueFraction()[faceI] = sqr(patch().nf()); “ there is a mistake.
Have you got an idea?

Best regards,
Timucin

 bigphil February 25, 2016 10:17

Quote:
 Originally Posted by Lokati (Post 586826) Hi Philip, thank you for your reply. Everythink you said works very good!!!! May I ask you one more thing? The absolut correct implementation I need would be to use “valueFraction = sqr(patch().nf())” in the for-loop. But how do I have to add valueFraction = sqr(patch().nf()) in the for-loop? Example: forAll (*this, faceI) { if (alpha[faceI] > 0.2) { valueFraction()[faceI] = sqr(patch().nf()); } else { valueFraction()[faceI] = symmTensor::zero; } } I can not compile this example. In the line “valueFraction()[faceI] = sqr(patch().nf()); “ there is a mistake. Have you got an idea? Best regards, Timucin
Timucin,

Try this:
Code:

```// Calculate and store face unit normals const vectorField nf = patch().nf(); forAll(*this, faceI) {     if (alpha[faceI] > 0.2)     {         // Set face to fixedValue in normal direction         valueFraction()[faceI] = sqr(nf[faceI]);         // Set fixedValue on the face to whatever you like         // Note: only the normal component of this vector is actually used         refValue()[faceI] = vector(1,2,3);     }     else     {         // Set face to fixedGradient in all three directions         valueFraction()[faceI] = symmTensor::zero;         // Set fixedGradient on the face to whatever you like (zero if you like)         refGrad()[faceI] = vector::zero;     } }```
Philip

 Lokati February 25, 2016 12:10

Hi Philip,

I will test it as soon as possible. Thank you for your reply once again.

In the loop there you always wrote:

refValue()[faceI] = vector(1,2,3);

But which vector components do i have to use for my implementation?

Isn't it correct to use a refValue like this:
refValue()[faceI] = vector::zero;
OR ( I think it is the same):
refValue()[faceI] = vector(0,0,0);

Best regards
Timucin

 bigphil February 25, 2016 12:39

Quote:
 Originally Posted by Lokati (Post 586857) Hi Philip, I will test it as soon as possible. Thank you for your reply once again. In the loop there you always wrote: refValue()[faceI] = vector(1,2,3); But which vector components do i have to use for my implementation? Isn't it correct to use a refValue like this: refValue()[faceI] = vector::zero; OR ( I think it is the same): refValue()[faceI] = vector(0,0,0); Best regards Timucin
Hi Timucin,

Yes, this:
Code:

`refValue()[faceI] = vector::zero;`
is the same as this:
Code:

`refValue()[faceI] = vector(0,0,0);`
If you want to set the normal velocity then you could do this:
Code:

`refValue()[faceI] = normalVelocity*nf[faceI];`
where "normalVelocity" is the scalar normal velocity you would like to set.

Philip

 Lokati February 25, 2016 12:48

Hi Philip,

so when i use:

valueFraction()[faceI] = sqr(nf[faceI]);

Which refValue is correct or in other words which refValue correspond better to the valueFraction?
-->refValue()[faceI] = vector::zero; ?
-->refValue()[faceI] = normalVelocity*nf[faceI]; ?

Timucin

 Lokati February 26, 2016 00:22

Hi Philip,

If i want a ''no slip'' boundary condition ( like in a normal fixedValue-BC), which refvalue (See above) do i have to choose?

Best regards
Timucin

 Lokati February 26, 2016 02:32

Hi Philip,

If i use the pressureNormalInletOutletVelocity without changing it, it acts like a fixedValue-BC.

My question:
How could i change this BC to switch between fixedValue and zeroGradient depending on the alpha value ?

Thank you,

Best regards
Timucin

 Lokati March 22, 2016 02:19

Hi Phil,

everything works, thank you again.
I have a question about the theoretical background of the directionMixed-BC:

1) What does sqr(patch().nf()) do with the valueFraction, which components of the tensor(valueFraction) are modified?

2) What does valueFraction = symmTensor::zero do with the valueFraction. Does it make every component to zero?

Best regards,

Timucin

 bigphil March 22, 2016 05:34

Hi Timucin,

Philip

 Lokati March 22, 2016 05:45

Hi Phil,

that is great thank you.

What in detail means sqr? How can sqr(patch().nf()) make a fixedvalue (valueFraction = (1 0 0 1 0 1)) ?

Best regards,

Timucin

 bigphil March 22, 2016 05:49

Quote:
 Originally Posted by Lokati (Post 591030) Hi Phil, that is great thank you. What in detail means sqr? How can sqr(patch().nf()) make a fixedvalue (valueFraction = (1 0 0 1 0 1)) ? Best regards, Timucin
"sqr" means square i.e. "sqr(n) = n*n"

"valueFraction = sqr(n)" means fixedValue in the "n" direction and fixedGradient in the two orthogonal directions.

Philip

All times are GMT -4. The time now is 03:35.