def get_simulation_method_args(method_props, module_method_args):
    """ Setup the simulation method and its keyword arguments

    Args:
        method_props (:obj:`dict`): properties of the simulation method
        module_method_args (:obj:`dict`): dictionary representing the desired simulation function,
            its parent module, and the desired keyword arguments to the function

    Returns:
        :obj:`tuple`:

            * :obj:`types.FunctionType`: simulation method
            * :obj:`dict`: keyword arguments for the simulation method
    """
    solver_props = module_method_args['solver']
    solver_module = solver_props['module']
    solver_method_name = solver_props['function_prefix'] + '_' + method_props['function_suffix']
    solver_method = getattr(solver_module, solver_method_name)
    if module_method_args['optimization_method']:
        opt_method = module_method_args['optimization_method']
        module_method_args['args']['method'] = solver_props['optimization_methods'].get(opt_method, None)
        if not module_method_args['args']['method']:
            msg = ("`{}` is not a supported optimization method of {}. "
                   "{} supports the following optimization methods (KISAO_0000552):\n  - {}").format(
                opt_method,
                solver_props['name'],
                solver_props['name'],
                '\n  - '.join('`' + name + '`' for name in sorted(solver_props['optimization_methods'].keys())))
            raise NotImplementedError(msg)

    solver_method_args = dict(**module_method_args['args'], **method_props['default_args'])

    return solver_method, solver_method_args