Compare commits

..

1 Commits

Author SHA1 Message Date
256dafeea5 ENH: fvMatrix: adding setValues for patch
Speedup in offloading
2025-03-05 09:11:47 +00:00
11643 changed files with 33634 additions and 65481 deletions

3
.gitignore vendored
View File

@ -11,7 +11,6 @@
# File-browser settings - anywhere # File-browser settings - anywhere
.directory .directory
.DS_Store # OSX app store
# Backup/recovery versions - anywhere # Backup/recovery versions - anywhere
.#* .#*
@ -39,8 +38,6 @@ linux*Gcc*/
linux*Icc*/ linux*Icc*/
solaris*Gcc*/ solaris*Gcc*/
SunOS*Gcc*/ SunOS*Gcc*/
darwin*Clang*/
darwin*Gcc*/
platforms/ platforms/
# Top-level build directories # Top-level build directories

View File

@ -49,7 +49,7 @@
<!-- <!--
Providing details of your set-up can help us identify any issues, e.g. Providing details of your set-up can help us identify any issues, e.g.
OpenFOAM version : v2506|v2412|v2406|v2312|v2306 etc OpenFOAM version : v2412|v2406|v2312|v2306|v2212 etc
Operating system : ubuntu|openSUSE|RedHat etc Operating system : ubuntu|openSUSE|RedHat etc
Hardware info : any info that may help? Hardware info : any info that may help?
Compiler : gcc|clang etc Compiler : gcc|clang etc

View File

@ -1,15 +1,13 @@
#!/bin/sh #!/bin/sh
cd "${0%/*}" || exit # Run from this directory
set -- -all="${0##*/}" "$@" # Execute this instead of ./Allwmake
# Run from OPENFOAM top-level directory only # Run from OPENFOAM top-level directory only
cd "${0%/*}" || exit
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || { wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR" echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
echo " Check your OpenFOAM environment and installation" echo " Check your OpenFOAM environment and installation"
exit 1 exit 1
} }
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ] if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \ then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
echo "Argument parse error" echo "Argument parse error"
else else
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect" echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
@ -33,7 +31,7 @@ case "$FOAM_MODULE_PREFIX" in
;; ;;
(*) (*)
# Use wmake -all instead of Allwmake to allow for overrides # Use wmake -all instead of Allwmake to allow for overrides
( cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all $* ) ( cd "$WM_PROJECT_DIR/modules" 2>/dev/null && wmake -all )
esac esac
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -1,15 +1,13 @@
#!/bin/sh #!/bin/sh
cd "${0%/*}" || exit # Run from this directory
set -- -all="${0##*/}" "$@" # Execute this instead of ./Allwmake
# Run from OPENFOAM top-level directory only # Run from OPENFOAM top-level directory only
cd "${0%/*}" || exit
wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || { wmake -check-dir "$WM_PROJECT_DIR" 2>/dev/null || {
echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR" echo "Error (${0##*/}) : not located in \$WM_PROJECT_DIR"
echo " Check your OpenFOAM environment and installation" echo " Check your OpenFOAM environment and installation"
exit 1 exit 1
} }
if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ] if [ -f "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments ]
then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments || \ then . "$WM_PROJECT_DIR"/wmake/scripts/AllwmakeParseArguments -no-recursion "$@" || \
echo "Argument parse error" echo "Argument parse error"
else else
echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect" echo "Error (${0##*/}) : WM_PROJECT_DIR appears to be incorrect"
@ -33,7 +31,7 @@ case "$FOAM_MODULE_PREFIX" in
;; ;;
(*) (*)
# Use wmake -all instead of Allwmake to allow for overrides # Use wmake -all instead of Allwmake to allow for overrides
( cd "$WM_PROJECT_DIR/plugins" 2>/dev/null && wmake -all $* ) ( cd "$WM_PROJECT_DIR/plugins" 2>/dev/null && wmake -all )
esac esac
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -1,2 +1,2 @@
api=2507 api=2412
patch=0 patch=0

View File

@ -40,9 +40,9 @@ Violations of the Trademark are monitored, and will be duly prosecuted.
If OpenFOAM has already been compiled on your system, simply source If OpenFOAM has already been compiled on your system, simply source
the appropriate `etc/bashrc` or `etc/cshrc` file and get started. the appropriate `etc/bashrc` or `etc/cshrc` file and get started.
For example, for the OpenFOAM-v2506 version: For example, for the OpenFOAM-v2412 version:
``` ```
source /installation/path/OpenFOAM-v2506/etc/bashrc source /installation/path/OpenFOAM-v2412/etc/bashrc
``` ```
## Compiling OpenFOAM ## Compiling OpenFOAM
@ -127,8 +127,8 @@ These 3rd-party sources are normally located in a directory parallel
to the OpenFOAM directory. For example, to the OpenFOAM directory. For example,
``` ```
/path/parent /path/parent
|-- OpenFOAM-v2506 |-- OpenFOAM-v2412
\-- ThirdParty-v2506 \-- ThirdParty-v2412
``` ```
There are, however, many cases where this simple convention is inadequate: There are, however, many cases where this simple convention is inadequate:
@ -156,9 +156,9 @@ when locating the ThirdParty directory with the following precedence:
2. PREFIX/ThirdParty-VERSION 2. PREFIX/ThirdParty-VERSION
* this corresponds to the traditional approach * this corresponds to the traditional approach
3. PREFIX/ThirdParty-vAPI 3. PREFIX/ThirdParty-vAPI
* allows for an updated value of VERSION, *eg*, `v2506-myCustom`, * allows for an updated value of VERSION, *eg*, `v2412-myCustom`,
without requiring a renamed ThirdParty. The API value would still without requiring a renamed ThirdParty. The API value would still
be `2412` and the original `ThirdParty-v2506/` would be found. be `2412` and the original `ThirdParty-v2412/` would be found.
4. PREFIX/ThirdParty-API 4. PREFIX/ThirdParty-API
* same as the previous example, but using an unadorned API value. * same as the previous example, but using an unadorned API value.
5. PREFIX/ThirdParty-common 5. PREFIX/ThirdParty-common

View File

@ -13,13 +13,7 @@ volVectorField U
); );
// Initialise the velocity internal field to zero // Initialise the velocity internal field to zero
// Note: explicitly bypass evaluation of contraint patch overrides U = dimensionedVector(U.dimensions(), Zero);
// (e.g. swirlFanVelocity might lookup phi,rho)
//U = Zero;
{
U.internalFieldRef() = Zero;
U.boundaryFieldRef() = Zero;
}
surfaceScalarField phi surfaceScalarField phi
( (

View File

@ -36,13 +36,11 @@ Description
if (adjustTimeStep) if (adjustTimeStep)
{ {
scalar maxDeltaTFact = maxCo/(CoNum + StCoNum + SMALL); scalar maxDeltaTFact = maxCo/(CoNum + StCoNum + SMALL);
scalar deltaTFact = min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
const scalar deltaTFact =
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
deltaTFact*runTime.deltaTValue(), deltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT

View File

@ -1,6 +1,5 @@
if (adjustTimeStep) if (adjustTimeStep)
{ {
runTime.setDeltaT(Foam::min(dtChem, maxDeltaT)); runTime.setDeltaT(min(dtChem, maxDeltaT));
Info<< "deltaT = " << runTime.deltaTValue() << endl; Info<< "deltaT = " << runTime.deltaTValue() << endl;
} }

View File

@ -54,18 +54,9 @@ if (adjustTimeStep)
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
dt0 dt0*min(min(TFactorFluid, min(TFactorFilm, TFactorSolid)), 1.2),
* Foam::min
(
Foam::min
(
TFactorFluid,
Foam::min(TFactorFilm, TFactorSolid)
),
1.2
),
maxDeltaT maxDeltaT
) )
); );

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2013-2016 OpenFOAM Foundation Copyright (C) 2013-2016 OpenFOAM Foundation
Copyright (C) 2020,2025 OpenCFD Ltd. Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -57,23 +57,11 @@ License
// (relative to reference value) // (relative to reference value)
scalar alphaY(pimpleDict.getOrDefault<scalar>("alphaY", 1.0)); scalar alphaY(pimpleDict.getOrDefault<scalar>("alphaY", 1.0));
// The old reciprocal time scale field, with any damping factor
tmp<volScalarField> rDeltaT0_damped;
// Calculate damped value before applying any other changes
if
(
rDeltaTDampingCoeff < 1
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{
rDeltaT0_damped = (scalar(1) - rDeltaTDampingCoeff)*(rDeltaT);
}
Info<< "Time scales min/max:" << endl; Info<< "Time scales min/max:" << endl;
// Cache old reciprocal time scale field
volScalarField rDeltaT0("rDeltaT0", rDeltaT);
// Flow time scale // Flow time scale
{ {
rDeltaT.ref() = rDeltaT.ref() =
@ -82,14 +70,12 @@ License
/((2*maxCo)*mesh.V()*rho()) /((2*maxCo)*mesh.V()*rho())
); );
// Limit the largest time scale (=> smallest reciprocal time) // Limit the largest time scale
rDeltaT.clamp_min(1/maxDeltaT); rDeltaT.max(1/maxDeltaT);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Flow = " Info<< " Flow = "
<< limits.min() << ", " << limits.max() << endl; << 1/gMax(rDeltaT.primitiveField()) << ", "
<< 1/gMin(rDeltaT.primitiveField()) << endl;
} }
// Heat release rate time scale // Heat release rate time scale
@ -100,13 +86,11 @@ License
mag(Qdot)/(alphaTemp*rho*thermo.Cp()*T) mag(Qdot)/(alphaTemp*rho*thermo.Cp()*T)
); );
rDeltaT.primitiveFieldRef().clamp_min(rDeltaTT);
auto limits = gMinMax(rDeltaTT.field());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Temperature = " Info<< " Temperature = "
<< limits.min() << ", " << limits.max() << endl; << 1/(gMax(rDeltaTT.field()) + VSMALL) << ", "
<< 1/(gMin(rDeltaTT.field()) + VSMALL) << endl;
rDeltaT.ref() = max(rDeltaT(), rDeltaTT);
} }
// Reaction rate time scale // Reaction rate time scale
@ -154,13 +138,11 @@ License
if (foundY) if (foundY)
{ {
rDeltaT.primitiveFieldRef().clamp_min(rDeltaTY);
auto limits = gMinMax(rDeltaTY.field());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Composition = " Info<< " Composition = "
<< limits.min() << ", " << limits.max() << endl; << 1/(gMax(rDeltaTY.field()) + VSMALL) << ", "
<< 1/(gMin(rDeltaTY.field()) + VSMALL) << endl;
rDeltaT.ref() = max(rDeltaT(), rDeltaTY);
} }
else else
{ {
@ -179,22 +161,28 @@ License
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
} }
// Limit rate of change of time scale (=> smallest reciprocal time) // Limit rate of change of time scale
// - reduce as much as required // - reduce as much as required
// - only increase at a fraction of old time scale // - only increase at a fraction of old time scale
if (rDeltaT0_damped) if
(
rDeltaTDampingCoeff < 1
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{ {
rDeltaT.clamp_min(rDeltaT0_damped()); rDeltaT = max
(
rDeltaT,
(scalar(1) - rDeltaTDampingCoeff)*rDeltaT0
);
} }
// Update tho boundary values of the reciprocal time-step // Update tho boundary values of the reciprocal time-step
rDeltaT.correctBoundaryConditions(); rDeltaT.correctBoundaryConditions();
auto limits = gMinMax(rDeltaT.field());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Overall = " Info<< " Overall = "
<< limits.min() << ", " << limits.max() << endl; << 1/gMax(rDeltaT.primitiveField())
<< ", " << 1/gMin(rDeltaT.primitiveField()) << endl;
} }

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2015 OpenFOAM Foundation Copyright (C) 2011-2015 OpenFOAM Foundation
Copyright (C) 2020,2025 OpenCFD Ltd. Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -106,7 +106,7 @@ Foam::smoluchowskiJumpTFvPatchScalarField::smoluchowskiJumpTFvPatchScalarField
if (!this->readValueEntry(dict)) if (!this->readValueEntry(dict))
{ {
// Fallback: set to the internal field // Fallback: set to the internal field
this->extrapolateInternal(); fvPatchField<scalar>::patchInternalField(*this);
} }
refValue() = *this; refValue() = *this;

