110 likes | 369 Views
Domain Boundaries. 2012 Developer Documentation. Brad Whitlock. Domain Boundaries. Meshes are decomposed into multiple domains Domain Boundaries let VisIt know how domains touch so ghost data can be created on demand. Each zone in the mesh is labeled by its domain number.
E N D
Domain Boundaries 2012 Developer Documentation • Brad Whitlock
Domain Boundaries • Meshes are decomposed into multiple domains • Domain Boundaries let VisIt know how domains touch so ghost data can be created on demand • Each zone in the mesh is labeled by its domain number
Domain Boundaries Domain 0 Boundaries Domain 1 Boundaries Domain 2 Boundaries Domain 3 Boundaries Domain 4 Boundaries Domain 5 Boundaries
Boundary Lists • Each domain has a list of boundaries where the domain touches other domains • Domains sharing a boundary will each have an entry for the boundary in their own boundary list • The boundary entries in each list must represent the same size (#cells)
Boundary Information • Boundaries are represented by an 11-tuple of integers with this layout: boundary { intneighbordomain; intmi; intorientation[3]; intextents[6]; }; • Neighbordomain is the index of the neighboring domain [0,nDomains). • Mi is a pointer into another domain’s boundary list. • Orientation specifies which axes are first. (For X,Y,Z, use 1,2,3) • Extents consist of 6 values (loX, hiX, loY, hiY, loZ, hiZ) that indicate where the cells in the neighbor domain touch the current domain.
Extents Boundary Boundary • Extents are a range of cells that are shared along a boundary • The extents are specified relative to the domain that contains the boundary • Extents consist of 6 numbers: loX, hiX, loY, hiY, loZ, hiZ Domain 0 Domain 0 Domain 1 Domain 1 loX,hiY loX,loY loX,hiY loX,hiY loX,loY loX,hiY loX,loY loX,loY hiX,hiY hiX,loY hiX,hiY hiX,hiY hiX,loY hiX,hiY hiX,loY hiX,loY Target zones Donor zones Target zones Donor zones Domain 0 Boundary list Domain 1 Boundary list Extents: hiX0, hiX0, loY0, hiY0, loZ0, loZ0 Extents: loX1, loX1, loY1, hiY1, loZ1, loZ1
Calculating the “mi” pointer • The mi pointer is an index to where the boundary for the current domain falls in the other domain's boundary list
Domain 0 Boundaries Domain 2 Boundaries Domain 5 Boundaries Domain 3 Boundaries Domain 4 Boundaries Domain 1 Boundaries idx idx idx idx idx idx domain domain domain domain domain domain mi mi mi mi mi mi orient orient orient orient orient orient extent extent extent extent extent extent 2 2 3 0 2 3 1 1 1 0 1 0 3 1 3 3 1 2 0 0 0 2 0 4 1 1 2 3 3 4 1 3 3 2 4 5 2 1 2 2 4 5 5 5 1 0 3 2 3 0 1 3 1 1 0 2 0 0 3 2 1 2 0 1 0 1 3 4 2 4 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 … … … … … … … … … … … … … … … … … … … … … … … … 4 4
Building a Neighbors Table Domain 0 Boundaries Domain 1 Boundaries idx idx domain domain mi mi orient orient extent extent Combine all values into one table 0 1 3 0 2 1 1 3 4 2 5 0 2 0 2 0 0 2 1 0 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 1,2,3 … … … … … … … 4 1 0 1,2,3 … 2 0 1,2,3 … 0 0 1,2,3 … 2 1 1,2,3 … 4 0 1,2,3 … 3 2 1,2,3 … … 5 2 1,2,3 … Arrays of integers intneighbors[] = { /* Domain 0 */ 1, 0, 1,2,3, HiX_0, HiX_0, lo, HiY_0, lo, lo, 2, 0, 1,2,3, lo, HiX_0, HiY_0, HiY_0, lo, lo, /* Domain 1 */ 0, 0, 1,2,3, lo, lo, lo, HiY_1, lo, lo, 2, 1, 1,2,3, lo, HiX_1, HiY_1, HiY_1, lo, lo, 4, 0, 1,2,3, HiX_1, HiX_1, lo, HiY_1, lo, lo, 3, 2, 1,2,3, HiX_1, HiX_1, HiY_1, HiY_1, lo, lo, 5, 2, 1,2,3, HiX_1, HiX_1, HiY_1, HiY_1, lo, lo, /* the rest of the domains … */ }; /* Number of boundaries for each domain. */ intnneighbors[] = {2, 5, 5, …}; …
Passing Neighbor Table to VisIt • You can use a little boilerplate coding to pass the neighbor table to VisIt’savtDomainBoundaries subclass voidSetDomainBounds(avtStructuredDomainBoundaries *dbi, intndomains, int*ext, int*nneighbors, int*neighbors) { dbi->SetNumDomains(ndomains); int*tuple = neighbors; for(intj = 0; j < ndomains; j++) { dbi->SetExtents(j, &ext[j*6]); for (intk = 0; k < nneighbors[j]; k++) { // neighbors 11-tuple dbi->AddNeighbor(j, tuple[0], tuple[1], tuple + 2, tuple + 5); tuple += 11; } dbi->Finish(j); } }
Interpolation Results • No interpolation • Interpolation to nodes