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

1import dolfin as df 

2 

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 

6 

7 

8class mesh_to_mesh_fenics(SpaceTransfer): 

9 """ 

10 This implementation can restrict and prolong between fenics meshes 

11 """ 

12 

13 def project(self, F): 

14 """ 

15 Restriction implementation via projection 

16 

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)) 

28 

29 return u_coarse 

30 

31 def restrict(self, F): 

32 """ 

33 Restriction implementation 

34 

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)) 

46 

47 return u_coarse 

48 

49 def prolong(self, G): 

50 """ 

51 Prolongation implementation 

52 

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)) 

64 

65 return u_fine