![]() |
PeriDEM 0.3.0
PeriDEM -- Peridynamics-based high-fidelity model for granular media
|
Collection of methods useful in simulation. More...
Namespaces | |
| namespace | io |
| Provides geometrical methods such as point inside rectangle. | |
| namespace | methods |
| Provides fast methods to add/subtract list of data, to find maximum/minimum from list of data. | |
| namespace | parallel |
| Implements some key functions and classes regularly used in the code when running with MPI. | |
Data Structures | |
| class | DistributionSample |
| Templated probability distribution. More... | |
| struct | Matrix3 |
| A structure to represent 3d matrices. More... | |
| struct | Point |
| A structure to represent 3d vectors. More... | |
| struct | SymMatrix3 |
| A structure to represent 3d matrices. More... | |
Functions | |
| bool | isGreater (const double &a, const double &b) |
| Returns true if a > b. | |
| bool | isLess (const double &a, const double &b) |
| Returns true if a < b. | |
| double | hatFunction (const double &x, const double &x_min, const double &x_max) |
| Computes hat function at given point. | |
| double | hatFunctionQuick (const double &x, const double &x_min, const double &x_max) |
| Computes hat function at given point. | |
| double | linearStepFunc (const double &x, const double &x1, const double &x2) |
| Compute linear step function. | |
| double | gaussian (const double &r, const double &a, const double &beta) |
| Compute gaussian function in 1-d. | |
| double | gaussian2d (const util::Point &x, const size_t &dof, const std::vector< double > ¶ms) |
| Compute gaussian function in 2-d. | |
| double | doubleGaussian2d (const util::Point &x, const size_t &dof, const std::vector< double > ¶ms) |
| Compute sum of two gaussian function in 2-d. | |
| double | equivalentMass (const double &m1, const double &m2) |
| Compute harmonic mean of m1 and m2. | |
| double | harmonicMean (const double &m1, const double &m2) |
| double | normalContactStiffness (const double &K1, const double &K2, const double &horizon, int horizonPower=5) |
| Silling normal contact stiffness from two bulk moduli and the horizon. | |
| double | selfContactStiffness (const double &K, const double &horizon, int horizonPower=5) |
| Contact stiffness for a body against itself. | |
| bool | checkMatrix (const std::vector< std::vector< double > > &m) |
| Checks matrix. | |
| std::vector< double > | dot (const std::vector< std::vector< double > > &m, const std::vector< double > &v) |
| Computes the dot product between matrix and vector. | |
| std::vector< std::vector< double > > | transpose (const std::vector< std::vector< double > > &m) |
| Computes the tranpose of matrix. | |
| double | det (const std::vector< std::vector< double > > &m) |
| Computes the determinant of matrix. | |
| std::vector< std::vector< double > > | inv (const std::vector< std::vector< double > > &m) |
| Computes the determinant of matrix. | |
| RandGenerator | get_rd_gen (int seed=-1) |
| Return random number generator. | |
| std::default_random_engine | get_rd_engine (int &seed) |
| Return random number generator. | |
| double | transform_to_normal_dist (double mean, double std, double sample) |
| Transform sample from N(0,1) to N(mean, std^2) | |
| double | transform_to_uniform_dist (double min, double max, double sample) |
| Transform sample from U(0,1) to U(a,b) | |
Rotation | |
| std::vector< double > | rotateCW2D (const std::vector< double > &x, const double &theta) |
| Rotates a vector in xy-plane in clockwise direction. | |
| util::Point | rotateCW2D (const util::Point &x, const double &theta) |
| Rotates a vector in xy-plane in clockwise direction. | |
| std::vector< double > | rotateACW2D (const std::vector< double > &x, const double &theta) |
| Rotates a vector in xy-plane in anti-clockwise direction. | |
| util::Point | rotateACW2D (const util::Point &x, const double &theta) |
| Rotates a vector in xy-plane in anti-clockwise direction. | |
| std::vector< double > | rotate2D (const std::vector< double > &x, const double &theta) |
| Rotates a vector in xy-plane assuming ACW convention. | |
| util::Point | rotate2D (const util::Point &x, const double &theta) |
| Rotates a vector in xy-plane assuming ACW convention. | |
| util::Point | derRotate2D (const util::Point &x, const double &theta) |
| Computes derivative of rotation wrt to time. | |
| util::Point | rotate (const util::Point &p, const double &theta, const util::Point &axis) |
| Returns the vector after rotating by desired angle. | |
| double | angle (util::Point a, util::Point b) |
| Computes angle between two vectors. | |
| double | angle (util::Point a, util::Point b, util::Point axis, bool is_axis=true) |
| Computes angle between two vectors. | |
Variables | |
VTK Element types | |
| static const int | vtk_type_vertex = 1 |
| Integer flag for vertex (point) element. | |
| static const int | vtk_type_poly_vertex = 2 |
| Integer flag for poly vertex element. | |
| static const int | vtk_type_line = 3 |
| Integer flag for line element. | |
| static const int | vtk_type_poly_line = 4 |
| Integer flag for poly line element. | |
| static const int | vtk_type_triangle = 5 |
| Integer flag for triangle element. | |
| static const int | vtk_type_triangle_strip = 6 |
| Integer flag for triangle strip element. | |
| static const int | vtk_type_polygon = 7 |
| Integer flag for polygon element. | |
| static const int | vtk_type_pixel = 8 |
| Integer flag for pixel element. | |
| static const int | vtk_type_quad = 9 |
| Integer flag for quad element. | |
| static const int | vtk_type_tetra = 10 |
| Integer flag for tetrahedron element. | |
| static const int | vtk_type_voxel = 11 |
| Integer flag for voxel element. | |
| static const int | vtk_type_hexahedron = 12 |
| Integer flag for hexahedron element. | |
| static const int | vtk_type_wedge = 13 |
| Integer flag for wedge element. | |
| static const int | vtk_type_pyramid = 14 |
| Integer flag for pyramid element. | |
| static int | vtk_map_element_to_num_nodes [16] |
| Map from element type to number of nodes (for vtk) | |
| static int | vtk_to_msh_element_type_map [16] |
| Map from vtk element type to msh element type. | |
Gmsh Element types | |
| static const int | msh_type_line = 1 |
| Integer flag for line element. | |
| static const int | msh_type_triangle = 2 |
| Integer flag for triangle element. | |
| static const int | msh_type_quadrangle = 3 |
| Integer flag for quadrangle element. | |
| static const int | msh_type_tetrahedron = 4 |
| Integer flag for tetrahedron element. | |
| static const int | msh_type_hexahedron = 5 |
| Integer flag for hexahedron element. | |
| static const int | msh_type_prism = 6 |
| Integer flag for prism element. | |
| static const int | msh_type_pyramid = 7 |
| Integer flag for pyramid element. | |
| static const int | msh_type_line_second_order = 8 |
| Integer flag for line (second order) element. | |
| static const int | msh_type_traingle_second_order = 9 |
| Integer flag for traingle (second order) element. | |
| static const int | msh_type_quadrangle_second_order = 10 |
| Integer flag for quadrangle (second order) element. | |
| static const int | msh_type_vertex = 15 |
| Integer flag for vertex (point) element. | |
| static int | msh_map_element_to_num_nodes [16] |
| Map from element type to number of nodes (for msh) | |
Collection of methods useful in simulation.
This namespace provides number of useful functions and struct definition.
| double util::angle | ( | util::Point | a, |
| util::Point | b | ||
| ) |
Computes angle between two vectors.
| a | Vector 1 |
| b | Vector 2 |
Definition at line 81 of file transformationFunctions.cpp.
References util::Point::length().
Referenced by angle(), geom::distanceBetweenPlanes(), geom::doLinesIntersect(), and test::testUtilMethods().
| double util::angle | ( | util::Point | a, |
| util::Point | b, | ||
| util::Point | axis, | ||
| bool | is_axis = true |
||
| ) |
Computes angle between two vectors.
| a | Vector 1 |
| b | Vector 2 |
| axis | Axis of rotation |
| is_axis | If true then axis is the axis of orientation, otherwise axis specifies the +ve side of the plane in which a and b are |
Definition at line 91 of file transformationFunctions.cpp.
References angle(), util::Point::cross(), and util::Point::length().
| bool util::checkMatrix | ( | const std::vector< std::vector< double > > & | m | ) |
Checks matrix.
| m | Matrix |
Definition at line 15 of file matrix.cpp.
References util::io::printStr().
| util::Point util::derRotate2D | ( | const util::Point & | x, |
| const double & | theta | ||
| ) |
Computes derivative of rotation wrt to time.
If \( R(x,t) = Q(at)x \) then \( dR/dt = a Q' x \). This function returns \( Q' x \).
| x | Point |
| theta | Angle |
Definition at line 60 of file transformationFunctions.cpp.
References util::Point::d_x, and util::Point::d_y.
Referenced by loading::ParticleULoading::apply().
| double util::det | ( | const std::vector< std::vector< double > > & | m | ) |
Computes the determinant of matrix.
| m | Matrix |
Definition at line 75 of file matrix.cpp.
Referenced by fe::HexElem::getJacobian(), fe::TetElem::getJacobian(), inv(), and fe::mapToPhysical().
| std::vector< double > util::dot | ( | const std::vector< std::vector< double > > & | m, |
| const std::vector< double > & | v | ||
| ) |
Computes the dot product between matrix and vector.
| m | Matrix |
| v | vector |
Definition at line 38 of file matrix.cpp.
Referenced by fe::TetElem::getDerShapes(), fe::TetElem::mapPointToRefElem(), and fe::mapToPhysical().
| double util::doubleGaussian2d | ( | const util::Point & | x, |
| const size_t & | dof, | ||
| const std::vector< double > & | params | ||
| ) |
Compute sum of two gaussian function in 2-d.
Double guassian (2-d) function:
\[ f(x,y) = (f_1(x,y), f_2(x,y)) + (g_1(x,y), g_2(x,y)), \]
where \( (f_1,f_2)\) and \((g_1, g_2)\) are two guassian 2-d function as described in guassian2d() with different values of \( (x_c, y_c), a, (d_1, d_2)\).
| x | Coordinates of point |
| params | List of parameters |
| dof | Component of guassian function |
Definition at line 110 of file function.cpp.
References util::Point::dist(), and gaussian().
| double util::equivalentMass | ( | const double & | m1, |
| const double & | m2 | ||
| ) |
Compute harmonic mean of m1 and m2.
| m1 | Mass 1 |
| m2 | Mass 2 |
Definition at line 131 of file function.cpp.
Referenced by contact::Damping::apply(), contact::PairForce::nodeDampingForce(), and contact::Contact::setup().
| double util::gaussian | ( | const double & | r, |
| const double & | a, | ||
| const double & | beta | ||
| ) |
Compute gaussian function in 1-d.
Guassian (1-d) function: \( f(r) = a \exp(-\frac{r^2}{\beta}). \)
Here \( a\) is the amplitude and \( \beta \) is the exponential factor.
| r | Distance from origin |
| a | Amplitude |
| beta | Factor in exponential function |
Definition at line 89 of file function.cpp.
Referenced by doubleGaussian2d(), and gaussian2d().
| double util::gaussian2d | ( | const util::Point & | x, |
| const size_t & | dof, | ||
| const std::vector< double > & | params | ||
| ) |
Compute gaussian function in 2-d.
Guassian (2-d) function:
\[ f(x,y) = (f_1(x,y), f_2(x,y)), \]
where
\[ f_1(x,y) = a \exp(-\frac{(x-x_c)^2 + (y-y_c)^2}{\beta}) d_1, \quad f_1(x,y) = a \exp(-\frac{(x-x_c)^2 + (y-y_c)^2}{\beta}) d_2. \]
Here \( (x_c,y_c) \) is the center of the pulse, \( a\) is the amplitude, \( \beta \) is the exponential factor, and \( (d_1,d_2)\) is the direction of the pulse.
| x | Coordinates of point |
| params | List of parameters |
| dof | Component of guassian function |
Definition at line 94 of file function.cpp.
References util::Point::dist(), and gaussian().
|
inline |
Return random number generator.
| seed | Seed |
Definition at line 48 of file randomDist.h.
|
inline |
Return random number generator.
| seed | Seed |
Definition at line 30 of file randomDist.h.
Referenced by anonymous_namespace{testNSearchLib.cpp}::assignRandomTags(), util::DistributionSample< T >::init(), anonymous_namespace{testNSearchLib.cpp}::lattice(), anonymous_namespace{testNSearchLib.cpp}::neighSearchTreeClosestPointSizet(), and test::testTaskflow().
| double util::harmonicMean | ( | const double & | m1, |
| const double & | m2 | ||
| ) |
Definition at line 135 of file function.cpp.
Referenced by anonymous_namespace{main.cpp}::buildInputJson(), anonymous_namespace{main.cpp}::buildInputJson(), normalContactStiffness(), and test::testContactStiffness().
| double util::hatFunction | ( | const double & | x, |
| const double & | x_min, | ||
| const double & | x_max | ||
| ) |
Computes hat function at given point.
Hat function: f ^ | | 1 o | /|\ | / | \ | / | \ | / | \ | / | \ | / | \ o____________o____________o______\ x / x_min x_max
| x | Point in real line |
| x_min | Left side point in real line |
| x_max | Right side point in real line |
Definition at line 27 of file function.cpp.
References isGreater(), and isLess().
Referenced by loading::ParticleFLoading::apply(), and loading::ParticleULoading::apply().
| double util::hatFunctionQuick | ( | const double & | x, |
| const double & | x_min, | ||
| const double & | x_max | ||
| ) |
Computes hat function at given point.
This version does not test if point x is in valid interval.
Hat function: f ^ | | 1 o | /|\ | / | \ | / | \ | / | \ | / | \ | / | \ o____________o____________o______\ x / x_min x_max
| x | Point in real line |
| x_min | Left side point in real line |
| x_max | Right side point in real line |
Definition at line 48 of file function.cpp.
References isLess().
| std::vector< std::vector< double > > util::inv | ( | const std::vector< std::vector< double > > & | m | ) |
Computes the determinant of matrix.
| m | Matrix |
Definition at line 93 of file matrix.cpp.
References det().
Referenced by fe::TetElem::getDerShapes(), fe::TetElem::mapPointToRefElem(), and fe::mapToPhysical().
| bool util::isGreater | ( | const double & | a, |
| const double & | b | ||
| ) |
Returns true if a > b.
| a | Value a |
| b | Value b |
Definition at line 17 of file function.cpp.
References COMPARE_EPS.
Referenced by loading::ParticleFLoading::apply(), contact::Damping::apply(), geom::AnnulusGeomObject::center(), geom::ComplexGeomObject::center(), anonymous_namespace{tetElem.cpp}::checkPoint(), postprocess::Postprocess::checkStop(), geom::circumscribedRadiusInBox(), anonymous_namespace{materialUtil.cpp}::computeHydrostaticStrainI(), material::RnpMaterial::computeParameters(), material::PmbMaterial::computeParameters(), material::PdElastic::computeParameters(), material::PdState::computeParameters(), anonymous_namespace{materialUtil.cpp}::computeStateMxI(), anonymous_namespace{materialUtil.cpp}::computeStateThetaxI(), contact::correctedContactVolume(), material::RnpMaterial::getBondEF(), material::PmbMaterial::getBondEF(), hatFunction(), geom::inscribedRadiusInBox(), geom::Line::isInside(), geom::Cylinder::isInside(), geom::BoxPartition::isNear(), geom::Line::isNear(), geom::Cylinder::isNear(), geom::Line::isNearBoundary(), geom::Cylinder::isNearBoundary(), geom::isPointInsideAngledRectangle(), geom::isPointInsideBox(), geom::isPointInsideCuboid(), geom::isPointInsideRectangle(), geom::isPointInsideRectangle(), fe::LineElem::mapPointToRefElem(), fe::TetElem::mapPointToRefElem(), fe::TriElem::mapPointToRefElem(), contact::Contact::setup(), contact::PairForce::springForce(), contact::StickSlipPairForce::springForce(), postprocess::Postprocess::twoParticle(), anonymous_namespace{materialUtil.cpp}::updateBondFractureDataI(), and contact::Contact::updateSearchParameters().
| bool util::isLess | ( | const double & | a, |
| const double & | b | ||
| ) |
Returns true if a < b.
| a | Value a |
| b | Value b |
Definition at line 22 of file function.cpp.
References COMPARE_EPS.
Referenced by contact::Damping::apply(), geom::areBoxesNear(), anonymous_namespace{tetElem.cpp}::checkPoint(), mesh::Mesh::computeBBox(), geom::computeBBox(), contact::Contact::computeForces(), mesh::Mesh::computeMeshSize(), geom::computeMeshSize(), geom::computeMeshSize(), material::RnpMaterial::computeParameters(), material::PmbMaterial::computeParameters(), material::PdElastic::computeParameters(), material::PdState::computeParameters(), anonymous_namespace{materialUtil.cpp}::computeStateMxI(), geom::anonymous_namespace{geomObjects.cpp}::ellipseMetricInside(), mesh::getMaxShearStressAndLoc(), mesh::getStrainStress(), hatFunction(), hatFunctionQuick(), geom::Rectangle::inscribedRadius(), geom::Cuboid::inscribedRadius(), geom::Line::isInside(), geom::Circle::isInside(), geom::Sphere::isInside(), geom::Ellipsoid::isInside(), geom::Cylinder::isInside(), geom::Circle::isNear(), geom::Ellipse::isNear(), geom::Sphere::isNear(), geom::BoxPartition::isNear(), geom::Line::isNear(), geom::Circle::isNear(), geom::Sphere::isNear(), geom::Ellipsoid::isNear(), geom::Cylinder::isNear(), geom::Line::isNearBoundary(), geom::Square::isNearBoundary(), geom::Rectangle::isNearBoundary(), geom::Cube::isNearBoundary(), geom::Cuboid::isNearBoundary(), geom::Circle::isNearBoundary(), geom::Sphere::isNearBoundary(), geom::Cylinder::isNearBoundary(), geom::OpenRectChannel2D::isNearBoundary(), geom::isPointInsideAngledRectangle(), geom::isPointInsideBox(), geom::isPointInsideCuboid(), geom::isPointInsideRectangle(), geom::isPointInsideRectangle(), linearStepFunc(), fe::LineElem::mapPointToRefElem(), fe::TetElem::mapPointToRefElem(), fe::TriElem::mapPointToRefElem(), contact::PairForce::nodeDampingForce(), particle::RefParticle::RefParticle(), contact::PairForce::springForce(), contact::StickSlipPairForce::springForce(), postprocess::Postprocess::twoParticle(), and contact::Contact::updateSearchParameters().
| double util::linearStepFunc | ( | const double & | x, |
| const double & | x1, | ||
| const double & | x2 | ||
| ) |
Compute linear step function.
Step function:
f ^ | __________ | / | / | _______/ | / | / |/_________________________ t x1 x1+x2
| x | Point in real line |
| x1 | Point such that function is linear with slope 1 in [0, x1) |
| x2 | Point such that function is constant in [x1, x1 + x2) |
Definition at line 64 of file function.cpp.
References isLess().
Referenced by loading::ParticleFLoading::apply().
| double util::normalContactStiffness | ( | const double & | K1, |
| const double & | K2, | ||
| const double & | horizon, | ||
| int | horizonPower = 5 |
||
| ) |
Silling normal contact stiffness from two bulk moduli and the horizon.
\[ K_n = \frac{18\,\bar{K}}{\pi \delta^{p}}, \quad \bar{K} = \mathrm{harmonicMean}(K_1, K_2) \]
The contact force density in PairForce is \( K_n V_j \, \mathrm{overlap} \), so \( K_n \) carries one power of the horizon per spatial dimension of the nodal weight: \( p = 5 \) with 3D weights \( h^3 \), \( p = 4 \) with 2D weights \( h^2 \cdot 1\,\mathrm{m} \).
| K1 | Bulk modulus of the first body |
| K2 | Bulk modulus of the second body |
| horizon | Peridynamic horizon |
| horizonPower | Power of the horizon in the denominator |
Definition at line 139 of file function.cpp.
References harmonicMean().
Referenced by anonymous_namespace{main.cpp}::buildInputJson(), anonymous_namespace{main.cpp}::buildInputJson(), anonymous_namespace{main.cpp}::buildInputJson(), anonymous_namespace{main.cpp}::buildInputJson(), anonymous_namespace{main.cpp}::buildInputJson(), getInputJson(), anonymous_namespace{main.cpp}::KnFromBulk(), main(), and test::testContactStiffness().
| util::Point util::rotate | ( | const util::Point & | p, |
| const double & | theta, | ||
| const util::Point & | axis | ||
| ) |
Returns the vector after rotating by desired angle.
| p | Vector |
| theta | Angle of rotation |
| axis | Axis of rotation |
Definition at line 67 of file transformationFunctions.cpp.
References util::Point::cross().
Referenced by geom::ParticleTransform::apply(), geom::Drum2D::Drum2D(), geom::Hexagon::Hexagon(), geom::Drum2D::isInside(), geom::mapSimilarity(), test::testUtilMethods(), geom::Plane::transform(), geom::Triangle::transform(), geom::Hexagon::transform(), geom::Drum2D::transform(), geom::Cylinder::transform(), geom::OpenRectChannel2D::transform(), and geom::Triangle::Triangle().
| std::vector< double > util::rotate2D | ( | const std::vector< double > & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane assuming ACW convention.
| x | Point |
| theta | Angle |
Definition at line 45 of file transformationFunctions.cpp.
Referenced by loading::ParticleULoading::apply().
| util::Point util::rotate2D | ( | const util::Point & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane assuming ACW convention.
| x | Point |
| theta | Angle |
Definition at line 53 of file transformationFunctions.cpp.
References util::Point::d_x, and util::Point::d_y.
| std::vector< double > util::rotateACW2D | ( | const std::vector< double > & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane in anti-clockwise direction.
| x | Point |
| theta | Angle |
Definition at line 31 of file transformationFunctions.cpp.
References rotateCW2D().
Referenced by test::testUtilMethods().
| util::Point util::rotateACW2D | ( | const util::Point & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane in anti-clockwise direction.
| x | Point |
| theta | Angle |
Definition at line 37 of file transformationFunctions.cpp.
References rotateCW2D().
| std::vector< double > util::rotateCW2D | ( | const std::vector< double > & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane in clockwise direction.
| x | Point |
| theta | Angle |
Definition at line 15 of file transformationFunctions.cpp.
Referenced by geom::isPointInsideAngledRectangle(), rotateACW2D(), rotateACW2D(), and test::testUtilMethods().
| util::Point util::rotateCW2D | ( | const util::Point & | x, |
| const double & | theta | ||
| ) |
Rotates a vector in xy-plane in clockwise direction.
| x | Point |
| theta | Angle |
Definition at line 23 of file transformationFunctions.cpp.
References util::Point::d_x, and util::Point::d_y.
| double util::selfContactStiffness | ( | const double & | K, |
| const double & | horizon, | ||
| int | horizonPower = 5 |
||
| ) |
Contact stiffness for a body against itself.
\[ K_n = \frac{18}{\pi \delta^{p}} K \]
Analytically this equals normalContactStiffness(K, K, horizon), because harmonicMean(K, K) == K. The two are separate functions because the order of operations is not the same in floating point. BaseParticle evaluates \( (18 / (\pi \delta^5)) \cdot K \). Over the 36 combinations of bulk modulus and horizon that the examples and tests use, the regrouped form \( 18 K / (\pi \delta^5) \) differs from it in the last bit in 8 cases, by 2e-16 relative. This function keeps the original order of operations so that the internal contact stiffness is unchanged.
| K | Bulk modulus |
| horizon | Peridynamic horizon |
| horizonPower | Power of the horizon in the denominator |
Definition at line 148 of file function.cpp.
Referenced by particle::BaseParticle::BaseParticle(), and test::testContactStiffness().
|
inline |
Transform sample from N(0,1) to N(mean, std^2)
| mean | Mean of normal distribution |
| std | Std of normal distribution |
| sample | Sample from N(0,1) |
Definition at line 68 of file randomDist.h.
|
inline |
Transform sample from U(0,1) to U(a,b)
| min | Min of uniform distribution |
| max | Max of uniform distribution |
| sample | Sample from U(0,1) |
Definition at line 80 of file randomDist.h.
Referenced by particle::createParticlesFromFile().
| std::vector< std::vector< double > > util::transpose | ( | const std::vector< std::vector< double > > & | m | ) |
Computes the tranpose of matrix.
| m | Matrix |
Definition at line 56 of file matrix.cpp.
Referenced by fe::TetElem::mapPointToRefElem().