Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
27d814c
Declare block vectors and arrays in header
karthichockalingam Aug 13, 2025
96c4e74
Pass grid function and block offset to BuildEquationSystem
karthichockalingam Oct 16, 2025
4ffa664
apply essential bcs at dofs
karthichockalingam Aug 14, 2025
ef58038
copy vector to blockvector
karthichockalingam Aug 14, 2025
b853c2d
apply essential bc in mult
karthichockalingam Aug 14, 2025
b6e2d9e
Replace copy vec with dynamic cast to block vector
karthichockalingam Aug 14, 2025
8fc6637
Raplace applyDirchValues with ApplyEssVals
karthichockalingam Aug 15, 2025
203b514
Update jacobian in Mult
karthichockalingam Aug 20, 2025
2d9402e
Update time derivative essential constraints
karthichockalingam Aug 23, 2025
3c9302f
Call update time derivative essential bc in TimeDomainEquationSystemP…
karthichockalingam Aug 23, 2025
78e1878
Add Newton Mult to TimeDependentEquationSystem
karthichockalingam Aug 24, 2025
634ba67
replace bc_x with _dvardt_ess_constraints
karthichockalingam Sep 2, 2025
2c822c4
Move ApplyEssentialBCs from BuildLinearFroms to EquationSystemProblem…
karthichockalingam Sep 2, 2025
1b03da4
Using _var_ess_constraints for transient problems
karthichockalingam Sep 2, 2025
05f730a
Made UpdateEssDerivativeVals member function of TimeDependentEquation…
karthichockalingam Sep 2, 2025
ff10dec
Having one mult for EquationSystem and TimeDependentEquationSystem
karthichockalingam Sep 2, 2025
20bb916
loop over _trial_var_names to populate _test_pfespaces
karthichockalingam Sep 2, 2025
f458dc6
Add DomainLFGradKernel
karthichockalingam Sep 11, 2025
3212858
Add MFEMGradientGridFunction
karthichockalingam Sep 11, 2025
3249082
Use zero_vec instead of _true_rhs in problem operator
karthichockalingam Sep 14, 2025
526640b
Compute residual using linearform
karthichockalingam Sep 14, 2025
5061472
Forming residual from linearforms
karthichockalingam Sep 18, 2025
7a9a018
Add NLActionIntegrators to EquationSystems and Kernels
karthichockalingam Sep 22, 2025
813206e
Changes to MFEMDomainLFGradKernel
karthichockalingam Sep 22, 2025
de47608
Incorporate non-linear solve in EquationSystem::Mult
karthichockalingam Sep 22, 2025
72f462a
Example input file to test NL solve using MFEMDomainLFGradKernel
karthichockalingam Sep 22, 2025
e1309ce
Separate nonlinearactions from linearforms
karthichockalingam Sep 23, 2025
0ba456c
Repair on forcing term sign
karthichockalingam Sep 23, 2025
1519e85
Add the jacobian contribution to MFEMDomainLFGradKernel for a problem…
karthichockalingam Sep 24, 2025
dd93bcd
(1) Added aux vector for b contribution (2) Dropped bilinear contribu…
karthichockalingam Sep 30, 2025
229bb0c
Add MixedScalarWeakDivergenceKernel
karthichockalingam Sep 30, 2025
dd242f2
Add input file for non-linear problem but not working
karthichockalingam Sep 30, 2025
4de2d80
Fix the sign on b
karthichockalingam Oct 7, 2025
7862ba7
Bug fix: Changed to use sol instead of _trueBlockSol in _jacobian->Ad…
karthichockalingam Oct 8, 2025
22e3efa
Dropped ApplyEssVals
karthichockalingam Oct 9, 2025
2f7e9ce
Take initial condition as initial guess
karthichockalingam Oct 13, 2025
94c90ab
Add newton paramaters from executioner block
karthichockalingam Oct 15, 2025
29d55ea
Change to the inputfile and square.e from mesh
karthichockalingam Oct 22, 2025
bfbe700
remove nldiffusion.i
karthichockalingam Oct 22, 2025
ac37cf1
Rename file from true_nldiffusion.i to nldiffusion.i
karthichockalingam Oct 22, 2025
053d4a5
change output folder name
karthichockalingam Oct 22, 2025
0907f71
Add test for non-linear diffusion
karthichockalingam Oct 22, 2025
79f780d
Fixed typo in MFEMDomainLFGradKernel
karthichockalingam Oct 22, 2025
e4c22e0
Add documentation to kernels and functions
karthichockalingam Oct 22, 2025
63a4a27
Clang formatted #31772
karthichockalingam Oct 22, 2025
d882727
Patch mfem::HypreGMRES/PCG to reset preconditioning matrix
nmnobre Oct 27, 2025
6df4d72
Change default non-linear iteration to one
karthichockalingam Oct 27, 2025
a0e4ae3
Fix for linear and non-linear problems #31772
karthichockalingam Oct 28, 2025
62752f9
Use local gridfunctions in UpdateEssDerivativeVals
karthichockalingam Oct 28, 2025
b6a1b25
Remove CopyVec
karthichockalingam Nov 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# MFEMGradientGridFunction

