Beispiel #1
0
 def SparsePoisson(self):
     u = SparseGridEff3D(self.Lengths[0],self.Lengths[1],self.Lengths[2],self.n,interp_mode=self.imode,shape_mode=self.smode)
     
     ct = 0
     for i in range(1,self.n+1):
         for j in range(1,self.n+2-i):
             #p = self.np2grids[ct].reshape((2**(self.n+2-i-j),2**j,2**i)).transpose()
             p = self.RegularGrid(2**i, 2**j, 2**(self.n+2-i-j))
             up = SO.Poisson3Dperiodic(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
             u.np2grids[ct] = up.transpose().reshape(2**(self.n+2))                
             ct += 1 
     
     ct = 0
     for i in range(1,self.n):
         for j in range(1,self.n+1-i):
             #p = self.np1grids[ct].reshape((2**(self.n+1-i-j),2**j,2**i)).transpose()
             p = self.RegularGrid(2**i,2**j,2**(self.n+1-i-j))
             up = SO.Poisson3Dperiodic(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
             u.np1grids[ct] = up.transpose().reshape(2**(self.n+1))                
             ct += 1
     
     ct = 0
     for i in range(1,self.n-1):
         for j in range(1,self.n-i):
             #p = self.ngrids[ct].reshape((2**(self.n-i-j),2**j,2**i)).transpose()
             p = self.RegularGrid(2**i,2**j,2**(self.n-i-j))
             up = SO.Poisson3Dperiodic(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
             u.ngrids[ct] = up.transpose().reshape(2**(self.n))                
             ct += 1
     return u
Beispiel #2
0
 def resid(self,Lphinew,i):
     phinew = SO.Poisson2Dperiodic(Lphinew,self.DomLenX,self.DomLenY)
     Enew = np.zeros((self.ncelx,self.ncely,2))
     Enew[:,:,1], Enew[:,:,0] = SO.SpectralDerivative2D(-1.*phinew,self.DomLenX,self.DomLenY)
     self.Epar = self.IPVec(0.5*(Enew+self.E[i]))
     vnew = self.v + self.dt*self.chrg*self.Epar
     j = self.chrg*self.IGVec(0.5*(vnew+self.v))
     return Lphinew - self.LaplacePhi - self.dt*self.DomLenX*self.DomLenY*self.Div(j)
Beispiel #3
0
 def ComputeFieldPoisson(self, i):
     self.phi[i] = SO.Poisson2Dperiodic(
         self.chrg * (self.rho[i] - np.mean(self.rho[i])) * self.DomLenX *
         self.DomLenY, self.DomLenX, self.DomLenY)
     self.E[i, :, :,
            1], self.E[i, :, :,
                       0] = SO.SpectralDerivative2D(-1. * self.phi[i],
                                                    self.DomLenX,
                                                    self.DomLenY)
Beispiel #4
0
 def SparsePoisson(self):
     u = SparseGridEff2D(self.Lx,self.Ly,self.n,interp_mode=self.imode,shape_mode=self.smode)
     for i in range(self.n):
         p = self.RegularGrid(self.ncelxp[i],self.ncelyp[i])
         up = SO.Poisson2Dperiodic(p,self.Lx,self.Ly)
         u.pgrids[i] = up.transpose().reshape(2**(self.n+1))
     for i in range(self.n-1):
         p = self.RegularGrid(self.ncelxm[i],self.ncelym[i])
         up = SO.Poisson2Dperiodic(p,self.Lx,self.Ly)
         u.mgrids[i] = up.transpose().reshape(2**self.n)
     return u
Beispiel #5
0
 def SparsePoisson(self):
     u = SparseGridEff2D(self.Lx,self.Ly,self.n)
     for i in range(self.n):
         p = self.pgrids[i].reshape((2**(self.n-i),2**(i+1))).transpose()
         up = SO.Poisson2Dperiodic(p,self.Lx,self.Ly)
         u.pgrids[i] = up.transpose().reshape(2**(self.n+1))
     for i in range(self.n-1):
         p = self.mgrids[i].reshape((2**(self.n-i-1),2**(i+1))).transpose()
         up = SO.Poisson2Dperiodic(p,self.Lx,self.Ly)
         u.mgrids[i] = up.transpose().reshape(2**self.n)
     return u
Beispiel #6
0
 def SparseDerivative(self):
     fx = SparseGridEff2D(self.Lx,self.Ly,self.n,interp_mode=self.imode,shape_mode=self.smode)
     fy = SparseGridEff2D(self.Lx,self.Ly,self.n,interp_mode=self.imode,shape_mode=self.smode)
     for i in range(self.n):
         p = self.RegularGrid(self.ncelxp[i],self.ncelyp[i])
         fyp, fxp = SO.SpectralDerivative2D(p,self.Lx,self.Ly)
         fx.pgrids[i] = fxp.transpose().reshape(2**(self.n+1)); fy.pgrids[i] = fyp.transpose().reshape(2**(self.n+1))
     for i in range(self.n-1):
         p = self.RegularGrid(self.ncelxm[i],self.ncelym[i])
         fyp, fxp = SO.SpectralDerivative2D(p,self.Lx,self.Ly)
         fx.mgrids[i] = fxp.transpose().reshape(2**(self.n)); fy.mgrids[i] = fyp.transpose().reshape(2**(self.n))
     return fx, fy
Beispiel #7
0
 def SparseDerivative(self):
     fx = SparseGridEff2D(self.Lx,self.Ly,self.n)
     fy = SparseGridEff2D(self.Lx,self.Ly,self.n)
     for i in range(self.n):
         p = self.pgrids[i].reshape((2**(self.n-i),2**(i+1))).transpose()
         fyp, fxp = SO.SpectralDerivative2D(p,self.Lx,self.Ly)
         fx.pgrids[i] = fxp.transpose().reshape(2**(self.n+1)); fy.pgrids[i] = fyp.transpose().reshape(2**(self.n+1))
     for i in range(self.n-1):
         p = self.mgrids[i].reshape((2**(self.n-i-1),2**(i+1))).transpose()
         fyp, fxp = SO.SpectralDerivative2D(p,self.Lx,self.Ly)
         fx.mgrids[i] = fxp.transpose().reshape(2**(self.n)); fy.mgrids[i] = fyp.transpose().reshape(2**(self.n))
     return fx, fy
Beispiel #8
0
    def Initialize(self,N):
        self.xi, self.vi, self.xe, self.ve = self.IDatGen(N,self.DomLen)
        self.parwtse = np.ones_like(self.xe); self.parwtsi = np.ones_like(self.xi)
        self.InterpGridHydros(0)
#        self.phi[0] = SO.Poisson2Dperiodic(self.chrge*(self.rho[0] - np.mean(self.rho[0]))*self.DomLenX*self.DomLenY,self.DomLenX,self.DomLenY)
        self.phi[0] = SO.Poisson1Dperiodic(self.rho[0],self.DomLen)
        self.E[0,:] = SO.SpectralDerivative(-1.*self.phi[0],self.DomLen)
        
        ## Do an initial backward half-step to offset positions and velocities in time
        self.Epare, self.Epari = self.IPVec(self.E[0])
        dt_tmp = -1.*0.5*self.dt

        self.vi += dt_tmp*self.chrgi*self.Epari
        self.ve += dt_tmp*self.chrge*self.Epare
Beispiel #9
0
 def ComputeFieldPoisson(self, i):
     if self.field_solve == 'fast':
         PoissRHS = self.chrg * (
             self.rho[i] - self.rho[i].Mean()) * self.DomLenX * self.DomLenY
         self.phi[i] = PoissRHS.SparsePoisson()
         self.Ex[i], self.Ey[i] = self.phi[i].SparseDerivative()
         self.Ex[i] = -1. * self.Ex[i]
         self.Ey[i] = -1. * self.Ey[i]
     else:
         rhoreg = self.rho[i].RegularGrid(self.ncxf, self.ncyf)
         self.phi[i] = SO.Poisson2Dperiodic(
             self.chrg * (rhoreg - np.mean(rhoreg)) * self.DomLenX *
             self.DomLenY, self.DomLenX, self.DomLenY)
         self.Ey[i], self.Ex[i] = SO.SpectralDerivative2D(
             -1. * self.phi[i], self.DomLenX, self.DomLenY)
Beispiel #10
0
    def SparseDerivative(self):
        fx = SparseGridEff3D(self.Lengths[0],self.Lengths[1],self.Lengths[2],self.n,interp_mode=self.imode,shape_mode=self.smode)
        fy = SparseGridEff3D(self.Lengths[0],self.Lengths[1],self.Lengths[2],self.n,interp_mode=self.imode,shape_mode=self.smode)
        fz = SparseGridEff3D(self.Lengths[0],self.Lengths[1],self.Lengths[2],self.n,interp_mode=self.imode,shape_mode=self.smode)
        
        ct = 0
        for i in range(1,self.n+1):
            for j in range(1,self.n+2-i):
                #p = self.np2grids[ct].reshape((2**(self.n+2-i-j),2**j,2**i)).transpose()
                p = self.RegularGrid(2**i, 2**j, 2**(self.n+2-i-j))
                fxp, fyp, fzp = SO.SpectralDerivative3D(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
                fx.np2grids[ct] = fxp.transpose().reshape(2**(self.n+2))  
                fy.np2grids[ct] = fyp.transpose().reshape(2**(self.n+2))
                fz.np2grids[ct] = fzp.transpose().reshape(2**(self.n+2))
                ct += 1 
        
        ct = 0
        for i in range(1,self.n):
            for j in range(1,self.n+1-i):
                #p = self.np1grids[ct].reshape((2**(self.n+1-i-j),2**j,2**i)).transpose()
                p = self.RegularGrid(2**i,2**j,2**(self.n+1-i-j))
                fxp, fyp, fzp = SO.SpectralDerivative3D(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
                fx.np1grids[ct] = fxp.transpose().reshape(2**(self.n+1))   
                fy.np1grids[ct] = fyp.transpose().reshape(2**(self.n+1))  
                fz.np1grids[ct] = fzp.transpose().reshape(2**(self.n+1))  
                ct += 1
        
        ct = 0
        for i in range(1,self.n-1):
            for j in range(1,self.n-i):
                #p = self.ngrids[ct].reshape((2**(self.n-i-j),2**j,2**i)).transpose()
                p = self.RegularGrid(2**i,2**j,2**(self.n-i-j))
                fxp, fyp, fzp = SO.SpectralDerivative3D(p,self.Lengths[0],self.Lengths[1],self.Lengths[2])
                fx.ngrids[ct] = fxp.transpose().reshape(2**(self.n))    
                fy.ngrids[ct] = fyp.transpose().reshape(2**(self.n))  
                fz.ngrids[ct] = fzp.transpose().reshape(2**(self.n))  
                ct += 1

        return fx, fy, fz
Beispiel #11
0
    def Initialize(self, N):
        self.x, self.v = self.IDatGen(N, self.DomLenX, self.DomLenY)
        self.InterpGridHydros(0)
        self.phi[0] = SO.Poisson2Dperiodic(
            self.chrg * (self.rho[0] - np.mean(self.rho[0])) * self.DomLenX *
            self.DomLenY, self.DomLenX, self.DomLenY)
        self.E[0, :, :,
               1], self.E[0, :, :,
                          0] = SO.SpectralDerivative2D(-1. * self.phi[0],
                                                       self.DomLenX,
                                                       self.DomLenY)

        ## Do an initial backward half-step to offset positions and velocities in time
        self.Epar = self.IPVec(self.E[0])
        dt_tmp = -0.5 * self.dt
        self.v += 0.5 * dt_tmp * self.chrg * self.Epar
        t = self.chrg * self.B * dt_tmp / 2.0
        s = 2.0 * t / (1.0 + t * t)
        c = (1 - t * t) / (1 + t * t)
        vnewx = self.v[:, 0] * c - self.v[:, 1] * s
        vnewy = self.v[:, 0] * s + self.v[:, 1] * c
        self.v[:, 0] = vnewx
        self.v[:, 1] = vnewy
        self.v += 0.5 * dt_tmp * self.chrg * self.Epar
    def Initialize(self,N):
        self.xi, self.vi, self.parwtsi, self.f0i, self.xe, self.ve, self.parwtsi, self.f0e = self.IDatGen(N,self.DomLenX,self.DomLenY, 5.)
        self.InterpGridHydros(0)
#        self.phi[0] = SO.Poisson2Dperiodic(self.chrge*(self.rho[0] - np.mean(self.rho[0]))*self.DomLenX*self.DomLenY,self.DomLenX,self.DomLenY)
        self.phi[0] = SO.Poisson2Dperiodic(self.rho[0],self.DomLenX,self.DomLenY)
        self.E[0,:,:,1], self.E[0,:,:,0] = SO.SpectralDerivative2D(-1.*self.phi[0],self.DomLenX,self.DomLenY)
        
        ## Do an initial backward half-step to offset positions and velocities in time
        self.Epare, self.Epari = self.IPVec(self.E[0])
        dt_tmp = -1.*0.5*self.dt

        self.vi += 0.5*dt_tmp*self.chrgi*self.Epari
        t = self.chrgi*self.B*dt_tmp/2.0; s = 2.0*t/(1.0 + t*t); c = (1-t*t)/(1+t*t)
        vnewx = self.vi[:,0]*c - self.vi[:,1]*s
        vnewy = self.vi[:,0]*s + self.vi[:,1]*c
        self.vi[:,0] = vnewx; self.vi[:,1] = vnewy
        self.vi += 0.5*dt_tmp*self.chrgi*self.Epari
        
        self.ve += 0.5*dt_tmp*self.chrge*self.Epare
        t = self.chrge*self.B*dt_tmp/2.0; s = 2.0*t/(1.0 + t*t); c = (1-t*t)/(1+t*t)
        vnewx = self.ve[:,0]*c - self.ve[:,1]*s
        vnewy = self.ve[:,0]*s + self.ve[:,1]*c
        self.ve[:,0] = vnewx; self.ve[:,1] = vnewy
        self.ve += 0.5*dt_tmp*self.chrge*self.Epare
Beispiel #13
0
 def ComputeFieldPoisson(self,i):
     self.phi = SO.Poisson3Dperiodic(self.chrg*(self.rho - np.mean(self.rho))*self.DomLenX*self.DomLenY*self.DomLenZ,self.DomLenX,self.DomLenY,self.DomLenZ)
     self.E[:,:,:,0], self.E[:,:,:,1], self.E[:,:,:,2] = SO.SpectralDerivative3D(-1.*self.phi,self.DomLenX,self.DomLenY,self.DomLenZ)
Beispiel #14
0
 def Initialize(self):
     #self.x, self.v = self.IDatGen(N,self.DomLenX,self.DomLenY,self.DomLenZ)
     self.InterpGridHydros(0)
     self.phi = SO.Poisson3Dperiodic(self.chrg*(self.rho - np.mean(self.rho))*self.DomLenX*self.DomLenY*self.DomLenZ,self.DomLenX,self.DomLenY,self.DomLenZ)
     self.E[:,:,:,0], self.E[:,:,:,1], self.E[:,:,:,2] = SO.SpectralDerivative3D(-1.*self.phi,self.DomLenX,self.DomLenY,self.DomLenZ)
Beispiel #15
0
 def Div(self,F):
     Fx_x, Fx_y, Fx_z = SO.SpectralDerivative3D(F[:,:,0],self.DomLenX,self.DomLenY,self.DomLenZ)
     Fy_x, Fy_y, Fy_z = SO.SpectralDerivative3D(F[:,:,1],self.DomLenX,self.DomLenY,self.DomLenZ)
     Fz_x, Fz_y, Fz_z = SO.SpectralDerivative3D(F[:,:,2],self.DomLenX,self.DomLenY,self.DomLenZ)
     return Fx_x+Fy_y+Fz_z
Beispiel #16
0
 def Div(self, F):
     Fx_y, Fx_x = SO.SpectralDerivative2D(F[:, :, 0], self.DomLenX,
                                          self.DomLenY)
     Fy_y, Fy_x = SO.SpectralDerivative2D(F[:, :, 1], self.DomLenX,
                                          self.DomLenY)
     return Fx_x + Fy_y