How to represent edges in a sideset more explicitly. #446
Replies: 2 comments 6 replies
-
I think the explanation here for Sidesets is pretty straightforward ... also because I was able to decipher the functionality based on the IOSS code. Part of the confusion for Edgesets was that I could not get a clear picture of what the functional design was based on the code so I simply made the assumption that it followed the same structure as Sidesets (which made sense in my mind) but the code seemed to have subtle enough differences that I had to make some adjustments to compensate in the TextMesh update. Your explanation in the MR suggests that the creation of the edges is done based on "block" groupings which have homogeneous topologies and the edgesets are arbitrary (possibly heterogeneous) groupings of any set of edges. This sounds like it is the reverse hierarchy of how sidesets are constructed. It wasn't clear from the IOSS code that this was the case but hopefully the documentation you linked will help. Currently, what I have implements an "edgeset" syntax similar to the creation of sidesets where the user provides [element,ordinal] pairs which represent a (possibly heterogeneous) list of edges that gets split into the edge blocks. So the difference here would be that the sideset is a full grouping of all edges in the edge blocks as opposed to a subset of edges in the list of edge blocks. This could still work in the current framework unless the user really does want to follow the true exodus convention of defining the edge blocks and then the edgesets from the individual edges. That is much harder to implement in TextMesh as what I currently have simply extends what Sidesets are doing... Note that what I pushed up is a generalized implementation for edgesets regardless of shells or solid elements |
Beta Was this translation helpful? Give feedback.
-
The STK team is still having issues getting consensus from the app teams primarily due to confusion as to what a a face is. As you you surmised above, getting a consistent representation for sideset entries especially for shells is a tricky thing because specifying an ordinal beyond 2 for a 3D shell can have different meanings. The TF team wants it to reference a face on those collapsed boundaries and the rest of the apps want it to reference the boundary edges. While IOSS hides most of this, the problem comes in the STK IO layer where a decision has to be made as to what it means. If there was some sort of hybrid interpretation of the first and second bullet where positive ordinals refer to one entity type (edge/face) and negative refers to the other, then it starts to help make distinction between the two. The third option would be mostly invisible to the user but sounds like it would help unify and make consistent the concept of sidesets/edgesets in both IOSS and Exodus. It is quite a bit to think about and has been giving the STK team lots of problems for months now trying to find some middle ground with the app teams |
Beta Was this translation helpful? Give feedback.
-
Currently, a Sideset is a list of pairs -- (implicit element id, local side number) where "side" is face for 3D solid elements and an edge for 2D solid elements. For a hex the side number runs from 1 to 6, for a tet it runs from 1 to 4. There has been a kluge added in which if the side number exceeds the number of "sides" (face 3d or edge 2d), then the sideset is referring to edges. This isn't typically used for solid elements (hexes, tets), but is more commonly used for shells. The shell "local side number" would be 1, 2 for the faces and 3, 4, 5, 6 for the 4 edge sides of a quadrilateral shell. [For shells, this has been part of Exodus convention since the beginning, but was extended to refer to the edges of 3D solid elements and the nodes of 2D solid elements]
If we had a sideset over quad shells the element/side pairs of 1.1, 3.1, 5.1, 1.3, 1.4 would consist of 3 quad face sides and 2 edge sides.
This works, but is ungainly since there is offsetting of the local side number by the number of faces. When the IOSS library reads an exodus sideset using this convention, it creates a SideSet and then would create two SideBlocks in the SideSet. The first would be a SideBlock with quad topology and shell parent topology and the second would be a SideBlock with edge topology and shell parent topology. The IOSS would also remove the offset int the local sides on the SideBlock containing edges, so it would show that there are 2 edges, the first is edge 1 of element 1 and the second is edge 2 of element 1.
On output, IOSS would combine the sides in the 2 SideBlocks into a single group and add back the offsets in the local side numbers for the edges and that is what would be stored in Exodus.
One problem with this representation is that it is difficult to look at a sideset [element, local_side] pair and know whether it refers to face topologies or edge topologies.
Some options:
I'm not sure what is the best option. I think that the IOSS layer hides most of the complexity from the applications and there shouldn't need to be any modifications above the IOSS level to deal with any of these changes; I think it would be isolated at the exodus level...
Let me know if I am missing some nuance on the need for #445
Beta Was this translation helpful? Give feedback.
All reactions