private void ApplyEnrichmentFunctions() { foreach (var node in crackTipNodesNew) { double[] enrichmentValues = CrackTipEnrichments.EvaluateFunctionsAt(node); node.EnrichmentItems[CrackTipEnrichments] = enrichmentValues; } // There is no need to process each mesh node. Once a node is enriched with Heaviside it will stay that way until the // end. Even if the crack curves towards itself and a crack tip comes near the node, the original discontinuity must // be represented by the original Heaviside (this case creates a lot of problems and cannot be modeled with LSM // accurately anyway). // I am not sure if the value of the Heaviside enrichment doesn't change for elements around the crack tip, once the // crack propagates. In first order LSM this is improbable, since there cannot be kinks inside the element, but what // about explicit cracks and higher order LSM? //TODO: It could be sped up by only updating the Heaviside enrichments of nodes that have updated body // level sets, which requires tracking them. // - Done. Tracking newly enriched nodes is useful for many reasons. //TODO: should I also clear and reapply all Heaviside enrichments? It is safer and might be useful for e.g. // reanalysis. Certainly I must not clear all node enrichments, as they may include material interfaces etc. // - Ans: nope in reanalysis old Heaviside enrichments are assumed to stay the same (not sure if that is correct // though) foreach (var node in crackBodyNodesNew) { double[] enrichmentValues = CrackBodyEnrichment.EvaluateFunctionsAt(node); node.EnrichmentItems[CrackBodyEnrichment] = enrichmentValues; } }
private void ApplyEnrichmentFunctions(HashSet <XNode> bodyNodes, HashSet <XNode> tipNodes) { // O(n) operation. TODO: This could be sped up by tracking the tip enriched nodes of each step. foreach (var node in Mesh.Nodes) { node.EnrichmentItems.Remove(CrackTipEnrichments); } foreach (var node in tipNodes) { double[] enrichmentValues = CrackTipEnrichments.EvaluateFunctionsAt(node); node.EnrichmentItems[CrackTipEnrichments] = enrichmentValues; } // Heaviside enrichment is never removed (unless the crack curves towards itself, but that creates a lot of // problems and cannot be modeled with LSM accurately). Thus there is no need to process each mesh node. // TODO: It could be sped up by only updating the Heaviside enrichments of nodes that have updated body // level sets, which requires tracking them. foreach (var node in bodyNodes) { double[] enrichmentValues = CrackBodyEnrichment.EvaluateFunctionsAt(node); node.EnrichmentItems[CrackBodyEnrichment] = enrichmentValues; } }