def _prepare_data(self, k_point=None): """ Sets all necessary fields for 1D calculations. Sorts atom indices to improve parallelism. :returns: number of atoms, sorted atom indices """ # load powder data for one k clerk = AbinsModules.IOmodule(input_filename=self._input_filename, group_name=AbinsModules.AbinsParameters.powder_data_group) powder_data = clerk.load(list_of_datasets=["powder_data"]) self._a_tensors = powder_data["datasets"]["powder_data"]["a_tensors"][k_point] self._b_tensors = powder_data["datasets"]["powder_data"]["b_tensors"][k_point] self._a_traces = np.trace(a=self._a_tensors, axis1=1, axis2=2) self._b_traces = np.trace(a=self._b_tensors, axis1=2, axis2=3) # load dft data for one k point clerk = AbinsModules.IOmodule(input_filename=self._input_filename, group_name=AbinsModules.AbinsParameters.ab_initio_group) dft_data = clerk.load(list_of_datasets=["frequencies", "weights"]) frequencies = dft_data["datasets"]["frequencies"][int(k_point)] indx = frequencies > AbinsModules.AbinsConstants.ACOUSTIC_PHONON_THRESHOLD self._fundamentals_freq = frequencies[indx] self._weight = dft_data["datasets"]["weights"][int(k_point)] # free memory gc.collect()
def __init__(self, input_ab_initio_filename=None): self._num_k = None self._num_atoms = None self._sample_form = None self._ab_initio_program = None self._clerk = AbinsModules.IOmodule(input_filename=input_ab_initio_filename, group_name=AbinsModules.AbinsParameters.hdf_groups['ab_initio_data'])
def __init__(self, input_dft_filename=None): self._num_k = None self._num_atoms = None self._sample_form = None self._dft_program = None self._clerk = AbinsModules.IOmodule( input_filename=input_dft_filename, group_name=AbinsModules.AbinsParameters.dft_group)
def __init__(self, filename=None, abins_data=None): """ :param filename: name of input DFT filename :param abins_data: object of type AbinsData with data from input DFT file """ if not isinstance(abins_data, AbinsModules.AbinsData): raise ValueError("Object of AbinsData was expected.") k_data = abins_data.get_kpoints_data().extract() gamma_pkt = AbinsModules.AbinsConstants.GAMMA_POINT self._frequencies = k_data["frequencies"] self._displacements = k_data["atomic_displacements"] self._num_atoms = self._displacements[gamma_pkt].shape[0] self._atoms_data = abins_data.get_atoms_data().extract() self._clerk = AbinsModules.IOmodule(input_filename=filename, group_name=AbinsParameters.hdf_groups['powder_data'])
def __init__(self, filename=None, temperature=None, abins_data=None, instrument=None, quantum_order_num=None, bin_width=1.0): """ :param filename: name of input DFT file (CASTEP: foo.phonon) :param temperature: temperature in K for which calculation of S should be done :param sample_form: form in which experimental sample is: Powder or SingleCrystal (str) :param abins_data: object of type AbinsData with data from phonon file :param instrument: name of instrument (str) :param quantum_order_num: number of quantum order events taken into account during the simulation :param bin_width: bin width used in rebining in wavenumber """ if not isinstance(temperature, (int, float)): raise ValueError("Invalid value of the temperature. Number was expected.") if temperature < 0: raise ValueError("Temperature cannot be negative.") self._temperature = float(temperature) self._sample_form = "Powder" if isinstance(abins_data, AbinsModules.AbinsData): self._abins_data = abins_data else: raise ValueError("Object of type AbinsData was expected.") self._q2_indices = list(self._abins_data.get_kpoints_data().extract()["k_vectors"].keys()) self._atoms = self._abins_data.get_atoms_data().extract() if isinstance(abins_data, AbinsModules.AbinsData): self._abins_data = abins_data else: raise ValueError("Object of type AbinsData was expected.") min_order = AbinsModules.AbinsConstants.FUNDAMENTALS max_order = AbinsModules.AbinsConstants.FUNDAMENTALS + AbinsModules.AbinsConstants.HIGHER_ORDER_QUANTUM_EVENTS if isinstance(quantum_order_num, int) and min_order <= quantum_order_num <= max_order: self._quantum_order_num = quantum_order_num else: raise ValueError("Invalid number of quantum order events.") if isinstance(instrument, AbinsModules.Instruments.Instrument): self._instrument = instrument else: raise ValueError("Unknown instrument %s" % instrument) if isinstance(filename, str): if filename.strip() == "": raise ValueError("Name of the file cannot be an empty string!") self._input_filename = filename else: raise ValueError("Invalid name of input file. String was expected!") self._clerk = AbinsModules.IOmodule( input_filename=filename, group_name=("{s_data_group}/{instrument}/{sample_form}/{temperature}K").format( s_data_group=AbinsModules.AbinsParameters.s_data_group, instrument=self._instrument, sample_form=self._sample_form, temperature=self._temperature)) self._freq_generator = AbinsModules.FrequencyPowderGenerator() self._calculate_order = {AbinsModules.AbinsConstants.QUANTUM_ORDER_ONE: self._calculate_order_one, AbinsModules.AbinsConstants.QUANTUM_ORDER_TWO: self._calculate_order_two, AbinsModules.AbinsConstants.QUANTUM_ORDER_THREE: self._calculate_order_three, AbinsModules.AbinsConstants.QUANTUM_ORDER_FOUR: self._calculate_order_four} step = bin_width self._bin_width = bin_width start = AbinsModules.AbinsParameters.min_wavenumber + step stop = AbinsModules.AbinsParameters.max_wavenumber + step self._bins = np.arange(start=start, stop=stop, step=step, dtype=AbinsModules.AbinsConstants.FLOAT_TYPE) self._freq_size = self._bins.size - 1 self._frequencies = self._bins[:-1] # set initial threshold for s for each atom self._num_atoms = len(self._abins_data.get_atoms_data().extract()) s_threshold = AbinsModules.AbinsParameters.s_relative_threshold self._s_threshold_ref = np.asarray([s_threshold for _ in range(self._num_atoms)]) self._s_current_threshold = np.copy(self._s_threshold_ref) self._max_s_previous_order = np.asarray([0.0 for _ in range(self._num_atoms)]) self._total_s_correction_num_attempt = 0 self._powder_atoms_data = None self._a_traces = None self._b_traces = None self._atoms_data = None self._fundamentals_freq = None