|
OPAL (Object Oriented Parallel Accelerator Library) 2022.1
OPAL
|
#include <BoundaryGeometry.h>


Public Types | |
| enum | DebugFlags { debug_isInside = 0x0001 , debug_fastIsInside = 0x0002 , debug_intersectRayBoundary = 0x0004 , debug_intersectLineSegmentBoundary = 0x0008 , debug_intersectTinyLineSegmentBoundary = 0x0010 , debug_PartInside = 0x0020 } |
Public Member Functions | |
| BoundaryGeometry () | |
| virtual | ~BoundaryGeometry () |
| virtual bool | canReplaceBy (Object *object) |
| Test if replacement is allowed. More... | |
| virtual BoundaryGeometry * | clone (const std::string &name) |
| Return a clone. More... | |
| virtual void | execute () |
| Execute the command. More... | |
| virtual void | update () |
| Update this object. More... | |
| void | updateElement (ElementBase *element) |
| void | initialize () |
| int | partInside (const Vector_t &r, const Vector_t &v, const double dt, Vector_t &intecoords, int &triId) |
| Inform & | printInfo (Inform &os) const |
| void | writeGeomToVtk (std::string fn) |
| std::string | getFilename () const |
| Topology | getTopology () const |
| double | getA () |
| double | getB () |
| double | getC () |
| double | getS () |
| double | getLength () |
| double | getL1 () |
| double | getL2 () |
| size_t | getNumBFaces () |
| Vector_t | gethr () |
| Vektor< int, 3 > | getnr () |
| Vector_t | getmincoords () |
| Vector_t | getmaxcoords () |
| bool | getInsidePoint (Vector_t &pt) |
| bool | findInsidePoint (void) |
| int | intersectRayBoundary (const Vector_t &P, const Vector_t &v, Vector_t &I) |
| int | fastIsInside (const Vector_t &reference_pt, const Vector_t &P) |
| void | enableDebug (enum DebugFlags flags) |
| void | disableDebug (enum DebugFlags flags) |
Public Member Functions inherited from Definition | |
| virtual | ~Definition () |
| virtual const std::string | getCategory () const |
| Return the object category as a string. More... | |
| virtual bool | shouldTrace () const |
| Trace flag. More... | |
| virtual bool | shouldUpdate () const |
| Update flag. More... | |
Public Member Functions inherited from Object | |
| virtual | ~Object () |
| virtual bool | canReplaceBy (Object *object) |
| Test if replacement is allowed. More... | |
| virtual Object * | clone (const std::string &name)=0 |
| Return a clone. More... | |
| void | copyAttributes (const Object &) |
| Copy attributes from another object. More... | |
| virtual void | execute () |
| Execute the command. More... | |
| virtual Attribute * | findAttribute (const std::string &name) |
| Find an attribute by name. More... | |
| virtual const Attribute * | findAttribute (const std::string &name) const |
| Find an attribute by name. More... | |
| virtual const std::string | getCategory () const =0 |
| Return the object category as a string. More... | |
| virtual bool | shouldTrace () const =0 |
| Trace flag. More... | |
| virtual bool | shouldUpdate () const =0 |
| Update flag. More... | |
| virtual Object * | makeTemplate (const std::string &, TokenStream &, Statement &) |
| Macro handler function. More... | |
| virtual Object * | makeInstance (const std::string &name, Statement &, const Parser *) |
| Macro handler function. More... | |
| virtual void | parse (Statement &) |
| Parse the object. More... | |
| virtual void | parseShortcut (Statement &, bool eval=true) |
| Parser for single-attribute commands. More... | |
| virtual void | print (std::ostream &) const |
| Print the object. More... | |
| virtual void | printValue (std::ostream &) const |
| virtual void | printHelp (std::ostream &) const |
| Print help. More... | |
| virtual void | replace (Object *oldObject, Object *newObject) |
| Replace references. More... | |
| virtual void | update () |
| Update this object. More... | |
| bool | isBuiltin () const |
| True, if [b]this[/b] is a built-in object. More... | |
| virtual bool | isShared () const |
| Shared flag. More... | |
| virtual void | setShared (bool) |
| Set/reset shared flag. More... | |
| void | setDirty (bool) |
| Set/reset the [b]modified[/b] flag. More... | |
| bool | isDirty () const |
| True, if the [b]modified[/b] flag is set. More... | |
| void | setFlag (bool) |
| Flag/unflag this object, e. g. to control output of objects for. More... | |
| bool | isFlagged () const |
| True, if [b]this[/b] is flagged by setFlag(true). More... | |
| const Object * | getBaseObject () const |
| Return the object's base type object. More... | |
| const std::string & | getOpalName () const |
| Return object name. More... | |
| Object * | getParent () const |
| Return parent pointer. More... | |
| bool | isTreeMember (const Object *subTree) const |
| Test for tree membership. More... | |
| void | setOpalName (const std::string &name) |
| Set object name. More... | |
| void | setParent (Object *) |
| Set parent object. More... | |
| void | clear () |
| Clear the occurrence counter. More... | |
| int | increment () |
| Increment and return the occurrence counter. More... | |
| int | occurrenceCount () |
| Return the occurrence counter. More... | |
| void | registerReference (Invalidator *a) |
| Register a reference to this object. More... | |
| void | unregisterReference (Invalidator *a) |
| Unegister a reference to this object. More... | |
| void | registerOwnership (const AttributeHandler::OwnerType &itsClass) const |
Public Member Functions inherited from RCObject | |
| int | addReference () const |
| Increment reference count. More... | |
| int | removeReference () const |
| Decrement the reference count. More... | |
| bool | isShared () const |
| Test for sharing. More... | |
Static Public Member Functions | |
| static BoundaryGeometry * | find (const std::string &name) |
Private Types | |
| enum | INTERSECTION_TESTS { SEGMENT , RAY , LINE } |
| enum | { FGEOM , LENGTH , S , L1 , L2 , A , B , C , TOPO , ZSHIFT , XYZSCALE , XSCALE , YSCALE , ZSCALE , INSIDEPOINT , SIZE } |
Private Member Functions | |
| bool | isInside (const Vector_t &P) |
| int | intersectTriangleVoxel (const int triangle_id, const int i, const int j, const int k) |
| int | intersectTinyLineSegmentBoundary (const Vector_t &, const Vector_t &, Vector_t &, int &) |
| int | intersectLineSegmentBoundary (const Vector_t &P0, const Vector_t &P1, Vector_t &intersection_pt, int &triangle_id) |
| BoundaryGeometry (const BoundaryGeometry &) | |
| void | operator= (const BoundaryGeometry &) |
| BoundaryGeometry (const std::string &name, BoundaryGeometry *parent) | |
| const Vector_t & | getPoint (const int triangle_id, const int vertex_id) |
| int | intersectLineTriangle (const enum INTERSECTION_TESTS kind, const Vector_t &P0, const Vector_t &P1, const int triangle_id, Vector_t &I) |
| int | mapVoxelIndices2ID (const int i, const int j, const int k) |
| Vector_t | mapIndices2Voxel (const int, const int, const int) |
| Vector_t | mapPoint2Voxel (const Vector_t &) |
| void | computeMeshVoxelization (void) |
Private Attributes | |
| std::string | h5FileName_m |
| std::vector< Vector_t > | Points_m |
| std::vector< std::array< unsigned int, 4 > > | Triangles_m |
| std::vector< Vector_t > | TriNormals_m |
| std::vector< double > | TriAreas_m |
| Vector_t | minExtent_m |
| Vector_t | maxExtent_m |
| struct { | |
| Vector_t minExtent | |
| Vector_t maxExtent | |
| Vector_t sizeOfVoxel | |
| Vektor< int, 3 > nr_m | |
| std::unordered_map< int, std::unordered_set< int > > ids | |
| } | voxelMesh_m |
| int | debugFlags_m |
| bool | haveInsidePoint_m |
| Vector_t | insidePoint_m |
| gsl_rng * | randGen_m |
| IpplTimings::TimerRef | Tinitialize_m |
| IpplTimings::TimerRef | TisInside_m |
| IpplTimings::TimerRef | TfastIsInside_m |
| IpplTimings::TimerRef | TRayTrace_m |
| IpplTimings::TimerRef | TPartInside_m |
Additional Inherited Members | |
Public Attributes inherited from Object | |
| std::vector< Attribute > | itsAttr |
| The object attributes. More... | |
Protected Member Functions inherited from Definition | |
| Definition (int size, const char *name, const char *help) | |
| Constructor for exemplars. More... | |
| Definition (const std::string &name, Definition *parent) | |
| Constructor for clones. More... | |
Protected Member Functions inherited from Object | |
| Object (int size, const char *name, const char *help) | |
| Constructor for exemplars. More... | |
| Object (const std::string &name, Object *parent) | |
| Constructor for clones. More... | |
Protected Member Functions inherited from RCObject | |
| RCObject () | |
| Default constructor. More... | |
| RCObject (const RCObject &) | |
| Copy constructor. More... | |
| virtual | ~RCObject ()=0 |
| RCObject & | operator= (const RCObject &right) |
Protected Attributes inherited from Object | |
| bool | builtin |
| Built-in flag. More... | |
| bool | modified |
| Dirty flag. More... | |
| bool | flagged |
| Object flag. More... | |
Definition at line 58 of file BoundaryGeometry.h.
|
private |
| Enumerator | |
|---|---|
| FGEOM | |
| LENGTH | |
| S | |
| L1 | |
| L2 | |
| A | |
| B | |
| C | |
| TOPO | |
| ZSHIFT | |
| XYZSCALE | |
| XSCALE | |
| YSCALE | |
| ZSCALE | |
| INSIDEPOINT | |
| SIZE | |
Definition at line 298 of file BoundaryGeometry.h.
| Enumerator | |
|---|---|
| debug_isInside | |
| debug_fastIsInside | |
| debug_intersectRayBoundary | |
| debug_intersectLineSegmentBoundary | |
| debug_intersectTinyLineSegmentBoundary | |
| debug_PartInside | |
Definition at line 192 of file BoundaryGeometry.h.
|
private |
| Enumerator | |
|---|---|
| SEGMENT | |
| RAY | |
| LINE | |
Definition at line 280 of file BoundaryGeometry.h.
| BoundaryGeometry::BoundaryGeometry | ( | ) |
Definition at line 947 of file BoundaryGeometry.cpp.
References A, B, Object::builtin, C, clone(), OpalData::define(), FGEOM, OpalData::getInstance(), Attributes::getString(), IpplTimings::getTimer(), h5FileName_m, initialize(), INSIDEPOINT, Object::itsAttr, L1, L2, LENGTH, Attributes::makePredefinedString(), Attributes::makeReal(), Attributes::makeRealArray(), Attributes::makeString(), randGen_m, Object::registerOwnership(), S, AttributeHandler::STATEMENT, TfastIsInside_m, Tinitialize_m, TisInside_m, TOPO, TPartInside_m, TRayTrace_m, update(), XSCALE, XYZSCALE, YSCALE, ZSCALE, and ZSHIFT.
Referenced by clone().

