Der Fall mit der langen Berechnungszeit
Heute ist mir eine Datei untergekommen, bei der die Rechenzeit doch eher im unbrauchbaren Bereich lag: Das erzeugen des Netzes alleine brauchte fast 2 Stunden - damit kann man natürlich nicht vernünftig arbeiten. Beim System handelte es sich um eine Bodenplatte von etwa 100 x 30 m, die mit relativ vielen Einzellasten belastet war - außerdem waren ein paar Wände definiert.
Insgesamt gab es etwa 3600 Einzeleinwirkungen auf der Bodenplatte - und nach ein paar näheren Untersuchungen waren die es auch, die sich als das Problem herausstellten: Die Lasten waren als Knotenlasten und nicht als Faltwerkselement-Einzeleinwirkung definiert. Prinzipiell sollte es egal sein, welche der beiden Einwirkungsarten man verwenden - von der Performance her ist es aber so, das die deutlich besser wird, wenn man die Last als Faltwerkselement-Einzeleinwirkung definiert: In diesem Fall ist nämlich die zugehörige Platte schon bekannt und muss nicht erst ermittelt werden.
(Unabhängig davon ist das aktuelle Performance-Verhalten so nicht angebracht: Das werden wir auf jeden Fall nochmal näher untersuchen und verbessern.)
Die Lösung des Performance-Problems lag dann darin, das einfach alle Knoteneinwirkungen und Faltwerkselement-Einwirkungen "umgebaut" werden mussten. Man muss also die eine Einwirkung löschen, und dafür eine andere anlegen. Was kein Problem wäre - würde es sich nicht um 3600 Stück davon handeln. Die Lösung: Das folgende Makro. (Man erkennt schnell die Ähnlichkeit mit dem von gestern...:-) )
IShell shell = context.TargetDocument.FindObject("NameDerPLatte", typeof(Shell)) as IShell;
IDocObjectCollection loads = context.TargetDocument.GetObjects(typeof(INodeLoad));
foreach (INodeLoad load in loads)
{
if( load.Lcs == LocalCoordinateSystem.Unit())
{
ShellSingleLoad newLoad = ShellSingleLoad.CreateNamed(context.TargetDocument);
newLoad.ObjectName = load.ObjectName;
newLoad.Loadcase = load.Loadcase;
newLoad.LoadType = ShellSingleLoadTypes.Global;
newLoad.SizeX = load.SizeX;
newLoad.SizeY = load.SizeY;
newLoad.SizeZ = load.SizeZ;
newLoad.SizeXX = load.SizeXX;
newLoad.SizeYY = load.SizeYY;
newLoad.SizeZZ = load.SizeZZ;
newLoad.Comment = load.Comment;
newLoad.Node = load.Node;
newLoad.Shell = shell;
context.TargetDocument.RemoveObject(load);
context.TargetDocument.AddObject(newLoad);
}
}