# Degassing Boundary Condition

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

 February 12, 2016, 03:11 Degassing Boundary Condition #1 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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 Zhiheng Wang likes this.

 February 14, 2016, 07:47 Detail information/example #2 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 For example pressureInletOutletVelocity: The main Part ist this: ************************************************** ********** void Foam:ressureInletOutletVelocityFvPatchVectorFiel d::updateCoeffs() { if (updated()) { return; } const fvsPatchField& phip = patch().lookupPatchField(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:ressureInletOutletVelocityFvPatchVectorFiel d::updateCoeffs() { if (updated()) { return; } const fvsPatchField& phip = patch().lookupPatchField(phiName_); ]const fvPatchField& alpha1 = patch().lookupPatchField("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(); } Please help. Best regards Timucin Zhiheng Wang likes this.

February 15, 2016, 05:40
#3
Super Moderator

Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,078
Rep Power: 33
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 [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

 February 15, 2016, 06:01 #4 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 February 15, 2016, 08:09 #5 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 February 15, 2016, 10:06 #6 Senior Member   Join Date: Oct 2013 Posts: 397 Rep Power: 17 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.

 February 18, 2016, 04:28 Please help #7 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 Hey people, Could someone please help, i am stuck in the problem i mentioned above. Best regards, Timucin Zhiheng Wang likes this.

 February 24, 2016, 09:29 #8 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

February 24, 2016, 15:23
#9
Super Moderator

Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,078
Rep Power: 33
Quote:
 Originally Posted by Lokati 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)
}
}```
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

 February 25, 2016, 09:15 #10 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

February 25, 2016, 10:17
#11
Super Moderator

Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,078
Rep Power: 33
Quote:
 Originally Posted by Lokati 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)
}
}```
Philip

 February 25, 2016, 12:10 #12 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

February 25, 2016, 12:39
#13
Super Moderator

Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,078
Rep Power: 33
Quote:
 Originally Posted by Lokati 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

 February 25, 2016, 12:48 #14 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 February 26, 2016, 00:22 #15 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 February 26, 2016, 02:32 #16 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 March 22, 2016, 02:19 #17 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

 March 22, 2016, 05:34 #18 Super Moderator     Philip Cardiff Join Date: Mar 2009 Location: Dublin, Ireland Posts: 1,078 Rep Power: 33 Hi Timucin, Please see this post. Philip

 March 22, 2016, 05:45 #19 New Member   Timucin Kislak Join Date: Feb 2016 Location: Germany Posts: 20 Rep Power: 9 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

March 22, 2016, 05:49
#20
Super Moderator

Philip Cardiff
Join Date: Mar 2009
Location: Dublin, Ireland
Posts: 1,078
Rep Power: 33
Quote:
 Originally Posted by Lokati 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

 Tags boundary, degas, interfoam, openfoam, outlet