Skip to content

ADAM Common Library — src/lib/common

The common library is the portable, physics-agnostic core of the ADAM SDK. Every GPU backend (fnl, nvf, gmp) extends these objects rather than replacing them; every solver application (nasto, prism, chase, …) composes them. No GPU-specific code lives here — the entire directory compiles with any standard Fortran 2003+ compiler.

The aggregate entry point adam_common_library re-exports all modules below; a single use adam_common_library statement in application code exposes the complete API.


Contents


AMR data structures

adam_tree_object — octree/quadtree hierarchy

The tree is a CPU-resident hash-map keyed on 64-bit Morton indices that linearise the four octree coordinates (level, bx, by, bz) into a single integer. It provides O(1) block insertion, deletion, and neighbour lookup during AMR update phases. Morton ordering clusters geometrically adjacent blocks in index space, minimising ghost-cell communication volume across MPI ranks.

The refinement ratio is selectable: 4 (quadtree) or 8 (octree). Full 26-neighbourhood support covers all face, edge, and corner adjacencies needed by high-order stencils.

The tree is never accessed by numerical kernels during time integration — it is consulted only during AMR update cycles (marking → refinement/coarsening → load rebalancing).

adam_tree_node_object — individual tree node

Represents a single block in the octree. Key fields:

FieldTypePurpose
codeI8PMorton key
refinement_neededI4PAMR marker (TO_BE_REFINED, TO_BE_DEREFINED, TO_NOT_TOUCH)
myrankI4POwning MPI rank
block_indexI8PCompact index into the field array
neighbor(26)tree_node_neighbor_objectFace/edge/corner adjacency data
surface_stl_distanceR8PSigned distance to nearest IB surface

adam_tree_bucket_object — hash-map bucket

Double-linked list container underpinning the tree's hash-map. Stores nodes by Morton key and provides O(1) add_node, remove_node, and has_code operations. Supports iterator-based traversal via the traverse method and a user-supplied callback conforming to iterator_interface.


Grid and field

adam_grid_object — block-structured Cartesian grid

Manages the geometric description of a single structured block and the global domain layout. Provides cell/node coordinate computation, mesh metrics, ghost-cell layout, and boundary condition assignment.

Key configuration ([grid] INI section):

ParameterMeaning
ni, nj, nkCells per block per direction
ngcGhost-cell width (typically 3 for WENO5, 4 for WENO7)
emin_*, emax_*Domain extents
bc_type(6)Boundary condition type on each of the 6 domain faces

Notable methods: block_emin/emax, cell_xyz, node_xyz, compute_metrics, compute_weight_neighbor, load_from_ini_file.

adam_field_object — 5D field array

Dense contiguous array holding all simulation variables for all blocks owned by an MPI rank:

q(nv, ni, nj, nk, nb)
DimensionMeaning
nvPhysical variables (density, momenta, energy, …)
ni, nj, nkCell indices within a block, including ghost cells
nbCompact sequential block index (1 … current block count)

Fortran column-major order keeps nv contiguous in memory, enabling coalesced reads across CUDA threads or OpenACC/OpenMP SIMD lanes. The array is allocated once at simulation start to the maximum block count and reused across all Runge-Kutta stages — no dynamic allocation during time integration.


Communication and maps

adam_maps_object — index translation and MPI communication patterns

Bridges the tree (Morton-key addressed) and the field (compact-index addressed). Rebuilt only when the AMR topology changes; invisible to numerical kernels during time integration.

Local maps (updated every AMR cycle):

MapPurpose
local_mapBlock index ↔ Morton key translation (b2m / m2b)
local_map_ghostBlock-to-ghost-block adjacency for exchange
local_map_ghost_cellCell-level ghost stencil offsets
local_map_bc_face/edge/corner/crownBoundary condition application stencils

MPI communication lists (per-rank send/receive schedules):

  • comm_map_send/recv — block-level exchange for AMR rebalancing
  • comm_map_send/recv_ghost — ghost-cell exchange buffers before stencil sweeps
  • send_buffer_ghost, recv_buffer_ghost — pre-allocated MPI staging buffers

Key methods: initialize, make_comm_local_maps, blocks_reorder.


Numerical methods — spatial

adam_weno_object — WENO reconstruction

Weighted Essentially Non-Oscillatory finite difference reconstruction. Upwind and centered variants are available at orders 1, 3, 5, 7, and 9 (upwind) and 2+ (centered). The stencil half-width S_MAX governs the ghost-cell requirement.

Scheme selectors:

ConstantScheme
WENO_U_1WENO_U_9Upwind WENO, orders 1/3/5/7/9
WENO_C_2Centered WENO

Reference: Chi-Wang Shu, NASA/CR-97-206253 (1997).

adam_fdv_operators_library — finite difference/volume operators

