aboutsummaryrefslogtreecommitdiff
path: root/Source/Parser/GpuParser.cpp
diff options
context:
space:
mode:
authorGravatar Weiqun Zhang <weiqunzhang@lbl.gov> 2019-07-24 19:43:18 -0700
committerGravatar Weiqun Zhang <weiqunzhang@lbl.gov> 2019-07-24 19:46:35 -0700
commitd59fa46d24417b67554132bc666e45886160bd09 (patch)
treea4148c8779e5840d35b7a88fe9e4bbad3e70d7f9 /Source/Parser/GpuParser.cpp
parentdd40a0f5c5a234c27d2ca0b54d2936d6eec9a89c (diff)
downloadWarpX-d59fa46d24417b67554132bc666e45886160bd09.tar.gz
WarpX-d59fa46d24417b67554132bc666e45886160bd09.tar.zst
WarpX-d59fa46d24417b67554132bc666e45886160bd09.zip
Reimplement AddPlasma. Commits related to AddPlasma in hackathon
branch are squashed into one.
Diffstat (limited to 'Source/Parser/GpuParser.cpp')
-rw-r--r--Source/Parser/GpuParser.cpp69
1 files changed, 69 insertions, 0 deletions
diff --git a/Source/Parser/GpuParser.cpp b/Source/Parser/GpuParser.cpp
new file mode 100644
index 000000000..ebba79498
--- /dev/null
+++ b/Source/Parser/GpuParser.cpp
@@ -0,0 +1,69 @@
+#include <GpuParser.H>
+
+GpuParser::GpuParser (WarpXParser const& wp)
+{
+#ifdef AMREX_USE_GPU
+
+ struct wp_parser* a_wp = wp.m_parser;
+ m_gpu_parser.sz_mempool = wp_ast_size((struct wp_node*)a_wp);
+ m_gpu_parser.p_root = (struct wp_node*)
+ amrex::The_Managed_Arena()->alloc(m_gpu_parser.sz_mempool);
+ m_gpu_parser.p_free = m_gpu_parser.p_root;
+ // 0: don't free the source
+ m_gpu_parser.ast = wp_parser_ast_dup(&m_gpu_parser, a_wp->ast, 0);
+ wp_parser_regvar_gpu(&m_gpu_parser, "x", 0);
+ wp_parser_regvar_gpu(&m_gpu_parser, "y", 1);
+ wp_parser_regvar_gpu(&m_gpu_parser, "z", 2);
+
+ m_cpu_parser.sz_mempool = wp_ast_size((struct wp_node*)a_wp);
+ m_cpu_parser.p_root = (struct wp_node*)
+ amrex::The_Managed_Arena()->alloc(m_cpu_parser.sz_mempool);
+ m_cpu_parser.p_free = m_cpu_parser.p_root;
+ // 0: don't free the source
+ m_cpu_parser.ast = wp_parser_ast_dup(&m_cpu_parser, a_wp->ast, 0);
+ wp_parser_regvar(&m_cpu_parser, "x", &(m_var.x));
+ wp_parser_regvar(&m_cpu_parser, "y", &(m_var.y));
+ wp_parser_regvar(&m_cpu_parser, "z", &(m_var.z));
+
+#else
+
+#ifdef _OPENMP
+ nthreads = omp_get_max_threads();
+#else
+ nthreads = 1;
+#endif
+
+ m_parser = ::new struct wp_parser*[nthreads];
+ m_var = ::new amrex::XDim3[nthreads];
+
+ for (int tid = 0; tid < nthreads; ++tid)
+ {
+#ifdef _OPENMP
+ m_parser[tid] = wp_parser_dup(wp.m_parser[tid]);
+#else
+ m_parser[tid] = wp_parser_dup(wp.m_parser);
+#endif
+ wp_parser_regvar(m_parser[tid], "x", &(m_var[tid].x));
+ wp_parser_regvar(m_parser[tid], "y", &(m_var[tid].y));
+ wp_parser_regvar(m_parser[tid], "z", &(m_var[tid].z));
+ }
+
+#endif
+}
+
+void
+GpuParser::clear ()
+{
+#ifdef AMREX_USE_GPU
+ amrex::The_Managed_Arena()->free(m_gpu_parser.ast);
+ amrex::The_Managed_Arena()->free(m_cpu_parser.ast);
+#else
+ for (int tid = 0; tid < nthreads; ++tid)
+ {
+ wp_parser_delete(m_parser[tid]);
+ }
+ ::delete[] m_parser;
+ ::delete[] m_var;
+#endif
+}
+