-
Notifications
You must be signed in to change notification settings - Fork 112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Second-order Quadrilaterals (2D) meshes in standard Abaqus .inp
format
#2217
base: main
Are you sure you want to change the base?
Second-order Quadrilaterals (2D) meshes in standard Abaqus .inp
format
#2217
Conversation
Review checklistThis checklist is meant to assist creators of PRs (to let them know what reviewers will typically look for) and reviewers (to guide them in a structured review process). Items do not need to be checked explicitly for a PR to be eligible for merging. Purpose and scope
Code quality
Documentation
Testing
Performance
Verification
Created with ❤️ by the Trixi.jl community. |
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #2217 +/- ##
==========================================
- Coverage 96.37% 90.05% -6.32%
==========================================
Files 486 487 +1
Lines 39186 39356 +170
==========================================
- Hits 37764 35442 -2322
- Misses 1422 3914 +2492
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Sentry. |
This is so awesome! Thanks a lot for this very cool feature 💪 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for adding this feature! Overall the new file reading and constructors look good. I just left some questions about naming and future functionality.
@@ -386,6 +386,7 @@ transfinite map of the straight sided hexahedral element to find | |||
|
|||
Also for a mesh in standard Abaqus format there are no qualitative changes when going from 2D to 3D. | |||
The most notable difference is that boundaries are formed in 3D by faces defined by four nodes while in 2D boundaries are edges consisting of two elements. | |||
Note that standard Abaqus also defines quadratic element types. In Trixi.jl, these higher-order elements are currently only supported in 2D, i.e., 8-node quadrilaterals. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are only 8-node quads available? Or does this PR implement the infrastructure such that higher order with more nodes per element are (in theory) supported?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So at the moment yes, see lines 1931 to 1933 in p4est_mesh.jl
. This should be easily generalizable, but I am actually not sure if there are elements with order higher than quadratic defined, see e.g. http://130.149.89.49:2080/v2016/books/usb/default.htm?startat=pt06ch28s01ael02.html
|
||
- `p4est_mesh_from_hohqmesh_abaqus`: High-order, curved boundary information created by | ||
- `p4est_mesh_from_hohqmesh_abaqus`: High-order, polygonial boundary information created by |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would prefer to say curved here. My main reason is that this is the word used in the HOHQMesh and other software (like NekMesh) documentation to discuss the high-order boundary information. I have never encountered anyone referring to it as polygonal. Also, "polygonal" here makes it sound like you are representing the boundary information with polygons, which is not what is happening.
if occursin(quadratic_quads, current_element_type) | ||
# Print the first (element), second to fifth (vertices 1-4) indices to file. | ||
# For node order of quadratic (second-order) quads, see | ||
# http://130.149.89.49:2080/v2016/books/usb/default.htm?startat=pt06ch28s01ael02.html |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this the ABAQUS user guide?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, user guide/documentation. Unfortunately, I could not find the docs of more recent versions open accessible.
if mesh_polydeg == 2 | ||
mesh_nnodes = mesh_polydeg + 1 # = 3 | ||
# Note: We ASSUME that the additional node between the end-vertices lies | ||
# on the center on that line, such that we can use Chebyshev-Gauss-Lobatto nodes! | ||
# For polydeg = 2, we have the 3 nodes [-1, 0, 1] (within the reference element). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Interesting...so in the future for element boundaries higher than quadratic would this become mesh_polydeg >= 2
?
This comment is also hyper-specific for the polydeg=2
case. In general the CGL nodes are nonuniform in [-1,1]
, include the endpoints, and will only include the point x=0
for even polydeg
(i.e. an odd number of points).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah so this comment is heavily tailored towards the quadratic case, which is as far as I now the highest degree supported by standard Abaqus (see also my answer above).
if mesh_polydeg == 1 | ||
calc_tree_node_coordinates!(tree_node_coordinates, nodes, mapping, | ||
vertices, tree_to_vertex) | ||
else # mesh_polydeg = 2 => Nonlinearity in supplied mesh |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
okay, so this logic could readily handle higher order element orders (at least in 2D), right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, so more nodes here should be readily possible. I am not sure, however, if such elements are defined by the Abaqus standard.
n_trees = last(size(node_coordinates)) | ||
nnodes = length(nodes) | ||
|
||
# Setup the starting file index to read in element indices and the additional | ||
# curved boundary information provided by HOHQMesh. | ||
# higher-order, polygonial boundary information provided by HOHQMesh. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Again, I would prefer to call the boundaries curved rather than polygonal. I already mentioned two reasons above. Another is that it over complicates the nomenclature. I think you want to use "polygonal" to clarify that the boundary is a closed, simply connected region with some number of sides (that are possibly individually curved). That is, some segments of the polygon can be straight-sided, attached to a spline and then attached to circular arc. This is why I think the catch all term of "curved" is better because it encompassed all these cases (as well as dimensions).
After all, one could say that a simple straight sided box domain has "polygonal boundary information" for the same reasons, but people would think I am weird to refer to a Carteisan box in this way :)
|
||
# The nodes for an Abaqus element are labeled following a closed path | ||
# around the element: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hmm, I imagine that figuring out this variable flipping will be significantly more cumbersome in 3D and for higher node orders.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, that is also why the 3D version is not shipped in this PR. I think one needs in that case to flip the faces also in some way which I have not yet figured out.
Co-authored-by: Andrew Winters <[email protected]>
Co-authored-by: Andrew Winters <[email protected]>
This implements second-order 2D quadrilateral
p4est
meshes constructed from a standard-format Abaqus.inp
files.See #1847 for this feature request.
Essentially, this PR is a bunch of tedious mesh file parsing to extract the relevant information. As in the existing implementation, we focus on meshes constructed e.g. from
gmsh
which are exported to.inp
format.For validation, I ran the simulation of a laminar, low Machnumber (essentially incompressible) simulation over the SD7003 airfoil.
The averaged drag & lift coefficient are
which are in excellent agreement with reference data (See this preprint)