/// <summary> /// Divides the given frame into given number of pieces. /// </summary> public void DivideFrame(Frame f, int n) { Node n1 = f.NodeI; Node n2 = f.NodeJ; double xStep = (n2.X - n1.X) / (double)n; double zStep = (n2.Z - n1.Z) / (double)n; Node[] nodes = new Node[n + 1]; nodes[0] = n1; nodes[nodes.Length - 1] = n2; double x = n1.X + xStep; double z = n1.Z + zStep; for (int i = 0; i < n - 1; i++) { nodes[i + 1] = AddNode(x, z); x += xStep; z += zStep; } Frames.Remove(f); for (int i = 0; i < n; i++) { Frame newFrame = AddFrame(f.Section, nodes[i], nodes[i + 1]); // Transfer loads // Uniform loads foreach (FrameLoad masterLoad in f.Loads.FindAll((e) => e is FrameUniformLoad)) { FrameUniformLoad masterUniformLoad = masterLoad as FrameUniformLoad; newFrame.AddUniformLoad(masterUniformLoad.AnalysisCase, masterUniformLoad.FX, masterUniformLoad.FZ); } // Trapezoidal loads foreach (FrameLoad masterLoad in f.Loads.FindAll((e) => e is FrameTrapezoidalLoad)) { FrameTrapezoidalLoad masterTrapezoidalLoad = masterLoad as FrameTrapezoidalLoad; double mxi = masterTrapezoidalLoad.FXI; double mzi = masterTrapezoidalLoad.FZI; double mxj = masterTrapezoidalLoad.FXJ; double mzj = masterTrapezoidalLoad.FZJ; double xTotal = f.Length; double xStart = newFrame.NodeI.DistanceTo(f.NodeI); double xEnd = newFrame.NodeJ.DistanceTo(f.NodeI); double fxi = xStart / xTotal * (mxj - mxi) + mxi; double fzi = xStart / xTotal * (mzj - mzi) + mzi; double fxj = xEnd / xTotal * (mxj - mxi) + mxi; double fzj = xEnd / xTotal * (mzj - mzi) + mzi; newFrame.AddTrapezoidalLoad(masterTrapezoidalLoad.AnalysisCase, fxi, fzi, fxj, fzj); } } }
/// <summary> /// Adds a new frame trapezoidal load. /// </summary> public void AddFrameTrapezoidalLoad(AnalysisCase analysisCase, Frame frame, double fxi, double fzi, double fxj, double fzj) { frame.AddTrapezoidalLoad(analysisCase, fxi, fzi, fxj, fzj); }