Loading...
Searching...
No Matches
ARTnResource.h
Go to the documentation of this file.
1/*
2 * This file is part of eOn.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 * Copyright (c) 2010--present, eOn Development Team
7 * All rights reserved.
8 *
9 * Repo:
10 * https://github.com/TheochemUI/eOn
11 */
12
13#pragma once
14
26
27#include "eon/DynLib.h"
28#include <mutex>
29#include <stdexcept>
30#include <string>
31
32namespace eonc {
33
34// ---------------------------------------------------------------------------
35// IARTnResource: injectable ABI. Production uses ARTnResource::instance().
36// ---------------------------------------------------------------------------
38public:
39 // ARTn C API function pointer types (from artn.h)
40 using artn_create_fn = int (*)();
41 using setup_artn_fn = void (*)(const int nat, bool *cerr);
42 using artn_fn = void (*)(const int nat, const double *etot, const double *f,
43 int const *ityp, double *const tau, const int *order,
44 const double *lat, const int *if_pos, int *disp_code,
45 double *disp_vec, bool *lconv);
46 using artn_destroy_fn = void (*)();
47 using set_param_fn = int (*)(const char *const name, const int crank,
48 const int *csize, const void *cval);
52 using get_param_fn = int (*)(const char *name, void **cval);
53 using get_runparam_fn = int (*)(const char *name, void **cval);
54 using get_data_fn = int (*)(const char *name, void **cval);
55 using print_caller_fn = void (*)();
56 using artn_step_fn = void (*)(const int nat, const double etot,
57 double *const force, int const *ityp,
58 double *const pos, const double *box,
59 const int *if_pos, double *displ_vec,
60 bool *lconv);
66 using get_error_fn = int (*)(void **cmsg);
67
69 std::mutex library_mutex;
70
71 virtual ~IARTnResource() = default;
72 virtual void require_loaded() = 0;
73 [[nodiscard]] virtual bool is_loaded() const noexcept = 0;
74 [[nodiscard]] virtual artn_create_fn get_create_fn() const = 0;
75 [[nodiscard]] virtual setup_artn_fn get_setup_fn() const = 0;
76 [[nodiscard]] virtual artn_fn get_artn_fn() const = 0;
77 [[nodiscard]] virtual artn_destroy_fn get_destroy_fn() const = 0;
78 [[nodiscard]] virtual set_param_fn get_set_param_fn() const = 0;
79 [[nodiscard]] virtual get_param_fn get_get_param_fn() const = 0;
80 [[nodiscard]] virtual get_runparam_fn get_get_runparam_fn() const = 0;
81 [[nodiscard]] virtual get_data_fn get_get_data_fn() const = 0;
82 [[nodiscard]] virtual print_caller_fn get_print_caller_fn() const = 0;
83 [[nodiscard]] virtual artn_step_fn get_artn_step_fn() const = 0;
86 [[nodiscard]] virtual get_error_fn get_get_error_fn() const = 0;
87
88 IARTnResource(const IARTnResource &) = delete;
89 IARTnResource &operator=(const IARTnResource &) = delete;
90
91protected:
92 IARTnResource() = default;
93};
94
95// ---------------------------------------------------------------------------
96// ARTnResource: process-default loader (Meyer's singleton).
97// ---------------------------------------------------------------------------
99public:
102
103 [[nodiscard]] bool is_loaded() const noexcept override { return m_loaded; }
104
106 void require_loaded() override;
107
108 [[nodiscard]] artn_create_fn get_create_fn() const override {
109 return artn_create_;
110 }
111 [[nodiscard]] setup_artn_fn get_setup_fn() const override {
112 return setup_artn_;
113 }
114 [[nodiscard]] artn_fn get_artn_fn() const override { return artn_; }
115 [[nodiscard]] artn_destroy_fn get_destroy_fn() const override {
116 return artn_destroy_;
117 }
118 [[nodiscard]] set_param_fn get_set_param_fn() const override {
119 return set_param_;
120 }
121 [[nodiscard]] get_param_fn get_get_param_fn() const override {
122 return get_param_;
123 }
124 [[nodiscard]] get_runparam_fn get_get_runparam_fn() const override {
125 return get_runparam_;
126 }
127 [[nodiscard]] get_data_fn get_get_data_fn() const override {
128 return get_data_;
129 }
130 [[nodiscard]] print_caller_fn get_print_caller_fn() const override {
131 return print_caller_;
132 }
133 [[nodiscard]] artn_step_fn get_artn_step_fn() const override {
134 return artn_step_;
135 }
136 [[nodiscard]] get_error_fn get_get_error_fn() const override {
137 return get_error_;
138 }
139
140 ~ARTnResource() override;
141 ARTnResource(const ARTnResource &) = delete;
143
144private:
146 friend class Runtime;
147
148 bool m_loaded{false};
150
151 // Loaded function pointers (null if library not found)
154 artn_fn artn_{nullptr};
163
165 template <typename Fn> Fn load_sym(const char *name) const {
166 return reinterpret_cast<Fn>(dynlib::sym(m_handle, name));
167 }
168};
169
172
173} // namespace eonc
get_error_fn get_error_
artn_destroy_fn get_destroy_fn() const override
void require_loaded() override
Throws std::runtime_error if libartn is not available.
print_caller_fn print_caller_
artn_step_fn get_artn_step_fn() const override
get_data_fn get_get_data_fn() const override
get_data_fn get_data_
dynlib::Handle m_handle
ARTnResource(const ARTnResource &)=delete
print_caller_fn get_print_caller_fn() const override
ARTnResource & operator=(const ARTnResource &)=delete
get_param_fn get_get_param_fn() const override
~ARTnResource() override
artn_create_fn artn_create_
set_param_fn set_param_
set_param_fn get_set_param_fn() const override
artn_step_fn artn_step_
setup_artn_fn get_setup_fn() const override
get_runparam_fn get_get_runparam_fn() const override
get_error_fn get_get_error_fn() const override
May be null on older pARTn builds that predate the C get_error wrapper; callers must null-check befor...
get_runparam_fn get_runparam_
Fn load_sym(const char *name) const
Try to load a symbol; returns nullptr on failure.
artn_destroy_fn artn_destroy_
artn_create_fn get_create_fn() const override
get_param_fn get_param_
setup_artn_fn setup_artn_
artn_fn get_artn_fn() const override
bool is_loaded() const noexcept override
friend class Runtime
static ARTnResource & instance()
Thread-safe singleton accessor (Meyer's pattern).
virtual get_param_fn get_get_param_fn() const =0
void(*)(const int nat, bool *cerr) setup_artn_fn
virtual artn_step_fn get_artn_step_fn() const =0
void(*)() print_caller_fn
virtual bool is_loaded() const noexcept=0
void(*)(const int nat, const double *etot, const double *f, int const *ityp, double *const tau, const int *order, const double *lat, const int *if_pos, int *disp_code, double *disp_vec, bool *lconv) artn_fn
int(*)(const char *name, void **cval) get_param_fn
pARTn bind(C) get_param / get_runparam: type(c_ptr), intent(out).
int(*)(void **cmsg) get_error_fn
Retrieve pARTn error code + c_malloc'd message pointer.
int(*)(const char *name, void **cval) get_data_fn
virtual set_param_fn get_set_param_fn() const =0
virtual void require_loaded()=0
void(*)(const int nat, const double etot, double *const force, int const *ityp, double *const pos, const double *box, const int *if_pos, double *displ_vec, bool *lconv) artn_step_fn
virtual ~IARTnResource()=default
virtual artn_destroy_fn get_destroy_fn() const =0
IARTnResource(const IARTnResource &)=delete
virtual artn_fn get_artn_fn() const =0
void(*)() artn_destroy_fn
virtual setup_artn_fn get_setup_fn() const =0
int(*)(const char *name, void **cval) get_runparam_fn
virtual artn_create_fn get_create_fn() const =0
virtual get_error_fn get_get_error_fn() const =0
May be null on older pARTn builds that predate the C get_error wrapper; callers must null-check befor...
virtual print_caller_fn get_print_caller_fn() const =0
virtual get_runparam_fn get_get_runparam_fn() const =0
virtual get_data_fn get_get_data_fn() const =0
int(*)(const char *const name, const int crank, const int *csize, const void *cval) set_param_fn
std::mutex library_mutex
Serializes access to the Fortran backend's shared global state.
void * sym(Handle h, const char *name) noexcept
Definition DynLib.h:75
void * Handle
Definition DynLib.h:60
RAII resource manager for the ARTn C library with global synchronization.
ARTnResource & get_artn_resource()
Global access to thread-safe ARTn resource.