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

Variation of gravity with time

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

Like Tree1Likes

Reply
 
LinkBack Thread Tools Display Modes
Old   January 13, 2010, 12:28
Question Variation of gravity with time
  #1
Member
 
Stefano
Join Date: Jul 2009
Posts: 34
Rep Power: 8
Whyman is on a distinguished road
Dear OpenFoam users,

i'm trying to simulate the effects of the acceleration's variation of a rocket on a particular experiment. My problem is that the acceleration value varies with the mission time.

Does anyone know how to set the variation of the gravity with the time?

Thank you
Bye
Whyman is offline   Reply With Quote

Old   January 15, 2010, 00:43
Default
  #2
Member
 
Join Date: Dec 2009
Posts: 46
Rep Power: 7
openfoam1 is on a distinguished road
Whyman thanks for posting this thread ,, I'm too have a simulation that need variation of gravity with time ,, also i want to know how to implement centrifugal force in openFoam


regards
openfoam1 is offline   Reply With Quote

Old   January 16, 2010, 07:12
Default
  #3
Senior Member
 
Claus Meister
Join Date: Aug 2009
Location: Wiesbaden, Germany
Posts: 241
Rep Power: 9
idrama is on a distinguished road
Had you guys a look at the sloshing tank tutorial:

tutorials/multiphase/interDyMFoam/ras/sloshingTank2D

This will properly match you expectation.

kinda regards
idrama is offline   Reply With Quote

Old   January 17, 2010, 01:05
Default
  #4
Member
 
Join Date: Dec 2009
Posts: 46
Rep Power: 7
openfoam1 is on a distinguished road
Quote:
Originally Posted by idrama View Post
Had you guys a look at the sloshing tank tutorial:

tutorials/multiphase/interDyMFoam/ras/sloshingTank2D

This will properly match you expectation.

kinda regards
hi idrama

thank you ,, it is a rotating wall boundary condtion
do you know how to implement a given body force ( and also how to make it vary with time ) in to the solver governing equations ' interFoam ' for example
openfoam1 is offline   Reply With Quote

Old   January 17, 2010, 01:48
Default
  #5
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Quote:
Originally Posted by openfoam1 View Post
hi idrama

thank you ,, it is a rotating wall boundary condtion
do you know how to implement a given body force ( and also how to make it vary with time ) in to the solver governing equations ' interFoam ' for example
Hi,

look at how the gravity is implemented in interFoam, by means of its contribution to the flux.

In the momentum predictor, if solved, the gravity is not included in the matrix but added on the RHS of the equation as (UEqn.H)

fvc::reconstruct(fvc::interpolate(rho)*(g & mesh.Sf()))

and its contribution to the flux is accounted for as (pEqn.H)

phi = phiU + (fvc::interpolate(rho)*(g & mesh.Sf()))*rUAf;

You can do the same for other body force terms, starting from the semi-discrete form of the momentum equation and deriving the expression for the flux contribution of the additional term.

If you simply want the gravity to change with time, simply remove
  • Remove #include "readGravitationalAcceleration.H"
  • Define a volVectorField that contains your gravitational acceleration, depending on the current time
    • volVectorField g = <put your expression here>;
Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods
alberto is offline   Reply With Quote

Old   January 18, 2010, 05:30
Thumbs up
  #6
Member
 
Stefano
Join Date: Jul 2009
Posts: 34
Rep Power: 8
Whyman is on a distinguished road
Alberto,

thanks for your useful reply.
I just have only one more question about this topic.

You suggested to write a particular expression for the gravity. What am i supposed to do in case i have a list of gravity values for each flowtime, which do not respond to a specific expression?

For example, if i have this type of gravity data file:

flowtime gx gy gz
0.1 0.1 0.1 1
0.15 0.2 0.1 1.5
0.2 0.8 -0.5 1.5
.........


Finally, is it possible to apply this variation to OpenFoam version 1.5?

Thank you
Regards
Whyman is offline   Reply With Quote

Old   January 18, 2010, 07:11
Default
  #7
Senior Member
 
