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)