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.

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.