LCOV - code coverage report
Current view: top level - include/base - single_predicates.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4229 (6a9aeb) with base 727f46 Lines: 49 112 43.8 %
Date: 2025-08-19 19:27:09 Functions: 208 654 31.8 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // The libMesh Finite Element Library.
       2             : // Copyright (C) 2002-2025 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
       3             : 
       4             : // This library is free software; you can redistribute it and/or
       5             : // modify it under the terms of the GNU Lesser General Public
       6             : // License as published by the Free Software Foundation; either
       7             : // version 2.1 of the License, or (at your option) any later version.
       8             : 
       9             : // This library is distributed in the hope that it will be useful,
      10             : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12             : // Lesser General Public License for more details.
      13             : 
      14             : // You should have received a copy of the GNU Lesser General Public
      15             : // License along with this library; if not, write to the Free Software
      16             : // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
      17             : 
      18             : #ifndef LIBMESH_SINGLE_PREDICATES_H
      19             : #define LIBMESH_SINGLE_PREDICATES_H
      20             : 
      21             : // Local includes
      22             : #include "libmesh/libmesh_common.h"
      23             : #include "libmesh/id_types.h"
      24             : 
      25             : // C++ includes
      26             : #include <cstddef>
      27             : #include <vector>
      28             : #include <set>
      29             : #include <memory>
      30             : 
      31             : namespace libMesh
      32             : {
      33             : 
      34             : // Forward declarations
      35             : class BoundaryInfo;
      36             : class DofMap;
      37             : enum ElemType : int;
      38             : 
      39             : /**
      40             :  * This file declares several predicates in the Predicates namespace.  They
      41             :  * are called "single predicates" since the purpose of each one is to act
      42             :  * as a single functor which returns true or false depending on the result
      43             :  * of the operator() function.  The single predicates are used together
      44             :  * as building blocks to create the "multi predicates" which can be found
      45             :  * in the multi_predicates.h header file.
      46             :  *
      47             :  * \author John W. Peterson
      48             :  * \date 2004
      49             :  */
      50             : namespace Predicates
      51             : {
      52             : // Forward declaration
      53             : template <typename T> struct abstract_multi_predicate;
      54             : 
      55             : // abstract single predicate.  Derived classes must implement the clone()
      56             : // function.  Be careful using it since it allocates memory!  The clone()
      57             : // function is necessary since the predicate class has pure virtual
      58             : // functions.
      59             : template <typename T>
      60   469975153 : struct predicate
      61             : {
      62    17571424 :   virtual ~predicate() = default;
      63             :   virtual bool operator()(const T & it) const = 0;
      64             : 
      65             : protected:
      66             :   friend struct abstract_multi_predicate<T>;
      67             :   virtual std::unique_ptr<predicate> clone() const = 0;
      68             : };
      69             : 
      70             : 
      71             : /**
      72             :  * \returns \p true if the underlying pointer is nullptr.
      73             :  */
      74             : template <typename T>
      75           0 : struct is_null : predicate<T>
      76             : {
      77    11952033 :   virtual ~is_null() = default;
      78  6349870075 :   virtual bool operator()(const T & it) const override { return *it == nullptr; }
      79             : 
      80             : protected:
      81           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<is_null<T>>(*this); }
      82             : };
      83             : 
      84             : /**
      85             :  * \returns \p true if the pointer is not nullptr.
      86             :  */
      87             : template <typename T>
      88   332726129 : struct not_null : is_null<T>
      89             : {
      90  6546856834 :   virtual bool operator()(const T & it) const override { return !is_null<T>::operator()(it); }
      91             : 
      92             : protected:
      93   267657492 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_null<T>>(*this); }
      94             : };
      95             : 
      96             : 
      97             : /**
      98             :  * \returns \p true if the pointer is active.
      99             :  */
     100             : template <typename T>
     101    95111489 : struct active : predicate<T>
     102             : {
     103   100774158 :   virtual ~active() = default;
     104  1973427022 :   virtual bool operator()(const T & it) const override { return (*it)->active(); }
     105             : 
     106             : protected:
     107    75642585 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<active<T>>(*this); }
     108             : };
     109             : 
     110             : /**
     111             :  * \returns \p true when the pointer is inactive.
     112             :  */
     113             : template <typename T>
     114           0 : struct not_active : active<T>
     115             : {
     116           0 :   virtual bool operator()(const T & it) const override { return !active<T>::operator()(it); }
     117             : 
     118             : protected:
     119           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_active<T>>(*this); }
     120             : };
     121             : 
     122             : 
     123             : /**
     124             :  * \returns \p true if the pointer is an ancestor.
     125             :  */
     126             : template <typename T>
     127     1233520 : struct ancestor : predicate<T>
     128             : {
     129     1305320 :   virtual ~ancestor() = default;
     130    29409540 :   virtual bool operator()(const T & it) const override { return (*it)->ancestor(); }
     131             : 
     132             : protected:
     133     1020752 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<ancestor<T>>(*this); }
     134             : };
     135             : 
     136             : /**
     137             :  * \returns \p true when the pointer is not an ancestor.
     138             :  */
     139             : template <typename T>
     140           0 : struct not_ancestor : ancestor<T>
     141             : {
     142           0 :   virtual bool operator()(const T & it) const override { return !ancestor<T>::operator()(it); }
     143             : 
     144             : protected:
     145           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_ancestor<T>>(*this); }
     146             : };
     147             : 
     148             : 
     149             : /**
     150             :  * \returns \p true if the pointer is subactive.
     151             :  */
     152             : template <typename T>
     153           0 : struct subactive : predicate<T>
     154             : {
     155           0 :   virtual ~subactive() = default;
     156           0 :   virtual bool operator()(const T & it) const override { return (*it)->subactive(); }
     157             : 
     158             : protected:
     159           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<subactive<T>>(*this); }
     160             : };
     161             : 
     162             : /**
     163             :  * \returns \p true when the pointer is not subactive.
     164             :  */
     165             : template <typename T>
     166           0 : struct not_subactive : subactive<T>
     167             : {
     168           0 :   virtual bool operator()(const T & it) const override { return !subactive<T>::operator()(it); }
     169             : 
     170             : protected:
     171           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_subactive<T>>(*this); }
     172             : };
     173             : 
     174             : 
     175             : 
     176             : /**
     177             :  * \returns \p true if the pointer's processor id matches a given processor id.
     178             :  */
     179             : template <typename T>
     180   123533304 : struct pid : predicate<T>
     181             : {
     182    43870123 :   pid(processor_id_type p) : _pid(p) {}
     183   171361519 :   virtual ~pid() = default;
     184             : 
     185             :   // op()
     186  2717197740 :   virtual bool operator()(const T & it) const override { return (*it)->processor_id() == _pid; }
     187             : 
     188             : protected:
     189   124365008 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<pid<T>>(*this); }
     190             :   const processor_id_type _pid;
     191             : };
     192             : 
     193             : 
     194             : 
     195             : /**
     196             :  * \returns \p has_boundary_id(node, id).
     197             :  */
     198             : template <typename T>
     199           0 : struct bid : predicate<T>
     200             : {
     201           0 :   bid(boundary_id_type b_id,
     202             :       const BoundaryInfo & bndry_info) :
     203           0 :     _bid(b_id),
     204           0 :     _bndry_info(bndry_info)
     205           0 :   {}
     206           0 :   virtual ~bid() = default;
     207             : 
     208             :   // op()
     209             :   virtual bool operator()(const T & it) const override;
     210             : 
     211             : protected:
     212           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<bid<T>>(*this); }
     213             :   const boundary_id_type _bid;
     214             :   const BoundaryInfo & _bndry_info;
     215             : };
     216             : 
     217             : 
     218             : 
     219             : /**
     220             :  * \returns \p true if n_boundary_ids(node) > 0.
     221             :  */
     222             : template <typename T>
     223           0 : struct bnd : predicate<T>
     224             : {
     225           0 :   bnd(const BoundaryInfo & bndry_info) :
     226           0 :     _bndry_info(bndry_info)
     227           0 :   {}
     228           0 :   virtual ~bnd() = default;
     229             : 
     230             :   // op()
     231             :   virtual bool operator()(const T & it) const override;
     232             : 
     233             : protected:
     234           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<bnd<T>>(*this); }
     235             :   const BoundaryInfo & _bndry_info;
     236             : };
     237             : 
     238             : 
     239             : 
     240             : /**
     241             :  * \returns \p true if the element pointed to is semilocal to (has nodes
     242             :  * shared with an element of) a given processor id.
     243             :  */
     244             : template <typename T>
     245           0 : struct semilocal_pid : predicate<T>
     246             : {
     247           0 :   semilocal_pid(processor_id_type p) : _pid(p) {}
     248           0 :   virtual ~semilocal_pid() = default;
     249             : 
     250             :   // op()
     251           0 :   virtual bool operator()(const T & it) const override { return (*it)->is_semilocal(_pid); }
     252             : 
     253             : protected:
     254           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<semilocal_pid<T>>(*this); }
     255             :   const processor_id_type _pid;
     256             : };
     257             : 
     258             : 
     259             : 
     260             : /**
     261             :  * \returns \p true if the element pointed to is face-local to (is on
     262             :  * or has a neighbor on the partition of) a given processor id.
     263             :  */
     264             : template <typename T>
     265           0 : struct facelocal_pid : predicate<T>
     266             : {
     267           0 :   facelocal_pid(processor_id_type p) : _pid(p) {}
     268           0 :   virtual ~facelocal_pid() = default;
     269             : 
     270             :   // op()
     271           0 :   virtual bool operator()(const T & it) const override
     272             :   {
     273           0 :     if ((*it)->processor_id() == _pid)
     274           0 :       return true;
     275           0 :     for (auto n : (*it)->neighbor_ptr_range())
     276           0 :       if (n && n->processor_id() == _pid)
     277           0 :         return true;
     278           0 :     return false;
     279             :   }
     280             : 
     281             : protected:
     282           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<facelocal_pid<T>>(*this); }
     283             :   const processor_id_type _pid;
     284             : };
     285             : 
     286             : 
     287             : 
     288             : /**
     289             :  * \returns \p true if the pointer's processor id does \e not match p.
     290             :  */
     291             : template <typename T>
     292     1174620 : struct not_pid : pid<T>
     293             : {
     294      285588 :   not_pid(processor_id_type p) : pid<T>(p) {}
     295             : 
     296    29167480 :   virtual bool operator()(const T & it) const override { return !pid<T>::operator()(it); }
     297             : 
     298             : protected:
     299     1193036 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_pid<T>>(*this); }
     300             : };
     301             : 
     302             : 
     303             : /**
     304             :  * \returns \p true if the pointer's type matches the given type.  Of
     305             :  * course, this one can only be instantiated for objects which return
     306             :  * Elem pointers when dereferenced.
     307             :  */
     308             : template <typename T>
     309           0 : struct elem_type : predicate<T>
     310             : {
     311           0 :   elem_type (ElemType t) : _elem_type(t) {}
     312           0 :   virtual ~elem_type() = default;
     313             : 
     314           0 :   virtual bool operator()(const T & it) const override { return (*it)->type() == _elem_type; }
     315             : 
     316             : protected:
     317           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<elem_type<T>>(*this); }
     318             :   const ElemType _elem_type;
     319             : };
     320             : 
     321             : 
     322             : 
     323             : #ifdef LIBMESH_ENABLE_AMR
     324             : /**
     325             :  * \returns \p true if the pointer's refinement flag matches the given
     326             :  * rflag.  Of course, this one can only be instantiated for objects
     327             :  * which return Elem pointers when dereferenced.
     328             :  */
     329             : template <typename T>
     330        9312 : struct flagged : predicate<T>
     331             : {
     332        2328 :   flagged (unsigned char rflag) : _rflag(rflag) {}
     333       11680 :   virtual ~flagged() = default;
     334             : 
     335      212872 :   virtual bool operator()(const T & it) const override { return (*it)->refinement_flag() == _rflag; }
     336             : 
     337             : protected:
     338        9312 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<flagged<T>>(*this); }
     339             :   const unsigned char _rflag;
     340             : };
     341             : #endif // LIBMESH_ENABLE_AMR
     342             : 
     343             : 
     344             : 
     345             : 
     346             : 
     347             : 
     348             : /**
     349             :  * \returns \p true if the pointer's level matches the given level.
     350             :  */
     351             : template <typename T>
     352    13833236 : struct level : predicate<T>
     353             : {
     354     3567748 :   level (unsigned int l) : _level(l) {}
     355    17807336 :   virtual ~level() = default;
     356             : 
     357   628408476 :   virtual bool operator()(const T & it) const override { return (*it)->level() == _level; }
     358             : 
     359             : protected:
     360    13878292 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<level<T>>(*this); }
     361             :   const unsigned int _level;
     362             : };
     363             : 
     364             : 
     365             : 
     366             : /**
     367             :  * \returns \p true if the pointers level _does not_ match the given
     368             :  * level.
     369             :  */
     370             : template <typename T>
     371           0 : struct not_level : level<T>
     372             : {
     373           0 :   not_level(unsigned int l) : level<T>(l) {}
     374             : 
     375           0 :   virtual bool operator()(const T & it) const override { return !level<T>::operator()(it); }
     376             : 
     377             : protected:
     378           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<not_level<T>>(*this); }
     379             : };
     380             : 
     381             : 
     382             : 
     383             : 
     384             : /**
     385             :  * \returns \p true if the pointer has any \p nullptr neighbors.
     386             :  */
     387             : template <typename T>
     388             : struct null_neighbor : predicate<T>
     389             : {
     390             :   virtual ~null_neighbor() = default;
     391             :   virtual bool operator()(const T & it) const override
     392             :   {
     393             :     return (*it)->on_boundary();
     394             :   }
     395             : 
     396             : protected:
     397             :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<null_neighbor<T>>(*this); }
     398             : };
     399             : 
     400             : 
     401             : 
     402             : /**
     403             :  * \returns \p side_on_boundary().
     404             :  *
     405             :  * This predicate simply forwards the work of determining whether a
     406             :  * particular side is on the boundary to the iterator itself, which
     407             :  * has more information.
     408             :  */
     409             : template <typename T>
     410           0 : struct boundary_side : predicate<T>
     411             : {
     412           0 :   virtual ~boundary_side() = default;
     413           0 :   virtual bool operator()(const T & it) const override
     414             :   {
     415           0 :     return it.side_on_boundary();
     416             :   }
     417             : 
     418             : protected:
     419           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<boundary_side<T>>(*this); }
     420             : };
     421             : 
     422             : /**
     423             :  * \returns \p true if the pointer's \p subdomain_id() matches a given
     424             :  * id.
     425             :  */
     426             : template <typename T>
     427       24798 : struct subdomain : predicate<T>
     428             : {
     429        7426 :   subdomain(subdomain_id_type sid) : _subdomain(sid) {}
     430       34080 :   virtual ~subdomain() = default;
     431             : 
     432             :   // op()
     433       47981 :   virtual bool operator()(const T & it) const override { return (*it)->subdomain_id() == _subdomain; }
     434             : 
     435             : protected:
     436       24798 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<subdomain<T>>(*this); }
     437             :   const subdomain_id_type _subdomain;
     438             : };
     439             : 
     440             : 
     441             : /**
     442             :  * \returns \p true if the pointer's \p subdomain_id() is in the
     443             :  * provided \p std::set<subdomain_id_type>.
     444             :  */
     445             : template <typename T>
     446           0 : struct subdomain_set : predicate<T>
     447             : {
     448           0 :   subdomain_set(std::set<subdomain_id_type> sset) : _subdomain_set(sset) {}
     449           0 :   virtual ~subdomain_set() = default;
     450             : 
     451             :   // op()
     452           0 :   virtual bool operator()(const T & it) const override { return _subdomain_set.count((*it)->subdomain_id()); }
     453             : 
     454             : protected:
     455           0 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<subdomain_set<T>>(*this); }
     456             :   const std::set<subdomain_id_type> _subdomain_set;
     457             : };
     458             : 
     459             : 
     460             : /**
     461             :  * \returns \p true if the pointer (which must be a non-null dof object) has
     462             :  * degrees of freedom which can be evaluated for the specified DofMap
     463             :  * and variable.
     464             :  */
     465             : template <typename T>
     466        1704 : struct evaluable : predicate<T>
     467             : {
     468         852 :   evaluable(const DofMap & dof_map,
     469             :             unsigned int var_num) :
     470         852 :     _dof_map(dof_map), _var_num(var_num) {}
     471        2628 :   virtual ~evaluable() = default;
     472             : 
     473             :   // op()
     474             :   virtual bool operator()(const T & it) const override;
     475             : 
     476             : protected:
     477        1704 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<evaluable<T>>(*this); }
     478             :   const DofMap & _dof_map;
     479             :   unsigned int _var_num;
     480             : };
     481             : 
     482             : /**
     483             :  * \returns \p true if the pointer (which must be a non-null dof object) has
     484             :  * degrees of freedom which can be evaluated for all variables in all the provided
     485             :  * \p DofMaps
     486             :  */
     487             : template <typename T>
     488         276 : struct multi_evaluable : predicate<T>
     489             : {
     490         142 :   multi_evaluable(std::vector<const DofMap *> dof_maps) :
     491         142 :       _dof_maps(dof_maps) {}
     492         450 :   virtual ~multi_evaluable() = default;
     493             : 
     494             :   // op()
     495             :   virtual bool operator()(const T & it) const override;
     496             : 
     497             : protected:
     498         284 :   virtual std::unique_ptr<predicate<T>> clone() const override { return std::make_unique<multi_evaluable<T>>(*this); }
     499             :   std::vector<const DofMap *> _dof_maps;
     500             : };
     501             : 
     502             : 
     503             : } // namespace Predicates
     504             : 
     505             : 
     506             : } // namespace libMesh
     507             : 
     508             : #endif // LIBMESH_SINGLE_PREDICATES_H

Generated by: LCOV version 1.14