CFD Online Logo CFD Online URL
www.cfd-online.com
[Sponsors]
Home > Forums > Software User Forums > OpenFOAM > OpenFOAM Programming & Development

Custom Boundary Condition with OpenFOAM

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

Like Tree20Likes

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
Old   February 5, 2010, 08:54
Default Custom Boundary Condition with OpenFOAM
  #1
New Member
 
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16
trusharg is on a distinguished road
Hi

I am, new user of OpenFOAM.
I want to apply user defined boundary conditions.

I want to solve free jet problem and for that at the inlet I want to apply some following function at every time steps.

u(r,t)=u_profile(r)+u_noise(r,t)+u_forced(r,t)

u_profile(r)=(U_inlet/2)(1+tanh(R-r/2theta))
u_noise(r,t) is generate random noise
u_forced(r,t)=A*u_profile(r)sin(2piSt_d*U_inlet*t)

If any one have idea about implementation of user define BC, please guide me for this.

With Regards
Trushar
Luttappy likes this.
trusharg is offline   Reply With Quote

Old   February 11, 2010, 16:20
Default
  #2
Senior Member
 
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 21
marupio is on a distinguished road
1. Choose a boundary condition that is close, and copy the directory contents to anywhere (say run/myCode). oscillatingFvPatchField might be a good one to start with.

2. Rename all the copied files to a new name (say customJetPatchField or something).

3. Search & replace all text in all the new files old name for new name (oscillatingFvPatchField replaced with customJetPatchField)

