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
1119 changed files with 12145 additions and 19529 deletions

View File

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

View File

@ -13,14 +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 = dimensionedVector(U.dimensions(), Zero);
{
const dimensionedVector dt(U.dimensions(), Zero);
U.internalFieldRef() = dt;
U.boundaryFieldRef() = dt.value();
}
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

@ -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

@ -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

@ -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.
@ -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

@ -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

@ -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-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,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-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,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,12 @@ 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) Ostream& printView(Ostream& os, stdFoam::span<char> s)
@ -136,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

@ -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
@ -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},

View File

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

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 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -35,7 +35,6 @@ Description
#include "FixedList.H" #include "FixedList.H"
#include "labelList.H" #include "labelList.H"
#include "vectorList.H" #include "vectorList.H"
#include "SubList.H"
#include "ListOps.H" #include "ListOps.H"
#include "IFstream.H" #include "IFstream.H"
#include "OFstream.H" #include "OFstream.H"
@ -201,7 +200,6 @@ int main(int argc, char *argv[])
argList::addBoolOption("order"); argList::addBoolOption("order");
argList::addBoolOption("labelList"); argList::addBoolOption("labelList");
argList::addBoolOption("vectorList"); argList::addBoolOption("vectorList");
argList::addBoolOption("ulist");
argList args(argc, argv); argList args(argc, argv);
@ -263,37 +261,6 @@ int main(int argc, char *argv[])
} }
if (args.found("ulist"))
{
using span_type = stdFoam::span<vector>;
using ulist_type = UList<vector>;
ulist_type view1, view2;
span_type span1, span2;
List<vector> list(10, vector::one);
Info<< "List: " << Foam::name(list.data()) << nl;
Info<< "view: " << Foam::name(view1.data()) << nl;
Info<< "span: " << Foam::name(span1.data()) << nl;
view1 = list.slice(4);
span1 = span_type(list.begin(4), list.size()-4);
Info<< "view [4]:" << Foam::name(view1.data()) << nl;
Info<< "span [4]:" << Foam::name(span1.data()) << nl;
view2 = std::move(view1);
span2 = std::move(span1);
Info<< "view old:" << Foam::name(view1.data()) << nl;
Info<< "span old:" << Foam::name(span1.data()) << nl;
Info<< "view [4]:" << Foam::name(view2.data()) << nl;
Info<< "span [4]:" << Foam::name(span2.data()) << nl;
view1 = list.slice(7);
Info<< "view [7]:" << Foam::name(view1.data()) << nl;
}
Info<< nl << "Done" << nl << endl; Info<< nl << "Done" << nl << endl;
return 0; return 0;
} }

View File

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

View File

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

View File

@ -50,6 +50,7 @@ Description
#include "ListPolicy.H" #include "ListPolicy.H"
#include <list> #include <list>
#include <numeric>
#include <functional> #include <functional>
using namespace Foam; using namespace Foam;
@ -85,7 +86,7 @@ bool readBracketList(List<T>& list, Istream& is)
// constexpr label chunkSize = 128; // constexpr label chunkSize = 128;
typedef std::unique_ptr<List<T>> chunkType; typedef std::unique_ptr<List<T>> chunkType;
tok.read(is); is >> tok;
is.fatalCheck(FUNCTION_NAME); is.fatalCheck(FUNCTION_NAME);
if (tok.isPunctuation(token::END_LIST)) if (tok.isPunctuation(token::END_LIST))
@ -149,7 +150,7 @@ bool readBracketList(List<T>& list, Istream& is)
"reading entry" "reading entry"
); );
tok.read(is); is >> tok;
is.fatalCheck(FUNCTION_NAME); is.fatalCheck(FUNCTION_NAME);
} }

