59 surfaces_.setSize(names.
size());
62 surfaces_[i] = geometry_.findSurfaceID(names[i]);
64 if (surfaces_[i] == -1)
67 <<
"Cannot find surface " << names[i] <<
" in geometry" 71 if (isA<searchableExtrudedCircle>(geometry_[surfaces_[i]]))
73 Info<<
type() <<
" : Using curved surface " 74 << geometry_[surfaces_[i]].name()
75 <<
" to predict starting points." <<
endl;
87 static label eIter = 0;
96 Info<<
"Writing lines from straight-line start points" 97 <<
" to projected points to " << debugStr().name() <<
endl;
104 const point& startPt = points_[start_];
105 const point& endPt = points_[end_];
106 const vector d = endPt-startPt;
111 points[i] = startPt+lambdas[i]*d;
118 if (isA<searchableExtrudedCircle>(geometry_[surfaces_[i]]))
121 refCast<const searchableExtrudedCircle>
123 geometry_[surfaces_[i]]
136 if (nearInfo[i].hit())
138 points[i] = nearInfo[i].hitPoint();
149 const label maxIter = 10;
151 const scalar relTol = 0.1;
152 const scalar absTol = 1
e-4;
154 scalar initialResidual = 0.0;
156 for (
label iter = 0; iter < maxIter; iter++)
173 if (lambdas[0] < small)
177 if (lambdas.
last() > 1.0-small)
179 points.
last() = endPt;
182 if (debugStr.
valid())
194 projLambdas[0] = 0.0;
195 for (
label i = 1; i < points.
size(); i++)
197 projLambdas[i] = projLambdas[i-1] +
mag(points[i]-points[i-1]);
199 projLambdas /= projLambdas.last();
208 for (
label i = 1; i < points.
size() - 1; i++)
210 interpolator.
valueWeights(lambdas[i], indices, weights);
215 predicted += weights[indexi]*points[indices[indexi]];
217 residual[i] = predicted-points[i];
220 scalar scalarResidual =
sum(
mag(residual));
224 Pout<<
"Iter:" << iter <<
" initialResidual:" << initialResidual
225 <<
" residual:" << scalarResidual <<
endl;
228 if (scalarResidual < absTol*0.5*lambdas.
size())
234 initialResidual = scalarResidual;
236 else if (scalarResidual/initialResidual < relTol)
242 if (debugStr.
valid())
246 const point predicted(points[i] + residual[i]);
#define forAll(list, i)
Loop across all elements in list.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManipArg< error, int > exit(error &err, const int errNo=1)
void reset(T *=nullptr)
If object pointer already set, delete object and set to given.
virtual point position(const scalar) const
Return the point positions corresponding to the curve parameters.
A list of keyword definitions, which are a keyword followed by any number of values (e...
static void findNearest(const PtrList< searchableSurface > &, const labelList &surfacesToTest, const pointField &, const scalarField &nearestDistSqr, labelList &surfaces, List< pointIndexHit > &)
Find nearest. Return -1 (and a miss()) or surface and nearest.
projectCurveEdge(const dictionary &dict, const label index, const searchableSurfaces &geometry, const pointField &points, Istream &)
Construct from Istream setting pointsList.
T & ref() const
Return non-const reference or generate a fatal error.
Unit conversion functions.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
void size(const label)
Override size to be inconsistent with allocated storage.
Ostream & endl(Ostream &os)
Add newline and flush stream.
Macros for easy insertion into run-time selection tables.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
virtual void findParametricNearest(const point &start, const point &end, const scalarField &lambdas, const scalarField &nearestDistSqr, List< pointIndexHit > &) const
Unique to parametric geometry: given points find.
gmvFile<< "tracers "<< particles.size()<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().x()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().y()<< " ";}gmvFile<< nl;forAllConstIter(Cloud< passiveParticle >, particles, iter){ gmvFile<< iter().position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
vectorField pointField
pointField is a vectorField.
virtual bool valueWeights(const scalar t, labelList &indices, scalarField &weights) const
Calculate weights and indices to calculate t from samples.
line< point, const point & > linePointRef
Line using referred points.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Container for searchableSurfaces.
bool valid() const
Return true if the autoPtr valid (ie, the pointer is set)
dimensioned< scalar > magSqr(const dimensioned< Type > &)
addToRunTimeSelectionTable(ensightPart, ensightPartCells, istream)
OFstream which keeps track of vertices.
defineTypeNameAndDebug(combustionModel, 0)
word name(const complex &)
Return a string representation of a complex.
Define a curved edge that is parameterized for 0<lambda<1 between the start and end point...
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
prefixOSstream Pout(cout, "Pout")
fileType type(const fileName &, const bool checkVariants=true, const bool followLink=true)
Return the file type: directory or file.
Searching on edgemesh with constant radius.
dimensioned< scalar > mag(const dimensioned< Type > &)
An auto-pointer similar to the STL auto_ptr but with automatic casting to a reference to the type and...
const doubleScalar e
Elementary charge.
A class for managing temporary objects.
T & last()
Return the last element of the list.
static const Vector< scalar > zero