# VTKHDF: Clarifying a distinction between MB and PDC

**URL:** https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306
**Category:** Support
**Tags:** file-formats
**Created:** [February 26, 2026, 5:10am UTC](https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306 "2026-02-26T05:10:05Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![nncarlson](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/n/ed655f/32.png) [@nncarlson](https://discourse.vtk.org/u/nncarlson)
#### Post date: [February 26, 2026, 5:10am UTC](https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306/1 "2026-02-26T05:10:05Z")

</div>

When describing the difference between MB and PDC datasets, the 2.6 spec says:

> “For PDC, a group in the assembly that is […] a softlink represents a dataset index associated to its parent node.”

I don’t understand what this means. How can a softlink represent a **dataset index**? Surely the softlink points to a **block group** that is a sibling of the Assembly group, right?

PDC require that the block groups have an integer-valued `Index` attribute. Are these arbitrary, sequentially numbered from 0 in the order the groups are created in the file, or something else? There’s no indication of how they are used.

---

<div class="post-metadata">

### Author: ![mwestphal](https://discourse.vtk.org/user_avatar/discourse.vtk.org/mwestphal/32/19_2.png) [@mwestphal](https://discourse.vtk.org/u/mwestphal)
#### Post date: [February 26, 2026, 8:27am UTC](https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306/2 "2026-02-26T08:27:18Z")

</div>

@lgivord @Louis_Gombert

---

<div class="post-metadata">

### Author: ![nncarlson](https://discourse.vtk.org/letter_avatar_proxy/v4/letter/n/ed655f/32.png) [@nncarlson](https://discourse.vtk.org/u/nncarlson)
#### Post date: [March 21, 2026, 6:23pm UTC](https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306/3 "2026-03-21T18:23:43Z")

</div>

With the help of AI, I think I’ve since come to an understanding and can answer the questions.

When the VTKHDF file is read, the PDC blocks are loaded into an array of blocks with the `Index` attribute specifying which array slot a block is loaded into. Unused/empty slots are okay, but not ideal (you don’t want one block with an index of 4999 and get an array of size 5000 with the first 4999 slots empty). So generally the block `Index` values should be sequential from 0.

The documentation phrase “a softlink represents a dataset index associated to its parent node” means essentially that the reader follows the softlink to get the `Index`value of its target; the index into the block array is what it needs. But this is an internal implementation detail that is irrelevant to a user of the format. From the user perspective the target block is the only meaningful thing.

---

<div class="post-metadata">

### Author: ![Louis\_Gombert](https://discourse.vtk.org/user_avatar/discourse.vtk.org/louis_gombert/32/7766_2.png) [@Louis\_Gombert](https://discourse.vtk.org/u/Louis_Gombert)
#### Post date: [March 24, 2026, 1:59pm UTC](https://discourse.vtk.org/t/vtkhdf-clarifying-a-distinction-between-mb-and-pdc/16306/4 "2026-03-24T13:59:55Z")

</div>

Hello @nncarlson ,

> I don’t understand what this means. How can a softlink represent a **dataset index**?

This is badly phrased, but it is a softlink to a dataset in an indexed dataset array

> Surely the softlink points to a **block group** that is a sibling of the Assembly group, right?

Yes

> When the VTKHDF file is read, the PDC blocks are loaded into an array of blocks with the `Index` attribute specifying which array slot a block is loaded into.

That is correct

> The documentation phrase “a softlink represents a dataset index associated to its parent node” means essentially that the reader follows the softlink to get the `Index`value of its target; the index into the block array is what it needs. But this is an internal implementation detail that is irrelevant to a user of the format. From the user perspective the target block is the only meaningful thing.

More or less. It is an implementation detail but it mirrors exactly how the PDC structures works internally, we’re giving the user control over it instead of abstracting it.

I’ve pushed an improvement of the spec on this aspect to explain this in more depth here: [https://gitlab.kitware.com/vtk/vtk/-/merge\_requests/13059](https://gitlab.kitware.com/vtk/vtk/-/merge_requests/13059)

HTH
