Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Python Doublet + Uniform Flow // Streamfunction Polar Plot Help

  1. May 24, 2016 #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:

    Code (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 :)
     

    Attached Files:

  2. jcsd
  3. May 24, 2016 #2

    jedishrfu

    Staff: Mentor

    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?
     
  4. May 25, 2016 #3
    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: May 5, 2017
  5. May 26, 2016 #4
    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

    Code (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: May 5, 2017
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Doublet + Uniform Flow // Streamfunction Polar Plot Help
Loading...