Esempio n. 1
0
            if ((in1.nds == 1) or (in1.nds == 3)):
                graf1.dpmgrasp1(s1.ppart, s1.kpic, ' ELECTRON', ntime, 999, nx,
                                2, 1, in1.ntsc, irc)
                if (irc[0] == 1): break
                irc[0] = 0
# ion phase space
            if (in1.movion == 1):
                # plot ions vx versus x
                if ((in1.nds == 2) or (in1.nds == 3)):
                    graf1.dpmgrasp1(s1.pparti, s1.kipic, ' ION', ntime, 999,
                                    nx, 2, 1, in1.ntsc, irc)
                    if (irc[0] == 1): break
                    irc[0] = 0

# push electrons with OpenMP: updates ppart, wke, kpic
    s1.push_electrons1(s1.ppart, s1.kpic)

    # push ions with OpenMP: updates pparti, wki, kipic
    if (in1.movion == 1):
        s1.push_ions1(s1.pparti, s1.kipic)

# start running simulation backwards:
# need to reverse time lag in leap-frog integration scheme
    if (in1.treverse == 1):
        if (((ntime + 1) == (nloop / 2)) or ((ntime + 1) == nloop)):
            s1.es_time_reverse1()

# energy diagnostic: updates wt
    if (in1.ntw > 0):
        it = int(ntime / in1.ntw)
        if (ntime == in1.ntw * it):
Esempio n. 2
0
def main():

    # read namelist
    iuin = 8
    in1.readnml1(iuin)
    # override input data
    in1.idcode = 1
    in1.ndim = 1
    if (in1.nts > 0):
        in1.nsxv = min(in1.nsxv, 1)
        in1.nsvv = 0

# import electrostatic module after namelist has been read
    import s1

    int_type = numpy.int32
    double_type = numpy.float64
    #if (minit1.fprecision()==0):
    float_type = numpy.float32
    complex_type = numpy.complex64
    #else:
    #  float_type = numpy.float64
    #  complex_type = numpy.complex128
    #  print ("using double precision")

    # declare scalars for standard code
    npi = 0
    ws = numpy.zeros((1), float_type)

    # declare scalars for OpenMP code
    irc = numpy.zeros((1), int_type)

    # declare and initialize timing data
    tinit = 0.0
    tloop = 0.0
    itime = numpy.empty((4), numpy.int32)
    ltime = numpy.empty((4), numpy.int32)
    dtime = numpy.empty((1), double_type)

    # start timing initialization
    dtimer(dtime, itime, -1)

    # text output file
    fname = "output1." + s1.cdrun
    iuot = open(fname, "w")

    # in1.nvp = number of shared memory nodes (0=default)
    #in1.nvp = int(input("enter number of nodes: "))
    # initialize for shared memory parallel processing
    omplib.init_omp(in1.nvp)

    # open graphics device
    irc[0] = graf1.open_graphs(in1.nplot)

    # initialize scalars for standard code
    # np = total number of electrons in simulation
    np = s1.np
    # nx = number of grid points in x direction
    nx = s1.nx
    # npi = total number of ions in simulation
    if (in1.movion > 0):
        npi = s1.npi
# nloop = number of time steps in simulation
# nstart = initial time loop index
# ntime = current time step
    nloop = s1.nloop
    nstart = 0
    ntime = 0

    # allocate field data for standard code:
    # qe/qi = electron/ion charge density with guard cells
    # fxe = smoothed electric field with guard cells
    # ffc = form factor array for poisson solver
    # mixup = bit reverse table for FFT
    # sct = sine/cosine table for FFT
    s1.init_fields1()

    # prepare fft tables: updates mixup, sct
    mfft1.mfft1_init(s1.mixup, s1.sct, in1.indx)
    # calculate form factors: updates ffc
    mfield1.mpois1_init(s1.ffc, in1.ax, s1.affp, nx)
    # initialize different ensemble of random numbers
    if (in1.nextrand > 0):
        minit1.mnextran1(in1.nextrand, in1.ndim, np + npi)

# open reset and restart files; iur, iurr, iur0
    s1.open_restart1()

    # new start
    if (in1.nustrt == 1):
        # initialize electrons: updates ppart, kpic
        # ppart = tiled electron particle arrays
        # kpic = number of electrons in each tile
        s1.init_electrons1()

        # initialize background charge density: updates qi
        if (in1.movion == 0):
            s1.qi.fill(0.0)
            if (in1.ndprof > 0):
                qmi = -in1.qme
                mpush1.mpost1(s1.ppart, s1.qi, s1.kpic, qmi, s1.tdpost, in1.mx)
                mgard1.maguard1(s1.qi, s1.tguard, nx)

# initialize ions: updates pparti, kipic
# pparti = tiled on particle arrays
# kipic = number of ions in each tile
# cui = ion current density with guard cells
        if (in1.movion == 1):
            s1.init_ions1()

# restart to continue a run which was interrupted
    elif (in1.nustrt == 2):
        s1.bread_restart1(s1.iur)
        ntime = s1.ntime
        nstart = ntime
# start a new run with data from a previous run
    elif (in1.nustrt == 0):
        s1.bread_restart1(s1.iur0)
        ntime = s1.ntime

