LCOV - code coverage report
Current view: top level - src/userobjects - RectangleCutUserObject.C (source / functions) Hit Total Coverage
Test: idaholab/moose xfem: #31405 (292dce) with base fef103 Lines: 31 37 83.8 %
Date: 2025-09-04 07:58:55 Functions: 3 5 60.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //* This file is part of the MOOSE framework
       2             : //* https://mooseframework.inl.gov
       3             : //*
       4             : //* All rights reserved, see COPYRIGHT for full restrictions
       5             : //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
       6             : //*
       7             : //* Licensed under LGPL 2.1, please see LICENSE for details
       8             : //* https://www.gnu.org/licenses/lgpl-2.1.html
       9             : 
      10             : #include "RectangleCutUserObject.h"
      11             : 
      12             : // MOOSE includes
      13             : #include "MooseError.h"
      14             : 
      15             : // XFEM includes
      16             : #include "XFEMFuncs.h"
      17             : 
      18             : registerMooseObject("XFEMApp", RectangleCutUserObject);
      19             : 
      20             : InputParameters
      21          88 : RectangleCutUserObject::validParams()
      22             : {
      23             :   // Get input parameters from parent class
      24          88 :   InputParameters params = GeometricCut3DUserObject::validParams();
      25             : 
      26             :   // Add required parameters
      27         176 :   params.addRequiredParam<std::vector<Real>>("cut_data",
      28             :                                              "Vector of Real values providing cut information");
      29             :   // Class description
      30          88 :   params.addClassDescription("Creates a UserObject for planar cuts on 3D meshes for XFEM");
      31             :   // Return the parameters
      32          88 :   return params;
      33           0 : }
      34             : 
      35          44 : RectangleCutUserObject::RectangleCutUserObject(const InputParameters & parameters)
      36         132 :   : GeometricCut3DUserObject(parameters), _cut_data(getParam<std::vector<Real>>("cut_data"))
      37             : {
      38             :   // Set up constant parameters
      39             :   const int cut_data_len = 12;
      40             :   const int num_vertices = 4;
      41             : 
      42             :   // Throw error if length of cut_data is incorrect
      43          44 :   if (_cut_data.size() != cut_data_len)
      44           0 :     mooseError("Length of RectangleCutUserObject cut_data must be 12");
      45             : 
      46             :   // Assign cut_data to vars used to construct cuts
      47          44 :   _vertices.push_back(Point(_cut_data[0], _cut_data[1], _cut_data[2]));
      48          44 :   _vertices.push_back(Point(_cut_data[3], _cut_data[4], _cut_data[5]));
      49          44 :   _vertices.push_back(Point(_cut_data[6], _cut_data[7], _cut_data[8]));
      50          44 :   _vertices.push_back(Point(_cut_data[9], _cut_data[10], _cut_data[11]));
      51             : 
      52         220 :   for (unsigned int i = 0; i < num_vertices; ++i)
      53         176 :     _center += _vertices[i];
      54             :   _center *= 0.25;
      55             : 
      56         220 :   for (unsigned int i = 0; i < num_vertices; ++i)
      57             :   {
      58         176 :     unsigned int iplus1(i < 3 ? i + 1 : 0);
      59             :     std::pair<Point, Point> rays =
      60         176 :         std::make_pair(_vertices[i] - _center, _vertices[iplus1] - _center);
      61         176 :     _normal += rays.first.cross(rays.second);
      62             :   }
      63             :   _normal *= 0.25;
      64          44 :   Xfem::normalizePoint(_normal);
      65          44 : }
      66             : 
      67             : bool
      68      126928 : RectangleCutUserObject::isInsideCutPlane(Point p) const
      69             : {
      70             :   const int num_vertices = 4;
      71             : 
      72             :   bool inside = false;
      73             :   unsigned int counter = 0;
      74      634640 :   for (unsigned int i = 0; i < num_vertices; ++i)
      75             :   {
      76      507712 :     unsigned int iplus1 = (i < 3 ? i + 1 : 0);
      77      507712 :     Point middle2p = p - 0.5 * (_vertices[i] + _vertices[iplus1]);
      78             :     const Point side_tang = _vertices[iplus1] - _vertices[i];
      79      507712 :     Point side_norm = side_tang.cross(_normal);
      80      507712 :     Xfem::normalizePoint(middle2p);
      81      507712 :     Xfem::normalizePoint(side_norm);
      82      507712 :     if (middle2p * side_norm <= 0.0)
      83      439272 :       counter += 1;
      84             :   }
      85      126928 :   if (counter == num_vertices)
      86             :     inside = true;
      87      126928 :   return inside;
      88             : }
      89             : 
      90             : const std::vector<Point>
      91           0 : RectangleCutUserObject::getCrackFrontPoints(unsigned int /*num_crack_front_points*/) const
      92             : {
      93           0 :   mooseError("getCrackFrontPoints() is not implemented for this object.");
      94             : }
      95             : 
      96             : const std::vector<RealVectorValue>
      97           0 : RectangleCutUserObject::getCrackPlaneNormals(unsigned int /*num_crack_front_points*/) const
      98             : {
      99           0 :   mooseError("getCrackPlaneNormals() is not implemented for this object.");
     100             : }

Generated by: LCOV version 1.14