1#ifndef AMREX_IPARSER_H_
2#define AMREX_IPARSER_H_
7#include <AMReX_IParser_Exe.H>
19 template <
int M=N, std::enable_if_t<M==0,
int> = 0>
27 template <
typename... Ts>
29 std::enable_if_t<
sizeof...(Ts) == N && std::conjunction_v<std::is_integral<Ts>...>,
31 operator() (Ts... var)
const noexcept
46 explicit operator bool ()
const {
61 IParser (std::string
const& func_body);
63 void define (std::string
const& func_body);
65 explicit operator bool ()
const;
67 void setConstant (std::string
const& name,
long long c);
73 [[nodiscard]]
int depth ()
const;
76 [[nodiscard]] std::string
expr ()
const;
78 [[nodiscard]] std::set<std::string>
symbols ()
const;
90 std::string m_expression;
91 struct amrex_iparser* m_iparser =
nullptr;
93 bool m_use_arena =
true;
94 char* m_host_executor =
nullptr;
96 char* m_device_executor =
nullptr;
98 int m_max_stack_size = 0;
102 Data (Data
const&) =
delete;
103 Data (Data &&) =
delete;
104 Data& operator= (Data
const&) =
delete;
105 Data& operator= (Data &&) =
delete;
109 std::shared_ptr<Data> m_data;
116 if (m_data && m_data->m_iparser) {
119 if (!(m_data->m_host_executor)) {
121 m_data->m_exe_size =
static_cast<int>
122 (iparser_exe_size(m_data->m_iparser, m_data->m_max_stack_size,
125 if (m_data->m_max_stack_size > AMREX_IPARSER_STACK_SIZE) {
126 amrex::Abort(
"amrex::IParser: AMREX_IPARSER_STACK_SIZE, "
127 + std::to_string(AMREX_IPARSER_STACK_SIZE) +
", is too small for "
128 + m_data->m_expression);
130 if (stack_size != 0) {
131 amrex::Abort(
"amrex::IParser: something went wrong with iparser stack! "
132 + std::to_string(stack_size));
136 if (m_data->m_host_executor ==
nullptr) {
137 m_data->m_host_executor = (
char*) std::malloc(m_data->m_exe_size);
138 m_data->m_use_arena =
false;
142 iparser_compile(m_data->m_iparser, m_data->m_host_executor);
143 }
catch (
const std::runtime_error& e) {
144 throw std::runtime_error(std::string(e.what()) +
" in IParser expression \""
145 + m_data->m_expression +
"\"");
163 auto exe = compileHost<N>();
166 if (m_data && m_data->m_iparser && !(m_data->m_device_executor)
167 && m_data->m_use_arena)
169 m_data->m_device_executor = (
char*)
The_Arena()->
alloc(m_data->m_exe_size);
173 exe.m_device_executor = m_data->m_device_executor;
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
#define AMREX_FORCE_INLINE
Definition AMReX_Extension.H:119
#define AMREX_IF_ON_DEVICE(CODE)
Definition AMReX_GpuQualifiers.H:56
#define AMREX_IF_ON_HOST(CODE)
Definition AMReX_GpuQualifiers.H:58
#define AMREX_GPU_HOST_DEVICE
Definition AMReX_GpuQualifiers.H:20
virtual void * alloc(std::size_t sz)=0
Definition AMReX_IParser.H:59
void print() const
Definition AMReX_IParser.cpp:86
std::set< std::string > symbols() const
Definition AMReX_IParser.cpp:124
void setConstant(std::string const &name, long long c)
Definition AMReX_IParser.cpp:67
IParserExecutor< N > compileHost() const
This compiles for CPU only.
Definition AMReX_IParser.H:114
std::string expr() const
Definition AMReX_IParser.cpp:114
IParserExecutor< N > compile() const
This compiles for both GPU and CPU.
Definition AMReX_IParser.H:161
void registerVariables(Vector< std::string > const &vars)
Definition AMReX_IParser.cpp:75
int depth() const
Definition AMReX_IParser.cpp:94
void define(std::string const &func_body)
Definition AMReX_IParser.cpp:18
int maxStackSize() const
Definition AMReX_IParser.cpp:104
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Arena * The_Pinned_Arena()
Definition AMReX_Arena.cpp:823
Arena * The_Arena()
Definition AMReX_Arena.cpp:783
void streamSynchronize() noexcept
Definition AMReX_GpuDevice.H:263
void htod_memcpy_async(void *p_d, const void *p_h, const std::size_t sz) noexcept
Definition AMReX_GpuDevice.H:301
Definition AMReX_Amr.cpp:49
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230
Fixed-size array that can be used on GPU.
Definition AMReX_Array.H:41
Definition AMReX_IParser.H:18
char * m_device_executor
Definition AMReX_IParser.H:53
__host__ __device__ long long operator()() const noexcept
Definition AMReX_IParser.H:21
char * m_host_executor
Definition AMReX_IParser.H:51