# reverse simulation at end back to start
    if (in1.treverse == 1):
        nloop = 2 * nloop
        s1.nloop = nloop

# initialize all diagnostics from namelist input parameters
# wt = energy time history array
# pkw = power spectrum for potential
# pkwdi = power spectrum for ion density
# wk = maximum frequency as a function of k for potential
# wkdi = maximum frequency as a function of k for ion density
# fmse/fmsi = electron/ion fluid moments
# fv/fvi = global electron/ion velocity distribution functions
# fvm/fvmi = electron/ion vdrift, vth, entropy for global distribution
# fvtm/fvtmi = time history of electron/ion vdrift, vth, and entropy
# fvtp = velocity distribution function for test particles
# fvmtp = vdrift, vth, and entropy for test particles
# partd = trajectory time history array
    s1.initialize_diagnostics1(ntime)

    # read in restart diagnostic file to continue interrupted run
    if (in1.nustrt == 2):
        s1.dread_restart1(s1.iur)

# write reset file
#s1.bwrite_restart1(s1.iurr,ntime)

# initialization time
    dtimer(dtime, itime, 1)
    tinit = tinit + float(dtime)
    # start timing loop
    dtimer(dtime, ltime, -1)

    print("program mbeps1", file=iuot)

    # * * * start main iteration loop * * *

    for ntime in range(nstart, nloop):
        print("ntime = ", ntime, file=iuot)

        # debug reset
        #  if (ntime==int(nloop/2)):
        #     s1.bread_restart1(s1.iurr)
        #     s1.reset_diags1()

        # deposit charge with OpenMP: updates qe
        dtimer(dtime, itime, -1)
        s1.qe.fill(0.0)
        dtimer(dtime, itime, 1)
        s1.tdpost[0] += float(dtime)
        mpush1.mpost1(s1.ppart, s1.qe, s1.kpic, in1.qme, s1.tdpost, in1.mx)
        # add guard cells: updates qe
        mgard1.maguard1(s1.qe, s1.tguard, nx)

        # electron density diagnostic: updates sfield=electron density
        if (in1.ntde > 0):
            it = int(ntime / in1.ntde)
            if (ntime == in1.ntde * it):
                s1.edensity_diag1(s1.sfield)
                # display smoothed electron density
                graf1.dscaler1(s1.sfield, ' EDENSITY', ntime, 999, 0, nx, irc)
                if (irc[0] == 1): break
                irc[0] = 0

# deposit ion charge with OpenMP: updates qi
        if (in1.movion == 1):
            dtimer(dtime, itime, -1)
            s1.qi.fill(0.0)
            dtimer(dtime, itime, 1)
            s1.tdpost[0] += float(dtime)
            mpush1.mpost1(s1.pparti, s1.qi, s1.kipic, in1.qmi, s1.tdpost,
                          in1.mx)
            # add guard cells: updates qi
            mgard1.maguard1(s1.qi, s1.tguard, nx)

# ion density diagnostic: updates sfield=ion density, pkwdi, wkdi
        if (in1.movion == 1):
            if (in1.ntdi > 0):
                it = int(ntime / in1.ntdi)
                if (ntime == in1.ntdi * it):
                    s1.idensity_diag1(s1.sfield, s1.pkwdi, s1.wkdi, ntime)
                    if ((in1.nddi == 1) or (in1.nddi == 3)):
                        # display smoothed ion density
                        graf1.dscaler1(s1.sfield, ' ION DENSITY', ntime, 999,
                                       1, nx, irc)
                        if (irc[0] == 1): break
                        irc[0] = 0
# ion spectral analysis
                    if ((in1.nddi == 2) or (in1.nddi == 3)):
                        # display frequency spectrum
                        graf1.dmscaler1(s1.wkdi, 'ION DENSITY OMEGA VS MODE',
                                        ntime, 999, 1, in1.modesxdi, s1.cwk,
                                        irc)
                        if (irc[0] == 1): break
                        irc[0] = 0

# add electron and ion densities: updates qe
        mfield1.maddqei1(s1.qe, s1.qi, s1.tfield, nx)

        # transform charge to fourier space: updates qe
        isign = -1
        mfft1.mfft1r(s1.qe, isign, s1.mixup, s1.sct, s1.tfft, in1.indx)

        # calculate force/charge in fourier space: updates fxe, we
        mfield1.mpois1(s1.qe, s1.fxe, s1.ffc, s1.we, s1.tfield, nx)

        # transform force to real space: updates fxe
        isign = 1
        mfft1.mfft1r(s1.fxe, isign, s1.mixup, s1.sct, s1.tfft, in1.indx)

        # add external traveling wave field
        ts = in1.dt * float(ntime)
        mfield1.meaddext1(s1.fxe, s1.tfield, in1.amodex, in1.freq, ts,
                          in1.trmp, in1.toff, in1.el0, in1.er0, nx)

        # copy guard cells: updates fxe
        mgard1.mdguard1(s1.fxe, s1.tguard, nx)

        # potential diagnostic: updates sfield=potential, pkw, wk
        if (in1.ntp > 0):
            it = int(ntime / in1.ntp)
            if (ntime == in1.ntp * it):
                s1.potential_diag1(s1.sfield, s1.pkw, s1.wk, ntime)
                if ((in1.ndp == 1) or (in1.ndp == 3)):
                    # display potential
                    graf1.dscaler1(s1.sfield, ' POTENTIAL', ntime, 999, 0, nx,
                                   irc)
                    if (irc[0] == 1): break
                    irc[0] = 0
