LCOV - code coverage report
Current view: top level - src/problems - FFTProblem.C (source / functions) Hit Total Coverage
Test: idaholab/magpie: 5710af Lines: 43 44 97.7 %
Date: 2025-07-21 23:34:39 Functions: 4 4 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /**********************************************************************/
       2             : /*                     DO NOT MODIFY THIS HEADER                      */
       3             : /* MAGPIE - Mesoscale Atomistic Glue Program for Integrated Execution */
       4             : /*                                                                    */
       5             : /*            Copyright 2017 Battelle Energy Alliance, LLC            */
       6             : /*                        ALL RIGHTS RESERVED                         */
       7             : /**********************************************************************/
       8             : 
       9             : #include "FFTProblem.h"
      10             : #include "FFTBufferBase.h"
      11             : #include "MooseFFTVariable.h"
      12             : 
      13             : #include "libmesh/system.h"
      14             : 
      15             : registerMooseObject("MagpieApp", FFTProblem);
      16             : 
      17             : InputParameters
      18          18 : FFTProblem::validParams()
      19             : {
      20          18 :   InputParameters params = FEProblem::validParams();
      21          18 :   params.addClassDescription("Enhanced FEProblem that supports FFT buffers as variables.");
      22          18 :   params.set<bool>("skip_nl_system_check") = true;
      23          18 :   return params;
      24           0 : }
      25             : 
      26           9 : FFTProblem::FFTProblem(const InputParameters & parameters)
      27           9 :   : FEProblem(parameters), _fft_dummy_system(*this, "FFTSystem")
      28             : {
      29           9 :   const auto soln_tag = getVectorTagID(Moose::SOLUTION_TAG);
      30           9 :   _fft_dummy_system.associateVectorToTag(*_fft_dummy_system.system().current_local_solution,
      31             :                                          soln_tag);
      32           9 : }
      33             : 
      34             : bool
      35         771 : FFTProblem::hasVariable(const std::string & var_name) const
      36             : {
      37             :   // first check for FFT buffers
      38             :   std::vector<UserObject *> objs;
      39        1542 :   theWarehouse().query().condition<AttribThread>(0).condition<AttribName>(var_name).queryInto(objs);
      40         771 :   if (!objs.empty() && dynamic_cast<FFTBufferBase<Real> *>(objs[0]))
      41             :   {
      42          18 :     mooseInfo("hasVariable returned true for '", var_name, "' for FFTBuffer");
      43             :     return true;
      44             :   }
      45             : 
      46             :   // fall back to regular variable
      47         753 :   if (FEProblem::hasVariable(var_name))
      48             :     return true;
      49             : 
      50             :   return false;
      51             : }
      52             : 
      53             : MooseVariableFEBase &
      54        1185 : FFTProblem::getVariable(THREAD_ID tid,
      55             :                         const std::string & var_name,
      56             :                         Moose::VarKindType expected_var_type,
      57             :                         Moose::VarFieldType expected_var_field_type)
      58             : {
      59             :   // first check for FFT buffers
      60             :   std::vector<UserObject *> objs;
      61        2370 :   theWarehouse().query().condition<AttribThread>(0).condition<AttribName>(var_name).queryInto(objs);
      62        1185 :   if (!objs.empty() && dynamic_cast<FFTBufferBase<Real> *>(objs[0]))
      63             :   {
      64          18 :     mooseInfo("getVariable is returning a dummy object for '", var_name, "' for FFTBuffer");
      65             : 
      66          18 :     auto & varlist = _fft_vars[var_name];
      67             : 
      68             :     // add dummy name into the dummy system
      69             :     unsigned int fft_var_number;
      70          18 :     if (varlist.empty())
      71           3 :       fft_var_number = _fft_dummy_system.system().add_variable(var_name, CONSTANT, MONOMIAL);
      72             :     else
      73          15 :       fft_var_number = _fft_dummy_system.system().variable_number(var_name);
      74             : 
      75          18 :     if (varlist.size() <= tid)
      76           3 :       varlist.resize(tid + 1);
      77             : 
      78          18 :     if (!varlist[tid])
      79             :     {
      80           3 :       auto params = MooseVariableBase::validParams();
      81           6 :       params.set<MooseEnum>("order") = "CONSTANT";
      82           6 :       params.set<MooseEnum>("family") = "MONOMIAL";
      83           3 :       params.set<unsigned int>("_var_num") = fft_var_number;
      84           3 :       params.set<THREAD_ID>("tid") = tid;
      85           3 :       params.set<THREAD_ID>("_tid") = tid;
      86           3 :       params.set<Moose::VarKindType>("_var_kind") = Moose::VarKindType::VAR_AUXILIARY;
      87           3 :       params.set<SystemBase *>("_system_base") = &_fft_dummy_system;
      88           3 :       params.set<MooseApp *>("_moose_app") = &_app;
      89           3 :       params.set<std::string>("_type") = "MooseFFTVariable";
      90           3 :       params.set<std::string>("_object_name") = var_name;
      91           3 :       params.set<FEProblemBase *>("_fe_problem_base") = this;
      92           3 :       params.finalize(""); // empty syntax here; this is produced internally
      93             : 
      94           3 :       varlist[tid] = std::make_unique<MooseFFTVariable>(params);
      95           3 :     }
      96             : 
      97          18 :     return *varlist[tid];
      98             :   }
      99             : 
     100        1167 :   return FEProblem::getVariable(tid, var_name, expected_var_type, expected_var_field_type);
     101             : }

Generated by: LCOV version 1.14