def rk2_step(sld_bodies, free_stream, vort_elems, dt): k1 = np.zeros((len(vort_elems), 1), dtype=complex) pos, strg, delta = np.array([ vort_elems[i].pos for i in range(len(vort_elems)) ]), np.array([vort_elems[i].strg for i in range(len(vort_elems))]), vort_elems[0].delta poscp = [vort_elems[i].poscp for i in range(len(vort_elems))] k1[:] += [ VPM.vel_body(sld_bodies, vort_elems[i].pos) for i in range(len(vort_elems)) ] for i in range(len(vort_elems)): k1[i] += free_stream k1[:, 0] += vel_vort(pos, pos, strg, delta) for i in range(len(vort_elems)): vort_elems[i].pos += 0.5 * k1[i][0] * dt for body in sld_bodies: body.move_body(0.5 * dt) VPM.depenetrator(sld_bodies, vort_elems) A = VPM.get_coefficient_mat(sld_bodies) b = VPM.get_rhs(sld_bodies, free_stream, vort_elems) gamma = VPM.solve_gamma(sld_bodies, A, b) k2 = np.zeros((len(vort_elems), 1), dtype=complex) pos, strg, delta = np.array([ vort_elems[i].pos for i in range(len(vort_elems)) ]), np.array([vort_elems[i].strg for i in range(len(vort_elems))]), vort_elems[0].delta poscp = [vort_elems[i].poscp for i in range(len(vort_elems))] k2[:] += [ VPM.vel_body(sld_bodies, vort_elems[i].pos) for i in range(len(vort_elems)) ] for i in range(len(vort_elems)): k2[i] += free_stream k2[:, 0] += vel_vort(pos, pos, strg, delta) for i in range(len(vort_elems)): vort_elems[i].poscp += k2[i][0] * dt vort_elems[i].pos = cp.copy(vort_elems[i].poscp) for body in sld_bodies: body.move_body(0.5 * dt) VPM.depenetrator(sld_bodies, vort_elems)
def plot_velfield(grid,SimulationData_pos,SimulationData_strg,body,fignum,Vinf=1+0j): x,y = grid z = x + 1j*y vel = np.zeros_like(z,dtype = complex) # print(np.shape(vel)) for i in range(np.shape(vel)[1]): vel[i] = np.array([VPM.vel_body([body],z[i][j]) for j in range(np.shape(vel)[0])])[0] + Vinf vel[i] += itg.vel_vort(z[i].copy(),SimulationData_pos.copy(),SimulationData_strg.copy(),body.get_pnl_len()[0]/np.pi) plt.figure(fignum) plt.quiver(x,y,vel.real,vel.imag,scale = 75.0) plt.plot(body.get_vert().real,body.get_vert().imag,'b') plt.gca().set_aspect('equal',adjustable='box') plt.show()
def diffusion_step(vort_list, nu, dt): for j in range(len(vort_list)): if abs(vort_list[j].strg) > 0.01: n = int(abs(vort_list[j].strg) / 0.01) vort_list[j].strg = np.sign(vort_list[j].strg) * 0.01 # + zeta[0] temp = [ vort_list.append( VPM.vortex(vort_list[j].pos, vort_list[j].strg, vort_list[j].delta)) for i in range(n - 1) ] zetax, zetay = nmdist([0, 0], [[2 * nu * dt, 0], [0, 2 * nu * dt]], len(vort_list)).T zeta = zetax + 1j * zetay for i in range(len(vort_list)): vort_list[i].pos += zeta[i]
return ret[n - 1:] / n def accelometer(SimulationData_pos,SimulationData_strg): tsteps = len(SimulationData_pos)-1 Xforce = [] Xmom = np.array([np.sum(np.array(SimulationData_pos[i+1]).real*np.array(SimulationData_strg[i+1])) for i in range(tsteps)]) Xforce = [(-(Xmom[i] - Xmom[i-1])/0.1) for i in range(1,len(Xmom))] Cd = np.array(Xforce)/(0.5*1*2) return Cd if __name__ == "__main__": body_list = [] body_list.append(VPM.sld_bd(ctr_circ_vert(0j,1,50),1,0j)) # body_list.append(VPM.sld_bd(ctr_circ_vert(3j,1,50),1,3j)) # body_list.append(VPM.sld_bd(ctr_circ_vert(3+0j,1,50),1,3+0j)) Vinf = 1+0j vort_pos = np.array([-2]*100) + 1j*np.linspace(-4,4,100) vort_list = [] #[VPM.vortex(1j,0,0.005)] # for i in range(len(vort_pos)): # #print(vort_pos[i]) # vort_list.append(VPM.vortex(vort_pos[i],0.0,0.005)) post,circt,t,vort_list = itg.simulate(body_list,Vinf,vort_list,0.002,2,0.1) # plotting_ParticlesPath(post,1)
def read_file(path): return VPM.read_file(path)
def write_file(path, data): VPM.write_file(path, data)
def simulate(sld_bodies, free_stream, vort_elems, nu, final_time, time_step): t = np.linspace(0, final_time, (final_time / time_step) + 1) position_t = [] position_t.append( [cp.copy(vort_elems[j].pos) for j in range(len(vort_elems))]) circulation_t = [] circulation_t.append( [cp.copy(vort_elems[j].strg) for j in range(len(vort_elems))]) vort_elems.append(VPM.vortex(0j, 0.0, 0.1)) A = VPM.get_coefficient_mat(sld_bodies) b = VPM.get_rhs(sld_bodies, free_stream, vort_elems) gamma = cp.copy(VPM.solve_gamma(sld_bodies, A, b)) new_blobs = VPM.slip_nullify(sld_bodies, vort_elems) rk2_step(sld_bodies, free_stream, vort_elems, time_step) len(vort_elems) pos, strg, delta = np.array([ vort_elems[i].pos for i in range(len(vort_elems)) ]), np.array([vort_elems[i].strg for i in range(len(vort_elems))]), vort_elems[0].delta vort_elems.pop(-1) for i in range(len(t)): # print(i) [vort_elems.append(new_blobs[i]) for i in range(len(new_blobs))] diffusion_step(vort_elems, nu, time_step) VPM.depenetrator(sld_bodies, vort_elems) position_t.append( [cp.copy(vort_elems[j].pos) for j in range(len(vort_elems))]) circulation_t.append( [cp.copy(vort_elems[j].strg) for j in range(len(vort_elems))]) A = VPM.get_coefficient_mat(sld_bodies) b = VPM.get_rhs(sld_bodies, free_stream, vort_elems) gamma = VPM.solve_gamma(sld_bodies, A, b) new_blobs = VPM.slip_nullify(sld_bodies, vort_elems) rk2_step(sld_bodies, free_stream, vort_elems, time_step) len(vort_elems) pos, strg, delta = np.array([ vort_elems[i].pos for i in range(len(vort_elems)) ]), np.array([vort_elems[i].strg for i in range(len(vort_elems))]), vort_elems[0].delta return position_t, circulation_t, t, vort_elems