Spatial derivative operators at configurable order for use in application physics layers. All operators are available in three flavours:

FlavourDescription
Finite difference, centeredStandard FD stencils on cell centres
Finite volume, centeredCell-average-based FV operators
Finite volume, upwindWENO-reconstructed upwind FV fluxes

Operators: gradient, divergence, curl, Laplacian, and scalar derivatives of orders 1–6. Abstract compute_*_fdv_interface procedure pointers allow backend dispatch without branching.

adam_riemann_euler_library — Euler equation Riemann solvers

Convective interface flux computation for the compressible Euler equations. All solvers accept left/right primitive states and return the numerical flux; the optional lmax output gives the maximum wave speed for CFL estimation.

ProcedureSolver
compute_riemann_euler_exactExact solver (Newton iteration on Rankine-Hugoniot)
compute_riemann_euler_hllcHLLC (Harten–Lax–van Leer–Contact)
compute_riemann_euler_hllc_lmHLLC with low-Mach correction
compute_riemann_euler_hllemHLLEM (entropy-fix variant)
compute_riemann_euler_llfLocal Lax–Friedrichs
compute_riemann_euler_tsTrivial (first-order upwind)

Numerical methods — temporal

adam_rk_object — explicit Runge-Kutta integration

ConstantSchemeStagesOrder
RK_1Forward Euler11
RK_2Heun22
RK_3TVD-RK333
RK_SSP_22SSP(2,2)22
RK_SSP_33SSP(3,3)33
RK_SSP_54SSP(5,4)54
RK_YOSHIDAYoshida symplectic34

Stage storage q_rk(nv, ni, nj, nk, nb, nrk) is pre-allocated; no allocation occurs during time-stepping. Configuration section: [runge_kutta].

adam_leapfrog_object — leapfrog with RAW filter

Second-order leapfrog scheme with optional Robert–Asselin–Williams noise filter:

U^{n+2} = U^{n} + 2·Δt·R(t^{n+1}, U^{n+1})
Δ = ν/2·(U^{n} - 2·U^{n+1} + U^{n+2})    ! RAW correction

Filter coefficient nu (default 0.01) and Williams parameter alpha (default 0.53) are configurable. Configuration section: [leapfrog].

adam_blanes_moan_object — Blanes–Moan splitting integrator

Geometric integrator for separable Hamiltonian systems H = A + B. Two schemes available:

ConstantOrderStages
BM_SCHEME444
BM_SCHEME666

Coefficients a(:) and b(:) implement the alternating A-B operator splitting. Configuration section: [blanes_moan].

adam_cfm_object — Commutator-Free Magnus integrators

Exponential integrators for non-autonomous ODEs of the form dU/dt = A(t)·U. Computes U^{n+1} = exp(α·R)·U^n without evaluating the matrix exponential directly (commutator-free formulation).

ConstantOrderStagesExponentials
CFM_44
CFM_66
CFM_88

Stage residuals dq and field buffer q are pre-allocated. Configuration section: [commutator_free_magnus].


Physics support

adam_eos_ic_object — ideal compressible gas EOS

Thermodynamic model for a calorically perfect ideal gas. Stores primary properties and derives all secondary quantities on initialisation.

PropertySymbolDescription
cp, cvSpecific heats at constant pressure/volume
gγHeat capacity ratio
gm1, gp1γ−1, γ+1Pre-computed combinations
delta, eta(γ−1)/2, 2γ/(γ−1)Isentropic flow coefficients
muμDynamic viscosity
kdkThermal conductivity

Key procedures: density, pressure, temperature, internal_energy, total_energy, speed_of_sound, primitive2conservative, conservative2primitive. Configuration section: [physics_specie_*].

adam_ib_object — immersed boundary method

Manages solid bodies immersed in the Cartesian grid. Computes the signed-distance field phi(nv, ni, nj, nk, nb) via an eikonal solver and applies wall boundary conditions at solid surfaces.

Supported solid definitions:

TypeConstantDescription
Sphere / circleIB_ANALYTICAL_SPHEREDefined by centre, radius, axis
Circle (XY plane)IB_ANALYTICAL_CIRCLE2D equivalent
RectangleIB_ANALYTICAL_RECTANGLEDefined by centre, edge lengths, axis
Surface meshOFF-format triangulated surface

Wall boundary condition types:

ConstantValueType
BCS_VISCOUS1Viscous (no-slip) wall
BCS_EULER2Inviscid (slip) wall

Configuration section: [solid]. Number of eikonal integration steps configurable via n_eikonal.

adam_amr_object — AMR refinement markers

Configures the criteria that drive block refinement and coarsening. Multiple markers can be combined; each marker specifies an independent criterion applied at every AMR update cycle.

Marker modes:

