Skip to content

Commit aa212f5

Browse files
authored
Add skew angle parameters (angleLeft and angleRight`) for 2D mesh generation (#60)
See the issue #20
1 parent 53283d3 commit aa212f5

File tree

8 files changed

+61
-9
lines changed

8 files changed

+61
-9
lines changed

dist/feascript.cjs.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/feascript.cjs.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/feascript.esm.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/feascript.esm.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/feascript.umd.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/feascript.umd.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/mesh/meshGenerationScript.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,8 @@ export class Mesh2D extends Mesh {
511511
* @param {number} [config.maxY] - Maximum y-coordinate of the mesh (required for geometry-based mesh)
512512
* @param {string} [config.elementOrder='linear'] - The order of elements, either 'linear' or 'quadratic'
513513
* @param {object} [config.parsedMesh=null] - Optional pre-parsed mesh data
514+
* @param {number} [config.angleLeft=90] - Left side skew angle in degrees (90 = vertical)
515+
* @param {number} [config.angleRight=90] - Right side skew angle in degrees (90 = vertical)
514516
*/
515517
constructor({
516518
numElementsX = null,
@@ -519,6 +521,8 @@ export class Mesh2D extends Mesh {
519521
maxY = null,
520522
elementOrder = "linear",
521523
parsedMesh = null,
524+
angleLeft = 90,
525+
angleRight = 90,
522526
}) {
523527
super({
524528
numElementsX,
@@ -530,6 +534,9 @@ export class Mesh2D extends Mesh {
530534
parsedMesh,
531535
});
532536

537+
this.angleLeft = angleLeft;
538+
this.angleRight = angleRight;
539+
533540
// Validate geometry parameters (when not using a parsed mesh)
534541
if (
535542
!parsedMesh &&
@@ -592,6 +599,32 @@ export class Mesh2D extends Mesh {
592599
}
593600
}
594601

602+
// Angles are measured from the positive X-axis:
603+
// 90° = vertical sides (rectangle)
604+
// angleLeft < 90° => left side leans right as y increases
605+
// angleLeft > 90° => left side leans left
606+
// angleRight < 90° => right side leans left
607+
// angleRight > 90° => right side leans right
608+
if (this.angleLeft !== 90 || this.angleRight !== 90) {
609+
const degToRad = Math.PI / 180;
610+
const tanLeft = Math.tan(this.angleLeft * degToRad);
611+
const tanRight = Math.tan(this.angleRight * degToRad);
612+
const epsilon = 1e-12;
613+
614+
for (let nodeIndexY = 0; nodeIndexY < totalNodesY; nodeIndexY++) {
615+
const rowBaseIndex = nodeIndexY;
616+
const y = nodesYCoordinates[rowBaseIndex];
617+
const xLeft = Math.abs(tanLeft) < epsilon ? 0 : y / tanLeft;
618+
const xRight = Math.abs(tanRight) < epsilon ? this.maxX : this.maxX - y / tanRight;
619+
620+
for (let nodeIndexX = 0; nodeIndexX < totalNodesX; nodeIndexX++) {
621+
const nnode = nodeIndexX * totalNodesY + nodeIndexY;
622+
const t = totalNodesX === 1 ? 0 : nodeIndexX / (totalNodesX - 1);
623+
nodesXCoordinates[nnode] = xLeft + (xRight - xLeft) * t;
624+
}
625+
}
626+
}
627+
595628
// Generate nodal numbering (NOP) array
596629
const nodalNumbering = this.generateNodalNumbering2D(
597630
this.numElementsX,

src/mesh/meshUtilsScript.js

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,35 @@ import { basicLog, debugLog, errorLog } from "../utilities/loggingScript.js";
1919
* @returns {object} An object containing all mesh-related data
2020
*/
2121
export function prepareMesh(meshConfig) {
22-
const { meshDimension, numElementsX, numElementsY, maxX, maxY, elementOrder, parsedMesh } = meshConfig;
22+
const {
23+
meshDimension,
24+
numElementsX,
25+
numElementsY,
26+
maxX,
27+
maxY,
28+
elementOrder,
29+
parsedMesh,
30+
angleLeft,
31+
angleRight,
32+
} = meshConfig;
2333

2434
// Create a new instance of the Mesh class
2535
let mesh;
2636
if (meshDimension === "1D") {
2737
mesh = new Mesh1D({ numElementsX, maxX, elementOrder, parsedMesh });
2838
} else if (meshDimension === "2D") {
29-
mesh = new Mesh2D({ numElementsX, maxX, numElementsY, maxY, elementOrder, parsedMesh });
39+
mesh = new Mesh2D({
40+
numElementsX,
41+
maxX,
42+
numElementsY,
43+
maxY,
44+
elementOrder,
45+
parsedMesh,
46+
angleLeft,
47+
angleRight,
48+
});
3049
} else {
31-
errorLog("Mesh dimension must be either '1D' or '2D'.");
50+
errorLog("Mesh dimension must be either '1D' or '2D'");
3251
}
3352

3453
// Use the parsed mesh (e.g., from a Gmsh .msh import) if provided. Otherwise, generate a structured mesh

0 commit comments

Comments
 (0)