View File

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

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,12 @@ 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) Ostream& printView(Ostream& os, stdFoam::span<char> s)
@ -127,10 +129,17 @@ void printInfo(const BufType& 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

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

View File

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

View File

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

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.
@ -85,10 +85,12 @@ 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) Ostream& printView(Ostream& os, stdFoam::span<char> s)
@ -143,10 +145,17 @@ void printInfo(const UList<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

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

View File

@ -38,6 +38,7 @@ Description
#include "SubField.H" #include "SubField.H"
#include "labelRange.H" #include "labelRange.H"
#include "ListOps.H" #include "ListOps.H"
#include <numeric>
using namespace Foam; using namespace Foam;

View File

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

View File

@ -37,40 +37,35 @@ Description
#include "vector.H" #include "vector.H"
#include "tensor.H" #include "tensor.H"
#include "uLabel.H" #include "uLabel.H"
#include "MinMax.H"
#include "Switch.H" #include "Switch.H"
#include "IOstreams.H" #include "IOstreams.H"
#include "UPstream.H" #include "UPstream.H"
#include <functional>
#include <type_traits> #include <type_traits>
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // using namespace Foam;
namespace Foam // Just for debugging
{ const List<std::string> dataType_names
({
// Add in some extras from functional "byte",
"int32",
//- Map std::plus to \c UPstream::opCodes::op_sum "int64",
template<> "uint32",
struct UPstream_opType<std::plus<void>> : std::true_type "uint64",
{ "float",
static constexpr auto opcode_id = UPstream::opCodes::op_sum; "double",
}; "long_double",
//- Map 'signed char' to UPstream::dataTypes::type_byte
// Caution with: may be identical to int8_t mapping!!
#if 0
template<>
struct UPstream_alias_dataType<signed char> : std::true_type
{
using base = char;
static constexpr auto datatype_id = UPstream::dataTypes::type_byte;
};
#endif
"float(2)",
"double(2)",
"float(3)",
"double(3)",
"float(6)",
"double(6)",
"float(9)",
"double(9)"
});
//- Test for pTraits typeName member : default is false //- Test for pTraits typeName member : default is false
template<class T, class = void> template<class T, class = void>
@ -87,93 +82,24 @@ struct check_has_typeName
std::true_type std::true_type
{}; {};
} // End namespace Foam
// Possible future change...
// //- A supported UPstream data type (intrinsic or user-defined)
// template<>
// struct UPstream_base_dataType<complex> : std::true_type
// {
// static constexpr auto datatype_id = []()
// {
// if constexpr (sizeof(complex) == 2*sizeof(float))
// return UPstream::dataTypes::type_2float;
// else
// return UPstream::dataTypes::type_2double;
// }();
// };
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // template<class T>
void printTypeName(const bool showSize = false)
// Just for debugging
static const Foam::List<std::string> dataType_names
({
"byte",
"int16",
"int32",
"int64",
"uint16",
"uint32",
"uint64",
"float",
"double",
"long_double",
"float[3]",
"double[3]",
"float[6]",
"double[6]",
"float[9]",
"double[9]"
});
// Just for debugging
static const Foam::List<std::string> opType_names
({
"op_min",
"op_max",
"op_sum",
"op_prod",
"op_bool_and",
"op_bool_or",
"op_bool_xor",
"op_bit_and",
"op_bit_or",
"op_bit_xor",
"op_replace",
"op_no_op"
});
using namespace Foam;
void printDataTypeId(UPstream::dataTypes datatype_id)
{
if (datatype_id != UPstream::dataTypes::invalid)
{
const int index = int(datatype_id);
if (index < dataType_names.size())
{
Info<< dataType_names[index];
}
else
{
Info<< '(' << index << ')';
}
}
}
void printOpCodeId(UPstream::opCodes opcode_id)
{
if (opcode_id != UPstream::opCodes::invalid)
{
const int index = int(opcode_id);
if (index < opType_names.size())
{
Info<< ':' << opType_names[index].c_str();
}
else
{
Info<< '(' << index << ')';
}
}
else
{
Info<< "(null)";
}
}
template<class T, bool showSize = false>
void printTypeName()
{ {
// Both float and double have pTraits typeName = "scalar"! // Both float and double have pTraits typeName = "scalar"!
if constexpr (std::is_same_v<float, std::remove_cv_t<T>>) if constexpr (std::is_same_v<float, std::remove_cv_t<T>>)
@ -192,13 +118,12 @@ void printTypeName()
{ {
Info<< typeid(T).name(); Info<< typeid(T).name();
} }
if constexpr (showSize) if (showSize)
{ {
Info<< " (" << sizeof(T) << " bytes)"; Info<< " (" << sizeof(T) << " bytes)";
} }
} }
template<class Type, bool UseTypeName = true> template<class Type, bool UseTypeName = true>
void printPstreamTraits(const std::string_view name = std::string_view()) void printPstreamTraits(const std::string_view name = std::string_view())
{ {
@ -208,111 +133,55 @@ void printPstreamTraits(const std::string_view name = std::string_view())
{ {
Info<< name << ' '; Info<< name << ' ';
} }
if constexpr (UseTypeName) if constexpr (UseTypeName)
{ {
printTypeName<Type, true>(); printTypeName<Type>(true);
} }
else else
{ {
Info<< typeid(Type).name() << " (" << sizeof(Type) << " bytes)"; Info<< typeid(Type).name();
} Info<< " (" << sizeof(Type) << " bytes)";
{
using cmpt = typename Foam::pTraits_cmptType<Type>::type;
if constexpr (!std::is_same_v<Type, cmpt>)
{
Info<< ", cmpt:";
if constexpr (UseTypeName)
{
printTypeName<cmpt, true>();
}
else
{
Info<< typeid(cmpt).name() << " (" << sizeof(cmpt) << " bytes)";
}
}
} }
Info<< ", cmpt:";
printTypeName<typename Foam::pTraits_cmptType<Type>::type>(true);
Info<< nl Info<< nl
<< " is_contiguous:" << " is_contiguous:"
<< is_contiguous<Type>::value; << is_contiguous<Type>::value
<< ", is base:"
<< UPstream_base_dataType<Type>::value
<< ", is cmpt:"
<< UPstream_dataType<Type>::value << nl;
if constexpr (UPstream_mpi_dataType<Type>::value) Info<< "is base:"
{ << UPstream_base_dataType<Type>::value
Info<< ", is_mpi=(" << " (type:" << int(UPstream_base_dataType<Type>::datatype_id)
<< int(UPstream_mpi_dataType<Type>::datatype_id) << ')'; << ") is alias:" << UPstream_alias_dataType<Type>::value
} << " (type:" << int(UPstream_alias_dataType<Type>::datatype_id)
else << ")" << nl;
{
std::cout << ", is_mpi=(null)";
}
if constexpr (UPstream_user_dataType<Type>::value)
{
Info<< ", is_user=("
<< int(UPstream_user_dataType<Type>::datatype_id) << ')';
}
else
{
std::cout << ", is_user=(null)";
}
if constexpr (UPstream_any_dataType<Type>::value)
{
Info<< ", is_any=("
<< int(UPstream_any_dataType<Type>::datatype_id) << ')';
}
else
{
std::cout << ", is_any=(null)";
}
// Any aliases?
if constexpr
(
UPstream_alias_dataType<Type>::value
&& !UPstream_mpi_dataType<Type>::value
)
{
Info<< ", alias=("
<< int(UPstream_alias_dataType<Type>::datatype_id) << ')';
}
Info<< " base-type:" << int(UPstream_basic_dataType<Type>::datatype_id) {
<< " data-type:" << int(UPstream_dataType<Type>::datatype_id) int index = int(UPstream_base_dataType<Type>::datatype_id);
<< nl; Info<< "datatype: " << index;
if constexpr (UPstream_basic_dataType<Type>::value) if (index < dataType_names.size())
{ {
Info<< " base-type="; Info<< ' ' << dataType_names[index];
printDataTypeId(UPstream_basic_dataType<Type>::datatype_id); }
} Info<< nl;
else if constexpr (UPstream_dataType<Type>::value)
{
Info<< " data-type=";
printDataTypeId(UPstream_dataType<Type>::datatype_id);
} }
{ {
// Use element or component type (or byte-wise) for data type // Use element or component type (or byte-wise) for data type
using base = typename UPstream_dataType<Type>::base; using base = typename UPstream_dataType<Type>::base;
constexpr auto datatype = UPstream_dataType<Type>::datatype_id;
Info<< " : "; Info<< "datatype => ";
if constexpr (UseTypeName) printTypeName<base>();
{ Info<< " (" << sizeof(Type)/sizeof(base) << " elems)" << nl
printTypeName<base, true>(); << "datatype: " << static_cast<int>(datatype) << nl;
}
else
{
Info<< typeid(base).name() << " (" << sizeof(base) << " bytes)";
}
Info<< " cmpt-type=";
printDataTypeId(UPstream_dataType<Type>::datatype_id);
Info<< " count=" << UPstream_dataType<Type>::size(1);
Info<< nl;
} }
} }
@ -321,44 +190,15 @@ template<class BinaryOp>
void printOpCodeTraits(BinaryOp bop, std::string_view name) void printOpCodeTraits(BinaryOp bop, std::string_view name)
{ {
Info<< "op: " << name << ' '; Info<< "op: " << name << ' ';
if constexpr (UPstream_opType<BinaryOp>::value)
printOpCodeId(UPstream_opType<BinaryOp>::opcode_id);
Info<< nl;
}
template<class DataType, class BinaryOp>
void printOpCodeTraits(BinaryOp bop, std::string_view name)
{
Info<< "op: " << name << ' ';
printOpCodeId(UPstream_opType<BinaryOp>::opcode_id);
if constexpr (!std::is_void_v<DataType>)
{ {
if constexpr (UPstream_basic_dataType<DataType>::value) Info<< "supported";
{
Info<< " [supported type]";
}
else
{
Info<< " [disabled]";
}
} }
Info<< nl; else
} {
Info<< "unknown";
}
template<class DataType, class BinaryOp> Info<< ": " << int(UPstream_opType<BinaryOp>::opcode_id) << nl;
void print_data_opType(BinaryOp bop, std::string_view name)
{
Info<< "op: " << name << ' ';
printOpCodeId(UPstream_data_opType<BinaryOp, DataType>::opcode_id);
const bool ok = UPstream_data_opType<BinaryOp, DataType>::value;
Info<< " okay=" << ok << nl;
} }
@ -370,16 +210,6 @@ int main()
printPstreamTraits<bool>(); printPstreamTraits<bool>();
printPstreamTraits<label>(); printPstreamTraits<label>();
printPstreamTraits<char, false>("<char>");
printPstreamTraits<signed char, false>("<signed char>");
printPstreamTraits<unsigned char, false>("<unsigned char>");
printPstreamTraits<int8_t, false>("<int8_t>");
printPstreamTraits<uint8_t, false>("<uint8_t>");
printPstreamTraits<int16_t, false>("<int16_t>");
printPstreamTraits<uint16_t, false>("<uint16_t>");
printPstreamTraits<int>("<int>"); printPstreamTraits<int>("<int>");
printPstreamTraits<long>("<long>"); printPstreamTraits<long>("<long>");
printPstreamTraits<unsigned>("<unsigned>"); printPstreamTraits<unsigned>("<unsigned>");
@ -428,35 +258,6 @@ int main()
printOpCodeTraits(bitAndOp<unsigned>{}, "bitAnd<unsigned>"); printOpCodeTraits(bitAndOp<unsigned>{}, "bitAnd<unsigned>");
printOpCodeTraits(bitOrOp<unsigned>{}, "bitOr<unsigned>"); printOpCodeTraits(bitOrOp<unsigned>{}, "bitOr<unsigned>");
printOpCodeTraits<vector>(sumOp<vector>{}, "sum");
printOpCodeTraits(sumOp<scalarMinMax>{}, "sum");
printOpCodeTraits(std::plus<>{}, "sum");
printOpCodeTraits<bool>(std::plus<>{}, "sum");
printOpCodeTraits<vector>(std::plus<>{}, "sum");
// Expect success
Info<< nl << "expect success" << nl;
print_data_opType<vector>(maxOp<scalar>(), "maxOp(scalar)");
print_data_opType<unsigned>(bitOrOp<unsigned>(), "bitOrOp(unsigned)");
print_data_opType<uint8_t>(bitOrOp<uint8_t>(), "bitOrOp(uint8_t)");
print_data_opType<uint16_t>(bitOrOp<uint16_t>(), "bitOrOp(uint16_t)");
// Even allow signed integrals
print_data_opType<int>(bitOrOp<int>(), "bitOrOp(int)");
print_data_opType<int8_t>(bitOrOp<int8_t>(), "bitOrOp(int8_t)");
// Failure - supported op, unsupported data type.
Info<< nl << "expect failure" << nl;
print_data_opType<bool>(maxOp<scalar>(), "maxOp(scalar, bool)");
print_data_opType<bool>(bitOrOp<unsigned>(), "bitOrOp(unsigned, bool)");
// False positives. Failure - supported op, unsupported data type.
Info<< nl << "false positives" << nl;
print_data_opType<void>(maxOp<bool>(), "maxOp(bool, void)");
print_data_opType<float>(bitOrOp<unsigned>(), "bitOrOp(unsigned, float)");
Info<< nl << "End\n" << endl; Info<< nl << "End\n" << endl;
return 0; return 0;

View File

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

View File

@ -499,7 +499,7 @@ int main(int argc, char *argv[])
Info<<"bitSet "; Info<<"bitSet ";
report(list4); report(list4);
list4.shrink_to_fit(); list4.shrink();
Info<<"shrunk "; Info<<"shrunk ";
report(list4); report(list4);

View File

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

View File

@ -43,6 +43,8 @@ Description
#include "SubList.H" #include "SubList.H"
#include "FlatOutput.H" #include "FlatOutput.H"
#include <numeric>
using namespace Foam; using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

View File

@ -50,6 +50,8 @@ Description
#include "SliceStreamRepo.H" #include "SliceStreamRepo.H"
#endif #endif
#include <numeric>
using namespace Foam; using namespace Foam;

View File

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

View File

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

View File

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

View File

@ -142,26 +142,6 @@ int main(int argc, char *argv[])
Info<< "sorted "; Info<< "sorted ";
printInfo(e4); printInfo(e4);
// Sorted construction
{
edge edge1(10, 5);
Info<< "plain ";
printInfo(edge1);
// construct sorted
auto edge3(edge::sorted(10, 5));
Info<< "sorted ";
printInfo(edge3);
// // construct sorted (deprecated)
// edge edge2(10, 5, true);
//
// Info<< "sorted ";
// printInfo(edge2);
}
return 0; return 0;
} }

