dt = 100.0 if (ca.velocity().max()>1.0e-7): dt = float(0.5*smallest_size/ca.velocity().max()) if (max_dt < dt): dt = max_dt it.command("solve time {}".format(dt)) it.command("cfd update") cfd_link.send_data(dt) # solve interval new_porosity = ca.porosity() cfd_link.send_data(old_porosity*(1-r_factor)+new_porosity*r_factor) old_porosity = new_porosity new_force = (ca.drag().T/element_volume).T/fluid_density cfd_link.send_data(old_force*(1-r_factor)+new_force*r_factor) old_force = new_force ca.set_pressure(cfd_link.read_data()) ca.set_pressure_gradient(cfd_link.read_data()) time += dt newu = cfd_link.read_data() ca.set_velocity(oldu*(1-r_factor)+newu*r_factor) oldu = newu cfd_link.send_data(0.0) # solve interval cfd_link.close() del cfd_link it.command("history write 1,2 file 'fluidized_bed_4.txt' truncate")
set gravity 0 0 -9.81 def fluid_time global fluid_time = mech.age end ball history id 1 zvelocity id 1 history add id 2 fish @fluid_time plot clear plot add hist 1 vs 2 plot add cfdelement shape arrow colorby vectorattribute "velocity" """.format(fluid_density, fluid_viscosity)) element_volume = ca.volume() dt = 0.005 for i in range(100): it.command("solve age {}".format(it.mech_age()+dt)) print "sending solve time" cfd_link.send_data(dt) # solve interval cfd_link.send_data(ca.porosity()) cfd_link.send_data((ca.drag().T/element_volume).T/fluid_density) print " cfd solve started" ca.set_pressure(cfd_link.read_data()) ca.set_pressure_gradient(cfd_link.read_data()) ca.set_velocity(cfd_link.read_data()) print " cfd solve ended" cfd_link.send_data(0.0) # solve interval print "ball z velocity", it.ball.find(1).vel_z()
n=ca.porosity() cfd_link.send_data(n) ca.set_extra(1, np.zeros(it.element.cfd.count())) ca.set_extra(2, np.zeros(it.element.cfd.count())) ca.set_extra(3, np.zeros((it.element.cfd.count(),3))) for b in it.ball.cfd.list(): for e,v in zip(b.elements(), b.overlaps()): e.set_extra(1, e.extra(1)+v*b.ball().radius()) e.set_extra(2, e.extra(2)+v) e.set_extra(3, e.extra(3)+v*b.ball().vel()) dbar = 2*ca.extra(1)/ca.extra(2) ubar = (ca.extra(3).T/ca.extra(2)).T du = np.linalg.norm(ubar.T - ca.velocity().T,axis=0) re = (du*fluid_density*dbar/fluid_viscosity).T beta = fluid_viscosity*(1-n)/dbar**2/n*(150*(1-n)+1.75*re)/fluid_density #print beta, ubar new_force = (ca.drag().T/element_volume).T/fluid_density cfd_link.send_data(beta) cfd_link.send_data(ubar) print " cfd solve started" ca.set_pressure(cfd_link.read_data()) ca.set_pressure_gradient(cfd_link.read_data()) newu = cfd_link.read_data() ca.set_velocity(oldu*(1-r_factor)+newu*r_factor) oldu = newu print " cfd solve ended" cfd_link.send_data(0.0) it.command('plot bitmap filename "simple_porous1.png"')
ball prop kn 1e2 ks 1e2 fric 0.25 set gravity 0 0 -9.81 def fluid_time global fluid_time = mech.age end ball history id 1 zvelocity id 1 history add id 2 fish @fluid_time plot clear plot add hist 1 vs 2 plot add cfdelement shape arrow colorby vectorattribute "velocity" """.format(fluid_density, fluid_viscosity)) element_volume = ca.volume() dt = 0.005 for i in range(100): it.command("solve age {}".format(it.mech_age() + dt)) print "sending solve time" cfd_link.send_data(dt) # solve interval cfd_link.send_data(ca.porosity()) cfd_link.send_data((ca.drag().T / element_volume).T / fluid_density) print " cfd solve started" ca.set_pressure(cfd_link.read_data()) ca.set_pressure_gradient(cfd_link.read_data()) ca.set_velocity(cfd_link.read_data()) print " cfd solve ended" cfd_link.send_data(0.0) # solve interval print "ball z velocity", it.ball.find(1).vel_z()