public static Matrix GetTotalStiffnessMatrix(Model model, LoadCase loadcase) { var gen = new TclGenerator(); gen.ExportTotalStiffness = true; var tcl = gen.Create(model, LoadCase.DefaultLoadCase); var tclFile = System.IO.Path.GetTempFileName() + ".tcl"; System.IO.File.WriteAllText(tclFile, tcl); var stInf = new ProcessStartInfo(openSeeslocation); stInf.Arguments = tclFile; stInf.RedirectStandardOutput = true; stInf.UseShellExecute = false; var prc = Process.Start(stInf); prc.WaitForExit(); var openseesStfArr = System.IO.File.ReadAllLines(gen.stiffnessOut) .Select(i => i.Trim()) .Where(i => !string.IsNullOrWhiteSpace(i)) .Select( i => i.Split(' ') .Where(j => !string.IsNullOrWhiteSpace(j)) .Select(j => double.Parse(j, CultureInfo.CurrentCulture)) .ToArray()) .ToArray(); return(Matrix.FromJaggedArray(openseesStfArr)); }
public static DataTable[] OpenseesValidate(Model model, LoadCase loadcase, bool validateStiffness = false) { var gen = new TclGenerator(); gen.ElementTranslators.Add(new BarElement2Tcl() { TargetGenerator = gen }); gen.ElementTranslators.Add(new TetrahedronToTcl() { TargetGenerator = gen }); gen.ElementTranslators.Add(new TriangleElementToTri3Tcl() { TargetGenerator = gen }); gen.ElementLoadTranslators.Add(new UniformLoad2Tcl() { TargetGenerator = gen }); gen.ExportElementForces = false; gen.ExportNodalDisplacements = true; gen.ExportTotalStiffness = validateStiffness; gen.ExportNodalReactions = true; var tcl = gen.Create(model, LoadCase.DefaultLoadCase); var nodesFile = gen.nodesOut; var elementsFile = gen.elementsOut; var stiffnessFile = gen.stiffnessOut; var tclFile = System.IO.Path.GetTempFileName() + ".tcl"; Debug.WriteLine("{0}", tclFile); System.IO.File.WriteAllText(tclFile, tcl); if (!System.IO.File.Exists(openSeeslocation)) { throw new Exception("Opensees.exe not found, please put opensees.exe in this path: " + openSeeslocation); } var stInf = new ProcessStartInfo(openSeeslocation); stInf.Arguments = tclFile; stInf.RedirectStandardOutput = true; stInf.UseShellExecute = false; var prc = Process.Start(stInf); prc.WaitForExit(); var code = prc.ExitCode; var stiffness = stiffnessFile == null ? null : System.IO.File.ReadAllText(stiffnessFile); var ndisp = new XmlDocument(); ndisp.Load(nodesFile); var nreact = new XmlDocument(); nreact.Load(gen.reactionsOut); if (gen.ExportElementForces) { var elOut = new XmlDocument(); elOut.Load(elementsFile); var elmParts = elOut.DocumentElement.LastChild.InnerText.Trim().Split('\n').Select(i => i.Trim()).Where(i => !string.IsNullOrEmpty(i)).ToArray(); } var nodalDispParts = ndisp.DocumentElement.LastChild.InnerText.Trim().Split('\n').Select(i => i.Trim()).Where(i => !string.IsNullOrEmpty(i)).ToArray(); var nodalReactParts = nreact.DocumentElement.LastChild.InnerText.Trim().Split('\n').Select(i => i.Trim()).Where(i => !string.IsNullOrEmpty(i)).ToArray(); var openseesDs = nodalDispParts[0].Split(' ').Select(double.Parse).ToArray(); var openseesReacts = nodalReactParts[0].Split(' ').Select(double.Parse).ToArray(); var myDs = model.Nodes.SelectMany(i => Displacement.ToVector(i.GetNodalDisplacement(loadcase))).ToArray(); var myReacts = model.Nodes.SelectMany(i => Force.ToVector(i.GetSupportReaction(loadcase))).ToArray(); var absNodalDisp = new double[myDs.Length]; var relNodalDisp = new double[myDs.Length]; var absNodalReac = new double[myDs.Length]; var relNodalReac = new double[myDs.Length]; var nums = Enumerable.Range(0, myDs.Length).ToArray(); FindError(openseesDs, myDs, relNodalDisp, absNodalDisp); FindError(openseesReacts, myReacts, relNodalReac, absNodalReac); //var k = absNodalDisp; //var key = new Func<double[]>(() => (double[])absNodalDisp.Clone()); var nodalDispTbl = new DataTable(); nodalDispTbl.Locale = CultureInfo.InvariantCulture; var nodalReactTbl = new DataTable(); var elmFrcTbl = new DataTable(); { nodalDispTbl.Columns.Add("Node #", typeof(int)); nodalDispTbl.Columns.Add("DoF", typeof(string)); nodalDispTbl.Columns.Add("DoF #", typeof(int)); nodalDispTbl.Columns.Add("OpenSees Delta", typeof(double)); nodalDispTbl.Columns.Add("BFE Delta", typeof(double)); nodalDispTbl.Columns.Add("Relative Error", typeof(double)); nodalDispTbl.Columns.Add("Absolute Error", typeof(double)); } { nodalReactTbl.Columns.Add("Node #", typeof(int)); nodalReactTbl.Columns.Add("DoF", typeof(string)); nodalReactTbl.Columns.Add("DoF #", typeof(int)); nodalReactTbl.Columns.Add("OpenSees Support Reaction", typeof(double)); nodalReactTbl.Columns.Add("BFE Support Reaction", typeof(double)); nodalReactTbl.Columns.Add("Relative Error", typeof(double)); nodalReactTbl.Columns.Add("Absolute Error", typeof(double)); } { elmFrcTbl.Columns.Add("Elm #", typeof(int)); elmFrcTbl.Columns.Add("Relative Error", typeof(double)); elmFrcTbl.Columns.Add("Absolute Error", typeof(double)); } for (int i = 0; i < myDs.Length; i++) { nodalDispTbl.Rows.Add( i / 6, ((DoF)(i % 6)).ToString(), nums[i], openseesDs[i], myDs[i], relNodalDisp[i], absNodalDisp[i] ); nodalReactTbl.Rows.Add( i / 6, ((DoF)(i % 6)).ToString().Replace("D", "F").Replace("R", "M"), nums[i], openseesReacts[i], myReacts[i], relNodalReac[i], absNodalReac[i] ); } /* * for (int i = 0; i < model.Elements.Count; i++) * { * var bar = model.Elements[i] as BarElement; * * var myFrc = bar.GetInternalForceAt(0, LoadCase.DefaultLoadCase); * * nodalDispTbl.Rows.Add( * i , * ((DoF)(i % 6)).ToString(), * nums[i], * openseesDs[i], * myDs[i], * relNodalDisp[i], * absNodalDisp[i] * ); * * } */ return(new[] { nodalDispTbl, nodalReactTbl }); }
public static void OpenseesValidate(Model model, LoadCase loadcase, bool validateStiffness = false) { var gen = new TclGenerator(); gen.ElementTranslators.Add(new BarElement2Tcl() { TargetGenerator = gen }); gen.ExportElementForces = true; gen.ExportNodalDisplacements = true; gen.ExportTotalStiffness = validateStiffness; var tcl = gen.Create(model, LoadCase.DefaultLoadCase); var nodesFile = gen.nodesOut; var elementsFile = gen.elementsOut; var stiffnessFile = gen.stiffnessOut; var tclFile = System.IO.Path.GetTempFileName() + ".tcl"; System.IO.File.WriteAllText(tclFile, tcl); var stInf = new ProcessStartInfo(openSeeslocation); stInf.Arguments = tclFile; stInf.RedirectStandardOutput = true; stInf.UseShellExecute = false; var prc = Process.Start(stInf); prc.WaitForExit(); var code = prc.ExitCode; var stiffness = stiffnessFile == null ? null : System.IO.File.ReadAllText(stiffnessFile); var ndisp = new XmlDocument(); ndisp.Load(nodesFile); var elOut = new XmlDocument(); elOut.Load(elementsFile); var dParts = ndisp.DocumentElement.LastChild.InnerText.Trim().Split('\n').Select(i => i.Trim()).Where(i => !string.IsNullOrEmpty(i)).ToArray(); var elmParts = elOut.DocumentElement.LastChild.InnerText.Trim().Split('\n').Select(i => i.Trim()).Where(i => !string.IsNullOrEmpty(i)).ToArray(); var openseesDs = dParts[0].Split(' ').Select(double.Parse).ToArray(); var myDs = model.Nodes.SelectMany(i => Displacement.ToVector(i.GetNodalDisplacement(loadcase))).ToArray(); var abss = new double[myDs.Length]; var rels = new double[myDs.Length]; var nums = Enumerable.Range(0, myDs.Length).ToArray(); FindError(openseesDs, myDs, rels, abss); var k = abss; var key = new Func <double[]>(() => (double[])k.Clone()); var tbl = new DataTable(); tbl.Columns.Add("Node #", typeof(int)); tbl.Columns.Add("DoF", typeof(string)); tbl.Columns.Add("DoF #", typeof(int)); tbl.Columns.Add("OpenSees Delta", typeof(double)); tbl.Columns.Add("BFE Delta", typeof(double)); tbl.Columns.Add("RelativeErr", typeof(double)); tbl.Columns.Add("AbsErr", typeof(double)); for (int i = 0; i < myDs.Length; i++) { tbl.Rows.Add( i / 6, ((DoF)(i % 6)).ToString(), nums[i], openseesDs[i], myDs[i], rels[i], abss[i] ); } for (var i = 0; i < model.Nodes.Count; i++) { model.Nodes[i].Label = i.ToString(); } }