CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Pre-Processing (https://www.cfd-online.com/Forums/openfoam-pre-processing/)
-   -   DirectionMixed mixed bc (https://www.cfd-online.com/Forums/openfoam-pre-processing/61989-directionmixed-mixed-bc.html)

evgenii December 12, 2005 14:33

Hi, all! I've got a questio
 
Hi, all!

I've got a question about directionMixed or mixed b.c.
I don't understand how to use it, because I need to specify four values:
refValue
refGradient
valueFraction
value
I haven't met any description of it neither in Programmers Guide, neither in Users Guide(only very brief).
I'll be very grateful if one can give me advice.
Thank you

hjasak December 12, 2005 18:16

Ok, here goes: 1) a mixed b
 
Ok, here goes:

1) a mixed boundary condition is a combination of a fixedValue and a fixedGradient boundary condition, controlled by the valueFraction variable.

For valueFraction = 1, the mixed b.c. behaves as fixedValue; for valueFraction = 0 you get the fixedGradient. Values in between are a blend of the two.

2) The mixed b.c. is therefore specified by three fields:

- a refValue field, giving the valud for the fixedValue part
- a refGrad field, giving the gradient for the fixedGradient part
- a valueFraction, telling the mixed b.c. what to do.

So far, so good.

For vectors and tensors in the mixed b.c., the "mix" will be the same on all components of a vector or a tensor.

3) the directionMixed boundary condition is done along the same lines, but it also allows the directional decomposition. Thus, for a vector, the b.c. is decomposed into the normal and tangential component.

For the normal component, the directionMixed b.c. behaves like the mixed condition (above), but only on the normal component. For the tangential component, the condition is always a fixedGradient b.c.

Finally, the value part of the b.c. codes in the current boundary value.

4) If this is not enough for you (there is another possibility), I have written a newDirectionMixedFvPatchField boundary condition, with 4 components. Unlike the above one, this b.c. allows both the normal and tangential condition to be mixed separately between the fixedValue and fixedGradient b.c. with two blending factors. You need this kind of thing for contact problems with friction and large deformation and similar. In my version, the stuff lives in:

OpenFOAM-1.2/applications/solvers/newStressAnalysis/materialModels/newDirectionM ixed

Enjoy,

Hrv

evgenii December 15, 2005 06:18

Thank you so much for such a d
 
Thank you so much for such a detailed answer!
I realise that I need 4th possibility, I mean to set conditions on normal and tangential components separately. Unfortunately I don't have the directory you've mentioned. Maybe because I have an old version of OpenFoam. Where can I find this files?

Thank you, Eugene

mehulkumar February 25, 2009 06:17

Hi..guys, I have a fixed grid
 
Hi..guys,
I have a fixed grid over an airfoil naca0012 in o-topology in circular domain.

I want to specify boundary condition farField kind, so depending the velocity with angle of attack, it should decide the inlet and outlet for the case.

I found that patch -> mixed / directionMixed type can help me in such case.

Can you give me suggestion?

Thanks...

mehulkumar February 26, 2009 08:58

Hi ..guys...pls help...I am st
 
Hi ..guys...pls help...I am stuck here.
I am not getting how to use these BCs.
Pls guide me.

Thanks

fgal April 15, 2010 07:28

Hi,
Is it possible to force zeroGradient and a fixedValue for the temperature field in an inlet for example?
Because I would like to prevent the energy flux go out through a fuel inlet for a combustion and fo fix the temperature of the inlet gases.
Thanks

Francois

ziemowitzima August 17, 2010 14:54

Hi all,
Could anyone of you give me an example of usage directionMixed type boundary condition ?
I would like to see exemplary syntax .
I tryied for example like that:
{
type directionMixed;
refValue uniform (0 0 0);
refGradient uniform (1000 0 0);
valueFraction 1;
value uniform (1000 0 0);
}

but I got error .

Thanks

poplar August 19, 2010 06:33

Quote:

Originally Posted by ziemowitzima (Post 271765)
Hi all,
Could anyone of you give me an example of usage directionMixed type boundary condition ?
I would like to see exemplary syntax .
I tryied for example like that:
{
type directionMixed;
refValue uniform (0 0 0);
refGradient uniform (1000 0 0);
valueFraction 1;
value uniform (1000 0 0);
}

but I got error .

Thanks


Hi,ziemowit
valueFraction must be symmTensorField, not a scalar.