!if! function=hasCapability('mfem')

## Summary

This is class which can be use as vector cofficients to MFEM problems.

## Overview

`MFEMGradientGridFunction` is intended to allow the specification of `mfem::VectorCoefficient` object to add to the MFEM problem in a manner consistent with the standard MOOSE Materials system.

!if-end!

!else
!include mfem/mfem_warning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# MFEMDomainLFGradKernel

!if! function=hasCapability('mfem')

!syntax description /Kernels/MFEMDomainLFGradKernel

## Overview

Adds the domain integrator for integrating the linear form

!equation
(\vec{f}, \nabla v)_\Omega \,\,\, \forall v \in V

where $v \in H^1$ is the test variable and $\vec{f}$ is a
vector forcing coefficient.

This term arises from the weak form of the forcing term

!equation
-\nabla \cdot \vec{f}

## Example Input File Syntax

!listing mfem/kernels/nldiffusion.i block=/Kernels

!syntax parameters /Kernels/MFEMDomainLFGradKernel

!syntax inputs /Kernels/MFEMDomainLFGradKernel

!syntax children /Kernels/MFEMDomainLFGradKernel

!if-end!

!else
!include mfem/mfem_warning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# MFEMMixedScalarWeakDivergenceKernel

!if! function=hasCapability('mfem')

!syntax description /Kernels/MFEMMixedScalarWeakDivergenceKernel

## Overview

Adds the domain integrator for integrating the bilinear form

!equation
(-\vec{\lambda} u, \nabla v)_\Omega \,\,\, \forall v \in V

where $v \in H^1$ is the test variable and $\vec{\lambda}$ is a
vector forcing coefficient.

This term arises from the weak form of the forcing term

!equation
\nabla \cdot(\vec{\lambda} u)

## Example Input File Syntax

!listing mfem/kernels/nldiffusion.i block=/Kernels

!syntax parameters /Kernels/MFEMMixedScalarWeakDivergenceKernel

!syntax inputs /Kernels/MFEMMixedScalarWeakDivergenceKernel

!syntax children /Kernels/MFEMMixedScalarWeakDivergenceKernel

!if-end!

!else
!include mfem/mfem_warning.md
51 changes: 48 additions & 3 deletions framework/include/mfem/equation_systems/EquationSystem.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,15 @@ class EquationSystem : public mfem::Operator

/// Build linear forms and eliminate constrained DoFs
virtual void BuildLinearForms();
virtual void BuildNonLinearActions();
virtual void ApplyEssentialBCs();
virtual void EliminateCoupledVariables();

/// Build bilinear forms
virtual void BuildBilinearForms();
virtual void BuildMixedBilinearForms();
virtual void BuildEquationSystem();
virtual void BuildEquationSystem(Moose::MFEM::GridFunctions & gridfunctions,
mfem::Array<int> & btoffsets);

/// Form linear system, with essential boundary conditions accounted for
virtual void FormLinearSystem(mfem::OperatorHandle & op,
Expand All @@ -73,6 +75,8 @@ class EquationSystem : public mfem::Operator
mfem::BlockVector & trueX,
mfem::BlockVector & trueRHS);

void UpdateJacobian() const;

/// Build linear system, with essential boundary conditions accounted for
virtual void BuildJacobian(mfem::BlockVector & trueX, mfem::BlockVector & trueRHS);