# spectral analysis
            if ((in1.ndp == 2) or (in1.ndp == 3)):
                # display frequency spectrum
                graf1.dmscaler1(s1.wk, 'POTENTIAL OMEGA VS MODE', ntime, 999,
                                2, in1.modesxp, s1.cwk, irc)
                if (irc[0] == 1): break
                irc[0] = 0

# longitudinal efield diagnostic: updates sfield=longitudinal efield
        if (in1.ntel > 0):
            it = int(ntime / in1.ntel)
            if (ntime == in1.ntel * it):
                s1.elfield_diag1(s1.sfield)
                # display longitudinal efield
                graf1.dscaler1(s1.sfield, ' ELFIELD', ntime, 999, 0, nx, irc)
                if (irc[0] == 1): break
                irc[0] = 0

# fluid moments diagnostic
        if (in1.ntfm > 0):
            it = int(ntime / in1.ntfm)
            if (ntime == in1.ntfm * it):
                # updates fmse
                s1.efluidms_diag1(s1.fmse)
                if (in1.movion == 1):
                    # updates fmsi
                    s1.ifluidms_diag1(s1.fmsi)

# velocity diagnostic
        if (in1.ntv > 0):
            it = int(ntime / in1.ntv)
            if (ntime == in1.ntv * it):
                # updates fv, fvm, fvtm
                s1.evelocity_diag1(s1.fv, s1.fe, s1.fvm, s1.fvtm, s1.wkt)
                # display electron velocity distributions
                if ((in1.ndv == 1) or (in1.ndv == 3)):
                    if ((in1.nvft == 1) or (in1.nvft == 3)):
                        graf1.displayfv1(s1.fv, s1.fvm, ' ELECTRON', ntime,
                                         in1.nmv, 1, irc)
                        if (irc[0] == 1): break
                        irc[0] = 0
# display electron energy distribution
                    if ((in1.nvft == 2) or (in1.nvft == 3)):
                        graf1.displayfe1(s1.fe, s1.wkt, ' ELECTRON', ntime,
                                         in1.nmv, irc)
                        if (irc[0] == 1): break
                        irc[0] = 0
                if (in1.movion == 1):
                    # updates fvi, fvmi, fvtmi
                    s1.ivelocity_diag1(s1.fvi, s1.fei, s1.fvmi, s1.fvtmi,
                                       s1.wkt)
                    # display ion velocity distributions
                    if ((in1.ndv == 2) or (in1.ndv == 3)):
                        if ((in1.nvft == 1) or (in1.nvft == 3)):
                            graf1.displayfv1(s1.fvi, s1.fvmi, ' ION', ntime,
                                             in1.nmv, 1, irc)
                            if (irc[0] == 1): break
                            irc[0] = 0
# display ion energy distribution
                        if ((in1.nvft == 2) or (in1.nvft == 3)):
                            ts = s1.fei[2 * in1.nmv + 1, 0]
                            s1.fei[2 * in1.nmv + 1, 0] = in1.rmass * ts
                            graf1.displayfe1(s1.fei, s1.wkt, ' ION', ntime,
                                             in1.nmv, irc)
                            if (irc[0] == 1): break
                            irc[0] = 0
                            s1.fei[2 * in1.nmv + 1, 0] = ts

# trajectory diagnostic: updates partd, fvtp, fvmtp
        if (in1.ntt > 0):
            it = int(ntime / in1.ntt)
            if (ntime == in1.ntt * it):
                s1.traj_diag1(s1.partd, s1.fvtp, s1.fvmtp)
                if (in1.nst == 3):
                    # display test particle velocity distributions
                    if (in1.ndt == 1):
                        graf1.displayfv1(s1.fvtp, s1.fvmtp, ' ELECTRON', ntime,
                                         in1.nmv, 1, irc)
                    elif (in1.ndt == 2):
                        graf1.displayfv1(s1.fvtp, s1.fvmtp, ' ION', ntime,
                                         in1.nmv, 1, irc)
                    if (irc[0] == 1): break
                    irc[0] = 0

# phase space diagnostic
        if (in1.nts > 0):
            it = int(ntime / in1.nts)
            if (ntime == in1.nts * it):
                # calculate electron phase space distribution: updates fvs
                s1.ephasesp_diag1(s1.fvs)
                # plot electrons vx versus x
                if ((in1.nds == 1) or (in1.nds == 3)):
                    graf1.dpmgrasp1(s1.ppart, s1.kpic, ' ELECTRON', ntime, 999,
                                    nx, 2, 1, in1.ntsc, irc)
                    if (irc[0] == 1): break
                    irc[0] = 0
# ion phase space
                if (in1.movion == 1):
                    # calculate ion phase space distribution: updates fvsi
                    s1.iphasesp_diag1(s1.fvsi)
                    # plot ions vx versus x
                    if ((in1.nds == 2) or (in1.nds == 3)):
                        graf1.dpmgrasp1(s1.pparti, s1.kipic, ' ION', ntime,
                                        999, nx, 2, 1, in1.ntsc, irc)
                        if (irc[0] == 1): break
                        irc[0] = 0

