nvalchemi.distributed.spec.SPEC_DFTD3_HALO#

nvalchemi.distributed.spec.SPEC_DFTD3_HALO = MLIPSpec(distribution=DistributionSpec(policy=HaloStoragePolicy(scatter_mode='halo_correction', gather_mode='halo_read'), custom_ops=(), third_party_helpers=(), adapters=(), shard_fields=('positions', 'charges', 'atomic_numbers')), owned_only_outputs=frozenset(), all_reduce_outputs=frozenset(), output_kinds={'energy': <OutputKind.PER_GRAPH: 'per_graph'>, 'forces': <OutputKind.PER_NODE: 'per_node'>, 'stress': <OutputKind.PER_GRAPH: 'per_graph'>, 'atomic_energies': <OutputKind.PER_NODE: 'per_node'>}, system_reductions=True, node_energy_key=None, node_virial_key=None, gp_replicate_geometry=False, outputs=None, compile=None)#

halo storage, no global coupling. Coordination numbers, C6 interpolation, and the two-body dispersion sum are all within-cutoff, so like Lennard-Jones DFTD3 needs no cross-rank collective. The wrapper localizes ShardTensor inputs for the Warp kernel, emits per-atom dispersion energies, and reduces them with owned-slice + all-reduce; forces are direct per-atom. One subtlety vs LJ: a ghost atom’s coordination number (and its force term) depend on the ghost’s own neighbors, which reach a few angstrom beyond the dispersion cutoff — so exact forces need a halo deeper than the cutoff (ghost_width >= cutoff + CN_counting_range, set via skin).

Type:

DFT-D3(BJ) dispersion