class Settings:
    """
    Args:
        absolute_tolerance (float): the absolute tolerance of the newton
            solver
        relative_tolerance (float): the relative tolerance of the newton
            solver
        maximum_iterations (int, optional): maximum iterations allowed for
            the solver to converge. Defaults to 30.
        transient (bool, optional): If set to True, the simulation will be
            transient. Defaults to True.
        final_time (float, optional): final time of the simulation.
            Defaults to None.
        chemical_pot (bool, optional): if True, conservation of chemical
            potential will be assumed. Defaults to False.
        soret (bool, optional): if True, Soret effect will be assumed.
            Defaults to False.
        traps_element_type (str, optional): Finite element used for traps.
            If traps densities are discontinuous (eg. different materials)
            "DG" is recommended. Defaults to "CG".
        update_jacobian (bool, optional): If set to False, the Jacobian of
            the formulation will be computed only once at the beggining.
            Else it will be computed at each time step. Defaults to True.
        linear_solver (str, optional): linear solver method for the newton solver,
            options can be viewed by print(list_linear_solver_methods()).
            More information can be found at: https://fenicsproject.org/pub/tutorial/html/._ftut1017.html.
            Defaults to None, for the newton solver this is: "umfpack".
        preconditioner (str, optional): preconditioning method for the newton solver,
            options can be viewed by print(list_krylov_solver_preconditioners()).
            Defaults to "default".

    Attributes:
        transient (bool): transient or steady state sim
        final_time (float): final time of the simulation.
        chemical_pot (bool): conservation of chemical potential
        soret (bool): soret effect
        absolute_tolerance (float): the absolute tolerance of the newton
            solver
        relative_tolerance (float): the relative tolerance of the newton
            solver
        maximum_iterations (int): maximum iterations allowed for
            the solver to converge
        traps_element_type (str): Finite element used for traps.
        update_jacobian (bool):
        linear_solver (str): linear solver method for the newton solver
        precondtitioner (str): preconditioning method for the newton solver
    """

    def __init__(
        self,
        absolute_tolerance,
        relative_tolerance,
        maximum_iterations=30,
        transient=True,
        final_time=None,
        chemical_pot=False,
        soret=False,
        traps_element_type="CG",
        update_jacobian=True,
        linear_solver=None,
        preconditioner="default",
    ):
        # TODO maybe transient and final_time are redundant
        self.transient = transient
        self.final_time = final_time
        self.chemical_pot = chemical_pot
        self.soret = soret

        self.absolute_tolerance = absolute_tolerance
        self.relative_tolerance = relative_tolerance
        self.maximum_iterations = maximum_iterations

        self.traps_element_type = traps_element_type
        self.update_jacobian = update_jacobian
        self.linear_solver = linear_solver
        self.preconditioner = preconditioner
