Integration in
GradientBundleAnalysis
Point-wise integration
We finished and implemented the point-wise integration. It works as described below:
Volume zones to be integrated must exist as closed, finite element surfaces
Simply loop over every cell (cubic cell composed of 8 nodes) in the full volume, determining if the cell is
contained entirely outside the FE volume, which is performed with an additional time-saving step of disqualifying cells that are outside of the bounding cube of the FE volume;
contained entirely within the FE volume; or
partially contained within the FE volume
If cell is entirely within, add the variable value (i.e. rho) for the center of the cell to the integral
if cell is partially contained in FE volume, subsample the cell according to a specified resolution, each time adding the variable value for the centers of the subcells if they are interior to the FE volume
This method works, but it takes a very high subsampling resolution to get decent accuracy, resulting is very, very long run-times.
FE volume integration
I have another idea for a much faster integration scheme that has the additional benefit of lacking any kind of user-specified resolution.
The method is pretty simple: Take the closed, FE surfaces and turn them into FE volumes composed of polyhedra. Once the volumes are created, Tecplot 360’s built-in integration can be used, although I would prefer to also implement my own integrator to prevent reliance on the Tecplot 360 Integration add-on.
My basic idea for the algorithm to make a FE volume out of the closed FE surface is as follows:
Get a complete list (IsInterior) of all Full Volume Zone nodes that are interior to the FE surface. The list will be in the form of a vector<bool> of length iMax • jMax • kMax so that lookup time is constant.
Make another list (ElemDirCreated) of vector<vector<bool> >, also of length iMax • jMax • kMax, but only the elements i for which IsInterior[i] is true will have their inner vector<bool> resized to length 8. These 8 bools will be used to keep track of whether FE volume elements have been created for the 8 directions from each interior node.
With each interior node, check it’s 8 values in ElemDirCreated.
If the element has been created, move on
If the element hasn’t been created, then check the interior-ness of the node’s 26 neighbors.
If a neighbor is interior, then simply use that node for a node of the new element.
If a neighbor is not interior, then use the intersection point of the line connecting the node and its neighbor as a node in the new element.
Need to think about this part of the algorithm carefully such that cases where only one corner of a cell is cutoff by a surface result in three nodes on the surface corresponding to the intersections between the surface and the lines between the one exterior node and its three neighbors in the cell.
Since node and element numbers serve no purpose other than to provide information about the connectivity of the FE volume, these can simply be generated as the elements are built.
Need to look into the possibility of using a set number of sides for the FE volume, as this will allow the structure of the connectivity list to be predicted.
Fully interior cells will be hexahedral, but…
I just realized this won’t work…
This method, and the current point-wise integration method, won’t work because of the assumption that, if all 8 nodes of a cell are not contained within a volume of interest, then the cell does not contribute to the volume’s density. This assumes that there will never be a skinny volume shooting through the center of the cell, which is a bad assumption.
I need to use a method of creating FE volumes that starts by using the existing information known about the volume. It will likely be impossibly non-trivial to utilize the discreet data in the system. Instead, I’ll probably devise a method that uses nothing but interpolated data, which isn’t that bad anyways.
Side note: Max and min number of sides for a hexahedron coincident with N planes is 6 + N and 6 - N respectively1
via https://dayone.me/29GPzC6
Thanks to Michael for figuring this out. ↩︎