|
virtual |
Definition at line 1069 of file BoundaryGeometry.cpp.
References randGen_m.
|
private |
|
private |
Definition at line 1051 of file BoundaryGeometry.cpp.
References FGEOM, Attributes::getString(), IpplTimings::getTimer(), h5FileName_m, initialize(), Object::itsAttr, randGen_m, TfastIsInside_m, Tinitialize_m, TisInside_m, TPartInside_m, and TRayTrace_m.

|
virtual |
Test if replacement is allowed.
Reimplemented from Object.
Definition at line 1073 of file BoundaryGeometry.cpp.
|
virtual |
Return a clone.
Implements Object.
Definition at line 1078 of file BoundaryGeometry.cpp.
References BoundaryGeometry(), and name.
Referenced by BoundaryGeometry(), and TrackRun::setBoundaryGeometry().

|
inlineprivate |
Definition at line 1585 of file BoundaryGeometry.cpp.
References Util::combineFilePath(), Options::enableVTK, endl(), OpalData::getAuxiliaryOutputDirectory(), OpalData::getInstance(), getPoint(), gmsg, h5FileName_m, INSIDE, intersectTriangleVoxel(), level2(), mapPoint2VoxelIndices, mapVoxelIndices2ID(), max(), min(), IpplInfo::myNode(), Triangles_m, and voxelMesh_m.