I have a question on Hrvoje's comment that " For the normal component, the directionMixed b.c. behaves like the mixed condition (above), but only on the normal component.". In directionMixedFvPatchField.C:
....
normalValue = transform(valueFraction_, refValue_);
gradValue = pif + refGrad_/this->patch().deltaCoeffs();
transformGradValue = transform(I - valueFraction_, gradValue);
return (normalValue + transformGradValue - pif)*this->patch().deltaCoeffs();
........

From above codes, normalValue is a vector component normal to transformGradValue. So the normalValue is not normal to B.C., is it right?

and in pressureInletOutletVelocityFvPatchVectorField.C which is derived from directionMixed:
........
valueFraction() = neg(phip)*(I - sqr(patch().nf()));
........
normalValue = transform(valueFraction(), refValue());
transformGradValue = transform(I - valueFraction(), pvf);
operator=(normalValue + transformGradValue);
........

So the valueFraction() is a tensor to calculate the component normal to nf(). Then normalValue[=refV-(n & refV)*n=(I-nn)*refV] is normal to nf() and transformGradValue[=nn*pvf=(n & pvf)*n] is parallel to nf()?

"normalValue" give me the first guess is that it is normal to B.C., but now I am confused by above codes. If "normalValue" is not normal to B.C., then what does tangentialVelocity mean? tangential to nf()?

in pressureInletOutletVelocityFvPatchVectorField.C:
setTangentialVelocity(const vectorField& tangentialVelocity)
{
tangentialVelocity_ = tangentialVelocity;
vectorField n = patch().nf();
refValue() = tangentialVelocity_ - n*(n & tangentialVelocity_);
}

These codes let me confused. If tangentialVelocity_ is tangential to B.C., then it normal to n, so (n & tangentialVelocity_) should be zero. one gets refValue() = tangentialVelocity_. If tangentialVelocity_ is tangential to n, n*(n & tangentialVelocity_) = tangentialVelocity_, then one gets refValue() = 0.

Briefly,my question is:
normalValue is normal to which one, nf() or B.C.?

T.D. September 29, 2010 09:36

help
 
hi,
what if i need to apply a certain value of a VectorField on one direction only, let's say if:

volVectorField V;

and i need to apply a BC where Vy =0 only;
????


help please

ziemowitzima October 1, 2010 04:21

Hi TD,
U can use DirectionMixed bc.
here u have working example:

patch_name
{


type directionMixed;
refValue uniform (0 0 0);
refGradient uniform (1000 0 0);
valueFraction uniform (0 0 0 0 0 1);
}

here it means that bc are as follows v=(v1,v2,v3):
1) dv1/dz = 1000 (v1 is tangent vector component to the boundary and z is normal direction to the boundary),

2) dv2/dz = 0 (v2 is second tangent vector component to the boundary and z is normal direction to the boundary)

3) v3=0 (v3 is normal vector component, dirichlet type bc).

In general you have 3 directions and 3 vector component, thats why there is tensor:
valueFraction uniform (0 0 0 0 0 1)

Best
ZM

T.D. October 1, 2010 05:40

Quote:

Originally Posted by ziemowitzima (Post 277375)
Hi TD,
U can use DirectionMixed bc.
here u have working example:

patch_name
{


type directionMixed;
refValue uniform (0 0 0);
refGradient uniform (1000 0 0);
valueFraction uniform (0 0 0 0 0 1);
}

here it means that bc are as follows v=(v1,v2,v3):
1) dv1/dz = 1000 (v1 is tangent vector component to the boundary and z is normal direction to the boundary),

2) dv2/dz = 0 (v2 is second tangent vector component to the boundary and z is normal direction to the boundary)

3) v3=0 (v3 is normal vector component, dirichlet type bc).

In general you have 3 directions and 3 vector component, thats why there is tensor:
valueFraction uniform (0 0 0 0 0 1)

Best
ZM

hi thanks a lot,
but can you specify please what each term means and inside brackets in
refValue uniform (0 0 0);
refGradient uniform (1000 0 0);
valueFraction uniform (0 0 0 0 0 1);

why dv1/dz=1000 ? shouldn't be dv1/dx=1000 ?

help

thanks

ziemowitzima October 1, 2010 09:34

Hi,
This was just example I used to work with.
It could be dv1/dx as well, depending what ones need.
for detailed description see hjasak post at the top.

ZM

T.D. October 1, 2010 11:37

thanks
 
thanks a lot

AcfdO November 4, 2010 20:08

Hi everyone,

