@@ -30,3 +30,52 @@ void compute_uniaxial_anis(double *restrict m, double *restrict field, double *r
3030
3131}
3232
33+
34+ void compute_uniaxial4_anis (double * restrict m , double * restrict field , double * restrict energy , double * restrict Ms_inv ,
35+ double * restrict K1 , double * restrict K2 , double * restrict axis , int nx , int ny , int nz ) {
36+
37+ int n = nx * ny * nz ;
38+
39+ // Follows calculation of OOMMF extension by Hans and Richard Boardman
40+ // http://www.soton.ac.uk/~fangohr/software/oxs_uniaxial4/download/uniaxialanisotropy4.cc
41+
42+ #pragma omp parallel for
43+ for (int i = 0 ; i < n ; i ++ ) {
44+ int j = 3 * i ;
45+
46+ if (Ms_inv [i ] == 0.0 ) {
47+ field [j ] = 0 ;
48+ field [j + 1 ] = 0 ;
49+ field [j + 2 ] = 0 ;
50+ energy [i ] = 0 ;
51+ continue ;
52+ }
53+
54+ double k1 = K1 [i ];
55+ double k2 = K2 [i ];
56+
57+ double field_mult1 = MU0_INV * 2.0 * k1 * Ms_inv [i ];
58+ double field_mult2 = MU0_INV * 4.0 * k2 * Ms_inv [i ];
59+ double m_dot_u = m [j ] * axis [j ] + m [j + 1 ] * axis [j + 1 ] + m [j + 2 ] * axis [j + 2 ];
60+
61+ if (k1 <= 0 ) {
62+ field [j + 0 ] = (field_mult1 * m_dot_u ) * axis [j + 0 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 0 ];
63+ field [j + 1 ] = (field_mult1 * m_dot_u ) * axis [j + 1 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 1 ];
64+ field [j + 2 ] = (field_mult1 * m_dot_u ) * axis [j + 2 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 2 ];
65+ energy [i ] = - k1 * m_dot_u * m_dot_u - k2 * m_dot_u * m_dot_u * m_dot_u * m_dot_u ;
66+ }
67+
68+ else {
69+ double u_x_m [3 ];
70+ u_x_m [0 ] = cross_x (axis [j ], axis [j + 1 ], axis [j + 2 ], m [j ], m [j + 1 ], m [j + 2 ]);
71+ u_x_m [1 ] = cross_y (axis [j ], axis [j + 1 ], axis [j + 2 ], m [j ], m [j + 1 ], m [j + 2 ]);
72+ u_x_m [2 ] = cross_z (axis [j ], axis [j + 1 ], axis [j + 2 ], m [j ], m [j + 1 ], m [j + 2 ]);
73+ double u_x_m_mag2 = u_x_m [1 ]* u_x_m [1 ] + u_x_m [1 ]* u_x_m [1 ] + u_x_m [2 ]* u_x_m [2 ];
74+ field [j + 0 ] = (field_mult1 * m_dot_u ) * axis [j + 0 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 0 ];
75+ field [j + 1 ] = (field_mult1 * m_dot_u ) * axis [j + 1 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 1 ];
76+ field [j + 2 ] = (field_mult1 * m_dot_u ) * axis [j + 2 ] + (field_mult2 * m_dot_u * m_dot_u * m_dot_u ) * axis [j + 2 ];
77+ energy [i ] = (k1 + 2 * k2 )* u_x_m_mag2 - k2 * u_x_m_mag2 * u_x_m_mag2 ;
78+ }
79+ }
80+
81+ }
0 commit comments