CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (https://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   how to create a volScalarField of mesh.V() ??? (https://www.cfd-online.com/Forums/openfoam-programming-development/77966-how-create-volscalarfield-mesh-v.html)

sebware July 8, 2010 11:36

how to create a volScalarField of mesh.V() ???
 
Hey
I use a volScalarField with the volume of cells.
It works with the cell center but not with cell volume.

- Why the following line works
volVectorField centres = Sj.mesh().C();

- Why the following line dosn't work
volScalarField volume= Sj.mesh().V();

Sj is a volVectorField defined as follow:

volVectorField Sj
(
IOobject
(
"Sj",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),mesh, dimensionSet(1,-1,-3,0,0,-1,0)
);

thanks
Sebastian

lfbarcelo June 13, 2011 12:59

Did you ever get to fix this? I have the exact same problem.

pablodecastillo June 13, 2011 17:20

I think that mesh.V() is a scalarField, not a volscalarField ..........

Fransje July 2, 2011 07:48

Looking at the doxygen documentation on the openfoam.com website, you can see that:

Quote:

const DimensionedField< scalar, volMesh > & V () const - Return cell volumes.
Meaning that V() will return a DimensionedField.

Did you try using:
Quote:

volScalarField volume= Sj.mesh().V().field();
Kind regards,

Francois.

kathrin_kissling July 6, 2011 10:17

This is due that a volScalarField does store values on the boundary, what does not make a lot of sense for cell volumes.
So just the internalField of a volScalarField does have cell volumes

So I personally would not try to cast this into a volScalarField! What will you do on the boundaries? If you initialize the volScalarField with zero than there will be zero at the boundaries too. What happens if you divide at a point by these values?
I would just work on the internalField

volScalarField myWhatEverField =mag(U);
scalarField volumes = mesh.V();

volScalarField result(IOobject(...),mesh, 0);
result.internalField() = myWahateverField.internalField/volumes;

Do whatever you need to do on the boundaries

Best

Kathrin

Elham July 22, 2018 23:36

Quote:

Originally Posted by kathrin_kissling (Post 314939)
This is due that a volScalarField does store values on the boundary, what does not make a lot of sense for cell volumes.
So just the internalField of a volScalarField does have cell volumes

So I personally would not try to cast this into a volScalarField! What will you do on the boundaries? If you initialize the volScalarField with zero than there will be zero at the boundaries too. What happens if you divide at a point by these values?
I would just work on the internalField

volScalarField myWhatEverField =mag(U);
scalarField volumes = mesh.V();

volScalarField result(IOobject(...),mesh, 0);
result.internalField() = myWahateverField.internalField/volumes;

Do whatever you need to do on the boundaries

Best

Kathrin


Hi,

I need mesh.V() for my code which is calculating mDot for phaseChangeTwoPhaseMixtures in a multi phase flow. There is the following error:

‘mesh’ was not declared in this scope


If I changee it to :

‘mesh’ was not declared in this scope


The error is :

‘const class Foam::incompressibleThreePhaseMixture’ has no member named ‘mesh’


I will aprrciateof any help.

Cheers,

Elham

mAlletto July 29, 2018 06:33

did you try U_.mesh().V()

Elham November 12, 2018 03:00

Quote:

Originally Posted by mAlletto (Post 700816)
did you try U_.mesh().V()


It didn't work.

kk415 June 12, 2019 03:17

stuck in creating the volScalarField
 
Hello All


I am trying to create a variable delta which is cuberoot of volume. I am using it in a coupled level set VOF method, inside the code I will be using the variable for some multiplication with volume fraction and level set scalar.



Here is the code I am using in createFields,


volScalarField deltaX
(
IOobject
(
"deltaX",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh,
dimensionedScalar("deltaX",dimless, 0.0)
);
deltaX.internalField()=cbrt(mesh.V());
volScalarField gamma(deltaX*0.75);
volScalarField epsilon(deltaX*1.5);
volScalarField deltaTau(deltaX*0.1);


And it is giving the following error in the bold line


./createFields.H:228:27: error: passing ‘const Internal {aka const Foam::DimensionedField<double, Foam::volMesh>}’ as ‘this’ argument of ‘void Foam::DimensionedField<Type, GeoMesh>::operator=(const Foam::tmp<Foam::DimensionedField<Type, GeoMesh> >&) [with Type = double; GeoMesh = Foam::volMesh]’ discards qualifiers [-fpermissive]
deltaX.internalField()=cbrt(mesh.V());





Any help will be deeply appreciated.

mAlletto June 12, 2019 04:33

Did you try:

deltaX.primitiveFieldRef()=cbrt(mesh.V());

kk415 June 14, 2019 00:52

Thanks Michael,


It is working fine. But I have one more small doubt what is the difference between deltaX.primitiveFieldRef() and deltaX.Ref() ?

raumpolizei June 14, 2019 03:19

Hey kk415,
it looks like your deltaX is having the wrong type of units (I don't know if dimless is what you want, shouldn't it be in [m]?). The reason why you were having the error is due to the fact that in OF (at least in my OF versions) the function internalField returns a const reference to a geometricFields private data which is storing the internal field, thus disallowing any kind of changes to that member. internalFieldRef is the non constant counterpart which allows you to modify the field directly. Regarding your last question, the function ref() returns a reference to the dimensioned internal field. So basically, by using this function, you may have to ensure that the dimensions of your field deltaX matches cbrt(mesh.V()) . It is basically safer. With internalFieldRef, you can write directly to that field without checking units. For more information, check the extended code guide (https://www.openfoam.com/documentati...ce.html#l00041) which is undoubtedly the best resource to better understand OF.
Cheers
RP

cryabroad June 25, 2019 03:34

Quote:

Originally Posted by sebware (Post 266417)
Hey
I use a volScalarField with the volume of cells.
It works with the cell center but not with cell volume.

- Why the following line works
volVectorField centres = Sj.mesh().C();

- Why the following line dosn't work
volScalarField volume= Sj.mesh().V();

Sj is a volVectorField defined as follow:

volVectorField Sj
(
IOobject
(
"Sj",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),mesh, dimensionSet(1,-1,-3,0,0,-1,0)
);

thanks
Sebastian

This is what I have been using.

Code:

voScalarField cellSize
(
    IOobject
    (
        "cellSize",
        runTime.timeName(),
        mesh,
        IOobject::NO_READ,
        IOobject::AUTO_WRITE
    ),
    mesh,
    dimensionedScalar("zero", dimVolume, 0.0)
);
cellSize.ref() = mesh.V();

I think I actually got this piece of code by searching the forum. As others pointed out, mesh.V() doesn't store values corresponding to the boundaries, so whatever volScalarField you created to retrieve the cell volumes, you can only use the internal part.


All times are GMT -4. The time now is 23:45.