44import pySDC .helpers .transfer_helper as th
55from pySDC .core .Errors import TransferError
66from pySDC .core .SpaceTransfer import space_transfer
7- from pySDC .implementations .datatype_classes .mesh import mesh , imex_mesh , comp2_mesh
87
98
109class mesh_to_mesh (space_transfer ):
1110 """
12- Custon base_transfer class, implements Transfer.py
11+ Custom base_transfer class, implements Transfer.py
1312
1413 This implementation can restrict and prolong between nd meshes with dirichlet-0 or periodic boundaries
15- via matrix-vector products
14+ via matrix-vector products.
1615
1716 Attributes:
1817 Rspace: spatial restriction matrix, dim. Nf x Nc
@@ -30,7 +29,7 @@ def __init__(self, fine_prob, coarse_prob, params):
3029 """
3130
3231 # invoke super initialization
33- super (mesh_to_mesh , self ).__init__ (fine_prob , coarse_prob , params )
32+ super ().__init__ (fine_prob , coarse_prob , params )
3433
3534 if self .params .rorder % 2 != 0 :
3635 raise TransferError ('Need even order for restriction' )
@@ -153,51 +152,31 @@ def restrict(self, F):
153152 Args:
154153 F: the fine level data (easier to access than via the fine attribute)
155154 """
156- if isinstance (F , mesh ):
157- G = self .coarse_prob .dtype_u (self .coarse_prob .init )
158- if hasattr (self .fine_prob , 'ncomp' ):
159- for i in range (self .fine_prob .ncomp ):
160- tmpF = F [..., i ].flatten ()
161- tmpG = self .Rspace .dot (tmpF )
162- G [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
163- else :
164- tmpF = F .flatten ()
165- tmpG = self .Rspace .dot (tmpF )
166- G [:] = tmpG .reshape (self .coarse_prob .nvars )
167- elif isinstance (F , imex_mesh ):
168- G = self .coarse_prob .dtype_f (self .coarse_prob .init )
169- if hasattr (self .fine_prob , 'ncomp' ):
170- for i in range (self .fine_prob .ncomp ):
171- tmpF = F .impl [..., i ].flatten ()
172- tmpG = self .Rspace .dot (tmpF )
173- G .impl [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
174- tmpF = F .expl [..., i ].flatten ()
175- tmpG = self .Rspace .dot (tmpF )
176- G .expl [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
177- else :
178- tmpF = F .impl .flatten ()
179- tmpG = self .Rspace .dot (tmpF )
180- G .impl [:] = tmpG .reshape (self .coarse_prob .nvars )
181- tmpF = F .expl .flatten ()
182- tmpG = self .Rspace .dot (tmpF )
183- G .expl [:] = tmpG .reshape (self .coarse_prob .nvars )
184- elif isinstance (F , comp2_mesh ):
185- G = self .coarse_prob .dtype_f (self .coarse_prob .init )
155+ G = type (F )(self .coarse_prob .init )
156+
157+ def _restrict (fine , coarse ):
186158 if hasattr (self .fine_prob , 'ncomp' ):
187159 for i in range (self .fine_prob .ncomp ):
188- tmpF = F .comp1 [..., i ].flatten ()
189- tmpG = self .Rspace .dot (tmpF )
190- G .comp1 [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
191- tmpF = F .comp2 [..., i ].flatten ()
192- tmpG = self .Rspace .dot (tmpF )
193- G .comp2 [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
160+ if fine .shape [- 1 ] == self .fine_prob .ncomp :
161+ tmpF = fine [..., i ].flatten ()
162+ tmpG = self .Rspace .dot (tmpF )
163+ coarse [..., i ] = tmpG .reshape (self .coarse_prob .nvars )
164+ elif fine .shape [0 ] == self .fine_prob .ncomp :
165+ tmpF = fine [i , ...].flatten ()
166+ tmpG = self .Rspace .dot (tmpF )
167+ coarse [i , ...] = tmpG .reshape (self .coarse_prob .nvars )
168+ else :
169+ raise TransferError ('Don\' t know how to restrict for this problem with multiple components' )
194170 else :
195- tmpF = F .comp1 .flatten ()
196- tmpG = self .Rspace .dot (tmpF )
197- G .comp1 [:] = tmpG .reshape (self .coarse_prob .nvars )
198- tmpF = F .comp2 .flatten ()
171+ tmpF = fine .flatten ()
199172 tmpG = self .Rspace .dot (tmpF )
200- G .comp2 [:] = tmpG .reshape (self .coarse_prob .nvars )
173+ coarse [:] = tmpG .reshape (self .coarse_prob .nvars )
174+
175+ if hasattr (type (F ), 'components' ):
176+ for comp in F .components :
177+ _restrict (F .__getattr__ (comp ), G .__getattr__ (comp ))
178+ elif type (F ).__name__ == 'mesh' :
179+ _restrict (F , G )
201180 else :
202181 raise TransferError ('Wrong data type for restriction, got %s' % type (F ))
203182 return G
@@ -208,51 +187,32 @@ def prolong(self, G):
208187 Args:
209188 G: the coarse level data (easier to access than via the coarse attribute)
210189 """
211- if isinstance (G , mesh ):
212- F = self .fine_prob .dtype_u (self .fine_prob .init )
213- if hasattr (self .fine_prob , 'ncomp' ):
214- for i in range (self .fine_prob .ncomp ):
215- tmpG = G [..., i ].flatten ()
216- tmpF = self .Pspace .dot (tmpG )
217- F [..., i ] = tmpF .reshape (self .fine_prob .nvars )
218- else :
219- tmpG = G .flatten ()
220- tmpF = self .Pspace .dot (tmpG )
221- F [:] = tmpF .reshape (self .fine_prob .nvars )
222- elif isinstance (G , imex_mesh ):
223- F = self .fine_prob .dtype_f (self .fine_prob .init )
224- if hasattr (self .fine_prob , 'ncomp' ):
225- for i in range (self .fine_prob .ncomp ):
226- tmpG = G .impl [..., i ].flatten ()
227- tmpF = self .Pspace .dot (tmpG )
228- F .impl [..., i ] = tmpF .reshape (self .fine_prob .nvars )
229- tmpG = G .expl [..., i ].flatten ()
230- tmpF = self .Rspace .dot (tmpG )
231- F .expl [..., i ] = tmpF .reshape (self .fine_prob .nvars )
232- else :
233- tmpG = G .impl .flatten ()
234- tmpF = self .Pspace .dot (tmpG )
235- F .impl [:] = tmpF .reshape (self .fine_prob .nvars )
236- tmpG = G .expl .flatten ()
237- tmpF = self .Pspace .dot (tmpG )
238- F .expl [:] = tmpF .reshape (self .fine_prob .nvars )
239- elif isinstance (G , comp2_mesh ):
240- F = self .fine_prob .dtype_f (self .fine_prob .init )
190+ F = type (G )(self .fine_prob .init )
191+
192+ def _prolong (coarse , fine ):
241193 if hasattr (self .fine_prob , 'ncomp' ):
242194 for i in range (self .fine_prob .ncomp ):
243- tmpG = G .comp1 [..., i ].flatten ()
244- tmpF = self .Pspace .dot (tmpG )
245- F .comp1 [..., i ] = tmpF .reshape (self .fine_prob .nvars )
246- tmpG = G .comp2 [..., i ].flatten ()
247- tmpF = self .Rspace .dot (tmpG )
248- F .comp2 [..., i ] = tmpF .reshape (self .fine_prob .nvars )
195+ if coarse .shape [- 1 ] == self .fine_prob .ncomp :
196+ tmpG = coarse [..., i ].flatten ()
197+ tmpF = self .Pspace .dot (tmpG )
198+ fine [..., i ] = tmpF .reshape (self .fine_prob .nvars )
199+ elif coarse .shape [0 ] == self .fine_prob .ncomp :
200+ tmpG = coarse [i , ...].flatten ()
201+ tmpF = self .Pspace .dot (tmpG )
202+ fine [i , ...] = tmpF .reshape (self .fine_prob .nvars )
203+ else :
204+ raise TransferError ('Don\' t know how to prolong for this problem with multiple components' )
249205 else :
250- tmpG = G .comp1 .flatten ()
251- tmpF = self .Pspace .dot (tmpG )
252- F .comp1 [:] = tmpF .reshape (self .fine_prob .nvars )
253- tmpG = G .comp2 .flatten ()
206+ tmpG = coarse .flatten ()
254207 tmpF = self .Pspace .dot (tmpG )
255- F .comp2 [:] = tmpF .reshape (self .fine_prob .nvars )
208+ fine [:] = tmpF .reshape (self .fine_prob .nvars )
209+ return fine
210+
211+ if hasattr (type (F ), 'components' ):
212+ for comp in G .components :
213+ _prolong (G .__getattr__ (comp ), F .__getattr__ (comp ))
214+ elif type (G ).__name__ == 'mesh' :
215+ F [:] = _prolong (G , F )
256216 else :
257217 raise TransferError ('Wrong data type for prolongation, got %s' % type (G ))
258218 return F
0 commit comments