|
[Sponsors] |
Help!! customize surface tension term in interFoam |
|
LinkBack | Thread Tools | Search this Thread | Display Modes |
February 11, 2016, 16:59 |
Help!! customize surface tension term in interFoam
|
#1 |
New Member
Join Date: May 2014
Posts: 5
Rep Power: 12 |
Hi guys, I am trying to replace the original surface tension term in interFoam using a custom code.
The original surface tension term mathematically can be expressed as Kappa*sigma*grad(alpha1). And interFoam expresses this term as fvc::interpolate(interface.sigmaK())*fvc::snGrad(a lpha1) Based on my understanding, what interFoam does is to calculate the surface tension on face center as a scalar and then reconstruct to the cell center as a vector. Therefore, "fvc::interpolate(interface.sigmaK())*fvc::snGrad( alpha1)" is a scalar rather than a vector. What I am trying to do is to replace the above mentioned term by another function aiming to calculate the force between any cell to the rest of the cells in the domain. Here is my code. It complies and runs OK, but no matter how long I run the code, the results of test case does not make sense. BTW, my test case is to place a air rectangle in a liquid box and see if the rectangle can become a circle eventually. Test case does not make sense means that the air rectangle does not change its shape. Code:
volVectorField newSurfaceTension //create volume vector field ( IOobject ( "newSurfaceTension", runTime.timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE ), mesh, dimensionedVector("newSurfaceTension",dimensionSet(1,-4,-2,0,0,0,0),Foam::vector(0,0,0)) ); forAll(mesh.C(),celli) //calculate surface tension on celli { forAll(mesh.C(),cellj) // relation between the celli to the rest of the cells in the domain { if( ((alpha1[celli]<0.5)&& (alpha1[cellj]<0.5)) || ((alpha1[celli]>=0.5)&& (alpha1[cellj]>=0.5)) ) //if both less than 0.5 or both greater than 0.5 { s=constant1; } else // if one is below 0.5 and the other is above 0.5 { s=constant2; } newSurfaceTension[celli]=newSurfaceTension[celli]+(mesh.C()[celli]-mesh.C()[cellj])*s*constant3*mag(mesh.C()[celli]-mesh.C()[cellj]); // my formula } } surfaceVectorField newSurfaceTension1("newSurfaceTension1",fvc::interpolate(newSurfaceTension)); //convert from volVectorField to surfaceVectorField const surfaceVectorField& sf=mesh.Sf(); surfaceScalarField newSurfaceTension2("newSurfaceTension2",newSurfaceTension1 & sf); //covert from surfaceVectorField to surfaceScalarField After that I will update surface tension term in UEqn.H and pEqn.H. Using UEqn.H as an example. Code:
fvVectorMatrix UEqn ( fvm::ddt(rho, U) + fvm::div(rhoPhi, U) + turbulence->divDevRhoReff(rho, U) ); UEqn.relax(); if (pimple.momentumPredictor()) { solve ( UEqn == fvc::reconstruct ( ( //fvc::interpolate(interface.sigmaK())*fvc::snGrad(alpha1) newSurfaceTension2 - ghf*fvc::snGrad(rho) - fvc::snGrad(p_rgh) ) * mesh.magSf() ) ); } |
|
February 12, 2016, 03:06 |
|
#2 |
Senior Member
Anton Kidess
Join Date: May 2009
Location: Germany
Posts: 1,377
Rep Power: 30 |
My guess is you calculate the new surface tension in createFields.H - it is never updated.
__________________
*On twitter @akidTwit *Spend as much time formulating your questions as you expect people to spend on their answer. |
|
February 12, 2016, 03:35 |
|
#3 |
New Member
Join Date: May 2014
Posts: 5
Rep Power: 12 |
||
February 12, 2016, 09:52 |
|
#4 |
Senior Member
Daniel P. Combest
Join Date: Mar 2009
Location: St. Louis, USA
Posts: 621
Rep Power: 0 |
Just to add more to this, the nested for loops on the order of n^2 may be slower than if you iterated over cell faces (instead of cell centers) and looked at owner and neighbour cells of that face. Look in the
$FOAM_SRC/finiteVolume/interpolation/surfaceInterpolation/limitedSchemes/LimitedScheme/LimitedScheme.C |
|
February 12, 2016, 15:55 |
|
#5 |
New Member
Join Date: May 2014
Posts: 5
Rep Power: 12 |
Hi Anton,
I tried to insert my piece of code (let's call it SURFACE_TENSION and can be found in my original post) to multiple places of interFoam.C (one at a time), however, the results are still like you said before, it was never updated.... The relevant code are below. Could anyone give me more advice? Code:
while (runTime.run()) { #include "readTimeControls.H" #include "CourantNo.H" #include "alphaCourantNo.H" #include "setDeltaT.H" runTime++; Info<< "Time = " << runTime.timeName() << nl << endl; twoPhaseProperties.correct(); #include "alphaEqnSubCycle.H" interface.correct(); SURFACE_TENSION // first test is to insert here // --- Pressure-velocity PIMPLE corrector loop while (pimple.loop()) { SURFACE_TENSION // second test is to insert here #include "UEqn.H" // --- Pressure corrector loop while (pimple.correct()) { #include "pEqn.H" } if (pimple.turbCorr()) { turbulence->correct(); } } runTime.write(); |
|
February 12, 2016, 15:56 |
|
#6 | |
New Member
Join Date: May 2014
Posts: 5
Rep Power: 12 |
Quote:
|
||
|
|
Similar Threads | ||||
Thread | Thread Starter | Forum | Replies | Last Post |
[ICEM] Problems with coedge curves and surfaces | tommymoose | ANSYS Meshing & Geometry | 6 | December 1, 2020 12:12 |
VOF with surface tension and wall adhesion | Agad15 | Fluent Multiphase | 4 | December 20, 2016 18:07 |
surface tension gradient on a free surface | Abrem | FLUENT | 1 | April 30, 2006 04:41 |
Surface tension - Continuum Surface Force model | Robert | Main CFD Forum | 0 | May 2, 2002 08:34 |
CFX4.3 -build analysis form | Chie Min | CFX | 5 | July 13, 2001 00:19 |