Doublet + Uniform Flow // Streamfunction Polar Plot Help

  • #1
nn2e11
3
1
Hello,
Python,CFD and PF newbie here.
I am using Spyder (Python 3.5) and I managed to plot my streamfunction in cartesian coordinates.
I tried transforming and plotting in polar coordinates but I am not sure that what i have done is correct.
I am not even sure what the plot should look like :/
When I run the code the result is: [See attached picture]

The code is this:

Python:
import numpy
from matplotlib import pyplot
from matplotlib import cm

N=1000
r_min, r_max = 0,1
theta_min, theta_max = 0,2*numpy.pi
r=numpy.linspace(r_min,r_max,N)
theta=numpy.linspace(theta_min, theta_max,N)
X,Y=numpy.meshgrid(r*numpy.cos(theta),r*numpy.sin(theta))

kappa = 1
r_doublet, theta_doublet=0,0

def velocity_doublet(strength, rd, thetad, X, Y):
 
    u = - strength/(2*numpy.pi)*((X-rd*numpy.cos(thetad))**2-(Y-rd*numpy.sin(thetad))**2)/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)**2
    v = - strength/(2*numpy.pi)*2*(X-rd*numpy.cos(thetad))*(Y-rd*numpy.sin(thetad))/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)**2
   
    return u, v

def stream_function_doublet(strength, rd, thetad, X, Y):

    psi = - strength/(2*numpy.pi)*(Y-rd*numpy.sin(thetad))/((X-rd*numpy.cos(thetad))**2+(Y-rd*numpy.sin(thetad))**2)
   
    return psi

# computes the velocity field on the mesh grid
u_doublet, v_doublet = velocity_doublet(kappa, r_doublet, theta_doublet, X, Y)

# computes the stream-function on the mesh grid
psi_doublet = stream_function_doublet(kappa, r_doublet, theta_doublet, X, Y)

#pyplot.streamplot(X, Y, u_doublet, v_doublet,
               #density=2, linewidth=1, arrowsize=1, arrowstyle='->')
#pyplot.scatter(r_doublet, theta_doublet, color='#CD2305', s=80, marker='.');

#ax = pyplot.subplot(111, polar=True)
#ax.plot(X,Y, u_doublet,v_doublet, color='r', ls='none', marker='.')

u_inf = 1.0  # the speed of the freestream

u_freestream = u_inf * numpy.ones((N, N), dtype=float)
v_freestream = numpy.zeros((N, N), dtype=float)

psi_freestream = u_inf * Y

u = u_freestream + u_doublet
v = v_freestream + v_doublet
psi = psi_freestream + psi_doublet

ax = pyplot.subplot(111, polar=True)
pyplot.scatter(r_doublet*numpy.cos(theta_doublet), r_doublet*numpy.sin(theta_doublet), color='b', s=500, marker='o')
ax.contour(X,Y, psi, levels=[-1,1,N], colors='#CD2305',linestyles='solid')


Thank you in advance :)
 

Attachments

  • PPlot.PNG
    PPlot.PNG
    7.5 KB · Views: 803

Answers and Replies

  • #2
14,051
8,014
Welcome to PF!

THe computer is your friend and you can use it to help you debug your problem sometimes.

Have you tried plotting it in XY coordinates to compare it to your polar plot?
 
  • #3
nn2e11
3
1
Thank you for your reply.

Yes, everything worked fine in Cartesian coordinates. I cannot seem to find anything online either, as a reference plot at least.

Please see here for the X,Y. The upper plot is the doublet prior to applying the uniform flow. the bottom plot is the superposition of the two.
Cartesian.jpg
 
Last edited by a moderator:
  • #4
nn2e11
3
1
I think i got it right this time. In case someone finds it useful, I have attached the code below.

It produces the following polar plot which I think makes sense(?).
cpp.jpg


Python:
import numpy
from matplotlib import pyplot
from matplotlib import cm

N=50
kappa = 1
r_doublet, theta_doublet=0,0
u_inf = 2.0  # the speed of the freestream
r_min, r_max = 0,1.025*numpy.sqrt(kappa/(2*numpy.pi*u_inf))
theta_min, theta_max = 0,2*numpy.pi
r=numpy.linspace(r_min,r_max,N)
theta=numpy.linspace(theta_min, theta_max,N)
X,Y=numpy.meshgrid(theta,r)


def velocity_doublet(strength, rd, thetad, X,Y):
    Q=numpy.sqrt(strength/(2*numpy.pi*u_inf))
    V_r = u_inf*numpy.cos(X-thetad)*(1-(Q/(Y-rd))**2)
    V_theta = -u_inf*numpy.sin(X-thetad)*(1+(Q/(Y-rd))**2)
  
    return V_r, V_theta

def stream_function_doublet(strength, rd, thetad, X,Y):
    Q=numpy.sqrt(strength/(2*numpy.pi*u_inf))
    psi = u_inf*Y*numpy.sin(X-thetad)*(1-(Q/(Y-rd))**2)
  
    return psi

# computes the velocity field on the mesh grid
u_doublet, v_doublet = velocity_doublet(kappa, r_doublet, theta_doublet, X,Y)

# computes the stream-function on the mesh grid
psi_doublet = stream_function_doublet(kappa, r_doublet, theta_doublet, X,Y)
pyplot.figure(figsize=(10, 10))
ax=pyplot.subplot(111, polar=True)
ax.set_rmax(r_max)
ax.set_rmin(r_min)
ax.grid(True) 
minpsi=numpy.nanmin(psi_doublet)
maxpsi=numpy.nanmax(psi_doublet)
avgpsi=(minpsi+maxpsi)*0.5
ax.contourf(X,Y, psi_doublet, levels=numpy.linspace(numpy.nanmin(psi_doublet), numpy.nanmax(psi_doublet),N),cmap=cm.Spectral)
contf = pyplot.contourf(X, Y, psi_doublet, levels=numpy.linspace(minpsi, maxpsi, N), extend='both',cmap=cm.jet)
cbar = pyplot.colorbar(contf)
cbar.set_label('$Ψ$', fontsize=16)
cbar.set_ticks([minpsi,0.75*minpsi,0.5*minpsi,0.25*minpsi,avgpsi,0.25*maxpsi,0.5*maxpsi,0.75*maxpsi, maxpsi])
 
Last edited by a moderator:
  • Like
Likes Pepper Mint

Suggested for: Doublet + Uniform Flow // Streamfunction Polar Plot Help

  • Last Post
Replies
6
Views
736
Replies
5
Views
840
Replies
62
Views
11K
  • Last Post
Replies
10
Views
586
  • Last Post
Replies
24
Views
718
Replies
6
Views
515
  • Last Post
Replies
5
Views
629
  • Last Post
Replies
4
Views
332
  • Last Post
Replies
9
Views
599
  • Last Post
Replies
13
Views
690
Top