|
inline |
Definition at line 205 of file BoundaryGeometry.h.
References debugFlags_m.
|
inline |
Definition at line 201 of file BoundaryGeometry.h.
References debugFlags_m.
|
virtual |
Execute the command.
Reimplemented from Object.
Definition at line 1087 of file BoundaryGeometry.cpp.
References IpplTimings::getTimer(), TfastIsInside_m, Tinitialize_m, TisInside_m, TPartInside_m, TRayTrace_m, and update().

Definition at line 1426 of file BoundaryGeometry.cpp.
References Physics::c, ceil(), debug_fastIsInside, debug_intersectTinyLineSegmentBoundary, debugFlags_m, endl(), gmsg, maxExtent_m, minExtent_m, IpplTimings::startTimer(), and TfastIsInside_m.
Referenced by ArbitraryDomain::compute(), findInsidePoint(), and isInside().

|
static |
Definition at line 1096 of file BoundaryGeometry.cpp.
References OpalData::find(), OpalData::getInstance(), and name.
Referenced by FieldSolver::initSolver(), TrackRun::setBoundaryGeometry(), OpalCavity::update(), OpalCyclotron::update(), and OpalDrift::update().

| bool BoundaryGeometry::findInsidePoint | ( | void | ) |
Definition at line 1362 of file BoundaryGeometry.cpp.
References B, endl(), fastIsInside(), gmsg, insidePoint_m, level2(), maxExtent_m, minExtent_m, and Hypervolume::n.