Expand Down Expand Up @@ -131,7 +135,7 @@ class EquationSystem : public mfem::Operator
// Components of weak form. // Named according to test variable
Moose::MFEM::NamedFieldsMap<mfem::ParBilinearForm> _blfs;
Moose::MFEM::NamedFieldsMap<mfem::ParLinearForm> _lfs;
Moose::MFEM::NamedFieldsMap<mfem::ParNonlinearForm> _nlfs;
Moose::MFEM::NamedFieldsMap<mfem::ParLinearForm> _nlfs;
Moose::MFEM::NamedFieldsMap<Moose::MFEM::NamedFieldsMap<mfem::ParMixedBilinearForm>>
_mblfs; // named according to trial variable

Expand All @@ -153,6 +157,12 @@ class EquationSystem : public mfem::Operator
Moose::MFEM::NamedFieldsMap<
Moose::MFEM::NamedFieldsMap<std::vector<std::shared_ptr<MFEMKernel>>>> & kernels_map);

void ApplyDomainNLActionIntegrators(
const std::string & test_var_name,
std::shared_ptr<mfem::ParLinearForm> form,
Moose::MFEM::NamedFieldsMap<
Moose::MFEM::NamedFieldsMap<std::vector<std::shared_ptr<MFEMKernel>>>> & kernels_map);

template <class FormType>
void ApplyBoundaryBLFIntegrators(
const std::string & trial_var_name,
Expand Down Expand Up @@ -188,8 +198,16 @@ class EquationSystem : public mfem::Operator
Moose::MFEM::NamedFieldsMap<std::vector<std::shared_ptr<MFEMEssentialBC>>> _essential_bc_map;

mutable mfem::OperatorHandle _jacobian;
mutable mfem::Vector _trueRHS;
mutable mfem::BlockVector _trueBlockRHS, _trueBlockSol, _BlockResidual;

Moose::MFEM::GridFunctions * _gfuncs;
mfem::Array<int> * _block_true_offsets;
mfem::Array<int> empty_tdof;

mfem::AssemblyLevel _assembly_level;

bool _non_linear = false;
};

template <class FormType>
Expand Down Expand Up @@ -240,6 +258,30 @@ EquationSystem::ApplyDomainLFIntegrators(
}
}

inline void
EquationSystem::ApplyDomainNLActionIntegrators(
const std::string & test_var_name,
std::shared_ptr<mfem::ParLinearForm> form,
Moose::MFEM::NamedFieldsMap<
Moose::MFEM::NamedFieldsMap<std::vector<std::shared_ptr<MFEMKernel>>>> & kernels_map)
{
if (kernels_map.Has(test_var_name) && kernels_map.Get(test_var_name)->Has(test_var_name))
{
auto kernels = kernels_map.GetRef(test_var_name).GetRef(test_var_name);
for (auto & kernel : kernels)
{
mfem::LinearFormIntegrator * integ = kernel->createNLActionIntegrator();
if (integ != nullptr)
{
_non_linear = true;
kernel->isSubdomainRestricted()
? form->AddDomainIntegrator(std::move(integ), kernel->getSubdomainMarkers())
: form->AddDomainIntegrator(std::move(integ));
}
}
}
}

template <class FormType>
void
EquationSystem::ApplyBoundaryBLFIntegrators(
Expand Down Expand Up @@ -303,7 +345,8 @@ class TimeDependentEquationSystem : public EquationSystem
void AddCoupledVariableNameIfMissing(const std::string & coupled_var_name) override;

virtual void SetTimeStep(mfem::real_t dt);
virtual void UpdateEquationSystem();
virtual void UpdateEquationSystem(Moose::MFEM::GridFunctions & gridfunctions,
mfem::Array<int> & btoffsets);

virtual void AddKernel(std::shared_ptr<MFEMKernel> kernel) override;
virtual void BuildBilinearForms() override;
Expand All @@ -314,6 +357,8 @@ class TimeDependentEquationSystem : public EquationSystem
mfem::BlockVector & truedXdt,
mfem::BlockVector & trueRHS) override;

void UpdateEssDerivativeVals(const mfem::real_t & dt, const mfem::Vector & x_old);