I have read all the posts but I am still confused about mixed and directionMixed boundary conditions. I would be grateful if anyone could help me understand this matter by simply give an example about how I can set only du/dy=0 (I don't want to set other gradients to zero)
velocity field is ( u, v,w)
direction is: (x,y,z)
Thank you
Amin

gpextra July 14, 2011 09:35

directionMixed b.c.
 
Dear Foamers,

During the last two days I have intensively struggled to understand the role of the valueFraction keyword in the directionMixed boundary condition. I have read all the posts about it, I have run several cases with the most diverse situations but no, the role of each one of the 6 components of valueFraction remains a mystery.

Posts from Jasak and Malecha, above, have been of great help, but did not entirely clarified the matter. Also similar requests from other users have been systematically ignored.

So, is it possible to someone kindly post exactly how this tensor-like valueFraction should be set for any case? Or, in other words, which values correspond to the normal component, which correspond to the tangential components?

To be even more specific, my case is of an impermeable wall (zero normal velocity) but with a given shear-stress (i.e., given velocity gradient). During my several tries I noticed that, even when the results seem to be +/- correct, there are streamlines dying at and originating from the wall, which is unexpected.

Regards.
G.Paulo.

bigphil July 14, 2011 14:57

Hi G. Paulo,


I occasionally use directionMixed for stress simulations where I want a fixedValue (displacement) in the patch normal direction and some fixedGradient (traction) in the patch tangential direction.

So to achieve a fixedValue in the normal direction, and a fixedGradient in the tangential direction on a patch, then the valueFraction (which is a symmTensor, where the components of a symmTensor are (xx xy xz yy yz zz) ) should be set:
valueFraction = symm(n*n)
where n is the patch normal.

If your patch faces all have the same normal then you can calculate symm(n*n) by hand and put it in your initial conditions, eg:
for a patch with n = ( 1 0 0 )
then the valueFraction = symm( (1 0 0)(1 0 0) ) = ( 1 0 0 0 0 0)
then refValue will be enforced in the patch normal direction and refGradient will be enforced in the patch tangential direction.

If your patch faces have all different normals then you will have to set the patch valueFraction in the solver (using refCast etc.) to be symm(n*n).

So to sum up, if you want a fixedValue in the patch normal direction and a fixedGradient in the patch tangential direction then it looks like this:
refValue uniform (fixed_value_you_want)
refGradient uniform (shear_gradient_you_want)
valueFraction uniform (symm(n*n))

directionMixed can also be used for other situations:
it can act just like a fixedValue BC if valueFraction = (1 0 0 1 0 1),

Or, it can act just like a fixedGradient BC if valueFraction = (0 0 0 0 0 0).

If you look at the directionMixed BC source code, you can see it calculates it.


Hope it helps,
Philip

gpextra July 15, 2011 03:40

directionMixed b.c.
 
Thank you for your post, Philip. Things are clear now.

G.Paulo.

nlc October 20, 2011 00:46

Hi Philip, Thank you for your great post. I would like to fix different gradient value on each tangential direction. Is it possible to do that with directionMixed or an other tool in OpenFoam. Or should I make a new mixed boundary condition to do something like this ??

Or maybe, I just need to change the value of refGradient to achieve this.

Thanks in advance for the answer

Nicolas L.

bigphil October 20, 2011 06:58

Hi Nicolas,

Yes it is possible, using directionMixed, to give every face on a boundary patch a different gradient in the tangential direction. I would do something like this in a header file at the start of a time-step (although it might be possible to use groovyBC but I am not sure):

Code:

label patchID = mesh.boundaryMesh().findPatchID("patchOfInterest");
if(patchID == -1)
 {
    Info << "patch not found" << endl;
    return 0;
 }

directionMixedFvPatchVectorField& Upatch =
        refCast<directionMixedFvPatchVectorField>
        (
        U.boundaryField()[patchID]
        );

//- patch face normals     
vectorField n = mesh.boundary()[loadingIndex].nf();
     
//- set value fraction so as to have fixed value in patch normal direction
Upatch.valueFraction() = symm(n*n);

//- set fixed value
Upatch.refValue() = vector (0, 0, 0); //- put what ever vectorField you want here

//- set fixed gradient (as a function of position and time as an example)
const vectorField& patchFaceCentres = mesh.boundaryMesh()[patchID].faceCentre();
Upatch.refGradient() = patchFaceCentres * runTime.value();

By the way, "U" is my solution variable above.

Hope this helps,
Philip

nlc October 20, 2011 10:59

Thank you for the fast answer. I will try it in a new Boundary condition. Base on directionMixed this is very nice of you.

An other question: In the constructors is it possible to call the "grand mother" constructor instead of the mother constructor in order to fix a default value for the mother class ???

For example in a class that depend on fixed Gradient I put

fvPatchFieldScalar(p, iF, dict),
gradient_(dict.lookupOrDefault<scalar>("gradient",0))

instead of

fixedGradientFvPatchScalarField(p, iF, dict),

in one of the constructor.

Regards

bigphil October 20, 2011 11:06

Nicolas,

I am not too familiar with writing a boundary condition but I think you can call the mother constructor to set gradients etc (see $FOAM_SOLVERS/newStressAnalysis/materialModels/fvPatchFields/tractionDisplacement/tractionDisplacementFvPatchVectorField.C in OpenFOAM-1.6-ext which is derived from fixedGradient).

Philip

nlc October 20, 2011 11:35

Great example Tanks

AlmostSurelyRob February 5, 2012 09:35

I would like to implement Newton's law of cooling. This is a type of Robin boundary condition, which is specified by

\frac{\partial T}{\partial n} = -(h A/k) (T_w - T_{ref})

where h, A, k are problem constants, n is the normal to the boundary and T is the temperature. The subscript w, means wall temperature and ref is the reference ambient temperature.

I would be happy to implement and test this, but I would need to understand the code a little bit more. Can mixed boundary condition simulate that kind of behaviour?

Essentially I would like to have a basic BC that allows to specify a b and g as described here:
http://en.wikipedia.org/wiki/Robin_boundary_condition

I would be obliged for any hints.

AlmostSurelyRob February 5, 2012 10:47

Right... I think I've answered my questions now, although as a "home-grown" user and programmer of OF I will always appreciate any help and comments.

After analysis of the code in fixedGradient, fixedValue and mixed, I came to a conclusion that for my BC I need to express the functions snGrad and evaluate. One way to do it, is

  1. express the T_w in snGrad as T_p + \frac{\partial T}{\partial n} and do a bit of juggling with terms.
  2. express T_w in evaluate as T_p + approximation of gradient from neighbouring cells.
T_p is the internal value.


Is there anything else I should keep in mind? I don't quite understand what's the purpose of XCoeffs functions. Do I need to make alterations there as well?

Is it off-topic? Should I post in developers forum?

makaveli_lcf February 5, 2012 16:47

Hi Robert,

an explanation how to use modified mixed BC for your equation see
the post http://www.cfd-online.com/Forums/ope...tml#post295694

AlmostSurelyRob February 5, 2012 19:37

Thank you very much for the reply. Yes, I was actually thinking of expressing the equations in terms of the blending coefficient, but for some reason I thought it will not be possible. Clearly, I was wrong.

Incidentally, I've written my version of robinBC which evaluates the face value in exactly the same way. It calculates the gradient in a similar manner. It is a 1st order approximation. However, I have not touched XCoeff functions as I am still not sure what they do and my robinBC is not tested. The only positive is that it doesn't diverge when I run it with my case.

Now I could test it against this setting of mixed BC.

Many thanks.

makaveli_lcf February 5, 2012 19:42

The XCoeff (nice name:-)) functions update your diagonal elements of the linear system which you solve after all based on the BC type. And it uses either your value representation at the boundary for let's say convectional terms or gradient treatment for your diffusion terms.

