def test_s_data_add_dict(self): from copy import deepcopy s_data = SData(data=deepcopy(self.sample_data), frequencies=self.frequencies) s_data.add_dict({'atom_1': {'s': {'order_1': np.ones(5)}}}) assert_almost_equal(s_data[1]['order_1'], self.sample_data['atom_1']['s']['order_1'] + 1)
def _calculate_s_powder_one_atom(self, *, atom_index: int, k_index: int, q2: np.ndarray, sdata: SData, bins: np.ndarray, min_order: int = 1) -> None: """ :param atom_index: number of atom :param k_index: Index of k-point in phonon data :param q2: Array of squared absolute q-point values in angstrom^-2. (Columns correspond to energies.) :sdata: Data container to which results will be summed in-place :bins: Frequency bins consistent with sdata :min_order: Lowest quantum order to evaluate. (The max is determined by self._quantum_order_num.) """ kpoint_weight = self._abins_data.get_kpoints_data()[k_index].weight fundamentals = self._powder_data.get_frequencies()[k_index] fund_coeff = np.arange(fundamentals.size, dtype=INT_TYPE) # Initialise with fundamentals regardless of whether starting with order 1 or 2 frequencies = np.copy(fundamentals) coefficients = np.copy(fund_coeff) a_tensor = self._powder_data.get_a_tensors()[k_index][atom_index] a_trace = self._powder_data.get_a_traces(k_index)[atom_index] b_tensor = self._powder_data.get_b_tensors()[k_index][atom_index] b_trace = self._powder_data.get_b_traces(k_index)[atom_index] calculate_order = {1: self._calculate_order_one, 2: self._calculate_order_two} # Chunking to save memory has been removed pending closer examination for order in range(min_order, self._quantum_order_num + 1): frequencies, coefficients = FrequencyPowderGenerator.construct_freq_combinations( previous_array=frequencies, previous_coefficients=coefficients, fundamentals_array=fundamentals, fundamentals_coefficients=fund_coeff, quantum_order=order) scattering_intensities = calculate_order[order]( q2=q2, frequencies=frequencies, indices=coefficients, a_tensor=a_tensor, a_trace=a_trace, b_tensor=b_tensor, b_trace=b_trace) rebinned_spectrum, _ = np.histogram(frequencies, bins=bins, weights=(scattering_intensities * kpoint_weight), density=False) sdata.add_dict({f'atom_{atom_index}': {'s': {f'order_{order}': rebinned_spectrum}}}) # Prune modes with low intensity; these are assumed not to contribute to higher orders frequencies, coefficients = self._calculate_s_over_threshold(scattering_intensities, freq=frequencies, coeff=coefficients)