Changeset 73cd800 in sasview for src/sas/sascalc/calculator/c_extensions/libfunc.c
- Timestamp:
- Mar 30, 2019 5:41:43 PM (6 years ago)
- Parents:
- 1cf0fc0 (diff), 1342f6a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - git-author:
- dehoni <honecker@…> (03/30/19 17:41:43)
- git-committer:
- GitHub <noreply@…> (03/30/19 17:41:43)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/sas/sascalc/calculator/c_extensions/libfunc.c
r144e032a r1342f6a 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 //locals 102 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 calculation 134 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 inputs 146 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 steps 179 // m_perp1 -m_perp2 180 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 b 192 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 // const double norm=outspin; 135 136 137 // The norm is needed to make sure that the scattering cross sections are 138 //correctly weighted, such that the sum of spin-resolved measurements adds up to 139 // the unpolarised or half-polarised scattering cross section. No intensity weighting 140 // needed on the incoming polariser side (assuming that a user), has normalised 141 // to the incoming flux with polariser in for SANSPOl and unpolarised beam, respectively. 142 143 //if (out_spin < 0.5){norm=1-out_spin;} 144 //else{norm=out_spin;} 145 146 // //No mag means no further calculation 147 // if (isangle>0) { 148 // if (m_max < 1.0e-32){ 149 // uu = sqrt(in_spin * out_spin/ norm) * uu ; 150 // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd ; 151 // } 152 // } 153 // else if (fabs(m_max)< 1.0e-32 && fabs(m_phi)< 1.0e-32 && fabs(m_theta)< 1.0e-32){ 154 // uu = sqrt(in_spin * out_spin/ norm) * uu; 155 // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd; 156 // } else { 157 // 158 // //These are needed because of the precision of inputs 159 // if (in_spin < 0.0) in_spin = 0.0; 160 // if (in_spin > 1.0) in_spin = 1.0; 161 // if (out_spin < 0.0) out_spin = 0.0; 162 // if (out_spin > 1.0) out_spin = 1.0; 163 // 164 // if (q_x == 0.0) q_angle = pi / 2.0; 165 // else q_angle = atan(q_y/q_x); 166 // if (q_y < 0.0 && q_x < 0.0) q_angle -= pi; 167 // else if (q_y > 0.0 && q_x < 0.0) q_angle += pi; 168 // 169 // q_angle = pi/2.0 - q_angle; 170 // if (q_angle > pi) q_angle -= 2.0 * pi; 171 // else if (q_angle < -pi) q_angle += 2.0 * pi; 172 // 173 // if (fabs(q_x) < 1.0e-16 && fabs(q_y) < 1.0e-16){ 174 // m_perp = 0.0; 175 // } 176 // else { 177 // m_perp = m_max; 178 // } 179 // if (is_angle > 0){ 180 // m_phi *= pi/180.0; 181 // m_theta *= pi/180.0; 182 // mx = m_perp * cos(m_theta) * cos(m_phi); 183 // my = m_perp * sin(m_theta); 184 // mz = -(m_perp * cos(m_theta) * sin(m_phi)); 185 // } 186 // else{ 187 // mx = m_perp; 188 // my = m_phi; 189 // mz = m_theta; 190 // } 191 // //ToDo: simplify these steps 192 // // m_perp1 -m_perp2 193 // m_perp_x = (mx) * cos(q_angle); 194 // m_perp_x -= (my) * sin(q_angle); 195 // m_perp_y = m_perp_x; 196 // m_perp_x *= cos(-q_angle); 197 // m_perp_y *= sin(-q_angle); 198 // m_perp_z = mz; 199 // 200 // m_sigma_x = (m_perp_x * cos(-s_theta) - m_perp_y * sin(-s_theta)); 201 // m_sigma_y = (m_perp_x * sin(-s_theta) + m_perp_y * cos(-s_theta)); 202 // m_sigma_z = (m_perp_z); 203 // 204 // //Find b 205 // uu += m_sigma_x; 206 // dd -= m_sigma_x; 207 // re_ud = m_sigma_y; 208 // re_du = m_sigma_y; 209 // im_ud = m_sigma_z; 210 // im_du = -m_sigma_z; 211 // 212 // uu = sqrt((in_spin) * (out_spin)/ norm) * uu; 213 // dd = sqrt((1.0 - in_spin) * (1.0 - out_spin)/ norm) * dd; 214 // 215 // re_ud = sqrt(in_spin * (1.0 - out_spin)/ norm) * re_ud; 216 // im_ud = sqrt(in_spin * (1.0 - out_spin)/ norm) * im_ud; 217 // re_du = sqrt((1.0 - in_spin) * out_spin/ norm) * re_du; 218 // im_du = sqrt((1.0 - in_spin) * out_spin/ norm) * im_du; 219 // } 220 // p_sld->uu = uu; 221 // p_sld->dd = dd; 222 // p_sld->re_ud = re_ud; 223 // p_sld->im_ud = im_ud; 224 // p_sld->re_du = re_du; 225 // p_sld->im_du = im_du; 226 // } 214 227 215 228
Note: See TracChangeset
for help on using the changeset viewer.