Run many models with a range of parameter sets.

    Parameters
    ----------
    ModelClass: callable
        A class or factory function that returns a model object by
        calling `ModelClass(model_kwargs)`
    model_kwargs: dict
        See `ModelClass` explanation.
    t_output_every: float
        see :class:`Runner`.
    t_upto: float
        Run each model until the time is equal to this
    field: str
        The name of the field to be varied, whose values are in `vals`.
    vals: array_like
        Iterable of values to use to instantiate each Model object.
    parallel: bool
        Whether or not to run the models in parallel, using the Multiprocessing
        library. If `True`, the number of concurrent tasks will be equal to
        one less than the number of available cores detected.

def run_field_scan(ModelClass, model_kwargs, t_output_every, t_upto, field,
                   vals, force_resume=True, parallel=False):
    """Run many models with a range of parameter sets.

    Parameters
    ----------
    ModelClass: callable
        A class or factory function that returns a model object by
        calling `ModelClass(model_kwargs)`
    model_kwargs: dict
        See `ModelClass` explanation.
    t_output_every: float
        see :class:`Runner`.
    t_upto: float
        Run each model until the time is equal to this
    field: str
        The name of the field to be varied, whose values are in `vals`.
    vals: array_like
        Iterable of values to use to instantiate each Model object.
    parallel: bool
        Whether or not to run the models in parallel, using the Multiprocessing
        library. If `True`, the number of concurrent tasks will be equal to
        one less than the number of available cores detected.
    """
    model_kwarg_sets = [dict(model_kwargs, field=val) for val in vals]
    run_kwarg_scan(ModelClass, model_kwarg_sets,
                   t_output_every, t_upto, force_resume, parallel)