Skip to content

Commit

Permalink
Support listlike checkpoints (#170)
Browse files Browse the repository at this point in the history
* Support listlike checkpoints.
  • Loading branch information
BenjaminRodenberg authored Mar 13, 2024
1 parent 6c8d7be commit 03ce6bd
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 18 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# FEniCS-preCICE adapter changelog

## latest

* 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.
Expand Down
11 changes: 4 additions & 7 deletions fenicsprecice/fenicsprecice.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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):
"""
Expand Down
29 changes: 18 additions & 11 deletions fenicsprecice/solverstate.py
Original file line number Diff line number Diff line change
@@ -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}")

0 comments on commit 03ce6bd

Please sign in to comment.