View File

@ -23,11 +23,7 @@
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
{ Info<< "Flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
} }

View File

@ -52,26 +52,18 @@
// Update the boundary values of the reciprocal time-step // Update the boundary values of the reciprocal time-step
rDeltaT.correctBoundaryConditions(); rDeltaT.correctBoundaryConditions();
{ Info<< "Flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
if (rDeltaTSmoothingCoeff < 1.0) if (rDeltaTSmoothingCoeff < 1.0)
{ {
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
} }
{ Info<< "Smoothed flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Smoothed flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
// Limit rate of change of time scale // Limit rate of change of time scale
// - reduce as much as required // - reduce as much as required
@ -86,10 +78,8 @@
rDeltaT0 rDeltaT0
*max(rDeltaT/rDeltaT0, scalar(1) - rDeltaTDampingCoeff); *max(rDeltaT/rDeltaT0, scalar(1) - rDeltaTDampingCoeff);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< "Damped flow time scale min/max = " Info<< "Damped flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }
} }

View File

@ -1,7 +1,7 @@
scalar CoNum = -GREAT; scalar CoNum = -GREAT;
forAll(fluidRegions, regionI) forAll(fluidRegions, regionI)
{ {
CoNum = Foam::max CoNum = max
( (
compressibleCourantNo compressibleCourantNo
( (

View File

@ -78,8 +78,8 @@
} }
rho = thermo.rho(); rho = thermo.rho();
rho = max(rho, rhoMin[i]);
rho.clamp_range(rhoMin[i], rhoMax[i]); rho = min(rho, rhoMax[i]);
rho.relax(); rho.relax();
Info<< "Min/max rho:" << min(rho).value() << ' ' Info<< "Min/max rho:" << min(rho).value() << ' '

View File

@ -387,18 +387,15 @@ updateCoeffs()
{ {
scalar Q = gSum(kappa(Tp)*patch().magSf()*snGrad()); scalar Q = gSum(kappa(Tp)*patch().magSf()*snGrad());
auto limits = gMinMax(Tp); Info<< "T solid : " << nl << endl;
auto avg = gAverage(Tp);
Info<< "T solid : " << nl << endl; Info
<< " heat transfer rate from solid:" << Q
Info << " walltemperature "
<< " heat transfer rate from solid:" << Q << " min:" << gMin(Tp)
<< " walltemperature " << " max:" << gMax(Tp)
<< " min:" << limits.min() << " avg:" << gAverage(Tp) << nl
<< " max:" << limits.max() << endl;
<< " avg:" << avg << nl
<< endl;
} }
} }
else if (regionType_ == fluid) else if (regionType_ == fluid)
@ -448,16 +445,10 @@ updateCoeffs()
scalarField qLiq((Tp - Tc)*KdeltaLiq); scalarField qLiq((Tp - Tc)*KdeltaLiq);
scalarField qVap((Tp - Tv.patchInternalField())*KdeltaVap); scalarField qVap((Tp - Tv.patchInternalField())*KdeltaVap);
auto infoT = gMinMax(Tp);
auto avgT = gAverage(Tp);
auto infoLiq = gMinMax(qLiq);
auto infoVap = gMinMax(qVap);
Info<< "T flow : " << nl << endl; Info<< "T flow : " << nl << endl;
Info<< " qLiq: " << infoLiq.min() << " - " << infoLiq.max() << nl Info<< " qLiq: " << gMin(qLiq) << " - " << gMax(qLiq) << endl;
<< " qVap: " << infoVap.min() << " - " << infoVap.max() << nl; Info<< " qVap: " << gMin(qVap) << " - " << gMax(qVap) << endl;
scalar QLiq = gSum(qLiq*patch().magSf()); scalar QLiq = gSum(qLiq*patch().magSf());
scalar QVap = gSum(qVap*patch().magSf()); scalar QVap = gSum(qVap*patch().magSf());
@ -466,9 +457,9 @@ updateCoeffs()
Info<< " Heat transfer to Vap: " << QVap << endl; Info<< " Heat transfer to Vap: " << QVap << endl;
Info<< " walltemperature " Info<< " walltemperature "
<< " min:" << infoT.min() << " min:" << gMin(Tp)
<< " max:" << infoT.max() << " max:" << gMax(Tp)
<< " avg:" << avgT << " avg:" << gAverage(Tp)
<< endl; << endl;
} }
} }

View File

@ -31,7 +31,7 @@
); );
scalar regionCoNum = CoNum =
0.5*gMax 0.5*gMax
( (
sumPhi/fluidRegions[regioni].V().field() sumPhi/fluidRegions[regioni].V().field()
@ -41,9 +41,9 @@
( (
fvc::surfaceSum(mag(phi1 - phi2))().primitiveField() fvc::surfaceSum(mag(phi1 - phi2))().primitiveField()
/ fluidRegions[regioni].V().field() / fluidRegions[regioni].V().field()
)*runTime.deltaTValue(); )*runTime.deltaTValue(),
CoNum = Foam::max(CoNum, Foam::max(regionCoNum, UrCoNum)); CoNum = max(UrCoNum, CoNum);
} }
} }

View File

