int InverseElementTransformation::FindClosestPhysPoint( const Vector& pt, const IntegrationRule &ir) { MFEM_VERIFY(T != NULL, "invalid ElementTransformation"); MFEM_VERIFY(pt.Size() == T->GetSpaceDim(), "invalid point"); DenseMatrix physPts; T->Transform(ir, physPts); // Initialize distance and index of closest point int minIndex = -1; double minDist = std::numeric_limits<double>::max(); // Check all integration points in ir const int npts = ir.GetNPoints(); for (int i = 0; i < npts; ++i) { double dist = pt.DistanceTo(physPts.GetColumn(i)); if (dist < minDist) { minDist = dist; minIndex = i; } } return minIndex; }
void IsoparametricTransformation::Transform (const DenseMatrix &matrix, DenseMatrix &result) { MFEM_ASSERT(matrix.Height() == GetDimension(), "invalid input"); result.SetSize(PointMat.Height(), matrix.Width()); IntegrationPoint ip; Vector col; for (int j = 0; j < matrix.Width(); j++) { ip.Set(matrix.GetColumn(j), matrix.Height()); result.GetColumnReference(j, col); Transform(ip, col); } }