aboutsummaryrefslogtreecommitdiff
path: root/Python/pywarpx/callbacks.py
diff options
context:
space:
mode:
Diffstat (limited to 'Python/pywarpx/callbacks.py')
-rw-r--r--Python/pywarpx/callbacks.py39
1 files changed, 9 insertions, 30 deletions
diff --git a/Python/pywarpx/callbacks.py b/Python/pywarpx/callbacks.py
index 2d3576c5b..49d0c3db2 100644
--- a/Python/pywarpx/callbacks.py
+++ b/Python/pywarpx/callbacks.py
@@ -146,6 +146,14 @@ class CallbackFunctions(object):
def installfuncinlist(self,f):
"Check if the specified function is installed"
+ if len(self.funcs) == 0:
+ # If this is the first function installed, set the callback in the C++
+ # to call this class instance.
+ # Note that the _c_func must be saved.
+ _CALLBACK_FUNC_0 = ctypes.CFUNCTYPE(None)
+ self._c_func = _CALLBACK_FUNC_0(self)
+ callback_setter = getattr(libwarpx.libwarpx_so, f'warpx_set_callback_py_{self.name}')
+ callback_setter(self._c_func)
if isinstance(f,types.MethodType):
# --- If the function is a method of a class instance, then save a full
# --- reference to that instance and the method name.
@@ -241,34 +249,6 @@ _afterrestart = CallbackFunctions('afterrestart',lcallonce=1)
_particleinjection = CallbackFunctions('particleinjection')
_appliedfields = CallbackFunctions('appliedfields')
-# --- Create the objects that can be called from C.
-# --- Note that each of the CFUNCTYPE instances need to be saved
-_CALLBACK_FUNC_0 = ctypes.CFUNCTYPE(None)
-_c_afterinit = _CALLBACK_FUNC_0(_afterinit)
-libwarpx.warpx_set_callback_py_afterinit(_c_afterinit)
-_c_beforeEsolve = _CALLBACK_FUNC_0(_beforeEsolve)
-libwarpx.warpx_set_callback_py_beforeEsolve(_c_beforeEsolve)
-_c_poissonsolver = _CALLBACK_FUNC_0(_poissonsolver)
-_c_afterEsolve = _CALLBACK_FUNC_0(_afterEsolve)
-libwarpx.warpx_set_callback_py_afterEsolve(_c_afterEsolve)
-_c_beforedeposition = _CALLBACK_FUNC_0(_beforedeposition)
-libwarpx.warpx_set_callback_py_beforedeposition(_c_beforedeposition)
-_c_afterdeposition = _CALLBACK_FUNC_0(_afterdeposition)
-libwarpx.warpx_set_callback_py_afterdeposition(_c_afterdeposition)
-_c_particlescraper = _CALLBACK_FUNC_0(_particlescraper)
-libwarpx.warpx_set_callback_py_particlescraper(_c_particlescraper)
-_c_particleloader = _CALLBACK_FUNC_0(_particleloader)
-libwarpx.warpx_set_callback_py_particleloader(_c_particleloader)
-_c_beforestep = _CALLBACK_FUNC_0(_beforestep)
-libwarpx.warpx_set_callback_py_beforestep(_c_beforestep)
-_c_afterstep = _CALLBACK_FUNC_0(_afterstep)
-libwarpx.warpx_set_callback_py_afterstep(_c_afterstep)
-_c_afterrestart = _CALLBACK_FUNC_0(_afterrestart)
-libwarpx.warpx_set_callback_py_afterrestart(_c_afterrestart)
-_c_particleinjection = _CALLBACK_FUNC_0(_particleinjection)
-libwarpx.warpx_set_callback_py_particleinjection(_c_particleinjection)
-_c_appliedfields = _CALLBACK_FUNC_0(_appliedfields)
-libwarpx.warpx_set_callback_py_appliedfields(_c_appliedfields)
#=============================================================================
def printcallbacktimers(tmin=1.,lminmax=False,ff=None):
@@ -299,7 +279,7 @@ def printcallbacktimers(tmin=1.,lminmax=False,ff=None):
vmin = numpy.min(vlist)
vmax = numpy.max(vlist)
ff.write(' %10.4f %10.4f'%(vmin,vmax))
- it = libwarpx.warpx_getistep(0)
+ it = libwarpx.libwarpx_so.warpx_getistep(0)
if it > 0:
ff.write(' %10.4f'%(vsum/npes/(it)))
ff.write('\n')
@@ -345,7 +325,6 @@ def installpoissonsolver(f):
cannot be uninstalled with the uninstallfuncinlist functionality at present."""
if _poissonsolver.hasfuncsinstalled():
raise RuntimeError('Only one field solver can be installed.')
- libwarpx.warpx_set_callback_py_poissonsolver(_c_poissonsolver)
_poissonsolver.installfuncinlist(f)
def isinstalledpoissonsolver(f):
"""Checks if the function is called for a field solve"""