diff --git a/MANIFEST.in b/MANIFEST.in index 4dce7559..e7f862ca 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,4 @@ +include _build_system/*.py include mfem/*/*.i include mfem/*/*.cxx include mfem/*/*.h diff --git a/mfem/__init__.py b/mfem/__init__.py index 2744e015..a0a8fd59 100644 --- a/mfem/__init__.py +++ b/mfem/__init__.py @@ -20,5 +20,5 @@ def debug_print(message): print(message) -__version__ = '4.8.0' +__version__ = '4.8.0.1rc1' diff --git a/mfem/_par/bilininteg.i b/mfem/_par/bilininteg.i index 3989b825..e8599614 100644 --- a/mfem/_par/bilininteg.i +++ b/mfem/_par/bilininteg.i @@ -9,6 +9,7 @@ #include "../common/pybilininteg.hpp" #include "../common/pyintrules.hpp" #include "../common/pynonlininteg.hpp" +#include "../common/pylininteg.hpp" #include "numpy/arrayobject.h" //using namespace mfem; %} @@ -48,4 +49,3 @@ import_array(); %feature("director") mfem::PyBilinearFormIntegrator; %include "../common/pybilininteg.hpp" - diff --git a/mfem/_par/geom.i b/mfem/_par/geom.i index 73f0ef56..fb3dcfcc 100644 --- a/mfem/_par/geom.i +++ b/mfem/_par/geom.i @@ -41,6 +41,7 @@ namespace mfem{ %ignore Array::Save; %ignore Array::Max; %ignore Array::Min; + %ignore Array::IsConstant; %ignore Array::Print; %ignore Array::Load; } diff --git a/mfem/_par/integrator.i b/mfem/_par/integrator.i new file mode 100644 index 00000000..423e3947 --- /dev/null +++ b/mfem/_par/integrator.i @@ -0,0 +1,29 @@ +// +// Copyright (c) 2020-2025, Princeton Plasma Physics Laboratory, All rights reserved. +// +%module(package="mfem._par") integrator + +%{ +#include "mfem.hpp" +#include "numpy/arrayobject.h" +#include "../common/io_stream.hpp" +#include "../common/pyoperator.hpp" +#include "../common/pycoefficient.hpp" +#include "../common/pyintrules.hpp" +%} + +%include "../common/existing_mfem_headers.i" +#ifdef FILE_EXISTS_FEM_INTEGRATOR + +%init %{ +import_array(); +%} +%include "exception.i" +%include "../common/exception.i" + +%import "intrules.i" + + +%include "fem/integrator.hpp" + +#endif diff --git a/mfem/_par/lininteg.i b/mfem/_par/lininteg.i index b543d00f..196c57b7 100644 --- a/mfem/_par/lininteg.i +++ b/mfem/_par/lininteg.i @@ -14,6 +14,8 @@ #include "../common/pyoperator.hpp" #include "../common/pycoefficient.hpp" #include "../common/pylininteg.hpp" +#include "../common/pynonlininteg.hpp" +#include "../common/pybilininteg.hpp" #include "../common/pyintrules.hpp" #include "numpy/arrayobject.h" %} @@ -46,5 +48,3 @@ import_array(); %feature("director") mfem::PyLinearFormIntegrator; %include "../common/pylininteg.hpp" - - diff --git a/mfem/_par/nonlininteg.i b/mfem/_par/nonlininteg.i index b553400b..7f809a3d 100644 --- a/mfem/_par/nonlininteg.i +++ b/mfem/_par/nonlininteg.i @@ -21,6 +21,7 @@ import_array(); %import operators.i %import fespace.i %import eltrans.i +%import integrator.i %import "../common/exception_director.i" %include "fem/nonlininteg.hpp" diff --git a/mfem/_par/setup.py b/mfem/_par/setup.py index 8993d6d6..c7666d3c 100644 --- a/mfem/_par/setup.py +++ b/mfem/_par/setup.py @@ -126,7 +126,7 @@ def get_extensions(): "submesh", "transfermap", "staticcond", "sidredatacollection", "psubmesh", "ptransfermap", "enzyme", "attribute_sets", "arrays_by_name", - "hyperbolic", "bounds"] + "hyperbolic", "bounds", "integrator"] if mpiinc != '': include_dirs.append(mpiinc) diff --git a/mfem/_ser/bilininteg.i b/mfem/_ser/bilininteg.i index a56f4b3a..a14e52a2 100644 --- a/mfem/_ser/bilininteg.i +++ b/mfem/_ser/bilininteg.i @@ -9,6 +9,7 @@ #include "../common/pybilininteg.hpp" #include "../common/pyintrules.hpp" #include "../common/pynonlininteg.hpp" +#include "../common/pylininteg.hpp" #include "numpy/arrayobject.h" //using namespace mfem; %} diff --git a/mfem/_ser/geom.i b/mfem/_ser/geom.i index 2c8ac12c..8c691eea 100644 --- a/mfem/_ser/geom.i +++ b/mfem/_ser/geom.i @@ -28,6 +28,8 @@ ARRAY_LISTTUPLE_INPUT(mfem::Geometry::Type, PyLong_AsLong) %include "fem/geom.hpp" +%import "../common/array_listtuple_typemap.i" + namespace mfem{ %ignore Array::Union; %ignore Array::Find; @@ -42,6 +44,7 @@ namespace mfem{ %ignore Array::Save; %ignore Array::Max; %ignore Array::Min; + %ignore Array::IsConstant; %ignore Array::Print; %ignore Array::Load; } diff --git a/mfem/_ser/integrator.i b/mfem/_ser/integrator.i new file mode 100644 index 00000000..5ac76e2d --- /dev/null +++ b/mfem/_ser/integrator.i @@ -0,0 +1,29 @@ +// +// Copyright (c) 2020-2025, Princeton Plasma Physics Laboratory, All rights reserved. +// +%module(package="mfem._ser") integrator + +%{ +#include "mfem.hpp" +#include "numpy/arrayobject.h" +#include "../common/io_stream.hpp" +#include "../common/pyoperator.hpp" +#include "../common/pycoefficient.hpp" +#include "../common/pyintrules.hpp" +%} + +%include "../common/existing_mfem_headers.i" +#ifdef FILE_EXISTS_FEM_INTEGRATOR + +%init %{ +import_array(); +%} +%include "exception.i" +%include "../common/exception.i" + +%import "intrules.i" + + +%include "fem/integrator.hpp" + +#endif diff --git a/mfem/_ser/lininteg.i b/mfem/_ser/lininteg.i index db26f761..2fef3d44 100644 --- a/mfem/_ser/lininteg.i +++ b/mfem/_ser/lininteg.i @@ -14,6 +14,8 @@ #include "../common/pyoperator.hpp" #include "../common/pycoefficient.hpp" #include "../common/pylininteg.hpp" +#include "../common/pynonlininteg.hpp" +#include "../common/pybilininteg.hpp" #include "../common/pyintrules.hpp" #include "numpy/arrayobject.h" %} @@ -42,5 +44,3 @@ import_array(); %feature("director") mfem::PyLinearFormIntegrator; %include "../common/pylininteg.hpp" - - diff --git a/mfem/_ser/nonlininteg.i b/mfem/_ser/nonlininteg.i index e7a2d90b..0b746101 100644 --- a/mfem/_ser/nonlininteg.i +++ b/mfem/_ser/nonlininteg.i @@ -31,6 +31,7 @@ import_array(); %import "operators.i" %import "fespace.i" %import "eltrans.i" +%import "integrator.i" %import "../common/exception_director.i" %include "fem/nonlininteg.hpp" diff --git a/mfem/_ser/setup.py b/mfem/_ser/setup.py index 3d282a67..86b0c81a 100644 --- a/mfem/_ser/setup.py +++ b/mfem/_ser/setup.py @@ -110,7 +110,7 @@ def get_extensions(): "attribute_sets", "arrays_by_name", "hyperbolic", "complex_densemat", "complexstaticcond", "complexweakform", - "bounds"] + "bounds", "integrator"] if add_cuda == '1': from setup_local import cudainc diff --git a/mfem/common/array_instantiation_macro.i b/mfem/common/array_instantiation_macro.i index f31288eb..7026bc99 100644 --- a/mfem/common/array_instantiation_macro.i +++ b/mfem/common/array_instantiation_macro.i @@ -323,10 +323,13 @@ INSTANTIATE_ARRAY2(XXX, YYY, YYY, USEPTR) %ignore mfem::Array::Save; %ignore mfem::Array::Max; %ignore mfem::Array::Min; +%ignore mfem::Array::IsConstant; %ignore mfem::Array::Print; %ignore mfem::Array::PrintGZ; %ignore mfem::Array::SaveGZ; %ignore mfem::Array::Load; +%ignore mfem::Array2D::Min; +%ignore mfem::Array2D::Max; %ignore mfem::Array2D::Print; %ignore mfem::Array2D::PrintGZ; %ignore mfem::Array2D::SaveGZ; @@ -340,6 +343,7 @@ INSTANTIATE_ARRAY2(XXX, YYY, YYY, USEPTR) %ignore mfem::Array::Abs; %ignore mfem::Array::Sum; %ignore mfem::Array::IsSorted; +%ignore mfem::Array::IsConstant; %ignore mfem::Array::Save; %ignore mfem::Array::Max; %ignore mfem::Array::Min; diff --git a/mfem/common/bilininteg_ext.i b/mfem/common/bilininteg_ext.i index a1ad7e45..0929cdc1 100644 --- a/mfem/common/bilininteg_ext.i +++ b/mfem/common/bilininteg_ext.i @@ -1,6 +1,3 @@ -// -// Copyright (c) 2020-2025, Princeton Plasma Physics Laboratory, All rights reserved. -// namespace mfem { %pythonappend BilinearFormIntegrator::BilinearFormIntegrator %{ self._coeff = args @@ -310,6 +307,10 @@ namespace mfem { self._coeff = vc %} +%pythonappend PyBilinearFormIntegrator::PyBilinearFormIntegrator %{ + self._ir=ir +%} + %pythonappend SumIntegrator::AddIntegrator %{ if self.own_integs == 1: integ.thisown = 0 %} diff --git a/mfem/common/generate_bilininteg_ext.py b/mfem/common/generate_bilininteg_ext.py index 06d88270..0d02825d 100644 --- a/mfem/common/generate_bilininteg_ext.py +++ b/mfem/common/generate_bilininteg_ext.py @@ -7,33 +7,34 @@ cname = (line.split(' ')[1]).split('(')[0] if line.startswith(" def __init__"): - pp = "" + pp = [] + if line.find(", ir=None") != -1: + line = line.replace(", ir=None", "") + pp.append(" self._ir=ir") if line.find("*args") != -1: - pp = " self._coeff = args" + pp.append(" self._coeff = args") elif line.find("own_bfi_") != -1: - pp = " if own_bfi_ == 1: bfi_.thisown = 0" + pp.append(" if own_bfi_ == 1: bfi_.thisown = 0") elif line.find("integ, own_integ=1") != -1: - pp = " if own_integ == 1: integ.thisown = 0" + pp.append(" if own_integ == 1: integ.thisown = 0") elif line.find("own_integs=1") != -1: - pp = " self.own_integs = own_integs" + pp.append(" self.own_integs = own_integs") elif line.find(", vq)") != -1: - pp = " self._coeff = vq" + pp.append(" self._coeff = vq") elif line.find(", q)") != -1: - pp = " self._coeff = q" + pp.append(" self._coeff = q") elif line.find(", q, a=1.0)") != -1: - pp = " self._coeff = q" + pp.append(" self._coeff = q") elif line.find(", q, i") != -1: - pp = " self._coeff = q" + pp.append(" self._coeff = q") elif line.find(", sc)") != -1: - pp = " self._coeff = sc" + pp.append(" self._coeff = sc") elif line.find(", vc)") != -1: - pp = " self._coeff = vc" + pp.append(" self._coeff = vc") elif line.find("parent_, i_, j_") != -1: - pp = " self._coeff = parent_" + pp.append(" self._coeff = parent_") elif line.find("(self)") != -1: pass - elif line.find("(self, ir=None)") != -1: - pass elif line.find("(self, fes, e=1.0)") != -1: pass elif line.find("(self, vdim_=1)") != -1: @@ -44,9 +45,11 @@ print(cname) print(line) assert False, "No recipt for this pattern " - if pp != "": + + if len(pp) > 0: out.append("%pythonappend " + cname + "::" + cname + " %{") - out.append(pp) + for x in pp: + out.append(x) out.append("%}") out.append("") fid.close() diff --git a/mfem/common/generate_lininteg_ext.py b/mfem/common/generate_lininteg_ext.py index 6d3c272d..07d469e0 100644 --- a/mfem/common/generate_lininteg_ext.py +++ b/mfem/common/generate_lininteg_ext.py @@ -7,42 +7,43 @@ cname = (line.split(' ')[1]).split('(')[0] if line.startswith(" def __init__"): - pp = "" + pp = [] + if line.find(", ir=None") != -1: + line = line.replace(", ir=None", "") + pp.append(" self._ir=ir") if line.find("*args") != -1: - pp = " self._coeff = args" + pp.append(" self._coeff = args") elif line.find("self, seed_=0") != -1: - pp = " self._coeff = QG" - elif line.find("self, vqfc, ir") != -1: - pp = " self._coeff = (vqfc, ir)" - elif line.find("self, qfc, ir") != -1: - pp = " self._coeff = (qfc, ir)" + pp.append(" self._coeff = QG") + elif line.find("self, vqfc") != -1: + pp.append(" self._coeff = vqfc") + elif line.find("self, qfc") != -1: + pp.append(" self._coeff = qfc") elif line.find(", QG") != -1: - pp = " self._coeff = QG" + pp.append(" self._coeff = QG") elif line.find(", QF)") != -1: - pp = " self._coeff = QF" + pp.append(" self._coeff = QF") elif line.find(", F)") != -1: - pp = " self._coeff = F" + pp.append(" self._coeff = F") elif line.find(", f)") != -1: - pp = " self._coeff = f" - elif line.find(", f, s=1.0, ir=None)") != -1: - pp = " self._coeff = (f, ir)" + pp.append(" self._coeff = f") + elif line.find(", f, s=1.0)") != -1: + pp.append(" self._coeff = f") elif line.find(", uD_, lambda_, mu_, alpha_, kappa_)") != -1: - pp = " self._coeff = uD_" + pp.append(" self._coeff = uD_") elif line.find("(self)") != -1: pass - elif line.find("(self, ir=None)") != -1: - pass else: print(cname) print(line) assert False, "No recipt for this pattern " - if pp != "": + if len(pp) > 0: out.append("%pythonappend " + cname + "::" + cname + " %{") - out.append(pp) + for x in pp: + out.append(x) out.append("%}") fid.close() out.append("}") - fid = open("lininteg_ext.i", "w") fid.write("\n".join(out)) fid.close() diff --git a/mfem/common/lininteg_ext.i b/mfem/common/lininteg_ext.i index e083d5af..7e02196b 100644 --- a/mfem/common/lininteg_ext.i +++ b/mfem/common/lininteg_ext.i @@ -1,6 +1,3 @@ -// -// Copyright (c) 2020-2025, Princeton Plasma Physics Laboratory, All rights reserved. -// namespace mfem { %pythonappend LinearFormIntegrator::LinearFormIntegrator %{ self._coeff = args @@ -24,6 +21,7 @@ namespace mfem { self._coeff = QG %} %pythonappend VectorDomainLFIntegrator::VectorDomainLFIntegrator %{ + self._ir=ir self._coeff = QF %} %pythonappend VectorDomainLFGradIntegrator::VectorDomainLFGradIntegrator %{ @@ -42,7 +40,8 @@ namespace mfem { self._coeff = QF %} %pythonappend VectorBoundaryFluxLFIntegrator::VectorBoundaryFluxLFIntegrator %{ - self._coeff = (f, ir) + self._ir=ir + self._coeff = f %} %pythonappend VectorFEBoundaryFluxLFIntegrator::VectorFEBoundaryFluxLFIntegrator %{ self._coeff = args @@ -66,9 +65,14 @@ namespace mfem { self._coeff = QG %} %pythonappend VectorQuadratureLFIntegrator::VectorQuadratureLFIntegrator %{ - self._coeff = (vqfc, ir) + self._ir=ir + self._coeff = vqfc %} %pythonappend QuadratureLFIntegrator::QuadratureLFIntegrator %{ - self._coeff = (qfc, ir) + self._ir=ir + self._coeff = qfc +%} +%pythonappend PyLinearFormIntegrator::PyLinearFormIntegrator %{ + self._ir=ir %} } \ No newline at end of file diff --git a/mfem/par.py b/mfem/par.py index 792b3d7c..4ad2d5d3 100644 --- a/mfem/par.py +++ b/mfem/par.py @@ -96,6 +96,9 @@ from mfem._par.ptransfermap import * from mfem._par.hyperbolic import * +from mfem._par.bounds import * +from mfem._par.integrator import * + try: from mfem._par.gslib import * except: diff --git a/mfem/ser.py b/mfem/ser.py index 24eaa32b..a66f05e0 100644 --- a/mfem/ser.py +++ b/mfem/ser.py @@ -74,6 +74,9 @@ from mfem._ser.doftrans import * from mfem._ser.std_vectors import * +from mfem._ser.bounds import * +from mfem._ser.integrator import * + try: from mfem._ser.complex_densemat import * except ImportError: