diff --git a/src/plasma_simulation/__init__.py b/src/plasma_simulation/__init__.py new file mode 100644 index 0000000..640b291 --- /dev/null +++ b/src/plasma_simulation/__init__.py @@ -0,0 +1,5 @@ +from plasma_simulation.base import SimulationBase + +__all__ = [ + "SimulationBase", +] diff --git a/src/plasma_simulation/base.py b/src/plasma_simulation/base.py new file mode 100644 index 0000000..8fcc85b --- /dev/null +++ b/src/plasma_simulation/base.py @@ -0,0 +1,60 @@ +from abc import ABCMeta, abstractmethod + + +class SimulationBase(metaclass=ABCMeta): + """Abstract base class for simulations.""" + + @abstractmethod + def __init__(self, **kwargs): + """Initialize the simulation.""" + pass + + @abstractmethod + def allocate(self, verbose: bool = False): + """Allocate the simulation variables in memory.""" + pass + + @abstractmethod + def save_geometry_and_equil_vtk(self, verbose: bool = False): + """Save geometry and equilibrium in VTK format.""" + pass + + @abstractmethod + def initialize_data_storage(self, verbose: bool = False): + """Initialize the simulation data storage.""" + pass + + @abstractmethod + def run(self, verbose: bool = False): + """Run the simulation.""" + pass + + @abstractmethod + def pproc(self, verbose: bool = False): + """Post-process the simulation results.""" + pass + + @abstractmethod + def load_plotting_data(self, verbose: bool = False): + """Load post-processed data for visualization.""" + pass + + @abstractmethod + def to_dict(self) -> dict: + """Serialize the simulation configuration to a dictionary.""" + pass + + @abstractmethod + def from_dict(cls, dct: dict): + """Deserialize a simulation configuration from a dictionary.""" + pass + + @abstractmethod + def from_file(cls, file_path: str): + """Deserialize a simulation configuration from a file.""" + pass + + @abstractmethod + def export(self, file_path: str): + """Export a simulation configuration to a YAML or JSON file based on the file extension.""" + pass diff --git a/src/plasma_simulation/tests/test_app.py b/src/plasma_simulation/tests/test_app.py new file mode 100644 index 0000000..300746b --- /dev/null +++ b/src/plasma_simulation/tests/test_app.py @@ -0,0 +1,18 @@ +import pytest + +from plasma_simulation import SimulationBase + + +def test_import_app(): + # Import check and API surface check. + assert SimulationBase is not None + + +def test_simulation_base_is_abstract(): + with pytest.raises(TypeError, match="abstract class SimulationBase"): + SimulationBase() + + +if __name__ == "__main__": + test_import_app() + test_simulation_base_is_abstract() diff --git a/src/plasma_simulation/tests/unit/__init__.py b/src/plasma_simulation/tests/unit/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/plasma_simulation/tests/unit/test_app.py b/src/plasma_simulation/tests/unit/test_app.py deleted file mode 100644 index 04c3681..0000000 --- a/src/plasma_simulation/tests/unit/test_app.py +++ /dev/null @@ -1,9 +0,0 @@ -def test_import_app(): - from plasma_simulation.main import main - - print("app imported") - main() - - -if __name__ == "__main__": - test_import_app()