Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réécriture des boules imbriquées

Anonyme
13 octobre 2021 à 19:39:16

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.



  • Partager sur Facebook
  • Partager sur Twitter
13 octobre 2021 à 20:09:33

Bonjour,

Doublon

Les doublons nuisent au bon fonctionnement du forum et sont donc interdits. Si vous vous êtes trompé de section, il suffit de signaler votre sujet au staff pour qu'il le déplace au bon endroit.

Je vous invite à continuer la discussion sur l'autre sujet : https://openclassrooms.com/forum/sujet/reecriture-des-boucles-imbriquees

Je ferme ce sujet. 

  • Partager sur Facebook
  • Partager sur Twitter