File: testParallelMultiBlockWriter.py

package info (click to toggle)
vtk9 9.5.2%2Bdfsg3-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 205,916 kB
  • sloc: cpp: 2,336,565; ansic: 327,116; python: 111,200; yacc: 4,104; java: 3,977; sh: 3,032; xml: 2,771; perl: 2,189; lex: 1,787; makefile: 178; javascript: 165; objc: 153; tcl: 59
file content (132 lines) | stat: -rw-r--r-- 3,994 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from __future__ import print_function
import shutil, os

from vtkmodules.vtkCommonDataModel import (
    vtkMultiBlockDataSet,
    vtkMultiPieceDataSet,
    vtkPolyData,
)
from vtkmodules.vtkFiltersSources import vtkSphereSource
from vtkmodules.vtkIOParallelXML import vtkXMLPMultiBlockDataWriter
from vtkmodules.vtkIOXML import vtkXMLMultiBlockDataReader
from vtkmodules.vtkParallelCore import vtkMultiProcessController

from vtkmodules.util.misc import vtkGetTempDir
VTK_TEMP_DIR = vtkGetTempDir()

contr = vtkMultiProcessController.GetGlobalController()
if not contr:
    nranks = 1
    rank = 0
else:
    nranks = contr.GetNumberOfProcesses()
    rank = contr.GetLocalProcessId()

# Let's create a simple multiblock with non-empty blocks as indicated below.
# <MB> is a multiblock dataset.
# [<num>] is a leaf node where the number indicates the ranks on which it is
# non-null
# (<num>) is a leaf node where the number indicates the ranks on which it is
# non-empty

# <MB>
#   |
#   |-- <MB>    # level where a block is non-null on only 1 rank
#   |   |
#   |   |-- [0](0)
#   |   |-- [1](1)
#   |   |-- [2](2)
#   |   ... (up to total number of ranks)
#   |
#   |-- <MB>    # level where block is non-null on all ranks, but non-empty only on 1
#   |   |
#   |   |-- [0,1,..nranks](0)
#   |   |-- [0,1,..nranks](1)
#   |   |-- [0,1,..nranks](2)
#   |   ... (up to total number of ranks)
#   |
#   |-- <MB>    # level where block is non-null, non-empty on all ranks.
#   |   |
#   |   |-- [0,1,..nranks](0,1,...nranks)
#   |   |-- [0,1,..nranks](0,1,...nranks)
#   |   |-- [0,1,..nranks](0,1,...nranks)
#   |   ... (up to total number of ranks)
#   |
#   |-- <MP>    # level where a multipiece dataset is present on all ranks
#   |  |
#   |  |-- [0,1,..nranks](0,1,...nranks)
#   |  |-- [0,1,..nranks](0,1,...nranks)
#   |  |-- [0,1,..nranks](0,1,...nranks)
#   |  ... (up to total number of ranks)


def createDataSet(empty):
    if not empty:
        s = vtkSphereSource()
        s.Update()
        clone = s.GetOutputDataObject(0).NewInstance()
        clone.ShallowCopy(s.GetOutputDataObject(0))
        return clone
    else:
        return vtkPolyData()

def createData(non_null_ranks, non_empty_ranks, num_ranks):
    mb = vtkMultiBlockDataSet()
    mb.SetNumberOfBlocks(num_ranks)
    for i in non_null_ranks:
        mb.SetBlock(i, createDataSet(i not in non_empty_ranks))
    return mb

def createMP(num_pieces):
    mp = vtkMultiPieceDataSet()
    mp.SetNumberOfPieces(num_pieces)
    for i in range(num_pieces):
        mp.SetPiece(i, createDataSet(False))
    return mp

def createMB(piece, num_pieces):
    output = vtkMultiBlockDataSet()
    output.SetNumberOfBlocks(4)
    output.SetBlock(0, createData([piece], [piece], num_pieces))
    output.SetBlock(1, createData(range(num_pieces), [piece], num_pieces))
    output.SetBlock(2, createData(range(num_pieces), range(num_pieces), num_pieces))
    output.SetBlock(3, createMP(num_pieces))
    return output

writer = vtkXMLPMultiBlockDataWriter()
prefix =VTK_TEMP_DIR + "/testParallelXMLWriters"
fname = prefix + ".vtm"

if rank == 0:
    try:
        os.remove(fname)
    except OSError: pass
    try:
        shutil.rmtree(prefix)
    except OSError: pass
    print("Output: %s" % fname)

# put a barrier here to make sure that the files are deleted by process 0
# before going further with the test
if contr:
    contr.Barrier()

writer.SetFileName(fname)
writer.SetInputDataObject(createMB(rank, nranks))
writer.Write()

if contr:
    contr.Barrier()

if rank == 0:
    reader = vtkXMLMultiBlockDataReader()
    reader.SetFileName(fname)
    reader.Update()

    # since verifying the md structure won't reveal if we have written the write
    # set of files, let's just look at the files we wrote out.
    files = os.listdir(prefix)

    expected_file_count = nranks + nranks + 2*(nranks*nranks)
    print ("Expecting %d files for the leaf nodes" % expected_file_count)
    assert (len(files) == expected_file_count)