Changeset 01c8d9e in sasmodels for sasmodels/product.py
- Timestamp:
- Aug 7, 2018 12:32:18 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:
- c11d09f
- Parents:
- 707cbdb
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
sasmodels/product.py
r2d81cfe r01c8d9e 16 16 import numpy as np # type: ignore 17 17 18 from .modelinfo import ParameterTable, ModelInfo 18 from .modelinfo import ParameterTable, ModelInfo, Parameter 19 19 from .kernel import KernelModel, Kernel 20 20 from .details import make_details, dispersion_mesh … … 74 74 translate_name = dict((old.id, new.id) for old, new 75 75 in zip(s_pars.kernel_parameters[1:], s_list)) 76 combined_pars = p_pars.kernel_parameters + s_list 76 beta_parameter = Parameter("beta_mode", "", 0, [["P*S"],["P*(1+beta*(S-1))"], "", "Structure factor dispersion calculation mode"]) 77 combined_pars = p_pars.kernel_parameters + s_list + [beta_parameter] 77 78 parameters = ParameterTable(combined_pars) 78 79 parameters.max_pd = p_pars.max_pd + s_pars.max_pd … … 151 152 #: Structure factor modelling interaction between particles. 152 153 self.S = S 154 153 155 #: Model precision. This is not really relevant, since it is the 154 156 #: individual P and S models that control the effective dtype, … … 168 170 # in opencl; or both in opencl, but one in single precision and the 169 171 # other in double precision). 172 170 173 p_kernel = self.P.make_kernel(q_vectors) 171 174 s_kernel = self.S.make_kernel(q_vectors) … … 193 196 # type: (CallDetails, np.ndarray, float, bool) -> np.ndarray 194 197 p_info, s_info = self.info.composition[1] 195 196 198 # if there are magnetic parameters, they will only be on the 197 199 # form factor P, not the structure factor S. … … 205 207 nweights = call_details.num_weights 206 208 weights = values[nvalues:nvalues + 2*nweights] 207 208 209 # Construct the calling parameters for P. 209 210 p_npars = p_info.parameters.npars … … 218 219 p_values.append([0.]*spacer) 219 220 p_values = np.hstack(p_values).astype(self.p_kernel.dtype) 220 221 221 # Call ER and VR for P since these are needed for S. 222 222 p_er, p_vr = calc_er_vr(p_info, p_details, p_values) 223 223 s_vr = (volfrac/p_vr if p_vr != 0. else volfrac) 224 224 #print("volfrac:%g p_er:%g p_vr:%g s_vr:%g"%(volfrac,p_er,p_vr,s_vr)) 225 226 225 # Construct the calling parameters for S. 227 226 # The effective radius is not in the combined parameter list, so … … 253 252 s_values.append([0.]*spacer) 254 253 s_values = np.hstack(s_values).astype(self.s_kernel.dtype) 255 254 # beta mode is the first parameter after the structure factor pars 255 beta_index = 2+p_npars+s_npars 256 beta_mode = values[beta_index] 256 257 # Call the kernels 257 p_result = self.p_kernel(p_details, p_values, cutoff, magnetic) 258 s_result = self.s_kernel(s_details, s_values, cutoff, False) 259 258 if beta_mode: # beta: 259 F1, F2, volume_avg = self.p_kernel.beta(p_details, p_values, cutoff, magnetic) 260 else: 261 p_result = self.p_kernel.Iq(p_details, p_values, cutoff, magnetic) 262 s_result = self.s_kernel.Iq(s_details, s_values, cutoff, False) 260 263 #print("p_npars",p_npars,s_npars,p_er,s_vr,values[2+p_npars+1:2+p_npars+s_npars]) 261 264 #call_details.show(values) … … 265 268 #s_details.show(s_values) 266 269 #print("=>", s_result) 267 268 # remember the parts for plotting later269 self.results = [p_result, s_result]270 271 270 #import pylab as plt 272 271 #plt.subplot(211); plt.loglog(self.p_kernel.q_input.q, p_result, '-') 273 272 #plt.subplot(212); plt.loglog(self.s_kernel.q_input.q, s_result, '-') 274 273 #plt.figure() 275 276 return values[0]*(p_result*s_result) + values[1] 274 if beta_mode:#beta 275 beta_factor = F1**2/F2 276 Sq_eff = 1+beta_factor*(s_result - 1) 277 self.results = [F2, Sq_eff,F1,s_result] 278 final_result = volfrac*values[0]*(F2 + (F1**2)*(s_result - 1))/volume_avg+values[1] 279 #final_result = volfrac * values[0] * F2 * Sq_eff / volume_avg + values[1] 280 else: 281 # remember the parts for plotting later 282 self.results = [p_result, s_result] 283 final_result = values[0]*(p_result*s_result) + values[1] 284 return final_result 277 285 278 286 def release(self):
Note: See TracChangeset
for help on using the changeset viewer.