diff --git a/CHANGELOG.md b/CHANGELOG.md index 538cc7c2..d420d9aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # FEniCS-preCICE adapter changelog +## 2.1.0 + +* Additionally support checkpoints being provided as a list or tuple (of FEniCS Functions). [#170](https://github.com/precice/fenics-adapter/pull/170) + ## 2.0.0 * Drop support for preCICE 2.x version, as this is a breaking release. diff --git a/CITATION.cff b/CITATION.cff index a1de507f..759c6345 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -32,7 +32,7 @@ abstract: >- preCICE-adapter for the open source computing platform FEniCS. license: LGPL-3.0 -version: 2.0.0 +version: 2.1.0 preferred-citation: title: "FEniCS-preCICE: Coupling FEniCS to other Simulation Software" type: "article" diff --git a/docs/ReleaseGuide.md b/docs/ReleaseGuide.md index 1a6093c4..6365b0dc 100644 --- a/docs/ReleaseGuide.md +++ b/docs/ReleaseGuide.md @@ -10,7 +10,7 @@ Before starting this process make sure to check that all relevant changes are in a) Before merging the PR, make sure to bump the version in `CHANGELOG.md` on `fenics-adapter-vX.X.X`. - b) Update the version in `CITATION.cff` and update the release date. + b) Update the version in `CITATION.cff`. c) There is no need to bump the version anywhere else, since we use the [python-versioneer](https://github.com/python-versioneer/python-versioneer/) for maintaining the version everywhere else. @@ -24,3 +24,5 @@ Before starting this process make sure to check that all relevant changes are in 5. Merge `master` into `develop` for synchronization of `develop`. 6. If everything is in order up to this point then the new version can be released by hitting the "Publish release" button in your Release Draft. + +7. Now there should be a tag for the release. Re-run the [docker release workflow `build-docker.yml` via dispatch](https://github.com/precice/fenics-adapter/actions/workflows/build-docker.yml) such that the correct version is picked up by `versioneer`. Check the version in the container via `docker pull precice/fenics-adapter`, then `docker run -ti precice/fenics-adapter`, and inside the container `$ python3 -c "import fenicsprecice; print(fenicsprecice.__version__)"`. diff --git a/fenicsprecice/fenicsprecice.py b/fenicsprecice/fenicsprecice.py index 09e77d77..e766f7d7 100644 --- a/fenicsprecice/fenicsprecice.py +++ b/fenicsprecice/fenicsprecice.py @@ -432,14 +432,14 @@ def initialize(self, coupling_subdomain, read_function_space=None, write_object= self._participant.initialize() - def store_checkpoint(self, user_u, t, n): + def store_checkpoint(self, payload, t, n): """ Defines an object of class SolverState which stores the current state of the variable and the time stamp. Parameters ---------- - user_u : FEniCS Function - Current state of the physical variable of interest for this participant. + payload : fenics.function or a list of fenics.functions + Current state of the physical variable(s) of interest for this participant. t : double Current simulation time. n : int @@ -449,10 +449,7 @@ def store_checkpoint(self, user_u, t, n): assert (self.is_time_window_complete()) logger.debug("Store checkpoint") - my_u = user_u.copy() - # making sure that the FEniCS function provided by user is not directly accessed by the Adapter - assert (my_u != user_u) - self._checkpoint = SolverState(my_u, t, n) + self._checkpoint = SolverState(payload, t, n) def retrieve_checkpoint(self): """ diff --git a/fenicsprecice/solverstate.py b/fenicsprecice/solverstate.py index c7c05dde..ca90a96f 100644 --- a/fenicsprecice/solverstate.py +++ b/fenicsprecice/solverstate.py @@ -1,36 +1,43 @@ class SolverState: - def __init__(self, u, t, n): + def __init__(self, payload, t, n): """ - Solver state consists of a value u, associated time t and the timestep n + Solver state consists of a payload (either a single fenics.Function or a list of several fenics.Functions), associated time t and the timestep n Parameters ---------- - u : Object of class dolfin.functions.function.Function - FEniCS function related to the field during each coupling iteration. + payload : A fenics.Function or a list of fenics.Functions + Describes the state of the solver. t : double Time stamp. n : int Iteration number. """ - self.u = u + try: + self.payload = payload.copy() + except AttributeError: # if .copy() does not exist, it probably is a list + self.payload = [item.copy() for item in payload] + self.t = t self.n = n def get_state(self): """ - Returns the state variables value u, associated time t and timestep n + Returns the state variables payload, associated time t and timestep n Returns ------- - u : Object of class dolfin.functions.function.Function - A copy of FEniCS function related to the field during each coupling iteration. + payload : A fenics.Function or a list of fenics.Functions + Describes the state of the solver. t : double Time stamp. n : int Iteration number. """ - return self.u.copy(), self.t, self.n + try: + return self.payload.copy(), self.t, self.n + except AttributeError: # if .copy() does not exist, it probably is a list + return [item.copy() for item in self.payload], self.t, self.n def print_state(self): - u, t, n = self.get_state() - return print("u={u}, t={t}, n={n}".format(u=u, t=t, n=n)) + payload, t, n = self.get_state() + return print(f"payload={payload}, t={t}, n={n}")