Changeset 108e70e in sasmodels for sasmodels/kernel_header.c
- Timestamp:
- Dec 14, 2017 1:08:45 PM (6 years ago)
- Branches:
- master, core_shell_microgels, magnetic_model, ticket-1257-vesicle-product, ticket_1156, ticket_1265_superball, ticket_822_more_unit_tests
- Children:
- ef85a09
- Parents:
- df69efa
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/kernel_header.c
r8698a0d r108e70e 150 150 inline double cube(double x) { return x*x*x; } 151 151 inline double sas_sinx_x(double x) { return x==0 ? 1.0 : sin(x)/x; } 152 153 // CRUFT: support old style models with orientation received qx, qy and angles 154 155 // To rotate from the canonical position to theta, phi, psi, first rotate by 156 // psi about the major axis, oriented along z, which is a rotation in the 157 // detector plane xy. Next rotate by theta about the y axis, aligning the major 158 // axis in the xz plane. Finally, rotate by phi in the detector plane xy. 159 // To compute the scattering, undo these rotations in reverse order: 160 // rotate in xy by -phi, rotate in xz by -theta, rotate in xy by -psi 161 // The returned q is the length of the q vector and (xhat, yhat, zhat) is a unit 162 // vector in the q direction. 163 // To change between counterclockwise and clockwise rotation, change the 164 // sign of phi and psi. 165 166 #if 1 167 //think cos(theta) should be sin(theta) in new coords, RKH 11Jan2017 168 #define ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sn, cn) do { \ 169 SINCOS(phi*M_PI_180, sn, cn); \ 170 q = sqrt(qx*qx + qy*qy); \ 171 cn = (q==0. ? 1.0 : (cn*qx + sn*qy)/q * sin(theta*M_PI_180)); \ 172 sn = sqrt(1 - cn*cn); \ 173 } while (0) 174 #else 175 // SasView 3.x definition of orientation 176 #define ORIENT_SYMMETRIC(qx, qy, theta, phi, q, sn, cn) do { \ 177 SINCOS(theta*M_PI_180, sn, cn); \ 178 q = sqrt(qx*qx + qy*qy);\ 179 cn = (q==0. ? 1.0 : (cn*cos(phi*M_PI_180)*qx + sn*qy)/q); \ 180 sn = sqrt(1 - cn*cn); \ 181 } while (0) 182 #endif 183 184 #if 1 185 #define ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, xhat, yhat, zhat) do { \ 186 q = sqrt(qx*qx + qy*qy); \ 187 const double qxhat = qx/q; \ 188 const double qyhat = qy/q; \ 189 double sin_theta, cos_theta; \ 190 double sin_phi, cos_phi; \ 191 double sin_psi, cos_psi; \ 192 SINCOS(theta*M_PI_180, sin_theta, cos_theta); \ 193 SINCOS(phi*M_PI_180, sin_phi, cos_phi); \ 194 SINCOS(psi*M_PI_180, sin_psi, cos_psi); \ 195 xhat = qxhat*(-sin_phi*sin_psi + cos_theta*cos_phi*cos_psi) \ 196 + qyhat*( cos_phi*sin_psi + cos_theta*sin_phi*cos_psi); \ 197 yhat = qxhat*(-sin_phi*cos_psi - cos_theta*cos_phi*sin_psi) \ 198 + qyhat*( cos_phi*cos_psi - cos_theta*sin_phi*sin_psi); \ 199 zhat = qxhat*(-sin_theta*cos_phi) \ 200 + qyhat*(-sin_theta*sin_phi); \ 201 } while (0) 202 #else 203 // SasView 3.x definition of orientation 204 #define ORIENT_ASYMMETRIC(qx, qy, theta, phi, psi, q, cos_alpha, cos_mu, cos_nu) do { \ 205 q = sqrt(qx*qx + qy*qy); \ 206 const double qxhat = qx/q; \ 207 const double qyhat = qy/q; \ 208 double sin_theta, cos_theta; \ 209 double sin_phi, cos_phi; \ 210 double sin_psi, cos_psi; \ 211 SINCOS(theta*M_PI_180, sin_theta, cos_theta); \ 212 SINCOS(phi*M_PI_180, sin_phi, cos_phi); \ 213 SINCOS(psi*M_PI_180, sin_psi, cos_psi); \ 214 cos_alpha = cos_theta*cos_phi*qxhat + sin_theta*qyhat; \ 215 cos_mu = (-sin_theta*cos_psi*cos_phi - sin_psi*sin_phi)*qxhat + cos_theta*cos_psi*qyhat; \ 216 cos_nu = (-cos_phi*sin_psi*sin_theta + sin_phi*cos_psi)*qxhat + sin_psi*cos_theta*qyhat; \ 217 } while (0) 218 #endif
Note: See TracChangeset
for help on using the changeset viewer.