Difference between revisions of "Contrib/groovyBC"

From OpenFOAMWiki
(groovyWaveTank)
m (Bison requirement)
Line 17: Line 17:
 
* especially for large cases a custom-made library might be more efficient
 
* especially for large cases a custom-made library might be more efficient
 
(it's like a Swiss Army Knife: useful for a lot of things, but not necessarily the best tool for these tasks)
 
(it's like a Swiss Army Knife: useful for a lot of things, but not necessarily the best tool for these tasks)
 +
 +
=== Pre-requisites ===
 +
 +
To compile this utility  [http://www.gnu.org/software/bison/ Bison] has to be installed. The compilation is known to work with version 2.4.1 and 2.3. It may probably work with older versions. Check with
 +
bison -V
 +
on the command line before trying to compile it and report the version number when reporting a problem.
  
 
== Usage ==  
 
== Usage ==  

Revision as of 15:08, 21 May 2009

Valid versions: OF version 15.png


1 Short description

A library that introduces a boundary-condition groovyBC. This boundary condition is basically a mixed-BC where value, gradient and valueFraction are specified as expressions instead as fields.

It can be used to set non-uniform boundary-conditions without programming.

This library is provided as-is and is a permanent Beta-Version (but it works fine for me, if it doesn't for you: tell me about it and I'll see what the problem is)

1.1 Words of warning

This library can save you the work to program your own boundary-conditions, but

  • you should be familiar with the C++ expression syntax
  • it makes it easier to 'shoot yourself in the foot' (do stupid things)
  • especially for large cases a custom-made library might be more efficient

(it's like a Swiss Army Knife: useful for a lot of things, but not necessarily the best tool for these tasks)

1.2 Pre-requisites

To compile this utility Bison has to be installed. The compilation is known to work with version 2.4.1 and 2.3. It may probably work with older versions. Check with

bison -V

on the command line before trying to compile it and report the version number when reporting a problem.

2 Usage

2.1 Compilation and installation

Just do

wmake libso

in the directory of the sources. The library will be compiled and installed in a place (%FOAM_USER_LIBBIN) where it is usable

2.2 Additions to controlDict

A function object is activated by adding an entry like this to the system/controlDict of a case:

libs ( "libgroovyBC.so" ) ;

If you are experiencing problems with paraFoam try this combination.

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

2.3 Usage of the boundary condition

Just set the type of a patch to groovyBC

2.4 Parameters in the patch

valueExpression 
String with the value to be used if a Dirichlet-condition is needed. Defaults to zero
gradientExpression 
String with the gradient to be used if a Neumann conditon is needed. Defaults to zero
fractionExpression 
Determines whether the face is Dirichlet (1) or Neumann (0). Defaults to 1
variables 
List with temporary variables separated by a semicolon. May make the writing of expressions shorter. Defaults to empty. Names defined here "shadow" fields of the same name
timelines 
List with subdictionaries that specify interpolation tables over time. See the original timeVaryingUniform-condition. Currently only scalars are allowed. The parameter name specifies the name under which this may be accessed. The name "shadows" fields of the same name

3 Expression syntax

The most complete documentation of the expression syntax is the source file for the Bison-grammar (*.yy and *.ll). Sorry.

These C++ operators are implemented:

+,-,*,/ 
Arithmetic operators. Can be used for vectors and scalars (only if useful. For instance: vectors can't be added to scalars)
 % 
A modulo-operator. Somehow differently defined from the standard C++ %-operator: the value of (x-\epsilon) % x is -\epsilon (not x-\epsilon - if you don't understand what I mean, please test for yourself - for most applications of this operator this is in my opinion the more practical implementation)
&,^ 
The vector operators as defined by OpenFOAM
<,>,<=,>=,!=,== 
Comparison operators (only defined for scalars)
&&,|| 
Logical Operators
Conditional operator
The conditional operator ( test ? val1 : val2) is defined for scalars and vectors

Operator precedence should be the same as for C++.

All the fields that are defined on the patch can be used. If the field is also the field that this is a BC for the old value is used.

These pseudo-variables are defined:

pi 
Guess ;)

These functions are defined:

pow,log,exp,sqr,sqrt,sin,cos,tan 
Only defined for scalars
mag 
defined for scalars and vectors
min,max 
minimum and maximum of a scalar field
sum 
sum of the values for a scalar field

These pseudo-functions are defined:

toPoint 
Takes a scalar (or vector) field defined on the faces and interpolates it to the points
toFace 
Takes a scalar (or vector) field defined on the points and interpolates it to the faces
pos 
Vector field with the face-centers
pts 
Vector field with the vertices
normal 
Vector field with the face normals
Sf 
field with the surface vectors (mag will give you the area)
rand 
Scalars-field with random numbers from [0,1]
randNormal 
Random-number scalar field that is Gauss-distributed
deltaT 
a field that returns the time-step
time 
a field that returns the current time

Advanced functions you're propably not going to need are:

Cn 
neighbour cell centers of the patch
delta 
Return patch weighting factors
weights 
Return cell-centre to face-centre vector

Functions that need another field are:

snGrad 
Gradient of that field
internalField 
internal values of that field
neighbourField 
neighbour values for a coupled patch

4 Usage Examples

4.1 Demo-Cases

There are three demo-cases include in the repository in a folder Demos with three demo cases. All of these cases only require a blockMesh.

Don't try to find experimental results for these cases. They are what the name of the folder says: Demos

The three cases are

4.1.1 pulsedPitzDaily

To be run with oodles. Runs the pitzDaily-case with a parabolic inlet condition that pulsates

   inlet           
   {
     type            groovyBC;
     variables "yp=pts().y;minY=toFace(min(yp));maxY=toFace(max(yp));para=-(maxY-pos().y)*(pos().y-minY)/(0.25*pow(maxY-minY,2))*normal();";
     valueExpression "10*(1+0.5*sin(500*time()))*para";
     value           uniform (10 0 0);
   }

on the outlet the regular inletOutlet-BC is emulated (just as a demonstration)

   outlet          
   {
     type            groovyBC;
     valueExpression "vector(0,0,0)";
     gradientExpression "vector(0,0,0)";
     fractionExpression "(phi > 0) ? 0 : 1";
     value           uniform (0 0 0);
   }


4.1.2 wobbler

A solidDisplacementFoam case where a bar that is fixed on one side is pushed according to a predefined timeline on a fraction of the boundary (the rest is zero gradient). On the relevant patch the boundary conditon for D is

 forced
 {
   type groovyBC;
   value uniform (0 0 0);
   //    valueExpression "vector(0,0.1*sin(time()),0)";
   timelines (
       {
           name impulse;
           outOfBounds clamp;
           fileName "$FOAM_CASE/impulse.data";
       }
   );
   valueExpression "-impulse*normal()";
   gradientExpression "vector(0,0,0)";
   fractionExpression "(time()<5) ? ((pos().x>0.45 && pos().x<0.55) ? 1 : 0) : 0";
 }

4.1.3 circulatingSplash

A interDyMFoam-case that crashes halfway through the calculation (but looks quite nice until then). Whoever wants to fix that case is welcome to do so

gamma is set on top on a small circular part that moves around during time:

   atmosphere      
   {
       type            groovyBC;
       variables "r1=0.25*toFace(max(pts().x)-min(pts().x));r2=r1*0.2*(1-0.5*cos(54*time()));";
       valueExpression "(sqrt(pow(pos().x-r1*sin(10*time()),2)+pow(pos().z-r1*cos(15*time()),2))<r2) ? 1 : 0";
       value           uniform 0;
   }

The Velocity is set depending on gamma:

   atmosphere
   {
       type            groovyBC;
       valueExpression "-(gamma+internalField(gamma))*0.5*normal()";
       value           uniform (0 0 0);
   }

4.2 User-Cases

4.2.1 groovyWaveTank

An example of using groovyBC to generate 2nd-order Stokes waves. It is designed to run with interFoam. For a wave with amplitude = 0.1, and wavelength = 5, gamma is set on the inlet:

   inlet
   {
       type            groovyBC;
       valueExpression "(pos().z<=A*cos(-w*time())+0.5*k*A*A*cos(2*(-w*time()))) ? 1 : 0";
       variables       "l=5;A=0.1;g=vector(0,0,-9.81);k=2*pi/l;w=sqrt(k*mag(g));";
       timelines       ();
   }

The corresponding velocity field U is set using:

   inlet
   {
       type            groovyBC;
       valueExpression "(pos().z<=A*cos(-w*time())+0.5*k*A*A*cos(2*(-w*time()))) ? vector( A*w*exp(k*pos().z)*cos(-w*time()), 0, A*w*exp(k*pos().z)*sin(-w*time())) : vector(0,0,0)";
       variables       "l=5;A=0.1;g=vector(0,0,-9.81);k=2*pi/l;w=sqrt(k*mag(g));";
       timelines       ();
   }

A test case can be downloaded from: groovyWaveTank.tgz. As usual, run blockMesh, setFields, and interFoam.

5 Technical

  • the BC only works for fvPatchFields but can "read" point and face-fields too
  • it also works for pointPatchFields. Please note that constants must be enclosed in toPoint, otherwise they will be defined as face-values

5.1 Other

The parser-part can be used in other boundary conditions (that are not covered by the mixed-BC)

5.2 Known Bugs

This utility is still under development. Currently there are no known known bugs (but propably some unknown ones)

6 Download

The most recent version of the sources can always be downloaded via Subversion:

svn checkout https://openfoam-extend.svn.sourceforge.net/svnroot/openfoam-extend/trunk/Breeder_1.5/libraries/groovyBC

7 Plans

  • allow expressions for tensors
  • allow "permanent" variables
  • implement the BC for face-fields

8 History

  • 2009-02-19: Initial upload

--Bgschaid 23:50, 19 February 2009 (CET)