|
inline |
Definition at line 111 of file BoundaryGeometry.h.
References A, Attributes::getReal(), and Object::itsAttr.
Referenced by EllipticDomain::EllipticDomain(), FieldSolver::initSolver(), and MGPoissonSolver::MGPoissonSolver().

|
inline |
Definition at line 115 of file BoundaryGeometry.h.
References B, Attributes::getReal(), and Object::itsAttr.
Referenced by EllipticDomain::EllipticDomain(), and MGPoissonSolver::MGPoissonSolver().

|
inline |
Definition at line 119 of file BoundaryGeometry.h.
References C, Attributes::getReal(), and Object::itsAttr.
Referenced by MGPoissonSolver::MGPoissonSolver().

|
inline |
Definition at line 97 of file BoundaryGeometry.h.
References FGEOM, Attributes::getString(), and Object::itsAttr.
Referenced by MGPoissonSolver::MGPoissonSolver().

|
inline |
|
inline |
Definition at line 172 of file BoundaryGeometry.h.
References haveInsidePoint_m, and insidePoint_m.
Referenced by ArbitraryDomain::ArbitraryDomain().
|
inline |
Definition at line 131 of file BoundaryGeometry.h.
References Attributes::getReal(), Object::itsAttr, and L1.
Referenced by MGPoissonSolver::MGPoissonSolver().

|
inline |
Definition at line 135 of file BoundaryGeometry.h.
References Attributes::getReal(), Object::itsAttr, and L2.
Referenced by MGPoissonSolver::MGPoissonSolver().

|
inline |
Definition at line 127 of file BoundaryGeometry.h.
References Attributes::getReal(), Object::itsAttr, and LENGTH.
Referenced by EllipticDomain::EllipticDomain().

|
inline |
Return the maxcoords_m.
Definition at line 168 of file BoundaryGeometry.h.
References maxExtent_m.
Referenced by ArbitraryDomain::ArbitraryDomain(), and MGPoissonSolver::MGPoissonSolver().
|
inline |
Return the mincoords_m.
Definition at line 162 of file BoundaryGeometry.h.
References minExtent_m.
Referenced by ArbitraryDomain::ArbitraryDomain(), and MGPoissonSolver::MGPoissonSolver().
|
inline |
|
inline |
Return number of boundary faces.
Definition at line 142 of file BoundaryGeometry.h.
References Triangles_m.
|
inlineprivate |
Definition at line 275 of file BoundaryGeometry.h.
References PAssert, Points_m, and Triangles_m.
Referenced by computeMeshVoxelization(), initialize(), intersectLineTriangle(), intersectTinyLineSegmentBoundary(), and intersectTriangleVoxel().
|
inline |
Definition at line 123 of file BoundaryGeometry.h.
References Attributes::getReal(), Object::itsAttr, and S.
Referenced by EllipticDomain::EllipticDomain().