ConstantValueCriterion
AMR_GEO1Geometry-based (distance to IB surface)
AMR_GRAD2Field gradient magnitude

Each marker carries threshold parameters delta_fine / delta_coarse (cell-spacing ratios), a tolerance tol, and a reference to the field variable and direction. AMR is triggered every frequency time steps and iterated iters times per cycle to enforce 2:1 level balance. Configuration section: [amr].

adam_flail_object — linear algebra interface

Iterative solver and smoother infrastructure for implicit operators (e.g., elliptic sub-problems). Provides a common interface over several smoothing strategies:

ConstantMethod
SMOOTHING_MULTIGRIDGeometric multigrid V-cycle
SMOOTHING_GAUSS_SEIDELGauss–Seidel iteration
SMOOTHING_SORSuccessive Over-Relaxation
SMOOTHING_SOR_OMPParallel SOR (OpenMP)

Convergence is controlled by tolerance (default 10⁻⁶) and iterations. Configuration section: [linear-algebra].


Infrastructure

adam_mpih_object — MPI wrapper

Thin convenience layer over MPI. Provides rank/size query, tic-toc performance timing, rank-prefixed console output, non-blocking request bookkeeping (req_send_recv), and abort/error_stop helpers. All communication in the maps and field objects routes through this object.

adam_io_object — parallel I/O

Manages all simulation data output and restart files. Holds pointers to the primary field and to up to 30 auxiliary arrays (vectors and scalars at multiple precisions: R8P, R4P, I8P, I4P, I2P, I1P). Supported output formats: HDF5 (parallel, MPI-IO), VTK, XH5F, and MAT (MATLAB).

adam_slices_object — 2D diagnostic slices

Extracts planar 2D slices from the 3D field at configurable spatial bounds and resolution (emin, emax, nijk). Save frequency is controlled by n_save. Output format: MAT. Configuration section: [slices].

adam_adam_object — top-level orchestrator

Composer that binds all SDK objects into a single adam_object and drives the simulation lifecycle:

  • Initialisation: initialize — sets up grid, tree, maps, field, and I/O from INI file
  • AMR cycle: adapt, amr_update, refine_uniform — marking, refinement/coarsening, load rebalancing
  • Communication: make_comm_local_maps_ghost_bc, mpi_redistribute, mpi_gather_refinement_needed, blocks_reorder
  • I/O: save_hdf5, save_restart_files, save_vtk, save_xh5f, save_slice, load_restart_files
  • Geometry: interpolate_at_point, prune

adam_parameters — global constants

Named integer constants shared across all modules: boundary condition type flags, AMR marker values (TO_BE_REFINED, TO_BE_DEREFINED, TO_NOT_TOUCH), face enumeration codes (FEC_1_6_ARRAY), and coordinate-direction mappings (FEC_TO_DELTA, DELTA_TO_FEC).

adam_common_library — aggregate entry point

Re-exports every module listed above. Applications need only:

fortran
use adam_common_library

Module summary

ModuleCategoryFile
adam_parametersInfrastructureadam_parameters.f90
adam_tree_node_objectAMRadam_tree_node_object.f90
adam_tree_bucket_objectAMRadam_tree_bucket_object.f90
adam_tree_objectAMRadam_tree_object.F90
adam_grid_objectGrid/Fieldadam_grid_object.F90
adam_field_objectGrid/Fieldadam_field_object.F90
adam_maps_objectCommunicationadam_maps_object.F90
adam_weno_objectNumerics — spatialadam_weno_object.F90
adam_fdv_operators_libraryNumerics — spatialadam_fdv_operators_library.F90
adam_riemann_euler_libraryNumerics — spatialadam_riemann_euler_library.F90
adam_rk_objectNumerics — temporaladam_rk_object.F90
adam_leapfrog_objectNumerics — temporaladam_leapfrog_object.F90
adam_blanes_moan_objectNumerics — temporaladam_blanes_moan_object.F90
adam_cfm_objectNumerics — temporaladam_cfm_object.F90
adam_eos_ic_objectPhysicsadam_eos_ic_object.F90
adam_ib_objectPhysicsadam_ib_object.F90
adam_amr_objectPhysicsadam_amr_object.F90
adam_flail_objectPhysicsadam_flail_object.F90
adam_mpih_objectInfrastructureadam_mpih_object.F90
adam_io_objectInfrastructureadam_io_object.F90
adam_slices_objectInfrastructureadam_slices_object.F90
adam_adam_objectInfrastructureadam_adam_object.F90
adam_common_libraryEntry pointadam_common_library.F90

Copyrights

ADAM is released under the GNU Lesser General Public License v3.0 (LGPLv3).

Copyright (C) Andrea Di Mascio, Federico Negro, Giacomo Rossi, Francesco Salvadore, Stefano Zaghi.