Пример #1
0
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!")
Пример #2
0
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!")
Пример #3
0
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!")
Пример #4
0
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
Пример #5
0
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)
Пример #6
0
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!")
Пример #7
0
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!")