4. Modify the code to suit your needs. (How's your C++?)

5. Create the directory structure: myCode/Make, and create files and options in it.

6. Under files, define the main source file (look under finiteVolume/Make/files, and copy / rename the relevant entry from the patch field you copied). Also tell it what the new library name will be. Use $(FOAM_USER_LIBBIN) instead of $(FOAM_LIBBIN). It should look something like:
customJetPatchFields.C

LIB = $(FOAM_USER_LIBBIN)/libcustomJetPatchField


7. The options file should have EXE_INC (for any includes such as finiteVolume) and LIB_LIBS (for included libraries, again finite Volume). Look at other LIB_LIBS for examples. Should probably look like:
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude

LIB_LIBS = \
-lfiniteVolume

etc..

8. $wmake libso customJetPatchField

9. Add whatever new dictionary entries are needed to your 0/U and 0/P files.

10. Add libs ( "libcustomJetPatchField" ) to controlDict

11. It should run now.

Common mistakes are not linking the correct file in Make/files. It isn't the one you might think. Remember to copy what finiteVolume/Make/files does for the patch field you chose. Another mistake is forgetting the libso in wmake. Good luck!
marupio is offline   Reply With Quote

Old   February 11, 2010, 23:29
Default
  #3
New Member
 
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16
trusharg is on a distinguished road
Thanks David Gaden

With help of contributed groovyBC I am manage to implement required boundary condition.

Trushar
trusharg is offline   Reply With Quote

Old   February 14, 2010, 18:25
Default
  #4
Member
 
Join Date: Mar 2009
Location: Sydney, New South Wales, Australia
Posts: 42
Rep Power: 17
rassilon is on a distinguished road
Hi Trushar, David,

I am also trying to create a new boundary condition, and have been experimenting with editing and compiling an existing condition. At the moment I am just trying to change the name of a condition - nothing more - as a proof of concept of being able to edit and compile.

I have been using the following method to make a statically linked solver and boundary condition 'package'

1. Make a copy of my case folder

2. Copy my solver (interFoam) into my case folder ($OpenFOAM/apps/case/interFoam)

3. Copy the contents of the boundary condition I am trying to rename into the solver folder (timeVaryingFixedUniformFixedValue)

4. Rename the solver folder (myInterFoam)

5. In the myInterFoam folder, rename the following files:
timeVaryingFixedUniformFixedValueFvPatchField.C -> myTimeVaryingFixedUniformFixedValueFvPatchField.C
timeVaryingFixedUniformFixedValueFvPatchField.H -> myTimeVaryingFixedUniformFixedValueFvPatchField.H
timeVaryingFixedUniformFixedValueFvPatchFields.C -> myTimeVaryingFixedUniformFixedValueFvPatchFields.C
timeVaryingFixedUniformFixedValueFvPatchFields.H -> myTimeVaryingFixedUniformFixedValueFvPatchFields.H
timeVaryingFixedUniformFixedValueFvPatchFieldsFwd. H -> myTimeVaryingFixedUniformFixedValueFvPatchFieldsFw d.H

6. Edit the files using a text editor, replacing all instances of timeVaryingUniformFixedValue with myTimeVaryingUniformFixedValue

7. Add the following to the second line of the Make/files file:
myTimeVaryingFixedUniformFixedValueFvPatchField.C
timeVaryingFixedUniformFixedValueFvPatchFields.C

8. Modify the final line so that it reads:
EXE = $(FOAM_USER_APPBIN)/myInterFoam

9. Add the following to the header of the interFoam.C file:
myTimeVaryingFixedUniformFixedValueFvPatchField.H
myTimeVaryingFixedUniformFixedValueFvPatchFields.H

10. Compile using:
wclean
rm -rf Make/linux*
wmake

I have got this method to work for a simple boundary condition (totalPressure), but when I attempt to compile this more complex boundary condition, I receive numerous instances of the following error:

Quote:
myTimeVaryingUniformFixedValueFvPatchField.C:38: error: redefinition of ‘Foam::myTimeVaryingUniformFixedValueFvPatchField< Type>::myTimeVaryingUniformFixedValueFvPatchField( const Foam::fvPatch&, const Foam: DimensionedField<Type, Foam::volMesh>&)’
myTimeVaryingUniformFixedValueFvPatchField.C:38: error: ‘Foam::myTimeVaryingUniformFixedValueFvPatchField< Type>::myTimeVaryingUniformFixedValueFvPatchField( const Foam::fvPatch&, const Foam: DimensionedField<Type, Foam::volMesh>&)’ previously declared here
What am I doing wrong? Is there something that I am missing when I am editing my boundary condition files by hand prior to compiling? Would I have better luck if I tried linking my BC dynamically instead of statically?

Any pointers would be greatly appreciated!


R
rassilon is offline   Reply With Quote

Old   February 15, 2010, 12:41
Default
  #5
Senior Member
 
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 21
marupio is on a distinguished road
You don't need to copy the solver - unless you are making changes to the solver itself. Only copy the boundary condition you want to change. So forget all the Make/files and Make/options from the solver.

Your Make/files for the boundary condition only needs one target. In this case it's

myTimeVaryingUniformFixedValueFvPatchFields.C

Follow the steps I posted for the Make/files and Make/options. When you compile, it's:
wmake libso

Don't forget to include in the controlDict file:
libs ( "libmyTimeVaryingUniformFixedValueFvPatchField " )
(or whatever you called the library .so file)

Hopefully that helps!
marupio is offline   Reply With Quote

Old   February 16, 2010, 22:11
Default
  #6
Member
 
Join Date: Mar 2009
Location: Sydney, New South Wales, Australia
Posts: 42
Rep Power: 17
rassilon is on a distinguished road
Quote:
Originally Posted by marupio View Post
You don't need to copy the solver - unless you are making changes to the solver itself. Only copy the boundary condition you want to change. So forget all the Make/files and Make/options from the solver.

Your Make/files for the boundary condition only needs one target. In this case it's

myTimeVaryingUniformFixedValueFvPatchFields.C

Follow the steps I posted for the Make/files and Make/options. When you compile, it's:
wmake libso

Don't forget to include in the controlDict file:
libs ( "libmyTimeVaryingUniformFixedValueFvPatchField " )
(or whatever you called the library .so file)

Hopefully that helps!
Hi David,

Thanks for your help. I have managed to successfully compile my new boundary condition, and have got it running to convergence. I have noticed some strangeness in post processing the results however. When I invoke paraFoam I receive the following error in the terminal:

Quote:
created temporary 'test_case.OpenFOAM'
--> FOAM Warning :
From function dlLibraryTable:pen(const fileName& functionLibName)
in file db/dlLibraryTable/dlLibraryTable.C at line 79
could not load /home/nathan/OpenFOAM/nathan-1.6/lib/linux64GccDPOpt/libmyTimeVaryingUniformFixedValue.so: undefined symbol: _ZTIN4Foam5token8compoundE
though Paraview does run, and does render the results as if the case had been run using the original Boundary Condition (timeVaryingUniformFixedValue).

Also, I receive the following error when invoking paraFoam:

Quote:
Cannot find 'value' entry on patch wall-heater of field p in file "/home/rassilon/solver_package_tests/test_case/0/p"
which is required to set the values of the generic patch field.
(Actual type myTimeVaryingUniformFixedValue)

Please add the 'value' entry to the write function of the user-defined boundary-condition
or link the boundary-condition into libfoamUtil.so

file: /home/rassilon/solver_package_tests/test_case/0/p::wall-heater from line 59 to line 61.

From function genericFvPatchField<Type>::genericFvPatchField(con st fvPatch&, const Field<Type>&, const dictionary&)
in file fields/fvPatchFields/basic/generic/genericFvPatchField.C at line 72.

FOAM exiting
But have been able to overcome this by adding a dummy value line to the 0/p file for my new Boundary Condition.

I guess that if this is an exact copy of an existing BC, then I shouldn't be experiencing these errors, or are they to be expected?


R
rassilon is offline   Reply With Quote

Old   February 16, 2010, 22:29
Default
  #7
Senior Member
 
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 21
marupio is on a distinguished road
Good job on getting it to run!

I'm guessing paraView doesn't know about that boundary condition (and is probably trying to apply a 'generic' type) and is falling on its face.

Try adding OpenFOAM to the list of libraries you're including (in controlDict):

libs ( "libmyTimeVaryingUniformFixedValueFvPatchField .so" "libOpenFOAM.so" )

If that doesn't work... I'm not sure what else to do... I might try exporting to a different post processor... or bumping this to the rest of the folks in the OpenFOAM community.

-Dave
marupio is offline   Reply With Quote

Old   February 26, 2010, 13:05
Default
  #8
Senior Member
 
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 21
marupio is on a distinguished road
I've adapted this into the wiki.
http://openfoamwiki.net/index.php/Ho...dary_condition
marupio is offline   Reply With Quote

Old   May 25, 2010, 13:32
Default
  #9
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Hi David,

I am trying to implement a forced boundary condition on the inlet. I have used this piece of code-

label patchI = mesh.boundaryMesh().findPatchID("inlet");
const fvPatchVectorField& patchU = U.boundaryField()[patchI];
const labelList inletFc = patchU.patch().faceCells();
const vectorField inletCf = patchU.patch().Cf();

to access the centre of the inlet patch co-ordinates in the createFields.H file. However, I want to access it in my boundary patch code (e.g. timeVaryingFixedValue) to force a specific co-related pattern at the inlet every time-step. On compilation the error says that the variable "inletCf" is not defined in the same scope.
Do you have any idea whay it is?
Actually I want to access the inlet patch space co-ordinates and there I am having trouble finding the x,y and z co-ordinate of the inlet patch points.
Any hint will be appreciated.

Thansk & regards,

Nishant
nishant_hull is offline   Reply With Quote

Old   May 25, 2010, 15:48
Default
  #10
Senior Member
 
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 21
marupio is on a distinguished road
Are you trying to get the geometry of the fvPatchField itself? It should know itself... I think you get a reference to the patch using patch(). Have a look at parabolicVelocityFvPatchVectorField. That one probably also needs to "get" its own geometry.

Good luck!
marupio is offline   Reply With Quote

Old   May 25, 2010, 23:37
Default
  #11
New Member
 
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16
trusharg is on a distinguished road
In my case I put it like this way and its work fine:

label inletPatchID = mesh.boundaryMesh().findPatchID("in");
const fvsPatchVectorField& centre = mesh.Cf().boundaryField()[inletPatchID];
const fvsPatchVectorField& normal = mesh.Sf().boundaryField()[inletPatchID];
fvPatchVectorField& uu = U.boundaryField()[inletPatchID];
trusharg is offline   Reply With Quote

Old   May 26, 2010, 06:24
Default
  #12
Member
 
David
Join Date: Dec 2009
Location: Spain
Posts: 62
Rep Power: 16
David_010 is on a distinguished road
Hi David

Thanks for the help about how to create a new boundary condition. In my case, I need to create a boundary condition which makes cyclic the temperature gradient between two surfaces, in a solid region. I have thought in do it from the cyclic boundary condition, but my C++ knowledge is limited. Do you think it is possible? I imagine that I have to specify that the variable to be cycled will be snGrad(T) instead of T.

Thanks a lot for your help

Regards

David
David_010 is offline   Reply With Quote

Old   May 26, 2010, 09:20
Default
  #13
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Quote:
Originally Posted by trusharg View Post
In my case I put it like this way and its work fine:

label inletPatchID = mesh.boundaryMesh().findPatchID("in");
const fvsPatchVectorField& centre = mesh.Cf().boundaryField()[inletPatchID];
const fvsPatchVectorField& normal = mesh.Sf().boundaryField()[inletPatchID];
fvPatchVectorField& uu = U.boundaryField()[inletPatchID];


Hi Trushar,

Thanks for the reply. Did you use this piece of code in the createFields.H file or did you use it in the boundary condition file (like timeVaryingFvpatch.C file)?
If you have used this code in the createFields.H file then could you be able to use the "centre" vector field in the boundary condition file (like timeVaryingFvpatch.C file)?

Thanks & regards,

Nishant
nishant_hull is offline   Reply With Quote

Old   May 26, 2010, 12:38
Default
  #14
New Member
 
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16
trusharg is on a distinguished road
HI Nishant

I use it directly in the main solver. Like in my case I modify the icoFOAM and put this code into it.

Trushar
trusharg is offline   Reply With Quote

Old   June 8, 2010, 21:56
Default
  #15
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Hi Trushar,

I have implemented the boundary condition now but there are some problem I am having while running. After few hundred iterations in a channel test case, I am having these errors:

Maximum number of iterations exceeded#0 Foam::error:rintStack(Foam::Ostream&) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#1 Foam::error::abort() in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#2 Foam::hPsiThermo<Foam:ureMixture<Foam::constTran sport<Foam::specieThermo<Foam::hConstThermo<Foam:: perfectGas> > > > >::calculate() in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libbasicThermophysicalModels.so"
#3 Foam::hPsiThermo<Foam:ureMixture<Foam::constTran sport<Foam::specieThermo<Foam::hConstThermo<Foam:: perfectGas> > > > >::correct() in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libbasicThermophysicalModels.so"
#4
in "/home/nishant/OpenFOAM/nishant-1.6/applications/bin/linux64GccDPOpt/rhoPisoFoam-klein"
#5 __libc_start_main in "/lib/libc.so.6"
#6
in "/home/nishant/OpenFOAM/nishant-1.6/applications/bin/linux64GccDPOpt/rhoPisoFoam-klein"


From function specieThermo<thermo>::T(scalar f, scalar T0, scalar (specieThermo<thermo>::*F)(const scalar) const, scalar (specieThermo<thermo>::*dFdT)(const scalar) const) const
in file /home/dm2/henry/OpenFOAM/OpenFOAM-1.6/src/thermophysicalModels/specie/lnInclude/specieThermoI.H at line 68.

FOAM aborting

Can you please tell me how to get rid of such problems? I assume you might have come across such problems at some stage. Any help in this regard will be deeply appreciated.

Thanks & regards,

Nishant
nishant_hull is offline   Reply With Quote

Old   June 9, 2010, 00:08
Default
  #16
New Member
 
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16
trusharg is on a distinguished road
Hi Nishant

Can you check, what is the Courant Number when you got that error. I think it is due to the delta T so try to lower the delta T.

Also tell me which solver are you using for pressure?

Trushar
trusharg is offline   Reply With Quote

Old   June 9, 2010, 11:40
Default
  #17
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Quote:
Originally Posted by trusharg View Post
Hi Nishant

Can you check, what is the Courant Number when you got that error. I think it is due to the delta T so try to lower the delta T.

Also tell me which solver are you using for pressure?

Trushar

Hi Trushar,

Thanks for the reply. I always check for courant number in such cases of error (specialy in compressible solver) but i think courant number is well within the limit. I even tried lowering the deltaT further down but with no success!
The pressure solver I am using is:
p
{
solver PCG;
preconditioner DIC;
tolerance 1e-06;
relTol 0;
}
The last iteration looks like this:

diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
DILUPBiCG: Solving for Ux, Initial residual = 0.00131998, Final residual = 7.85936e-08, No Iterations 1
DILUPBiCG: Solving for Uy, Initial residual = 0.00207584, Final residual = 1.27814e-07, No Iterations 1
DILUPBiCG: Solving for Uz, Initial residual = 0.00657929, Final residual = 9.48049e-07, No Iterations 1
DILUPBiCG: Solving for h, Initial residual = 0.00250624, Final residual = 4.06934e-08, No Iterations 1
DICPCG: Solving for p, Initial residual = 0.00276642, Final residual = 2.94016e-09, No Iterations 1
diagonal: Solving for rho, Initial residual = 0, Final residual = 0, No Iterations 0
time step continuity errors : sum local = 2.77896e-10, global = 9.5837e-11, cumulative = 7.18337e-09
DILUPBiCG: Solving for h, Initial residual = 8.89116e-05, Final residual = 8.89116e-05, No Iterations 0

As you can see the last iteration stops at h (which also gives acceptable value). The solver for h is:
h
{
solver PBiCG;
preconditioner DILU;
tolerance 1e-04;
relTol 0;
}

Thanks & regards,

Nishant
nishant_hull is offline   Reply With Quote

Old   June 9, 2010, 14:45
Default
  #18
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Hi Trushar,

After some modifications, I am getting this error:

time step continuity errors : sum local = 6.07738e-06, global = -2.00825e-07, cumulative = -1.65828e-07
#0 Foam::error:rintStack(Foam::Ostream&) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#1 Foam::sigFpe::sigFpeHandler(int) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#2 in "/lib/libc.so.6"
#3 Foam::sqrt(Foam::Field<double>&, Foam::UList<double> const&) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#4 Foam::sqrt(Foam::tmp<Foam::Field<double> > const&) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libOpenFOAM.so"
#5 Foam::compressible::LESModels::vanDriestDelta::cal cDelta() in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libcompressibleLESModels.so"
#6 Foam::compressible::LESModels:neEqEddy::correct( Foam::tmp<Foam::GeometricField<Foam::Tensor<double >, Foam::fvPatchField, Foam::volMesh> > const&) in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libcompressibleLESModels.so"
#7 Foam::compressible::LESModel::correct() in "/home/nishant/OpenFOAM/OpenFOAM-1.6/lib/linux64GccDPOpt/libcompressibleLESModels.so"
#8
in "/home/nishant/OpenFOAM/nishant-1.6/applications/bin/linux64GccDPOpt/rhoPisoFoam-klein"
#9 __libc_start_main in "/lib/libc.so.6"
#10
in "/home/nishant/OpenFOAM/nishant-1.6/applications/bin/linux64GccDPOpt/rhoPisoFoam-klein"
Floating point exception

Have you come across anything like this? I wonder why there is floating point error in LESmodels??? Any idea, if you can assist me here please?

Thanks & regards,

Nishant
nishant_hull is offline   Reply With Quote

Old   June 9, 2010, 16:00
Default
  #19
Member
 
Ovie Doro
Join Date: Jul 2009
Posts: 99
Rep Power: 16
ovie is on a distinguished road
My guess is that your boundary conditions for pressure are not consistent with the problem.

How have you implemented our pressure bcs?
ovie is offline   Reply With Quote

Old   June 10, 2010, 14:19
Default
  #20
Senior Member
 
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17
nishant_hull is on a distinguished road
Quote:
Originally Posted by ovie View Post
My guess is that your boundary conditions for pressure are not consistent with the problem.

How have you implemented our pressure bcs?
Hi Ovie
Thanks for reply. The pressure boundary condition is as follows:

inlet
{
type inletOutlet;
inletValue uniform 1e5;
value uniform 1e5;
}

outlet
{
type waveTransmissive;
field p;
phi phi;
rho rho;
psi psi;
gamma 1.3;
fieldInf 1e5;
lInf 0.3;
value uniform 1e5;
}


Thanks & regards,

Nishant
nishant_hull is offline   Reply With Quote

Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Wind turbine simulation Saturn CFX 58 July 3, 2020 02:13
how to set up a wall boundary condition according to calculated wall shear stress? gameoverli OpenFOAM Pre-Processing 1 May 21, 2009 09:28
Help Urgent about changing boundary condition Anjum Naveed FLUENT 7 August 14, 2006 13:25
[Commercial meshers] Trimmed cell and embedded refinement mesh conversion issues michele OpenFOAM Meshing & Mesh Conversion 2 July 15, 2005 05:15
How to resolve boundary condition problem? sam FLUENT 2 July 20, 2003 03:19


All times are GMT -4. The time now is 16:02.