示例#1
0
    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'])
示例#3
0
    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)
示例#4
0
    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'])
示例#5
0
    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