Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add Nastran backend by bayswiss · Pull Request #46 · scientificcomputing/io4dolfinx · GitHub
Skip to content

Add Nastran backend - #46

Draft
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend
Draft

Add Nastran backend#46
bayswiss wants to merge 4 commits into
scientificcomputing:mainfrom
bayswiss:nastran-backend

Conversation

@bayswiss

@bayswissbayswiss commented May 6, 2026

Copy link
Copy Markdown

Status: Draft - opening for early feedback before adding tests.

Refers #43

Tested manually outside the repo against multiple nastran meshes generated with different commercial preprocessors.

Before polishing I'd like input on where Nastran test inputs should live and what level of testing is needed. Do I commit a small bdf and run a test similar to "test_pyvista.py"?

if not topologies:
raise ValueError(f"No elements found in {filename}.")

elements = []

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a comment here that explains that the main purpose of everything up to Line 329 is to sanity check that we have extracted some elements of a given cell type with a given name.

@bayswissbayswissMay 12, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will add that

Comment on lines +76 to +86
elements = []
for gmsh_type in topologies:
_, dim, _, n_nodes, *_ = gmsh.model.mesh.getElementProperties(gmsh_type)
elements.append((dim, n_nodes, gmsh_type))

dims = [e[0] for e in elements]
if len(dims) != len(set(dims)):
raise ValueError(
f"Multiple element types share a topological dimension in {filename}."
)
_, num_nodes, gmsh_type = max(elements, key=lambda e: e[0])

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess this is also mainly for error handling/sanity checking perspective?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes. Nastran mixed meshes (hexa-pyramid-tetra) are very common in some commercial preprocessors

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could add support for these kinds of meshes, as they are supported in DOLFINx, albeit the interface is very rough. If you have a link to a mixed type mesh I can have a go at improving your API.

@jorgensd

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one.
Is a test similar to the pyvista one fine?

@finsberg

Copy link
Copy Markdown
Member

I think this is a good start. I guess the optimal thing would be to have the nastran grids stored somewhere else (like Zenodo) and fetch them if they are not present on the system. @finsberg what do you think?

Nice work @bayswiss. I think this looks very good. Having a test in place where we can test on some real meshes would be good. Perhaps we can just grab some of the meshes from this repo: https://github.com/SteveDoyle2/pyNastran/tree/main/models ?

Thank you @finsberg. I will check 'em out, since pynastran handles complete nastran decks (that contain also simulation instructions). If not present, I can provide a basic one. Is a test similar to the pyvista one fine?

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

@bayswiss

bayswiss commented May 12, 2026

Copy link
Copy Markdown
Author

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.

It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

@jorgensd

Copy link
Copy Markdown
Member

A simliar test as the pyvista one if fine. The most important thing is to have a test in place that tests the basic functionality. I don't know if there are a lot of variations in nastran files, but might be good to have some tests that covers the common scenarios. For example if mixed cell types are common it is good to have test for that.
It is also possible to add a step in in the test_workflow.yml which can download the data used by the tests. Whether this is from another repository (like pynastran) or Zenodo doesn't really matter.

I will start working on the basic test. Regarding mixed meshes, what am I missing? is dolfinx going to support them soon (I am on 0.10.0 currently)?

There is already partial support for mixed meshes. The PR I opened today makes it possible to read those meshes from gmsh: FEniCS/dolfinx#4214

@bayswiss

bayswiss commented May 15, 2026

Copy link
Copy Markdown
Author

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:
hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change in dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

@jorgensd

Copy link
Copy Markdown
Member

@jorgensd Sorry for the slow reply. Here's an example of what is sometimes called a "hexcore" mesh:

hexacore.zip

The idea is to fill the bulk of the domain with a Cartesian hex grid and use tets only near the boundary to handle geometric complexity, with pyramids as transition elements. The appeal is getting most of the numerical benefits of a structured hex mesh without actually having to build one.

One concern for wave propagation applications: the hex-pyramid-tet interface introduces a local change dispersion characteristics, which can act as a weak spurious reflector. Not a dealbreaker, but worth keeping in mind depending on the frequency range (I actually don't use it but I've seen it a lot).

image

P.S. The parallelepiped is just to show the element structure, obviously nobody would use a mixed mesh approach on a geometry this simple.

No worries, as you see, there were some missing pieces in the gmshio code to read such meshes, which should hopefully be resolved with my PR.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@bayswiss@jorgensd@finsberg