Use a finite-element modeling code to infer geometric factors for meshes
    with topography or irregular electrode spacings.

    Parameters
    ----------
    dataframe : pandas.DataFrame
        the data frame that contains the data
    settings : dict
        The settings required to compute the geometric factors. See examples
        down below for more information in the required content.
    keep_dir : path
        if not None, copy modeling dir here

    Returns
    -------
    K : :class:`numpy.ndarray`
        K factors (are also directly written to the dataframe)

    Examples
    --------
    ::

        settings = {
            'rho': 100,
            'elem': 'elem.dat',
            'elec': 'elec.dat',
            'sink_node': '100',
            '2D': False,
        }

def compute_K_numerical(dataframe, settings=None, keep_dir=None):
    """Use a finite-element modeling code to infer geometric factors for meshes
    with topography or irregular electrode spacings.

    Parameters
    ----------
    dataframe : pandas.DataFrame
        the data frame that contains the data
    settings : dict
        The settings required to compute the geometric factors. See examples
        down below for more information in the required content.
    keep_dir : path
        if not None, copy modeling dir here

    Returns
    -------
    K : :class:`numpy.ndarray`
        K factors (are also directly written to the dataframe)

    Examples
    --------
    ::

        settings = {
            'rho': 100,
            'elem': 'elem.dat',
            'elec': 'elec.dat',
            'sink_node': '100',
            '2D': False,
        }


    """
    inversion_code = reda.rcParams.get('geom_factor.inversion_code', 'crtomo')
    if inversion_code == 'crtomo':
        import reda.utils.geom_fac_crtomo as geom_fac_crtomo
        if keep_dir is not None:
            keep_dir = os.path.abspath(keep_dir)
        K = geom_fac_crtomo.compute_K(
            dataframe, settings, keep_dir)
    else:
        raise Exception(
            'Inversion code {0} not implemented for K computation'.format(
                inversion_code
            ))
    return K