protected:
/// Coefficient for timestep scaling
mfem::ConstantCoefficient _dt_coef;
Expand Down
4 changes: 4 additions & 0 deletions framework/include/mfem/executioners/MFEMProblemSolve.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,10 @@ class MFEMProblemSolve : public SolveObject
protected:
MFEMProblem & _mfem_problem;
std::vector<std::shared_ptr<Moose::MFEM::ProblemOperatorBase>> & _problem_operators;
unsigned int _nl_max_its;
mfem::real_t _nl_abs_tol;
mfem::real_t _nl_rel_tol;
unsigned int _print_level;
};

#endif
32 changes: 32 additions & 0 deletions framework/include/mfem/functions/MFEMGradientGridFunction.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
//* This file is part of the MOOSE framework
//* https://mooseframework.inl.gov
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#ifdef MOOSE_MFEM_ENABLED

#pragma once

#include "MFEMGeneralUserObject.h"

/**
* Declares arbitrary parsed function of position, time, and any number of problem variables.
*/
class MFEMGradientGridFunction : public MFEMGeneralUserObject
{
public:
static InputParameters validParams();

MFEMGradientGridFunction(const InputParameters & parameters);
virtual ~MFEMGradientGridFunction();

protected:
/// grid function variable variable
const VariableName & _var_name;
};

#endif
34 changes: 34 additions & 0 deletions framework/include/mfem/kernels/MFEMDomainLFGradKernel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//* This file is part of the MOOSE framework
//* https://mooseframework.inl.gov
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#ifdef MOOSE_MFEM_ENABLED

#pragma once
#include "MFEMKernel.h"

/**
* \f[
* (f, v)
* \f]
*/
class MFEMDomainLFGradKernel : public MFEMKernel
{
public:
static InputParameters validParams();

MFEMDomainLFGradKernel(const InputParameters & parameters);

virtual mfem::LinearFormIntegrator * createNLActionIntegrator() override;

protected:
mfem::Coefficient & _coef;
mfem::ScalarVectorProductCoefficient * _product_coeff;
};

#endif
1 change: 1 addition & 0 deletions framework/include/mfem/kernels/MFEMKernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class MFEMKernel : public MFEMGeneralUserObject, public MFEMBlockRestrictable

/// Create a new MFEM integrator to apply to the weak form. Ownership managed by the caller.
virtual mfem::LinearFormIntegrator * createLFIntegrator() { return nullptr; }
virtual mfem::LinearFormIntegrator * createNLActionIntegrator() { return nullptr; }
virtual mfem::BilinearFormIntegrator * createBFIntegrator() { return nullptr; }

/// Get name of the test variable labelling the weak form this kernel is added to
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//* This file is part of the MOOSE framework
//* https://mooseframework.inl.gov
//*
//* All rights reserved, see COPYRIGHT for full restrictions
//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
//*
//* Licensed under LGPL 2.1, please see LICENSE for details
//* https://www.gnu.org/licenses/lgpl-2.1.html

#ifdef MOOSE_MFEM_ENABLED

#pragma once
#include "MFEMKernel.h"

/**
* \f[
* (k \vec \nabla u, \vec \nabla v)
* \f]
*/
class MFEMMixedScalarWeakDivergenceKernel : public MFEMKernel
{
public:
static InputParameters validParams();

MFEMMixedScalarWeakDivergenceKernel(const InputParameters & parameters);

virtual mfem::BilinearFormIntegrator * createBFIntegrator() override;

protected:
mfem::Coefficient & _coef;
mfem::ScalarVectorProductCoefficient * _product_coef;
};

#endif
12 changes: 12 additions & 0 deletions framework/include/mfem/problem/MFEMProblem.h
Original file line number Diff line number Diff line change
Expand Up @@ -210,8 +210,20 @@ class MFEMProblem : public ExternalProblem
*/
std::shared_ptr<mfem::ParGridFunction> getGridFunction(const std::string & name);

/**
* set newton solver parameters
*/
void setNewtonParamaters(unsigned int nl_max_its,
mfem::real_t nl_abs_tol,
mfem::real_t nl_rel_tol,
unsigned int print_level);

protected:
MFEMProblemData _problem_data;
unsigned int _nl_max_its;
mfem::real_t _nl_abs_tol;
mfem::real_t _nl_rel_tol;
unsigned int _print_level;
};

#endif
Loading