|
inline |
Definition at line 101 of file BoundaryGeometry.h.
References BOXCORNER, ELLIPTIC, Attributes::getString(), Object::itsAttr, RECTANGULAR, and TOPO.
Referenced by MGPoissonSolver::MGPoissonSolver(), and printInfo().

| void BoundaryGeometry::initialize | ( | ) |
Definition at line 1645 of file BoundaryGeometry.cpp.
References A, B, C, endl(), floor(), getPoint(), gmsg, intersectLineTriangle(), isInside(), level2(), max(), maxExtent, maxExtent_m, minExtent, minExtent_m, nr_m, PAssert, Points_m, randGen_m, SEGMENT, sizeOfVoxel, SQR, sqrt(), IpplTimings::startTimer(), IpplTimings::stopTimer(), TisInside_m, Triangles_m, and voxelMesh_m.
Referenced by BoundaryGeometry().

|
private |
Definition at line 2308 of file BoundaryGeometry.cpp.
References debug_intersectLineSegmentBoundary, debug_intersectTinyLineSegmentBoundary, debugFlags_m, endl(), gmsg, intersectTinyLineSegmentBoundary(), mapPoint2VoxelIndices, max(), min(), and Hypervolume::n.
Referenced by intersectRayBoundary().

|
private |
Definition at line 1173 of file BoundaryGeometry.cpp.
References a, cross(), dot(), cmp_ulp::eq_zero(), cmp_ulp::ge_zero(), getPoint(), cmp_ulp::gt(), cmp_ulp::le(), LINE, cmp_ulp::lt(), cmp_ulp::lt_zero(), Hypervolume::n, RAY, and SEGMENT.
Referenced by initialize(), and intersectTinyLineSegmentBoundary().

Definition at line 1477 of file BoundaryGeometry.cpp.
References Physics::c, debug_intersectLineSegmentBoundary, debug_intersectRayBoundary, debugFlags_m, endl(), gmsg, intersectLineSegmentBoundary(), IpplTimings::startTimer(), IpplTimings::stopTimer(), TRayTrace_m, and voxelMesh_m.
Referenced by ArbitraryDomain::compute().

|
private |
Definition at line 2156 of file BoundaryGeometry.cpp.
References debug_intersectTinyLineSegmentBoundary, debugFlags_m, endl(), cmp_ulp::eq_zero(), getPoint(), gmsg, Voxel::intersect(), intersectLineTriangle(), LINE, mapIndices2Voxel(), mapPoint2VoxelIndices, mapVoxelIndices2ID(), max(), min(), PAssert, Voxel::pts, and voxelMesh_m.
Referenced by intersectLineSegmentBoundary(), and partInside().

|
private |
Definition at line 1110 of file BoundaryGeometry.cpp.
References getPoint(), Voxel::intersect(), and voxelMesh_m.
Referenced by computeMeshVoxelization().

|
private |
Definition at line 1256 of file BoundaryGeometry.cpp.
References fastIsInside(), cmp_ulp::lt(), maxExtent_m, and minExtent_m.
Referenced by initialize().

|
inlineprivate |
Definition at line 1561 of file BoundaryGeometry.cpp.
References voxelMesh_m.
Referenced by intersectTinyLineSegmentBoundary(), and mapPoint2Voxel().
Definition at line 1573 of file BoundaryGeometry.cpp.
References floor(), mapIndices2Voxel(), and voxelMesh_m.

|
inlineprivate |
Definition at line 1529 of file BoundaryGeometry.cpp.
References voxelMesh_m.
Referenced by computeMeshVoxelization(), and intersectTinyLineSegmentBoundary().
|
private |
| int BoundaryGeometry::partInside | ( | const Vector_t & | r, |
| const Vector_t & | v, | ||
| const double | dt, | ||
| Vector_t & | intersect_pt, | ||
| int & | triangle_id | ||
| ) |
Determine whether a particle with position
| r,momenta |
param v , and time step
| dt | will hit the boundary. |
return value: -1 no collison with boundary 0 particle will collide with boundary in next time step
Definition at line 2378 of file BoundaryGeometry.cpp.
References Physics::c, debug_intersectTinyLineSegmentBoundary, debug_PartInside, debugFlags_m, dot(), endl(), gmsg, intersectTinyLineSegmentBoundary(), sqrt(), IpplTimings::startTimer(), IpplTimings::stopTimer(), and TPartInside_m.
Referenced by ParallelCyclotronTracker::bgf_main_collision_test().

