IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Créer un type de données pour une structure cubique centrée ou cubique faces centrées


Sujet :

MFC

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut Créer un type de données pour une structure cubique centrée ou cubique faces centrées
    Bonjour à tous
    J'ai voudrais des pistes de solutions pour créer un tableau à 3D pour une structure cubique centrée ou cubique faces centrées.
    un simple tableau à 3D permet uniquement d'implémenter une structure cubique simple.
    toute suggestion serait la bienvenue
    merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Réponse b-a.ba de la POO :
    Quels services doivent offrir vos classes ? (en termes de méthodes offertes)

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Bonjour
    Je fais des simulations Monte Carlo et je dois stocker les atomes (plus exactement le spin de l'atome) d'un réseau cubique centré ou cubique faces centrées.
    Le spin de l'atome est un vecteur à 1, 2 ou 3 composantes. la classe Spin permet
    - la somme de spins
    - le produit de 2 spins
    - la norme du spin
    - ...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Je pense que vous prenez le problème à l'envers.
    Je pense que vous devez déjà avoir un système de calcul intensif qui demande certaines caractéristiques pour ne pas faire chuter les performances/paralléliser le machin.

    Mais bon, dans l'absolu, au pays des bisounours, on fait une arborescence de classe bien propre :

    Code fait à l'arrache, sans vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    class structure_cristal
    {
    ...
    public : 
        /*si tirage "spacial*/
        virtual const atome& getNearestAtome(double x,double y,double z) = 0;
     
       /*si tirage aléatoire sur le nombre d'atome du cristal*/
       virtual long cardinality() = 0;
       virtual const atome& getAtome(long atomeNumber) = 0;
    ...
    }
     
    class structure_cubique_simple : public structure_cristal
    {
    ...
    long m_sizeX;
    long m_sizeY;
    long m_sizeZ;
    std::vector<Atome> grid;
    ...
    public : 
        structure_cubique_simple(long sizeX,long sizeY,long sizeZ):m_sizeX(sizeX),m_sizeY(sizeY),m_sizeZ(sizeZ),grid(sizeX*sizeY*sizeZ){};
        const atome& getNearestAtome(double x,double y,double z) override {return grid[std::round(x) + m_sizeX*std::round(y) + m_sizeX*m_sizeY*std::round(z)];}
        const atome& getAtome(long atomeNumber) override { return grid[atomeNumber];};
        long cardinality() override { return grid.size();}
    }
     
    class structure_cubique_centre : public structure_cristal
    {
    ...
    public : 
    ...
    }
     
    class structure_cubique_faces_centreese : public structure_cristal
    {
    ...
    public : 
    ...
    }
    Pour "structure_cubique_simple" un simple std::vector fait l'affaire car on dispose d'une numérotation simple pour les atomes constituants la structure.
    Avec un peu de recherche, je pense que les atomes d'une "structure_cubique_centre" et d'une "structure_cubique_faces_centreese" disposent aussi d'une numérotation.

    Avec cette numérotation, "structure_cubique_centre" et d'une "structure_cubique_faces_centreese" devrait se contenter aussi d'un simple std::vector<Atome> comme champ stockant les atomes.
    Avec cette numérotation, il suffit de changer la méthode "getNearestAtome" pour utiliser cette numérotation et retrouver l'atome dans le std::vector<Atome>.
    Vous pouvez migrer le code comment vers la classe de base "structure_crystal".

  5. #5
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Merci de votre proposition.
    Mais je crois que j'ai mal présenté mon problème. Je vais placer mes spins sur les nœuds d'un réseau.
    Le réseau peut être
    - Cubique simple : c'est à dire un simple tableau de dimensions 3, pour ça pas de problèmes
    - Cubique centré : une grille 3D avec un nœud au centre de chaque cube où je dois mettre en plus un spin
    - Cubique faces centrées : une grille 3D avec un nœud au centre de chaque face du cube où je dois mettre en plus un spin.

    Le réseau en soit n'a aucun service à fournir il sert juste de conteneur de mes spins qui eux ont des propriétés et des méthodes. Les atomes du réseau sont donc les spins.
    Par ailleurs le type de données avec numérotation me priverait des différents types de conditions aux limites (effets de bords) que je dois imposer au réseau.
    J'espère que c'est un peu plus claire maintenant.
    Merci

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Il est parfois judicieux de situer un peu le contexte, tout le monde n'a pas de notions de chimie ou alors elles sont loin (ce qui est mon cas).

    Il est difficile de répondre précisément à ta question sans connaître pas mal de détails sur le cas d'utilisation dont toi seul dispose. Quels types d'opérations subiront les nœuds ? Comment et à quelle fréquence seront réalisés les parcours, la recherche, les accès aux éléments ? La structure sera-t-elle plus ou moins statique ou subira-t-elle de lourdes modifications d'intégrité (suppressions, insertions..) ? Etc..

    Note que tu peux tout à fait représenter les trois structures cristallines dans une grille 3D sans aucune place perdue : en cubique centré et en cubique faces centrées, les « feuilles d'atomes » (orthogonales à un axe donné) de rang impair sont simplements décalées par rapport à leurs voisines de rang pair. Si a est le côté du cube, le décalage est de a/2 dans les deux directions du plan pour le cubique centré, et de a/2 dans une seule direction pour le cfc.

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Mon tableau ne subit aucune modification la taille est statique. Il me sert juste d'organisation spatiale.
    Pour le tableau à 3D ordinaire je tire les coordonnées d'un nœud de façon aléatoire ou pas et j'applique des actions spécifiques sur le spin qui s'y trouve
    et je répété cela plusieurs fois sur tout le tableau.
    Je veux juste implémenter les deux autres types d'organisation spatiale en C++. Je n'ai pas de problèmes de compréhension de cristallographie.

  8. #8
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ben ça tombe bien parce que :

    Citation Envoyé par David Fouejio Voir le message
    J'ai voudrais des pistes de solutions pour créer un tableau à 3D pour une structure cubique centrée ou cubique faces centrées.
    ..est exactement ce à quoi j'ai répondu juste au-dessus, tout en te démontrant que :

    Citation Envoyé par David Fouejio Voir le message
    un simple tableau à 3D permet uniquement d'implémenter une structure cubique simple.
    ..est faux.

    Relis ce que j'ai écrit.

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Merci Matt
    je crois qu'on ne se comprend pas et ce que tu as écrit ne répond pas à mes attentes.
    l'optique n'est pas seulement de localiser les nœuds de ces réseaux. je veux les garder dans une grille 3D et que les spins qui seront mis à ces nœuds aient une mémoire durant les différents cycles de traitement.

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ok, je sors l'artillerie lourde a.k.a. paint (gimp). Exemple avec le cfc :

    Nom : cfc.png
Affichages : 415
Taille : 17,4 Ko

    On a bien le même nombre de postes d'atomes sur chaque plan normal à l'axe Z, on peut donc tout empaqueter dans une grille 3D de taille w * h * d exactement comme en cubique simple, si ce n'est qu'il faudra prendre en compte le décalage des atomes en X (ou en Y) de a/2 par rapport à leurs voisins dont la coordonnée Z est de parité opposée (cf. ci-dessus les postes en Z pair en rouge, en Z impair en noir). Des informations topologiques supplémentaires peuvent aisément être déduites des coordonnées des atomes au sein de la grille.

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    @David Fouejio, je pense que tu ne prends pas assez de recul sur le problème. Je suis d'accord avec @Matt_Houston.
    On n'est sur le forum MFC et non C++, tu n'auras pas beaucoup d'interlocuteurs ici, je pense qu'il faudrait transférer le sujet vers le forum C++.
    Mais je pense que tu auras les même réponses que les nôtres.

    @Matt_Houston a été très concret et dirigiste, moi, je suis plus "mathématique".

    Aucune de tes remarques n'invalide mon "architecture", c'est même la nature d'une bonne architecture, sa souplesse.

    Je pense avoir bien compris tes problèmes malgré que mes derniers cours de cristallographie date d'il y a plus de 20 ans et que le spin d'une particule, on s'en cognait.

    Sommes-nous d'accord que tous les atomes du cristal peuvent être numérotées ?

    Donc, on peut ranger les atomes/spins peuvent être rangé dans un tableau 1D suivant cette numérotation.

    Le réseau en soit n'a aucun service à fournir il sert juste de conteneur de mes spins
    Bin non, il gère la numérotation des atomes/spins, déjà, au minimum.

    Par ailleurs le type de données avec numérotation me priverait des différents types de conditions aux limites (effets de bords) que je dois imposer au réseau.
    Bin voilà un truc que la classe "structure_cristal" fera très très bien. Et que ses classes dérivées customiseraient très très bien.

    Je veux juste implémenter les deux autres types d'organisation spatiale
    Bin, elle fait quoi la classe "structure_cristal" ???

    Il me sert juste d'organisation spatiale.
    C'est bien le rôle de la classe "structure_cristal" qui permet de savoir quoi est où en "cachant" la numérotation.

    Je veux juste implémenter les deux autres types d'organisation spatiale en C++.
    Tu as eu droit juste à un "repas gratuit" pour le cas du cristal cubique simple où un tableau à 3 dimensions fait le job (très très mal d'un point de vue performance, très probablement).

    Donc, toutes tes remarques me confortent dans ma proposition.
    Remplacez votre tableau 3D pour une instance de "structure_cubique_simple", remplacez les accès directs aux données du tableau par les appels de méthodes de l'instance.
    Votre code fera la même chose qu'avant.
    Mais il fonctionnera aussi avec des instances de "structure_cubique_centre" et "structure_cubique_faces_centreese".
    Il reste à implémenter les accesseurs aux données qui ne seront qu'un calcul de numérotation.

    Si vous voulez, donnez-nous un extrait de votre code et on vous donne la version "objet" de celui-ci.

  12. #12
    Membre régulier
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Points : 106
    Points
    106
    Par défaut
    Merci Matt et merci à tous pour vos contributions
    je vais utiliser l'idée de Matt
    pour le cubique faces centrée
    - pour le centre des faces, les 2 indices de la face sont impairs : i+j, i+k, j+k = 2n. on y met un atome (ou spin). ex: (110) (310) (130) (101) (011) (103), ....
    - pour les sommets du cube les 3 indices du sommets sont pairs, on y met un atome (ou spin). ex: (000) (200) (220) (002), (222), ....
    - pour toutes les autres combinaison d'indices il n'y a pas d'atome.

    pour le cubique centré on doit avoir
    - les atomes aux sommets ont tous leurs indices pairs. ex: (000) (200) (002) (220) (222) (400), ...
    - les atomes aux centres ont tous leurs indices impairs. ex: (111) (311) (131) (113) (135), ...
    - pour toutes les autres combinaison d'indices il n'y a pas d'atome.

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 059
    Points : 12 095
    Points
    12 095
    Par défaut
    Que c'est complexe !!!

    Vous n'êtes près à passer le pas de la POO, soit, mais pas la peine de se faire des nœuds au cerveau.

    Reprenons les idées de @Matt_Houston.

    Le plus important, c'est la numérotation des nœuds.

    Soit une grille 3D de taille w * h * d pour un cubique simple.

    Il faut w*2h*d "slots" d'atomes pour un cubique faces centrées de même "taille". Soit (x,y,z) "position" de l'atome :
    - Si y%2=1, vous êtes sur le centre de la face composé par les atomes en [x,y-1,z] ,[x+1,y-1,z][x,y+1,z] ,[x+1,y+1,z].
    - Sinon, vous êtes sur un sommet de la face de profondeur z, de bord à droite x, à la hauteur y/2.

    Il faut w*h*2d "slots" d'atomes pour un cubique centré de même "taille". Soit (x,y,z) "position" de l'atome :
    - Si z%2=1, vous êtes sur le centre du cube composé par les atomes en [x,y,z-1] ,[x+1,y,z-1][x+1,y+1,z-1] ,[x,y+1,z-1],[x,y,z+1] ,[x+1,y,z+1][x+1,y+1,z+1] ,[x,y+1,z+1].
    - Sinon, vous êtes sur un sommet du cube de profondeur z/2, de bord à droite x, à la hauteur y.

    Dans les 2 cas, il n'y a aucun "trou" et c'est facilement implémentable avec un simple "tableau" monodimensionnel et simple calcules sur indices.

Discussions similaires

  1. [Débutant] Cacher les sous-type de données dans une structure
    Par Invité dans le forum VB.NET
    Réponses: 0
    Dernier message: 19/07/2014, 21h25
  2. Choix d'un type de données pour une clef
    Par bmayer dans le forum Langage SQL
    Réponses: 12
    Dernier message: 05/10/2013, 23h43
  3. type de données pour une liste
    Par sihamnet dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 29/07/2012, 15h46
  4. Type de données pour effectuer une différence en vba
    Par snoopy69 dans le forum Access
    Réponses: 4
    Dernier message: 03/03/2006, 08h49
  5. Réponses: 3
    Dernier message: 07/02/2006, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo