Commit Graph

5925 Commits

Author SHA1 Message Date
8f8fa29e3e createNonConformalCouples: linked genericPatchFields library 2022-05-19 16:42:52 +01:00
2cac6285ea foamCloneCase: -startFrom option to set the time directory
When cloning a case, users can copy the field data from the
from the latest time directory in the source case, using
the -latestTime option.

The -startFrom option enables the copied time directory to be
renamed, often as the '0' (zero) directory in the new case, e.g.

    foamCloneCase -latestTime -startFrom 0 sourceCase newCase

When the time directories in the source and new cases are
different, the uniform directory and flux field "phi" are
deleted from the copied time directory to avoid incorrect
initial state.
2022-05-19 15:30:06 +01:00
94132c3a55 createNonConformalCouples: Added the option to modify fields
This utility can now add boundary conditions to fields which correspond
to the non-conformal patches that it adds to the mesh. This action is
enabled by means of a 'fields true;' flag which can be added to the
'system/createNonConformalCouplesDict'. No additional control is needed,
because all patches created by this utility are of constraint type.
2022-05-19 11:39:31 +01:00
755c0aa869 tutorials: TJunctionFan: Simplified orig usage 2022-05-19 09:50:46 +01:00
5fadb57d5d fvMeshStitcher: Fixed compilation of list reductions with Clang 2022-05-18 16:07:06 +01:00
4ee4477343 meshToMesh: Prevent initialisation failure on conformal sets of cells 2022-05-18 14:45:11 +01:00
2d25eacea8 pointPatchFields: Corrected setInInternalField -> setInternalField 2022-05-18 13:46:49 +01:00
90dffb91af polyBoundaryMesh: Clear patch-face IDs along with patch IDs 2022-05-18 11:47:06 +01:00
b4b8b212bf cyclicACMI, cyclicRepeatAMI: Removed
The functionality provided by 'cyclicACMI' and 'cyclicRepeatAMI' has
been entirely superseded by non-conformal coupled (NCC). All references
to 'cyclicACMI' and 'cyclicRepeatAMI' have therefore been removed.

See previous commits 569fa31d and 420866cf for more explanation,
instructions on updating, and relevant tutorial cases.
2022-05-18 10:26:34 +01:00
420866cfa6 Non-Conformal Coupled (NCC): Conversion of tutorials from AMI to NCC
The following examples in the tutorials ($FOAM_TUTORIALS) directory have
been converted from using AMI to the new NCC system:

+ compressible/rhoPimpleFoam/RAS/annularThermalMixer
+ incompressible/pimpleFoam/RAS/propeller
+ lagrangian/particleFoam/mixerVessel2D (formerly mixerVesselAMI2D)
+ multiphase/interFoam/RAS/mixerVessel
+ multiphase/interFoam/RAS/propeller
+ multiphase/multiphaseEulerFoam/laminar/mixerVessel2D (formerly mixerVesselAMI2D)

The following tutorial has been converted from using ACMI:

+ incompressible/pimpleFoam/RAS/oscillatingInlet

The following tutorial has been converted from using Repeat AMI:

+ incompressible/pimpleFoam/RAS/impeller

The following tutorial has been added to demonstrate NCC's ability to
create a sufficiently conservative solution in a closed domain to
maintain phase fraction boundedness:

+ multiphase/interFoam/laminar/mixerVessel2D

The following tutorials have been added to demonstrate NCC's ability to
simulate partially overlapping couples on curved surfaces:

+ incompressible/pimpleFoam/RAS/ballValve
+ multiphase/compressibleInterFoam/RAS/ballValve

The following tutorial has been added to provide a simple comparison of
the conservation behaviour of AMI and NCC:

+ incompressible/pimpleFoam/laminar/nonConformalChannel

The following tutorial has been removed, as there were sufficiently many
examples involving this geometry:

+ incompressible/pimpleFoam/laminar/mixerVesselAMI2D
2022-05-18 10:25:43 +01:00
569fa31d09 Non-Conformal Coupled (NCC): Conservative coupling of non-conforming patches
This major development provides coupling of patches which are
non-conformal, i.e. where the faces of one patch do not match the faces
of the other. The coupling is fully conservative and second order
accurate in space, unlike the Arbitrary Mesh Interface (AMI) and
associated ACMI and Repeat AMI methods which NCC replaces.

