In order to calculate magnetic moments the following function has to be present in the module file *.so:
extern "C" void mcalc(Vector & m,double * T, Vector & Hxc, Vector & Hext,
                      double * gJ, Vector & MODPAR,
                      char ** sipffilename, ComplexMatrix & Icalc_parstorage);
Note for windows users with MINGW the declaration should be extern "C" __declspec(dllexport) void mcalc(...).
The meaning of the symbols is as follows:
  on input
    T           temperature[K]
    Hxc         vector of exchange field [meV] (n-dimensional, for a set of n operators I)
    Hext        external magnetic field [T] (3 components)
    gJ          Lande factor as read from sipf file
    MODPAR      Vector with Parameters  read from single ion property file
    sipffilename    file name of the single ion parameter file
    Icalc_parstorage parameter matrix (initialized by Icalc_parameter_storage_matrix_init)
                   it should/may contain any information, e.g. population numbers of the
                   states (imaginary part of row 0)
                   and eigenvalues (real part of row 0) with values set by the most recent call
                   for this ion (use of this matrix is optional, it is provided to save time by
                   storing here information instead of recalculating it for every call of Icalc)
  on output    
    m             =<2S+L>, thermal expectation value of the magnetic moment operator <m> 
                  in units of muB
    Icalc_parstorage     parameter matrix matrix (optional)
                   it should/may contain any information for the next call of mcalc/Icalc, e.g.
                   population numbers of the states (imaginary part of row 0)
                   and eigenvalues (real part of row 0) ...
The module function must perform the following tasks:
Thus the function resembles closely Icalc, however no U and lnZ are calculated and
the magnetic moment vector , which is returned, has always exactly 3 components.