AlmostSurelyRob February 6, 2012 06:55

Thanks again. The main advantage of my implementation, if it proves to work, should be an easier definition of the transfer coefficient. The mixed BC "hack" requires to specify delta which is the first cell centroid wall distance. I would like to get rid of that!

moun139 June 18, 2012 14:21

hi
 
how about mixed boundary condition in FLUENT code ,please ?

thank you

ziemowitzima July 31, 2012 12:56

Dear Bigphil

I tried your method to customize directionMixed BC but I could not compile my code.
I got following errors:

error: ‘directionMixedFvPatchVectorField’ was not declared in this scope
error: ‘loadingIndex’ was not declared in this scope
error: ‘const class Foam::polyPatch’ has no member named ‘faceCentre’

Do you know maybe what can be reason for that ?
Currently I am using 2.1.0 OpenFOAM.

Do you know maybe if it is possible to use groovyBC it this case ?

Best and thank you
ZM

ziemowitzima July 31, 2012 13:03

Dear Bigphil

I tried your method to customize directionMixed BC but I could not compile my code.
I got following errors:

error: ‘directionMixedFvPatchVectorField’ was not declared in this scope
error: ‘loadingIndex’ was not declared in this scope
error: ‘const class Foam:polyPatch’ has no member named ‘faceCentre’