# push electrons with OpenMP: updates ppart, wke, kpic
        s1.push_electrons1(s1.ppart, s1.kpic)

        # push ions with OpenMP: updates pparti, wki, kipic
        if (in1.movion == 1):
            s1.push_ions1(s1.pparti, s1.kipic)

# start running simulation backwards:
# need to reverse time lag in leap-frog integration scheme
        if (in1.treverse == 1):
            if (((ntime + 1) == int(nloop / 2)) or ((ntime + 1) == nloop)):
                s1.es_time_reverse1()

# energy diagnostic: updates wt
        if (in1.ntw > 0):
            it = int(ntime / in1.ntw)
            if (ntime == in1.ntw * it):
                s1.energy_diag1(s1.wt, ntime, iuot)

# restart file
        if (in1.ntr > 0):
            n = ntime + 1
            it = int(n / in1.ntr)
            if (n == in1.ntr * it):
                dtimer(dtime, itime, -1)
                s1.bwrite_restart1(s1.iur, n)
                s1.dwrite_restart1(s1.iur)
                in1.writnml1(s1.iudm)
                dtimer(dtime, itime, 1)
                s1.tfield[0] += float(dtime)

    ntime = ntime + 1

    # loop time
    dtimer(dtime, ltime, 1)
    tloop = tloop + float(dtime)

    # * * * end main iteration loop * * *

    print(file=iuot)
    print("ntime, relativity = ", ntime, ",", in1.relativity, file=iuot)
    if (in1.treverse == 1):
        print("treverse = ", in1.treverse, file=iuot)

# print timing summaries
    s1.print_timings1(tinit, tloop, iuot)

    if ((in1.ntw > 0) or (in1.ntt > 0)):
        graf1.reset_graphs()

# trajectory diagnostic
    if (in1.ntt > 0):
        if ((in1.nst == 1) or (in1.nst == 2)):
            if (in1.nplot > 0):
                irc[0] = graf1.open_graphs(1)
            ts = in1.t0
            graf1.displaytr1(s1.partd, ts, in1.dt * float(in1.ntt), s1.itt, 2,
                             999, irc)
            if (irc[0] == 1):
                exit(0)
            graf1.reset_nplot(in1.nplot, irc)

# energy diagnostic
    if (in1.ntw > 0):
        ts = in1.t0
        # display energy histories
        graf1.displayw1(s1.wt, ts, in1.dt * float(in1.ntw), s1.itw, irc)
        if (irc[0] == 1):
            exit(0)
# pri   nt energy summaries
        s1.print_energy1(s1.wt, iuot)

# velocity diagnostic
    if (in1.ntv > 0):
        ts = in1.t0
        # display electron distribution time histories and entropy
        if ((in1.ndv == 1) or (in1.ndv == 3)):
            graf1.displayfvt1(s1.fvtm, ' ELECT', ts, in1.dt * float(in1.ntv),
                              s1.itv, irc)
            if (irc[0] == 1):
                exit(0)
# display ion distribution time histories and entropy
        if (in1.movion == 1):
            if ((in1.ndv == 2) or (in1.ndv == 3)):
                graf1.displayfvt1(s1.fvtmi, ' ION', ts,
                                  in1.dt * float(in1.ntv), s1.itv, irc)
            if (irc[0] == 1):
                exit(0)

# display final spectral analysis for ion density
    if (in1.movion == 1):
        if (in1.ntdi > 0):
            if ((in1.nddi == 2) or (in1.nddi == 3)):
                # display frequency spectrum
                graf1.dmscaler1(s1.wkdi, 'ION DENSITY OMEGA VS MODE', ntime,
                                999, 1, in1.modesxdi, s1.cwk, irc)
                if (irc[0] == 1):
                    exit(0)

# display final spectral analysis for potential
    if (in1.ntp > 0):
        if ((in1.ndp == 2) or (in1.ndp == 3)):
            # display frequency spectrum
            graf1.dmscaler1(s1.wk, 'POTENTIAL OMEGA VS MODE', ntime, 999, 2,
                            in1.modesxp, s1.cwk, irc)
            if (irc[0] == 1):
                exit(0)


# close diagnostics
    s1.close_diags1(s1.iudm)
    # close reset and restart files: iur, iurr, iur0
    s1.close_restart1()
    # close output file
    print(" * * * q.e.d. * * *", file=iuot)
    iuot.close()
    # close graphics device
    graf1.close_graphs()