Description:

A non-conformal couple is a connection between a pair of boundary
patches formed by projecting one patch onto the other in a way that
fills the space between them. The intersection between the projected
surface and patch forms new faces that are incorporated into the finite
volume mesh. These new faces are created identically on both sides of
the couple, and therefore become equivalent to internal faces within the
mesh. The affected cells remain closed, meaning that the area vectors
sum to zero for all the faces of each cell. Consequently, the main
benefits of the finite volume method, i.e. conservation and accuracy,
are not undermined by the coupling.

A couple connects parts of mesh that are otherwise disconnected and can
be used in the following ways:

+ to simulate rotating geometries, e.g. a propeller or stirrer, in which
  a part of the mesh rotates with the geometry and connects to a
  surrounding mesh which is not moving;
+ to connect meshes that are generated separately, which do not conform
  at their boundaries;
+ to connect patches which only partially overlap, in which the
  non-overlapped section forms another boundary, e.g. a wall;
+ to simulate a case with a geometry which is periodically repeating by
  creating multiple couples with different transformations between
  patches.

The capability for simulating partial overlaps replaces the ACMI
functionality, currently provided by the 'cyclicACMI' patch type, and
which is unreliable unless the couple is perfectly flat. The capability
for simulating periodically repeating geometry replaces the Repeat AMI
functionality currently provided by the 'cyclicRepeatAMI' patch type.

Usage:

The process of meshing for NCC is very similar to existing processes for
meshing for AMI. Typically, a mesh is generated with an identifiable set
of internal faces which coincide with the surface through which the mesh
will be coupled. These faces are then duplicated by running the
'createBaffles' utility to create two boundary patches. The points are
then split using 'splitBaffles' in order to permit independent motion of
the patches.

In AMI, these patches are assigned the 'cyclicAMI' patch type, which
couples them using AMI interpolation methods.

With NCC, the patches remain non-coupled, e.g. a 'wall' type. Coupling
is instead achieved by running the new 'createNonConformalCouples'
utility, which creates additional coupled patches of type
'nonConformalCyclic'. These appear in the 'constant/polyMesh/boundary'
file with zero faces; they are populated with faces in the finite volume
mesh during the connection process in NCC.

For a single couple, such as that which separates the rotating and
stationary sections of a mesh, the utility can be called using the
non-coupled patch names as arguments, e.g.

    createNonConformalCouples -overwrite rotatingZoneInner rotatingZoneOuter

where 'rotatingZoneInner' and 'rotatingZoneOuter' are the names of the
patches.

For multiple couples, and/or couples with transformations,
'createNonConformalCouples' should be run without arguments. Settings
will then be read from a configuration file named
'system/createNonConformalCouplesDict'. See
'$FOAM_ETC/caseDicts/annotated/createNonConformalCouplesDict' for
examples.

Boundary conditions must be specified for the non-coupled patches. For a
couple where the patches fully overlap, boundary conditions
corresponding to a slip wall are typically applied to fields, i.e
'movingWallSlipVelocity' (or 'slip' if the mesh is stationary) for
velocity U, 'zeroGradient' or 'fixedFluxPressure' for pressure p, and
'zeroGradient' for other fields.  For a couple with
partially-overlapping patches, boundary conditions are applied which
physically represent the non-overlapped region, e.g. a no-slip wall.

Boundary conditions also need to be specified for the
'nonConformalCyclic' patches created by 'createNonConformalCouples'. It
is generally recommended that this is done by including the
'$FOAM_ETC/caseDicts/setConstraintTypes' file in the 'boundaryField'
section of each of the field files, e.g.

    boundaryField
    {
        #includeEtc "caseDicts/setConstraintTypes"

        inlet
        {
             ...
        }

        ...
    }

For moving mesh cases, it may be necessary to correct the mesh fluxes
that are changed as a result of the connection procedure. If the
connected patches do not conform perfectly to the mesh motion, then
failure to correct the fluxes can result in noise in the pressure
solution.

