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
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)
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)
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
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)
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
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)