Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réécriture des boucles imbriquées

Anonyme
13 octobre 2021 à 18:17:33

Bonjour, 

J'ai un soucis avec un bout de mon code source. J'espère que quelqu'un parmi vous m'aidera à voir plus clair l'erreur que je fais.

Je réalise cette suite d'instruction (produit Vecteur * Matrice * Vecteur) qui me permet d'obtenir le résultat escompté :

for(int m=0;m<listeMaille.size();m++) // Boucle sur les mailles du domaine de calcul.
{
iteTps = 0; // Initialiser l'itérateur en temps
double tmpD1 = 0.0; // Valeur du gradient de la densité pour chaque maille 
while(iteTps < Dim_Temps) // Boule sur l'indice temps
{
tmpD1 += List_Sol_PB_Adjoint_Retropropage[iteTps] * (listMasse[m] * List_Acceleration_Champ_Direct[iteTps]) * dt; // Calcul du gradient 
iteTps++;
}
lRho.push_back(tmpD1); // Stocker la veleur du gradient dans la maille m dans un vecteur qui représent le gradient dans tout le domaine de calcul
}

Ce bout de code sert à calculer la valeur du gradient pour chaque maille du domaine de calcul. Ici la variable "List_Sol_PB_Adjoint_Retropropage" est un vector de Vecteur, où Vecteur est une méthode de ma propre class "Vecteur.h". La taille  de "List_Sol_PB_Adjoint_Retropropage" est 'Dim_Temps' tandis que la taille de chaque Vecteur dans "List_Sol_PB_Adjoint_Retropropage" est (Nombre de noeuds * 2). La variable "listMasse" est un vector de matrice carré, où chacune à la dimension (Nombre de noeuds * 2). Enfin la variable "List_Acceleration_Champ_Direct" est un vector de Vecteur analogue à la variable "List_Sol_PB_Adjoint_Retropropage". Le résultat de ce produit pour chaque maille du domaine de calcul est un salaire que je stocke dans un vector de double "lRho". La variable "dt" est un scalaire. 

Cette partie de code fonctionne est fournit des résultats prédit par la théorie. 

L'objectif est de réécrire cette partie d'une autre manière qui permet d'éviter de refaire certains calculs. En particulier, je souhaite isoler le calcul "(listMasse[m] * List_Acceleration_Champ_Direct[iteTps])".

Je propose donc la réécriture suivante :

for(int m=0;m<listeMaille.size();m++) // Boucle sur les mailles du domaine de calcul.
{
iteTps = 0; //Inititaliser l'itérateur en temps
Vecteur Somme_Temps_Rho(nbNodes*2); // Pour chaque maille, ce Vecteur stocke la somme, indice temps, des produits (Matrice de masse * L'accélération du champ direct)
while(iteTps < Dim_Temps)
{
// Ici nous effectuons la somme en temps, sachant que "Somme_Temps_Rho" est initialiser à zero au départ.
Somme_Temps_Rho = Somme_Temps_Rho + (listMasse[m] * List_Acceleration_Champ_Direct_1[iteTps]);
iteTps++;
}
// La taille de ce vecteur est le nombre de maille. Chauqe case contient un Vecteur dont la dimension est le nbNodes * 2
Derivee_Ope_Diff_PB_Direct_Rho_1.push_back(Somme_Temps_Rho);
}
for(int m=0;m<listeMaille.size();m++)
{
iteTps = 0;
// Ce scalaire représentent la valeur du gradient pour chaque maille
double tmpRho = 0.0;
while(iteTps < Dim_Temps)
{
tmpRho += List_Sol_PB_Adjoint_1_Retropropage[iteTps] * Derivee_Ope_Diff_PB_Direct_Rho_1[m] * dt; // Gradient Rho pour la maille m
iteTps++;
}
// La taille de ce vecteur est le nombre de maille.
lRho.push_back(tmpRho);
}

Selon moi il y a une erreur quelques part, car je devrais obtenir des vectors "lRho" similaires dans les deux cas de figure. 

Est ce que quelqu'un peut m'aider à détecter l'erreur dans la deuxième écriture du code ? 

Cordialement. 

2HA.


-
Edité par Anonyme 13 octobre 2021 à 18:18:09

  • Partager sur Facebook
  • Partager sur Twitter
14 octobre 2021 à 14:39:37

Vous devriez "templatiser" vos types pour être sûr que l'ensemble de vos données d'entrée aient des types compatibles, et évitez aussi les variables "accessoires" comme "nbNodes", "Dim_Temps", etc... en utilisant les range loop et les paramètres template.

Il y a de l'utilisation de surcharge d'opérateur dans tous les coins et vous nous donnez même pas leur code. Mais, bon, avoir une n ième classe "Vecteur", ça sent le NIH et potentiellement des erreurs d'implémentation et des instabilités numériques dans tous les recoins.

Je pense que l'utilisation de bibliothèques de calcul vectoriel et matriciel serait bien plus judicieux.

Et Vous pouvez utiliser 2 débogueurs en vis à vis pour voir les différences par vous-même.

-
Edité par bacelar 14 octobre 2021 à 14:40:17

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
14 octobre 2021 à 16:32:30

Somme_Temps_Rho + (listMasse[m] * List_Acceleration_Champ_Direct_1[iteTps]); (renvoyé parDerivee_Ope_Diff_PB_Direct_Rho_1) est différent de (listMasse[m] * List_Acceleration_Champ_Direct[iteTps]) (dans le calcul original) vu qu'on y a ajouté Somme_Temps_Rho
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 octobre 2021 à 9:09:52

Bonjour bacelar,

On a visiblement pas les mêmes pré-requis.  

  • Partager sur Facebook
  • Partager sur Twitter
18 octobre 2021 à 11:11:06

Quels sont les vôtres ???
  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
Anonyme
22 octobre 2021 à 9:23:10

Bonjour bacelar,

Mes compétences pour le moment se limitent aux classes. Toutefois, j'ai réussis à résoudre mon problème. 

Je vous remercie pour votre attention. 

  • Partager sur Facebook
  • Partager sur Twitter