Skip to content

Commit 61c4221

Browse files
committed
MLSDC run
1 parent 570cbc8 commit 61c4221

File tree

4 files changed

+60
-25
lines changed

4 files changed

+60
-25
lines changed

pySDC/implementations/datatype_classes/petsc_vec.py

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def isend(self, dest=None, tag=None, comm=None):
4141
Returns:
4242
request handle
4343
"""
44-
return comm.Issend(self[:], dest=dest, tag=tag)
44+
return comm.Issend(self.getArray(), dest=dest, tag=tag)
4545

4646
def irecv(self, source=None, tag=None, comm=None):
4747
"""
@@ -55,7 +55,7 @@ def irecv(self, source=None, tag=None, comm=None):
5555
Returns:
5656
None
5757
"""
58-
return comm.Irecv(self[:], source=source, tag=tag)
58+
return comm.Irecv(self.getArray(), source=source, tag=tag)
5959

6060
def bcast(self, root=None, comm=None):
6161
"""
@@ -68,7 +68,7 @@ def bcast(self, root=None, comm=None):
6868
Returns:
6969
broadcasted values
7070
"""
71-
comm.Bcast(self[:], root=root)
71+
comm.Bcast(self.getArray(), root=root)
7272
return self
7373

7474

@@ -104,3 +104,37 @@ def __init__(self, init, val=0.0):
104104
# something is wrong, if none of the ones above hit
105105
else:
106106
raise DataError('something went wrong during %s initialization' % type(self))
107+
108+
109+
class petsc_vec_comp2(object):
110+
"""
111+
RHS data type for Vec with implicit and explicit components
112+
113+
This data type can be used to have RHS with 2 components (here implicit and explicit)
114+
115+
Attributes:
116+
impl (petsc_vec): implicit part
117+
expl (petsc_vec): explicit part
118+
"""
119+
120+
def __init__(self, init, val=0.0):
121+
"""
122+
Initialization routine
123+
124+
Args:
125+
init: can either be a tuple (one int per dimension) or a number (if only one dimension is requested)
126+
or another imex_mesh object
127+
val (float): an initial number (default: 0.0)
128+
Raises:
129+
DataError: if init is none of the types above
130+
"""
131+
132+
if isinstance(init, type(self)):
133+
self.comp1 = petsc_vec(init.comp1)
134+
self.comp2 = petsc_vec(init.comp2)
135+
elif isinstance(init, PETSc.DMDA):
136+
self.comp1 = petsc_vec(init, val=val)
137+
self.comp2 = petsc_vec(init, val=val)
138+
# something is wrong, if none of the ones above hit
139+
else:
140+
raise DataError('something went wrong during %s initialization' % type(self))

pySDC/implementations/transfer_classes/TransferPETScDMDA.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
from pySDC.core.Errors import TransferError
33
from pySDC.core.SpaceTransfer import space_transfer
4-
from pySDC.implementations.datatype_classes.petsc_dmda_grid import petsc_data, rhs_imex_petsc_data, rhs_2comp_petsc_data
4+
from pySDC.implementations.datatype_classes.petsc_vec import petsc_vec, petsc_vec_imex, petsc_vec_comp2
55

66

77
class mesh_to_mesh_petsc_dmda(space_transfer):
@@ -36,17 +36,17 @@ def restrict(self, F):
3636
Args:
3737
F: the fine level data
3838
"""
39-
if isinstance(F, petsc_data):
39+
if isinstance(F, petsc_vec):
4040
u_coarse = self.coarse_prob.dtype_u(self.coarse_prob.init)
41-
self.inject.mult(F.values, u_coarse.values)
42-
elif isinstance(F, rhs_imex_petsc_data):
41+
self.inject.mult(F, u_coarse)
42+
elif isinstance(F, petsc_vec_imex):
4343
u_coarse = self.coarse_prob.dtype_f(self.coarse_prob.init)
44-
self.inject.mult(F.impl.values, u_coarse.impl.values)
45-
self.inject.mult(F.expl.values, u_coarse.expl.values)
46-
elif isinstance(F, rhs_2comp_petsc_data):
44+
self.inject.mult(F.impl, u_coarse.impl)
45+
self.inject.mult(F.expl, u_coarse.expl)
46+
elif isinstance(F, petsc_vec_comp2):
4747
u_coarse = self.coarse_prob.dtype_f(self.coarse_prob.init)
48-
self.inject.mult(F.comp1.values, u_coarse.comp1.values)
49-
self.inject.mult(F.comp2.values, u_coarse.comp2.values)
48+
self.inject.mult(F.comp1, u_coarse.comp1)
49+
self.inject.mult(F.comp2, u_coarse.comp2)
5050
else:
5151
raise TransferError('Unknown type of fine data, got %s' % type(F))
5252

