def transform_inhawp_to_eigen(iomin, iomout, blockidin=0, blockidout=0): """Compute the transformation to the eigenbasis for a wavepacket. Save the result back to a file. :param iomin: An :py:class:`IOManager: instance providing the simulation data. :param iomout: An :py:class:`IOManager: instance for saving the transformed data. :param blockidin: The data block from which the values are read. Default is `0`. :param blockidout: The data block to which the values are written. Default is `0`. """ parameters = iomin.load_parameters() # Number of time steps we saved timesteps = iomin.load_inhomogwavepacket_timegrid(blockid=blockidin) nrtimesteps = timesteps.shape[0] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator BT = BasisTransformationHAWP(Potential) # Initialize a Hagedorn wavepacket with the data descr = iomin.load_inhomogwavepacket_description(blockid=blockidin) HAWP = BlockFactory().create_wavepacket(descr) iomout.add_inhomogwavepacket(descr, timeslots=nrtimesteps, blockid=blockidout) iomout.save_inhomogwavepacket_description(HAWP.get_description(), blockid=blockidout) BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iomin.load_inhomogwavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Compute eigentransform at timestep # " + str(step)) # Retrieve simulation data params = iomin.load_inhomogwavepacket_parameters(timestep=step, blockid=blockidin) hashes, coeffs = iomin.load_inhomogwavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockidin) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([ BS[int(ha)] for ha in hashes ]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. BT.transform_to_eigen(HAWP) # Save the transformed packet # Pi iomout.save_inhomogwavepacket_parameters(HAWP.get_parameters(), timestep=step, blockid=blockidout) # Basis shapes (in case they changed!) for shape in HAWP.get_basis_shape(): iomout.save_inhomogwavepacket_basisshapes(shape, blockid=blockidout) # Coefficients iomout.save_inhomogwavepacket_coefficients(HAWP.get_coefficients(), HAWP.get_basis_shape(), timestep=step, blockid=blockidout)
def compute_norm_inhawp(iom, blockid=0, eigentrafo=True): """Compute the norm of a wavepacket timeseries. This function is for inhomogeneous wavepackets. :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. :type blockid: Integer, Default is ``0`` :param eigentrafo: Whether to make a transformation into the eigenbasis. :type eigentrafo: Boolean, default is ``True``. """ parameters = iom.load_parameters() # Number of time steps we saved timesteps = iom.load_inhomogwavepacket_timegrid(blockid=blockid) nrtimesteps = timesteps.shape[0] # Basis transformator if eigentrafo is True: # The potential used Potential = BlockFactory().create_potential(parameters) BT = BasisTransformationHAWP(Potential) # We want to save norms, thus add a data slot to the data file iom.add_norm(parameters, timeslots=nrtimesteps, blockid=blockid) # Initialize a Hagedorn wavepacket with the data descr = iom.load_inhomogwavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) if eigentrafo is True: BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iom.load_inhomogwavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Computing norms of timestep "+str(step)) # Retrieve simulation data params = iom.load_inhomogwavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_inhomogwavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([ BS[int(ha)] for ha in hashes ]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. if eigentrafo is True: BT.transform_to_eigen(HAWP) # Measure norms in the eigenbasis norm = HAWP.norm() # Save the norms iom.save_norm(norm, timestep=step, blockid=blockid)
def read_data_homogeneous(iom, blockid=0): r""" :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. """ parameters = iom.load_parameters() timegrid = iom.load_wavepacket_timegrid(blockid=blockid) time = timegrid * parameters["dt"] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator BT = BasisTransformationHAWP(Potential) # Basis shapes BS_descr = iom.load_wavepacket_basisshapes(blockid=blockid) BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Initialize a Hagedorn wavepacket with the data descr = iom.load_wavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) BT.set_matrix_builder(HAWP.get_quadrature()) # Store the resulting coefficients here CI = [[] for i in xrange(HAWP.get_number_components())] # Iterate over all timesteps, this is an *expensive* transformation for i, step in enumerate(timegrid): print(" Computing eigentransformation at timestep " + str(step)) # Retrieve simulation data params = iom.load_wavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_wavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([BS[int(ha)] for ha in hashes]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. BT.transform_to_eigen(HAWP) for index, item in enumerate(HAWP.get_coefficients()): CI[index].append(item) CI = [transpose(hstack(item)) for item in CI] return time, CI
def read_data_inhomogeneous(iom, blockid=0): r""" :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. """ parameters = iom.load_parameters() timegrid = iom.load_inhomogwavepacket_timegrid(blockid=blockid) time = timegrid * parameters["dt"] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator BT = BasisTransformationHAWP(Potential) # Basis shapes BS_descr = iom.load_wavepacket_basisshapes(blockid=blockid) BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Initialize a Hagedorn wavepacket with the data descr = iom.load_inhomogwavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) BT.set_matrix_builder(HAWP.get_quadrature()) # Store the resulting coefficients here CI = [ [] for i in xrange(HAWP.get_number_components()) ] # Iterate over all timesteps, this is an *expensive* transformation for i, step in enumerate(timegrid): print(" Computing eigentransformation at timestep "+str(step)) # Retrieve simulation data params = iom.load_inhomogwavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_inhomogwavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([ BS[int(ha)] for ha in hashes ]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. BT.transform_to_eigen(HAWP) for index, item in enumerate(HAWP.get_coefficients()): CI[index].append(item) CI = [ transpose(hstack(item)) for item in CI ] return time, CI
def transform_inhawp_to_eigen(iomin, iomout, blockidin=0, blockidout=0): """Compute the transformation to the eigenbasis for a wavepacket. Save the result back to a file. :param iomin: An :py:class:`IOManager: instance providing the simulation data. :param iomout: An :py:class:`IOManager: instance for saving the transformed data. :param blockidin: The data block from which the values are read. Default is `0`. :param blockidout: The data block to which the values are written. Default is `0`. """ parameters = iomin.load_parameters() # Number of time steps we saved timesteps = iomin.load_inhomogwavepacket_timegrid(blockid=blockidin) nrtimesteps = timesteps.shape[0] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator BT = BasisTransformationHAWP(Potential) # Initialize a Hagedorn wavepacket with the data descr = iomin.load_inhomogwavepacket_description(blockid=blockidin) HAWP = BlockFactory().create_wavepacket(descr) iomout.add_inhomogwavepacket(descr, timeslots=nrtimesteps, blockid=blockidout) iomout.save_inhomogwavepacket_description(HAWP.get_description(), blockid=blockidout) BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iomin.load_inhomogwavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Compute eigentransform at timestep # " + str(step)) # Retrieve simulation data params = iomin.load_inhomogwavepacket_parameters(timestep=step, blockid=blockidin) hashes, coeffs = iomin.load_inhomogwavepacket_coefficients( timestep=step, get_hashes=True, blockid=blockidin) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([BS[int(ha)] for ha in hashes]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. BT.transform_to_eigen(HAWP) # Save the transformed packet # Pi iomout.save_inhomogwavepacket_parameters(HAWP.get_parameters(), timestep=step, blockid=blockidout) # Basis shapes (in case they changed!) for shape in HAWP.get_basis_shape(): iomout.save_inhomogwavepacket_basisshapes(shape, blockid=blockidout) # Coefficients iomout.save_inhomogwavepacket_coefficients(HAWP.get_coefficients(), HAWP.get_basis_shape(), timestep=step, blockid=blockidout)
def compute_energy_inhawp(iom, blockid=0, eigentrafo=True, iseigen=True): """Compute the energies of a wavepacket timeseries. This function is for inhomogeneous wavepackets. :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. :type blockid: Integer, Default is ``0`` :param eigentrafo: Whether to make a transformation into the eigenbasis. :type eigentrafo: Boolean, default is ``True``. :param iseigen: Whether the data is assumed to be in the eigenbasis. :type iseigen: Boolean, default is ``True`` """ parameters = iom.load_parameters() # Number of time steps we saved timesteps = iom.load_inhomogwavepacket_timegrid(blockid=blockid) nrtimesteps = timesteps.shape[0] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator if eigentrafo is True: BT = BasisTransformationHAWP(Potential) # We want to save energies, thus add a data slot to the data file iom.add_energy(parameters, timeslots=nrtimesteps, blockid=blockid) # Initialize a Hagedorn wavepacket with the data descr = iom.load_inhomogwavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) if eigentrafo is True: BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iom.load_inhomogwavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) O = ObservablesHAWP() # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Computing energies of timestep "+str(step)) # Retrieve simulation data params = iom.load_inhomogwavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_inhomogwavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([ BS[int(ha)] for ha in hashes ]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. if eigentrafo is True: BT.transform_to_eigen(HAWP) # Compute the energies O.set_quadrature(HAWP.get_quadrature()) ekin = O.kinetic_energy(HAWP) if iseigen is True: epot = O.potential_energy(HAWP, Potential.evaluate_eigenvalues_at) else: epot = O.potential_energy(HAWP, Potential.evaluate_at) iom.save_energy((ekin, epot), timestep=step, blockid=blockid)
def compute_energy_hawp(iom, blockid=0, eigentrafo=True, iseigen=True): """Compute the energies of a wavepacket timeseries. :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. :type blockid: Integer, Default is ``0`` :param eigentrafo: Whether to make a transformation into the eigenbasis. :type eigentrafo: Boolean, default is ``True``. :param iseigen: Whether the data is assumed to be in the eigenbasis. :type iseigen: Boolean, default is ``True`` """ parameters = iom.load_parameters() # Number of time steps we saved timesteps = iom.load_wavepacket_timegrid(blockid=blockid) nrtimesteps = timesteps.shape[0] # The potential used Potential = BlockFactory().create_potential(parameters) # Basis transformator if eigentrafo is True: BT = BasisTransformationHAWP(Potential) # We want to save energies, thus add a data slot to the data file iom.add_energy(parameters, timeslots=nrtimesteps, blockid=blockid) # Initialize a Hagedorn wavepacket with the data descr = iom.load_wavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) if eigentrafo is True: BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iom.load_wavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) O = ObservablesHAWP() # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Computing energies of timestep "+str(step)) # Retrieve simulation data params = iom.load_wavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_wavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([ BS[int(ha)] for ha in hashes ]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. if eigentrafo is True: BT.transform_to_eigen(HAWP) # Compute the energies O.set_quadrature(HAWP.get_quadrature()) ekin = O.kinetic_energy(HAWP) if iseigen is True: epot = O.potential_energy(HAWP, Potential.evaluate_eigenvalues_at) else: epot = O.potential_energy(HAWP, Potential.evaluate_at) iom.save_energy((ekin, epot), timestep=step, blockid=blockid)
def compute_norm_hawp(iom, blockid=0, eigentrafo=True): """Compute the norm of a wavepacket timeseries. :param iom: An :py:class:`IOManager` instance providing the simulation data. :param blockid: The data block from which the values are read. :type blockid: Integer, Default is ``0`` :param eigentrafo: Whether to make a transformation into the eigenbasis. :type eigentrafo: Boolean, default is ``True``. """ parameters = iom.load_parameters() # Number of time steps we saved timesteps = iom.load_wavepacket_timegrid(blockid=blockid) nrtimesteps = timesteps.shape[0] # Basis transformator if eigentrafo is True: # The potential used Potential = BlockFactory().create_potential(parameters) BT = BasisTransformationHAWP(Potential) # We want to save norms, thus add a data slot to the data file iom.add_norm(parameters, timeslots=nrtimesteps, blockid=blockid) # Initialize a Hagedorn wavepacket with the data descr = iom.load_wavepacket_description(blockid=blockid) HAWP = BlockFactory().create_wavepacket(descr) if eigentrafo is True: BT.set_matrix_builder(HAWP.get_quadrature()) # Basis shapes BS_descr = iom.load_wavepacket_basisshapes() BS = {} for ahash, descr in BS_descr.iteritems(): BS[ahash] = BlockFactory().create_basis_shape(descr) # Iterate over all timesteps for i, step in enumerate(timesteps): print(" Computing norms of timestep " + str(step)) # Retrieve simulation data params = iom.load_wavepacket_parameters(timestep=step, blockid=blockid) hashes, coeffs = iom.load_wavepacket_coefficients(timestep=step, get_hashes=True, blockid=blockid) # Configure the wavepacket HAWP.set_parameters(params) HAWP.set_basis_shape([BS[int(ha)] for ha in hashes]) HAWP.set_coefficients(coeffs) # Transform to the eigenbasis. if eigentrafo is True: BT.transform_to_eigen(HAWP) # Measure norms in the eigenbasis norm = HAWP.norm() # Save the norms iom.save_norm(norm, timestep=step, blockid=blockid)