|
[Sponsors] |
February 5, 2010, 08:54 |
Custom Boundary Condition with OpenFOAM
|
#1 |
New Member
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16 |
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 |
|
February 11, 2010, 16:20 |
|
#2 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
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! |
|
February 11, 2010, 23:29 |
|
#3 |
New Member
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16 |
Thanks David Gaden
With help of contributed groovyBC I am manage to implement required boundary condition. Trushar |
|
February 14, 2010, 18:25 |
|
#4 | |
Member
Join Date: Mar 2009
Location: Sydney, New South Wales, Australia
Posts: 42
Rep Power: 17 |
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:
Any pointers would be greatly appreciated! R |
||
February 15, 2010, 12:41 |
|
#5 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
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! |
|
February 16, 2010, 22:11 |
|
#6 | |||
Member
Join Date: Mar 2009
Location: Sydney, New South Wales, Australia
Posts: 42
Rep Power: 17 |
Quote:
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:
Also, I receive the following error when invoking paraFoam: Quote:
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 |
||||
February 16, 2010, 22:29 |
|
#7 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
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 |
|
February 26, 2010, 13:05 |
|
#8 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
I've adapted this into the wiki.
http://openfoamwiki.net/index.php/Ho...dary_condition |
|
May 25, 2010, 13:32 |
|
#9 |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
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 |
|
May 25, 2010, 15:48 |
|
#10 |
Senior Member
David Gaden
Join Date: Apr 2009
Location: Winnipeg, Canada
Posts: 437
Rep Power: 22 |
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! |
|
May 25, 2010, 23:37 |
|
#11 |
New Member
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16 |
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]; |
|
May 26, 2010, 06:24 |
|
#12 |
Member
David
Join Date: Dec 2009
Location: Spain
Posts: 62
Rep Power: 16 |
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 |
|
May 26, 2010, 09:20 |
|
#13 | |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
Quote:
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 |
||
May 26, 2010, 12:38 |
|
#14 |
New Member
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16 |
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 |
|
June 8, 2010, 21:56 |
|
#15 |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
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 |
|
June 9, 2010, 00:08 |
|
#16 |
New Member
Trushar
Join Date: Feb 2010
Posts: 5
Rep Power: 16 |
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 |
|
June 9, 2010, 11:40 |
|
#17 | |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
Quote:
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 |
||
June 9, 2010, 14:45 |
|
#18 |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
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 |
|
June 9, 2010, 16:00 |
|
#19 |
Member
Ovie Doro
Join Date: Jul 2009
Posts: 99
Rep Power: 17 |
My guess is that your boundary conditions for pressure are not consistent with the problem.
How have you implemented our pressure bcs? |
|
June 10, 2010, 14:19 |
|
#20 | |
Senior Member
Nishant
Join Date: Mar 2009
Location: Glasgow, UK
Posts: 166
Rep Power: 17 |
Quote:
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 |
||
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
Wind turbine simulation | Saturn | CFX | 60 | July 17, 2024 06:45 |
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 |