LCOV - code coverage report
Current view: top level - include/physics - diff_qoi.h (source / functions) Hit Total Coverage
Test: libMesh/libmesh: #4476 (4beb67) with base a68cc6 Lines: 7 12 58.3 %
Date: 2026-06-03 20:22:46 Functions: 3 9 33.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // The libMesh Finite Element Library.
       2             : // Copyright (C) 2002-2026 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             : 
      19             : 
      20             : #ifndef LIBMESH_DIFF_QOI_H
      21             : #define LIBMESH_DIFF_QOI_H
      22             : 
      23             : // Local Includes
      24             : #include "libmesh/diff_context.h"
      25             : 
      26             : // C++ includes
      27             : #include <memory>
      28             : 
      29             : namespace libMesh
      30             : {
      31             : 
      32             : // Forward declarations
      33             : class DiffContext;
      34             : class QoISet;
      35             : 
      36             : namespace Parallel {
      37             :   class Communicator;
      38             : }
      39             : 
      40             : /**
      41             :  * This class provides a specific system class.  It aims
      42             :  * to generalize any system, linear or nonlinear, which
      43             :  * provides both a residual and a Jacobian.
      44             :  *
      45             :  * This class is part of the new DifferentiableSystem framework,
      46             :  * which is still experimental.  Users of this framework should
      47             :  * beware of bugs and future API changes.
      48             :  *
      49             :  * \author Roy H. Stogner
      50             :  * \date 2006
      51             :  */
      52             : class DifferentiableQoI
      53             : {
      54             : public:
      55             : 
      56             :   /**
      57             :    * Constructor.  Optionally initializes required
      58             :    * data structures.
      59             :    */
      60             :   DifferentiableQoI ();
      61             : 
      62             :   /**
      63             :    * Destructor.
      64             :    */
      65        2346 :   virtual ~DifferentiableQoI () = default;
      66             : 
      67             :   /**
      68             :    * Initialize system qoi.  Often this will just call
      69             :    * sys.init_qois(some_desired_number_of_qois)
      70             :    */
      71           0 :   virtual void init_qoi_count( System & /*sys*/){}
      72             : 
      73             :   /**
      74             :    * Clear all the data structures associated with
      75             :    * the QoI.
      76             :    */
      77           0 :   virtual void clear_qoi () {}
      78             : 
      79             :   /**
      80             :    * If \p assemble_qoi_sides is true (it is false by default), the
      81             :    * assembly loop for a quantity of interest or its derivatives will
      82             :    * loop over domain boundary sides.  To add domain interior sides,
      83             :    * also set assemble_qoi_internal_sides to true.
      84             :    */
      85             :   bool assemble_qoi_sides;
      86             : 
      87             :   /**
      88             :    * If \p assemble_qoi_internal_sides is true (it is false by
      89             :    * default), the assembly loop for a quantity of interest or its
      90             :    * derivatives will loop over element sides which do not fall on
      91             :    * domain boundaries.
      92             :    */
      93             :   bool assemble_qoi_internal_sides;
      94             : 
      95             :   /**
      96             :    * If \p assemble_qoi_elements is false (it is true by default), the
      97             :    * assembly loop for a quantity of interest or its derivatives will
      98             :    * skip computing on mesh elements, and will only compute on mesh
      99             :    * sides.
     100             :    */
     101             :   bool assemble_qoi_elements;
     102             : 
     103             :   /**
     104             :    * Does any work that needs to be done on \p elem in a quantity of
     105             :    * interest assembly loop, outputting to elem_qoi.
     106             :    *
     107             :    * Only qois included in the supplied \p QoISet need to be
     108             :    * assembled.
     109             :    */
     110    11799030 :   virtual void element_qoi (DiffContext &,
     111             :                             const QoISet &)
     112    11799030 :   {}
     113             : 
     114             :   /**
     115             :    * Does any work that needs to be done on \p elem in a quantity of
     116             :    * interest derivative assembly loop, outputting to
     117             :    * elem_qoi_derivative
     118             :    *
     119             :    * Only qois included in the supplied \p QoISet need their
     120             :    * derivatives assembled.
     121             :    */
     122       64583 :   virtual void element_qoi_derivative (DiffContext &,
     123             :                                        const QoISet &)
     124       64583 :   {}
     125             : 
     126             :   /**
     127             :    * Does any work that needs to be done on \p side of \p elem in a
     128             :    * quantity of interest assembly loop, outputting to elem_qoi.
     129             :    *
     130             :    * Only qois included in the supplied \p QoISet need to be
     131             :    * assembled.
     132             :    */
     133           0 :   virtual void side_qoi (DiffContext &,
     134             :                          const QoISet &)
     135           0 :   {}
     136             : 
     137             :   /**
     138             :    * Does any work that needs to be done on \p side of \p elem in a
     139             :    * quantity of interest derivative assembly loop, outputting to
     140             :    * elem_qoi_derivative.
     141             :    *
     142             :    * Only qois included in the supplied \p QoISet need their
     143             :    * derivatives assembled.
     144             :    */
     145        6160 :   virtual void side_qoi_derivative (DiffContext &,
     146             :                                     const QoISet &)
     147        6160 :   {}
     148             : 
     149             :   /**
     150             :    * Prepares the result of a build_context() call for use.
     151             :    *
     152             :    * FEMSystem-based problems will need to reimplement this in order to
     153             :    * call FE::get_*() as their particular QoI requires.  Trying to
     154             :    * evaluate a QoI without overriding init_context is both
     155             :    * inefficient and deprecated.
     156             :    */
     157           0 :   virtual void init_context(DiffContext &) { libmesh_deprecated(); }
     158             : 
     159             :   /**
     160             :    * Copy of this object. User should override to copy any needed state.
     161             :    */
     162             :   virtual std::unique_ptr<DifferentiableQoI> clone() =0;
     163             : 
     164             :   /**
     165             :    * Method to combine thread-local qois. By default, simply sums thread qois.
     166             :    */
     167             :   virtual void thread_join(std::vector<Number> & qoi,
     168             :                            const std::vector<Number> & other_qoi,
     169             :                            const QoISet & qoi_indices);
     170             : 
     171             :   /**
     172             :    * Method to populate system qoi data structure with process-local qoi. By default, simply
     173             :    * sums process qois into system qoi.
     174             :    */
     175             :   virtual void parallel_op(const Parallel::Communicator & communicator,
     176             :                            std::vector<Number> & sys_qoi,
     177             :                            std::vector<Number> & local_qoi,
     178             :                            const QoISet & qoi_indices);
     179             : 
     180             :   /**
     181             :    * Method to finalize qoi derivatives which require more than just a simple
     182             :    * sum of element contributions.
     183             :    */
     184             :   virtual void finalize_derivative(NumericVector<Number> & derivatives, std::size_t qoi_index);
     185             : };
     186             : 
     187             : } // namespace libMesh
     188             : 
     189             : 
     190             : #endif // LIBMESH_DIFF_QOI_H

Generated by: LCOV version 1.14