Skip to content

Commit b53d7c4

Browse files
committed
Getting the Parametric Points
1 parent b8df169 commit b53d7c4

10 files changed

Lines changed: 47 additions & 0 deletions

src/api/SplinesAPI.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,11 @@ PYBIND11_MODULE( splines, m )
161161
[]( const api::NavierStokesDiscretization& nsd ) { return nsd.getH1().evaluateManifold( nsd.controlPoints() ); },
162162
"Evaluates the spatial position of the spline geometry at the parametric position from the latest calls to "
163163
"localizeElement and localizePoint." )
164+
.def(
165+
"parametricPoint",
166+
[]( const api::NavierStokesDiscretization& nsd ) { return nsd.getH1().evaluateParametricPoint(); },
167+
"Evaluates the parametric coordinates (knot-space) of the current quadrature point from the latest calls to "
168+
"localizeElement and localizePoint." )
164169
.def(
165170
"jacobian",
166171
[]( const api::NavierStokesDiscretization& nsd ) { return nsd.getH1().evaluateJacobian( nsd.controlPoints() ); },

src/eval/SplineSpaceEvaluator.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,21 @@ namespace eval
1818
mExOp = mSpline.extractionOperator( c );
1919
mCurrentCell.emplace( c );
2020
mParametricLengths = mSpline.basisComplex().parametricAtlas().parametricLengths( c );
21+
mParametricStart = mSpline.basisComplex().parametricAtlas().parametricStarts( c );
2122
}
2223

2324
void SplineSpaceEvaluator::localizePoint( const param::ParentPoint& ppt )
2425
{
2526
if( not mCurrentCell.has_value() ) throw std::runtime_error( "Must localize cell before locaizing point" );
2627
mLocalEvals.emplace( ParentBasisEval( mSpline.basisComplex().parentBasis( mCurrentCell.value() ), ppt, mNumDerivs ) );
28+
mLocalizedParentCoords.emplace( ppt.mPoint.cast<double>() );
29+
}
30+
31+
Eigen::VectorXd SplineSpaceEvaluator::evaluateParametricPoint() const
32+
{
33+
if( not mLocalizedParentCoords.has_value() ) throw std::runtime_error( "Must localize point before evaluating parametric point" );
34+
const size_t param_dim = mSpline.basisComplex().parametricAtlas().cmap().dim();
35+
return mParametricStart.head( param_dim ) + mLocalizedParentCoords->cwiseProduct( mParametricLengths.head( param_dim ) );
2736
}
2837

2938
Eigen::VectorXd SplineSpaceEvaluator::evaluateManifold( const Eigen::MatrixXd& cpts ) const

src/eval/SplineSpaceEvaluator.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ namespace eval
3131

3232
virtual Eigen::MatrixXd evaluateFirstDerivativesFromParamToSpatial() const;
3333

34+
virtual Eigen::VectorXd evaluateParametricPoint() const;
35+
3436
size_t numDerivatives() const { return mNumDerivs; }
3537

3638
const basis::SplineSpace& splineSpace() const { return mSpline; }
@@ -40,9 +42,11 @@ namespace eval
4042
const basis::SplineSpace& mSpline;
4143
std::optional<topology::Cell> mCurrentCell;
4244
Vector6dMax mParametricLengths;
45+
Vector6dMax mParametricStart;
4346
std::vector<basis::FunctionId> mConnect;
4447
Eigen::MatrixXd mExOp;
4548
std::optional<ParentBasisEval> mLocalEvals;
49+
std::optional<Eigen::VectorXd> mLocalizedParentCoords;
4650
};
4751

4852
Eigen::MatrixXd piolaTransformedH1FirstDerivatives( const SplineSpaceEvaluator& h1_evals, const SplineSpaceEvaluator& geom_evals, const Eigen::MatrixXd& cpts );

src/param/HierarchicalTPParametricAtlas.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,12 @@ Vector6dMax HierarchicalTPParametricAtlas::parametricLengths( const topology::Ce
158158
throw std::invalid_argument( "HierarchicalTPParametricAtlas::parametricLengths only works for elements." );
159159
const auto [ level, level_d ] = mMap->unrefinedAncestorDartOfCell( c );
160160
return mRefinementLevels.at( level )->parametricLengths( topology::Cell( level_d, c.dim() ) );
161+
}
162+
163+
Vector6dMax HierarchicalTPParametricAtlas::parametricStarts( const topology::Cell& c ) const
164+
{
165+
if( c.dim() != mMap->dim() )
166+
throw std::invalid_argument( "HierarchicalTPParametricAtlas::parametricStarts only works for elements." );
167+
const auto [ level, level_d ] = mMap->unrefinedAncestorDartOfCell( c );
168+
return mRefinementLevels.at( level )->parametricStarts( topology::Cell( level_d, c.dim() ) );
161169
}

