private static void GetLongitudinalJoint(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result) { if (!result.PostElements.ContainsKey(5)) result.PostElements[5] = new List<Element>(); for (int j = 0; j <= modelSetting.num_longit; j++) { for (int k = 0; k < modelSetting.pos_joint.Count; k++) { ElementCombin combinZ = new ElementCombin(1, 5, modelSetting.num_segment_element[k] + 1 + j * modelSetting.num_node_face + ringNo * modelSetting.num_node_all, k + 1 + modelSetting.num_circum + j * modelSetting.num_node_face + ringNo * modelSetting.num_node_all); result.PostElements[5].Add(combinZ); } } }
//you don't need to assign modelSetting.axis as it won't be used public static void BuildStraightModel(ModelSetting modelSetting, Model model) { SingleRingResult ringResult = new SingleRingResult(); GenerateNodes.GenerateSingleRingNode(modelSetting, ringResult); GenerateElements.GenerateSingleRingElement(modelSetting, ringResult); //generate all nodes for(int i = 0; i < modelSetting.num_ring; i++) { for(int j = 0; j < modelSetting.num_node_all; j++) { Node node = ringResult.nodes[j]; Node newNode = new Node(node.nid + i * modelSetting.num_node_all, node.x, node.y, node.z + modelSetting.width * i); model.AddNode(newNode); } } int elemenCount = 0; //generate all shells for (int i = 0; i < modelSetting.num_ring; i++) { foreach (Element element in ringResult.elements[1]) { elemenCount++; ElementShell shell = element as ElementShell; ElementShell newShell = new ElementShell(elemenCount, shell.pid, shell.n1 + modelSetting.num_node_all * i, shell.n2 + modelSetting.num_node_all * i, shell.n3 + modelSetting.num_node_all * i, shell.n4 + modelSetting.num_node_all * i); model.AddElement(newShell); } } //generate radial ground spring for (int i = 0; i < modelSetting.num_ring; i++) { foreach (Element element in ringResult.elements[2]) { elemenCount++; ElementLink link = element as ElementLink; ElementLink newLink = new ElementLink(elemenCount, link.pid, link.n1 + modelSetting.num_node_all * i, link.n2 + modelSetting.num_node_all * i); model.AddElement(newLink); } } //generate tangential ground spring for (int i = 0; i < modelSetting.num_ring; i++) { foreach (Element element in ringResult.elements[3]) { elemenCount++; ElementLink link = element as ElementLink; ElementLink newLink = new ElementLink(elemenCount, link.pid, link.n1 + modelSetting.num_node_all * i, link.n2 + modelSetting.num_node_all * i); model.AddElement(newLink); } } //generate the longitudinal joint spring for (int i = 0; i < modelSetting.num_ring; i++) { for (int j = 0; j <= modelSetting.num_longit; j++) { for (int k = 0; k < modelSetting.pos_joint.Count; k++) { elemenCount++; ElementCombin combinZ = new ElementCombin(elemenCount, 5, modelSetting.pos_joint[k] + 1 + j * modelSetting.num_node_face + i * modelSetting.num_node_all, k + 1 + modelSetting.num_circum + j * modelSetting.num_node_face + i * modelSetting.num_node_all); model.AddElement(combinZ); } } } //generate circumferential joint spring for (int i = 1; i < modelSetting.num_ring; i++) { for (int j = 0; j < modelSetting.num_node_face; j++ ) { elemenCount++; ElementCombin combinCircumZ = new ElementCombin(elemenCount, 4, j + 1 + (i - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + i * modelSetting.num_node_all); elemenCount++; ElementCombin combinCircumX = new ElementCombin(elemenCount, 6, j + 1 + (i - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + i * modelSetting.num_node_all); elemenCount++; ElementCombin combinCircumY = new ElementCombin(elemenCount, 7, j + 1 + (i - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + i * modelSetting.num_node_all); model.AddElement(combinCircumZ); model.AddElement(combinCircumX); model.AddElement(combinCircumY); } } //add longitudinal joint nodes couple-constrain for (int i = 0; i < modelSetting.num_ring; i++) { for (int j = 0; j <= modelSetting.num_longit; j++) { for (int k = 0; k < modelSetting.pos_joint.Count; k++) { ConstrainedNodes constrain = new ConstrainedNodes(); constrain.nodes.Add(model.nodes[modelSetting.pos_joint[k] + 1 + j * modelSetting.num_node_face + i * modelSetting.num_node_all]); constrain.nodes.Add(model.nodes[k + 1 + modelSetting.num_circum + j * modelSetting.num_node_face + i * modelSetting.num_node_all]); constrain.ux = 1; constrain.uy = 1; model.AddConstrained(constrain); } } } //add boundary for (int i = 0; i < modelSetting.num_node_face; i++) { BoundaryNode boundary = new BoundaryNode(); boundary.node = model.nodes[i + 1]; boundary.ux = 1; boundary.uy = 1; boundary.uz = 1; boundary.rx = 1; boundary.ry = 1; boundary.rz = 1; model.AddBoundary(boundary); } for (int i = 0; i < modelSetting.num_node_face; i++) { BoundaryNode boundary = new BoundaryNode(); boundary.node = model.nodes[i + 1 + modelSetting.num_node_all * (modelSetting.num_ring - 1) + modelSetting.num_longit * modelSetting.num_node_face]; boundary.ux = 1; boundary.uy = 1; boundary.uz = 1; boundary.rx = 1; boundary.ry = 1; boundary.rz = 1; model.AddBoundary(boundary); } //apply load }
private static void GetCircumferentialJoint(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result) { if (!result.PostElements.ContainsKey(4)) result.PostElements[4] = new List<Element>(); if (!result.PostElements.ContainsKey(6)) result.PostElements[6] = new List<Element>(); if (!result.PostElements.ContainsKey(7)) result.PostElements[7] = new List<Element>(); if(ringNo != 0) for (int j = 0; j < modelSetting.num_node_face; j++) { ElementCombin combinCircumZ = new ElementCombin(1, 4, j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + ringNo * modelSetting.num_node_all); result.PostElements[4].Add(combinCircumZ); ElementCombin combinCircumX = new ElementCombin(1, 6, j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + ringNo * modelSetting.num_node_all); result.PostElements[6].Add(combinCircumX); ElementCombin combinCircumY = new ElementCombin(1, 7, j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit, j + 1 + ringNo * modelSetting.num_node_all); result.PostElements[7].Add(combinCircumY); } }