Correction for the mesh fluxes is enabled by the 'correctMeshPhi' switch
in the 'PIMPLE' (or equivalent) section of 'system/fvSolution'. When it
is enabled, solver settings are required for 'MeshPhi'. The solution
just needs to distribute the error enough to dissipate the noise. A
smooth solver with a loose tolerance is typically sufficient, e.g. the
settings in 'system/fvSolution' shown below:

    solvers
    {
        MeshPhi
        {
            solver          smoothSolver;
            smoother        symGaussSeidel;
            tolerance       1e-2;
            relTol          0;
        }
        ...
    }

    PIMPLE
    {
         correctMeshPhi      yes;
         ...
    }

The solution of 'MeshPhi' is an inexpensive computation since it is
applied only to a small subset of the mesh adjacent to the
couple. Conservation is maintained whether or not the mesh flux
correction is enabled, and regardless of the solution tolerance for
'MeshPhi'.

Advantages of NCC:

+ NCC maintains conservation which is required for many numerical
  schemes and algorithms to operate effectively, in particular those
  designed to maintain boundedness of a solution.

+ Closed-volume systems no longer suffer from accumulation or loss of
  mass, poor convergence of the pressure equation, and/or concentration
  of error in the reference cell.

+ Partially overlapped simulations are now possible on surfaces that are
  not perfectly flat. The projection fills space so no overlaps or
  spaces are generated inside contiguously overlapping sections, even if
  those sections have sharp angles.

+ The finite volume faces created by NCC have geometrically accurate
  centres. This makes the method second order accurate in space.

+ The polyhedral mesh no longer requires duplicate boundary faces to be
  generated in order to run a partially overlapped simulation.

+ Lagrangian elements can now transfer across non-conformal couplings in
  parallel.

+ Once the intersection has been computed and applied to the finite
  volume mesh, it can use standard cyclic or processor cyclic finite
  volume boundary conditions, with no need for additional patch types or
  matrix interfaces.

+ Parallel communication is done using the standard
  processor-patch-field system. This is more efficient than alternative
  systems since it has been carefully optimised for use within the
  linear solvers.

+ Coupled patches are disconnected prior to mesh motion and topology
  change and reconnected afterwards. This simplifies the boundary
  condition specification for mesh motion fields.

Resolved Bug Reports:

+ https://bugs.openfoam.org/view.php?id=663
+ https://bugs.openfoam.org/view.php?id=883
+ https://bugs.openfoam.org/view.php?id=887
+ https://bugs.openfoam.org/view.php?id=1337
+ https://bugs.openfoam.org/view.php?id=1388
+ https://bugs.openfoam.org/view.php?id=1422
+ https://bugs.openfoam.org/view.php?id=1829
+ https://bugs.openfoam.org/view.php?id=1841
+ https://bugs.openfoam.org/view.php?id=2274
+ https://bugs.openfoam.org/view.php?id=2561
+ https://bugs.openfoam.org/view.php?id=3817

Deprecation:

NCC replaces the functionality provided by AMI, ACMI and Repeat AMI.
ACMI and Repeat AMI are insufficiently reliable to warrant further
maintenance so are removed in an accompanying commit to OpenFOAM-dev.
AMI is more widely used so will be retained alongside NCC for the next
version release of OpenFOAM and then subsequently removed from
OpenFOAM-dev.
2022-05-18 10:25:43 +01:00
94679fa88d meshTools: Added patchToPatch class for patch mapping 2022-05-18 10:25:42 +01:00
96199075a6 meshTools: Added triIntersect algorithm 2022-05-18 10:25:42 +01:00
967a0257f2 Added vol, surface, and point label fields 2022-05-18 10:25:42 +01:00
583fc4aec0 driftFluxFoam::relativeVelocityModel: Updated dispersed-phase flow acceleration estimate
// Dispersed phase velocity
    // const volVectorField Ud(mixture_.U() + Udm_);

    // Use the mixture rather than the dispersed-phase velocity to approximate
    // the dispersed-phase acceleration to improve stability as only the mixture
    // momentum equation is coupled to continuity and pressure
    //
    // This approximation is valid only in the limit of small drift-velocity.
    // For large drift-velocity an Euler-Euler approach should be used in
    // which both the continuous and dispersed-phase momentum equations are
    // solved and coupled to the pressure.
    const volVectorField& Ud = mixture_.U();

    return g_ - (Ud & fvc::grad(Ud));
