diff --git a/src/OpenFOAM/meshes/meshTools/mergePoints.C b/src/OpenFOAM/meshes/meshTools/mergePoints.C index 041a6f8194..2fcb505673 100644 --- a/src/OpenFOAM/meshes/meshTools/mergePoints.C +++ b/src/OpenFOAM/meshes/meshTools/mergePoints.C @@ -95,8 +95,8 @@ Foam::label Foam::mergePoints sortedTol[sortI] = 2*mergeTol* ( - mag(scalar(pt.x() - compareOrigin.x())), - + mag(scalar(pt.y() - compareOrigin.y())), + mag(scalar(pt.x() - compareOrigin.x())) + + mag(scalar(pt.y() - compareOrigin.y())) + mag(scalar(pt.z() - compareOrigin.z())) ); } diff --git a/src/functionObjects/field/wallBoundedStreamLine/wallBoundedParticleTemplates.C b/src/functionObjects/field/wallBoundedStreamLine/wallBoundedParticleTemplates.C index 731c4ad0b3..b2febe5203 100644 --- a/src/functionObjects/field/wallBoundedStreamLine/wallBoundedParticleTemplates.C +++ b/src/functionObjects/field/wallBoundedStreamLine/wallBoundedParticleTemplates.C @@ -232,6 +232,39 @@ Foam::scalar Foam::wallBoundedParticle::trackToEdge { // Negative tet volume. Track back by setting the end point projectedEndPosition = position() - (endPosition-position()); + + // Make sure to use a large enough vector to cross the negative + // face. Bit overkill. + const vector d(endPosition-position()); + const scalar magD(mag(d)); + if (magD > ROOTVSMALL) + { + // Get overall mesh bounding box + treeBoundBox meshBb(mesh_.bounds()); + // Extend to make 3D + meshBb.inflate(ROOTSMALL); + + // Create vector guaranteed to cross mesh bounds + projectedEndPosition = position()-meshBb.mag()*d/magD; + + // Clip to mesh bounds + point intPt; + direction intPtBits; + bool ok = meshBb.intersects + ( + projectedEndPosition, + position()-projectedEndPosition, + projectedEndPosition, + position(), + intPt, + intPtBits + ); + if (ok) + { + // Should always be the case + projectedEndPosition = intPt; + } + } } // Remove normal component diff --git a/src/meshTools/sets/cellSources/fieldToCell/fieldToCell.C b/src/meshTools/sets/cellSources/fieldToCell/fieldToCell.C index 298996937c..b6640eaa03 100644 --- a/src/meshTools/sets/cellSources/fieldToCell/fieldToCell.C +++ b/src/meshTools/sets/cellSources/fieldToCell/fieldToCell.C @@ -190,7 +190,7 @@ void Foam::fieldToCell::applyToSet false ); - // Note: should check for volScalarField but that introduces depencendy + // Note: should check for volScalarField but that introduces dependency // on volMesh so just use another type with processor-local scope if (!fieldObject.typeHeaderOk(false)) { @@ -198,6 +198,9 @@ void Foam::fieldToCell::applyToSet << "Cannot read field " << fieldName_ << " from time " << mesh().time().timeName() << endl; } + // Note: should use volScalarField::typeName instead below + // but that would introduce linkage problems (finiteVolume needs + // meshTools) else if (fieldObject.headerClassName() == "volScalarField") { IFstream str(typeFilePath(fieldObject));