Der Fall mit der langen Berechnungszeit


Thomas Wölfer
Thomas Wölfer

23. August 2007


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);
      }
   }