Skip to content

Commit 015dec2

Browse files
committed
Enhance mesh generation and GMSH reader to support quadratic elements and improve nodal numbering mapping for quadrilateral elements
1 parent eab0927 commit 015dec2

File tree

2 files changed

+45
-21
lines changed

2 files changed

+45
-21
lines changed

src/mesh/meshGenerationScript.js

Lines changed: 41 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -66,32 +66,54 @@ export class meshGeneration {
6666
JSON.stringify(this.parsedMesh.nodalNumbering)
6767
);
6868

69+
console.log(this.parsedMesh.elementTypes[3]);
70+
6971
// Check if it has quadElements or triangleElements structure from gmshReader
70-
if (quadElements && quadElements.length > 0) {
72+
if (this.parsedMesh.elementTypes[3] || this.parsedMesh.elementTypes[10]) {
7173
// Map nodal numbering from GMSH format to FEAScript format for quad elements
7274
const mappedNodalNumbering = [];
7375

7476
for (let elemIdx = 0; elemIdx < quadElements.length; elemIdx++) {
7577
const gmshNodes = quadElements[elemIdx];
7678
const feaScriptNodes = new Array(gmshNodes.length);
7779

78-
// Simple mapping for linear quad elements (4 nodes)
79-
// GMSH: FEAScript:
80-
// 3 --- 2 1 --- 3
81-
// | | | |
82-
// 0 --- 1 0 --- 2
83-
84-
feaScriptNodes[0] = gmshNodes[0]; // 0 -> 0
85-
feaScriptNodes[1] = gmshNodes[3]; // 3 -> 1
86-
feaScriptNodes[2] = gmshNodes[1]; // 1 -> 2
87-
feaScriptNodes[3] = gmshNodes[2]; // 2 -> 3
80+
// Check for element type based on number of nodes
81+
if (gmshNodes.length === 4) {
82+
// Simple mapping for linear quad elements (4 nodes)
83+
// GMSH: FEAScript:
84+
// 3 --- 2 1 --- 3
85+
// | | --> | |
86+
// 0 --- 1 0 --- 2
87+
88+
feaScriptNodes[0] = gmshNodes[0]; // 0 -> 0
89+
feaScriptNodes[1] = gmshNodes[3]; // 3 -> 1
90+
feaScriptNodes[2] = gmshNodes[1]; // 1 -> 2
91+
feaScriptNodes[3] = gmshNodes[2]; // 2 -> 3
92+
} else if (gmshNodes.length === 9) {
93+
// Mapping for quadratic quad elements (9 nodes)
94+
// GMSH: FEAScript:
95+
// 3--6--2 2--5--8
96+
// | | | |
97+
// 7 8 5 --> 1 4 7
98+
// | | | |
99+
// 0--4--1 0--3--6
100+
101+
feaScriptNodes[0] = gmshNodes[0]; // 0 -> 0
102+
feaScriptNodes[1] = gmshNodes[7]; // 7 -> 1
103+
feaScriptNodes[2] = gmshNodes[3]; // 3 -> 2
104+
feaScriptNodes[3] = gmshNodes[4]; // 4 -> 3
105+
feaScriptNodes[4] = gmshNodes[8]; // 8 -> 4
106+
feaScriptNodes[5] = gmshNodes[6]; // 6 -> 5
107+
feaScriptNodes[6] = gmshNodes[1]; // 1 -> 6
108+
feaScriptNodes[7] = gmshNodes[5]; // 5 -> 7
109+
feaScriptNodes[8] = gmshNodes[2]; // 2 -> 8
110+
}
88111

89112
mappedNodalNumbering.push(feaScriptNodes);
90113
}
91114

92115
this.parsedMesh.nodalNumbering = mappedNodalNumbering;
93-
} else if (triangleElements && triangleElements.length > 0) {
94-
this.parsedMesh.nodalNumbering = triangleElements;
116+
} else if (this.parsedMesh.elementTypes[2]) {
95117
}
96118

97119
debugLog(
@@ -480,7 +502,7 @@ export class meshGeneration {
480502
/**
481503
* Quadratic 1D elements with the following nodes representation:
482504
*
483-
* 1 --- 2 --- 3
505+
* 1--2--3
484506
*
485507
*/
486508
let columnCounter = 0;
@@ -520,11 +542,11 @@ export class meshGeneration {
520542
/**
521543
* Quadratic rectangular elements with the following nodes representation:
522544
*
523-
* 2 --- 5 --- 8
524-
* | | |
525-
* 1 --- 4 --- 7
526-
* | | |
527-
* 0 --- 3 --- 6
545+
* 2--5--8
546+
* | |
547+
* 1 4 7
548+
* | |
549+
* 0--3--6
528550
*
529551
*/
530552
for (let elementIndexX = 1; elementIndexX <= numElementsX; elementIndexX++) {

src/readers/gmshReaderScript.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,9 +235,11 @@ const importGmshQuadTri = async (file) => {
235235
result.boundaryNodePairs[physicalTag] = [];
236236
}
237237
result.boundaryNodePairs[physicalTag].push(nodeIndices);
238-
} else if (currentElementBlock.elementType === 2) {
238+
} else if (currentElementBlock.elementType === 2) { // Linear triangle elements (3 nodes)
239239
result.nodalNumbering.triangleElements.push(nodeIndices);
240-
} else if (currentElementBlock.elementType === 3) {
240+
} else if (currentElementBlock.elementType === 3) { // Linear quadrilateral elements (4 nodes)
241+
result.nodalNumbering.quadElements.push(nodeIndices);
242+
} else if (currentElementBlock.elementType === 10) { // Quadratic quadrilateral elements (9 nodes)
241243
result.nodalNumbering.quadElements.push(nodeIndices);
242244
}
243245

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy