def init_step(self, mesh, ul, ur): step = np.zeros(len(mesh.centers())) xr = 1.0 x = mesh.centers() for i in range(len(x)): if x[i] < xr: step[i] = ul elif xr <= x[i] <= 2.0: step[i] = 3.0-x[i] elif x[i] > 2.0: step[i] = ur return step
def init_square(mesh): return (1 + sign(-(mesh.centers() / mesh.length - .25) * (mesh.centers() / mesh.length - .75))) / 2
def init_sinper(mesh, k): #k = 2 # nombre d'onde return sin(2 * k * pi / mesh.length * mesh.centers())
def init_sinpack(mesh): return sin(2 * 2 * pi / mesh.length * mesh.centers()) * ( 1 + sign(-(mesh.centers() / mesh.length - .25) * (mesh.centers() / mesh.length - .75))) / 2
def init_sinperk(mesh, k): return np.sin(2*k*np.pi/mesh.length*mesh.centers())
def init_rupturebarrage(mesh): h0_vect = np.zeros(len(mesh.centers())) + 0.5 for i in range(len(mesh.centers())): if mesh.centers()[i] < 1: h0_vect[i] = 1 return h0_vect
def init_gouttedeau(mesh, max_height): return max_height * (-np.exp(-((mesh.centers() - 1) / 0.1)**2)) + .1
u0_vect = .5 + np.zeros((ncell)) w_init = [h0_vect, u0_vect * h0_vect] # Define RHS rhs = modeldisc.fvm(model, mesh, xmeth, numflux=numflux, bcL=bcL, bcR=bcR) field0 = rhs.fdata_fromprim(w_init) # Define the solver solver = tmeth(mesh, rhs) # Solution w_sol = solver.solve(field0, cfl, tsave) # VERIFIED : w_sol contains solutions in conservative variables [h,q=h*u] solver.show_perf() fig2, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 7)) ax1.set_xlabel('$x$'), ax1.set_ylabel('$h(t,x)$'), ax1.set_title( 'Hauteur de fluide au temps t = ' + str(endtime) + '\n (CFL ' + str(cfl) + ', flux : ' + numflux + ', ' + xmethstr + ', ' + tmethstr + ')') ax1.set(xlim=(-0.1, mesh.centers()[-1] + 0.1), ylim=(-0.0, .2)) ax1.grid(linestyle='--', color='0.5') line1, = ax1.plot(mesh.centers(), w_sol[-1].data[0]) #line1, = ax1.plot(mesh.centers(),h0_vect) ax2.set_xlabel('$x$'), ax2.set_ylabel('$u(t,x)$'), ax2.set_title( 'Vitesse du fluide au temps t = ' + str(endtime) + '\n (CFL ' + str(cfl) + ', flux : ' + numflux + ', ' + xmethstr + ', ' + tmethstr + ')') ax2.grid(linestyle='--', color='0.5') line2, = ax2.plot(mesh.centers(), w_sol[-1].data[1] / w_sol[-1].data[0]) plt.show()
# extrapol1(), extrapol2()=extrapolk(1), centered=extrapolk(-1), extrapol3=extrapol(1./3.) xmeth = extrapol1() # explicit, rk2, rk3ssp, rk4, implicit, trapezoidal=cranknicolson tmeth = explicit #boundary condition bc : type of boundary condition - "p"=periodic / "d"=Dirichlet bc = 'p' # initialization field0 = scafield(mymodel, bc, mesh.ncell) field0.qdata[0] = init(mesh) # solver integration solver = tmeth(mesh, xmeth) start = time.clock() results = solver.solve(field0, cfl, tsave) print "cpu time of computation (", solver.nit, "it) :", time.clock( ) - start, "s" # display and save results to png file style = ['o', 'x', 'D', '*', 'o', 'o'] fig = figure(1, figsize=(10, 8)) plot(mesh.centers(), results[0].qdata[0], '-') labels = ["initial condition"] for t in range(1, len(tsave)): plot(mesh.centers(), results[t].qdata[0], style[t - 1]) labels.append(", t=%.1f" % results[t].time) legend(labels, loc='upper left', prop={'size': 10}) fig.savefig('result.png', bbox_inches='tight') show()
def init_sin(self, mesh): k = 2 # nombre d'onde omega = k*np.pi/mesh.length return .2+np.sin(omega*mesh.centers())
def init_sinpack_half(mesh): return sin(2*2*pi*mesh.centers())*(1+sign(-(mesh.centers()-.25)*(mesh.centers()-.75)))/2