DisplacementField utility can now take fields as default values.

This commit is contained in:
tlichtenegger
2021-08-24 08:49:08 +02:00
parent f8a5b9c9df
commit e871612ac7

View File

@ -37,8 +37,8 @@ Application
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void findPairs(labelList &, labelList &, labelPairList &); void findPairs(labelList &, labelList &, labelPairList &);
void findPairsUnordered(labelList &, labelList &, labelPairList &); void findPairsUnordered(labelList &, labelList &, labelPairList &);
void fillEmptyCells(fvMesh &, label , labelList &, volVectorField &, volVectorField &, scalarList &, vector, vector, bool, scalar); void fillEmptyCells(fvMesh &, label, label, labelList &, volVectorField &, volVectorField &, scalarList &, volVectorField &, volVectorField &, bool, scalar);
void nearestNeighborCells(fvMesh &, label, label, labelList &, labelList &); void nearestNeighborCells(fvMesh &, label, label, label, labelList &, labelList &);
void normalizeFields(labelList &, volVectorField &, volVectorField &); void normalizeFields(labelList &, volVectorField &, volVectorField &);
void readDump(std::string, labelList &, vectorList &); void readDump(std::string, labelList &, vectorList &);
scalar weightFun(scalar); scalar weightFun(scalar);
@ -87,6 +87,7 @@ int main(int argc, char *argv[])
label dumpIndexInputIncrement(readLabel(displacementProperties.lookup("dumpIndexInputIncrement"))); label dumpIndexInputIncrement(readLabel(displacementProperties.lookup("dumpIndexInputIncrement")));
label dumpIndexDisplacementIncrement(readLabel(displacementProperties.lookup("dumpIndexDisplacementIncrement"))); label dumpIndexDisplacementIncrement(readLabel(displacementProperties.lookup("dumpIndexDisplacementIncrement")));
label nNeighMin(readLabel(displacementProperties.lookup("nNeighMin"))); label nNeighMin(readLabel(displacementProperties.lookup("nNeighMin")));
label maxSearchLayers(displacementProperties.lookupOrDefault<label>("maxSearchLayers",0));
scalar timePerInputStep(readScalar(displacementProperties.lookup("timePerInputStep"))); scalar timePerInputStep(readScalar(displacementProperties.lookup("timePerInputStep")));
scalar timePerDisplacementStep(readScalar(displacementProperties.lookup("timePerDisplacementStep"))); scalar timePerDisplacementStep(readScalar(displacementProperties.lookup("timePerDisplacementStep")));
scalar startTime(readScalar(displacementProperties.lookup("startTime"))); scalar startTime(readScalar(displacementProperties.lookup("startTime")));
@ -94,8 +95,34 @@ int main(int argc, char *argv[])
std::string fileext=string(displacementProperties.lookupOrDefault<string>("fileextension","")); std::string fileext=string(displacementProperties.lookupOrDefault<string>("fileextension",""));
bool interpolate=bool(displacementProperties.lookupOrDefault<bool>("fillEmptyCells",true)); bool interpolate=bool(displacementProperties.lookupOrDefault<bool>("fillEmptyCells",true));
bool averageMode=bool(displacementProperties.lookupOrDefault<bool>("averageMode",false)); bool averageMode=bool(displacementProperties.lookupOrDefault<bool>("averageMode",false));
vector defaultUs=vector(displacementProperties.lookupOrDefault<vector>("defaultUs",vector::zero));
vector defaultUsDirectedVariance=vector(displacementProperties.lookupOrDefault<vector>("defaultUsDirectedVariance",vector::zero)); volVectorField defaultUs
(
IOobject
(
"defaultUDisp",
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
mesh,
dimensionedVector("zero", dimensionSet(0,1,-1,0,0), vector::zero)
);
volVectorField defaultUsDirectedVariance
(
IOobject
(
"defaultUDispDirectedVariance",
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
mesh,
dimensionedVector("zero", dimensionSet(0,1,-1,0,0), vector::zero)
);
scalar xmin=scalar(displacementProperties.lookupOrDefault<scalar>("xmin",-1e10)); scalar xmin=scalar(displacementProperties.lookupOrDefault<scalar>("xmin",-1e10));
scalar xmax=scalar(displacementProperties.lookupOrDefault<scalar>("xmax",1e10)); scalar xmax=scalar(displacementProperties.lookupOrDefault<scalar>("xmax",1e10));
@ -183,7 +210,7 @@ int main(int argc, char *argv[])
if (averageMode) if (averageMode)
{ {
normalizeFields(particlesInCell, Us, UsDirectedVariance); normalizeFields(particlesInCell, Us, UsDirectedVariance);
fillEmptyCells(mesh,nNeighMin,particlesInCell,Us,UsDirectedVariance,boundaries,defaultUs,defaultUsDirectedVariance,interpolate,timePerDisplacementStep); fillEmptyCells(mesh,nNeighMin,maxSearchLayers,particlesInCell,Us,UsDirectedVariance,boundaries,defaultUs,defaultUsDirectedVariance,interpolate,timePerDisplacementStep);
Us /= timePerDisplacementStep; Us /= timePerDisplacementStep;
UsDirectedVariance /= timePerDisplacementStep; UsDirectedVariance /= timePerDisplacementStep;
@ -238,7 +265,7 @@ int main(int argc, char *argv[])
if (!averageMode) if (!averageMode)
{ {
normalizeFields(particlesInCell, Us, UsDirectedVariance); normalizeFields(particlesInCell, Us, UsDirectedVariance);
fillEmptyCells(mesh,nNeighMin,particlesInCell,Us,UsDirectedVariance,boundaries,defaultUs,defaultUsDirectedVariance,interpolate,timePerDisplacementStep); fillEmptyCells(mesh,nNeighMin,maxSearchLayers,particlesInCell,Us,UsDirectedVariance,boundaries,defaultUs,defaultUsDirectedVariance,interpolate,timePerDisplacementStep);
Us /= timePerDisplacementStep; Us /= timePerDisplacementStep;
UsDirectedVariance /= timePerDisplacementStep; UsDirectedVariance /= timePerDisplacementStep;
@ -339,7 +366,7 @@ void findPairsUnordered(labelList &indices1, labelList &indices2, labelPairList
Info << "findPairs: " << pairs.size() << " pairs found." << endl; Info << "findPairs: " << pairs.size() << " pairs found." << endl;
} }
void fillEmptyCells(fvMesh &mesh, label nNeighMin, labelList &particlesInCell, volVectorField &Us, volVectorField& UsDirectedVariance,scalarList& boundaries, vector defaultUs, vector defaultUsDirectedVariance, bool interpolate, scalar dt) void fillEmptyCells(fvMesh &mesh, label nNeighMin, label maxSearchLayers, labelList &particlesInCell, volVectorField &Us, volVectorField& UsDirectedVariance,scalarList& boundaries, volVectorField &defaultUs, volVectorField &defaultUsDirectedVariance, bool interpolate, scalar dt)
{ {
labelList neighborsWithValues; labelList neighborsWithValues;
scalar neighborSqrDistance; scalar neighborSqrDistance;
@ -360,12 +387,12 @@ void fillEmptyCells(fvMesh &mesh, label nNeighMin, labelList &particlesInCell, v
if (outsideBox > 0 || !interpolate) if (outsideBox > 0 || !interpolate)
{ {
Us[cellI] = defaultUs*dt; Us[cellI] = defaultUs[cellI]*dt;
UsDirectedVariance[cellI] = defaultUsDirectedVariance*dt; UsDirectedVariance[cellI] = defaultUsDirectedVariance[cellI]*dt;
continue; continue;
} }
nearestNeighborCells(mesh, cellI, nNeighMin, particlesInCell, neighborsWithValues); nearestNeighborCells(mesh, cellI, nNeighMin, maxSearchLayers, particlesInCell, neighborsWithValues);
weightSum = 0.0; weightSum = 0.0;
weights.clear(); weights.clear();
for (label neighI=0; neighI<neighborsWithValues.size(); neighI++) for (label neighI=0; neighI<neighborsWithValues.size(); neighI++)
@ -381,6 +408,12 @@ void fillEmptyCells(fvMesh &mesh, label nNeighMin, labelList &particlesInCell, v
Us[cellI] += weight*Us[neighborsWithValues[neighI]]; Us[cellI] += weight*Us[neighborsWithValues[neighI]];
UsDirectedVariance[cellI] += weight*UsDirectedVariance[neighborsWithValues[neighI]]; UsDirectedVariance[cellI] += weight*UsDirectedVariance[neighborsWithValues[neighI]];
} }
if (neighborsWithValues.size() == 0)
{
Us[cellI] = defaultUs[cellI]*dt;
UsDirectedVariance[cellI] = defaultUsDirectedVariance[cellI]*dt;
}
// make sure no particles are placed outside of domain // make sure no particles are placed outside of domain
// TODO: correct following implementation (meshSearch) and test it // TODO: correct following implementation (meshSearch) and test it
@ -396,8 +429,9 @@ void fillEmptyCells(fvMesh &mesh, label nNeighMin, labelList &particlesInCell, v
} }
} }
void nearestNeighborCells(fvMesh &mesh, label refCell, label nNeighMin, labelList &particlesInCell, labelList &neighborsWithValues) void nearestNeighborCells(fvMesh &mesh, label refCell, label nNeighMin, label maxSearchLayers, labelList &particlesInCell, labelList &neighborsWithValues)
{ {
label numSearchLayers = 0;
std::set<label> neighbors; std::set<label> neighbors;
std::set<label> newNeighbors; std::set<label> newNeighbors;
std::set<label> recentNeighbors; std::set<label> recentNeighbors;
@ -425,6 +459,9 @@ void nearestNeighborCells(fvMesh &mesh, label refCell, label nNeighMin, labelLis
} }
} }
} }
numSearchLayers++;
if (numSearchLayers > maxSearchLayers && maxSearchLayers > 0) return;
if (newNeighbors.size() == 0) return; if (newNeighbors.size() == 0) return;
recentNeighbors.clear(); recentNeighbors.clear();