Do you know maybe what can be reason for that ?
Currently I am using 2.1.0 OpenFOAM.

Do you know maybe if it is possible to use groovyBC it this case ?

Best and thank you
ZM

bigphil July 31, 2012 13:07

Hi ZM,

Actually there is a small mistake in my previous code snippet:
this line:
Code:

vectorField n = mesh.boundary()[loadingIndex].nf();
should be
Code:

vectorField n = mesh.boundary()[patchID].nf();
and
Code:

const vectorField& patchFaceCentres = mesh.boundaryMesh()[patchID].faceCentre();
should be
Code:

const vectorField& patchFaceCentres = mesh.boundaryMesh()[patchID].faceCentres();
And also, you need to tell your solver about the directionMixed class, so add the following line under #include "fvCFD.H":
Code:

#include "directionMixedFvPatchFields.H"
Philip

ziemowitzima July 31, 2012 13:31

Hi Philip
Thanks a lot !
There is one more error:
error: ‘Foam::directionMixedFvPatchVectorField’ has no member named ‘refGradient’

but I corrected it:
instead:
Upatch.refGradient() = patchFaceCentres * runTime.value();

should be:

Upatch.refGrad() = patchFaceCentres * runTime.value();
Thanks again
-ZM

bigphil July 31, 2012 13:39

Great,

hopefully it'll do what you want.

In answer to your earlier question, I would say that groovy/swak4Foam can more than likely do what you want also, but I have never used it.

Philip

Sherlock_1812 September 17, 2013 06:59

Greetings.

I have got a fairly clear idea about directionMixed Bc from this thread. Thank you!

I have one question though (may be trivial, but still).

What are the three components of the vector given as input to refGradient in cartesian notations? Example, if refGradient is (-1 0 0) is dv1/dx= -1 or dv1/dz?

How does one assign partial du/dy and/or partial dv/dx alone using this bc?

bigphil September 18, 2013 07:59

Quote:

Originally Posted by Sherlock_1812 (Post 452172)
Greetings.

I have got a fairly clear idea about directionMixed Bc from this thread. Thank you!

I have one question though (may be trivial, but still).

What are the three components of the vector given as input to refGradient in cartesian notations? Example, if refGradient is (-1 0 0) is dv1/dx= -1 or dv1/dz?

How does one assign partial du/dy and/or partial dv/dx alone using this bc?

Hi,

refGradient is (-1 0 0) means:
dvx/dn = -1
dvy/dn = 0
dvz/dn = 0
where vx, vy, vz are the cartesian components of vector field v (e.g. velocity) and n is the patch normal direction.

Keep in mind, the valueFraction will control the fraction of the refValue used and the fraction of the refGradient used.

Philip

Sherlock_1812 September 18, 2013 08:06

Thank you Philip!

Sherlock_1812 September 18, 2013 14:07

Quote:

Originally Posted by bigphil (Post 316165)
If your patch faces have all different normals then you will have to set the patch valueFraction in the solver (using refCast etc.) to be symm(n*n).

Hi Philip,

I'm not able to understand what changes are to be made to valueFraction in the above case (using refCast?). I have a curved patch where face normals are different for different faces, so I see that I should do what you've said. My C++ isn't that good. Can you elaborate?

If two faces in a patch have different normals n1 and n2, then the valueFraction is given by symm(n1*n2)? Is this right?

Thanks in advance,

bigphil September 19, 2013 06:11

Quote:

Originally Posted by Sherlock_1812 (Post 452422)
Hi Philip,
If two faces in a patch have different normals n1 and n2, then the valueFraction is given by symm(n1*n2)? Is this right?

It depends on what condition you want to impose;
in the case where you would like the normal component to be fixedValue and the tangential components to be fixedGradient then you fix the face valueFraction to be symm(n*n) where n is the face normal.

e.g.
if you have a list of faces (f1, f2, f3, …) with face normals (n1, n2, n3, …) then you would set the valueFractions to be symm(n1*n1), symm(n2*n2), symm(n3*n3), …

Philip

Sherlock_1812 September 19, 2013 07:51

Thank you for your quick reply Philip


All times are GMT -4. The time now is 11:05.