Changeset b36e7c7 in sasview for src/sas/sascalc/calculator/c_extensions/libfunc.c
- Timestamp:
- Mar 29, 2019 6:13:15 AM (5 years ago)
- Branches:
- magnetic_scatt
- Children:
- 1342f6a
- Parents:
- a48831a8
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/calculator/c_extensions/libfunc.c
r144e032a rb36e7c7 87 87 } 88 88 89 //The code calculating magnetic sld below seems to be not used. 90 //Keeping it in order to check if it is not breaking anything. 89 91 // calculate magnetic sld and return total sld 90 92 // bn : contrast (not just sld of the layer) … … 95 97 // spintheta: angle (anti-clock-wise) between neutron spin(up) and x axis 96 98 // Note: all angles are in degrees. 97 void cal_msld(polar_sld *p_sld, int isangle, double qx, double qy, double bn,98 double m01, double mtheta1, double mphi1,99 double spinfraci, double spinfracf, double spintheta)100 {101 //locals102 double q_x = qx;103 double q_y = qy;104 double sld = bn;105 int is_angle = isangle;106 double pi = 4.0*atan(1.0);107 double s_theta = spintheta * pi/180.0;108 double m_max = m01;109 double m_phi = mphi1;110 double m_theta = mtheta1;111 double in_spin = spinfraci;112 double out_spin = spinfracf;113 114 double m_perp = 0.0;115 double m_perp_z = 0.0;116 double m_perp_y = 0.0;117 double m_perp_x = 0.0;118 double m_sigma_x = 0.0;119 double m_sigma_z = 0.0;120 double m_sigma_y = 0.0;121 //double b_m = 0.0;122 double q_angle = 0.0;123 double mx = 0.0;124 double my = 0.0;125 double mz = 0.0;126 double uu = sld;127 double dd = sld;128 double re_ud = 0.0;129 double im_ud = 0.0;130 double re_du = 0.0;131 double im_du = 0.0;132 133 //No mag means no further calculation134 if (isangle>0) {135 if (m_max < 1.0e-32){136 uu = sqrt(sqrt(in_spin * out_spin)) * uu;137 dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd;138 }139 }140 else if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){141 uu = sqrt(sqrt(in_spin * out_spin)) * uu;142 dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd;143 } else {144 145 //These are needed because of the precision of inputs146 if (in_spin < 0.0) in_spin = 0.0;147 if (in_spin > 1.0) in_spin = 1.0;148 if (out_spin < 0.0) out_spin = 0.0;149 if (out_spin > 1.0) out_spin = 1.0;150 151 if (q_x == 0.0) q_angle = pi / 2.0;152 else q_angle = atan(q_y/q_x);153 if (q_y < 0.0 && q_x < 0.0) q_angle -= pi;154 else if (q_y > 0.0 && q_x < 0.0) q_angle += pi;155 156 q_angle = pi/2.0 - q_angle;157 if (q_angle > pi) q_angle -= 2.0 * pi;158 else if (q_angle < -pi) q_angle += 2.0 * pi;159 160 if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){161 m_perp = 0.0;162 }163 else {164 m_perp = m_max;165 }166 if (is_angle > 0){167 m_phi *= pi/180.0;168 m_theta *= pi/180.0;169 mx = m_perp * cos(m_theta) * cos(m_phi);170 my = m_perp * sin(m_theta);171 mz = -(m_perp * cos(m_theta) * sin(m_phi));172 }173 else{174 mx = m_perp;175 my = m_phi;176 mz = m_theta;177 }178 //ToDo: simplify these steps179 // m_perp1 -m_perp2180 m_perp_x = (mx) * cos(q_angle);181 m_perp_x -= (my) * sin(q_angle);182 m_perp_y = m_perp_x;183 m_perp_x *= cos(-q_angle);184 m_perp_y *= sin(-q_angle);185 m_perp_z = mz;186 187 m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta));188 m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta));189 m_sigma_z = (m_perp_z);190 191 //Find b192 uu -= m_sigma_x;193 dd += m_sigma_x;194 re_ud = m_sigma_y;195 re_du = m_sigma_y;196 im_ud = m_sigma_z;197 im_du = -m_sigma_z;198 199 uu = sqrt(sqrt(in_spin *out_spin)) * uu;200 dd = sqrt(sqrt((1.0 - in_spin) * (1.0 - out_spin))) * dd;201 202 re_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * re_ud;203 im_ud = sqrt(sqrt(in_spin * (1.0 - out_spin))) * im_ud;204 re_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * re_du;205 im_du = sqrt(sqrt((1.0 - in_spin) * out_spin)) * im_du;206 }207 p_sld->uu = uu;208 p_sld->dd = dd;209 p_sld->re_ud = re_ud;210 p_sld->im_ud = im_ud;211 p_sld->re_du = re_du;212 p_sld->im_du = im_du;213 }99 // void cal_msld(polar_sld *p_sld, int isangle, double qx, double qy, double bn, 100 // double m01, double mtheta1, double mphi1, 101 // double spinfraci, double spinfracf, double spintheta) 102 // { 103 // //locals 104 // double q_x = qx; 105 // double q_y = qy; 106 // double sld = bn; 107 // int is_angle = isangle; 108 // double pi = 4.0*atan(1.0); 109 // double s_theta = spintheta * pi/180.0; 110 // double m_max = m01; 111 // double m_phi = mphi1; 112 // double m_theta = mtheta1; 113 // double in_spin = spinfraci; 114 // double out_spin = spinfracf; 115 // 116 // double m_perp = 0.0; 117 // double m_perp_z = 0.0; 118 // double m_perp_y = 0.0; 119 // double m_perp_x = 0.0; 120 // double m_sigma_x = 0.0; 121 // double m_sigma_z = 0.0; 122 // double m_sigma_y = 0.0; 123 // //double b_m = 0.0; 124 // double q_angle = 0.0; 125 // double mx = 0.0; 126 // double my = 0.0; 127 // double mz = 0.0; 128 // double uu = sld; 129 // double dd = sld; 130 // double re_ud = 0.0; 131 // double im_ud = 0.0; 132 // double re_du = 0.0; 133 // double im_du = 0.0; 134 // 135 // //No mag means no further calculation 136 // if (isangle>0) { 137 // if (m_max < 1.0e-32){ 138 // uu = sqrt((1+in_spin)/2 * (1+out_spin)/2) * uu; 139 // dd = sqrt((1.0 - in_spin)/2 * (1.0 - out_spin)/2) * dd; 140 // } 141 // } 142 // else if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){ 143 // uu = sqrt((1+in_spin)/2 * (1+out_spin)/2) * uu; 144 // dd = sqrt((1.0 - in_spin)/2 * (1.0 - out_spin)/2) * dd; 145 // } else { 146 // 147 // //These are needed because of the precision of inputs 148 // if (in_spin < 0.0) in_spin = 0.0; 149 // if (in_spin > 1.0) in_spin = 1.0; 150 // if (out_spin < 0.0) out_spin = 0.0; 151 // if (out_spin > 1.0) out_spin = 1.0; 152 // 153 // if (q_x == 0.0) q_angle = pi / 2.0; 154 // else q_angle = atan(q_y/q_x); 155 // if (q_y < 0.0 && q_x < 0.0) q_angle -= pi; 156 // else if (q_y > 0.0 && q_x < 0.0) q_angle += pi; 157 // 158 // q_angle = pi/2.0 - q_angle; 159 // if (q_angle > pi) q_angle -= 2.0 * pi; 160 // else if (q_angle < -pi) q_angle += 2.0 * pi; 161 // 162 // if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){ 163 // m_perp = 0.0; 164 // } 165 // else { 166 // m_perp = m_max; 167 // } 168 // if (is_angle > 0){ 169 // m_phi *= pi/180.0; 170 // m_theta *= pi/180.0; 171 // mx = m_perp * cos(m_theta) * cos(m_phi); 172 // my = m_perp * sin(m_theta); 173 // mz = -(m_perp * cos(m_theta) * sin(m_phi)); 174 // } 175 // else{ 176 // mx = m_perp; 177 // my = m_phi; 178 // mz = m_theta; 179 // } 180 // //ToDo: simplify these steps 181 // // m_perp1 -m_perp2 182 // m_perp_x = (mx) * cos(q_angle); 183 // m_perp_x -= (my) * sin(q_angle); 184 // m_perp_y = m_perp_x; 185 // m_perp_x *= cos(-q_angle); 186 // m_perp_y *= sin(-q_angle); 187 // m_perp_z = mz; 188 // 189 // m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta)); 190 // m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta)); 191 // m_sigma_z = (m_perp_z); 192 // 193 // //Find b 194 // uu -= m_sigma_x; 195 // dd += m_sigma_x; 196 // re_ud = m_sigma_y; 197 // re_du = m_sigma_y; 198 // im_ud = m_sigma_z; 199 // im_du = -m_sigma_z; 200 // 201 // uu = sqrt((1+in_spin) * (1 + out_spin)) * uu; 202 // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)) * dd; 203 // 204 // re_ud = sqrt(in_spin * (1.0 - out_spin)) * re_ud; 205 // im_ud = sqrt(in_spin * (1.0 - out_spin)) * im_ud; 206 // re_du = sqrt((1.0 - in_spin) * out_spin) * re_du; 207 // im_du = sqrt((1.0 - in_spin) * out_spin) * im_du; 208 // } 209 // p_sld->uu = uu; 210 // p_sld->dd = dd; 211 // p_sld->re_ud = re_ud; 212 // p_sld->im_ud = im_ud; 213 // p_sld->re_du = re_du; 214 // p_sld->im_du = im_du; 215 // } 214 216 215 217
Note: See TracChangeset
for help on using the changeset viewer.