2022-05-17 14:01:59 +01:00
0ead4cbc81 driftFluxFoam::mixtureViscosityModels::Quemada: Improved stability in the limit of alpha -> alphaMax 2022-05-17 14:01:24 +01:00
7dd5c4d3fa XiFoam: Removed redundant rhoEqn solution after mesh topology change
Resolves bug-report https://bugs.openfoam.org/view.php?id=3838
2022-05-14 13:00:27 +01:00
590d2ce5d0 Function1, Function2: Improved and standardised usage documentation 2022-05-13 22:23:59 +01:00
16c0c68e92 tutorials: planarCouette: Simplify creation of cyclic patches 2022-05-13 16:17:31 +01:00
e22784f5b2 regionCoupled: Removed unused code 2022-05-12 20:17:18 +01:00
2d1428f667 sampledSurfaces: Added optional "writeEmpty" keyword
This control forces writing of surfaces, even when they have no faces.
This can be useful for smoothly animating isoSurfaces that do not exist
at all write times.

It can be used to force writing of an isoSurface in the following way,
in system/controlDict:

    functions
    {
        #includeFunc isoSurface
        (
            isoField=alpha.water,
            isoValue=0.5,
            writeEmpty=yes
        )
    }
2022-05-12 16:25:23 +01:00
6ebf845bc8 Function1s::squarePulse: Implemented integral 2022-05-12 12:00:20 +01:00
137a40ef56 Documentation: Moved "Notes" entries into the corresponding "Description" or "Usage"
This simplifies parsing the headers and ensures the notes are included in the
text they relate to by both Doxygen and foamInfo.
2022-05-12 09:51:14 +01:00
03211cda95 Merge branch 'master' of github.com-OpenFOAM:OpenFOAM/OpenFOAM-dev 2022-05-11 21:28:42 +01:00
48d9c77085 Updated documentation for foamInfo: The "Note" entry is now part of "Description" or "Usage"
so that it is printed by foamInfo.
2022-05-11 21:27:27 +01:00
0999cd0efe multiphaseEulerFoam: Added pipeBend tutorial
This tutorial simulates solid particle coalescence and breakage through
a 90 degree pipe bend.

Patch contributed by Kasper Gram Bilde and Institute of Fluid Dynamics,
Helmholtz-Zentrum Dresden - Rossendorf (HZDR)
2022-05-11 15:30:11 +01:00
7a8f59e2b9 Merge branch 'master' of github.com-OpenFOAM:OpenFOAM/OpenFOAM-dev 2022-05-10 16:05:42 +01:00
a346040bcb MomentumTransportModels::ReynoldsStress: Improved the R-U coupling stabilisation algorithm
On unstructured collocated meshes the Reynolds stress tends to decouple from the
velocity creating pronounced staggering patterns in the solution.  This effect
is reduced or eliminated by a special coupling algorithm which replaces the
gradient diffusion component of the Reynolds stress with the equivalent compact
representation on the mesh, i.e. div-grad with Laplacian in the DivDevRhoReff function:

template<class BasicMomentumTransportModel>
template<class RhoFieldType>
Foam::tmp<Foam::fvVectorMatrix>
Foam::ReynoldsStress<BasicMomentumTransportModel>::DivDevRhoReff
(
    const RhoFieldType& rho,
    volVectorField& U
) const
{
    tmp<volTensorField> tgradU = fvc::grad(U);
    const volTensorField& gradU = tgradU();
    const surfaceTensorField gradUf(fvc::interpolate(gradU));

    // Interpolate Reynolds stress to the faces
    // with either a stress or velocity coupling correction
    const surfaceVectorField Refff
    (
        (this->mesh().Sf() & fvc::interpolate(R_))

        // Stress coupling
      + couplingFactor_
       *(this->mesh().Sf() & fvc::interpolate(this->nut()*gradU))

        // or velocity gradient coupling
   // + couplingFactor_
   //  *fvc::interpolate(this->nut())*(this->mesh().Sf() & gradUf)

      - fvc::interpolate(couplingFactor_*this->nut() + this->nu())
       *this->mesh().magSf()*fvc::snGrad(U)
      - fvc::interpolate(this->nu())*(this->mesh().Sf() & dev2(gradUf.T()))
    );

    return
    (
        fvc::div(fvc::interpolate(this->alpha_*rho)*Refff)
      - correction(fvm::laplacian(this->alpha_*rho*this->nuEff(), U))
    );
}

