def calc_model_full(func_no_const, lattice_num, layer=0.1, const=0.0, ddens=1, peakmax=5): """ :param func_no_const: function that sets the surface implicitly :param lattice_num: points in one side of mesh :param layer: layer width, fraction of lattice parameter :param const: const for function :param peakmax: max number in hkl :param show: to show or not to show triangulation :return: """ def func(x, y, z): return func_no_const(x, y, z, const) qsvec, lenqs = generate_qvecs_lenqs_deprecated(peakmax) cube = cube_lattice(lattice_num, func) factor_struct = factor_calc_structural(qsvec, cube) factor_mol = factor_calc_molecular(qsvec, layer, ddens) amplitude = factor_struct * factor_mol intensity = amplitude**2 multiplicity = factor_calc_multiplicity_intens(qsvec) intensity *= multiplicity lorentz = lenqs * lenqs intensity *= lorentz return qsvec, intensity
def _straight_intensity_v2(lattice, peakmax=5): qsvec, lenqs = generate_qvecs_lenqs_full(peakmax) lattice_num = len(lattice) x, y, z = np.mgrid[:1:lattice_num * 1j, :1:lattice_num * 1j, :1:lattice_num * 1j] intensity = [] for m in range(len(qsvec)): qvec = qsvec[m] fexp = lambda x, y, z: np.exp(1j * 2 * np.pi * (x * qvec[0] + y * qvec[1] + z * qvec[2])) cuber = fexp(x, y, z) * lattice intensity.append((np.abs(cuber.sum())).astype(float)**2) intensity = np.array(intensity) intensity *= lenqs**2*factor_calc_multiplicity_intens(qsvec) intensity /= max(intensity) return qsvec, intensity
def calc_model_set_fstruct_doublelayer(factor_structural, layer_in, ddens_in, layer_out, ddens_out, peakmax=5): assert layer_in <= layer_out, 'layer out should be greater or equal than layer in' qsvec, lenqs = generate_qvecs_lenqs_deprecated(peakmax) multipl = factor_calc_multiplicity_intens(qsvec) if len(factor_structural) != len(qsvec): raise ValueError("different size of struct factor and number of peaks") # factor_molecular = factor_calc_molecular(qsvec, layer_in, ddens_in-ddens_out)\ + factor_calc_molecular(qsvec, layer_out, ddens_out) # amplitude = factor_structural * factor_molecular intensity = amplitude**2 * np.array(multipl) * lenqs**2 return qsvec, intensity
def straight_intensity(lattice, peakmax=5, sizelat=1): qsvec, lenqs = generate_qvecs_lenqs_full(peakmax, uniquelenq=False) lattice_num = len(lattice) x, y, z = np.mgrid[:sizelat:lattice_num * 1j, :sizelat:lattice_num * 1j, :sizelat:lattice_num * 1j] intensity = [] for m in range(len(qsvec)): qvec = qsvec[m] qC = x*qvec[0] + y*qvec[1] + z*qvec[2] expqC = np.exp(2*np.pi*1j*qC) amplitude = np.abs((expqC*lattice).sum()).astype(float) #print(lenqs[m], np.abs(amplitude)) intensity.append((amplitude*lenqs[m])**2) intensity = np.array(intensity) intensity *= factor_calc_multiplicity_intens(qsvec) lenqs, intensity = filter_unique(np.round(lenqs,4), intensity, concat=True) intensity /= max(intensity) return lenqs, intensity
def calc_model_set_fstruct(factor_structural, layer, ddens, peakmax=5): """ :param factor_structural: preset structural factor for all points :param layer: width of layer, fraction of lattice parameter :param peakmax: max number in hkl :return: qsvec, intensity """ qsvec, lenqs = generate_qvecs_lenqs_deprecated(peakmax) multipl = factor_calc_multiplicity_intens(qsvec) if len(factor_structural) != len(qsvec): raise ValueError("different size of struct factor and number of peaks") # factor_molecular = factor_calc_molecular(qsvec, layer, ddens) # amplitude = factor_structural * factor_molecular intensity = amplitude**2 * np.array(multipl) * lenqs**2 return qsvec, intensity