def TestSolveOverlapSpeed(): def timeIt(func): t1 = time.time() func() t2 = time.time() Print(" Function '%s' took %4.1f s." % (func.func_name, (t2 - t1))) numSolves = 100 Print("") Print("Now testing multiple S^-1 * psi...") pyprop.Redirect.Enable(silent=True) seed(0) conf = pyprop.Load("config_eigenvalues.ini") psi = pyprop.CreateWavefunction(conf) tmpPsi = psi.Copy() Print(" Size of wavefunction is: %s" % repr(psi.GetData().shape)) #Calculate S^-1 * psi Print(" Performing %i solves..." % numSolves) def solve(): for i in range(numSolves): psi.GetRepresentation().MultiplyOverlap(tmpPsi) timeIt(solve) #finish and cleanup pypar.barrier() pyprop.Redirect.Disable() Print("\n...done!")
def TestMultiplyOverlap(): pyprop.PrintOut("Now testing S * psi...") pyprop.Redirect.Enable(silent=True) fileName = "test_multiplyoverlap.h5" seed(0) conf = pyprop.Load("config-test.ini") psi = pyprop.CreateWavefunction(conf) initPsi = pyprop.CreateWavefunction(conf) if pyprop.ProcCount == 1: psi.GetData()[:] = random(psi.GetData().shape) print "Normalizing wavefunction..." psi.Normalize() initPsi.GetData()[:] = psi.GetData()[:] pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunction", psi, conf) psi.GetRepresentation().MultiplyOverlap(psi) pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunctionoverlap", psi, conf) else: pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunction", initPsi) pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunctionoverlap", psi) destPsi = initPsi.Copy() destPsi.Clear() tmpPsi = initPsi.Copy() tmpPsi.Clear() destPsi.GetData()[:] = initPsi.GetData()[:] destPsi.GetRepresentation().MultiplyOverlap(destPsi) Print() Print(" Proc %s: ||S * psi - S'*psi||_max = %s" % (pyprop.ProcId, numpy.max(numpy.max(psi.GetData() - destPsi.GetData())))) Print(" Proc %s: ||S * psi - S'*psi|| = %s" % (pyprop.ProcId, linalg.norm(psi.GetData() - destPsi.GetData()))) #finish and cleanup pypar.barrier() pyprop.Redirect.Disable() pyprop.PrintOut("\n...done!")
def TestInnerProduct(): pyprop.PrintOut("") pyprop.PrintOut("Now testing innerproduct...") pyprop.Redirect.Enable(silent=True) seed(0) fileName = "test_innerproduct.h5" conf = pyprop.Load("config-test.ini") psi = pyprop.CreateWavefunction(conf) tmpPsi = pyprop.CreateWavefunction(conf) if pyprop.ProcCount == 1: psi.GetData()[:] = random(psi.GetData().shape) psi.Normalize() tmpPsi.GetData()[:] = random(psi.GetData().shape) tmpPsi.Normalize() pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunction1", psi, conf) pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunction2", tmpPsi, conf) else: pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunction1", psi) pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunction2", tmpPsi) inner1 = psi.InnerProduct(tmpPsi) inner2 = psi.InnerProduct(psi) Print() Print("<psi|tmpPsi> = %s" % inner1, range(pyprop.ProcCount)) Print("<psi|psi> = %s" % inner2, range(pyprop.ProcCount)) #finish and cleanup pypar.barrier() pyprop.Redirect.Disable() pyprop.PrintOut("\n...done!")
def PlotElectricField(**args): conf = SetupConfig(**args) psi = pyprop.CreateWavefunction(conf) pot = pyprop.CreatePotentialFromSection(conf.ProbePulsePotential, "ProbePulsePotential", psi) pot2 = pyprop.CreatePotentialFromSection(conf.ControlPulsePotential, "ProbePulsePotential", psi) t = r_[0:conf.Propagation.duration:abs(conf.Propagation.timestep)] field = array( [pot.GetTimeValue(curT) + pot2.GetTimeValue(curT) for curT in t]) plot(t / femtosec_to_au, field) return t, field
def SetupWavefunctionFromSAE(inputFile, outputFile): #Get radial representation parameters from input file updateElements = [ 'xmin', 'xmax', 'xsize', 'gamma', 'joinpoint', 'xpartition', 'bpstype', 'continuity', 'order' ] h5in = tables.openFile(inputFile) try: cfgObj = h5in.root.wavefunction._v_attrs.configObject finally: h5in.close() radialSection = pyprop.Section("RadialRepresentation", cfgObj) #Setup config with radial params from input conf = SetupConfig(config="config_sae_model.ini") for key in updateElements: conf.SetValue("RadialRepresentation", key, radialSection.Get(key)) #conf.RadialRepresentation = radialSection #Setup wavefunction psi = pyprop.CreateWavefunction(conf) psi.Clear() #Load SAE wavefunction h5in = tables.openFile(inputFile) psiSAEData = h5in.root.wavefunction[:] h5in.close() #Put radial data into full wavefunction for li in range(psiSAEData.shape[0]): curSAEi = psiSAEData[li, :] for lj in range(psiSAEData.shape[0]): curSAEj = psiSAEData[lj, :] #Determine which angular indices of psi corresponds to this l angIt = conf.AngularRepresentation.index_iterator angIdx = [ i for i, (l1, l2, L, M) in enumerate(angIt) if l1 == li and l2 == lj ] #Store in appropriate slice of psi psi.GetData()[angIdx, :, :] = outer(curSAEi, curSAEj) #Normalize psi #psi.Normalize() #Store psi and config obj pyprop.serialization.SaveWavefunctionHDF(outputFile, "/wavefunction", psi) pyprop.serialization.SaveConfigObject(outputFile, "/wavefunction", conf)
def TestEpetraMatvecSpeed(): numMatVecs = 500 Print("") Print("Now testing Epetra matvec speed...") pyprop.Redirect.Enable(silent=True) #Test conf = pyprop.Load("config_propagation.ini") psi = pyprop.CreateWavefunction(conf) Print(" Size of wavefunction is: %s" % repr(psi.GetData().shape)) #Setup problem Print(" Setting up propagator w/potentials...") prop = SetupProblem(config='config_propagation.ini') psi = prop.psi tmpPsi = psi.Copy() tmpPsi.Clear() Print(" Local size of wavefunction is: %s" % str(prop.psi.GetData().shape)) Print(" Global size of wavefunction is: %s" % str(prop.psi.GetRepresentation().GetFullShape())) #Get Epetra potential #pot = prop.Propagator.BasePropagator.PotentialList[1] Print(" Number of potentials: %s" % len(prop.Propagator.BasePropagator.PotentialList)) #Calculate S^-1 * psi Print(" Performing %i matvecs..." % numMatVecs) def matvecs(): for i in range(numMatVecs): #pot.MultiplyPotential(psi, tmpPsi, 0, 0) prop.Propagator.BasePropagator.MultiplyHamiltonianNoOverlap( psi, tmpPsi, 0, 0) #tmpPsi.GetRepresentation().SolveOverlap(tmpPsi) timeIt(matvecs) #finish and cleanup pypar.barrier() pyprop.Redirect.Disable() pyprop.PrintOut("\n...done!")
def TestSolveOverlap(): pyprop.PrintOut("") pyprop.PrintOut("Now testing S^-1 * psi...") pyprop.Redirect.Enable(silent=True) seed(0) fileName = "test_solveoverlap.h5" conf = pyprop.Load("config-test.ini") psi = pyprop.CreateWavefunction(conf) initPsi = pyprop.CreateWavefunction(conf) if pyprop.ProcCount == 1: psi.GetData()[:] = random(psi.GetData().shape) psi.Normalize() initPsi.GetData()[:] = psi.GetData()[:] #Store initial (random) psi pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunction", psi, conf) #Store S^-1 * psi psi.GetRepresentation().SolveOverlap(psi) pyprop.serialization.SaveWavefunctionHDF(fileName, "/wavefunctionoverlap", psi, conf) #determine overlap matrix condition number overlap = psi.GetRepresentation().GetGlobalOverlapMatrix(0) A = overlap.GetOverlapBlasBanded() B = pyprop.core.ConvertMatrixBlasBandedToFull(A) Print(" Overlap matrix condition number = %e" % cond(B)) else: pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunction", initPsi) pyprop.serialization.LoadWavefunctionHDF(fileName, "/wavefunctionoverlap", psi) destPsi = initPsi.Copy() destPsi.Clear() tmpPsi = initPsi.Copy() tmpPsi.Clear() #Calculate S^-1 * psi destPsi.GetData()[:] = initPsi.GetData()[:] destPsi.GetRepresentation().SolveOverlap(destPsi) tmpPsi.GetData()[:] = destPsi.GetData()[:] #Calculate S * S^-1 * psi destPsi.GetRepresentation().MultiplyOverlap(destPsi) Print() a = numpy.max(numpy.max(psi.GetData() - tmpPsi.GetData())) Print( " Proc %s: ||S^-1 * psi - S'^-1 * psi||_max = %s" % (pyprop.ProcId, a), range(pyprop.ProcCount)) Print() b = numpy.max(numpy.max(initPsi.GetData() - destPsi.GetData())) Print( " Proc %s: ||S * S^-1 * psi - I * psi||_max = %s" % (pyprop.ProcId, b), range(pyprop.ProcCount)) c = linalg.norm(initPsi.GetData() - destPsi.GetData()) Print(" Proc %s: ||S * S^-1 * psi - I * psi|| = %s" % (pyprop.ProcId, c), range(pyprop.ProcCount)) #finish and cleanup pypar.barrier() pyprop.Redirect.Disable() pyprop.PrintOut("\n...done!")