Exemple #1
0
 def _get_standardized_compressed_wfcs(atomconfig, wavecomp_result):
     wavefuncs = []
     waves_found_for_shell = {}
     for nn, ll in atomconfig.valenceshells:
         wfc012 = wavecomp_result.get_wavefunction(nn, ll)
         wfc0_data = wfc012.data[:,0]
         wfc0_grid = wfc012.grid
         norm = wfc0_grid.dot(wfc0_data, wfc0_data)
         logger.debug("Norm for wavefunc {:d}{:s}: {:f}".format(
             nn, sc.ANGMOM_TO_SHELL[ll], norm))
         wfc0 = soc.GridData(wfc0_grid, wfc0_data)
         sign = get_normalized_sign(nn, ll, wfc0)
         logger.debug("Sign for wavefunc {:d}{:s}: {:.1f}".format(
             nn, sc.ANGMOM_TO_SHELL[ll], sign))
         wfc012.data *= sign
         previous_wfcs = waves_found_for_shell.get(ll, [])
         if len(previous_wfcs):
             coeffs = get_expansion_coefficients(wfc012, previous_wfcs)
             msg = "Expansion coeffs of previous wavefuncs:"
             msg += " {:f}" * len(coeffs)
             logger.debug(msg.format(*coeffs))
             wfc012 = orthogonalize_wave_and_derivatives(
                 wfc012, previous_wfcs, coeffs)
         newwave = ( nn, ll, wfc012 )
         if ll in waves_found_for_shell:
             waves_found_for_shell[ll].append(newwave)
         else:
             waves_found_for_shell[ll] = newwave
         wavefuncs.append(newwave)
     return wavefuncs
Exemple #2
0
    def get_wavefunction012(self, ss, nn, ll):
        """Returns radial wave function and its first and second derivatives.

        Returns
        -------
        density : GridData
           Grid data with the wavefunction and its first and second derivatives.
        """
        if ss == 0:
            formstr = "wave_{:02d}{:s}_up.dat"
        else:
            formstr = "wave_{:02d}{:s}_dn.dat"
        wavefile = formstr.format(nn, sc.ANGMOM_TO_SHELL[ll])
        wavefile = os.path.join(self._workdir, wavefile)
        if not os.path.exists(wavefile):
            raise sc.SkgenException("Missing wave function file " + wavefile)
        fp = open(wavefile, "r")
        fp.readline()
        fp.readline()
        ngrid = int(fp.readline())
        fp.readline()
        # noinspection PyNoneFunctionAssignment,PyTypeChecker
        wavefunc = np.fromfile(fp, dtype=float, count=5 * ngrid, sep=" ")
        wavefunc.shape = (ngrid, 5)
        grid = oc.RadialGrid(wavefunc[:, 0], wavefunc[:, 1])
        wfcs = wavefunc[:, 2:5]
        return oc.GridData(grid, wfcs)
Exemple #3
0
def orthogonalize_wave_and_derivatives(wavefunc, prev_wavefuncs, coeffs):
    if len(prev_wavefuncs) == 0:
        return wavefunc
    wfcnew_data = wavefunc.data.copy()
    for coeff, wfcprev in zip(coeffs, prev_wavefuncs):
        wfcnew_data -= coeff * wfcprev.data
    norm = wavefunc.grid.dot(wfcnew_data[:,0], wfcnew_data[:,0])
    wfcnew_data /= norm
    return soc.GridData(wavefunc.grid, wfcnew_data)
Exemple #4
0
 def _store_potentials(workdir, potentials, iatom):
     fname = "potentials{:d}.dat".format(iatom)
     # Vxc up and down should be equivalent, twocnt reads only one.
     newdata = potentials.data.take(
         (radial_grid.VNUC, radial_grid.VHARTREE, radial_grid.VXCUP),
         axis=1)
     newgriddata = radial_grid.GridData(potentials.grid, newdata)
     newgriddata.tofile(os.path.join(workdir, fname))
     return fname
Exemple #5
0
    def get_potentials(self):
        """Returns various potential components of the atom

        Returns
        -------
        potentials : GridData
           Grid data with following potentials:
           nuclear, coulomb, xc-spinup, xc-spindown.
        """
        fp = open(os.path.join(self._workdir, "pot.dat"), "r")
        fp.readline()
        fp.readline()
        ngrid = int(fp.readline())
        # noinspection PyNoneFunctionAssignment,PyTypeChecker
        pots = np.fromfile(fp, dtype=float, count=ngrid * 6, sep=" ")
        fp.close()
        pots.shape = (ngrid, 6)
        grid = oc.RadialGrid(pots[:, 0], pots[:, 1])
        potentials = pots[:, 2:6]
        return oc.GridData(grid, potentials)
Exemple #6
0
    def _get_standardized_compressed_dens_wfcs(atomconfig, wavecomp_result):
        wavefuncs = []

        for qn, _ in atomconfig.occshells:
            nn = qn[0]
            ll = qn[1]
            wfc012 = wavecomp_result.get_dens_wavefunction(nn, ll)
            wfc0_data = wfc012.data[:, 0]
            wfc0_grid = wfc012.grid
            norm = wfc0_grid.dot(wfc0_data, wfc0_data)
            logger.debug("Norm for wavefunc {:d}{:s}: {:f}".format(
                nn, sc.ANGMOM_TO_SHELL[ll], norm))
            wfc0 = soc.GridData(wfc0_grid, wfc0_data)
            sign = get_normalized_sign(nn, ll, wfc0)
            logger.debug("Sign for wavefunc {:d}{:s}: {:.1f}".format(
                nn, sc.ANGMOM_TO_SHELL[ll], sign))
            wfc012.data *= sign
            newwave = (nn, ll, wfc012)
            wavefuncs.append(newwave)
        return wavefuncs
Exemple #7
0
    def get_density012(self):
        """Returns the radial density and its first and second derivatives.

        Returns
        -------
        density : GridData
           Grid data with the density and its first and second derivatives.
        """
        fp = open(os.path.join(self._workdir, "dens.dat"), "r")
        fp.readline()
        fp.readline()
        fp.readline()
        fp.readline()
        fp.readline()
        ngrid = int(fp.readline())
        # noinspection PyNoneFunctionAssignment,PyTypeChecker
        dens = np.fromfile(fp, dtype=float, count=ngrid * 7, sep=" ")
        fp.close()
        dens.shape = (ngrid, 7)
        grid = oc.RadialGrid(dens[:, 0], dens[:, 1])
        density = dens[:, 2:5]
        return oc.GridData(grid, density)