Coverage for pySDC/implementations/transfer_classes/TransferFenicsMesh.py: 62%
29 statements
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 10:09 +0000
« prev ^ index » next coverage.py v7.6.12, created at 2025-02-20 10:09 +0000
1import dolfin as df
3from pySDC.core.errors import TransferError
4from pySDC.core.space_transfer import SpaceTransfer
5from pySDC.implementations.datatype_classes.fenics_mesh import fenics_mesh, rhs_fenics_mesh
8class mesh_to_mesh_fenics(SpaceTransfer):
9 """
10 This implementation can restrict and prolong between fenics meshes
11 """
13 def project(self, F):
14 """
15 Restriction implementation via projection
17 Args:
18 F: the fine level data
19 """
20 if isinstance(F, fenics_mesh):
21 u_coarse = fenics_mesh(df.project(F.values, self.coarse_prob.init))
22 elif isinstance(F, rhs_fenics_mesh):
23 u_coarse = rhs_fenics_mesh(self.coarse_prob.init)
24 u_coarse.impl.values = df.project(F.impl.values, self.coarse_prob.init)
25 u_coarse.expl.values = df.project(F.expl.values, self.coarse_prob.init)
26 else:
27 raise TransferError('Unknown type of fine data, got %s' % type(F))
29 return u_coarse
31 def restrict(self, F):
32 """
33 Restriction implementation
35 Args:
36 F: the fine level data
37 """
38 if isinstance(F, fenics_mesh):
39 u_coarse = fenics_mesh(df.interpolate(F.values, self.coarse_prob.init))
40 elif isinstance(F, rhs_fenics_mesh):
41 u_coarse = rhs_fenics_mesh(self.coarse_prob.init)
42 u_coarse.impl.values = df.interpolate(F.impl.values, self.coarse_prob.init)
43 u_coarse.expl.values = df.interpolate(F.expl.values, self.coarse_prob.init)
44 else:
45 raise TransferError('Unknown type of fine data, got %s' % type(F))
47 return u_coarse
49 def prolong(self, G):
50 """
51 Prolongation implementation
53 Args:
54 G: the coarse level data
55 """
56 if isinstance(G, fenics_mesh):
57 u_fine = fenics_mesh(df.interpolate(G.values, self.fine_prob.init))
58 elif isinstance(G, rhs_fenics_mesh):
59 u_fine = rhs_fenics_mesh(self.fine_prob.init)
60 u_fine.impl.values = df.interpolate(G.impl.values, self.fine_prob.init)
61 u_fine.expl.values = df.interpolate(G.expl.values, self.fine_prob.init)
62 else:
63 raise TransferError('Unknown type of coarse data, got %s' % type(G))
65 return u_fine