OPAL (Object Oriented Parallel Accelerator Library)  2024.1
OPAL
PyFieldSolver.cpp
Go to the documentation of this file.
1 //
2 // Python API for the FieldSolver
3 //
4 // Copyright (c) 2023, Chris Rogers, STFC Rutherford Appleton Laboratory, Didcot, UK
5 //
6 // This file is part of OPAL.
7 //
8 // OPAL is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 //
13 // You should have received a copy of the GNU General Public License
14 // along with OPAL. If not, see <https://www.gnu.org/licenses/>.
15 //
16 
17 #include "Structure/FieldSolver.h"
18 
20 #include "PyOpal/PyCore/Globals.h"
22 
23 namespace PyOpal {
24 namespace PyFieldSolverNS {
25 
26 // DOUBLE, STRING, BOOL, INT
27 template <>
28 std::vector<PyOpalObjectNS::AttributeDef> PyOpalObjectNS::PyOpalObject<FieldSolver>::attributes = {
29  {"FSTYPE", "type", "", PyOpalObjectNS::PREDEFINED_STRING},
30  {"MX", "mesh_size_x", "", PyOpalObjectNS::DOUBLE},
31  {"MY", "mesh_size_y", "", PyOpalObjectNS::DOUBLE},
32  {"MT", "mesh_size_t", "", PyOpalObjectNS::DOUBLE},
33  {"PARFFTX", "parallelise_fft_x", "", PyOpalObjectNS::BOOL},
34  {"PARFFTY", "parallelise_fft_y", "", PyOpalObjectNS::BOOL},
35  {"PARFFTT", "parallelise_fft_t", "", PyOpalObjectNS::BOOL},
36  {"BCFFTX", "fft_boundary_x", "", PyOpalObjectNS::PREDEFINED_STRING},
37  {"BCFFTY", "fft_boundary_y", "", PyOpalObjectNS::PREDEFINED_STRING},
38  {"BCFFTZ", "fft_boundary_z", "", PyOpalObjectNS::PREDEFINED_STRING},
39  {"GREENSF", "greens_function", "", PyOpalObjectNS::PREDEFINED_STRING},
40  {"BBOXINCR", "bounding_box_increase", "", PyOpalObjectNS::DOUBLE},
41  {"GEOMETRY", "geometry", "", PyOpalObjectNS::UPPER_CASE_STRING},
42  {"ITSOLVER", "iterative_solver", "", PyOpalObjectNS::PREDEFINED_STRING},
43  {"INTERPL", "interpolation", "", PyOpalObjectNS::PREDEFINED_STRING},
44  {"TOL", "tolerance", "", PyOpalObjectNS::DOUBLE},
45  {"MAXITERS", "max_iterations", "", PyOpalObjectNS::DOUBLE},
46  {"PRECMODE", "preconditioner_mode", "", PyOpalObjectNS::PREDEFINED_STRING},
47  {"RC", "cutoff_radius", "", PyOpalObjectNS::DOUBLE},
48  {"ALPHA", "alpha", "", PyOpalObjectNS::DOUBLE},
49 };
50 
52  Object* obj = &(*pyfs.getOpalShared());
53  FieldSolver* fs = dynamic_cast<FieldSolver*>(obj);
54  if (fs == nullptr) {
55  throw OpalException(
56  "PyOpal::PyFieldSolverNS::registerFieldSolver",
57  "Internal error - field solver not recognised during register()"
58  );
59  }
60  fs->execute();
62 }
63 
64 BOOST_PYTHON_MODULE(field_solver) {
68  auto fsClass = fs.make_class("FieldSolver");
69  fsClass.def("register", &registerFieldSolver);
70 }
71 
72 } // PyFieldSolverNS
73 } // PyOpal
74 
static OpalData * getInstance()
Definition: OpalData.cpp:196
The base class for all OPAL objects.
Definition: Object.h:48
void Initialise()
Definition: Globals.cpp:50
void define(Object *newObject)
Define a new object.
Definition: OpalData.cpp:489
std::shared_ptr< C > getOpalShared()
Definition: PyOpalObject.h:286
void registerFieldSolver(PyOpalObjectNS::PyOpalObject< FieldSolver > &pyfs)
FRONT * fs
Definition: hypervolume.cpp:59
The base class for all OPAL exceptions.
Definition: OpalException.h:28
virtual void execute()
Execute (init) the field solver data.
boost::python::class_< PyC > make_class(const char *className)
Definition: PyOpalObject.h:745
BOOST_PYTHON_MODULE(field_solver)