Frage

Ich bin ein Finite-Elemente-System zu entwickeln. Wie üblich besteht die Simulation des Satzes von Netzknoten, die jeweils mit einem Satz von Eigenschaften (Fließpunkte), wie beispielsweise mehreren Materialeigenschaften, Koordinaten oder physikalischen Größen, die in der Zeit entwickeln.

Sie können entweder beschäftigen zwei extreme Ansätze:

  • Property weise: Pflegen Sie ein einzelnes Array für jede Eigenschaft:

    double* x, *y, *z, *e_field, *b_field, *conductivity;

  • Eintrag weist: Pflegen Sie ein einzelnes Array, wobei jedes Array struct

    struct { double x, y, z, e_field, b_field, conductivity; } *meshnodedata;

Dazwischen könnte man mischen, wie der zweiten Ansatz der Anwendung nur für die Koordinaten x, y, z, und unter Verwendung des ersten Ansatz für die übrigen Eigenschaften. Je mehr Eigenschaften Ihre Simulation für jeden Mesh-Knoten unterhält, zu mischen, die Möglichkeiten.

Auf der einen Seite habe ich die klassische Frage bekam, die diese Ansätze (und deren Mischungen) am besten für das wissenschaftliche Rechnen ist im Hinblick auf die Leistung des Programms und Wartbarkeit des Codes. Auf der anderen Seite frage ich mich, wie Code in einer solchen Art und Weise zu implementieren, dass die Migration zwischen verschiedenen Ansätzen leicht wird. Darüber hinaus könnte es auch eine Lösung sein, zwischen verschiedenen Speicherbelegungen für verschiedene Teile des Programms zu migrieren.

Um zum Punkt zu kommen:

  • Was waren Ihre Erfahrungen Whit diese verschiedenen Ansätze?
  • Welche Bedeutung haben diese Unterschiede gewesen?
  • Haben Sie Erfahrung in der Migration zwischen diesen beiden Layouts gewonnen?
War es hilfreich?

Lösung

Ihre Frage läuft darauf hinaus tatsächlich auf die Frage auf, wie flexibel und schnell Finite-Elemente-Software zu entwerfen, die ein Gebiet der aktiven Forschung. Ich habe auf diese Art von Software gearbeitet, und ich denke, die Antworten auf Ihre Fragen hängt wirklich auf, welche Art von Funktionen, die Sie Unterstützung möchten. Zum Beispiel haben Sie adaptive Gitterverfeinerung und Vergröberung müssen? Haben Sie Systeme von PDEs lösen? Sollte Ihr Code auf einem Cluster ausgeführt? Wie viele Unbekannte haben Sie? Ohne Ihre Ziele zu wissen, ich versuche trotzdem einige allgemeine Ponts zu machen.

  1. Es gibt Unmengen von FE-Frameworks und Grid-Manager gibt - Verwendung einer von ihnen

  2. !
  3. Grid Manager sind komplexer als viele Leute denken. Solange es nur tets in 3D auf einem einzelnen Computer ist, kann es immer noch überschaubar sein. Ein Raster-Manager mit gemischten Elementtypen in 3D mit lokaler Verfeinerung und parallel Load-Balancing ist eine enorme Aufgabe. Nur Ihre eigenen Grid-Manager entwickeln, wenn Sie wissen, was Sie diejenigen zu verbessern, die überspielt, die leicht verfügbar sind.

  4. Speicherlayout: Jetzt sind wir auf die eigentliche Frage bekommen :)
    Separate Rasterdaten und Problemdaten. Dadurch wird Ihr Code besser verwaltbar machen. Der Netzmanager kann für verschiedene Arten von Problemen verwendet werden, und jedes Problem hat seinen eigenen Satz von Daten zu jedem Element befestigt ist.

  5. Wenn Sie speichern Dinge wie die Leitfähigkeit innerhalb des Gitters oder außen sollte nicht viel aus, soweit die Leistung angeht. Ich würde es aus konstruktiven Gründen trennt, nicht aus Leistungsgründen.

  6. Speichern Sie Ihre Unbekannten (vermutlich e_field und b_field in Ihrem Beispiel) in einem zusammenhängenden Speicherblock. Dies wird massiv die Leistung Ihres linearen Solver verbessern. Eine iterative lineare Solver wird in der Regel durch die Speicherbandbreite für große Matrizen beschränkt.

  7. Die innere Struktur der Vektor der Unbekannten könnten gruppiert werden oder blockweise (im Grunde die beiden Ansätze, die Sie selbst beschrieben) Welche dieser beiden Ansätze für die Nummerierung der Unbekannten zu wählen, hängt von vielen Faktoren ab, einschließlich der Art von PDE lösen Sie und die Art der linearen Solver verwenden Sie. Es gibt viele wissenschaftliche Veröffentlichungen zu diesem Problem allein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top