CFD Online Discussion Forums

CFD Online Discussion Forums (http://www.cfd-online.com/Forums/)
-   OpenFOAM Programming & Development (http://www.cfd-online.com/Forums/openfoam-programming-development/)
-   -   How to create isoSurface in the solver itself (http://www.cfd-online.com/Forums/openfoam-programming-development/95334-how-create-isosurface-solver-itself.html)

feldy77 December 13, 2011 21:51

How to create isoSurface in the solver itself
 
Dear forum,
I am interested in coputation of Nu number on some internal surface (let say surface with the same radius, and I already have computed volScalarField R ). I want to interpolate my velocity and temperatue field in the solver (without usoin sample libriary).
Any suggestions how to do it?
I tried this constructor
Foam:: isosurface mysurf(mesh, U, R) but it does not pass compilation.
many thanks,
Yuri

fcollonv December 14, 2011 10:02

Have a look to sampledIsoSurface
 
Dear Yuri,

The class you are looking for is sampledIsoSurface or sampledIsoSurfaceCell (they are define in the following directory $FOAM_SRC/sampling/sampledSurface/isoSurface/)

You have to construct it from a dictionary (I advice you to create your own dictionary) like this
Code:

Foam::sampledIsoSurface myIsoSurf("myIsoSurface", mesh, mydict);
Where your dictionary should look like the sub-entry required in sample dict:
Code:

        // Iso surface for interpolated values only
        type            isoSurface;    // always triangulated
        isoField        R;
        isoValue        0.005;
        interpolate    true;

        //zone            ABC;          // Optional: zone only
        //exposedPatchName fixedWalls;  // Optional: zone only

        // regularise      false;    // Optional: do not simplify

Then to generate the surface, call the method "update". And to sample other fields on the surface use the function "sample".
Code:

myIsoSurf.update();
tmp<vectorField> interpolatedU = myIsoSurf.sample(U);
tmp<scalarField> interpolatedT = myIsoSurf.sample(T);

If you want to interpolate the value to the surface, it is a bit more complex. But I think the following code should do the trick.
Code:

myIsoSurf.update();
tmp<vectorField> interpolatedU = myIsoSurf.interpolate(Foam::interpolation<vector>(U));
tmp<scalarField> interpolatedT = myIsoSurf.interpolate(Foam::interpolation<scalar>(T));

Best regards,

Frederic

feldy77 December 14, 2011 18:46

Dear Frederic,
Thank you so much for a such comprehensive explanation. I have already started to implement it and faced with several problems.

1. I created my own dictionary. I called it sDict and put into the "system" directory of the case:

FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object sampleDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Iso surface for interpolated values only
interpolationScheme cellPointFace;
surfaces
(
midSphere
{
type isoSurface; // always triangulated
isoField R;
isoValue 0.4285;
interpolate true;
//zone ABC; // Optional: zone only
//exposedPatchName fixedWalls; // Optional: zone only
// regularise false; // Optional: do not simplify
}
);
now in my new solver I added two lines to create the dictionary ;


const fileName sDict("/raid0/yurifeld/OpenFoam/run/tutorials/heatTransfer/buoyantBoussinesqPimpleFoam/SpherGap/Gap0714/Ra510e4/system/sDict");
const dictionary SampleDict(sDict);

and then I create the sampling surface by

sampledIsoSurface midSphere("midSphere", mesh, SampleDict);
midSphere.update();
tmp<vectorField> interpolatedU = midSphere.sample(U);
tmp<scalarField> interpolatedT = midSphere.sample(T);


for some reason the program does not recognize the file so I am gettin a runtime error :
-> FOAM FATAL IO ERROR:
keyword isoField is undefined in dictionary "/raid0/yurifeld/OpenFoam/run/tutorials/heatTransfer/buoyantBoussinesqPimpleFoam/SpherGap/Gap0714/Ra510e4/system/sDict"
file: /raid0/yurifeld/OpenFoam/run/tutorials/heatTransfer/buoyantBoussinesqPimpleFoam/SpherGap/Gap0714/Ra510e4/system/sDict
From function dictionary::lookupEntry(const word&, bool, bool) const
in file db/dictionary/dictionary.C at line 395.

2. As far as I understand if I sample volScalarField or volVectorField on the isosurface I already get an interpolated values. In this case this is not clear for me why separate interpolation functions are necessray. And how can I sample now surface field of temperature gradient:

surfaceScalarField heatFlux =fvc::snGrad(T);

if I just write
tmp<scalarField> dTdn= midSphere.interpolate(Foam::interpolation<scalar>( T));
I get a compilation error.

3. How can I write out the interpolated/sampled fields for visualizing/debugging. I saw that there is a function print(IOstream) bu it is not clear how to work with it.
Many many thanks,
Yuri

fcollonv December 15, 2011 04:42

Answers to your questions
 
1. The dictionary should contain only the sub-entries of midSphere because by calling directly the class sampleIsoSurface you do a part of the job of sample: meaning you already specify that it is a surface and you give a name, so the only information missing are the parameters for the isoSurface.
To put it in a nutshell, your dictionary should look like
Code:

FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object sampleDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

type isoSurface; // always triangulated
isoField R;
isoValue 0.4285;
interpolate true;
//zone ABC; // Optional: zone only
//exposedPatchName fixedWalls; // Optional: zone only
// regularise false; // Optional: do not simplify

2.
Quote:

As far as I understand if I sample volScalarField or volVectorField on the isosurface I already get an interpolated values.
No, if you look at the code in "sampledIsoSurfaceTemplates.C", you can clearly read that it is just returning the value of the field in the cells cut by the iso-surface.
Code:

00033 template <class Type>
00034 Foam::tmp<Foam::Field<Type> >
00035 Foam::sampledIsoSurface::sampleField
00036 (
00037    const GeometricField<Type, fvPatchField, volMesh>& vField
00038 ) const
00039 {
00040    // Recreate geometry if time has changed
00041    updateGeometry();
00042 
00043    return tmp<Field<Type> >(new Field<Type>(vField, surface().meshCells()));
00044 }

Quote:

And how can I sample now surface field of temperature gradient
It is just a guess. But I think, it will do the job (N.B. doing an interpolation is more complicated as I said before, it looks like (see sampleSurfacesTemplates.C) that the following code should do the trick):
Code:

volVectorField gradT =fvc::grad(T);
autoPtr<Foam::interpolation<vector> > interpolator;

// The interpolator need two entries: the interpolation scheme (names possible in the sample dict) and the field to be interpolated
interpolator = Foam::interpolation<vector>::New(word("cellPointFace"), gradT);
tmp<vectorField> dTdn = midSphere.interpolate(interpolator());
// Project the gradT on the normal of the surface
tmp<scalarField> heatFlux = midSphere.project(dTdn);

3.
Quote:

How can I write out the interpolated/sampled fields for visualizing/debugging. I saw that there is a function print(IOstream) bu it is not clear how to work with it.
That also very tricky, another guess by looking again in sampleSurfacesTemplates.C and presuming you want to write it in VTK format
Code:

vtkSurfaceWriter writer();
writer.write(outputDir, midSphere.name(), midSphere.points(), midSphere.faces(), fieldName, field, interpolateBoolean);

interpolateBoolean is a flag true if the value are interpolated, false otherwise.

N.B. Your code won't work if used in parallel... if this is mandatory I advice you to understand exactly the function sampleAndWrite of sampledSurfacesTemplates.C

I hope it will work.

Kindly,

Frederic

ziemowitzima January 30, 2013 15:00

Hi,
I am trying similar thing, but I have some more basic problem.
Namely, my solver does not want to compile after I add line:
#include "sampledIsoSurface.H"

I guess I need it to define:
sampledIsoSurface midSphere("midSphere", mesh, SampleDict);

I have strange error, which seems to point on some OpenFOAM files:

SOURCE=cuette_spr.C ; g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3 -DNoRepository -ftemplate-depth-100 -I/opt/openfoam210/src/finiteVolume/lnInclude -I/opt/openfoam210/src/meshTools/lnInclude -I/opt/openfoam210/src/surfMesh/lnInclude -I/opt/openfoam210/src/triSurface/lnInclude -I/opt/openfoam210/src/conversion/lnInclude -I/opt/openfoam210/src/sampling/lnInclude -I/opt/openfoam210/src/lagrangian/basic/lnInclude -IlnInclude -I. -I/opt/openfoam210/src/OpenFOAM/lnInclude -I/opt/openfoam210/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o Make/linux64GccDPOpt/cuette_spr.o
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:42:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/Random.H: In function ‘int main(int, char**)’:
/opt/openfoam210/src/OpenFOAM/lnInclude/Random.H:43:1: error: ‘namespace’ definition is not allowed here
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:48:1: error: ‘namespace’ definition is not allowed here
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:32:1: error: a template declaration cannot appear at block scope
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:248:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:46:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:60:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:69:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:75:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:81:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:88:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:95:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:102:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:109:1: error: expected ‘;’ before ‘template’
createFields.H:192:11: warning: unused variable ‘pRefCell’ [-Wunused-variable]
createFields.H:193:12: warning: unused variable ‘pRefValue’ [-Wunused-variable]
cuette_spr.C:180:1: error: expected ‘}’ at end of input
make: *** [Make/linux64GccDPOpt/cuette_spr.o] Błąd 1

I hope you can help me with this...
Best
MM

ziemowitzima January 30, 2013 16:46

Dear Frederic,
Dear Yuri,
Please ignore my previous post. I fixed this problem.

I did everything like suggested in yours thread, but I still have this runtime error:
HTML Code:

--> FOAM FATAL IO ERROR:
keyword isoField is undefined in dictionary "/home/zima/OpenFOAM/zima-2.1.0/run/tutorials/cuette_flow/cuette_spr/system/sDict"

file: /home/zima/OpenFOAM/zima-2.1.0/run/tutorials/cuette_flow/cuette_spr/system/sDict

    From function dictionary::lookupEntry(const word&, bool, bool) const
    in file db/dictionary/dictionary.C at line 400.

FOAM exiting

Do you know maybe how to fix this problem ?

Best and thanks
ZMM

hz283 October 13, 2013 09:22

Hi fcollonv,

When we calculate the other quantities on this iso-surface, can we also calculate the normal and tangential gradients at the points on that iso-surface? This correspond to the local coordinates maybe not the original coordinates. Thank you.


Quote:

Originally Posted by fcollonv (Post 335810)
Dear Yuri,

The class you are looking for is sampledIsoSurface or sampledIsoSurfaceCell (they are define in the following directory $FOAM_SRC/sampling/sampledSurface/isoSurface/)

You have to construct it from a dictionary (I advice you to create your own dictionary) like this
Code:

Foam::sampledIsoSurface myIsoSurf("myIsoSurface", mesh, mydict);
Where your dictionary should look like the sub-entry required in sample dict:
Code:

        // Iso surface for interpolated values only
        type            isoSurface;    // always triangulated
        isoField        R;
        isoValue        0.005;
        interpolate    true;

        //zone            ABC;          // Optional: zone only
        //exposedPatchName fixedWalls;  // Optional: zone only

        // regularise      false;    // Optional: do not simplify

Then to generate the surface, call the method "update". And to sample other fields on the surface use the function "sample".
Code:

myIsoSurf.update();
tmp<vectorField> interpolatedU = myIsoSurf.sample(U);
tmp<scalarField> interpolatedT = myIsoSurf.sample(T);

If you want to interpolate the value to the surface, it is a bit more complex. But I think the following code should do the trick.
Code:

myIsoSurf.update();
tmp<vectorField> interpolatedU = myIsoSurf.interpolate(Foam::interpolation<vector>(U));
tmp<scalarField> interpolatedT = myIsoSurf.interpolate(Foam::interpolation<scalar>(T));

Best regards,

Frederic


Yoann September 8, 2014 10:07

Quote:

Originally Posted by ziemowitzima (Post 405122)
Hi,
I am trying similar thing, but I have some more basic problem.
Namely, my solver does not want to compile after I add line:
#include "sampledIsoSurface.H"

I guess I need it to define:
sampledIsoSurface midSphere("midSphere", mesh, SampleDict);

I have strange error, which seems to point on some OpenFOAM files:

SOURCE=cuette_spr.C ; g++ -m64 -Dlinux64 -DWM_DP -Wall -Wextra -Wno-unused-parameter -Wold-style-cast -Wnon-virtual-dtor -O3 -DNoRepository -ftemplate-depth-100 -I/opt/openfoam210/src/finiteVolume/lnInclude -I/opt/openfoam210/src/meshTools/lnInclude -I/opt/openfoam210/src/surfMesh/lnInclude -I/opt/openfoam210/src/triSurface/lnInclude -I/opt/openfoam210/src/conversion/lnInclude -I/opt/openfoam210/src/sampling/lnInclude -I/opt/openfoam210/src/lagrangian/basic/lnInclude -IlnInclude -I. -I/opt/openfoam210/src/OpenFOAM/lnInclude -I/opt/openfoam210/src/OSspecific/POSIX/lnInclude -fPIC -c $SOURCE -o Make/linux64GccDPOpt/cuette_spr.o
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:42:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/Random.H: In function ‘int main(int, char**)’:
/opt/openfoam210/src/OpenFOAM/lnInclude/Random.H:43:1: error: ‘namespace’ definition is not allowed here
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:48:1: error: ‘namespace’ definition is not allowed here
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:32:1: error: a template declaration cannot appear at block scope
In file included from /opt/openfoam210/src/OpenFOAM/lnInclude/triangle.H:248:0,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triPointRef.H:35,
from /opt/openfoam210/src/OpenFOAM/lnInclude/triFace.H:48,
from /opt/openfoam210/src/triSurface/lnInclude/labelledTri.H:38,
from /opt/openfoam210/src/triSurface/lnInclude/triSurface.H:40,
from /opt/openfoam210/src/sampling/lnInclude/isoSurface.H:66,
from cuette_spr.C:49:
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:46:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:60:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:69:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:75:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:81:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:88:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:95:1: error: expected ‘;’ before ‘template’
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:102:1: error: a template declaration cannot appear at block scope
/opt/openfoam210/src/OpenFOAM/lnInclude/triangleI.H:109:1: error: expected ‘;’ before ‘template’
createFields.H:192:11: warning: unused variable ‘pRefCell’ [-Wunused-variable]
createFields.H:193:12: warning: unused variable ‘pRefValue’ [-Wunused-variable]
cuette_spr.C:180:1: error: expected ‘}’ at end of input
make: *** [Make/linux64GccDPOpt/cuette_spr.o] Błąd 1

I hope you can help me with this...
Best
MM

Dear Mieszkor,

I know the topic is old but I have the same error.

Remember how you solved this problem ?

Thanks.


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