def _calculate_powder(self): """ Calculates powder data (a_tensors, b_tensors according to aCLIMAX manual). """ # define container for powder data powder = abins.PowderData(num_atoms=self._num_atoms) k_indices = sorted(self._frequencies.keys()) # make sure dictionary keys are in the same order on each machine b_tensors = {} a_tensors = {} if PATHOS_FOUND: threads = abins.parameters.performance['threads'] p_local = ProcessPool(nodes=threads) tensors = p_local.map(self._calculate_powder_k, k_indices) else: tensors = [self._calculate_powder_k(k=k) for k in k_indices] for indx, k in enumerate(k_indices): a_tensors[k] = tensors[indx][0] b_tensors[k] = tensors[indx][1] # fill powder object with powder data powder.set(dict(b_tensors=b_tensors, a_tensors=a_tensors)) return powder
def load_formatted_data(self): """ Loads mean square displacements. :returns: object of type PowderData with mean square displacements. """ data = self._clerk.load(list_of_datasets=["powder_data"]) powder_data = abins.PowderData(num_atoms=data["datasets"]["powder_data"]["b_tensors"][GAMMA_POINT].shape[0]) powder_data.set(data["datasets"]["powder_data"]) return powder_data
def _calculate_powder(self) -> abins.PowderData: """ Calculates powder data (a_tensors, b_tensors according to aCLIMAX manual). """ k_indices = sorted(self._frequencies.keys()) # make sure dictionary keys are in the same order on each machine b_tensors = {} a_tensors = {} tensors = [self._calculate_powder_k(k=k) for k in k_indices] for i, k_index in enumerate(k_indices): a_tensors[k_index] = tensors[i][0] b_tensors[k_index] = tensors[i][1] powder = abins.PowderData(a_tensors=a_tensors, b_tensors=b_tensors, frequencies=self._frequencies, num_atoms=len(self._masses)) return powder