52 Foam::blockEdges::projectCurveEdge::projectCurveEdge
70 if (surfaces_[i] == -1)
73 <<
"Cannot find surface " <<
names[i] <<
" in geometry" 77 if (isA<searchableExtrudedCircle>(geometry_[surfaces_[i]]))
79 Info<<
type() <<
" : Using curved surface " 80 << geometry_[surfaces_[i]].name()
81 <<
" to predict starting points." <<
endl;
101 static label eIter = 0;
110 Info<<
"Writing lines from straight-line start points" 111 <<
" to projected points to " << debugStr().name() <<
endl;
116 auto&
points = tpoints.ref();
118 const scalar distSqr =
Foam::magSqr(lastPoint()-firstPoint());
130 if (isA<searchableExtrudedCircle>(geometry_[surfaces_[i]]))
132 const searchableExtrudedCircle&
s =
133 refCast<const searchableExtrudedCircle>
135 geometry_[surfaces_[i]]
137 List<pointIndexHit> nearInfo;
138 s.findParametricNearest
148 if (nearInfo[i].hit())
150 points[i] = nearInfo[i].point();
161 constexpr label maxIter = 10;
164 constexpr scalar relTol = 0.1;
165 constexpr scalar absTol = 1
e-4;
167 scalar initialResidual = 0.0;
169 for (label iter = 0; iter < maxIter; iter++)
173 List<pointConstraint> constraints(lambdas.
size());
186 if (lambdas[0] < SMALL)
190 if (lambdas.
last() > 1.0-SMALL)
192 points.last() = lastPoint();
199 debugStr().writeLine(start[i],
points[i]);
207 projLambdas[0] = 0.0;
208 for (label i = 1; i <
points.size(); i++)
212 projLambdas /= projLambdas.last();
214 linearInterpolationWeights interpolator(projLambdas);
221 for (label i = 1; i <
points.size() - 1; i++)
223 interpolator.valueWeights(lambdas[i], indices, weights);
228 predicted += weights[indexi]*
points[indices[indexi]];
230 residual[i] = predicted-
points[i];
233 scalar scalarResidual =
sum(
mag(residual));
237 Pout<<
"Iter:" << iter <<
" initialResidual:" << initialResidual
238 <<
" residual:" << scalarResidual <<
endl;
241 if (scalarResidual < absTol*0.5*lambdas.
size())
247 initialResidual = scalarResidual;
249 else if (scalarResidual/initialResidual < relTol)
260 debugStr().writeLine(
points[i], predicted);
void size(const label n)
Older name for setAddressableSize.
virtual scalar length() const
The length of the curve.
List< word > names(const UPtrList< T > &list, const UnaryMatchPredicate &matcher)
List of names generated by calling name() for each list item and filtered for matches.
errorManipArg< error, int > exit(error &err, const int errNo=1)
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
void resize(const label len)
Adjust allocated size of list.
A list of keyword definitions, which are a keyword followed by a number of values (eg...
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.
label max(const labelHashSet &set, label maxValue=labelMin)
Find the max value in labelHashSet, optionally limited by second argument.
Unit conversion functions.
An Istream is an abstract base class for all input systems (streams, files, token lists etc)...
Ostream & endl(Ostream &os)
Add newline and flush stream.
label findSurfaceID(const word &name) const
Find index of surface. Return -1 if not found.
point linearPosition(const scalar lambda) const
The point position in the straight line.
Macros for easy insertion into run-time selection tables.
dimensioned< Type > sum(const DimensionedField< Type, GeoMesh > &df)
#define forAll(list, i)
Loop across all elements in list.
void reset(T *p=nullptr) noexcept
Delete managed object and set to new given pointer.
fileName::Type type(const fileName &name, const bool followLink=true)
Return the file type: DIRECTORY or FILE, normally following symbolic links.
vectorField pointField
pointField is a vectorField.
const dimensionedScalar e
Elementary charge.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
Container for searchableSurfaces. The collection is specified as a dictionary. For example...
static tmp< T > New(Args &&... args)
Construct tmp with forwarding arguments.
virtual point position(const scalar) const
The point position corresponding to the curve parameter.
A Vector of values with scalar precision, where scalar is float/double depending on the compilation f...
An OFstream that keeps track of vertices and provides convenience output methods for OBJ files...
int debug
Static debugging option.
T & last()
Access last element of the list, position [size()-1].
defineTypeNameAndDebug(arcEdge, 0)
addToRunTimeSelectionTable(blockEdge, arcEdge, Istream)
Define a curved edge that is parameterized for 0<lambda<1 between the start/end points.
vector point
Point is a vector.
#define FatalIOErrorInFunction(ios)
Report an error message using Foam::FatalIOError.
messageStream Info
Information stream (stdout output on master, null elsewhere)
Field< vector > vectorField
Specialisation of Field<T> for vector.
Pointer management similar to std::unique_ptr, with some additional methods and type checking...
List< label > labelList
A List of labels.
A class for managing temporary objects.
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.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))
#define NotImplemented
Issue a FatalErrorIn for a function not currently implemented.
prefixOSstream Pout
OSstream wrapped stdout (std::cout) with parallel prefix.
dimensioned< typename typeOfMag< Type >::type > magSqr(const dimensioned< Type > &dt)
IOerror FatalIOError
Error stream (stdout output on all processes), with additional 'FOAM FATAL IO ERROR' header text and ...
static constexpr const zero Zero
Global zero (0)