@ -2,7 +2,7 @@
forAll(fluidRegions, regioni) forAll(fluidRegions, regioni)
{ {
CoNum = Foam::max CoNum = max
( (
compressibleCourantNo compressibleCourantNo
( (
@ -17,7 +17,7 @@
/* /*
forAll(porousFluidRegions, porousi) forAll(porousFluidRegions, porousi)
{ {
CoNum = Foam::max CoNum = max
( (
compressibleCourantNo compressibleCourantNo
( (

View File

@ -47,10 +47,10 @@ if (adjustTimeStep)
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
Foam::min(maxCo/CoNum, maxDi/DiNum)*runTime.deltaTValue(), min(maxCo/CoNum, maxDi/DiNum)*runTime.deltaTValue(),
Foam::min(runTime.deltaTValue(), maxDeltaT) min(runTime.deltaTValue(), maxDeltaT)
) )
); );
Info<< "deltaT = " << runTime.deltaTValue() << endl; Info<< "deltaT = " << runTime.deltaTValue() << endl;

View File

@ -48,14 +48,18 @@ if (adjustTimeStep)
scalar maxDeltaTFluid = maxCo/(CoNum + SMALL); scalar maxDeltaTFluid = maxCo/(CoNum + SMALL);
scalar maxDeltaTSolid = maxDi/(DiNum + SMALL); scalar maxDeltaTSolid = maxDi/(DiNum + SMALL);
const scalar deltaTFluid = scalar deltaTFluid =
Foam::min(Foam::min(maxDeltaTFluid, 1.0 + 0.1*maxDeltaTFluid), 1.2); min
(
min(maxDeltaTFluid, 1.0 + 0.1*maxDeltaTFluid),
1.2
);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
Foam::min(deltaTFluid, maxDeltaTSolid)*runTime.deltaTValue(), min(deltaTFluid, maxDeltaTSolid)*runTime.deltaTValue(),
maxDeltaT maxDeltaT
) )
); );

View File

@ -22,7 +22,7 @@ forAll(solidRegions, i)
tmp<volScalarField> trho = thermo.rho(); tmp<volScalarField> trho = thermo.rho();
const volScalarField& rho = trho(); const volScalarField& rho = trho();
DiNum = Foam::max DiNum = max
( (
solidRegionDiffNo solidRegionDiffNo
( (

View File

@ -17,7 +17,7 @@ scalar DiNum = -GREAT;
tmp<volScalarField> trho = thermo.rho(); tmp<volScalarField> trho = thermo.rho();
const volScalarField& rho = trho(); const volScalarField& rho = trho();
DiNum = Foam::max DiNum = max
( (
solidRegionDiffNo solidRegionDiffNo
( (

View File

@ -60,10 +60,13 @@ template<class Type>
void zeroCells void zeroCells
( (
GeometricField<Type, fvPatchField, volMesh>& vf, GeometricField<Type, fvPatchField, volMesh>& vf,
const labelUList& cells const labelList& cells
) )
{ {
UIndirectList<Type>(vf.primitiveField(), cells) = Zero; forAll(cells, i)
{
vf[cells[i]] = Zero;
}
} }

View File

@ -103,8 +103,8 @@ dimensionedScalar alphaMax
laminarTransport laminarTransport
); );
const labelUList& inletCells = mesh.boundary()["inlet"].faceCells(); const labelList& inletCells = mesh.boundary()["inlet"].faceCells();
//const labelUList& outletCells = mesh.boundary()["outlet"].faceCells(); //const labelList& outletCells = mesh.boundary()["outlet"].faceCells();
volScalarField alpha volScalarField alpha
( (

View File

@ -55,7 +55,7 @@ if (mesh.changing())
dimensionedScalar rAUf("rAUf", dimTime, 1.0); dimensionedScalar rAUf("rAUf", dimTime, 1.0);
const cellCellStencilObject& overlap = Stencil::New(mesh); const cellCellStencilObject& overlap = Stencil::New(mesh);
const labelUList& cellTypes = overlap.cellTypes(); const labelList& cellTypes = overlap.cellTypes();
const labelIOList& zoneIDs = overlap.zoneID(); const labelIOList& zoneIDs = overlap.zoneID();
while (pimple.correctNonOrthogonal()) while (pimple.correctNonOrthogonal())

View File

@ -36,26 +36,18 @@
// Update the boundary values of the reciprocal time-step // Update the boundary values of the reciprocal time-step
rDeltaT.correctBoundaryConditions(); rDeltaT.correctBoundaryConditions();
{ Info<< "Flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
if (rDeltaTSmoothingCoeff < 1.0) if (rDeltaTSmoothingCoeff < 1.0)
{ {
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
} }
{ Info<< "Smoothed flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Smoothed flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
// Limit rate of change of time scale // Limit rate of change of time scale
// - reduce as much as required // - reduce as much as required
@ -70,10 +62,8 @@
rDeltaT0 rDeltaT0
*max(rDeltaT/rDeltaT0, scalar(1) - rDeltaTDampingCoeff); *max(rDeltaT/rDeltaT0, scalar(1) - rDeltaTDampingCoeff);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< "Damped flow time scale min/max = " Info<< "Damped flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }
} }

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020,2025 OpenCFD Ltd. Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -54,22 +54,11 @@ License
scalar alphaTemp(pimpleDict.getOrDefault("alphaTemp", 0.05)); scalar alphaTemp(pimpleDict.getOrDefault("alphaTemp", 0.05));
// The old reciprocal time scale field, with any damping factor
tmp<volScalarField> rDeltaT0_damped;
// Calculate damped value before applying any other changes
if
(
rDeltaTDampingCoeff < 1
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{
rDeltaT0_damped = (scalar(1) - rDeltaTDampingCoeff)*(rDeltaT);
}
Info<< "Time scales min/max:" << endl; Info<< "Time scales min/max:" << endl;
// Cache old reciprocal time scale field
volScalarField rDeltaT0("rDeltaT0", rDeltaT);
// Flow time scale // Flow time scale
{ {
rDeltaT.ref() = rDeltaT.ref() =
@ -78,14 +67,12 @@ License
/((2*maxCo)*mesh.V()*rho()) /((2*maxCo)*mesh.V()*rho())
); );
// Limit the largest time scale (=> smallest reciprocal time) // Limit the largest time scale
rDeltaT.clamp_min(1/maxDeltaT); rDeltaT.max(1/maxDeltaT);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Flow = " Info<< " Flow = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField()) << ", "
<< gMax(1/rDeltaT.primitiveField()) << endl;
} }
// Reaction source time scale // Reaction source time scale
@ -106,13 +93,15 @@ License
) )
); );
rDeltaT.primitiveFieldRef().clamp_min(rDeltaTT);
auto limits = gMinMax(rDeltaTT.field());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Temperature = " Info<< " Temperature = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/(rDeltaTT.field() + VSMALL)) << ", "
<< gMax(1/(rDeltaTT.field() + VSMALL)) << endl;
rDeltaT.ref() = max
(
rDeltaT(),
rDeltaTT
);
} }
// Update tho boundary values of the reciprocal time-step // Update tho boundary values of the reciprocal time-step
@ -124,19 +113,25 @@ License
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
} }
// Limit rate of change of time scale (=> smallest reciprocal time) // Limit rate of change of time scale
// - reduce as much as required // - reduce as much as required
// - only increase at a fraction of old time scale // - only increase at a fraction of old time scale
if (rDeltaT0_damped) if
(
rDeltaTDampingCoeff < 1.0
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{ {
rDeltaT.clamp_min(rDeltaT0_damped()); rDeltaT = max
(
rDeltaT,
(scalar(1) - rDeltaTDampingCoeff)*rDeltaT0
);
} }
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Overall = " Info<< " Overall = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }

View File

@ -6,7 +6,7 @@
+ MRF.DDt(U) + MRF.DDt(U)
+ turbulence->divDevReff(U) + turbulence->divDevReff(U)
== ==
invRhoInf*parcels.SU(U) parcels.SU(U, true)
+ fvOptions(U) + fvOptions(U)
); );

View File

@ -39,11 +39,6 @@ dimensionedScalar rhoInfValue
laminarTransport laminarTransport
); );
const dimensionedScalar invRhoInf
(
dimless/dimDensity, scalar(1)/rhoInfValue.value()
);
volScalarField rhoInf volScalarField rhoInf
( (
IOobject IOobject

View File

@ -36,18 +36,13 @@ Description
if (adjustTimeStep) if (adjustTimeStep)
{ {
const scalar maxDeltaTFact = const scalar maxDeltaTFact =
Foam::min min(maxCo/(CoNum + SMALL), maxCo/(surfaceFilm.CourantNumber() + SMALL));
(
maxCo/(CoNum + SMALL),
maxCo/(surfaceFilm.CourantNumber() + SMALL)
);
const scalar deltaTFact = const scalar deltaTFact =
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2); min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
deltaTFact*runTime.deltaTValue(), deltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2020,2025 OpenCFD Ltd. Copyright (C) 2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -54,22 +54,11 @@ License
scalar alphaTemp(pimpleDict.getOrDefault("alphaTemp", 0.05)); scalar alphaTemp(pimpleDict.getOrDefault("alphaTemp", 0.05));
// The old reciprocal time scale field, with any damping factor
tmp<volScalarField> rDeltaT0_damped;
// Calculate damped value before applying any other changes
if
(
rDeltaTDampingCoeff < 1
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{
rDeltaT0_damped = (scalar(1) - rDeltaTDampingCoeff)*(rDeltaT);
}
Info<< "Time scales min/max:" << endl; Info<< "Time scales min/max:" << endl;
// Cache old reciprocal time scale field
volScalarField rDeltaT0("rDeltaT0", rDeltaT);
// Flow time scale // Flow time scale
{ {
rDeltaT.ref() = rDeltaT.ref() =
@ -78,14 +67,12 @@ License
/((2*maxCo)*mesh.V()*rho()) /((2*maxCo)*mesh.V()*rho())
); );
// Limit the largest time scale (=> smallest reciprocal time) // Limit the largest time scale
rDeltaT.clamp_min(1/maxDeltaT); rDeltaT.max(1/maxDeltaT);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Flow = " Info<< " Flow = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField()) << ", "
<< gMax(1/rDeltaT.primitiveField()) << endl;
} }
// Reaction source time scale // Reaction source time scale
@ -105,13 +92,15 @@ License
) )
); );
rDeltaT.primitiveFieldRef().clamp_min(rDeltaTT);
auto limits = gMinMax(rDeltaTT.field());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Temperature = " Info<< " Temperature = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/(rDeltaTT.field() + VSMALL)) << ", "
<< gMax(1/(rDeltaTT.field() + VSMALL)) << endl;
rDeltaT.ref() = max
(
rDeltaT(),
rDeltaTT
);
} }
// Update the boundary values of the reciprocal time-step // Update the boundary values of the reciprocal time-step
@ -123,22 +112,25 @@ License
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
} }
// Limit rate of change of time scale (=> smallest reciprocal time) // Limit rate of change of time scale
// - reduce as much as required // - reduce as much as required
// - only increase at a fraction of old time scale // - only increase at a fraction of old time scale
if (rDeltaT0_damped) if
(
rDeltaTDampingCoeff < 1.0
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{ {
rDeltaT.clamp_min(rDeltaT0_damped()); rDeltaT = max
(
rDeltaT,
(scalar(1) - rDeltaTDampingCoeff)*rDeltaT0
);
} }
// Update the boundary values of the reciprocal time-step
rDeltaT.correctBoundaryConditions();
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< " Overall = " Info<< " Overall = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }

View File

@ -48,7 +48,8 @@ U.correctBoundaryConditions();
fvOptions.correct(U); fvOptions.correct(U);
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
Info<< "p min/max = " << min(p).value() << ", " << max(p).value() << endl; Info<< "p min/max = " << min(p).value() << ", " << max(p).value() << endl;

View File

@ -49,7 +49,8 @@
fvOptions.correct(U); fvOptions.correct(U);
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
Info<< "p min/max = " << min(p).value() << ", " << max(p).value() << endl; Info<< "p min/max = " << min(p).value() << ", " << max(p).value() << endl;

View File

@ -1,5 +1,6 @@
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
volScalarField rAU(1.0/UEqn.A()); volScalarField rAU(1.0/UEqn.A());
@ -93,7 +94,8 @@ p.relax();
// Recalculate density from the relaxed pressure // Recalculate density from the relaxed pressure
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
Info<< "rho min/max : " << min(rho).value() << " " << max(rho).value() << endl; Info<< "rho min/max : " << min(rho).value() << " " << max(rho).value() << endl;

View File

@ -1,5 +1,6 @@
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
volScalarField rAU(1.0/UEqn.A()); volScalarField rAU(1.0/UEqn.A());
@ -93,7 +94,8 @@ p.relax();
// Recalculate density from the relaxed pressure // Recalculate density from the relaxed pressure
rho = thermo.rho(); rho = thermo.rho();
rho.clamp_range(rhoMin, rhoMax); rho = max(rho, rhoMin);
rho = min(rho, rhoMax);
rho.relax(); rho.relax();
Info<< "rho min/max : " << min(rho).value() << " " << max(rho).value() << endl; Info<< "rho min/max : " << min(rho).value() << " " << max(rho).value() << endl;

View File

@ -36,14 +36,13 @@ Description
if (adjustTimeStep) if (adjustTimeStep)
{ {
scalar maxDeltaTFact = scalar maxDeltaTFact =
Foam::min(maxCo/(CoNum + SMALL), maxAlphaCo/(alphaCoNum + SMALL)); min(maxCo/(CoNum + SMALL), maxAlphaCo/(alphaCoNum + SMALL));
const scalar deltaTFact = scalar deltaTFact = min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
deltaTFact*runTime.deltaTValue(), deltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT

View File

@ -53,21 +53,6 @@
pimpleDict.getOrDefault<scalar>("maxDeltaT", GREAT) pimpleDict.getOrDefault<scalar>("maxDeltaT", GREAT)
); );
// The old reciprocal time scale field, with any damping factor
tmp<volScalarField> rDeltaT0_damped;
// Calculate damped value before applying any other changes
if
(
rDeltaTDampingCoeff < 1
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{
rDeltaT0_damped = (scalar(1) - rDeltaTDampingCoeff)*(rDeltaT);
}
volScalarField rDeltaT0("rDeltaT0", rDeltaT); volScalarField rDeltaT0("rDeltaT0", rDeltaT);
// Set the reciprocal time-step from the local Courant number // Set the reciprocal time-step from the local Courant number
@ -98,13 +83,10 @@
// Update tho boundary values of the reciprocal time-step // Update tho boundary values of the reciprocal time-step
rDeltaT.correctBoundaryConditions(); rDeltaT.correctBoundaryConditions();
{ Info<< "Flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl;
}
if (rDeltaTSmoothingCoeff < 1.0) if (rDeltaTSmoothingCoeff < 1.0)
{ {
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
@ -128,25 +110,27 @@
fvc::sweep(rDeltaT, alpha1, nAlphaSweepIter, alphaSpreadDiff); fvc::sweep(rDeltaT, alpha1, nAlphaSweepIter, alphaSpreadDiff);
} }
{ Info<< "Smoothed flow time scale min/max = "
auto limits = gMinMax(rDeltaT.primitiveField()); << gMin(1/rDeltaT.primitiveField())
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); << ", " << gMax(1/rDeltaT.primitiveField()) << endl;
Info<< "Smoothed flow time scale min/max = " // Limit rate of change of time scale
<< limits.min() << ", " << limits.max() << endl;
}
// Limit rate of change of time scale (=> smallest reciprocal time)
// - reduce as much as required // - reduce as much as required
// - only increase at a fraction of old time scale // - only increase at a fraction of old time scale
if (rDeltaT0_damped) if
(
rDeltaTDampingCoeff < 1.0
&& runTime.timeIndex() > runTime.startTimeIndex() + 1
)
{ {
rDeltaT.clamp_min(rDeltaT0_damped()); rDeltaT = max
(
auto limits = gMinMax(rDeltaT.primitiveField()); rDeltaT,
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL)); (scalar(1) - rDeltaTDampingCoeff)*rDeltaT0
);
Info<< "Damped flow time scale min/max = " Info<< "Damped flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }
} }

View File

@ -36,14 +36,13 @@ Description
if (adjustTimeStep) if (adjustTimeStep)
{ {
scalar maxDeltaTFact = scalar maxDeltaTFact =
Foam::min(maxCo/(CoNum + SMALL), maxAcousticCo/(acousticCoNum + SMALL)); min(maxCo/(CoNum + SMALL), maxAcousticCo/(acousticCoNum + SMALL));
const scalar deltaTFact = scalar deltaTFact = min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
deltaTFact*runTime.deltaTValue(), deltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT

View File

@ -37,15 +37,11 @@ if (adjustTimeStep)
if (CoNum > SMALL) if (CoNum > SMALL)
{ {
scalar maxDeltaTFact = scalar maxDeltaTFact =
Foam::min min(maxCo/(CoNum + SMALL), maxAcousticCo/(acousticCoNum + SMALL));
(
maxCo/(CoNum + SMALL),
maxAcousticCo/(acousticCoNum + SMALL)
);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
maxDeltaTFact*runTime.deltaTValue(), maxDeltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT

View File

@ -26,12 +26,12 @@ forAll(dgdt, celli)
{ {
if (dgdt[celli] > 0.0) if (dgdt[celli] > 0.0)
{ {
Sp[celli] -= dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Sp[celli] -= dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
Su[celli] += dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Su[celli] += dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
} }
else if (dgdt[celli] < 0.0) else if (dgdt[celli] < 0.0)
{ {
Sp[celli] += dgdt[celli]/Foam::max(alpha1[celli], 1e-4); Sp[celli] += dgdt[celli]/max(alpha1[celli], 1e-4);
} }
} }

View File

@ -210,7 +210,7 @@ void VoFPatchTransfer::correct
film().toRegion(patchi, Vp); film().toRegion(patchi, Vp);
const polyPatch& pp = pbm[patchi]; const polyPatch& pp = pbm[patchi];
const labelUList& faceCells = pp.faceCells(); const labelList& faceCells = pp.faceCells();
// Accumulate the total mass removed from patch // Accumulate the total mass removed from patch
scalar dMassPatch = 0; scalar dMassPatch = 0;

View File

@ -26,12 +26,12 @@ forAll(dgdt, celli)
{ {
if (dgdt[celli] > 0.0) if (dgdt[celli] > 0.0)
{ {
Sp[celli] -= dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Sp[celli] -= dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
Su[celli] += dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Su[celli] += dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
} }
else if (dgdt[celli] < 0.0) else if (dgdt[celli] < 0.0)
{ {
Sp[celli] += dgdt[celli]/Foam::max(alpha1[celli], 1e-4); Sp[celli] += dgdt[celli]/max(alpha1[celli], 1e-4);
} }
} }

View File

@ -26,12 +26,12 @@ forAll(dgdt, celli)
{ {
if (dgdt[celli] > 0.0) if (dgdt[celli] > 0.0)
{ {
Sp[celli] -= dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Sp[celli] -= dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
Su[celli] += dgdt[celli]/Foam::max(1.0 - alpha1[celli], 1e-4); Su[celli] += dgdt[celli]/max(1.0 - alpha1[celli], 1e-4);
} }
else if (dgdt[celli] < 0.0) else if (dgdt[celli] < 0.0)
{ {
Sp[celli] += dgdt[celli]/Foam::max(alpha1[celli], 1e-4); Sp[celli] += dgdt[celli]/max(alpha1[celli], 1e-4);
} }
} }

View File

@ -135,7 +135,7 @@ public:
virtual volScalarField& he() virtual volScalarField& he()
{ {
NotImplemented; NotImplemented;
return volScalarField::null().constCast(); return const_cast<volScalarField&>(volScalarField::null());
} }
//- Enthalpy/Internal energy [J/kg] //- Enthalpy/Internal energy [J/kg]

View File

@ -1086,7 +1086,7 @@ void Foam::multiphaseMixtureThermo::solveAlphas
MULES::limitSum(alphaPhiCorrs); MULES::limitSum(alphaPhiCorrs);
rhoPhi_ = Zero; rhoPhi_ = dimensionedScalar(dimensionSet(1, 0, -1, 0, 0), Zero);
volScalarField sumAlpha volScalarField sumAlpha
( (

View File

@ -243,7 +243,7 @@ public:
virtual volScalarField& he() virtual volScalarField& he()
{ {
NotImplemented; NotImplemented;
return volScalarField::null().constCast(); return const_cast<volScalarField&>(volScalarField::null());
} }
//- Enthalpy/Internal energy [J/kg] //- Enthalpy/Internal energy [J/kg]

View File

@ -63,11 +63,23 @@ Foam::DTRMParticle::DTRMParticle
{ {
is >> p0_ >> p1_ >> I0_ >> I_ >> dA_ >> transmissiveId_; is >> p0_ >> p1_ >> I0_ >> I_ >> dA_ >> transmissiveId_;
} }
else if (!is.checkLabelSize<>() || !is.checkScalarSize<>())
{
// Non-native label or scalar size
is.beginRawRead();
readRawScalar(is, p0_.data(), vector::nComponents);
readRawScalar(is, p1_.data(), vector::nComponents);
readRawScalar(is, &I0_);
readRawScalar(is, &I_);
readRawScalar(is, &dA_);
readRawLabel(is, &transmissiveId_);
is.endRawRead();
}
else else
{ {
// No non-native streaming
is.fatalCheckNativeSizes(FUNCTION_NAME);
is.read(reinterpret_cast<char*>(&p0_), sizeofFields_); is.read(reinterpret_cast<char*>(&p0_), sizeofFields_);
} }
} }

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com \\ / A nd | www.openfoam.com
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2017-2025 OpenCFD Ltd. Copyright (C) 2017-2023 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -557,7 +557,7 @@ void Foam::radiation::laserDTRM::calculate()
// Reset the field // Reset the field
Q_ == Zero; Q_ == dimensionedScalar(Q_.dimensions(), Zero);
a_ = absorptionEmission_->a(); a_ = absorptionEmission_->a();
e_ = absorptionEmission_->e(); e_ = absorptionEmission_->e();
@ -679,7 +679,7 @@ void Foam::radiation::laserDTRM::calculate()
} }
} }
scalar totalQ = gWeightedSum(mesh_.V(), Q_.primitiveField()); scalar totalQ = gSum(Q_.primitiveFieldRef()*mesh_.V());
Info << "Total energy absorbed [W]: " << totalQ << endl; Info << "Total energy absorbed [W]: " << totalQ << endl;
if (mesh_.time().writeTime()) if (mesh_.time().writeTime())

View File

@ -36,13 +36,13 @@ Description
if (adjustTimeStep) if (adjustTimeStep)
{ {
scalar maxDeltaTFact = scalar maxDeltaTFact =
Foam::min min
( (
maxCo/(CoNum + SMALL), maxCo/(CoNum + SMALL),
Foam::min min
( (
maxAlphaCo/(alphaCoNum + SMALL), maxAlphaCo/(alphaCoNum + SMALL),
Foam::min min
( (
maxAlphaDdt/(ddtAlphaNum + SMALL), maxAlphaDdt/(ddtAlphaNum + SMALL),
maxDi/(DiNum + SMALL) maxDi/(DiNum + SMALL)
@ -50,18 +50,16 @@ if (adjustTimeStep)
) )
); );
const scalar deltaTFact = scalar deltaTFact = min(min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
Foam::min(Foam::min(maxDeltaTFact, 1.0 + 0.1*maxDeltaTFact), 1.2);
runTime.setDeltaT runTime.setDeltaT
( (
Foam::min min
( (
deltaTFact*runTime.deltaTValue(), deltaTFact*runTime.deltaTValue(),
maxDeltaT maxDeltaT
) )
); );
Info<< "deltaT = " << runTime.deltaTValue() << endl; Info<< "deltaT = " << runTime.deltaTValue() << endl;
} }

View File

@ -86,7 +86,7 @@ public:
virtual volScalarField& he() virtual volScalarField& he()
{ {
NotImplemented; NotImplemented;
return volScalarField::null().constCast(); return const_cast<volScalarField&>(volScalarField::null());
} }
//- Return access to the internal energy field [J/Kg] //- Return access to the internal energy field [J/Kg]

View File

@ -65,7 +65,7 @@
dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0); dimensionedScalar rAUf("rAUf", dimTime/rho.dimensions(), 1.0);
const cellCellStencilObject& overlap = Stencil::New(mesh); const cellCellStencilObject& overlap = Stencil::New(mesh);
const labelUList& cellTypes = overlap.cellTypes(); const labelList& cellTypes = overlap.cellTypes();
const labelIOList& zoneIDs = overlap.zoneID(); const labelIOList& zoneIDs = overlap.zoneID();
while (pimple.correctNonOrthogonal()) while (pimple.correctNonOrthogonal())

View File

@ -232,7 +232,7 @@
surfaceScalarField mSfGradp("mSfGradp", pEqnIncomp.flux()/rAUf); surfaceScalarField mSfGradp("mSfGradp", pEqnIncomp.flux()/rAUf);
phasei = 0; phasei = 0;
phi = Zero; phi = dimensionedScalar("phi", phi.dimensions(), Zero);
for (phaseModel& phase : fluid.phases()) for (phaseModel& phase : fluid.phases())
{ {
@ -261,7 +261,7 @@
mSfGradp = pEqnIncomp.flux()/rAUf; mSfGradp = pEqnIncomp.flux()/rAUf;
U = Zero; U = dimensionedVector("U", dimVelocity, Zero);
phasei = 0; phasei = 0;
for (phaseModel& phase : fluid.phases()) for (phaseModel& phase : fluid.phases())

View File

@ -626,7 +626,7 @@ void Foam::multiphaseMixture::solveAlphas
MULES::limitSum(alphaPhiCorrs); MULES::limitSum(alphaPhiCorrs);
rhoPhi_ = Zero; rhoPhi_ = dimensionedScalar(dimMass/dimTime, Zero);
volScalarField sumAlpha volScalarField sumAlpha
( (

View File

@ -38,9 +38,7 @@
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< "Flow time scale min/max = " Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }

View File

@ -8,5 +8,5 @@
Info<< "Max Ur Courant Number = " << UrCoNum << endl; Info<< "Max Ur Courant Number = " << UrCoNum << endl;
CoNum = Foam::max(CoNum, UrCoNum); CoNum = max(CoNum, UrCoNum);
} }

View File

@ -31,9 +31,7 @@
fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff); fvc::smooth(rDeltaT, rDeltaTSmoothingCoeff);
auto limits = gMinMax(rDeltaT.primitiveField());
limits.reset(1/(limits.max()+VSMALL), 1/(limits.min()+VSMALL));
Info<< "Flow time scale min/max = " Info<< "Flow time scale min/max = "
<< limits.min() << ", " << limits.max() << endl; << gMin(1/rDeltaT.primitiveField())
<< ", " << gMax(1/rDeltaT.primitiveField()) << endl;
} }

View File

@ -8,5 +8,5 @@
Info<< "Max Ur Courant Number = " << UrCoNum << endl; Info<< "Max Ur Courant Number = " << UrCoNum << endl;
CoNum = Foam::max(CoNum, UrCoNum); CoNum = max(CoNum, UrCoNum);
} }

View File

@ -14,6 +14,6 @@ if (!(runTime.timeIndex() % 5))
if (smi < -SMALL) if (smi < -SMALL)
{ {
Info<< "Resetting Dcorr to 0" << endl; Info<< "Resetting Dcorr to 0" << endl;
Dcorr == Zero; Dcorr == dimensionedVector(Dcorr.dimensions(), Zero);
} }
} }

View File

@ -1,6 +1,6 @@
#!/bin/sh #!/bin/sh
cd "${0%/*}" || exit # Run from this directory cd "${0%/*}" || exit # Run from this directory
. "${WM_PROJECT_DIR:?}"/wmake/scripts/wmakeFunctions # Need wmake functions . ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions # Require wmake functions
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------

View File

@ -1,9 +1,7 @@
#!/bin/sh #!/bin/sh
cd "${0%/*}" || exit # Run from this directory cd "${0%/*}" || exit # Run from this directory
set -- -all="${0##*/}" "$@" # Execute this instead of ./Allwmake . ${WM_PROJECT_DIR:?}/wmake/scripts/AllwmakeParseArguments -no-recursion "$@"
. ${WM_PROJECT_DIR:?}/wmake/scripts/wmakeFunctions # Require wmake functions
. "${WM_PROJECT_DIR:?}"/wmake/scripts/AllwmakeParseArguments
. "${WM_PROJECT_DIR:?}"/wmake/scripts/wmakeFunctions # Need wmake functions
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# Environment # Environment

View File

@ -51,20 +51,17 @@ Description
//- Mapping of some fundamental and aggregate types to MPI data types //- Mapping of some fundamental and aggregate types to MPI data types
enum class dataTypes : int enum class dataTypes : int
{ {
// Fundamental Types [10]: // Builtin Types [8]:
Basic_begin, DataTypes_begin, //!< Begin builtin types (internal use)
type_byte = Basic_begin, type_byte = DataTypes_begin, // also for char, unsigned char
type_int16,
type_int32, type_int32,
type_int64, type_int64,
type_uint16,
type_uint32, type_uint32,
type_uint64, type_uint64,
type_float, type_float,
type_double, type_double,
type_long_double, type_long_double,
invalid, invalid
Basic_end = invalid
}; };
@ -72,19 +69,20 @@ enum class dataTypes : int
// Partial copy from UPstreamTraits.H // Partial copy from UPstreamTraits.H
//- UPstream data type corresponding to an intrinsic (MPI) type //- A supported UPstream data type (intrinsic or user-defined)
template<class T> template<class T>
struct UPstream_mpi_dataType : std::false_type struct UPstream_base_dataType : std::false_type
{ {
static constexpr auto datatype_id = dataTypes::invalid; static constexpr auto datatype_id = dataTypes::invalid;
}; };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Specializations of the above,
// each to match the elements of UPstream::dataTypes
// Specializations to match elements of UPstream::dataTypes
#undef defineUPstreamDataTraits #undef defineUPstreamDataTraits
#define defineUPstreamDataTraits(TypeId, Type) \ #define defineUPstreamDataTraits(TypeId, Type) \
template<> struct UPstream_mpi_dataType<Type> : std::true_type \ template<> struct UPstream_base_dataType<Type> : std::true_type \
{ \ { \
static constexpr auto datatype_id = dataTypes::TypeId; \ static constexpr auto datatype_id = dataTypes::TypeId; \
}; };
@ -92,10 +90,8 @@ struct UPstream_mpi_dataType : std::false_type
defineUPstreamDataTraits(type_byte, char); defineUPstreamDataTraits(type_byte, char);
defineUPstreamDataTraits(type_byte, unsigned char); defineUPstreamDataTraits(type_byte, unsigned char);
defineUPstreamDataTraits(type_int16, int16_t);
defineUPstreamDataTraits(type_int32, int32_t); defineUPstreamDataTraits(type_int32, int32_t);
defineUPstreamDataTraits(type_int64, int64_t); defineUPstreamDataTraits(type_int64, int64_t);
defineUPstreamDataTraits(type_uint16, uint16_t);
defineUPstreamDataTraits(type_uint32, uint32_t); defineUPstreamDataTraits(type_uint32, uint32_t);
defineUPstreamDataTraits(type_uint64, uint64_t); defineUPstreamDataTraits(type_uint64, uint64_t);
defineUPstreamDataTraits(type_float, float); defineUPstreamDataTraits(type_float, float);
@ -113,8 +109,8 @@ struct UPstream_alias_dataType
: :
std::bool_constant std::bool_constant
< <
// Basic MPI type // Base type (no alias needed)
UPstream_mpi_dataType<std::remove_cv_t<T>>::value || UPstream_base_dataType<std::remove_cv_t<T>>::value ||
( (
// Or some int 32/64 type to re-map // Or some int 32/64 type to re-map
std::is_integral_v<T> std::is_integral_v<T>
@ -122,11 +118,15 @@ struct UPstream_alias_dataType
) )
> >
{ {
// Is it using the base type? (no alias needed)
static constexpr bool is_base =
UPstream_base_dataType<std::remove_cv_t<T>>::value;
using base = std::conditional_t using base = std::conditional_t
< <
UPstream_mpi_dataType<std::remove_cv_t<T>>::value, UPstream_base_dataType<std::remove_cv_t<T>>::value, // is_base
std::remove_cv_t<T>, // <- using mpi type (no alias) std::remove_cv_t<T>,
std::conditional_t // <- using alias std::conditional_t
< <
( (
std::is_integral_v<T> std::is_integral_v<T>
@ -138,32 +138,12 @@ struct UPstream_alias_dataType
std::conditional_t<std::is_signed_v<T>, int32_t, uint32_t>, std::conditional_t<std::is_signed_v<T>, int32_t, uint32_t>,
std::conditional_t<std::is_signed_v<T>, int64_t, uint64_t> std::conditional_t<std::is_signed_v<T>, int64_t, uint64_t>
>, >,
char // Fallback is a byte (eg, arbitrary contiguous data) char // Fallback value (assuming it is contiguous)
> >
>; >;
static constexpr auto datatype_id = static constexpr auto datatype_id =
UPstream_mpi_dataType<base>::datatype_id; UPstream_base_dataType<base>::datatype_id;
};
// Handle int8_t/uint8_t as aliases since 'signed char' etc may be
// ambiguous
//- Map \c int8_t to UPstream::dataTypes::type_byte
template<>
struct UPstream_alias_dataType<int8_t> : std::true_type
{
using base = char;
static constexpr auto datatype_id = dataTypes::type_byte;
};
//- Map \c uint8_t to UPstream::dataTypes::type_byte
template<>
struct UPstream_alias_dataType<uint8_t> : std::true_type
{
using base = unsigned char;
static constexpr auto datatype_id = dataTypes::type_byte;
}; };
@ -192,31 +172,26 @@ void print(const char* name, bool showLimits = true)
} }
// A declared or deduced MPI type, or aliased // A declared or deduced MPI type, or aliased
if constexpr (UPstream_mpi_dataType<T>::value) std::cout
{ << " is_mpi=" << UPstream_base_dataType<T>::value
std::cout << " (" << int(UPstream_base_dataType<T>::datatype_id) << ")";
<< " is_mpi=("
<< int(UPstream_mpi_dataType<T>::datatype_id) << ')';
}
else
{
std::cout << " is_mpi=(null)";
}
// Any aliases? if (UPstream_alias_dataType<T>::value)
if constexpr (UPstream_alias_dataType<T>::value)
{ {
if constexpr (UPstream_mpi_dataType<T>::value) if (UPstream_alias_dataType<T>::is_base)
{ {
std::cout << " alias=base"; std::cout<< " is_base";
} }
else else
{ {
std::cout std::cout<< " is_alias ("
<< " alias=(" << int(UPstream_alias_dataType<T>::datatype_id) << ")";
<< int(UPstream_alias_dataType<T>::datatype_id) << ')';
} }
} }
else
{
std::cout<< " no_alias";
}
std::cout<< '\n'; std::cout<< '\n';
} }
@ -242,7 +217,6 @@ int main(int argc, char *argv[])
std::cout << '\n'; std::cout << '\n';
print<char>("char"); print<char>("char");
print<signed char>("signed char");
print<unsigned char>("unsigned char"); print<unsigned char>("unsigned char");
print<short>("short"); print<short>("short");
print<int>("int"); print<int>("int");

View File

@ -1,3 +1,3 @@
Test-CircularBuffer.cxx Test-CircularBuffer.C
EXE = $(FOAM_USER_APPBIN)/Test-CircularBuffer EXE = $(FOAM_USER_APPBIN)/Test-CircularBuffer

View File

@ -1,3 +1,3 @@
Test-CompactIOList.cxx Test-CompactIOList.C
EXE = $(FOAM_USER_APPBIN)/Test-CompactIOList EXE = $(FOAM_USER_APPBIN)/Test-CompactIOList

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2020-2025 OpenCFD Ltd. Copyright (C) 2020-2022 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -25,7 +25,7 @@ License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Application Application
Test-CompactIOList testCompactIOList
Description Description
Simple demonstration and test application for the CompactIOList container Simple demonstration and test application for the CompactIOList container
@ -46,20 +46,13 @@ using namespace Foam;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
argList::addBoolOption("ascii", "use ascii format");
argList::addOption("count", "number of faces");
#include "setRootCase.H" #include "setRootCase.H"
#include "createTime.H" #include "createTime.H"
IOstreamOption streamOpt(IOstreamOption::BINARY); IOstreamOption streamOpt(IOstreamOption::BINARY);
// IOstreamOption streamOpt(IOstreamOption::ASCII);
if (args.found("ascii")) const label size = 20000000;
{
streamOpt.format(IOstreamOption::ASCII);
}
const label size = args.getOrDefault<label>("count", 20000000);
// Old format // Old format
// ~~~~~~~~~~ // ~~~~~~~~~~
@ -70,50 +63,39 @@ int main(int argc, char *argv[])
( (
IOobject IOobject
( (
"faces2-plain", "faces2",
runTime.constant(), runTime.constant(),
polyMesh::meshSubDir, polyMesh::meshSubDir,
runTime, runTime,
IOobject::NO_READ, IOobject::NO_READ,
IOobject::NO_WRITE, IOobject::NO_WRITE,
IOobject::NO_REGISTER IOobject::NO_REGISTER
) ),
size
); );
faces2.resize(size, face(identity(4))); const face f(identity(4));
Info<< "Plain format faceList " << faces2.objectRelPath() << nl; forAll(faces2, i)
Info<< " constructed in = " << runTime.cpuTimeIncrement() {
<< " s" << endl; faces2[i] = f;
}
Info<< "Constructed faceList in = "
<< runTime.cpuTimeIncrement() << " s" << nl << endl;
faces2.writeObject(streamOpt, true); faces2.writeObject(streamOpt, true);
Info<< " wrote in = " Info<< "Written old format faceList in = "
<< runTime.cpuTimeIncrement() << " s" << endl; << runTime.cpuTimeIncrement() << " s" << nl << endl;
// Read (size only)
label count = faceIOList::readContentsSize
(
IOobject
(
"faces2-plain",
runTime.constant(),
polyMesh::meshSubDir,
runTime,
IOobject::MUST_READ
)
);
Info<< " counted " << count << " faces on disk in = "
<< runTime.cpuTimeIncrement() << " s" << endl;
// Read // Read
faceIOList faces2b faceIOList faces3
( (
IOobject IOobject
( (
"faces2-plain", "faces2",
runTime.constant(), runTime.constant(),
polyMesh::meshSubDir, polyMesh::meshSubDir,
runTime, runTime,
@ -123,7 +105,7 @@ int main(int argc, char *argv[])
) )
); );
Info<< " read " << faces2b.size() << " faces in = " Info<< "Read old format " << faces3.size() << " faceList in = "
<< runTime.cpuTimeIncrement() << " s" << nl << endl; << runTime.cpuTimeIncrement() << " s" << nl << endl;
} }
@ -132,54 +114,44 @@ int main(int argc, char *argv[])
// ~~~~~~~~~~ // ~~~~~~~~~~
{ {
// Construct big faceList in compact format // Construct big faceList in new format
faceCompactIOList faces2 faceCompactIOList faces2
( (
IOobject IOobject
( (
"faces2-compact", "faces2",
runTime.constant(), runTime.constant(),
polyMesh::meshSubDir, polyMesh::meshSubDir,
runTime, runTime,
IOobject::NO_READ, IOobject::NO_READ,
IOobject::NO_WRITE, IOobject::NO_WRITE,
IOobject::NO_REGISTER IOobject::NO_REGISTER
) ),
size
); );
faces2.resize(size, face(identity(4))); const face f(identity(4));
Info<< "Compact format faceList" << faces2.objectRelPath() << nl; forAll(faces2, i)
Info<< " constructed in = " {
<< runTime.cpuTimeIncrement() << " s" << endl; faces2[i] = f;
}
Info<< "Constructed new format faceList in = "
<< runTime.cpuTimeIncrement() << " s" << nl << endl;
faces2.writeObject(streamOpt, true); faces2.writeObject(streamOpt, true);
Info<< " wrote in = " Info<< "Written new format faceList in = "
<< runTime.cpuTimeIncrement() << " s" << endl; << runTime.cpuTimeIncrement() << " s" << nl << endl;
// Read (size only)
label count = faceCompactIOList::readContentsSize
(
IOobject
(
"faces2-compact",
runTime.constant(),
polyMesh::meshSubDir,
runTime,
IOobject::MUST_READ
)
);
Info<< " counted " << count << " faces on disk in = "
<< runTime.cpuTimeIncrement() << " s" << endl;
// Read // Read
faceCompactIOList faces2b faceCompactIOList faces3
( (
IOobject IOobject
( (
"faces2-compact", "faces2",
runTime.constant(), runTime.constant(),
polyMesh::meshSubDir, polyMesh::meshSubDir,
runTime, runTime,
@ -189,7 +161,7 @@ int main(int argc, char *argv[])
) )
); );
Info<< " read " << faces2b.size() << " faces in = " Info<< "Read new format " << faces3.size() << " faceList in = "
<< runTime.cpuTimeIncrement() << " s" << nl << endl; << runTime.cpuTimeIncrement() << " s" << nl << endl;
} }

View File

@ -1,3 +1,3 @@
Test-DynamicList.cxx Test-DynamicList.C
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList EXE = $(FOAM_USER_APPBIN)/Test-DynamicList

View File

@ -1,3 +1,3 @@
Test-DynamicList2.cxx Test-DynamicList2.C
EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2 EXE = $(FOAM_USER_APPBIN)/Test-DynamicList2

View File

@ -52,8 +52,7 @@ void printInfo
if (showSize) if (showSize)
{ {
Info<< " size=\"" << list.size() Info<< " size=\"" << list.size()
<< "\" capacity=\"" << list.capacity() << "\"" << "\" capacity=\"" << list.capacity() << "\"";
<< "\" min=\"" << SizeMin << "\"" ;
if (list.cdata()) if (list.cdata())
{ {
Info<< " ptr=\"" << name(list.cdata()) << "\""; Info<< " ptr=\"" << name(list.cdata()) << "\"";
@ -80,8 +79,7 @@ void printInfo
if (showSize) if (showSize)
{ {
Info<< " size=\"" << list.size() Info<< " size=\"" << list.size()
<< "\" capacity=\"" << list.capacity() << "\"" << "\" capacity=\"" << list.capacity() << "\"";
<< "\" min=\"" << SizeMin << "\"" ;
if (list.cdata()) if (list.cdata())
{ {
Info<< " ptr=\"" << name(list.cdata()) << "\""; Info<< " ptr=\"" << name(list.cdata()) << "\"";
@ -170,22 +168,6 @@ int main(int argc, char *argv[])
printInfo("", list2); printInfo("", list2);
} }
{
DynamicList<float, 32> list1(std::pair<label,label>(16,0));
list1 = -1;
Info<< "construct with specified size/capacity" << nl;
printInfo("", list1);
}
{
DynamicList<float, 32> list1(std::pair<label,label>(8,16));
list1 = -1;
Info<< "construct with specified size/capacity" << nl;
printInfo("", list1);
}
Info<< "\nEnd\n"; Info<< "\nEnd\n";
return 0; return 0;

View File

@ -1,3 +1,3 @@
Test-FixedList.cxx Test-FixedList.C
EXE = $(FOAM_USER_APPBIN)/Test-FixedList EXE = $(FOAM_USER_APPBIN)/Test-FixedList

View File

@ -41,6 +41,7 @@ See also
#include "List.H" #include "List.H"
#include "IPstream.H" #include "IPstream.H"
#include "OPstream.H" #include "OPstream.H"
#include <numeric>
using namespace Foam; using namespace Foam;

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\ /*--------------------------------*- C++ -*----------------------------------*\
| ========= | | | ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 | | \\ / O peration | Version: v2412 |
| \\ / A nd | Website: www.openfoam.com | | \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | | | \\/ M anipulation | |
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\ /*--------------------------------*- C++ -*----------------------------------*\
| ========= | | | ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 | | \\ / O peration | Version: v2412 |
| \\ / A nd | Website: www.openfoam.com | | \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | | | \\/ M anipulation | |
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/

View File

@ -1,3 +1,3 @@
Test-HashPtrTable.cxx Test-HashPtrTable.C
EXE = $(FOAM_USER_APPBIN)/Test-HashPtrTable EXE = $(FOAM_USER_APPBIN)/Test-HashPtrTable

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011 OpenFOAM Foundation Copyright (C) 2011 OpenFOAM Foundation
Copyright (C) 2017-2025 OpenCFD Ltd. Copyright (C) 2017-2022 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -42,55 +42,33 @@ Description
using namespace Foam; using namespace Foam;
bool verbosity = true; class Scalar
// Gratuitous class inheritance
template<class T>
class BoxedType
{ {
T data_; scalar data_;
public: public:
static bool verbose; static bool verbose;
constexpr BoxedType() noexcept : data_(0) {} constexpr Scalar() noexcept : data_(0) {}
BoxedType(T val) noexcept : data_(val) {} Scalar(scalar val) noexcept : data_(val) {}
~BoxedType()
{
if (verbosity) Info<< " [delete BoxedType: " << value() << ']' << nl;
}
T value() const noexcept { return data_; }
T& value() noexcept { return data_; }
auto clone() const { return autoPtr<BoxedType<T>>::New(*this); }
};
template<class T> Ostream& operator<<(Ostream& os, const BoxedType<T>& item)
{
return (os << " -> " << item.value());
}
class Scalar : public BoxedType<scalar>
{
public:
using BoxedType<scalar>::BoxedType;
~Scalar() ~Scalar()
{ {
if (verbosity) Info<< "delete Scalar: " << value() << nl; if (verbose) Info<< "delete Scalar: " << data_ << endl;
}
const scalar& value() const noexcept { return data_; }
scalar& value() noexcept { return data_; }
friend Ostream& operator<<(Ostream& os, const Scalar& item)
{
os << item.value();
return os;
} }
auto clone() const { return autoPtr<Scalar>::New(*this); }
}; };
Ostream& operator<<(Ostream& os, const Scalar& item) bool Scalar::verbose = true;
{
return (os << item.value());
}
template<class T> template<class T>

View File

@ -1,3 +1,3 @@
Test-HashTable1.cxx Test-HashTable1.C
EXE = $(FOAM_USER_APPBIN)/Test-HashTable1 EXE = $(FOAM_USER_APPBIN)/Test-HashTable1

View File

@ -1,3 +1,3 @@
Test-HashTable2.cxx Test-HashTable2.C
EXE = $(FOAM_USER_APPBIN)/Test-HashTable2 EXE = $(FOAM_USER_APPBIN)/Test-HashTable2

View File

@ -1,3 +1,3 @@
Test-HashTable3.cxx Test-HashTable3.C
EXE = $(FOAM_USER_APPBIN)/Test-HashTable3 EXE = $(FOAM_USER_APPBIN)/Test-HashTable3

View File

@ -1,3 +1,3 @@
Test-Hashing2.cxx Test-Hashing2.C
EXE = $(FOAM_USER_APPBIN)/Test-Hashing2 EXE = $(FOAM_USER_APPBIN)/Test-Hashing2

View File

@ -274,7 +274,9 @@ int main(int argc, char *argv[])
Info<< nl << "No " << is.name() << " file found ..." << nl; Info<< nl << "No " << is.name() << " file found ..." << nl;
} }
for (token tok; tok.read(is); /*nil*/) token tok;
while (is.good() && is.read(tok) && tok.good())
{ {
const word listType(tok.wordToken()); const word listType(tok.wordToken());

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\ /*--------------------------------*- C++ -*----------------------------------*\
| ========= | | | ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2506 | | \\ / O peration | Version: v2412 |
| \\ / A nd | Website: www.openfoam.com | | \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | | | \\/ M anipulation | |
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/

View File

@ -1,3 +1,3 @@
Test-ICharStream1.cxx Test-ICharStream1.C
EXE = $(FOAM_USER_APPBIN)/Test-ICharStream1 EXE = $(FOAM_USER_APPBIN)/Test-ICharStream1

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com \\ / A nd | www.openfoam.com
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2017-2025 OpenCFD Ltd. Copyright (C) 2017-2023 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -83,10 +83,18 @@ Ostream& printView(Ostream& os, const char* first, const char* last)
} }
#if __cplusplus >= 201703L
Ostream& printView(Ostream& os, std::string_view s) Ostream& printView(Ostream& os, std::string_view s)
{ {
return printView(os, s.begin(), s.end()); return printView(os, s.begin(), s.end());
} }
#endif
Ostream& printView(Ostream& os, stdFoam::span<char> s)
{
return printView(os, s.begin(), s.end());
}
Ostream& printView(Ostream& os, const UList<char>& list) Ostream& printView(Ostream& os, const UList<char>& list)
@ -130,10 +138,17 @@ void printInfo(const List<char>& buf)
void printTokens(Istream& is) void printTokens(Istream& is)
{ {
label count = 0; label count = 0;
for (token tok; tok.read(is); ++count) token t;
while (is.good())
{ {
Info<< "token: " << tok << nl; is >> t;
if (t.good())
{
++count;
Info<<"token: " << t << endl;
}
} }
Info<< count << " tokens" << endl; Info<< count << " tokens" << endl;
} }

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2017 OpenFOAM Foundation Copyright (C) 2017 OpenFOAM Foundation
Copyright (C) 2019-2025 OpenCFD Ltd. Copyright (C) 2019-2022 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -269,7 +269,7 @@ int main(int argc, char *argv[])
ioOutput.rename(args.executable() + "-labels"); ioOutput.rename(args.executable() + "-labels");
Info<< "write " << ioOutput.objectRelPath() << endl; Info<< "write " << ioOutput.objectRelPath() << endl;
{ {
IOList<label>::writeContents(ioOutput, ints); IOListRef<label>(ioOutput, ints).write();
} }
ioOutput.rename(args.executable() + "-points"); ioOutput.rename(args.executable() + "-points");

View File

@ -1,3 +1,3 @@
Test-IOobjectList.cxx Test-IOobjectList.C
EXE = $(FOAM_USER_APPBIN)/Test-IOobjectList EXE = $(FOAM_USER_APPBIN)/Test-IOobjectList

View File

@ -1,3 +1,3 @@
Test-ISLList.cxx Test-ISLList.C
EXE = $(FOAM_USER_APPBIN)/Test-ISLList EXE = $(FOAM_USER_APPBIN)/Test-ISLList

View File

@ -1,3 +1,3 @@
Test-IStringStream.cxx Test-IStringStream.C
EXE = $(FOAM_USER_APPBIN)/Test-IStringStream EXE = $(FOAM_USER_APPBIN)/Test-IStringStream

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com \\ / A nd | www.openfoam.com
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2017-2025 OpenCFD Ltd. Copyright (C) 2017-2023 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -73,13 +73,18 @@ Ostream& toString(Ostream& os, const List<char>& list)
void printTokens(Istream& is) void printTokens(Istream& is)
{ {
Info<< "stream tokens:" << endl;
label count = 0; label count = 0;
for (token tok; tok.read(is); ++count) token t;
while (is.good())
{ {
Info<< " : " << tok << nl; is >> t;
if (t.good())
{
++count;
Info<< "token: " << t << endl;
}
} }
Info<< count << " tokens" << endl; Info<< count << " tokens" << endl;
} }
@ -450,12 +455,6 @@ int main(int argc, char *argv[])
"( const char input \"string\" to tokenize )\n" "( const char input \"string\" to tokenize )\n"
"List<label> 5(0 1 2 3 4);"; "List<label> 5(0 1 2 3 4);";
// printTokens
{
ISpanStream is(charInput);
printTokens(is);
}
string stringInput("( string ; input \"string\" to tokenize )"); string stringInput("( string ; input \"string\" to tokenize )");
List<char> listInput List<char> listInput

View File

@ -1,3 +1,3 @@
Test-IjkField.cxx Test-IjkField.C
EXE = $(FOAM_USER_APPBIN)/Test-IjkField EXE = $(FOAM_USER_APPBIN)/Test-IjkField

View File

@ -1,3 +1,3 @@
Test-List.cxx Test-List.C
EXE = $(FOAM_USER_APPBIN)/Test-List EXE = $(FOAM_USER_APPBIN)/Test-List

View File

@ -51,10 +51,10 @@ See also
#include "IndirectList.H" #include "IndirectList.H"
#include "SubList.H" #include "SubList.H"
#include "SliceList.H" #include "SliceList.H"
#include "SubField.H"
#include "ListPolicy.H" #include "ListPolicy.H"
#include <list> #include <list>
#include <numeric>
#include <functional> #include <functional>
// see issue #2083 // see issue #2083
@ -75,6 +75,8 @@ public:
namespace Detail
{
namespace ListPolicy namespace ListPolicy
{ {
@ -82,6 +84,7 @@ namespace ListPolicy
template<> struct short_length<short> : std::integral_constant<int,20> {}; template<> struct short_length<short> : std::integral_constant<int,20> {};
} // End namespace ListPolicy } // End namespace ListPolicy
} // End namespace Detail
} // End namespace Foam } // End namespace Foam
@ -106,7 +109,7 @@ void printMyString(const UList<string>& lst)
{ {
MyStrings slist2(lst); MyStrings slist2(lst);
Info<< slist2 << nl; Info<<slist2 << nl;
} }
@ -116,9 +119,9 @@ Ostream& printListOutputType(const char* what)
Info<< what Info<< what
<< " (contiguous=" << " (contiguous="
<< is_contiguous_v<T> << " no_linebreak=" << is_contiguous_v<T> << " no_linebreak="
<< ListPolicy::no_linebreak<T>::value << Detail::ListPolicy::no_linebreak<T>::value
<< " short_length=" << " short_length="
<< ListPolicy::short_length<T>::value << ')'; << Detail::ListPolicy::short_length<T>::value << ')';
return Info; return Info;
} }
@ -140,46 +143,8 @@ int main(int argc, char *argv[])
argList::addBoolOption("ListList", "Test list of list functionality"); argList::addBoolOption("ListList", "Test list of list functionality");
argList::addBoolOption("flag"); argList::addBoolOption("flag");
argList::addBoolOption("reserve", "Test ListPolicy for reserve_size");
#include "setRootCase.H" #include "setRootCase.H"
if (args.found("reserve"))
{
using namespace Foam::ListPolicy;
using control = std::pair<label, label>;
for
(
const auto& tup :
{
control{ 10, 5 },
control{ 20, 25 }
}
)
{
const auto [len, capacity] = tup;
Info<< "test " << tup << nl;
auto size = reserve_size<16,2>(len, capacity);
Info<< " => " << size << " (ratio 2)" << nl;
size = reserve_size<16,3,2>(len, capacity);
Info<< " => " << size << " (ratio 3/2)" << nl;
size = reserve_size<16,13,8>(len, capacity);
Info<< " => " << size << " (ratio " << (13.0/8) << ')' << nl;
size = reserve_size<16,25,16>(len, capacity);
Info<< " => " << size << " (ratio " << (25.0/16) << ')' << nl;
}
Info<< nl << "\nEnd" << endl;
return 0;
}
{ {
List<label> ident(15); List<label> ident(15);
Foam::identity(ident, 0); Foam::identity(ident, 0);
@ -204,6 +169,16 @@ int main(int argc, char *argv[])
Info<<" " << *iter; Info<<" " << *iter;
} }
Info<< nl; Info<< nl;
Info<< "data:" << Foam::name(ident.cdata())
<< " size:" << ident.size() << nl;
Info<< "resize_unsafe(10)" << nl;
ident.resize_unsafe(10);
Info<< "data:" << Foam::name(ident.cdata())
<< " size:" << ident.size() << nl;
} }
if (false) if (false)
@ -272,33 +247,6 @@ int main(int argc, char *argv[])
}; };
Info<< "list4: " << list4 << endl; Info<< "list4: " << list4 << endl;
{
List<scalar> list4Mag = ListOps::create<scalar>
(
list4,
[](const auto& a){ return a.mag(); }
);
const auto equalMag = [](const auto& a, const auto& b)
{
return (Foam::mag(a) == Foam::mag(b));
};
Info<< "list4 (mag): " << list4Mag << endl;
bool same = ListOps::equal(list4, list4Mag, equalMag);
Info<< "mag(list4) == list4(mag): " << same << nl;
SubField<scalar>(list4Mag) *= -1;
same = ListOps::equal(list4, list4Mag, equalMag);
Info<< "mag(list4) == list4(mag): " << same << nl;
SubField<scalar>(list4Mag) *= 1.1;
same = ListOps::equal(list4, list4Mag, equalMag);
Info<< "mag(list4) == list4(mag): " << same << nl;
}
List<vector> list5 List<vector> list5
{ {
{5, 3, 1}, {5, 3, 1},
@ -360,7 +308,7 @@ int main(int argc, char *argv[])
auto shrtList = ListOps::create<short> auto shrtList = ListOps::create<short>
( (
longLabelList, longLabelList,
[](label val){ return val; } [](const label& val){ return val; }
); );
printListOutputType<short>("short") << nl; printListOutputType<short>("short") << nl;
@ -557,7 +505,7 @@ int main(int argc, char *argv[])
auto scalars = ListOps::create<scalar> auto scalars = ListOps::create<scalar>
( (
labels, labels,
[](label val){ return scalar(1.5*val); } [](const label& val){ return scalar(1.5*val); }
); );
Info<< "scalars: " << flatOutput(scalars) << endl; Info<< "scalars: " << flatOutput(scalars) << endl;
} }
@ -566,7 +514,7 @@ int main(int argc, char *argv[])
auto vectors = ListOps::create<vector> auto vectors = ListOps::create<vector>
( (
labels, labels,
[](label val){ return vector(1.2*val, -1.2*val, 0); } [](const label& val){ return vector(1.2*val, -1.2*val, 0); }
); );
Info<< "vectors: " << flatOutput(vectors) << endl; Info<< "vectors: " << flatOutput(vectors) << endl;
} }
@ -575,7 +523,7 @@ int main(int argc, char *argv[])
auto longs = ListOps::create<long> auto longs = ListOps::create<long>
( (
labels, labels,
[](label val){ return val; } [](const label& val){ return val; }
); );
Info<< "longs: " << flatOutput(longs) << endl; Info<< "longs: " << flatOutput(longs) << endl;
} }
@ -593,7 +541,7 @@ int main(int argc, char *argv[])
( (
labelRange().cbegin(), labelRange().cbegin(),
labelRange(15).cend(), labelRange(15).cend(),
[](label val){ return scalar(-1.125*val); } [](const label& val){ return scalar(-1.125*val); }
); );
Info<< "scalars: " << flatOutput(scalars) << endl; Info<< "scalars: " << flatOutput(scalars) << endl;
} }

View File

@ -1,3 +1,3 @@
Test-List2.cxx Test-List2.C
EXE = $(FOAM_USER_APPBIN)/Test-List2 EXE = $(FOAM_USER_APPBIN)/Test-List2

Some files were not shown because too many files have changed in this diff Show More