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/)
-   -   Calculate distance from vol to patch cells (https://www.cfd-online.com/Forums/openfoam-programming-development/218132-calculate-distance-vol-patch-cells.html)

landau June 10, 2019 06:31

Calculate distance from vol to patch cells
 
Hello!

I'm a very beginner in OpenFoam programming, and I would like to ask the community some help with an issue I have not been able to find any information of in this forum, or even in google.

First of all I am modelling the wind over complex terrain. I have introduced some source terms in the equations that depend on the vertical coordinate. The problem is that I need to fix the reference for the z coordinate over the ground and not over the plane z=0. Therefore I need to subtract from every cell z coordinate in the volume mesh the corresponding height of the coincident (x,y) point of the ground.

I have think of the function Foam:patchWave::patchWave().distance()

For this reason I've used (I don't think that properly) this function as follows:
Code:

 
label patchID = mesh.boundaryMesh().findPatchID("terrain");
scalarField d;//distances are stored in this variable
patchWave w(mesh, patchID, true);
d = w.distance();

The only distance it has computed is a negative one:
Code:

204901{-1e+15}
and obviously it gives an error but I do not know why.

Thank you in advance.

Héctor

clapointe June 10, 2019 07:11

Have you looked into wallDist (https://github.com/OpenFOAM/OpenFOAM...ist/wallDist.H)? It should be what you need.

Caelan

landau June 10, 2019 07:21

Thank you so much for your suggestion. The fact is that I saw this function but I didn't know how to extract a new volScalarField from the function wallDist. Could you guide me a little?

I know that the functions that wallDist has return a newmesh with updateMesh. But my goal is obtain a volscalarField with all the cell distances to the required patch.

Thank you so much for your patience.

Héctor

clapointe June 10, 2019 07:43

Fair warning -- I'm not sure if I've used it before, but I've seen it in e.g. turbulence models. I pulled this snippet from the kOmegaSST base... it might help :

Code:

y_(wallDist::New(this->mesh_).y())
.

Caelan

landau June 11, 2019 02:46

Thank you so much Caelan. So much appreciated! At the end it was much easier than I thought.

hef March 8, 2021 05:52

Quote:

Originally Posted by landau (Post 735924)
Thank you so much Caelan. So much appreciated! At the end it was much easier than I thought.

If this thread is not dead, can I ask you how you got this to work? I tried the following, which gave the same error you got:

Code:

label patchID = mesh.boundaryMesh().findPatchID("topo");
wallDist wD(mesh, patchID, "wall");
gD = wD.y();

where gD is a volScalarField which I've set up earlier in the code:

Code:

volScalarField gD
(
    IOobject
    (
        "gD",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    mesh
);

Is this the approach you have been using, or do you do something completely different?

JeremyChvlr April 6, 2021 09:48

Quote:

Originally Posted by hef (Post 798193)
If this thread is not dead, can I ask you how you got this to work? I tried the following, which gave the same error you got:

Code:

label patchID = mesh.boundaryMesh().findPatchID("topo");
wallDist wD(mesh, patchID, "wall");
gD = wD.y();

where gD is a volScalarField which I've set up earlier in the code:

Code:

volScalarField gD
(
    IOobject
    (
        "gD",
        runTime.timeName(),
        mesh,
        IOobject::READ_IF_PRESENT,
        IOobject::AUTO_WRITE
    ),
    mesh
);

Is this the approach you have been using, or do you do something completely different?


Hi all,
I have the same problem as you, has anyone found the solution? The function wallDist return a internalField equal to 1e+15.
Thank you !


Edit : In fact it was just a problem in the boundaries settings

hef April 8, 2021 04:15

A Solution
 
I eventually found a working solution to this problem. I will post it here for future reference, even if no one may need it at the moment.

I set up a volScalarField, called gD, in the same way described in my earlier post. To calculate the distance to one specific wall, I do the following

Code:

label patchID = mesh.boundaryMesh().findPatchID("nameOfSpecificWall");
labelHashSet myPatchSet;
myPatchSet.insert(patchID);
wallDist wD(mesh, myPatchSet, "wall");
gD = wD.y();

In short, the trick to avoid spurious-number errors in the resulting field (gD) is to not use the patchID directly when constructing the wallDist object, but first make a labelHashSet and use that instead (which can be seen from the source code for the relevant wallDist constructor).

I also have a follow-up question, if anyone knows the answer: Is it possible to compute the distance to a wall using only one component of the distance, e.g. the z-direction? I tried directionalMeshWave, but that did not work as I was hoping.


All times are GMT -4. The time now is 18:19.