@@ -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