User-defined variational problems
The principal workflow binds macro/local meshes, declared spaces and user-written
local/global forms with MeshHierarchy, bind_interface and bind_problem.
The local provider receives LocalContext: it supplies the local mesh, native
space binding, supported trace pairings and coordinate maps. The global callback
receives GlobalContext for represented boundary data and additional forms.
assemble and solve reuse the shared compilation, constrained elimination,
ordered assembly and reconstruction owners.
The mathematical operator, physical trace meaning, boundary convention, retained modes and gauge remain explicit. Numbering, incidence signs and supported native coordinate conversions belong to their mesh/space adapters. Scalar, vector and mixed fields use the same contracts.
For the abstract MHM decomposition and local/global interpretation, see Harder and Valentin (2016). The four-block API below also accepts independently declared trial/test forms.
The current contract is a linear system with real coefficients. Nonlinear
iterations and time integration can compose these systems; their update rules
and scientific qualification belong to the application.
Complex formulations use the general realify_operator, realify_vector and
complexify_vector operations, with interleaved real and imaginary coordinates
for each coefficient. This representation applies to every operator block and load.
The provider notebooks give executable scalar and mixed examples. The API gives the complete signatures. The case gallery also documents predefined physical formulations imported from their implementation owners. Their numerical qualification applies to the stated data and spaces, rather than arbitrary variational forms.
Bind spaces before writing the equations
hierarchy = MeshHierarchy(macro_mesh, local_meshes)
interface = bind_interface(skeleton, convention="normal")
def local_equations(local):
space = local.native_space(local_element)
u, v = ufl.TrialFunction(space.space), ufl.TestFunction(space.space)
dx = ufl.Measure("dx", domain=space.mesh)
a = (ufl.inner(K * ufl.grad(u), ufl.grad(v)) + reaction * u * v) * dx
L = source * v * dx
b = local.trace_pairings(lambda phi, ds: phi * v * ds)
c = local.trace_pairings(lambda phi, ds: -phi * u * ds, axis="rows")
local.field("potential", space)
return local.equations(a=a, L=L, b=b, c=c)
problem = bind_problem(
hierarchy, interface, local_equations,
global_equation=global_equation, retained=retained_modes,
)
system = assemble(problem)
solution = solve(system)
potential_fields = solution.field("potential")
This snippet assumes the displayed coefficient symbols are defined on the native domain and the declared operator has no unhandled kernel. A complete runnable example, including a singular local operator and exterior pressure moments, appears in the overview.
retained is the declared mode count per macroelement, either one count for
all selected cells or a tuple following the hierarchy order. The binding derives
coordinate sizes and offsets without solving local problems on the coordinator.
Native trace pairing capabilities have stated geometric/space limits; generic
UFL does not automatically couple unrelated meshes.
For an additional supported global interface form, pass a builder to
global_problem.interface_equation. Its arguments are the native interface
trial/test functions and measure; the adapter transports the assembled form to
the declared face coordinates and retains the complete global layout. Boundary
loads and gauges are separate explicit data.
The built-in native trace adapters support polynomial edges and triangular
faces in 2D and 3D. ComponentTraceSpace(scalar_space, components=3) declares
Cartesian vector values without changing the scalar space's continuity.
TangentialTraceSpace instead uses the declared canonical tangent frame.
Facewise C0 Bernstein coefficients remain shared within their macroface;
PressureTraceSpace and PressureTraceSpace3D also share macrovertices and
macroedges. Native boundary facets must resolve the selected trace partition.
This geometric condition does not replace a method's degree or stability
conditions. On the triangular global integration mesh, subfaces are separate
geometric cells; coefficient embeddings enforce the declared continuity.
Cross-face facet terms are supplied explicitly as additional global blocks.
For already assembled formulations, the same basis is available directly:
from pymhm import project_trace, trace_bilinear_form, trace_linear_form
boundary_load = trace_linear_form(skeleton, prescribed_value, faces=boundary_faces)
boundary_operator = trace_bilinear_form(skeleton, coefficient, faces=boundary_faces)
fixed_coefficients = project_trace(skeleton, prescribed_trace, faces=essential_faces)
These operations integrate the physical scalar/vector value represented by
the trace. They choose no pressure, normal-flux or traction meaning and insert
no incidence sign. The coefficient in trace_bilinear_form can be a scalar or
a matrix in physical value components. Shared nodes accumulate every selected
face contribution; project_trace solves their joint Gram system. The same
operations serve reaction, Robin, impedance and other interface terms.
The custom-space guide shows how to own all numbering, basis and orientation conventions. Fully manual coefficient records remain available below and use the same numerical owners.
Explicit coefficient equations
A provider returns the following four blocks for each local item:
Their coefficient representation is
Rows are test coordinates and columns are trial coordinates. b and c
are independent: the package does not infer an adjoint, sign or physical
boundary variable. dofs maps the columns of \(B_K\) to global trace
coordinates; test_dofs maps the rows of \(C_K\). The maps can differ in order
and length. d has shape (len(test_dofs), len(dofs)) and g has length
len(test_dofs). Omitting test_dofs uses dofs.
from pymhm import Equation, LocalEquations, MultiscaleProblem, solve
def local(cell):
return LocalEquations(
a=[[2.0]], L=[1.0], b=[[1.0]], c=[[-1.0]],
d=[[1.0]], g=[0.0], dofs=[0],
)
problem = MultiscaleProblem(
global_equation=Equation(0, 0),
local_provider=local,
items=[0],
trace_size=1,
coarse_sizes=(0,),
)
solution = solve(problem)
assert abs(solution.trace[0] - 1 / 3) < 1e-14
assert abs(solution.fields[0][0] - 1 / 3) < 1e-14
This is an algebraic illustration, not a discretization study. For invertible \(A_K\), local elimination contributes
The implementation factors the local operator once for the source and coupling
columns. It uses the same checked condensation owner as the established
formulations. A global Equation(a_G, L_G) adds an independent global operator
and load after all local contributions. It can contain cross-cell couplings,
boundary terms or an already assembled facet operator.
If \(P_K\) gathers a cell's trial coordinates and \(Q_K\) gathers its test coordinates, the reduced global equation is
The additional global matrix and vector use the complete reduced coordinate
order: all trace coefficients first, then each item's retained coefficients
in items order. They must have that full shape. Equation(0, 0) denotes
zero additions with dimensions supplied by the problem.
The assembled system is a data object. solve_multiscale_system(system)
solves its declared boundary and gauge problem;
reconstruct_multiscale(system, coordinates) recovers fields from executed
coefficients without another global solve. Its solve and reconstruct
methods delegate to those free functions. with_global_load(system, rhs)
reuses the local responses for a new global balance load while preserving
retained source-compatibility rows. It does not change a local volume source.
For repeated volume sources, preserve the operator and its factors explicitly:
from pymhm import OfflineMultiscaleSystem
with OfflineMultiscaleSystem(system) as offline:
updated = offline.with_loads(local_loads, global_load=additional_global_load)
solution = solve(updated)
local_loads contains one new \(L_K\) in each assembled test-coordinate order.
Optional balance_loads replaces each \(g_K\) in its compiled trace-coordinate
union. global_load replaces the additional global functional, rather than
the complete condensed right-hand side. Local source responses and retained
compatibility rows are recomputed while harmonic lifts and basis matrices are
reused literally. A source-dependent physical gauge is computed from updated
before solving. This operation supplies no time integrator or source projection.
Leaf systems use this cache directly; recursive sources are updated in their
child hierarchy before the parent is assembled. The ordinary factorization
solver argument also permits explicit global factor reuse.
Named fields can combine eliminated, trace and prescribed coordinates. A
FieldDefinition stores the explicit reconstruction
Declare those maps with reconstruction, trace_reconstruction, trace_dofs
and offset in local.field(...), or use the public
pymhm.postprocessing.nodal.nodal_field helper for portable nodal fields.
The trace map uses the stated global coordinates; include any required
orientation in that matrix. This supports hybrid moment reconstructions and
essential-boundary liftings without a method-specific solution object.
solution.field(name) returns a tuple of recovered DiscreteField views, each
using its archived basis. Evaluate a view at physical points with an explicit
cell selection when one-sided interface values are needed:
Field names do not select an operator, gauge or reconstruction formula.
For a hierarchy, solution.field(name, recursive=True) descends into cells
without a definition and returns their recovered leaf fields in deterministic
order. Each view uses the trace vector at its own level. A cell declaring the
field takes precedence over its children, so the result does not duplicate it.
FieldDefinition.basis_matrix exposes an immutable copy when the declared
nodal, modal or native basis has a single polynomial matrix. A composite Piola
basis additionally needs moment maps and orientation matrices; archive the
complete FieldDefinition and its basis_digest for replay. The public
nodal_field, modal_field, piola_field and hdiv_field constructors retain
their executed coordinate contracts and support one-sided evaluation.
Explicit cell owners evaluate only the requested point/cell pairs, with storage
proportional to the number of points. For repeated queries on a planar triangle
mesh, TrianglePointLocator provides a reusable search and validates each
chosen cell's barycentric coordinates.
Formulations composed from the same API
The importable providers under examples/formulations/ state the local spaces,
operators, boundary data and recovery maps. Their main paths compose public
numerical operations with LocalEquations, Equation, assemble and solve.
They require no predefined physical solver or private numerical helper.
| Formulation family | Provider and explicit mathematical ingredients |
|---|---|
| Primal Darcy, tensor diffusion and Cartesian/tetrahedral variants | darcy, tensor_darcy, cartesian_darcy, tetrahedral_darcy: stiffness, signed normal pairings, constant kernel and pressure moment. |
| Mixed Darcy on triangles, tetrahedra, prisms and hexahedra | mixed_darcy, mixed_darcy_3d, mapped_darcy: inverse-material mass, divergence, normal-flux constraints and pressure gauge; trilinear hexahedra use the mapped provider. |
| Analytical metric-quadratic Darcy | analytic_darcy: exact scalar energy and signed face moments, polynomial source response and separate mean-zero nodal source potential. |
| Robin MH | robin: volume and weighted boundary bilinear forms, independently signed trace equations and physical pressure moment. |
| Three-field MH²M | three_field: independent pressure/conormal spaces, moment complement and their L2 pairing. |
| MsHHO | moments, moments_3d: cell/face moments and energy reconstruction, including its trace-dependent field map. |
| Residual Petrov–Galerkin MHM and stationary transport | penalty, scalar, transport, residual_transport, scalar_3d, transport_3d: residual operators, test/trial spaces, stabilization and explicit additional face terms, with declared strong or weak boundary data. |
| Displacement, pressure and weak-stress elasticity | elasticity, tetrahedral_vector, primal_elasticity, weak_stress, vector: strain/compliance operators, rotation or pressure constraints, rigid modes and their physical moments. |
| Stokes, Brinkman and Oseen | flow, vector: velocity/pressure pairings, reaction/advection, stated stabilization and pressure gauge. |
| Helmholtz and PML | examples/tutorial_helmholtz_equations.py: complex physical blocks represented in general real coordinates, boundary impedance and point loads. |
| Maxwell and elastodynamics | Wave tutorial providers: mass/curl or mass/strain operators and explicit time-step equations with reusable factors. |
| Hierarchical and adaptive variants | NestedEquations, adaptive: declared child restrictions, recovered physical fields, estimators and marking. |
| Classical conforming references | conforming: element or exact separated-factor energy, strong nodal data, outward-flux load and physical integral gauge. |
A fully global formulation declares
MultiscaleProblem.from_global(Equation(A, L), size, fixed=..., constraints=...).
It uses the same assembly and solver contracts without a dummy local provider.
The numerical owners also permit direct composition with solve_linear when a
user wants to manage the coefficient elimination explicitly.
Adaptive controllers accept an optional solve_step callable. It receives the
current mesh, transferred skeleton and declared problem options, and returns
the physical solution used by the estimator. The callable can assemble and
solve user-written LocalEquations through the same API; the shared controller
owns estimation, marking and mesh transfer. Omitting it retains the existing
predefined formulation. examples/formulations/adaptive.py shows this
composition with an editable mathematical definition factory.
The notebooks under the corresponding physical-problem directories are the executable entry points. The notebook catalogue gives locked environments and reproduction commands. An analytical control qualifies its stated data and spaces; literature reproductions and historical external comparisons retain their own data and provenance requirements.
Use UFL or assembled blocks
a, L, b, c, d, g and the global Equation accept assembled
arrays or sparse operators. compile_form also accepts real linear and
bilinear UFL forms through the optional DOLFINx adapter. A scalar zero obtains
its dimensions from the surrounding block; nonzero scalars are not broadcast.
For example, on a declared scalar space V, a reaction–diffusion volume form
can be written directly:
import ufl
from pymhm import LocalEquations, columns, rows
u, v = ufl.TrialFunction(V), ufl.TestFunction(V)
dx = ufl.Measure("dx", domain=local_mesh, metadata={"quadrature_degree": 6})
ds = ufl.Measure("ds", domain=local_mesh)
a = (ufl.inner(K * ufl.grad(u), ufl.grad(v)) + reaction * u * v) * dx
L = source * v * dx
local = LocalEquations(
a=a,
L=L,
b=columns(*(phi * v * ds for phi in signed_trace_functions)),
c=rows(*(-phi * u * ds for phi in signed_trace_functions)),
dofs=trace_dofs,
)
V, coefficients, measures, integration regions and the signed trace
functions are supplied by the provider. Each phi represents one explicitly
chosen trace basis function on the local integration mesh, including its
support and orientation. columns assembles test-side linear forms as \(B_K\);
rows assembles trial-side linear forms as \(C_K\). This direct pairing path supplies its own support and coordinate convention.
The bound LocalContext.trace_pairings path supplies those data for supported
mesh-associated spaces; arbitrary cross-mesh identification remains explicit.
The scalar example has no declared kernel. If reaction=0 and the local
volume operator is a Neumann diffusion operator, provide its constant
coefficients and physical mean moments as described below.
Vector and mixed UFL forms follow the same contract. For a mixed velocity and
pressure space W, one possible symmetric Brinkman volume form is
u, p = ufl.TrialFunctions(W)
v, q = ufl.TestFunctions(W)
a = (
2 * viscosity * ufl.inner(ufl.sym(ufl.grad(u)), ufl.sym(ufl.grad(v)))
+ ufl.inner(resistance * u, v)
- p * ufl.div(v) - q * ufl.div(u)
) * dx
L = ufl.inner(body_force, v) * dx
This declares the volume operator. The trace may represent physical traction or a method-specific multiplier according to the separately declared boundary forms. Stable velocity/pressure spaces, local kernels, compatible data and the physical pressure gauge still have to be supplied. The API does not choose Taylor–Hood, stabilization or a boundary prescription from the field names.
Mixed \(H(\mathrm{div})\times L^2\) volume forms can similarly use
inner(K_inverse * flux, test_flux), divergence pairings and a pressure source.
Flux-prescribing MHM also needs its boundary variables and normal-trace
constraints. A mixed volume form alone does not define that construction.
Native compilation limits
pymhm.backends.forms.assemble_form accepts real rank-one and rank-two UFL
forms on single-rank DOLFINx domains, normally MPI.COMM_SELF. Bilinear
forms may have distinct test and trial spaces and rectangular shapes; the
chosen local pivot in LocalEquations must nevertheless be square. A declared
0-by-0 pivot has no eliminated field coordinates: its d and g contribute
directly without a local factorization. Linear forms with UFL argument number
zero or one are supported.
The complete reduced global operator is also square.
The direct adapter assembles binary64 coefficients. Essential boundary
elimination, gauge, quadrature and transpose relations remain explicit.
The higher-level context applies its declared interface orientation maps once.
Cross-mesh integration requires explicit DOLFINx entity_maps; use
assemble_form or a custom compiler to pass these maps and compilation options.
DOLFINx 0.9 uses a mapping from native meshes to entity-index arrays; DOLFINx
0.10 uses a sequence of native EntityMap objects. The adapter copies the
supplied container to a dictionary or list respectively. Mesh correspondence,
trace orientation and the underlying map data remain explicitly supplied inputs.
Zero forms whose arguments were simplified away require an explicit shape.
Complex-valued blocks, nonzero rank-zero functionals and higher-rank forms are
outside this compiler contract. Declare complex formulations in explicit real
and imaginary coordinates, as in the
Helmholtz notebook;
the compiler assembles the resulting real blocks.
Retain local modes and physical constraints
For a singular local operator, declare kernel=Z and its physical column
pairings moments=C. For distinct left modes, supply left_kernel,
test_moments and the explicit test-side pairing. These arrays use the actual
local coefficient basis. They are checked without rediscovering or rotating
the basis. A nonsingular moment pairing is required for the chosen modes.
moment_complement(C, pivots=...) constructs coordinates satisfying
C.T @ coefficients == 0. Columns of C are the declared linear functionals;
free coordinates use identity rows in ascending order, and the pivot rows
enforce the moments. For example, quadrature integrals of basis functions
define a zero-integral complement. The operation is equally applicable to
several conservation or orthogonality constraints. Specify admissible pivots
for a fixed coordinate convention and archive the executed basis when saving
its coefficients.
coarse_basis can retain modes that need not be exact null vectors, with an
independent test_basis when needed. This uses the same complementary
elimination as the shared hybrid contract.
kernel and coarse_basis are mutually exclusive. coarse_sizes declares
the retained width of every item, including zero.
fixed prescribes explicit trace coefficients. constraints contains global
physical rows and values. With assemble(problem), the returned system also
provides mean_constraint for physical integral weights in reconstructed
fields; then pass that row to system.solve(constraints=[...]). Integrals
must include the correct physical fields and exclude auxiliary multipliers.
No mean pressure, rigid-motion constraint or boundary datum is inferred.
These checks establish consistency with the represented algebraic contract. They do not establish mesh-independent inf-sup stability, uniqueness of a continuous PDE or a convergence theorem. Keep physical field errors and original equation residuals separated by their field blocks in scientific verification.
Assemble serially or in bounded batches
from pymhm import ExecutionConfig, assemble
system = assemble(
problem,
execution=ExecutionConfig(
backend="process", workers=10, batch_size=10, native_threads=1,
),
)
solution = system.solve()
Serial execution builds, eliminates and contributes one item before taking the
next. Thread or spawn-process execution uses bounded batches. Only the
coordinator reduces shared global coordinates, in item order, so two cells
contributing to the same face do not concurrently mutate a global matrix.
Items, providers, compilers and callbacks must be picklable for spawn.
Executable process entry points use the usual __main__ guard.
Create native meshes and forms inside the provider invocation. Compile and
release them there before returning CompiledLocalEquations with owned arrays
and portable metadata. Live native meshes, matrices and communicators must not
cross a worker boundary. SolverConfig.local_solver can use an external
numerical solver or response model, subject to the unchanged original-equation
checks. A learned field without the required operator, coordinates and response
columns does not satisfy that solver contract.
Reuse the interface at finer scales
Set LocalEquations.a to another MultiscaleProblem when its condensed global
operator is the local operator at the parent scale. Its reduced coordinates
become the parent's local coefficient basis; L adds a parent-scale source
to the child's assembled load. Parent trace pairings and moment arrays use
those same coordinates.
Child assembly runs serially inside its owning worker, avoiding nested process
pools. The child leaves prescribed trace coefficients and physical gauges to
its parent: child fixed and constraints must be empty. Express required
local essential constraints as explicit local blocks. Parent coupling and
additional loads must leave the child's retained compatibility rows unchanged.
NestedEquations provides the equality-constrained boundary construction for
a child hybrid problem. With child equation \(A x=f\), boundary selector \(E\)
and an explicit oriented restriction \(M\), its local system is
boundary_dofs selects distinct child trace coordinates, excluding retained
cell coordinates. trace_map must be injective on the parent trace space and
contain every orientation and basis restriction. Declare kernels and moments
in the child's reduced coefficient basis; the shared nesting operation lifts
their reaction coordinates and extends moments by zero reaction weights.
The physical nesting moment is \(-M^T\mu\). The shared hybrid saddle negates
that pairing in its reduced trace equations, so the four-block convention on
this page has \(C[x;\mu]=+M^T\mu\). Global loads use that same row convention.
Reconstruction checks the child's actual load \(f+E\mu\).
This construction also requires empty child fixed and constraints.
MultiscaleSolution.children[cell] contains a recovered child solution, or
None at a leaf. The hierarchy reconstructs against the actual parent-induced
load without solving the child's global system again. This is recursive
algebraic elimination; an error estimate for a particular multilevel method
requires its own space, regularity and compatibility hypotheses.
leaf_moment(system, weights) represents a physical integral in finest-scale
fields as row @ coordinates + offset. The callback supplies integral weights
in each leaf's executed coefficient basis. The operation includes source
offsets and pads boundary-reaction coordinates by zero. A prescribed physical
moment value therefore uses the global constraint (row, value - offset).
It does not replace that integral by a mean of coarse coefficients or include
auxiliary reactions in a physical pressure gauge.
The three-level coefficient notebook
checks operator recursion against an independently assembled full matrix.
The spatial recursive MHM notebook
declares Q2 leaf forms, P1 trace restrictions and NestedEquations, with a
physical leaf-integral gauge for Neumann data. Its live analytical checks are
separate from the archived convergence acquisitions and their provenance.
Represent distinct method constructions
The interface does not select a method by name. These recipes identify the blocks and data needed to express the published constructions; the existing method implementations provide their separately verified cases.
| Construction | Required form and space choices |
|---|---|
| Neumann-local MHM — Harder, Paredes and Valentin (2013) | Local operator on the complement of its declared kernel; normal-flux trace, source lift, physical moments and retained compatibility equations. |
| Robin-local MH — Barrenechea, Gomes and Paredes (2024) | Robin terms inside the local operator and their matching global balance; the multiplier must be distinguished from physical flux. |
| Three-field MH²M — de Barros, Madureira and Valentin (2026, v3) | Local solution and duplicated conormal coefficients as mixed local fields; continuous pressure trace globally; complete source lifting and a boundary-mean local normalization. |
| MsHHO — Chaumont-Frelet, Ern, Lemaire and Valentin (2022) | Constrained energy reconstruction with declared cell and face moments; a local moment saddle and subsequent cell/face condensation, with the selected source projection. |
| Residual Petrov–Galerkin MHM — Fernando, Martins, Pereira and Valentin (2023) | Independently declared trial/test pairings, enriched local responses and cross-cell macroface terms, with the published stabilization and reconstruction. |
For MsHHO, the reconstruction uses the mixed block
Here \(C_K\) denotes the declared moment columns and \(m_K\) the prescribed cell
and face moments, independently of the balance block notation above. The
energy matrix and subsequent elimination are part of this method's
construction. They are not obtained merely by changing the name of a flux
trace. The free function energy_reconstruction(A, C) supplies the moment
reconstruction \(R\) and its reduction \(R^T A R\) through the shared original
moment saddle. Its energy-minimization interpretation requires symmetry and
coercivity on the moment-zero space; nonsymmetric input preserves the full
bilinear reduction. with_global_equation(system, equation) adds forms after
the executed local response maps are available, so an explicitly assembled
jump of reconstructed fields can supply a Petrov facet term. It preserves
those response maps, bases and children in a new system. Automatic coupling
of reconstructed fields on different meshes, jump signs and penalties are
not inferred by Equation.
The literature imposes additional conditions. The MHM–MsHHO equivalence in Chaumont-Frelet, Ern, Lemaire and Valentin (2022) needs exact local solves and the prescribed polynomial source space; the source-projected variant has a different equivalence statement. The original equivalence also excludes the face-only \(m=-1\) variant.
The three-field analysis of de Barros, Madureira and Valentin (2026, v3) requires its local injectivity and uniform norm bounds, not just an observed full-rank matrix.
The residual Petrov–Galerkin error estimates of Fernando, Martins, Pereira and Valentin (2023) include dimension-dependent enrichment and stabilization bounds: the stated theorem uses trace degree \(\ell\geq1\), local degree \(k\geq\ell+d\) in dimension \(d\), and \(0<\alpha\leq\alpha_0\). The admissible upper constant is part of the analysis, not a numerical value inferred from a successful solve.
Mixed \(H(\mathrm{div})\) methods require compatible divergence, pressure and normal-trace spaces; see Durán, Devloo, Gomes and Valentin (2019) for the mixed-local multiscale construction. The primary literature and scope give the specific hypotheses and the case gallery gives executed evidence. None of these theorems follows from the ability to assemble four blocks.
References
-
Christopher Harder and Frédéric Valentin (2016). Foundations of the MHM Method, in Building Bridges: Connections and Challenges in Modern Approaches to Numerical Partial Differential Equations, Lecture Notes in Computational Science and Engineering 114, Springer. DOI: 10.1007/978-3-319-41640-3_13.
-
Christopher Harder, Diego Paredes, and Frédéric Valentin (2013). A family of Multiscale Hybrid-Mixed finite element methods for the Darcy equation with rough coefficients, Journal of Computational Physics 245, 107–130. DOI: 10.1016/j.jcp.2013.03.019.
-
Gabriel R. Barrenechea, Antonio Tadeu A. Gomes, and Diego Paredes (2024). A Multiscale Hybrid Method. SIAM Journal on Scientific Computing 46(3), A1628–A1657. DOI: 10.1137/22M1542556.
-
Franklin de Barros, Alexandre L. Madureira, and Frédéric Valentin (2026). A three-field Multiscale Method. arXiv preprint, version 3, 5 August 2026; first submitted 25 April 2024. arXiv: 2404.16978v3.
-
Théophile Chaumont-Frelet, Alexandre Ern, Simon Lemaire, and Frédéric Valentin (2022). Bridging the Multiscale Hybrid-Mixed and Multiscale Hybrid High-Order Methods, ESAIM: M2AN 56, 261–285. DOI: 10.1051/m2an/2021082.
-
Honório Fernando, Larissa Martins, Weslley Pereira, and Frédéric Valentin (2023). A Petrov–Galerkin multiscale hybrid-mixed method for the Darcy equation on polytopes. Computational and Applied Mathematics 42, article 173. DOI: 10.1007/s40314-023-02304-y.
-
Omar Durán, Philippe R. B. Devloo, Sônia M. Gomes, and Frédéric Valentin (2019). A multiscale hybrid method for Darcy’s problems using mixed finite element local solvers, Computer Methods in Applied Mechanics and Engineering 354, 213–244. DOI: 10.1016/j.cma.2019.05.013.