Python Doublet + Uniform Flow // Streamfunction Polar Plot Help

AI Thread Summary
The discussion revolves around a user attempting to plot a streamfunction in polar coordinates using Python with the Spyder IDE. Initially, the user successfully plotted the streamfunction in Cartesian coordinates but faced challenges when transitioning to polar coordinates. They expressed uncertainty about the correctness of their polar plot and sought guidance on what the expected output should resemble.Another participant suggested comparing the polar plot with the Cartesian plot to aid in debugging. The user confirmed that the Cartesian plots were functioning correctly but struggled to find reference plots online. After further attempts, the user shared updated code and results, indicating that they believed their polar plot now made sense. The revised code included adjustments to the velocity and stream function calculations, and the user successfully generated a polar contour plot, complete with a color bar for clarity. The discussion highlights the importance of visual comparison in debugging and the iterative nature of coding in scientific computing.
nn2e11
Messages
3
Reaction score
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
    6.7 KB · Views: 949
Technology news on Phys.org
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?
 
  • Like
Likes nn2e11
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:
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
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I have a quick questions. I am going through a book on C programming on my own. Afterwards, I plan to go through something call data structures and algorithms on my own also in C. I also need to learn C++, Matlab and for personal interest Haskell. For the two topic of data structures and algorithms, I understand there are standard ones across all programming languages. After learning it through C, what would be the biggest issue when trying to implement the same data...
Back
Top