New files under core/specfem/linear_system/ (namespace specfem::linear_system).
dof_map.hpp — build the Tpetra::Map of owned global ids and the gid(iglob,icomp)
helper from get_iglob/get_nglob. Owned iglob → owned GIDs; shared-interface points →
column/overlap map; fillComplete's Export(ADD) reproduces the matrix-free assembly sum.
element_stiffness.hpp/.tpp — per element, form the small dense block K_e
(size (NGLL³·ncomp)²) by probing the single-element operator with local unit vectors,
reusing element_gradient/compute_stress/element_divergence, velocity ≡ 0 (pure K),
no mass division. Scalar = float.
tpetra_assembler.hpp/.cpp — build Tpetra::CrsGraph from element connectivity,
then fill Tpetra::CrsMatrix<float> directly by scattering each K_e (batched row
inserts; only the small K_e block is ever materialized — no global dense matrix),
fillComplete().
Scope guards: 3D single-medium elastic isotropic, attenuation_tag::none,
boundary_tag::none/free-surface only. Defer Stacey (C) and fluid-solid coupling.
New files under
core/specfem/linear_system/(namespacespecfem::linear_system).dof_map.hpp— build theTpetra::Mapof owned global ids and thegid(iglob,icomp)helper from
get_iglob/get_nglob. Owned iglob → owned GIDs; shared-interface points →column/overlap map;
fillComplete'sExport(ADD)reproduces the matrix-free assembly sum.element_stiffness.hpp/.tpp— per element, form the small dense blockK_e(size
(NGLL³·ncomp)²) by probing the single-element operator with local unit vectors,reusing
element_gradient/compute_stress/element_divergence, velocity ≡ 0 (pureK),no mass division. Scalar =
float.tpetra_assembler.hpp/.cpp— buildTpetra::CrsGraphfrom element connectivity,then fill
Tpetra::CrsMatrix<float>directly by scattering eachK_e(batched rowinserts; only the small
K_eblock is ever materialized — no global dense matrix),fillComplete().Scope guards: 3D single-medium elastic isotropic,
attenuation_tag::none,boundary_tag::none/free-surface only. Defer Stacey (C) and fluid-solid coupling.