I don't know anything about plasma physics, but this entire code is in
global scope and uses a bunch of non-const global arrays. This is the very
first thing the performance tips warn against:

http://julia.readthedocs.org/en/latest/manual/performance-tips/

Refactor your code into functions that take arguments and return values
instead of operating on globals.

On Mon, Sep 28, 2015 at 10:54 PM, John Gibson <johnfgib...@gmail.com> wrote:

> Marius: I think you'd be better off in learning to write fast Julia code
> if you presented an straightforward implementation of a classic PDE problem
> and asked for help in optimizing that. Maybe 2D heat equation would be a
> good place to start. The code you've presented is not really intelligible
> without a better description of the equations, the boundary conditions, the
> discretization methods, more detailed comments, explanations of magic
> numbers, etc. And requiring plasma physics expertise makes your audience
> here too small,  probably.
>
> best regards,
>
> John
>
>
>
> On Monday, September 28, 2015 at 10:14:32 PM UTC-4, Marius wrote:
>>
>> Hi everybody,
>>
>> I wrote a simulation code for Plasma Actuator. This is based on my
>> previous code written in Python and uses Suzen model combined with
>> Navier-Stokes equations. It's about 5 times faster than Python but still
>> simulation takes days to finish. I am new to Julia and I tried to follow
>> the performance tips but so far this is how much I could do. Any
>> suggestions for improving speed are highly appreciated. This is the code:
>>
>>
>> using PyPlot
>> using PyCall
>>
>> const nx=441
>> const ny=441
>> const nt=100
>> const Length=0.011#11 mm
>> const dx=Length/(nx-1)
>> const dy=Length/(ny-1)
>> x=linspace(-Length/2,Length/2,nx)
>> y=linspace(-Length/2,Length/2,ny)
>> ################################
>> phi1 = zeros(ny,nx) #potential
>> eps=zeros(ny,nx)#permitivity
>> roc=ones(ny,nx)#charge
>> ld=ones(ny,nx)#Debye length
>> ############### All Electrodes ########################
>> # initial boundary conditions
>> phi1[221:222,49:57]=1400.0
>> phi1[218:219,57:97]=0.0
>> #phi1[221:222,97:105]=0.0
>> phi1[221:222,145:153]=1400.0
>> phi1[218:219,153:193]=0.0
>> #phi1[221:222,193:201]=0.0
>> #phi1[221:222,241:249]=0.0
>> phi1[218:219,249:289]=0.0
>> phi1[221:222,289:297]=1400.0
>> #phi1[221:222,337:345]=0.0
>> phi1[218:219,345:385]=0.0
>> phi1[221:222,385:393]=1400.0
>> eps[1:220,:]=2.7
>> eps[221:end,:]=1.0
>>
>> eps[221:221,:]=(eps[222:222,1:end].*eps[220:220,1:end])./(((dx/(2*dx))*eps[222:222,1:end])+
>>             (((dx/(2*dx))*eps[220:220,1:end])))
>> ###############################################################
>> #convergence parameters
>> to1=1e-8
>> ###Gauss-Seidel solver
>> max_phi1_diff=1
>> while max_phi1_diff > to1
>>   phi1_old=copy(phi1)
>>   phi1[2:nx-1,2:ny-1]=((eps[2:nx-1,2:ny-1].*((phi1[3:nx,2:ny-1]/(dx^2))+
>>
>> (phi1[2:nx-1,3:ny]/(dy^2)))+((eps[1:nx-2,2:ny-1].*phi1[1:nx-2,2:ny-1])/(dx^2))+
>>
>> ((eps[2:nx-1,1:ny-2].*phi1[2:nx-1,1:ny-2]/(dy^2)))))./(((eps[2:nx-1,2:ny-1]+
>>                     eps[1:nx-2,2:ny-1])/(dx^2))+
>>                     ((eps[2:nx-1,2:ny-1]+eps[2:nx-1,1:ny-2])/(dy^2)))
>>   phi1[end,:]=phi1[end-1,:]
>>   phi1[1,:]=phi1[2,:]
>>   phi1[:,end]=phi1[:,end-1]
>>   phi1[:,1]=phi1[:,2]
>>   phi1[221:222,49:57]=1400.0
>>   phi1[218:219,57:97]=0.0
>>   #phi1[221:222,97:105]=0.0
>>   phi1[221:222,145:153]=1400.0
>>   phi1[218:219,153:193]=0.0
>>   #phi1[221:222,193:201]=0.0
>>   #phi1[221:222,241:249]=0.0
>>   phi1[218:219,249:289]=0.0
>>   phi1[221:222,289:297]=1400.0
>>   #phi1[221:222,337:345]=0.0
>>   phi1[218:219,345:385]=0.0
>>   phi1[221:222,385:393]=1400.0
>>   eps[1:220,:]=2.7
>>   eps[221:end,:]=1.0
>>   phi1_diff = phi1.-phi1_old
>>   max_phi1_diff=maximum(abs(phi1_diff))
>> end
>>
>> fig = plt.figure(figsize = (11,7), dpi=100)
>> plt.contourf(x*1000,y*1000,phi1,50)
>> cbar = plt.colorbar()
>> savefig("wflow1368AC29SeptemberElectricField.png")
>> ################ CHARGE  ####################
>> ld[221:end,:]=0.00017 #Debye lenght
>> ld[1:220,:]=10000.0#Debye lenght
>> roc[218:219,57:97]=0.00750
>> roc[218:219,153:193]=0.00750
>> roc[218:219,249:289]=0.00750
>> roc[218:219,345:385]=0.00750
>> eps[1:220,:]=2.7
>> eps[221:end,:]=1.0
>>
>> eps[221:221,:]=(eps[222:222,1:end].*eps[220:220,1:end])./(((dx/(2*dx))*eps[222:222,1:end])+
>>             (((dx/(2*dx))*eps[220:220,1:end])))
>> roc[:,end] =0
>> roc[end,:] = 0
>> roc[:,1] =0
>> roc[1,:] = 0
>> #convergence parameters
>> to1=1e-8
>> ###Gauss-Seidel solver
>> max_roc_diff=1
>> while max_roc_diff > to1
>>   roc_old=copy(roc)
>>
>> roc[2:nx-1,2:ny-1]=((eps[2:nx-1,2:ny-1].*((roc[3:nx,2:ny-1]/(dx^2)).+(roc[2:nx-1,3:ny]/dy^2)))+
>>                         ((eps[1:nx-2,2:ny-1].*roc[1:nx-2,2:ny-1])/dx^2)+
>>
>> ((eps[2:nx-1,1:ny-2].*roc[2:nx-1,1:ny-2])/dy^2))./(((eps[2:nx-1,2:ny-1].+eps[1:nx-2,2:ny-1])/dx^2)+
>>
>> ((eps[2:nx-1,2:ny-1]+eps[2:nx-1,1:ny-2])/dy^2)+(1./(ld[2:nx-1,2:ny-1].^2)))
>>   ld[221:end,:]=0.00017 #charge
>>   ld[1:220,:]=10000.0#Debye lenght
>>   roc[218:219,57:97]=0.00750
>>   roc[218:219,153:193]=0.00750
>>   roc[218:219,249:289]=0.00750
>>   roc[218:219,345:385]=0.00750
>>   roc_diff = roc.-roc_old
>>   max_roc_diff=maximum(abs(roc_diff))
>> end
>>
>> fig = plt.figure(figsize = (11,7), dpi=100)
>> plt.contourf(x*1000,y*1000,roc,50)
>> cbar = plt.colorbar()
>> savefig("wflow1368AC29SeptemberCharge.png")
>> ######### BODY FORCE #######
>> F1=ones(ny,nx)
>> Fx1=ones(ny,nx)
>> Fy1=ones(ny,nx)
>>
>> F1[2:nx-1,2:ny-1]=roc[2:nx-1,2:ny-1].*(-(((phi1[2:nx-1,2:ny-1]-phi1[1:nx-2,2:ny-1])/dx)+((phi1[2:nx-1,2:ny-1]-phi1[2:nx-1,1:ny-2])/dy)))
>> F1[221:222,49:57]=0.0
>> F1[218:219,57:97]=0.0
>> F1[221:222,97:105]=0.0
>> F1[221:222,145:153]=0.0
>> F1[218:219,153:193]=0.0
>> F1[221:222,193:201]=0.0
>> F1[221:222,241:249]=0.0
>> F1[218:219,249:289]=0.0
>> F1[221:222,289:297]=0.0
>> F1[221:222,337:345]=0.0
>> F1[218:219,345:385]=0.0
>> F1[221:222,385:393]=0.0
>> F1[1:220,:]=0.0
>> ###### Body force on x and Y ###############
>>
>> Fx1[2:nx-1,2:ny-1]=roc[2:nx-1,2:ny-1].*(-(((phi1[2:nx-1,2:ny-1]-phi1[1:nx-2,2:ny-1])/dx)))
>>
>> Fy1[2:nx-1,2:ny-1]=roc[2:nx-1,2:ny-1].*(-((phi1[2:nx-1,2:ny-1]-phi1[2:nx-1,1:ny-2])/dy))
>>
>> fig = plt.figure(figsize = (11,7), dpi=100)
>> plt.contourf(x*1000,y*1000,F1,50)
>> cbar = plt.colorbar()
>> savefig("wflow1368AC29SeptemberForce.png")
>> #######################################################
>> #Navier Stokes
>> const dt=0.0000025;#time step
>> const nstep=24001;#number of steps
>> const mu=0.000018;#kinematic viscosity
>> const maxit=100;
>> const beta=1.2;
>> const h=Length/(nx-1);
>> u=zeros(nx,ny);
>> v=zeros(nx,ny);
>> p=zeros(nx,ny);
>> ut=zeros(nx,ny);
>> vt=zeros(nx,ny);
>>
>> for iter =1:nstep
>>
>>   function Fxn1(iter)
>>     (abs(sin(2*pi*20000*(iter*dt))))
>>     end
>>   Fxn11=Fx1.*Fxn1(iter)
>>   function Fyn1(iter)
>>     (abs(sin(2*pi*20000*(iter*dt))))
>>   end
>>   Fyn11=Fy1.*Fyn1(iter)
>>
>>   for i =2:nx-1
>>     for j=2:ny-1
>>
>> ut[i,j]=u[i,j]+dt*(-(0.5/h)*(u[i,j].*(u[i+1,j]-u[i-1,j])+v[i,j]*(u[i,j+1]-u[i,j-1]))+
>>
>> (mu/h^2)*(u[i+1,j]+u[i-1,j]+u[i,j+1]+u[i,j-1]-4*u[i,j]))+dt.*(Fxn11[i,j])
>>
>> vt[i,j]=v[i,j]+dt*(-(0.5/h)*(u[i,j].*(v[i+1,j]-v[i-1,j])+v[i,j]*(v[i,j+1]-v[i,j-1]))+
>>
>> (mu/h^2)*(v[i+1,j]+v[i-1,j]+v[i,j+1]+v[i,j-1]-4*v[i,j]))+dt.*(Fyn11[i,j])
>>     end
>>   end
>>
>>   vt[2:nx-1,1]=(mu*dt/h^2)*(v[2:nx-1,3]-2*v[2:nx-1,2]);
>>   vt[2:nx-1,ny-1]=(mu*dt/h^2)*(v[2:nx-1,ny-3]-2*v[2:nx-1,ny-2]);
>>   ut[1,2:ny-1]=(mu*dt/h^2)*(u[3,2:ny-1]-2*u[2,2:ny-1]);
>>   ut[nx-1,2:ny-1]=(mu*dt/h^2)*(u[nx-3,2:ny-1]-2*u[nx-2,2:ny-1]);
>>   for it=1:maxit
>>     p[2:nx-1,1]=p[2:nx-1,2]+(h/dt)*vt[2:nx-1,1];
>>     p[2:nx-1,ny-1]=p[2:nx-1,ny-2]-(h/dt)*vt[2:nx-1,ny-1];
>>     p[1,1:ny-1]=p[2,1:ny-1]+(h/dt)*ut[1,1:ny-1];
>>     p[nx-1,2:ny-1]=p[nx-2,2:ny-1]-(h/dt)*ut[nx-1,2:ny-1];
>>     for i =2:nx-1
>>      for j=2:ny-1
>>
>> p[i,j]=beta*0.25*(p[i+1,j]+p[i-1,j]+p[i,j+1]+p[i,j-1]-(0.5*h/dt)*(ut[i+1,j]-ut[i-1,j]+vt[i,j+1]-vt[i,j-1]))+(1-beta)*p[i,j];
>>       end
>>     end
>>
>>     p[floor(nx/2),floor(ny/2)]=0.0;
>>   end
>>
>>
>> u[2:nx-1,2:ny-1]=ut[2:nx-1,2:ny-1]-(0.5*dt/h)*(p[3:nx,2:ny-1]-p[1:nx-2,2:ny-1]);
>>
>> v[2:nx-1,2:ny-1]=vt[2:nx-1,2:ny-1]-(0.5*dt/h)*(p[2:nx-1,3:ny]-p[2:nx-1,1:ny-2]);
>>   u[1:220,:] = 0
>>   u[:,end] = 0
>>   v[1:220,:] = 0
>>   v[:,end]=0
>>
>>   u[221:222,49:57]=0.0
>>   u[218:219,57:97]=0.0
>>   u[221:222,97:105]=0.0
>>   u[221:222,145:153]=0.0
>>   u[218:219,153:193]=0.0
>>   u[221:222,193:201]=0.0
>>   u[221:222,241:249]=0.0
>>   u[218:219,249:289]=0.0
>>   u[221:222,289:297]=0.0
>>   u[221:222,337:345]=0.0
>>   u[218:219,345:385]=0.0
>>   u[221:222,385:393]=0.0
>>
>>   v[221:222,49:57]=0.0
>>   v[218:219,57:97]=0.0
>>   v[221:222,97:105]=0.0
>>   v[221:222,145:153]=0.0
>>   v[218:219,153:193]=0.0
>>   v[221:222,193:201]=0.0
>>   v[221:222,241:249]=0.0
>>   v[218:219,249:289]=0.0
>>   v[221:222,289:297]=0.0
>>   v[221:222,337:345]=0.0
>>   v[218:219,345:385]=0.0
>>   v[221:222,385:393]=0.0
>>
>>   w=sqrt(v.^2+u.^2)
>>   if mod(iter,500)==0
>>    grid_x = [i for i in x, j in y]
>>    grid_y = [j for i in x, j in y]
>>    fig = plt.figure(figsize = (11,5), dpi=100)
>>    ax1 = axes()
>>    #plt.quiver(x*1000,y*1000,v,u,w)
>>
>> plt.quiver(grid_y[1:4:end,1:4:end]*1000,grid_x[1:4:end,1:4:end]*1000,v[1:4:end,1:4:end],u[1:4:end,1:4:end],w[1:4:end,1:4:end])
>>    cbar = plt.colorbar()
>>    title("Flow")
>>    xlabel("X Axis")
>>    ylabel("Y axis")
>>    ax1[:set_xlim](-5.5, 5.5)
>>    ax1[:set_ylim](-1.5, 5.5)
>>    savefig("wflow1368AC29September="*string(iter)*".png")
>>   end
>> end
>>
>>

Reply via email to