Definition at line 2468 of file BoundaryGeometry.cpp.
References A, B, BOXCORNER, C, endl(), FGEOM, Object::getOpalName(), Attributes::getReal(), Attributes::getString(), getTopology(), Object::itsAttr, L1, L2, LENGTH, maxExtent_m, minExtent_m, Points_m, S, TOPO, Triangles_m, voxelMesh_m, XSCALE, XYZSCALE, YSCALE, and ZSCALE.
Referenced by operator<<().

|
virtual |
Update this object.
Reimplemented from Object.
Definition at line 1082 of file BoundaryGeometry.cpp.
References Object::getOpalName(), and Object::setOpalName().
Referenced by BoundaryGeometry(), and execute().

| void BoundaryGeometry::updateElement | ( | ElementBase * | element | ) |
Definition at line 1106 of file BoundaryGeometry.cpp.
Referenced by ElementBase::ElementBase().
| void BoundaryGeometry::writeGeomToVtk | ( | std::string | fn | ) |
Definition at line 2432 of file BoundaryGeometry.cpp.
References endl(), PAssert, PointID, Points_m, and Triangles_m.
Referenced by DataSink::writeGeomToVtk().

|
private |
Definition at line 256 of file BoundaryGeometry.h.
Referenced by disableDebug(), enableDebug(), fastIsInside(), intersectLineSegmentBoundary(), intersectRayBoundary(), intersectTinyLineSegmentBoundary(), and partInside().
|
private |
Definition at line 234 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), and computeMeshVoxelization().
|
private |
Definition at line 258 of file BoundaryGeometry.h.
Referenced by getInsidePoint().
| std::unordered_map<int, std::unordered_set<int> > BoundaryGeometry::ids |
Definition at line 252 of file BoundaryGeometry.h.
|
private |
Definition at line 259 of file BoundaryGeometry.h.
Referenced by findInsidePoint(), and getInsidePoint().
| Vector_t BoundaryGeometry::maxExtent |
Definition at line 248 of file BoundaryGeometry.h.
Referenced by initialize().
|
private |
Definition at line 244 of file BoundaryGeometry.h.
Referenced by fastIsInside(), findInsidePoint(), getmaxcoords(), initialize(), isInside(), and printInfo().
| Vector_t BoundaryGeometry::minExtent |
Definition at line 247 of file BoundaryGeometry.h.
Referenced by initialize().
|
private |
Definition at line 243 of file BoundaryGeometry.h.
Referenced by fastIsInside(), findInsidePoint(), getmincoords(), initialize(), isInside(), and printInfo().
| Vektor<int, 3> BoundaryGeometry::nr_m |
Definition at line 250 of file BoundaryGeometry.h.
Referenced by initialize().
|
private |
Definition at line 236 of file BoundaryGeometry.h.
Referenced by getPoint(), initialize(), printInfo(), and writeGeomToVtk().
|
private |
Definition at line 261 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), initialize(), and ~BoundaryGeometry().
| Vector_t BoundaryGeometry::sizeOfVoxel |
Definition at line 249 of file BoundaryGeometry.h.
Referenced by initialize().
|
private |
Definition at line 265 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), execute(), and fastIsInside().
|
private |
Definition at line 263 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), and execute().
|
private |
Definition at line 264 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), execute(), and initialize().
|
private |
Definition at line 267 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), execute(), and partInside().
|
private |
Definition at line 266 of file BoundaryGeometry.h.
Referenced by BoundaryGeometry(), execute(), and intersectRayBoundary().
|
private |
Definition at line 237 of file BoundaryGeometry.h.
Referenced by computeMeshVoxelization(), getNumBFaces(), getPoint(), initialize(), printInfo(), and writeGeomToVtk().
|
private |
Definition at line 241 of file BoundaryGeometry.h.
|
private |
Definition at line 240 of file BoundaryGeometry.h.
| struct { ... } BoundaryGeometry::voxelMesh_m |