src/param/HierarchicalTPParametricAtlas.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ namespace param
2020
virtual const ParentDomain parentDomain( const topology::Cell& c ) const override;
2121
virtual ParentPoint parentPoint( const topology::Vertex& v ) const override;
2222
virtual Vector6dMax parametricLengths( const topology::Cell& c ) const override;
23+
virtual Vector6dMax parametricStarts( const topology::Cell& c ) const override;
2324

2425
const std::vector<std::shared_ptr<const TPParametricAtlas>>& refinementLevels() const { return mRefinementLevels; }
2526

src/param/ParametricAtlas.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ namespace param
1111
virtual const ParentDomain parentDomain( const topology::Cell& c ) const = 0;
1212
virtual ParentPoint parentPoint( const topology::Vertex& v ) const = 0;
1313
virtual Vector6dMax parametricLengths( const topology::Cell& c ) const = 0;
14+
virtual Vector6dMax parametricStarts( [[maybe_unused]] const topology::Cell& c ) const
15+
{
16+
throw std::runtime_error( "parametricStarts not implemented for this atlas type" );
17+
}
1418
};
1519

1620
BaryCoordIsZeroVec parentDomainBoundary( const ParametricAtlas& atlas, const topology::Cell& cell );

src/param/ParametricAtlas1d.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ namespace param
2929
return Eigen::Matrix<double, 1, 1>( mLengths( c.dart().id() ) );
3030
}
3131

32+
Vector6dMax ParametricAtlas1d::parametricStarts( const topology::Cell& c ) const
33+
{
34+
if( c.dim() != 1 ) throw std::runtime_error( "invalid cell dimension" );
35+
return Eigen::Matrix<double, 1, 1>( mLengths.head( c.dart().id() ).sum() );
36+
}
37+
3238
std::vector<std::pair<topology::Cell, param::ParentPoint>> parentPointsOfParamPoints(
3339
const std::vector<double>& values, const param::ParametricAtlas1d& pa, const double param_tol )
3440
{

src/param/ParametricAtlas1d.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace param
1818
virtual const ParentDomain parentDomain( const topology::Cell& c ) const override;
1919
virtual ParentPoint parentPoint( const topology::Vertex& v ) const override;
2020
virtual Vector6dMax parametricLengths( const topology::Cell& c ) const override;
21+
virtual Vector6dMax parametricStarts( const topology::Cell& c ) const override;
2122

2223
double totalLength() const { return mLengths.sum(); }
2324

src/param/TPParametricAtlas.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,14 @@ namespace param
7373
return ( Vector6dMax( source_lengths.size() + line_lengths.size() ) << source_lengths, line_lengths ).finished();
7474
}
7575

76+
Vector6dMax TPParametricAtlas::parametricStarts( const topology::Cell& c ) const
77+
{
78+
const auto [source_dart, line_dart, tp_pos] = mMap->unflatten( c.dart() );
79+
const Vector6dMax source_starts = mSourceParam->parametricStarts( topology::Cell( source_dart, mSourceParam->cmap().dim() ) );
80+
const Vector6dMax line_starts = mLineParam->parametricStarts( topology::Cell( line_dart, mLineParam->cmap().dim() ) );
81+
return ( Vector6dMax( source_starts.size() + line_starts.size() ) << source_starts, line_starts ).finished();
82+
}
83+
7684
SmallVector<topology::Cell, 12> cornerCells( const TPParametricAtlas& atlas, const uint cell_dim )
7785
{
7886
using namespace topology;

src/param/TPParametricAtlas.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace param
1919
virtual const ParentDomain parentDomain( const topology::Cell& c ) const override;
2020
virtual ParentPoint parentPoint( const topology::Vertex& v ) const override;
2121
virtual Vector6dMax parametricLengths( const topology::Cell& c ) const override;
22+
virtual Vector6dMax parametricStarts( const topology::Cell& c ) const override;
2223

2324
const ParametricAtlas& source() const { return *mSourceParam; }
2425
const ParametricAtlas1d& line() const { return *mLineParam; }

0 commit comments

Comments
 (0)