Bonjour tous,
Voila j'aimerai optimiser le code ci dessous, pour donner une idée une multiplication en moins dans la 3eme boucle for c'est 1s de temps de calcul mon rêve serait de pouvoir supprimer la racine carre ^^ sachant que je connais a^2 je voudrais a^3
Notes:
- les vecteurs sont des classes de Eigen3
- TmpParamForBS c'est des constantes pré-calculées
- Cette fonction réalise une intégration en type double.
Je suis preneur de toute idée
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
43
44
45
46
47
48 void Truc::get_precalc_B_optimized(const Vector3d & m, Vector3d & b,const TmpParamForBS & tmp) { Vector3d OM=Mrot.transpose()*(m-pos); b=Vector3d(0,0,0); double omx=OM[0]; double omy=OM[1]; double omz=OM[2]; double omx_dl2_L2=omx-tmp.dl2_L2; std::vector<double> rx_list(tmp.rk); for(int k=0;k<tmp.rk;k++) rx_list[k]=(-k*tmp.dl+omx_dl2_L2); std::vector<double> rx2_list(tmp.rk); for(int k=0;k<tmp.rk;k++) rx2_list[k]=rx_list[k]*rx_list[k]; for(int i=0;i<tmp.ri;i++) { double alpha=i*tmp.dtheta+tmp.dtheta2; double co=cos(alpha); double si=sin(alpha); for(int j=0;j<tmp.rj;j++) { Vector3d Btemp(0,0,0); double ray = j*tmp.de+tmp.R_de2; double omy_ray_c = omy-ray*co; double omz_ray_s = omz-ray*si; double si_r2_co_r1 = si*omz_ray_s+co*omy_ray_c; double omy_ray_c2_omz_ray_s2 = omy_ray_c*omy_ray_c+omz_ray_s*omz_ray_s; for(int k=0;k<tmp.rk;k++) { double rx=rx_list[k]; double nr2=rx2_list[k]+omy_ray_c2_omz_ray_s2; double nr= sqrt(nr2); //if(nr>quantom_zero) { Btemp+= Vector3d(si_r2_co_r1, -co*rx, -si*rx)/(nr2*nr); } } b+= (tmp.tmp1*j + tmp.tmp2)*Btemp; } } b*=Mu0_Pi4*tmp.J ; b=Mrot*b; }
merci d'avance pour vos suggestions.
Partager