//TODO: Either work with Tensor class or double[] private IReadOnlyList <Tensor2D> ElementNodalTensorsExtrapolation(XContinuumElement2D element, Vector freeDisplacements, Vector constrainedDisplacements, IOutputField field) { Vector standardDisplacements = dofOrderer.ExtractDisplacementVectorOfElementFromGlobal(element, freeDisplacements, constrainedDisplacements); Vector enrichedDisplacements = dofOrderer.ExtractEnrichedDisplacementsOfElementFromGlobal(element, freeDisplacements); IReadOnlyList <NaturalPoint> gaussPoints = element.GaussPointExtrapolation.Quadrature.IntegrationPoints; var gpTensors = new Tensor2D[gaussPoints.Count]; for (int i = 0; i < gaussPoints.Count; ++i) { gpTensors[i] = field.EvaluateAt(element, gaussPoints[i], standardDisplacements, enrichedDisplacements); } return(element.GaussPointExtrapolation.ExtrapolateTensorFromGaussPointsToNodes(gpTensors, element.Interpolation)); }
// Computes stresses directly at the nodes. The other approach is to compute them at Gauss points and then extrapolate private IReadOnlyList <Tensor2D> ElementNodalTensorsDirectly(XContinuumElement2D element, Vector freeDisplacements, Vector constrainedDisplacements, IOutputField field) { Vector standardDisplacements = dofOrderer.ExtractDisplacementVectorOfElementFromGlobal(element, freeDisplacements, constrainedDisplacements); Vector enrichedDisplacements = dofOrderer.ExtractEnrichedDisplacementsOfElementFromGlobal(element, freeDisplacements); IReadOnlyList <NaturalPoint> naturalNodes = element.Interpolation.NodalNaturalCoordinates; var nodalTensors = new Tensor2D[element.Nodes.Count]; for (int i = 0; i < element.Nodes.Count; ++i) { nodalTensors[i] = field.EvaluateAt(element, naturalNodes[i], standardDisplacements, enrichedDisplacements); } return(nodalTensors); }