Claus Meister
Join Date: Aug 2009
Location: Wiesbaden, Germany
Posts: 241
Rep Power: 9
idrama is on a distinguished road
Hello Alberto,

in my case the gravity only turns about the y-axis in 4 sec. So I changed the code according to your last post as follows:

int main(int argc, char *argv[])
{
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
//#include "readGravitationalAcceleration.H"
volVectorField g=-9.81*vector(0,0,1); // There may be dependencies in the next includes.
#include "readPISOControls.H"
#include "initContinuityErrs.H"
#include "createFields.H"
#include "readTimeControls.H"
#include "correctPhi.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (runTime.run())
{
#include "readPISOControls.H"
#include "readTimeControls.H"
#include "CourantNo.H"
#include "setDeltaT.H"

runTime++;

g=9.81*sin(pi/4*runTime)*vector(1,0,0)-9.81*cos(pi/4*runTime)*vector(0,0,1);

Info<< "Time = " << runTime.timeName() << nl << endl;


But when I am compiling it the compiler ends up with an error message. What did I wrong?

kinda regards

Claus
idrama is offline   Reply With Quote

Old   January 18, 2010, 14:28
Default
  #8
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Quote:
Originally Posted by Whyman View Post
Alberto,

thanks for your useful reply.
I just have only one more question about this topic.

You suggested to write a particular expression for the gravity. What am i supposed to do in case i have a list of gravity values for each flowtime, which do not respond to a specific expression?

For example, if i have this type of gravity data file:

flowtime gx gy gz
0.1 0.1 0.1 1
0.15 0.2 0.1 1.5
0.2 0.8 -0.5 1.5
.........
Well, it might not be the most elegant way, but a quick one could be to write a function that returns the gravity value checking the time range.

In pseudo-code

if (t <= 0.1)
g = (0.1 0.1 1)
else if (0.1 < t < 0.15)
g = (0.1 0.2 1.5)
else if (...)
...

[QUOTE
Finally, is it possible to apply this variation to OpenFoam version 1.5?

Yes. In OF 1.6 the gravity field has been redefined in a slightly different way than in 1.5, but this should not make a big difference.

Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods
alberto is offline   Reply With Quote

Old   January 18, 2010, 14:43
Default
  #9
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Quote:
Originally Posted by idrama View Post
Hello Alberto,

in my case the gravity only turns about the y-axis in 4 sec. So I changed the code according to your last post as follows:

int main(int argc, char *argv[])
{
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
//#include "readGravitationalAcceleration.H"
volVectorField g=-9.81*vector(0,0,1); // There may be dependencies in the next includes.
#include "readPISOControls.H"
#include "initContinuityErrs.H"
#include "createFields.H"
#include "readTimeControls.H"
#include "correctPhi.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (runTime.run())
{
#include "readPISOControls.H"
#include "readTimeControls.H"
#include "CourantNo.H"
#include "setDeltaT.H"

runTime++;

g=9.81*sin(pi/4*runTime)*vector(1,0,0)-9.81*cos(pi/4*runTime)*vector(0,0,1);

Info<< "Time = " << runTime.timeName() << nl << endl;


But when I am compiling it the compiler ends up with an error message. What did I wrong?

kinda regards

Claus
Without the error message, it is a bit hard :-)

However, here

g=9.81*sin(pi/4*runTime)*vector(1,0,0)-9.81*cos(pi/4*runTime)*vector(0,0,1);

you use runTime in the wrong way. It is a Time object, but what you need is your current time, which is provided by runTime.timeName().

In addition, you do not provide the correct units to g, so the solver will complain when running. You can define a multiplier with the correct units as

const dimensionedScalar gunits("gunits", dimensionSet(0,1,-2,0,0,0,0), 1.0);

and multiply your value by it.

Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods
alberto is offline   Reply With Quote

Old   January 23, 2010, 10:28
Default
  #10
Senior Member
 
Claus Meister
Join Date: Aug 2009
Location: Wiesbaden, Germany
Posts: 241
Rep Power: 9
idrama is on a distinguished road
Hello Alberto,

for one week I am trying it to get the code going. I modified the code as follows:

vector g0(0,0,9.81);

#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
//#include "readGravitationalAcceleration.H"
dimensionedVector g("g",dimensionSet(0,1,-2,0,0,0,0),g0);
#include "readPISOControls.H"
#include "initContinuityErrs.H"
#include "createFields.H"
#include "readTimeControls.H"
#include "correctPhi.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (runTime.run())
{
#include "readPISOControls.H"
#include "readTimeControls.H"
#include "CourantNo.H"
#include "setDeltaT.H"

runTime++;

g0=9.81*sin(runTime.timeName()*pi/4.0)*vector(1,0,0)-9.81*cos(runTime.timeName()t*pi/4.0)*vector(0,0,1);

dimensionedVector g("g",dimensionSet(0,1,-2,0,0,0,0),g0);

Info<< "Time = " << runTime.timeName() << nl << endl;

By compinling I get the error message:

MyInterFoam.C:87: error: no match for ‘operator*’ in ‘Foam::Time::timeName() const() * 3.141592653589793115997963468544185161590576171875 e+0’
/home/idrama/OpenFOAM/OpenFOAM-1.6/src/OpenFOAM/lnInclude/dimensionSet.H:266: note: candidates are: Foam::dimensionSet Foam:perator*(const Foam::dimensionSet&, const Foam::dimensionSet&)

As far as I figured out the problem is that I have double operation * but the data type of tunTime.timeName() is word. How can I get a double value from runTime? Or, in general, what I have to to else to get the code running?

Cheers,

Claus
idrama is offline   Reply With Quote

Old   January 23, 2010, 14:43
Default
  #11
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Quote:
Originally Posted by idrama View Post
Hello Alberto,

for one week I am trying it to get the code going. I modified the code as follows:

vector g0(0,0,9.81);

#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
//#include "readGravitationalAcceleration.H"
dimensionedVector g("g",dimensionSet(0,1,-2,0,0,0,0),g0);
#include "readPISOControls.H"
#include "initContinuityErrs.H"
#include "createFields.H"
#include "readTimeControls.H"
#include "correctPhi.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (runTime.run())
{
#include "readPISOControls.H"
#include "readTimeControls.H"
#include "CourantNo.H"
#include "setDeltaT.H"

runTime++;

g0=9.81*sin(runTime.timeName()*pi/4.0)*vector(1,0,0)-9.81*cos(runTime.timeName()t*pi/4.0)*vector(0,0,1);

dimensionedVector g("g",dimensionSet(0,1,-2,0,0,0,0),g0);

Info<< "Time = " << runTime.timeName() << nl << endl;

By compinling I get the error message:

MyInterFoam.C:87: error: no match for ‘operator*’ in ‘Foam::Time::timeName() const() * 3.141592653589793115997963468544185161590576171875 e+0’
/home/idrama/OpenFOAM/OpenFOAM-1.6/src/OpenFOAM/lnInclude/dimensionSet.H:266: note: candidates are: Foam::dimensionSet Foam:perator*(const Foam::dimensionSet&, const Foam::dimensionSet&)

As far as I figured out the problem is that I have double operation * but the data type of tunTime.timeName() is word. How can I get a double value from runTime? Or, in general, what I have to to else to get the code running?

Cheers,

Claus
The problem is in how you set the dimensions. Replace
Code:
g0=9.81*sin(runTime.timeName()*pi/4.0)*vector(1,0,0)-9.81*cos(runTime.timeName()t*pi/4.0)*vector(0,0,1);

        dimensionedVector g("g",dimensionSet(0,1,-2,0,0,0,0),g0);
with

Code:
const dimensionedScalar gunits("gunits", dimensionSet(0,1,-2,0,0,0,0), 1.0);

dimensionedVector g0=9.81*gunits*sin(runTime.timeName()*pi/4.0)*vector(1,0,0)-9.81*cos(runTime.timeName()t*pi/4.0)*vector(0,0,1);
and remove the definition of vector g0 at the beginning.

In other words you define a constant, of magnitude 1 with the dimensional units of an acceleration, and you use it as a multiplier for your vector, to set the appropriate unit.

Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods

Last edited by alberto; January 23, 2010 at 14:45. Reason: Corrected code
alberto is offline   Reply With Quote

Old   January 23, 2010, 17:58
Default
  #12
Senior Member
 
Claus Meister
Join Date: Aug 2009
Location: Wiesbaden, Germany
Posts: 241
Rep Power: 9
idrama is on a distinguished road
Thanks All!

PROBLEM SOLVED, MISSION ACCOMPLISHED:

#include "fvCFD.H"
#include "MULES.H"
#include "subCycle.H"
#include "interfaceProperties.H"
#include "twoPhaseMixture.H"
#include "turbulenceModel.H"

#define pi 3.141592653589793238


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

int main(int argc, char *argv[])
{

const dimensionedScalar gunits("gunits", dimensionSet(0,1,-2,0,0,0,0), 9.81);


#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
#include "readGravitationalAcceleration.H"
#include "readPISOControls.H"
#include "initContinuityErrs.H"
#include "createFields.H"
#include "readTimeControls.H"
#include "correctPhi.H"
#include "CourantNo.H"
#include "setInitialDeltaT.H"


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

Info<< "\nStarting time loop\n" << endl;

while (runTime.run())
{
#include "readPISOControls.H"
#include "readTimeControls.H"
#include "CourantNo.H"
#include "setDeltaT.H"

runTime++;

g=gunits*Foam::sin(runTime.value()*pi/4.0)*vector(1,0,0)-gunits*Foam::cos(runTime.value()*pi/4.0)*vector(0,0,1);


Info<< "Time = " << runTime.timeName() << nl << endl;

Kinda regards!

Claus
pruthvi1991 likes this.
idrama is offline   Reply With Quote

Old   January 23, 2010, 18:09
Default
  #13
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Good! And you found part of the answer yourself, since I misled you with timeName(). Sorry about that

Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods

Last edited by alberto; January 23, 2010 at 18:10. Reason: typo
alberto is offline   Reply With Quote

Old   January 24, 2010, 18:38
Lightbulb
  #14
Member
 
Join Date: Dec 2009
Posts: 46
Rep Power: 7
openfoam1 is on a distinguished road
Hi alberto ;

i want to make the gravity vector constant in magnitude but rotates with a known omega ,, and in the same situation there exist a constant centrifugal force (constant magnitude and constant direction).. both in one simulation

gravity vector rotates (omega) + centrifugal force (constant vector)


does it possible to do that in the runtime as in the previous case ?

best regards.
openfoam1 is offline   Reply With Quote

Old   January 30, 2010, 04:02
Default
  #15
Member
 
Join Date: Dec 2009
Posts: 46
Rep Power: 7
openfoam1 is on a distinguished road
Quote:
Originally Posted by alberto View Post
Good! And you found part of the answer yourself, since I misled you with timeName(). Sorry about that

Best,

Hi alberto ;

i want to make the gravity vector constant in magnitude but rotates with a known omega ,, and in the same situation there exist a constant centrifugal force (constant magnitude and constant direction).. both in one simulation

gravity vector rotates (omega) + centrifugal force (constant vector)


does it possible to do that in the runtime as in the previous case ?

best regards.
openfoam1 is offline   Reply With Quote

Old   February 8, 2010, 12:47
Question further problems
  #16
Member
 
Stefano
Join Date: Jul 2009
Posts: 34
Rep Power: 8
Whyman is on a distinguished road
Hi guys,

i would like to replace my problem, beacause i can't solve it yet.

Alberto wrote about a pseudo-code for the gravity in case i had random values.

My problems is: what happens if i have a list of thousands values of g?

My idea is the following.

1) To write a gravity file as a text file with all the x,y,z values

2) To write the time file with the list of the time values

3) Every time-step, the solver will read these two files (g and t) and change the g-value in the "g" file of the case contained in the "constant" directory

4) The solver keep calculating and cycle it.


Alternatively i received this comment:

"
Obviously the standard OpenFOAM solvers don't include the variation in
gravity - most of them apply to flows in a stationary reference frame
on Earth!

If you want to use data from a file whose values you wish to
interpolate between, there is a class set up for this called
interpolationTable<Type>. You could use this for a vector quantity,
by constructing an interpolationTable<vector>. There are a choice of
constructors that take a file name, or dictionary entry for the file
name as arguments, see:
$FOAM_SRC/OpenFOAM/interpolations/interpolationTable/interpolationTable.C

Some time varying boundary conditions use the same class to handle
time-value data. Examples are:
$FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/timeVaryingFlowRateInletVelocity/
$FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/timeVaryingUniformFixedValue/
$FOAM_SRC/finiteVolume/fields/fvPatchFields/derived/timeVaryingUniformTotalPressure/

The gravity vector can be overridden with a vector from your
interpolationTable<vector> in whichever solver you need to use. If
the interpoltationTable<vector> you construct is called myInTable, the
cose would look something like:

g.value() = myIntTable(runTime.value());

"
Unfortunately, i don't know how to implement these ideas to the code.

What do you think about it? Do you have any suggestion?

Regards

Stefano
Whyman is offline   Reply With Quote

Old   February 8, 2010, 13:04
Default
  #17
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Quote:
Originally Posted by Whyman View Post
Hi guys,

i would like to replace my problem, beacause i can't solve it yet.

Alberto wrote about a pseudo-code for the gravity in case i had random values.

My problems is: what happens if i have a list of thousands values of g?
Thousands of values as a function of time, or does your "gravity vector" change as a function of the position too?

Best,
Alberto
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods
alberto is offline   Reply With Quote

Old   February 8, 2010, 13:22
Default
  #18
Member
 
Stefano
Join Date: Jul 2009
Posts: 34
Rep Power: 8
Whyman is on a distinguished road
Thousands of values as a function of time. It is uniform in space (i mean constant in position).

Imagine the small example that i wrote before but multiplied by thounsands values.


flowtime gx gy gz
0.1 0.1 0.1 1
0.15 0.2 0.1 1.5
0.2 0.8 -0.5 1.5
.........(thousands rows)....


Stefano
Whyman is offline   Reply With Quote

Old   February 8, 2010, 13:46
Default
  #19
Senior Member
 
Alberto Passalacqua
Join Date: Mar 2009
Location: Ames, Iowa, United States
Posts: 1,894
Rep Power: 26
alberto will become famous soon enoughalberto will become famous soon enough
Hi,

I agree with the suggestion of using an interpolationTable. You can take a look at this:

http://foam.sourceforge.net/doc/Doxy....html#_details

and use the constructor from the name of the file containing the data table, for example, or, if you prefer, you can set the file name containing the data in a specified dictionary and construct using that dictionary (as done in timeVaryingUniformFixedValue).

What problems did you meet when trying to implement this?

Best,
__________________
Alberto Passalacqua

GeekoCFD - A free distribution based on openSUSE 64 bit with CFD tools, including OpenFOAM. Available as live DVD/USB, hard drive image and virtual image.
OpenQBMM - An open-source implementation of quadrature-based moment methods
alberto is offline   Reply With Quote

Old   February 9, 2010, 05:40
Default
  #20
Member
 
Stefano
Join Date: Jul 2009
Posts: 34
Rep Power: 8
Whyman is on a distinguished road
My only problem is that i'm not so expert yet to change the code. I'm still studying it, but it's still quite complicate for me.

Moreover the interpolation file is used (i think) only to interpolate between two values: but how does the code read the file, select the right value for each flowtime and change the value in its calculation?



Regards

Stefano
Whyman is offline   Reply With Quote

Reply

Tags
gravity, time, variation

Thread Tools
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 On
Pingbacks are On
Refbacks are On


Similar Threads
Thread Thread Starter Forum Replies Last Post
Time step size and max iterations per time step pUl| FLUENT 27 May 12, 2015 20:04
Simulation of sloshing by time varying gravity Manoj Kumar FLUENT 3 June 13, 2011 03:34
PostChannel maka OpenFOAM Post-Processing 5 July 22, 2009 09:15
Problems with simulating TurbFOAM barath.ezhilan OpenFOAM 13 July 16, 2009 05:55
variation of gravity with time rajani FLUENT 0 February 16, 2005 03:45


All times are GMT -4. The time now is 00:30.