In the above two options for the coupling term are provided, one based on the
stress correction (un-commented) and an alternative based an the velocity
gradient correction (commented).  Tests run so far indicate that the stress
correction provides better coupling while minimising the error introduced.

A new tutorial case ductSecondaryFlow is provided which demonstrates the updated
coupling algorithm on the simulation of the classic secondary flow generated in
rectangular ducts.
2022-05-10 15:54:03 +01:00
1bf620e963 <solver> -postProcess: Support changing meshes 2022-05-10 10:12:59 +01:00
774ff647b0 transformPoints: Added option to restrict transformation to a point set
Transformation can now be restricted to a specific point set by means of
a new -pointSet option. For example, to move the rotating part of a
geometry through 45 degrees around the Z axis, the following command
could be used:

    transformPoints -pointSet rotating "Rz=45"

This assumes a point set called "rotating" has been defined during
meshing or by calling topoSet.
2022-05-07 15:21:16 +01:00
d0ccea2196 generalisedNewtonianViscosityModels: Updated and simplified reading of coefficients 2022-05-06 17:19:39 +01:00
a3f61193a8 fvMeshMoversLayeredEngine: Allow mesh-to-mesh mapping at run-time 2022-05-06 15:56:27 +01:00
55533d2872 tutorials/multiphase/interFoam: Removed unused rhoInf entries from forces functionObject spec 2022-05-06 10:13:54 +01:00
04c54ad541 fvMeshDistribute: Removed topology changes to meshObjects
The topology changes occur in the intermediate steps during mesh sub-division
and addition, there is no need to update meshObjects during this phase, these
are updated at the end of the redistribution by the distribute function called
for each.  The distribute functions for nearWallDist and wallDist have been
updated accordingly.
2022-05-05 13:23:15 +01:00
fc74899204 domainDecomposition: Bug fix to prevent unnecessary mesh copies 2022-05-04 22:21:32 +01:00
7fa89fb6a2 ddtSchemes, fvcMeshPhi: Added patch meshPhi function
to simplify and improve the efficiency of moving wall boundary conditions and
for future use in handling absolute and relative fluxes on patches.
2022-05-04 17:15:49 +01:00
7e84102215 MRF: Added support for moving mesh cases including MRF regions
Now stationary MRF regions may be embedded in moving mesh cases.  While in
principle MRF regions moving with the mesh is supported by this development
there is no special handling with the MRF implementation to support the required
specification of the motion of the MRF regions.
2022-05-04 11:34:45 +01:00
01d82d1e51 rhoPimpleFoam, XiFoam: Updated pEqn to support the fixedFluxExtrapolatedPressure BC 2022-05-03 22:39:44 +01:00
38262243cc flowRateInletVelocity: Map wall distance on decompose, rather than recompute
A wall distance computation will not be correct on a disconnected
processor case. This is also more efficient.

Resolves bug report https://bugs.openfoam.org/view.php?id=3833
2022-05-03 12:25:23 +01:00
00777cffa4 fvPatchDistWave: Generate FV mesh geometry before the wave
This prevents hangs from occurring when a single processor accesses the
cell or face centres
2022-05-03 10:35:47 +01:00
376b51b58b multiphaseEulerFoam::populationBalanceModel: improved dilatation treatment
The population balance model considers dilatation originating from density
change and mass transfer via source terms describing nucleation as well as
"drift" of the size distribution to smaller or larger sizes. Numerically, the
treatment does not necessarily equal the total dilatation, hence a correction is
introduced to ensure boundedness of the size group fractions.

