//you don't need to assign modelSetting.num_longit as it will calculated by axis public static void BuildCurveModel(ModelSetting modelSetting, Model model, string path) { //get the coordinary of each ring double length = Math.Abs(modelSetting.axis.AxisPoints.First().Mileage - modelSetting.axis.AxisPoints.Last().Mileage); modelSetting.num_ring = (int)(length / modelSetting.width); List<RingInfo> ringInfos = GetRingInfo(modelSetting); //get single ring result SingleRingResult ringResult = new SingleRingResult(); GenerateNodes.GenerateSingleRingNode(modelSetting, ringResult); GenerateElements.GenerateSingleRingElement(modelSetting, ringResult); //initial 3D result List<ShieldTunnel3DResult> results = new List<ShieldTunnel3DResult>(); for (int i = 0; i < ringInfos.Count - 1; i++) //for (int i = 0; i < 10; i++) { ShieldTunnel3DResult result = new ShieldTunnel3DResult(); ChangeLocal(ringInfos[i], result); GetNodes(i, modelSetting, ringResult, result); GetShellElements(i, modelSetting, ringResult, result); RotateNode(i, modelSetting, result); results.Add(result); } Output(model, results, path); }
private static void RotateNode(int ringNo, ModelSetting modelSetting, ShieldTunnel3DResult result) { //rotate the nodes of back border of the last ring if (ringNo != 0) //not the first ring for (int j = 0; j < modelSetting.num_node_face; j++) { result.rotateNodeID.Add(j + 1 + (ringNo - 1) * modelSetting.num_node_all + modelSetting.num_node_face * modelSetting.num_longit); } //rotate all the nodes of this ring for (int j = 0; j < modelSetting.num_node_ring; j++) { result.rotateNodeID.Add(j + 1 + ringNo * modelSetting.num_node_all); } }
private static void GetShellElements(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result) { if (!result.PreElements.ContainsKey(1)) result.PreElements[1] = new List<Element>(); foreach (Element element in ringResult.elements[1]) { ElementShell shell = element as ElementShell; ElementShell newShell = new ElementShell(1, shell.pid, shell.n1 + modelSetting.num_node_all * ringNo, shell.n2 + modelSetting.num_node_all * ringNo, shell.n3 + modelSetting.num_node_all * ringNo, shell.n4 + modelSetting.num_node_all * ringNo); result.PreElements[1].Add(newShell); } }
private static void GetNodes(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result) { for (int j = 0; j < modelSetting.num_node_all; j++) { Node node = ringResult.nodes[j]; Node newNode = new Node(node.nid + ringNo * modelSetting.num_node_all, node.x, node.y, node.z); result.nodes.Add(newNode); } }
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); } } }
private static void GetGroundElements(int ringNo, ModelSetting modelSetting, SingleRingResult ringResult, ShieldTunnel3DResult result) { if (!result.PreElements.ContainsKey(2)) result.PreElements[2] = new List<Element>(); //generate radial ground spring foreach (Element element in ringResult.elements[2]) { ElementLink link = element as ElementLink; ElementLink newLink = new ElementLink(1, link.pid, link.n1 + modelSetting.num_node_all * ringNo, link.n2 + modelSetting.num_node_all * ringNo); result.PreElements[2].Add(newLink); } if (!result.PreElements.ContainsKey(3)) result.PreElements[3] = new List<Element>(); //generate tangential ground spring foreach (Element element in ringResult.elements[3]) { ElementLink link = element as ElementLink; ElementLink newLink = new ElementLink(1, link.pid, link.n1 + modelSetting.num_node_all * ringNo, link.n2 + modelSetting.num_node_all * ringNo); result.PreElements[3].Add(newLink); } }
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); } }
private static void ChangeLocal(RingInfo info, ShieldTunnel3DResult result) { result.changeLocal = String.Format("local,11,0,{0:0.00},{1:0.00},{2:0.00},{3:0.00},{4:0.00},{5:0.00}", info.x, info.y, info.z, Math.Atan(info.vecY / info.vecX) / Math.PI * 180, 0, Math.Atan(info.vecZ / info.vecX) / Math.PI * 180); }