public void ParseZeitintegration(string[] lines, FEModell feModell) { var modell = feModell; var dimension = modell.SpatialDimension; Initial = new double[dimension]; // suche "Eigenloesungen" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Eigenloesungen") { continue; } FeParser.InputFound += "\nEigenlösungen"; substrings = lines[i + 1].Split(delimiters); if (substrings.Length == 2) { var id = substrings[0]; int numberOfStates = short.Parse(substrings[1]); modell.Eigenstate = new Eigenzustand(id, numberOfStates); break; } else { throw new ParseAusnahme((i + 2) + ": Eigenloesungen, falsche Anzahl Parameter"); } } // suche "Zeitintegration" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitintegration") { continue; } FeParser.InputFound += "\nZeitintegration"; //id, tmax, dt, method, parameter1, parameter2 //method=1:beta,gamma method=2:theta method=3: alfa substrings = lines[i + 1].Split(delimiters); switch (substrings.Length) { case 5: var tmax = double.Parse(substrings[1]); var dt = double.Parse(substrings[2]); var method = short.Parse(substrings[3]); var parameter1 = double.Parse(substrings[4]); modell.Zeitintegration = new Zeitintegration(tmax, dt, method, parameter1); break; case 6: tmax = double.Parse(substrings[1]); dt = double.Parse(substrings[2]); method = short.Parse(substrings[3]); parameter1 = double.Parse(substrings[4]); var parameter2 = double.Parse(substrings[5]); modell.Zeitintegration = new Zeitintegration(tmax, dt, method, parameter1, parameter2); break; default: throw new ParseAusnahme((i + 2) + ": Zeitintegration, falsche Anzahl Parameter"); } zeitintegrationDaten = true; } // suche "Daempfung" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Daempfung") { continue; } FeParser.InputFound += "\nDaempfung"; do { substrings = lines[i + 1].Split(delimiters); var knotenId = substrings[0]; var dämpfungsRaten = new double[substrings.Length - 1]; for (var k = 0; k < (substrings.Length - 1); k++) { dämpfungsRaten[k] = double.Parse(substrings[k + 1]); } modell.Zeitintegration.DämpfungsRaten.Add(new Knotenwerte(knotenId, dämpfungsRaten)); i++; } while (lines[i + 1].Length != 0); break; } // suche "Anfangsbedingungen" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Anfangsbedingungen") { continue; } FeParser.InputFound += "\nAnfangsbedingungen"; do { substrings = lines[i + 1].Split(delimiters); var anfangsKnotenId = substrings[0]; // Anfangsverformungen und Geschwindigkeiten int nodalDof; switch (substrings.Length) { case 3: nodalDof = 1; break; case 5: nodalDof = 2; break; case 7: nodalDof = 3; break; default: throw new ParseAusnahme((i + 2) + ": Anfangsbedingungen, falsche Anzahl Parameter"); } var anfangsWerte = new double[2 * nodalDof]; for (var k = 0; k < 2 * nodalDof; k++) { anfangsWerte[k] = double.Parse(substrings[k + 1]); } modell.Zeitintegration.Anfangsbedingungen.Add(new Knotenwerte(anfangsKnotenId, anfangsWerte)); i++; } while (lines[i + 1].Length != 0); break; } // suche zeitabhängige Knotenlasten for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitabhaengige Knotenlast") { continue; } FeParser.InputFound += "\nZeitabhaengige Knotenlast"; var boden = false; i++; substrings = lines[i].Split(delimiters); do { string nodeLoadId, nodeId; int nodalDof; switch (substrings.Length) { case 3: { nodeLoadId = substrings[0]; nodeId = substrings[1]; nodalDof = short.Parse(substrings[2]); break; } case 4: { nodeLoadId = substrings[0]; nodeId = substrings[1]; nodalDof = short.Parse(substrings[2]); boden = true; break; } default: throw new ParseAusnahme((i + 2) + ": Zeitabhaengige Knotenlast, falsche Anzahl Parameter"); } substrings = lines[i + 1].Split(delimiters); ZeitabhängigeKnotenLast zeitabhängigeKnotenLast; switch (substrings.Length) { // lies Anregung (Lastvektor) aus Datei case 1: { const bool datei = true; zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, nodalDof, datei); var last = (AbstraktZeitabhängigeKnotenlast)zeitabhängigeKnotenLast; modell.ZeitabhängigeKnotenLasten.Add(nodeLoadId, last); break; } // lies Zeit-/Wert-Intervalle der Anregung mit linearer Interpolation case 3: { var amplitude = double.Parse(substrings[0]); var circularFrequency = 2 * Math.PI * double.Parse(substrings[1]); var phaseAngle = Math.PI / 180 * double.Parse(substrings[2]); zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, nodalDof, amplitude, circularFrequency, phaseAngle); modell.ZeitabhängigeKnotenLasten.Add(nodeLoadId, zeitabhängigeKnotenLast); break; } default: { var interval = new double[substrings.Length]; for (var j = 0; j < substrings.Length; j += 2) { interval[j] = double.Parse(substrings[j]); interval[j + 1] = double.Parse(substrings[j + 1]); } zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, nodalDof, interval); modell.ZeitabhängigeKnotenLasten.Add(nodeLoadId, zeitabhängigeKnotenLast); break; } } zeitabhängigeKnotenLast.Bodenanregung = boden; i += 2; } while (lines[i].Length != 0); } }
public void ParseZeitintegration(string[] lines, FEModell feModell) { var delimiters = new[] { '\t' }; var modell = feModell; //suche "Eigenlösungen" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Eigenloesungen") { continue; } FeParser.InputFound += "\nEigenloesungen"; do { substrings = lines[i + 1].Split(delimiters); switch (substrings.Length) { case 2: { var id = substrings[0]; int numberOfStates = short.Parse(substrings[1]); modell.Eigenstate = new Eigenzustand(id, numberOfStates); i++; break; } default: throw new ParseException((i + 2) + ": Eigenlösungen, falsche Anzahl Parameter"); } } while (lines[i + 1].Length != 0); break; } // suche "Zeitintegration" for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitintegration") { continue; } FeParser.InputFound += "\nZeitintegration"; var teilStrings = lines[i + 1].Split(delimiters); var tmax = double.Parse(teilStrings[1]); var dt = double.Parse(teilStrings[2]); var alfa = double.Parse(teilStrings[3]); modell.Zeitintegration = new Zeitintegration(tmax, dt, alfa) { FromStationary = false }; zeitintegrationDaten = true; break; } // suche Anfangstemperaturen for (var i = 0; i < lines.Length; i++) { // stationaere Loesung oder nodeId (incl. "alle") if (lines[i] != "Anfangstemperaturen") { continue; } FeParser.InputFound += "\nAnfangstemperaturen"; var teilStrings = lines[i + 1].Split(delimiters); if (teilStrings[0] == "stationaere Loesung") { modell.Zeitintegration.FromStationary = true; } else { do { // knotenId inkl. alle var knotenId = teilStrings[0]; var t0 = double.Parse(teilStrings[1]); var initial = new double[1]; initial[0] = t0; modell.Zeitintegration.Anfangsbedingungen.Add(new Knotenwerte(knotenId, initial)); i++; teilStrings = lines[i + 1].Split(delimiters); } while (lines[i + 1].Length != 0); } break; } // suche zeitabhängige Randtemperaturen, eingeprägte Temperatur am Rand // 5:Name,NodeId,Amplitude,Frequenz,Phase // >5:Name,NodeId,Wertepaare für stückweise linearen Verlauf for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitabhaengige Randtemperaturen") { continue; } FeParser.InputFound += "\nZeitabhaengige Randtemperaturen"; do { var teilStrings = lines[i + 1].Split(delimiters); var supportId = teilStrings[0]; var nodeId = teilStrings[1]; ZeitabhängigeRandbedingung zeitabhängigeRandbedingung; switch (teilStrings.Length) { case 2: { const bool datei = true; zeitabhängigeRandbedingung = new ZeitabhängigeRandbedingung(nodeId, datei); break; } case 3: { var konstanteTemperatur = double.Parse(teilStrings[2]); zeitabhängigeRandbedingung = new ZeitabhängigeRandbedingung(nodeId, konstanteTemperatur); break; } case 5: { var amplitude = double.Parse(teilStrings[2]); var frequency = 2 * Math.PI * double.Parse(teilStrings[3]); var phaseAngle = Math.PI / 180 * double.Parse(teilStrings[4]); zeitabhängigeRandbedingung = new ZeitabhängigeRandbedingung(nodeId, amplitude, frequency, phaseAngle); break; } default: { var interval = new double[teilStrings.Length - 2]; interval[0] = double.Parse(teilStrings[2]); interval[1] = double.Parse(teilStrings[3]); for (var j = 2; j < teilStrings.Length - 2; j += 2) { interval[j] = double.Parse(teilStrings[j + 2]); interval[j + 1] = double.Parse(teilStrings[j + 3]); } zeitabhängigeRandbedingung = new ZeitabhängigeRandbedingung(nodeId, interval); break; } } zeitabhängigeRandbedingung.Prescribed = new double[1]; modell.ZeitabhängigeRandbedingung.Add(supportId, zeitabhängigeRandbedingung); i++; } while (lines[i + 1].Length != 0); break; } // suche zeitabhängige Knotenlast (Temperaturen) Knotentemperaturen // 5:Name,NodeId,Amplitude,Frequenz,Phase // >5:Name,NodeId,Wertepaare für stückweise linearen Verlauf for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitabhaengige Knotenlast") { continue; } FeParser.InputFound += "\nZeitabhaengige Knotenlast"; do { var teilStrings = lines[i + 1].Split(delimiters); var supportId = teilStrings[0]; var nodeId = teilStrings[1]; ZeitabhängigeKnotenLast zeitabhängigeKnotenLast; switch (teilStrings.Length) { case 2: { zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, true) { VariationType = 0 }; break; } case 5: { var amplitude = double.Parse(teilStrings[2]); var frequency = double.Parse(teilStrings[3]); var phaseAngle = double.Parse(teilStrings[4]); zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, amplitude, frequency, phaseAngle) { VariationType = 2 }; break; } default: { var interval = new double[teilStrings.Length - 2]; interval[0] = double.Parse(teilStrings[2]); interval[1] = double.Parse(teilStrings[3]); for (var j = 2; j < teilStrings.Length - 2; j += 2) { interval[j] = double.Parse(teilStrings[j + 2]); interval[j + 1] = double.Parse(teilStrings[j + 3]); } zeitabhängigeKnotenLast = new ZeitabhängigeKnotenLast(nodeId, interval) { VariationType = 1 }; break; } } modell.ZeitabhängigeKnotenLasten.Add(supportId, zeitabhängigeKnotenLast); i++; } while (lines[i + 1].Length != 0); break; } // suche zeitabhängigeElementLast auf Dreieckselementen // 5:Name,ElementId,Knotenwert1, Knotenwert2, Knotenwert3 for (var i = 0; i < lines.Length; i++) { if (lines[i] != "Zeitabhaengige Elementlast") { continue; } FeParser.InputFound += "\nZeitabhaengige Elementlast"; var knotenWerte = new double[3]; do { var teilStrings = lines[i + 1].Split(delimiters); var supportId = teilStrings[0]; var elementId = teilStrings[1]; for (var k = 0; k < 3; k++) { knotenWerte[k] = double.Parse(teilStrings[k + 2]); } var zeitabhängigeElementLast = new ZeitabhängigeElementLast(elementId, knotenWerte) { VariationType = 0 }; modell.ZeitabhängigeElementLasten.Add(supportId, zeitabhängigeElementLast); i++; } while (lines[i + 1].Length != 0); break; } }