View File

@ -262,12 +262,13 @@ int main(int argc, char *argv[])
// Check constant profile // Check constant profile
{ {
auto limits = gMinMax(one); const scalar max = gMax(one);
const scalar min = gMin(one);
Info<< "Uniform one field min = " Info<< "Uniform one field min = " << min
<< limits.min() << " max = " << limits.max() << endl; << " max = " << max << endl;
if (isNotEqual(limits.min(), 1) || isNotEqual(limits.max(), 1)) if (isNotEqual(max, 1) || isNotEqual(min, 1))
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Uniform volVectorField not preserved." << "Uniform volVectorField not preserved."
@ -285,12 +286,13 @@ int main(int argc, char *argv[])
{ {
const scalarField diff = ccX-mesh.C().component(0); const scalarField diff = ccX-mesh.C().component(0);
auto limits = gMinMax(diff); const scalar max = gMax(diff);
const scalar min = gMin(diff);
Info<< "Linear profile field min = " Info<< "Linear profile field min = " << min
<< limits.min() << " max = " << limits.max() << endl; << " max = " << max << endl;
if (isNotEqual(limits.min(), 0) || isNotEqual(limits.max(), 0)) if (isNotEqual(max, 0) || isNotEqual(min, 0))
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Linear profile not preserved." << "Linear profile not preserved."
@ -307,12 +309,13 @@ int main(int argc, char *argv[])
// Check face field mapping // Check face field mapping
if (surfaceOne.size()) if (surfaceOne.size())
{ {
auto limits = gMinMax(surfaceOne.primitiveField()); const scalar max = gMax(surfaceOne.primitiveField());
const scalar min = gMin(surfaceOne.primitiveField());
Info<< "Uniform surface field min = " Info<< "Uniform surface field min = " << min
<< limits.min() << " max = " << limits.max() << endl; << " max = " << max << endl;
if (isNotEqual(limits.min(), 1) || isNotEqual(limits.max(), 1)) if (isNotEqual(max, 1) || isNotEqual(min, 1))
{ {
FatalErrorInFunction FatalErrorInFunction
<< "Uniform surfaceScalarField not preserved." << "Uniform surfaceScalarField not preserved."

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