Question

Je développe un système d'éléments finis. Comme d'habitude, la simulation est constitué d'ensemble de noeuds maillés, chacune avec un ensemble de propriétés (-points flottants), comme par exemple plusieurs propriétés du matériau, des coordonnées ou des grandeurs physiques qui évoluent dans le temps.

Vous pouvez soit utiliser deux approches extrêmes:

  • sage propriété: Maintenir un seul tableau pour chaque propriété:

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

  • Entrée-sage: Maintenir une seule matrice, où chaque matrice est struct

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

Entre ceux-ci, on peut mélanger, comme l'application de la deuxième approche que pour les coordonnées x, y, z, et en utilisant la première approche pour les autres propriétés. Plus les propriétés de votre simulation pour chaque noeud maintient de maille, les possibilités de se mélanger.

D'une part, j'ai la question classique de ces approches, (et leurs mélanges) est le mieux pour le calcul scientifique en ce qui concerne la performance du programme et la maintenabilité du code. D'autre part, je me demande comment mettre en œuvre le code de manière à ce que la migration entre les différentes approches devient facile. De plus, il pourrait même être une solution pour migrer entre différentes mises en page de mémoire pour les différentes parties du programme.

Pour venir au point:

  • Quelles ont été vos expériences Whit ces différentes approches?
  • Quelle est l'importance de ces différences ont été?
  • Avez-vous acquis de l'expérience dans la migration entre ces deux dispositions?
Était-ce utile?

La solution

Votre question se résume en fait vers le bas à la question comment concevoir un logiciel d'élément flexible et rapide fini, qui est un domaine de recherche actif. Je travaille sur ce genre de logiciel, et je pense que les réponses à vos questions dépendent vraiment de ce genre de fonctionnalités que vous souhaitez soutenir. Par exemple, avez-vous besoin de raffinement et de grille adaptative coarsening? Avez-vous résoudre des systèmes d'équations aux dérivées partielles? Au cas où votre code est exécuté sur un cluster? Combien d'inconnues aurez-vous? Sans connaître vos objectifs, je tente de faire quelques généraux de toute façon ponts.

  1. Il y a des tas de cadres FE et les gestionnaires de réseau là-bas - l'utilisation d'un d'entre eux

  2. !
  3. gestionnaires de grille sont plus complexes que beaucoup de gens pensent. Tant qu'il est seulement tets en 3D sur un seul ordinateur, il pourrait encore être faisable. Un gestionnaire de grille avec les types d'éléments mixtes en 3D avec raffinement local et d'équilibrage de charge parallèle est une tâche énorme. Seulement développer votre propre gestionnaire de réseau si vous savez ce que vous voulez améliorer par rapport à ceux qui sont facilement disponibles.

  4. Disposition de la mémoire: Maintenant, nous arrivons à la question réelle :)
    données de grille séparées et des données de problèmes. Cela rendra votre code plus maintenable. Le gestionnaire du réseau peut être utilisé pour différents types de problèmes, et chaque problème a son propre ensemble de données associées à chaque élément.

  5. Si vous stockez des choses comme la conductivité dans la grille ou à l'extérieur ne devrait pas beaucoup d'importance dans la mesure où la performance est concerné. Je le séparer pour des raisons de conception, et non pour des raisons de performance.

  6. Stockez vos inconnues (probablement e_field et b_field dans votre exemple) dans un bloc contigu de mémoire. Cela permettra d'améliorer considérablement les performances de votre solveur linéaire. Un solveur linéaire itératif est généralement limitée par la bande passante de mémoire pour de grandes matrices.

  7. La structure interne de votre vecteur d'inconnues peut être groupé ou par bloc (essentiellement les deux approches que vous vous décrivez) Lequel de ces deux approches de choisir pour la numérotation des inconnues dépend de nombreux facteurs, y compris le type de PDE vous résolvez et le type de solveur linéaire que vous utilisez. Il existe de nombreuses publications scientifiques sur ce problème seul.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top