LCOV - code coverage report
Current view: top level - include/neml2/userobjects - NEML2ModelExecutor.h (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 1 4 25.0 %
Date: 2025-07-17 01:28:37 Functions: 1 4 25.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             : #pragma once
      11             : 
      12             : #include "NEML2ModelInterface.h"
      13             : #include "GeneralUserObject.h"
      14             : #include "NEML2BatchIndexGenerator.h"
      15             : 
      16             : class MOOSEToNEML2;
      17             : 
      18             : /**
      19             :  * NEML2ModelExecutor executes a NEML2 model. The NEML2 input variables and model parameters are
      20             :  * gathered by UserObjects derived from MOOSEToNEML2. This class is derived from GeneralUserObject
      21             :  * and is not threaded. It relies on a NEML2BatchIndexGenerator to generate batch indices.
      22             :  */
      23             : class NEML2ModelExecutor : public NEML2ModelInterface<GeneralUserObject>
      24             : {
      25             : public:
      26             :   /// Parameters that can be specified under the NEML2Action common area
      27             :   static InputParameters actionParams();
      28             : 
      29             :   static InputParameters validParams();
      30             : 
      31             :   NEML2ModelExecutor(const InputParameters & params);
      32             : 
      33             : #ifndef NEML2_ENABLED
      34           0 :   void initialize() override {}
      35           0 :   void execute() override {}
      36           0 :   void finalize() override {}
      37             : #else
      38             :   void initialize() override;
      39             :   void meshChanged() override;
      40             :   void execute() override;
      41             :   void finalize() override;
      42             : 
      43             :   void initialSetup() override;
      44             : 
      45             :   /// Get the batch index for the given element ID
      46             :   std::size_t getBatchIndex(dof_id_type elem_id) const;
      47             : 
      48             :   /// Get a reference(!) to the requested output view
      49             :   const neml2::Tensor & getOutput(const neml2::VariableName & output_name) const;
      50             : 
      51             :   /// Get a reference(!) to the requested output derivative view
      52             :   const neml2::Tensor & getOutputDerivative(const neml2::VariableName & output_name,
      53             :                                             const neml2::VariableName & input_name) const;
      54             : 
      55             :   /// Get a reference(!) to the requested output parameter derivative view
      56             :   const neml2::Tensor & getOutputParameterDerivative(const neml2::VariableName & output_name,
      57             :                                                      const std::string & parameter_name) const;
      58             : 
      59             :   /// check if the output is fully computed and ready to be fetched
      60       77060 :   bool outputReady() const { return _output_ready; }
      61             : 
      62             : protected:
      63             :   /// Register a NEML2 input variable gathered by a gatherer
      64             :   virtual void addGatheredVariable(const UserObjectName &, const neml2::VariableName &);
      65             : 
      66             :   /// Register a NEML2 model parameter gathered by a gatherer
      67             :   virtual void addGatheredParameter(const UserObjectName &, const std::string &);
      68             : 
      69             :   /// Prevent output and derivative retrieval after construction
      70             :   virtual void checkExecutionStage() const final;
      71             : 
      72             :   /// Fill input variables and model parameters using the gatherers
      73             :   virtual void fillInputs();
      74             : 
      75             :   /// Apply the predictor to set current trial state
      76             :   virtual void applyPredictor();
      77             : 
      78             :   /// Perform the material update
      79             :   virtual bool solve();
      80             : 
      81             :   /// Extract output derivatives with respect to input variables and model parameters
      82             :   virtual void extractOutputs();
      83             : 
      84             :   /// Expand tensor shapes if necessary to conformal sizes
      85             :   virtual void expandInputs();
      86             : 
      87             :   /// The NEML2BatchIndexGenerator used to generate the element-to-batch-index map
      88             :   const NEML2BatchIndexGenerator & _batch_index_generator;
      89             : 
      90             :   /// flag that indicates if output data has been fully computed
      91             :   bool _output_ready;
      92             : 
      93             :   /// The model parameters to update (gathered from MOOSE)
      94             :   std::map<std::string, neml2::Tensor> _model_params;
      95             : 
      96             :   /// The input variables of the material model
      97             :   neml2::ValueMap _in;
      98             : 
      99             :   /// The output variables of the material model
     100             :   neml2::ValueMap _out;
     101             : 
     102             :   /// The derivative of the output variables w.r.t. the input variables
     103             :   neml2::DerivMap _dout_din;
     104             : 
     105             :   // set of variables to skip
     106             :   std::set<neml2::VariableName> _skip_vars;
     107             : 
     108             :   // set of gathered NEML2 input variables
     109             :   std::set<neml2::VariableName> _gathered_variable_names;
     110             : 
     111             :   // set of gathered NEML2 model parameters
     112             :   std::set<std::string> _gathered_parameter_names;
     113             : 
     114             :   /// MOOSE data gathering user objects
     115             :   std::vector<const MOOSEToNEML2 *> _gatherers;
     116             : 
     117             :   /// set of output variables that were retrieved (by other objects)
     118             :   mutable neml2::ValueMap _retrieved_outputs;
     119             : 
     120             :   /// set of derivatives that were retrieved (by other objects)
     121             :   mutable neml2::DerivMap _retrieved_derivatives;
     122             : 
     123             :   /// set of parameter derivatives that were retrieved (by other objects)
     124             :   mutable std::map<neml2::VariableName, std::map<std::string, neml2::Tensor>>
     125             :       _retrieved_parameter_derivatives;
     126             : 
     127             : private:
     128             :   /// Whether an error was encountered
     129             :   bool _error;
     130             :   /// Error message
     131             :   std::string _error_message;
     132             : #endif
     133             : };

Generated by: LCOV version 1.14