Skip to content

Commit 215135a

Browse files
authored
Modifications for 1D mesh handling in solid heat transfer script
1 parent 3be3949 commit 215135a

File tree

1 file changed

+74
-29
lines changed

1 file changed

+74
-29
lines changed

src/solvers/solidHeatTransferScript.js

Lines changed: 74 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -124,69 +124,114 @@ export function assembleSolidHeatTransferMat(meshConfig, boundaryConditions) {
124124

125125
// Loop over Gauss points
126126
for (let gaussPointIndex1 = 0; gaussPointIndex1 < gaussPoints.length; gaussPointIndex1++) {
127-
for (let gaussPointIndex2 = 0; gaussPointIndex2 < gaussPoints.length; gaussPointIndex2++) {
128-
// Initialise variables for isoparametric mapping
127+
// 1D solid heat transfer
128+
if (meshDimension === '1D') {
129129
let basisFunctionsAndDerivatives = basisFunctionsData.getBasisFunctions(
130-
gaussPoints[gaussPointIndex1],
131-
gaussPoints[gaussPointIndex2]
130+
gaussPoints[gaussPointIndex1]
132131
);
133132
basisFunction = basisFunctionsAndDerivatives.basisFunction;
134133
basisFunctionDerivKsi = basisFunctionsAndDerivatives.basisFunctionDerivKsi;
135-
basisFunctionDerivEta = basisFunctionsAndDerivatives.basisFunctionDerivEta;
136134
xCoordinates = 0;
137-
yCoordinates = 0;
138135
ksiDerivX = 0;
139-
etaDerivX = 0;
140-
ksiDerivY = 0;
141-
etaDerivY = 0;
142136
detJacobian = 0;
143137

144138
// Isoparametric mapping
145139
for (let localNodeIndex = 0; localNodeIndex < numNodes; localNodeIndex++) {
146140
xCoordinates +=
147141
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunction[localNodeIndex];
148-
yCoordinates +=
149-
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunction[localNodeIndex];
150142
ksiDerivX +=
151143
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivKsi[localNodeIndex];
152-
etaDerivX +=
153-
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivEta[localNodeIndex];
154-
ksiDerivY +=
155-
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivKsi[localNodeIndex];
156-
etaDerivY +=
157-
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivEta[localNodeIndex];
158-
detJacobian = meshDimension === '2D' ? ksiDerivX * etaDerivY - etaDerivX * ksiDerivY : ksiDerivX;
144+
detJacobian = ksiDerivX;
159145
}
160146

161-
// Compute x-derivative and y-derivative of basis functions
147+
// Compute x-derivative of basis functions
162148
for (let localNodeIndex = 0; localNodeIndex < numNodes; localNodeIndex++) {
163149
basisFunctionDerivX[localNodeIndex] =
164-
(etaDerivY * basisFunctionDerivKsi[localNodeIndex] -
165-
ksiDerivY * basisFunctionDerivEta[localNodeIndex]) /
166-
detJacobian; // The x-derivative of the n basis function
167-
basisFunctionDerivY[localNodeIndex] =
168-
(ksiDerivX * basisFunctionDerivEta[localNodeIndex] -
169-
etaDerivX * basisFunctionDerivKsi[localNodeIndex]) /
170-
detJacobian; // The y-derivative of the n basis function
150+
basisFunctionDerivKsi[localNodeIndex] / detJacobian; // The x-derivative of the n basis function
171151
}
172152

173153
// Computation of Galerkin's residuals and Jacobian matrix
174154
for (let localNodeIndex1 = 0; localNodeIndex1 < numNodes; localNodeIndex1++) {
175155
let globalNodeIndex1 = localNodalNumbers[localNodeIndex1];
176156
residualVector[globalNodeIndex1] +=
177157
gaussWeights[gaussPointIndex1] *
178-
gaussWeights[gaussPointIndex2] *
179158
detJacobian *
180159
basisFunction[localNodeIndex1];
181160

182161
for (let localNodeIndex2 = 0; localNodeIndex2 < numNodes; localNodeIndex2++) {
183162
let globalNodeIndex2 = localNodalNumbers[localNodeIndex2];
184163
jacobianMatrix[globalNodeIndex1][globalNodeIndex2] +=
185164
-gaussWeights[gaussPointIndex1] *
165+
detJacobian *
166+
(basisFunctionDerivX[localNodeIndex1] * basisFunctionDerivX[localNodeIndex2]);
167+
}
168+
}
169+
// 2D solid heat transfer
170+
} else if (meshDimension === '2D') {
171+
for (let gaussPointIndex2 = 0; gaussPointIndex2 < gaussPoints.length; gaussPointIndex2++) {
172+
// Initialise variables for isoparametric mapping
173+
let basisFunctionsAndDerivatives = basisFunctionsData.getBasisFunctions(
174+
gaussPoints[gaussPointIndex1],
175+
gaussPoints[gaussPointIndex2]
176+
);
177+
basisFunction = basisFunctionsAndDerivatives.basisFunction;
178+
basisFunctionDerivKsi = basisFunctionsAndDerivatives.basisFunctionDerivKsi;
179+
basisFunctionDerivEta = basisFunctionsAndDerivatives.basisFunctionDerivEta;
180+
xCoordinates = 0;
181+
yCoordinates = 0;
182+
ksiDerivX = 0;
183+
etaDerivX = 0;
184+
ksiDerivY = 0;
185+
etaDerivY = 0;
186+
detJacobian = 0;
187+
188+
// Isoparametric mapping
189+
for (let localNodeIndex = 0; localNodeIndex < numNodes; localNodeIndex++) {
190+
xCoordinates +=
191+
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunction[localNodeIndex];
192+
yCoordinates +=
193+
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunction[localNodeIndex];
194+
ksiDerivX +=
195+
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivKsi[localNodeIndex];
196+
etaDerivX +=
197+
nodesXCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivEta[localNodeIndex];
198+
ksiDerivY +=
199+
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivKsi[localNodeIndex];
200+
etaDerivY +=
201+
nodesYCoordinates[localNodalNumbers[localNodeIndex]] * basisFunctionDerivEta[localNodeIndex];
202+
detJacobian = meshDimension === '2D' ? ksiDerivX * etaDerivY - etaDerivX * ksiDerivY : ksiDerivX;
203+
}
204+
205+
// Compute x-derivative and y-derivative of basis functions
206+
for (let localNodeIndex = 0; localNodeIndex < numNodes; localNodeIndex++) {
207+
basisFunctionDerivX[localNodeIndex] =
208+
(etaDerivY * basisFunctionDerivKsi[localNodeIndex] -
209+
ksiDerivY * basisFunctionDerivEta[localNodeIndex]) /
210+
detJacobian; // The x-derivative of the n basis function
211+
basisFunctionDerivY[localNodeIndex] =
212+
(ksiDerivX * basisFunctionDerivEta[localNodeIndex] -
213+
etaDerivX * basisFunctionDerivKsi[localNodeIndex]) /
214+
detJacobian; // The y-derivative of the n basis function
215+
}
216+
217+
// Computation of Galerkin's residuals and Jacobian matrix
218+
for (let localNodeIndex1 = 0; localNodeIndex1 < numNodes; localNodeIndex1++) {
219+
let globalNodeIndex1 = localNodalNumbers[localNodeIndex1];
220+
residualVector[globalNodeIndex1] +=
221+
gaussWeights[gaussPointIndex1] *
186222
gaussWeights[gaussPointIndex2] *
187223
detJacobian *
188-
(basisFunctionDerivX[localNodeIndex1] * basisFunctionDerivX[localNodeIndex2] +
189-
basisFunctionDerivY[localNodeIndex1] * basisFunctionDerivY[localNodeIndex2]);
224+
basisFunction[localNodeIndex1];
225+
226+
for (let localNodeIndex2 = 0; localNodeIndex2 < numNodes; localNodeIndex2++) {
227+
let globalNodeIndex2 = localNodalNumbers[localNodeIndex2];
228+
jacobianMatrix[globalNodeIndex1][globalNodeIndex2] +=
229+
-gaussWeights[gaussPointIndex1] *
230+
gaussWeights[gaussPointIndex2] *
231+
detJacobian *
232+
(basisFunctionDerivX[localNodeIndex1] * basisFunctionDerivX[localNodeIndex2] +
233+
basisFunctionDerivY[localNodeIndex1] * basisFunctionDerivY[localNodeIndex2]);
234+
}
190235
}
191236
}
192237
}

0 commit comments

Comments
 (0)