Patch contributed by Institute of Fluid Dynamics,
Helmholtz-Zentrum Dresden - Rossendorf (HZDR)
and VTT Technical Research Centre of Finland Ltd.
2022-04-29 16:18:03 +01:00
58444464aa initialConditions: Corrected header
Resolves bug-report https://bugs.openfoam.org/view.php?id=3831
2022-04-29 12:29:05 +01:00
3ef1a3287e applications/solvers/multiphase::pEqn: Check for rAU validity before resetting
Avoids problems when the mesh is not changing but correctPhi is set true.
2022-04-27 14:56:14 +01:00
54de79b573 fvMeshTopoChangersRefiner: Avoid writing the pointLevel and cellLevel files if the mesh has not changed 2022-04-27 14:55:34 +01:00
95b6b0c003 tutorials: Renamed 2D MRF mixer vessel cases to mixerVessel2DMRF 2022-04-27 12:31:09 +01:00
2beec217d9 tutorials: interFoam: mixerVessel2D: Fix typo 2022-04-27 12:17:21 +01:00
3a2f1b7dd7 Merge branch 'master' of github.com-OpenFOAM:OpenFOAM/OpenFOAM-dev 2022-04-27 12:10:56 +01:00
dd8e1fb5e0 LaheyKEpsilon: coefficient C3 -> C4 to avoid name clash with C3 in the base kEpsilon 2022-04-27 12:09:20 +01:00
b92fdc82f5 tutorials: pipeCyclic: Overhaul
The refinement cell set is now generated directly using boxToCell. The
mesh now uses cyclic, rather than cyclicAMI, patches so that propagation
of the refinement across the coupling can be tested. Field files have
been simplified by using #includeEtc to set constraints. A best practice
velocity/pressure specification has been set for the outlet boundary.
Unused fields and settings have been removed.
2022-04-27 11:54:41 +01:00
7b3631bc53 surfaceInterpolation::phaseStabilised, phaseStabilisedSnGrad: phase-fraction stabilised schemes
New interpolation and snGrad schemes to help stabilise multiphaseEulerFoam runs
on poor meshes by reverting to a bounded form when the phase-fraction
corresponding to the phase of the field argument is less than 1e-3.  If this
approach proves effective and it would be useful to adjust the phase-fraction
limit it could be made a user input.

Class
    Foam::phaseStabilised

Description
    Phase-stabilised interpolation scheme

    which applies upwind to the faces at which the upwind phase-fraction is less
    than 1e-3.

Class
    Foam::fv::phaseStabilisedSnGrad

Description
    snGrad scheme with phase-fraction limited non-orthogonal correction.

    When the phase-fraction is less than 1e-3 the non-orthogonal correction is
    set to 0.

Example specification in fvSchemes:

gradSchemes
{
    default         Gauss linear;
    limited         cellLimited Gauss linear 1;
}

divSchemes
{
    default                         none;

    .
    .
    .

    "div\(alphaRhoPhi.*,U.*\)"      Gauss phaseStabilised linearUpwindV limited;
    "div\(phi.*,U.*\)"              Gauss phaseStabilised linearUpwindV limited;

    "div\(alphaRhoPhi.*,(h|e).*\)"  Gauss phaseStabilised limitedLinear 1;
    "div\(alphaRhoPhi.*,K.*\)"      Gauss phaseStabilised limitedLinear 1;
    "div\(alphaRhoPhi.*,\(p\|thermo:rho.*\)\)" Gauss phaseStabilised limitedLinear 1;

    .
    .
    .
}

laplacianSchemes
{
    default         Gauss linear limited corrected 0.33;

    phaseStabilised Gauss linear phaseStabilised limited corrected 0.33;

    laplacian(((alpha.air*thermo:rho.air)*nuEff.air),U.air) $phaseStabilised;
    laplacian(((alpha.water*thermo:rho.water)*nuEff.water),U.water) $phaseStabilised;

    laplacian((alpha.air*alphaEff),h.air) $phaseStabilised;
    laplacian((alpha.water*alphaEff),e.water) $phaseStabilised;
}
2022-04-27 11:03:01 +01:00