def main(*args):
    # init GUI
    pc = PlasmaContext(in1, *args)  # Create GUI
    pc.showGraphs(
        True)  # enable graphics.  Setting to false will disable graphics
    pc.clearGraphList()  # remove all default graph options
    in1.timedirection = 0  # default state of the GUI.  MUST BE 0

    graf2 = GraphicsInterface(pc)

    # declare scalars for standard code
    npi = 0
    ws = numpy.zeros((1), float_type)

    # declare scalars for OpenMP code
    irc = numpy.zeros((1), int_type)

    # declare and initialize timing data
    tinit = 0.0
    tloop = 0.0
    itime = numpy.empty((4), numpy.int32)
    ltime = numpy.empty((4), numpy.int32)
    dtime = numpy.empty((1), double_type)

    # start timing initialization
    dtimer(dtime, itime, -1)

    # text output file
    fname = "output1." + s1.cdrun
    iuot = open(fname, "w")

    # in1.nvp = number of shared memory nodes (0=default)
    # in1.nvp = int(input("enter number of nodes: "))
    # initialize for shared memory parallel processing
    omplib.init_omp(in1.nvp)

    # open graphics device
    irc[0] = graf1.open_graphs(in1.nplot)

    # initialize scalars for standard code
    # np = total number of electrons in simulation
    np = s1.np
    # nx = number of grid points in x direction
    nx = s1.nx
    spectrum_scale = 2.0 * numpy.pi / float(nx)
    # npi = total number of ions in simulation
    if (in1.movion > 0):
        npi = s1.npi
    # nloop = number of time steps in simulation
    # nstart = initial time loop index
    # ntime = current time step
    nloop = s1.nloop
    nstart = 0
    ntime = 0

    # allocate field data for standard code:
    # qe/qi = electron/ion charge density with guard cells
    # fxe = smoothed electric field with guard cells
    # ffc = form factor array for poisson solver
    # mixup = bit reverse table for FFT
    # sct = sine/cosine table for FFT
    s1.init_fields1()

    # prepare fft tables: updates mixup, sct
    mfft1.mfft1_init(s1.mixup, s1.sct, in1.indx)
    # calculate form factors: updates ffc
    mfield1.mpois1_init(s1.ffc, in1.ax, s1.affp, nx)
    # initialize different ensemble of random numbers
    if (in1.nextrand > 0):
        minit1.mnextran1(in1.nextrand, in1.ndim, np + npi)

    # open reset and restart files; iur, iurr, iur0
    s1.open_restart1()

    # new start
    if (in1.nustrt == 1):
        # initialize electrons: updates ppart, kpic
        # ppart = tiled electron particle arrays
        # kpic = number of electrons in each tile
        s1.init_electrons1()

        # initialize background charge density: updates qi
        if (in1.movion == 0):
            s1.qi.fill(0.0)
            if (in1.ndprof > 0):
                qmi = -in1.qme
                mpush1.mpost1(s1.ppart, s1.qi, s1.kpic, qmi, s1.tdpost, in1.mx)
                mgard1.maguard1(s1.qi, s1.tguard, nx)

                # initialize ions: updates pparti, kipic
                # pparti = tiled on particle arrays
                # kipic = number of ions in each tile
                # cui = ion current density with guard cells
        if (in1.movion == 1):
            s1.init_ions1()

    # restart to continue a run which was interrupted
    elif (in1.nustrt == 2):
        s1.bread_restart1(s1.iur)
        ntime = s1.ntime
        nstart = ntime
    # start a new run with data from a previous run
    elif (in1.nustrt == 0):
        s1.bread_restart1(s1.iur0)
        ntime = s1.ntime

    # reverse simulation at end back to start
    if (in1.treverse == 1):
        nloop = 2 * nloop
        s1.nloop = nloop

    # initialize all diagnostics from namelist input parameters
    # wt = energy time history array=
    # pkw = power spectrum for potential
    # pkwdi = power spectrum for ion density
    # wk = maximum frequency as a function of k for potential
    # wkdi = maximum frequency as a function of k for ion density
    # fv/fvi = global electron/ion velocity distribution functions
    # fvm/fvmi = electron/ion vdrift, vth, entropy for global distribution
    # fvtm/fvtmi = time history of electron/ion vdrift, vth, and entropy
    # fvtp = velocity distribution function for test particles
    # fvmtp = vdrift, vth, and entropy for test particles
    # partd = trajectory time history array
    s1.initialize_diagnostics1(ntime)

    # read in restart diagnostic file to continue interrupted run
    if (in1.nustrt == 2):
        s1.dread_restart1(s1.iur)

    # write reset file
    s1.bwrite_restart1(s1.iurr, ntime)

    # initialization time
    dtimer(dtime, itime, 1)
    tinit = tinit + float(dtime)
    # start timing loop
    dtimer(dtime, ltime, -1)

    print >> iuot, "program mbeps1"
    """
    Initialize default windows
    """
    potentialimage = numpy.array([])
    initialize_menus(pc)
    PopMenus(pc, in1)
    # sends data the GUI may want to know about the simulation
    pc.updateSimInfo({"tend": in1.tend})  #End time of the simulation
    #
    # * * * start main iteration loop * * *
    for ntime in xrange(nstart, nloop):
        print >> iuot, "ntime = ", ntime
        curtime = ntime * in1.dt
        if ntime == nstart:
            pc.runOnce()
        pc.setTime(curtime, in1.dt)
        pc.getEvents()
        pc.fastForward()

        # debug reset
        #  if (ntime==nloop/2):
        #     s1.bread_restart1(s1.iurr)
        #     s1.reset_diags1()

        # deposit charge with OpenMP: updates qe
        dtimer(dtime, itime, -1)
        s1.qe.fill(0.0)
        dtimer(dtime, itime, 1)
        s1.tdpost[0] += float(dtime)
        mpush1.mpost1(s1.ppart, s1.qe, s1.kpic, in1.qme, s1.tdpost, in1.mx)
        # add guard cells: updates qe
        mgard1.maguard1(s1.qe, s1.tguard, nx)

        # electron density diagnostic: updates sfield=electron density
        if (in1.ntde > 0):
            it = int(ntime / in1.ntde)
            if (ntime == in1.ntde * it) or ntime:
                s1.edensity_diag1(s1.sfield)
                # display smoothed electron density
                graf2.dscaler1(s1.sfield,
                               ' EDENSITY',
                               in1.dt * ntime,
                               999,
                               0,
                               nx,
                               irc,
                               title='Electron Density vs X',
                               early=in1.ntde)
                if (irc[0] == 1):
                    break
                irc[0] = 0

                # deposit ion charge with OpenMP: updates qi
        if (in1.movion == 1):
            dtimer(dtime, itime, -1)
            s1.qi.fill(0.0)
            dtimer(dtime, itime, 1)
            s1.tdpost[0] += float(dtime)
            mpush1.mpost1(s1.pparti, s1.qi, s1.kipic, in1.qmi, s1.tdpost,
                          in1.mx)
            # add guard cells: updates qi
            mgard1.maguard1(s1.qi, s1.tguard, nx)

            # ion density diagnostic: updates sfield=ion density, pkwdi, wkdi
        if (in1.movion == 1):
            if (in1.ntdi > 0):
                it = int(ntime / in1.ntdi)
                if (ntime == in1.ntdi * it):
                    s1.idensity_diag1(s1.sfield, s1.pkwdi, s1.wkdi, ntime)
                    if ((in1.nddi == 1) or (in1.nddi == 3)):
                        # display smoothed ion density
                        graf2.dscaler1(s1.sfield,
                                       ' ION DENSITY',
                                       in1.dt * ntime,
                                       999,
                                       1,
                                       nx,
                                       irc,
                                       title='Ion Density vs X',
                                       early=in1.ntdi)
                        if (irc[0] == 1):
                            break
                        irc[0] = 0
                    # ion spectral analysis
                    if ((in1.nddi == 2) or (in1.nddi == 3)):
                        # display frequency spectrum
                        pc.showSimpleImage("ION DENSITY OMEGA VS MODE+",
                                           s1.pkwdi[1::, :, 0],
                                           "Time=" + str(ntime * in1.dt),
                                           extent=(1, in1.modesxdi, in1.wimin,
                                                   in1.wimax),
                                           title='Ion Density Omega vs Mode +',
                                           early=in1.ntdi,
                                           ticks_scale=spectrum_scale)
                        pc.showSimpleImage("ION DENSITY OMEGA VS MODE-",
                                           s1.pkwdi[1::, :, 1],
                                           "Time=" + str(ntime * in1.dt),
                                           extent=(1, in1.modesxdi, in1.wimin,
                                                   in1.wimax),
                                           title='Ion Density Omega vs Mode -',
                                           early=in1.ntdi,
                                           ticks_scale=spectrum_scale)
                        graf1.dmscaler1(s1.wkdi, 'ION DENSITY OMEGA VS MODE',
                                        ntime, 999, 1, in1.modesxdi, s1.cwk,
                                        irc)
                        if (irc[0] == 1):
                            break
                        irc[0] = 0

                        # add electron and ion densities: updates qe
        mfield1.maddqei1(s1.qe, s1.qi, s1.tfield, nx)

        # transform charge to fourier space: updates qe
        isign = -1
        mfft1.mfft1r(s1.qe, isign, s1.mixup, s1.sct, s1.tfft, in1.indx)

        # calculate force/charge in fourier space: updates fxe, we
        mfield1.mpois1(s1.qe, s1.fxe, s1.ffc, s1.we, s1.tfield, nx)

        # transform force to real space: updates fxe
        isign = 1
        mfft1.mfft1r(s1.fxe, isign, s1.mixup, s1.sct, s1.tfft, in1.indx)

        # add external traveling wave field
        ts = in1.dt * float(ntime)
        mfield1.meaddext1(s1.fxe, s1.tfield, in1.amodex, in1.freq, ts,
                          in1.trmp, in1.toff, in1.el0, in1.er0, nx)

        # copy guard cells: updates fxe
        mgard1.mdguard1(s1.fxe, s1.tguard, nx)

        # potential diagnostic: updates sfield=potential, pkw, wk
        if (in1.ntp > 0):
            it = int(ntime / in1.ntp)
            if (ntime == in1.ntp * it):
                s1.potential_diag1(s1.sfield, s1.pkw, s1.wk, ntime)
                if ((in1.ndp == 1) or (in1.ndp == 3)):
                    # display potential
                    graf2.dscaler1(s1.sfield,
                                   ' POTENTIAL',
                                   ntime * in1.dt,
                                   999,
                                   0,
                                   nx,
                                   irc,
                                   title='Potential vs X',
                                   early=in1.ntp)
                    if (irc[0] == 1):
                        break
                    irc[0] = 0
                # spectral analysis
                if ((in1.ndp == 2) or (in1.ndp == 3)):
                    # display frequency spectrum
                    pc.showSimpleImage("POTENTIAL OMEGA VS MODE+",
                                       s1.pkw[::, :, 0],
                                       "Time=" + str(ntime * in1.dt),
                                       extent=(0, in1.modesxp, in1.wmin,
                                               in1.wmax),
                                       title="Potential: Omega vs Mode +",
                                       early=in1.ntp,
                                       ticks_scale=spectrum_scale)
                    pc.showSimpleImage("POTENTIAL OMEGA VS MODE-",
                                       s1.pkw[::, :, 1],
                                       "Time=" + str(ntime * in1.dt),
                                       extent=(0, in1.modesxp, in1.wmin,
                                               in1.wmax),
                                       title="Potential: Omega vs Mode -",
                                       early=in1.ntp,
                                       ticks_scale=spectrum_scale)
                    graf1.dmscaler1(s1.wk, 'POTENTIAL OMEGA VS MODE', ntime,
                                    999, 2, in1.modesxp, s1.cwk, irc)
                    if (irc[0] == 1):
                        break
                    irc[0] = 0
                # Potential vs Time
                potentialimage = numpy.append(potentialimage, s1.sfield[0:nx])
                randim = scaleByColumn(
                    numpy.reshape(potentialimage,
                                  (len(potentialimage) / nx, nx)))
                pc.showSimpleImage('POTENTIALvTIME',
                                   numpy.transpose(randim),
                                   "Time=" + str(ntime * in1.dt),
                                   extent=(0, ntime * in1.dt, 0, nx),
                                   title="Potential vs Time",
                                   early=in1.ntp,
                                   norm=None)

                # longitudinal efield diagnostic: updates sfield=longitudinal efield
        if (in1.ntel > 0):
            it = int(ntime / in1.ntel)
            if (ntime == in1.ntel * it):
                s1.elfield_diag1(s1.sfield)
                # display longitudinal efield
                graf2.dscaler1(s1.sfield,
                               ' ELFIELD',
                               in1.dt * ntime,
                               999,
                               0,
                               nx,
                               irc,
                               title='Longitudinal E-Field',
                               early=in1.ntel)
                if (irc[0] == 1):
                    break
                irc[0] = 0

                # velocity diagnostic:
        if (in1.ntv > 0):
            it = int(ntime / in1.ntv)
            if (ntime == in1.ntv * it):
                # updates ppart, kpic, fv, fvm, fvtm
                s1.evelocity_diag1(s1.ppart, s1.kpic, s1.fv, s1.fvm, s1.fvtm)
                # display electron velocity distributions
                if ((in1.ndv == 1) or (in1.ndv == 3)):
                    graf2.displayfv1(s1.fv,
                                     s1.fvm,
                                     'ELECTRON VEL',
                                     ntime,
                                     in1.nmv,
                                     1,
                                     irc,
                                     title='Electron Velocity Histogram',
                                     early=in1.ntv)
                    if (irc[0] == 1):
                        break
                    irc[0] = 0
                if (in1.movion == 1):
                    # updates pparti, kipic, fvi, fvmi, fvtmi
                    s1.ivelocity_diag1(s1.pparti, s1.kipic, s1.fvi, s1.fvmi,
                                       s1.fvtmi)
                    # display ion velocity distributions
                    if ((in1.ndv == 2) or (in1.ndv == 3)):
                        graf2.displayfv1(s1.fvi,
                                         s1.fvmi,
                                         'ION VEL',
                                         ntime,
                                         in1.nmv,
                                         1,
                                         irc,
                                         title="Ion Velocity Histogram",
                                         early=in1.ntv)
                        if (irc[0] == 1):
                            break
                        irc[0] = 0

                        # trajectory diagnostic: updates ppart, kpic, partd, fvtp, fvmtp
        if (in1.ntt > 0):
            it = int(ntime / in1.ntt)
            if (ntime == in1.ntt * it):
                s1.traj_diag1(s1.ppart, s1.kpic, s1.partd, s1.fvtp, s1.fvmtp)
                if (in1.nst == 3):
                    print "Moments are ", s1.fvmtp
                    # display velocity distributions
                    graf2.displayfv1(
                        s1.fvtp,
                        s1.fvmtp,
                        'ELECTRON TRAJ',
                        ntime,
                        in1.nmv,
                        1,
                        irc,
                        title='Electron Trajectory Velocity Histogram',
                        early=in1.ntt)
                    if (irc[0] == 1):
                        break
                    irc[0] = 0
                elif in1.nst == 2 or in1.nst == 1:
                    #Plot multiple particle trajectories
                    pc.showMultiTrajectories("ELECTRON TRAJ", s1.partd, s1.itt, in1.t0, \
                        in1.ntt*in1.dt, 1, title='Test Electron Trajectories', early=in1.ntt)

                    # phase space diagnostic
        if (in1.nts > 0):
            it = int(ntime / in1.nts)
            if (ntime == in1.nts * it):
                # plot electrons vx versus x
                if ((in1.nds == 1) or (in1.nds == 3)):
                    phaselabels = False
                    if in1.ntsc > 0:  # Do we have labelled particles to draw?
                        phaselabels = True
                    graf2.dpmgrasp1(s1.ppart,
                                    s1.kpic,
                                    'ELECTRON Vx vs X',
                                    ntime,
                                    999,
                                    nx,
                                    2,
                                    1,
                                    in1.ntsc,
                                    irc,
                                    early=in1.nts,
                                    twophase=phaselabels)
                    if (irc[0] == 1):
                        break
                    irc[0] = 0
                # ion phase space
                if (in1.movion == 1):
                    # plot ions vx versus x
                    if ((in1.nds == 2) or (in1.nds == 3)):
                        graf2.dpmgrasp1(s1.pparti,
                                        s1.kipic,
                                        'ION Vx vs X',
                                        ntime,
                                        999,
                                        nx,
                                        2,
                                        1,
                                        in1.ntsc,
                                        irc,
                                        early=in1.nts)
                        if (irc[0] == 1):
                            break
                        irc[0] = 0

                        # push electrons with OpenMP: updates ppart, wke, kpic
        s1.push_electrons1(s1.ppart, s1.kpic)

        # push ions with OpenMP: updates pparti, wki, kipic
        if (in1.movion == 1):
            s1.push_ions1(s1.pparti, s1.kipic)

            # start running simulation backwards:
            # need to reverse time lag in leap-frog integration scheme
        if (in1.treverse == 1):
            if (((ntime + 1) == (nloop / 2)) or ((ntime + 1) == nloop)):
                s1.es_time_reverse1()

                # energy diagnostic: updates wt
        if (in1.ntw > 0):
            it = int(ntime / in1.ntw)
            if (ntime == in1.ntw * it):
                s1.energy_diag1(s1.wt, ntime, iuot)
                pc.showEnergy(
                    in1.ntw * numpy.array(range(it)) * in1.dt,
                    s1.wt,
                    it,
                    ["Total Field", "Kinetic", "Kinetic Ions", "Total Energy"],
                    title='Energy vs Time',
                    early=in1.ntw)

                # restart file
        if (in1.ntr > 0):
            n = ntime + 1
            it = int(n / in1.ntr)
            if (n == in1.ntr * it):
                dtimer(dtime, itime, -1)
                s1.bwrite_restart1(s1.iur, n)
                s1.dwrite_restart1(s1.iur)
                dtimer(dtime, itime, 1)
                s1.tfield[0] += float(dtime)

    ntime = ntime + 1
    # loop time
    dtimer(dtime, ltime, 1)
    tloop = tloop + float(dtime)

    # * * * end main iteration loop * * *

    print >> iuot
    print >> iuot, "ntime, relativity = ", ntime, ",", in1.relativity
    if (in1.treverse == 1):
        print >> iuot, "treverse = ", in1.treverse

    # print timing summaries
    s1.print_timings1(tinit, tloop, iuot)

    if ((in1.ntw > 0) or (in1.ntt > 0)):
        graf1.reset_graphs()

    # trajectory diagnostic
    if (in1.ntt > 0):
        if ((in1.nst == 1) or (in1.nst == 2)):
            if (in1.nplot > 0):
                irc[0] = graf1.open_graphs(1)
            ts = in1.t0
            graf1.displaytr1(s1.partd, ts, in1.dt * float(in1.ntt), s1.itt, 2,
                             3, irc)
            if (irc[0] == 1):
                exit(0)
            graf1.reset_nplot(in1.nplot, irc)

    # energy diagnostic
    if (in1.ntw > 0):
        ts = in1.t0
        # display energy histories
        graf1.displayw1(s1.wt, ts, in1.dt * float(in1.ntw), s1.itw, irc)
        if (irc[0] == 1):
            exit(0)
        # print energy summaries
        s1.print_energy1(s1.wt, iuot)

    # velocity diagnostic
    if (in1.ntv > 0):
        ts = in1.t0
        # display electron distribution time histories and entropy
        graf1.displayfvt1(s1.fvtm, ' ELECT', ts, in1.dt * float(in1.ntv),
                          s1.itv, irc)
        if (irc[0] == 1):
            exit(0)
        # display ion distribution time histories and entropy
        if (in1.movion == 1):
            graf1.displayfvt1(s1.fvtmi, ' ION', ts, in1.dt * float(in1.ntv),
                              s1.itv, irc)
            if (irc[0] == 1):
                exit(0)

    # display final spectral analysis for ion density
    if (in1.movion == 1):
        if (in1.ntdi > 0):
            if ((in1.nddi == 2) or (in1.nddi == 3)):
                # display frequency spectrum
                graf1.dmscaler1(s1.wkdi, 'ION DENSITY OMEGA VS MODE', ntime,
                                999, 1, in1.modesxdi, s1.cwk, irc)
                if (irc[0] == 1):
                    exit(0)

    # display final spectral analysis for potential
    if (in1.ntp > 0):
        if ((in1.ndp == 2) or (in1.ndp == 3)):
            # display frequency spectrum
            graf1.dmscaler1(s1.wk, 'POTENTIAL OMEGA VS MODE', ntime, 999, 2,
                            in1.modesxp, s1.cwk, irc)
            if (irc[0] == 1):
                exit(0)

    # close diagnostics
    s1.close_diags1(s1.iudm)
    # close reset and restart files: iur, iurr, iur0
    s1.close_restart1()
    pc.wait(in1)
    # close output file
    print >> iuot, " * * * q.e.d. * * *"
    iuot.close()
    # close graphics device
    graf1.close_graphs()