Recipes for ‘simple’ additions
This page will list ‘recipes’ for how to add simple expansions to MDMC.
New approximation functions
If you would like to add a new approximation function for Control objects (e.g. Gaussian, Lorentzian), MDMC’s handling of these functions is built to be expandable. Do the following:
Let myfunction be the name of your function.
Change the docstrings for the Control class in control.py and the AbstractSQw class to list your function as a resolution function.
go to MDMC/resolution/ and add a file called myfunction.py. This file should define a subclass of Resolution named MyfunctionResolution (note the title case). This has a mandatory method, apply(self, fqt, t), which takes your function and applies it to an FQt array.
If your function is numeric, you should create another method, window_in_t(self, t) which calculates the Fourier transform of your function on an array t. apply() can then simply be:
def apply(self, fqt, t):
N_Q, N_T = np.shape(fqt)
window = self.window_in_t(t[:N_T])
return np.broadcast_to(window, (N_Q, N_T)) * fqt
Here, you are done implementation-wise! Factory patterns will handle the actual implementation of your function. However, you should add some tests:
Create a new file in the directory MDMC/tests/system_tests/observables/ and name it test_SQw_myfunction. In here, please add tests which validate your new function’s calculations against a benchmark (either a similar calculation made in a third-party software, or done by hand).
If your function is not simply numeric (i.e. requires __init__ arguments other than a single numeric value), some tweaking of MDMC/trajectory_analysis/observables/sqw.py and tests/resolution/test_resolution_factory.py will also be necessary, and your function may take a lot more work.
Now you should be done; if you create a Control object with a dataset that has resolution {‘MY_FUNCTION’: x}, it should apply your resolution function to this data.