Loading...
Searching...
No Matches
eonc::LammpsLoader Class Reference

#include <LammpsLoader.h>

Public Types

using open_no_mpi_fn = void *(*)(int, char **, void **)
using close_fn = void (*)(void *)
using command_fn = char *(*)(void *, const char *)
using file_fn = void (*)(void *, const char *)
using scatter_atoms_fn = void (*)(void *, const char *, int, int, void *)
using extract_var_fn = void *(*)(void *, const char *, const char *)

Public Member Functions

bool is_loaded () const noexcept
 True if liblammps was successfully dlopened and the C ABI resolved.
bool available () const
 Filesystem probe: a candidate liblammps file is visible without dlopen, so LAMMPS static initializers (the banner) do not run.
void require_loaded ()
 Load on first use, then throw if liblammps is not available.
 LammpsLoader (const LammpsLoader &)=delete
LammpsLoaderoperator= (const LammpsLoader &)=delete

Static Public Member Functions

static LammpsLoaderinstance ()
 Thread-safe singleton accessor (Meyer's pattern). Does not dlopen.

Public Attributes

open_no_mpi_fn open_no_mpi {nullptr}
close_fn close {nullptr}
command_fn command {nullptr}
file_fn file {nullptr}
scatter_atoms_fn scatter_atoms {nullptr}
extract_var_fn extract_variable {nullptr}

Private Member Functions

 LammpsLoader ()=default
 ~LammpsLoader ()
void ensure_loaded ()
template<typename Fn>
Fn load_sym (const char *name)
 Try to load a symbol; returns nullptr on failure.

Private Attributes

bool m_loaded {false}
bool m_tried {false}
dynlib::Handle m_handle {}

Detailed Description

Definition at line 34 of file LammpsLoader.h.

Member Typedef Documentation

◆ close_fn

using eonc::LammpsLoader::close_fn = void (*)(void *)

Definition at line 38 of file LammpsLoader.h.

◆ command_fn

using eonc::LammpsLoader::command_fn = char *(*)(void *, const char *)

Definition at line 39 of file LammpsLoader.h.

◆ extract_var_fn

using eonc::LammpsLoader::extract_var_fn = void *(*)(void *, const char *, const char *)

Definition at line 42 of file LammpsLoader.h.

◆ file_fn

using eonc::LammpsLoader::file_fn = void (*)(void *, const char *)

Definition at line 40 of file LammpsLoader.h.

◆ open_no_mpi_fn

using eonc::LammpsLoader::open_no_mpi_fn = void *(*)(int, char **, void **)

Definition at line 37 of file LammpsLoader.h.

◆ scatter_atoms_fn

using eonc::LammpsLoader::scatter_atoms_fn = void (*)(void *, const char *, int, int, void *)

Definition at line 41 of file LammpsLoader.h.

Constructor & Destructor Documentation

◆ LammpsLoader() [1/2]

eonc::LammpsLoader::LammpsLoader ( const LammpsLoader & )
delete

◆ LammpsLoader() [2/2]

eonc::LammpsLoader::LammpsLoader ( )
privatedefault

◆ ~LammpsLoader()

eonc::LammpsLoader::~LammpsLoader ( )
private

Definition at line 118 of file LammpsLoader.cpp.

dynlib::Handle m_handle
void close(Handle h) noexcept
Definition DynLib.h:77

Member Function Documentation

◆ available()

bool eonc::LammpsLoader::available ( ) const
nodiscard

Filesystem probe: a candidate liblammps file is visible without dlopen, so LAMMPS static initializers (the banner) do not run.

Definition at line 120 of file LammpsLoader.cpp.

120 {
121 return lib_file_visible(lammps_lib_names());
122}

◆ ensure_loaded()

void eonc::LammpsLoader::ensure_loaded ( )
private

Definition at line 84 of file LammpsLoader.cpp.

84 {
85 if (m_tried)
86 return;
87 m_tried = true;
88
89 m_handle = dynlib::openFirst(lammps_lib_names());
90 if (!m_handle) {
91 return;
92 }
93
95 close = dynlib::loadSym<close_fn>(m_handle, "lammps_close");
96 command = dynlib::loadSym<command_fn>(m_handle, "lammps_command");
97 file = dynlib::loadSym<file_fn>(m_handle, "lammps_file");
99 dynlib::loadSym<scatter_atoms_fn>(m_handle, "lammps_scatter_atoms");
101 dynlib::loadSym<extract_var_fn>(m_handle, "lammps_extract_variable");
102
103#ifdef EONMPI
104 open_mpi = dynlib::loadSym<open_mpi_fn>(m_handle, "lammps_open");
105#endif
106
107 if (!open_no_mpi || !close || !command || !file || !scatter_atoms ||
109 std::cerr << "[LAMMPS] Library loaded but missing required symbols\n";
111 m_handle = {};
112 return;
113 }
114
115 m_loaded = true;
116}
scatter_atoms_fn scatter_atoms
open_no_mpi_fn open_no_mpi
extract_var_fn extract_variable
Fn loadSym(Handle h, const char *name) noexcept
Load a symbol and cast to a function pointer type.
Definition DynLib.h:99
Handle openFirst(const char *const names[]) noexcept
Try a list of library names in order, return first successful handle.
Definition DynLib.h:89

◆ instance()

LammpsLoader & eonc::LammpsLoader::instance ( )
static

Thread-safe singleton accessor (Meyer's pattern). Does not dlopen.

Definition at line 79 of file LammpsLoader.cpp.

79 {
80 static LammpsLoader loader;
81 return loader;
82}
LammpsLoader(const LammpsLoader &)=delete

◆ is_loaded()

bool eonc::LammpsLoader::is_loaded ( ) const
inlinenodiscardnoexcept

True if liblammps was successfully dlopened and the C ABI resolved.

Definition at line 62 of file LammpsLoader.h.

62{ return m_loaded; }

◆ load_sym()

template<typename Fn>
Fn eonc::LammpsLoader::load_sym ( const char * name)
inlineprivate

Try to load a symbol; returns nullptr on failure.

Definition at line 85 of file LammpsLoader.h.

85 {
86 return reinterpret_cast<Fn>(dynlib::sym(m_handle, name));
87 }
void * sym(Handle h, const char *name) noexcept
Definition DynLib.h:75

◆ operator=()

LammpsLoader & eonc::LammpsLoader::operator= ( const LammpsLoader & )
delete

◆ require_loaded()

void eonc::LammpsLoader::require_loaded ( )

Load on first use, then throw if liblammps is not available.

Definition at line 124 of file LammpsLoader.cpp.

124 {
126 if (!m_loaded) {
127 throw std::runtime_error(
128 "LAMMPS potential requested but liblammps not found.\n"
129 "Install via: conda install -c conda-forge lammps\n"
130 "Or ensure liblammps is in your library search path "
131 "(LD_LIBRARY_PATH / DYLD_LIBRARY_PATH / PATH).");
132 }
133}

Member Data Documentation

◆ close

close_fn eonc::LammpsLoader::close {nullptr}

Definition at line 52 of file LammpsLoader.h.

52{nullptr};

◆ command

command_fn eonc::LammpsLoader::command {nullptr}

Definition at line 53 of file LammpsLoader.h.

53{nullptr};

◆ extract_variable

extract_var_fn eonc::LammpsLoader::extract_variable {nullptr}

Definition at line 56 of file LammpsLoader.h.

56{nullptr};

◆ file

file_fn eonc::LammpsLoader::file {nullptr}

Definition at line 54 of file LammpsLoader.h.

54{nullptr};

◆ m_handle

dynlib::Handle eonc::LammpsLoader::m_handle {}
private

Definition at line 82 of file LammpsLoader.h.

82{};

◆ m_loaded

bool eonc::LammpsLoader::m_loaded {false}
private

Definition at line 80 of file LammpsLoader.h.

80{false};

◆ m_tried

bool eonc::LammpsLoader::m_tried {false}
private

Definition at line 81 of file LammpsLoader.h.

81{false};

◆ open_no_mpi

open_no_mpi_fn eonc::LammpsLoader::open_no_mpi {nullptr}

Definition at line 51 of file LammpsLoader.h.

51{nullptr};

◆ scatter_atoms

scatter_atoms_fn eonc::LammpsLoader::scatter_atoms {nullptr}

Definition at line 55 of file LammpsLoader.h.

55{nullptr};

The documentation for this class was generated from the following files: