MFEM
v4.5.2
Finite element discretization library
|
Parallel version of AlgebraicCoarseSpace. More...
#include <algebraic.hpp>
Public Member Functions | |
ParAlgebraicCoarseSpace (FiniteElementSpace &fine_fes, CeedElemRestriction fine_er, int order, int dim, int order_reduction_, GroupCommunicator *gc_fine) | |
virtual const mfem::Operator * | GetProlongationMatrix () const override |
The returned Operator is owned by the FiniteElementSpace. More... | |
virtual const SparseMatrix * | GetRestrictionMatrix () const override |
The returned SparseMatrix is owned by the FiniteElementSpace. More... | |
GroupCommunicator * | GetGroupCommunicator () const |
HypreParMatrix * | GetProlongationHypreParMatrix () |
~ParAlgebraicCoarseSpace () | |
Public Member Functions inherited from mfem::ceed::AlgebraicCoarseSpace | |
AlgebraicCoarseSpace (FiniteElementSpace &fine_fes, CeedElemRestriction fine_er, int order, int dim, int order_reduction_) | |
int | GetOrderReduction () const |
CeedElemRestriction | GetCeedElemRestriction () const |
CeedBasis | GetCeedCoarseToFine () const |
~AlgebraicCoarseSpace () | |
Public Member Functions inherited from mfem::FiniteElementSpace | |
FiniteElementSpace () | |
Default constructor: the object is invalid until initialized using the method Load(). More... | |
FiniteElementSpace (const FiniteElementSpace &orig, Mesh *mesh=NULL, const FiniteElementCollection *fec=NULL) | |
Copy constructor: deep copy all data from orig except the Mesh, the FiniteElementCollection, and some derived data. More... | |
FiniteElementSpace (Mesh *mesh, const FiniteElementCollection *fec, int vdim=1, int ordering=Ordering::byNODES) | |
FiniteElementSpace (Mesh *mesh, NURBSExtension *ext, const FiniteElementCollection *fec, int vdim=1, int ordering=Ordering::byNODES) | |
Construct a NURBS FE space based on the given NURBSExtension, ext. More... | |
FiniteElementSpace & | operator= (const FiniteElementSpace &)=delete |
Copy assignment not supported. More... | |
Mesh * | GetMesh () const |
Returns the mesh. More... | |
const NURBSExtension * | GetNURBSext () const |
NURBSExtension * | GetNURBSext () |
NURBSExtension * | StealNURBSext () |
bool | Conforming () const |
bool | Nonconforming () const |
void | SetElementOrder (int i, int p) |
Sets the order of the i'th finite element. More... | |
int | GetElementOrder (int i) const |
Returns the order of the i'th finite element. More... | |
int | GetMaxElementOrder () const |
Return the maximum polynomial order. More... | |
bool | IsVariableOrder () const |
Returns true if the space contains elements of varying polynomial orders. More... | |
const SparseMatrix * | GetConformingProlongation () const |
The returned SparseMatrix is owned by the FiniteElementSpace. More... | |
const SparseMatrix * | GetConformingRestriction () const |
The returned SparseMatrix is owned by the FiniteElementSpace. More... | |
const SparseMatrix * | GetHpConformingRestriction () const |
The returned SparseMatrix is owned by the FiniteElementSpace. More... | |
virtual const Operator * | GetRestrictionTransposeOperator () const |
Return an operator that performs the transpose of GetRestrictionOperator. More... | |
virtual const Operator * | GetRestrictionOperator () const |
An abstract operator that performs the same action as GetRestrictionMatrix. More... | |
virtual const SparseMatrix * | GetHpRestrictionMatrix () const |
The returned SparseMatrix is owned by the FiniteElementSpace. More... | |
const ElementRestrictionOperator * | GetElementRestriction (ElementDofOrdering e_ordering) const |
Return an Operator that converts L-vectors to E-vectors. More... | |
virtual const FaceRestriction * | GetFaceRestriction (ElementDofOrdering e_ordering, FaceType, L2FaceValues mul=L2FaceValues::DoubleValued) const |
Return an Operator that converts L-vectors to E-vectors on each face. More... | |
const QuadratureInterpolator * | GetQuadratureInterpolator (const IntegrationRule &ir) const |
Return a QuadratureInterpolator that interpolates E-vectors to quadrature point values and/or derivatives (Q-vectors). More... | |
const QuadratureInterpolator * | GetQuadratureInterpolator (const QuadratureSpace &qs) const |
Return a QuadratureInterpolator that interpolates E-vectors to quadrature point values and/or derivatives (Q-vectors). More... | |
const FaceQuadratureInterpolator * | GetFaceQuadratureInterpolator (const IntegrationRule &ir, FaceType type) const |
Return a FaceQuadratureInterpolator that interpolates E-vectors to quadrature point values and/or derivatives (Q-vectors). More... | |
int | GetOrder (int i) const |
Returns the polynomial degree of the i'th finite element. More... | |
int | GetEdgeOrder (int edge, int variant=0) const |
int | GetFaceOrder (int face, int variant=0) const |
Returns the polynomial degree of the i'th face finite element. More... | |
int | GetVDim () const |
Returns vector dimension. More... | |
int | GetNDofs () const |
Returns number of degrees of freedom. More... | |
int | GetVSize () const |
Return the number of vector dofs, i.e. GetNDofs() x GetVDim(). More... | |
virtual int | GetTrueVSize () const |
Return the number of vector true (conforming) dofs. More... | |
int | GetNConformingDofs () const |
int | GetConformingVSize () const |
Ordering::Type | GetOrdering () const |
Return the ordering method. More... | |
const FiniteElementCollection * | FEColl () const |
int | GetNVDofs () const |
Number of all scalar vertex dofs. More... | |
int | GetNEDofs () const |
Number of all scalar edge-interior dofs. More... | |
int | GetNFDofs () const |
Number of all scalar face-interior dofs. More... | |
int | GetNV () const |
Returns number of vertices in the mesh. More... | |
int | GetNE () const |
Returns number of elements in the mesh. More... | |
int | GetNF () const |
Returns number of faces (i.e. co-dimension 1 entities) in the mesh. More... | |
int | GetNBE () const |
Returns number of boundary elements in the mesh. More... | |
int | GetNFbyType (FaceType type) const |
Returns the number of faces according to the requested type. More... | |
int | GetElementType (int i) const |
Returns the type of element i. More... | |
void | GetElementVertices (int i, Array< int > &vertices) const |
Returns the vertices of element i. More... | |
int | GetBdrElementType (int i) const |
Returns the type of boundary element i. More... | |
ElementTransformation * | GetElementTransformation (int i) const |
Returns ElementTransformation for the i-th element. More... | |
void | GetElementTransformation (int i, IsoparametricTransformation *ElTr) |
Returns the transformation defining the i-th element in the user-defined variable ElTr. More... | |
ElementTransformation * | GetBdrElementTransformation (int i) const |
Returns ElementTransformation for the i-th boundary element. More... | |
int | GetAttribute (int i) const |
int | GetBdrAttribute (int i) const |
virtual DofTransformation * | GetElementDofs (int elem, Array< int > &dofs) const |
Returns indices of degrees of freedom of element 'elem'. More... | |
virtual DofTransformation * | GetBdrElementDofs (int bel, Array< int > &dofs) const |
Returns indices of degrees of freedom for boundary element 'bel'. More... | |
virtual int | GetFaceDofs (int face, Array< int > &dofs, int variant=0) const |
Returns the indices of the degrees of freedom for the specified face, including the DOFs for the edges and the vertices of the face. More... | |
int | GetEdgeDofs (int edge, Array< int > &dofs, int variant=0) const |
Returns the indices of the degrees of freedom for the specified edge, including the DOFs for the vertices of the edge. More... | |
void | GetVertexDofs (int i, Array< int > &dofs) const |
void | GetElementInteriorDofs (int i, Array< int > &dofs) const |
void | GetFaceInteriorDofs (int i, Array< int > &dofs) const |
int | GetNumElementInteriorDofs (int i) const |
void | GetEdgeInteriorDofs (int i, Array< int > &dofs) const |
void | GetVDofs (int vd, Array< int > &dofs, int ndofs=-1) const |
Returns the indices of all of the VDofs for the specified dimension 'vd'. More... | |
void | DofsToVDofs (Array< int > &dofs, int ndofs=-1) const |
void | DofsToVDofs (int vd, Array< int > &dofs, int ndofs=-1) const |
int | DofToVDof (int dof, int vd, int ndofs=-1) const |
int | VDofToDof (int vdof) const |
DofTransformation * | GetElementVDofs (int i, Array< int > &vdofs) const |
Returns indexes of degrees of freedom in array dofs for i'th element. More... | |
DofTransformation * | GetBdrElementVDofs (int i, Array< int > &vdofs) const |
Returns indexes of degrees of freedom for i'th boundary element. More... | |
void | GetFaceVDofs (int i, Array< int > &vdofs) const |
Returns indexes of degrees of freedom for i'th face element (2D and 3D). More... | |
void | GetEdgeVDofs (int i, Array< int > &vdofs) const |
Returns indexes of degrees of freedom for i'th edge. More... | |
void | GetVertexVDofs (int i, Array< int > &vdofs) const |
void | GetElementInteriorVDofs (int i, Array< int > &vdofs) const |
void | GetEdgeInteriorVDofs (int i, Array< int > &vdofs) const |
MFEM_DEPRECATED void | RebuildElementToDofTable () |
( More... | |
void | ReorderElementToDofTable () |
Reorder the scalar DOFs based on the element ordering. More... | |
const Table * | GetElementToFaceOrientationTable () const |
const Table & | GetElementToDofTable () const |
Return a reference to the internal Table that stores the lists of scalar dofs, for each mesh element, as returned by GetElementDofs(). More... | |
const Table & | GetBdrElementToDofTable () const |
Return a reference to the internal Table that stores the lists of scalar dofs, for each boundary mesh element, as returned by GetBdrElementDofs(). More... | |
const Table & | GetFaceToDofTable () const |
Return a reference to the internal Table that stores the lists of scalar dofs, for each face in the mesh, as returned by GetFaceDofs(). In this context, "face" refers to a (dim-1)-dimensional mesh entity. More... | |
void | BuildDofToArrays () |
Initialize internal data that enables the use of the methods GetElementForDof() and GetLocalDofForDof(). More... | |
int | GetElementForDof (int i) const |
Return the index of the first element that contains dof i. More... | |
int | GetLocalDofForDof (int i) const |
Return the local dof index in the first element that contains dof i. More... | |
virtual const FiniteElement * | GetFE (int i) const |
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th element in the mesh object. More... | |
const FiniteElement * | GetBE (int i) const |
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th boundary face in the mesh object. More... | |
const FiniteElement * | GetFaceElement (int i) const |
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th face in the mesh object. Faces in this case refer to the MESHDIM-1 primitive so in 2D they are segments and in 1D they are points. More... | |
const FiniteElement * | GetEdgeElement (int i, int variant=0) const |
Returns pointer to the FiniteElement in the FiniteElementCollection associated with i'th edge in the mesh object. More... | |
const FiniteElement * | GetTraceElement (int i, Geometry::Type geom_type) const |
Return the trace element from element 'i' to the given 'geom_type'. More... | |
virtual void | GetEssentialVDofs (const Array< int > &bdr_attr_is_ess, Array< int > &ess_vdofs, int component=-1) const |
Mark degrees of freedom associated with boundary elements with the specified boundary attributes (marked in 'bdr_attr_is_ess'). For spaces with 'vdim' > 1, the 'component' parameter can be used to restricts the marked vDOFs to the specified component. More... | |
virtual void | GetEssentialTrueDofs (const Array< int > &bdr_attr_is_ess, Array< int > &ess_tdof_list, int component=-1) |
Get a list of essential true dofs, ess_tdof_list, corresponding to the boundary attributes marked in the array bdr_attr_is_ess. For spaces with 'vdim' > 1, the 'component' parameter can be used to restricts the marked tDOFs to the specified component. More... | |
void | GetBoundaryTrueDofs (Array< int > &boundary_dofs, int component=-1) |
Get a list of all boundary true dofs, boundary_dofs. For spaces with 'vdim' > 1, the 'component' parameter can be used to restricts the marked tDOFs to the specified component. Equivalent to FiniteElementSpace::GetEssentialTrueDofs with all boundary attributes marked as essential. More... | |
void | ConvertToConformingVDofs (const Array< int > &dofs, Array< int > &cdofs) |
For a partially conforming FE space, convert a marker array (nonzero entries are true) on the partially conforming dofs to a marker array on the conforming dofs. A conforming dofs is marked iff at least one of its dependent dofs is marked. More... | |
void | ConvertFromConformingVDofs (const Array< int > &cdofs, Array< int > &dofs) |
For a partially conforming FE space, convert a marker array (nonzero entries are true) on the conforming dofs to a marker array on the (partially conforming) dofs. A dof is marked iff it depends on a marked conforming dofs, where dependency is defined by the ConformingRestriction matrix; in other words, a dof is marked iff it corresponds to a marked conforming dof. More... | |
SparseMatrix * | D2C_GlobalRestrictionMatrix (FiniteElementSpace *cfes) |
Generate the global restriction matrix from a discontinuous FE space to the continuous FE space of the same polynomial degree. More... | |
SparseMatrix * | D2Const_GlobalRestrictionMatrix (FiniteElementSpace *cfes) |
Generate the global restriction matrix from a discontinuous FE space to the piecewise constant FE space. More... | |
SparseMatrix * | H2L_GlobalRestrictionMatrix (FiniteElementSpace *lfes) |
Construct the restriction matrix from the FE space given by (*this) to the lower degree FE space given by (*lfes) which is defined on the same mesh. More... | |
void | GetTransferOperator (const FiniteElementSpace &coarse_fes, OperatorHandle &T) const |
Construct and return an Operator that can be used to transfer GridFunction data from coarse_fes, defined on a coarse mesh, to this FE space, defined on a refined mesh. More... | |
virtual void | GetTrueTransferOperator (const FiniteElementSpace &coarse_fes, OperatorHandle &T) const |
Construct and return an Operator that can be used to transfer true-dof data from coarse_fes, defined on a coarse mesh, to this FE space, defined on a refined mesh. More... | |
virtual void | Update (bool want_transform=true) |
Reflect changes in the mesh: update number of DOFs, etc. Also, calculate GridFunction transformation operator (unless want_transform is false). Safe to call multiple times, does nothing if space already up to date. More... | |
const Operator * | GetUpdateOperator () |
Get the GridFunction update operator. More... | |
void | GetUpdateOperator (OperatorHandle &T) |
Return the update operator in the given OperatorHandle, T. More... | |
void | SetUpdateOperatorOwner (bool own) |
Set the ownership of the update operator: if set to false, the Operator returned by GetUpdateOperator() must be deleted outside the FiniteElementSpace. More... | |
void | SetUpdateOperatorType (Operator::Type tid) |
Specify the Operator::Type to be used by the update operators. More... | |
virtual void | UpdatesFinished () |
Free the GridFunction update operator (if any), to save memory. More... | |
long | GetSequence () const |
bool | IsDGSpace () const |
Return whether or not the space is discontinuous (L2) More... | |
void | SetRelaxedHpConformity (bool relaxed=true) |
void | Save (std::ostream &out) const |
Save finite element space to output stream out. More... | |
FiniteElementCollection * | Load (Mesh *m, std::istream &input) |
Read a FiniteElementSpace from a stream. The returned FiniteElementCollection is owned by the caller. More... | |
virtual | ~FiniteElementSpace () |
Additional Inherited Members | |
Static Public Member Functions inherited from mfem::FiniteElementSpace | |
static void | AdjustVDofs (Array< int > &vdofs) |
static void | MarkerToList (const Array< int > &marker, Array< int > &list) |
Convert a Boolean marker array to a list containing all marked indices. More... | |
static void | ListToMarker (const Array< int > &list, int marker_size, Array< int > &marker, int mark_val=-1) |
Convert an array of indices (list) to a Boolean marker array where all indices in the list are marked with the given value and the rest are set to zero. More... | |
Protected Types inherited from mfem::FiniteElementSpace | |
using | key_face = std::tuple< bool, ElementDofOrdering, FaceType, L2FaceValues > |
The face restriction operators, see GetFaceRestriction(). More... | |
using | map_L2F = std::unordered_map< const key_face, FaceRestriction *, key_hash > |
typedef std::uint64_t | VarOrderBits |
Bit-mask representing a set of orders needed by an edge/face. More... | |
Protected Member Functions inherited from mfem::FiniteElementSpace | |
void | UpdateNURBS () |
void | Construct () |
void | Destroy () |
void | ConstructDoFTrans () |
void | DestroyDoFTrans () |
void | BuildElementToDofTable () const |
void | BuildBdrElementToDofTable () const |
void | BuildFaceToDofTable () const |
void | BuildNURBSFaceToDofTable () const |
Generates partial face_dof table for a NURBS space. More... | |
int | GetElementOrderImpl (int i) const |
Return element order: internal version of GetElementOrder without checks. More... | |
void | CalcEdgeFaceVarOrders (Array< VarOrderBits > &edge_orders, Array< VarOrderBits > &face_orders) const |
int | MakeDofTable (int ent_dim, const Array< int > &entity_orders, Table &entity_dofs, Array< char > *var_ent_order) |
int | FindDofs (const Table &var_dof_table, int row, int ndof) const |
Search row of a DOF table for a DOF set of size 'ndof', return first DOF. More... | |
int | FindEdgeDof (int edge, int ndof) const |
int | FindFaceDof (int face, int ndof) const |
Similar to FindEdgeDof, but used for mixed meshes too. More... | |
int | FirstFaceDof (int face, int variant=0) const |
int | GetNVariants (int entity, int index) const |
Return number of possible DOF variants for edge/face (var. order spaces). More... | |
int | GetEntityDofs (int entity, int index, Array< int > &dofs, Geometry::Type master_geom=Geometry::INVALID, int variant=0) const |
Helper to get vertex, edge or face DOFs (entity=0,1,2 resp.). More... | |
int | GetDegenerateFaceDofs (int index, Array< int > &dofs, Geometry::Type master_geom, int variant) const |
int | GetNumBorderDofs (Geometry::Type geom, int order) const |
void | BuildConformingInterpolation () const |
Calculate the cP and cR matrices for a nonconforming mesh. More... | |
void | AddEdgeFaceDependencies (SparseMatrix &deps, Array< int > &master_dofs, const FiniteElement *master_fe, Array< int > &slave_dofs, int slave_face, const DenseMatrix *pm) const |
void | MakeVDimMatrix (SparseMatrix &mat) const |
Replicate 'mat' in the vector dimension, according to vdim ordering mode. More... | |
SparseMatrix * | RefinementMatrix_main (const int coarse_ndofs, const Table &coarse_elem_dof, const Table *coarse_elem_fos, const DenseTensor localP[]) const |
void | GetLocalRefinementMatrices (Geometry::Type geom, DenseTensor &localP) const |
void | GetLocalDerefinementMatrices (Geometry::Type geom, DenseTensor &localR) const |
SparseMatrix * | RefinementMatrix (int old_ndofs, const Table *old_elem_dof, const Table *old_elem_fos) |
SparseMatrix * | DerefinementMatrix (int old_ndofs, const Table *old_elem_dof, const Table *old_elem_fos) |
Calculate GridFunction restriction matrix after mesh derefinement. More... | |
void | GetLocalRefinementMatrices (const FiniteElementSpace &coarse_fes, Geometry::Type geom, DenseTensor &localP) const |
Return in localP the local refinement matrices that map between fespaces after mesh refinement. More... | |
void | Constructor (Mesh *mesh, NURBSExtension *ext, const FiniteElementCollection *fec, int vdim=1, int ordering=Ordering::byNODES) |
Help function for constructors + Load(). More... | |
virtual void | UpdateMeshPointer (Mesh *new_mesh) |
void | UpdateElementOrders () |
Resize the elem_order array on mesh change. More... | |
virtual void | CopyProlongationAndRestriction (const FiniteElementSpace &fes, const Array< int > *perm) |
Copies the prolongation and restriction matrices from fes. More... | |
Static Protected Member Functions inherited from mfem::FiniteElementSpace | |
static int | MinOrder (VarOrderBits bits) |
Return the minimum order (least significant bit set) in the bit mask. More... | |
static int | EncodeDof (int entity_base, int idx) |
Helper to encode a sign flip into a DOF index (for Hcurl/Hdiv shapes). More... | |
static int | DecodeDof (int dof) |
Helpers to remove encoded sign from a DOF. More... | |
static int | DecodeDof (int dof, double &sign) |
static void | AddDependencies (SparseMatrix &deps, Array< int > &master_dofs, Array< int > &slave_dofs, DenseMatrix &I, int skipfirst=0) |
static bool | DofFinalizable (int dof, const Array< bool > &finalized, const SparseMatrix &deps) |
Protected Attributes inherited from mfem::ceed::AlgebraicCoarseSpace | |
int * | dof_map |
int | order_reduction |
CeedElemRestriction | ceed_elem_restriction |
CeedBasis | coarse_to_fine |
Protected Attributes inherited from mfem::FiniteElementSpace | |
Mesh * | mesh |
The mesh that FE space lives on (not owned). More... | |
const FiniteElementCollection * | fec |
Associated FE collection (not owned). More... | |
int | vdim |
Vector dimension (number of unknowns per degree of freedom). More... | |
Ordering::Type | ordering |
int | ndofs |
Number of degrees of freedom. Number of unknowns is ndofs * vdim. More... | |
Array< char > | elem_order |
int | nvdofs |
int | nedofs |
int | nfdofs |
int | nbdofs |
int | uni_fdof |
of single face DOFs if all faces uniform; -1 otherwiseMore... | |
int * | bdofs |
internal DOFs of elements if mixed/var-order; NULL otherwise More... | |
Table | var_edge_dofs |
Table | var_face_dofs |
NOTE: also used for spaces with mixed faces. More... | |
Array< char > | var_edge_orders |
Array< char > | var_face_orders |
Table * | elem_dof |
Table * | elem_fos |
Table * | bdr_elem_dof |
Table * | bdr_elem_fos |
Table * | face_dof |
Array< int > | dof_elem_array |
Array< int > | dof_ldof_array |
NURBSExtension * | NURBSext |
int | own_ext |
Array< int > | face_to_be |
Array< DofTransformation * > | DoFTrans |
VDofTransformation | VDoFTrans |
SparseMatrix * | cP |
SparseMatrix * | cR |
Conforming restriction matrix such that cR.cP=I. More... | |
SparseMatrix * | cR_hp |
A version of the conforming restriction matrix for variable-order spaces. More... | |
bool | cP_is_set |
OperatorHandle | Th |
Transformation to apply to GridFunctions after space Update(). More... | |
OperatorHandle | L2E_nat |
The element restriction operators, see GetElementRestriction(). More... | |
OperatorHandle | L2E_lex |
map_L2F | L2F |
Array< QuadratureInterpolator * > | E2Q_array |
Array< FaceQuadratureInterpolator * > | E2IFQ_array |
Array< FaceQuadratureInterpolator * > | E2BFQ_array |
long | sequence |
long | mesh_sequence |
bool | orders_changed |
True if at least one element order changed (variable-order space only). More... | |
bool | relaxed_hp |
Static Protected Attributes inherited from mfem::FiniteElementSpace | |
static constexpr int | MaxVarOrder = 8*sizeof(VarOrderBits) - 1 |
Parallel version of AlgebraicCoarseSpace.
This provides prolongation and restriction matrices for RAP-type parallel operators and potential explicit assembly.
Definition at line 56 of file algebraic.hpp.
mfem::ceed::ParAlgebraicCoarseSpace::ParAlgebraicCoarseSpace | ( | FiniteElementSpace & | fine_fes, |
CeedElemRestriction | fine_er, | ||
int | order, | ||
int | dim, | ||
int | order_reduction_, | ||
GroupCommunicator * | gc_fine | ||
) |
Definition at line 735 of file algebraic.cpp.
mfem::ceed::ParAlgebraicCoarseSpace::~ParAlgebraicCoarseSpace | ( | ) |
Definition at line 937 of file algebraic.cpp.
|
inline |
Definition at line 69 of file algebraic.hpp.
HypreParMatrix * mfem::ceed::ParAlgebraicCoarseSpace::GetProlongationHypreParMatrix | ( | ) |
Definition at line 823 of file algebraic.cpp.
|
inlineoverridevirtual |
The returned Operator is owned by the FiniteElementSpace.
Reimplemented from mfem::ceed::AlgebraicCoarseSpace.
Definition at line 67 of file algebraic.hpp.
|
inlineoverridevirtual |
The returned SparseMatrix is owned by the FiniteElementSpace.
Reimplemented from mfem::ceed::AlgebraicCoarseSpace.
Definition at line 68 of file algebraic.hpp.