openfoam/tutorials/compressible/rhoPorousSimpleFoam/angledDuct/implicit/system/sampling
Mark Olesen ad0235a751 ENH: support surface writer output transform (#2505)
- this allows the "relocation" of sampled surfaces. For example,
  to reposition into a different coordinate system for importing
  into CAD.

- incorporate output scaling for all surface writer types.

  This was previously done on an adhoc basis for different writers,
  but with now included in the base-level so that all writers
  can automatically use scale + transform.

  Example:

  formatOptions
  {
      vtk
      {
          scale 1000;  // m -> mm
          transform
          {
              origin  (0.05 0 0);
              rotation axisAngle;
              axis    (0 0 1);
              angle   -45;
          }
      }
  }
2022-06-13 08:22:52 +00:00

167 lines
4.5 KiB
C++

/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2206 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
cellZoneID
{
type coded;
libs (utilityFunctionObjects);
name cellZoneID;
executeControl writeTime;
localCode
#{
static const word fieldName("cellZoneID");
// Create and populate a "cellZoneID" volScalarField for cellZones.
// Return nullptr if there are not any such zones.
//
// Could be improved for mesh motion etc
// but is fairly low overhead anyhow
volScalarField* getZoneField(const fvMesh& mesh)
{
volScalarField* volZonePtr =
mesh.getObjectPtr<volScalarField>(fieldName);
const cellZoneMesh& zones = mesh.cellZones();
if (!zones.empty())
{
if (!volZonePtr)
{
volZonePtr = &regIOobject::store
(
volScalarField::New
(
fieldName,
mesh,
dimless,
zeroGradientFvPatchField<scalar>::typeName
)
);
Info<< "Creating " << fieldName
<< " field for postProcessing" << nl;
}
}
else
{
Info<< "No cellZones - not creating " << fieldName
<< " field for postProcessing" << nl;
}
if (volZonePtr)
{
// Copy zone id as scalar.
// For consistency, do this whenever the volField exists,
// even if there are no zones.
auto& field = *volZonePtr;
auto& internal = field.primitiveFieldRef();
internal = scalar(-1);
for (const cellZone& zn : zones)
{
UIndirectList<scalar>(internal, zn) = scalar(zn.index());
}
field.correctBoundaryConditions();
}
return volZonePtr;
}
#};
codeExecute
#{
// Don't need the return value, just the contents on the registry.
(void) getZoneField(mesh());
#};
}
plane
{
type surfaces;
libs (sampling);
writeControl writeTime;
fields ( cellZoneID U );
surfaceFormat vtk;
surfaces
{
zNormal
{
type cuttingPlane;
point (0 0 0);
normal (0 0 1);
interpolate false;
surfaceFormat ensight;
formatOptions
{
ensight
{
scale 2; // Some arbitrary scaling
// Align with global x-axis, translate by arbitrary amount
transform
{
origin (0.05 -0.05 0);
rotation axisAngle;
axis (0 0 1);
angle -45;
}
}
}
}
slices
{
type cuttingPlane;
point (0 0 0);
normal (1 0 0);
offsets (0.02 0.04 0.06 0.08);
interpolate true;
transform
{
origin (0 0 0);
rotation axisAngle;
axis (0 0 1);
angle 45;
}
formatOptions
{
vtk
{
scale 2; // Some arbitrary scaling
// Align with global x-axis, translate by arbitrary amount
transform
{
origin (0.05 0 0);
rotation axisAngle;
axis (0 0 1);
angle -45;
}
}
}
}
}
}
// ************************************************************************* //