Coverage for gpaw/test/parallel/test_blacsdist.py: 100%
49 statements
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-19 00:19 +0000
« prev ^ index » next coverage.py v7.7.1, created at 2025-07-19 00:19 +0000
1import numpy as np
3from gpaw.mpi import world
4from gpaw.blacs import BlacsGrid, Redistributor
7def check(comm, M, N, mcpus, ncpus, mb, nb):
8 grid0 = BlacsGrid(comm, 1, 1)
9 desc0 = grid0.new_descriptor(M, N, M, N, 0, 0)
10 A_mn = desc0.zeros(dtype=float)
11 A_mn[:] = comm.size + 1
13 grid1 = BlacsGrid(comm, mcpus, ncpus)
14 desc1 = grid1.new_descriptor(M, N, mb, nb, 0, 0) # ???
15 B_mn = desc1.zeros(dtype=float)
16 B_mn[:] = comm.rank
18 if comm.rank == 0:
19 msg = 'Slices of global matrix indices by rank'
20 print(msg)
21 print('-' * len(msg))
23 for rank in range(comm.size):
24 comm.barrier()
25 if rank == comm.rank:
26 print('Rank %d:' % rank)
27 last_Mstart = -1
28 for Mstart, Mstop, Nstart, Nstop, block in desc1.my_blocks(B_mn):
29 if Mstart > last_Mstart and last_Mstart >= 0:
30 print()
31 print('[%3d:%3d, %3d:%3d]' % (Mstart, Mstop, Nstart, Nstop),
32 end=' ')
33 last_Mstart = Mstart
34 assert (block == comm.rank).all()
35 print()
36 print()
37 comm.barrier()
39 redistributor = Redistributor(comm, desc1, desc0)
40 redistributor.redistribute(B_mn, A_mn)
42 if comm.rank == 0:
43 msg = 'Rank where each element of the global matrix is stored'
44 print(msg)
45 print('-' * len(msg))
46 print(A_mn)
49def test_parallel_blacsdist(scalapack):
50 M, N = 10, 10
51 mb, nb = 2, 2
52 mcpus = int(np.ceil(world.size**0.5))
53 ncpus = world.size // mcpus
55 if world.rank == 0:
56 print('world size: ', world.size)
57 print('M x N: ', M, 'x', N)
58 print('mcpus x ncpus:', mcpus, 'x', ncpus)
59 print('mb x nb: ', mb, 'x', nb)
60 print()
62 check(world, M, N, mcpus, ncpus, mb, nb)