@@ -39,66 +39,62 @@ void dmi_field_bulk(double *spin, double *field,
3939 *
4040 * for every spin *i*
4141 *
42- * --- Check this: can we use a SC lattice for this bulk DMI expression?
43- * Since, for example, MnSi crystal structure is more complex
42+ * NOTES:
43+ *
44+ * 1. Check this: can we use a SC lattice for this bulk DMI expression?
45+ * Since, for example, MnSi crystal structure is more complex
46+ *
47+ * 2. This function is not defined for a hexagonal lattice, we can
48+ * generalise the code to solve this
49+ *
4450 */
4551
46- #pragma omp parallel for
52+
53+ /* The DMI vectors are the same according to the neighbours
54+ * positions. Thus we set them here to avoid compute them
55+ * every time in the loop . So, if we want the j-th NN,
56+ * the DMI vector will be
57+ * (D_x, D_y, D_z) --> ( dmivector[3 * j] ,
58+ * dmivector[3 * j + 1],
59+ * dmivector[3 * j + 2] )
60+ */
61+ double dmivector [18 ] = {-1 , 0 , 0 ,
62+ 1 , 0 , 0 ,
63+ 0 , -1 , 0 ,
64+ 0 , 1 , 0 ,
65+ 0 , 0 , -1 ,
66+ 0 , 0 , 1
67+ };
68+
69+ #pragma omp parallel for shared(dmivector)
4770 for (int i = 0 ; i < nxyz ; i ++ ) {
4871
4972 int id = 0 ;
50- int idv = 6 * i ; // index for the neighbours
73+ int id_nn = 6 * i ; // index for the neighbours
5174
5275 double fx = 0 , fy = 0 , fz = 0 ;
5376 double D = 0 ;
5477
55- if (ngbs [idv ]>=0 ) { // neighbour at x-1
56- id = 3 * ngbs [idv ];
57- D = _D [idv ];
58- fx += D * cross_x (-1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
59- fy += D * cross_y (-1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
60- fz += D * cross_z (-1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
61- }
62-
63- if (ngbs [idv + 1 ]>=0 ) { // neighbour x+1
64- id = 3 * ngbs [idv + 1 ];
65- D = _D [idv + 1 ];
66- fx += D * cross_x (1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
67- fy += D * cross_y (1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
68- fz += D * cross_z (1 ,0 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
69- }
70-
71- if (ngbs [idv + 2 ]>=0 ) { // neighbour at y-1
72- id = 3 * ngbs [idv + 2 ];
73- D = _D [idv + 2 ];
74- fx += D * cross_x (0 ,-1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
75- fy += D * cross_y (0 ,-1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
76- fz += D * cross_z (0 ,-1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
77- }
78-
79- if (ngbs [idv + 3 ]>=0 ) { // neighbour at y+1
80- id = 3 * ngbs [idv + 3 ];
81- D = _D [idv + 3 ];
82- fx += D * cross_x (0 ,1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
83- fy += D * cross_y (0 ,1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
84- fz += D * cross_z (0 ,1 ,0 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
85- }
86-
87- if (ngbs [idv + 4 ]>=0 ) { // neighbour at z-1
88- id = 3 * ngbs [idv + 4 ];
89- D = _D [idv + 4 ];
90- fx += D * cross_x (0 ,0 ,-1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
91- fy += D * cross_y (0 ,0 ,-1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
92- fz += D * cross_z (0 ,0 ,-1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
93- }
94-
95- if (ngbs [idv + 5 ]>=0 ) { // neighbour at z+1
96- id = 3 * ngbs [idv + 5 ];
97- D = _D [idv + 5 ];
98- fx += D * cross_x (0 ,0 ,1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
99- fy += D * cross_y (0 ,0 ,1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
100- fz += D * cross_z (0 ,0 ,1 ,spin [id ],spin [id + 1 ],spin [id + 2 ]);
101- }
78+ // Compute the DMI contribution for every neighbour:
79+ // -x, +x, -y, +y, -z, +z
80+ for (int j = 0 ; j < 6 ; j ++ ){
81+ if (ngbs [id_nn + j ] >= 0 ) {
82+ id = 3 * ngbs [id_nn + j ];
83+ D = _D [id_nn + j ];
84+ fx += D * cross_x (dmivector [3 * j ],
85+ dmivector [3 * j + 1 ],
86+ dmivector [3 * j + 2 ],
87+ spin [id ], spin [id + 1 ], spin [id + 2 ]);
88+ fy += D * cross_y (dmivector [3 * j ],
89+ dmivector [3 * j + 1 ],
90+ dmivector [3 * j + 2 ],
91+ spin [id ], spin [id + 1 ], spin [id + 2 ]);
92+ fz += D * cross_z (dmivector [3 * j ],
93+ dmivector [3 * j + 1 ],
94+ dmivector [3 * j + 2 ],
95+ spin [id ], spin [id + 1 ], spin [id + 2 ]);
96+ }
97+ }
10298
10399 field [3 * i ] = fx ;
104100 field [3 * i + 1 ] = fy ;
0 commit comments