@@ -59,17 +59,17 @@ def prolong(self, G):
5959
Args:
6060
G: the coarse level data
6161
"""
62-
if isinstance(G, petsc_data):
62+
if isinstance(G, petsc_vec):
6363
u_fine = self.fine_prob.dtype_u(self.fine_prob.init)
64-
self.interp.mult(G.values, u_fine.values)
65-
elif isinstance(G, rhs_imex_petsc_data):
64+
self.interp.mult(G, u_fine)
65+
elif isinstance(G, petsc_vec_imex):
6666
u_fine = self.fine_prob.dtype_f(self.fine_prob.init)
67-
self.interp.mult(G.impl.values, u_fine.impl.values)
68-
self.interp.mult(G.expl.values, u_fine.expl.values)
69-
elif isinstance(G, rhs_2comp_petsc_data):
67+
self.interp.mult(G.impl, u_fine.impl)
68+
self.interp.mult(G.expl, u_fine.expl)
69+
elif isinstance(G, petsc_vec_comp2):
7070
u_fine = self.fine_prob.dtype_f(self.fine_prob.init)
71-
self.interp.mult(G.comp1.values, u_fine.comp1.values)
72-
self.interp.mult(G.comp2.values, u_fine.comp2.values)
71+
self.interp.mult(G.comp1, u_fine.comp1)
72+
self.interp.mult(G.comp2, u_fine.comp2)
7373
else:
7474
raise TransferError('Unknown type of coarse data, got %s' % type(G))
7575

pySDC/playgrounds/other/petsc_datatype.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,15 +64,16 @@ def __abs__(self):
6464
da = PETSc.DMDA().create([4, 4], stencil_width=1)
6565

6666
u = mymesh(da, val=9.0)
67-
uarr = da.getVecArray(u)
67+
uarr = u.getArray()
6868

6969
v = mymesh(u)
70-
varr = da.getVecArray(v)
70+
varr = v.getArray()
7171
if v.comm.getRank() == 0:
72-
uarr[0, 0] = 7
72+
uarr[0] = 7
73+
uarr = da.getVecArray(u)
7374
print(uarr[:], uarr.shape, type(u))
7475
print(varr[:], v.getOwnershipRange(), type(v))
75-
76+
exit()
7677
w = np.float(1.0) * (u + v)
7778
warr = da.getVecArray(w)
7879
print(warr[:], da.getRanges(), type(w))

pySDC/tutorial/step_7/C_pySDC_with_PETSc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def main():
5656
problem_params['nu'] = 1.0 # diffusion coefficient
5757
problem_params['freq'] = 2 # frequency for the test value
5858
problem_params['cnvars'] = [(65, 65)] # number of degrees of freedom for the coarsest level
59-
problem_params['refine'] = [1] # number of refinements
59+
problem_params['refine'] = [1, 0] # number of refinements
6060
problem_params['comm'] = space_comm # pass space-communicator to problem class
6161
problem_params['sol_tol'] = 1E-12 # set tolerance to PETSc' linear solver
6262

0 commit comments

Comments
 (0)