12#ifndef O2_ITS3_ALIGNMENT_DOF_H
13#define O2_ITS3_ALIGNMENT_DOF_H
44 enum class Type : uint8_t {
51 int nDOFs()
const {
return static_cast<int>(
mFree.size()); }
52 virtual std::string
dofName(
int idx)
const = 0;
91 for (
int i = 0;
i <
NDOF; ++
i) {
101 for (
int i = 0;
i <
NDOF; ++
i) {
115 int order()
const {
return mOrder; }
119 while ((
i + 1) * (
i + 2) / 2 <= idx) {
122 int j = idx - (
i * (
i + 1) / 2);
123 return std::format(
"L({},{})",
i,
j);
158 throw std::invalid_argument(
"InextensionalDOFSet requires maxOrder >= 1");
184 static int fIdx(
int k) {
return 2 * k; }
185 static int gIdx(
int k) {
return (2 * k) + 1; }
191 return std::format(
"{}_{}", (idx % 2 == 0) ?
"f" :
"g", idx / 2);
194 return std::format(
"h_{}_{}", e / mExtOrderZ, (e % mExtOrderZ) + 1);
virtual Type type() const =0
bool isFree(int idx) const
virtual void fillDerivatives(const DerivativeContext &ctx, Eigen::Ref< Eigen::MatrixXd > out) const =0
void setFree(int idx, bool f)
virtual ~DOFSet()=default
std::vector< bool > mFree
virtual std::string dofName(int idx) const =0
static void checkDOFCount(int nDOFs)
throws if a DOF set is too large to be labelled without aliasing
static int nDOFsFor(int maxOrder, int extOrderPhi, int extOrderZ)
bool hasExtensional() const
int hIdx(int k, int l) const
Type type() const override
void fillDerivatives(const DerivativeContext &ctx, Eigen::Ref< Eigen::MatrixXd > out) const override
InextensionalDOFSet(int maxOrder, int extOrderPhi=-1, int extOrderZ=0)
int nInextensional() const
std::string dofName(int idx) const override
Type type() const override
LegendreDOFSet(int order)
void fillDerivatives(const DerivativeContext &ctx, Eigen::Ref< Eigen::MatrixXd > out) const override
std::string dofName(int idx) const override
std::string dofName(int idx) const override
RigidBodyDOFSet(uint8_t mask)
void fillDerivatives(const DerivativeContext &ctx, Eigen::Ref< Eigen::MatrixXd > out) const override
static constexpr const char * RigidBodyDOFNames[RigidBodyDOF::NDOF]
Type type() const override