#for scheme in ['CDS', 'UDS', 'ES', 'HS', 'PS']: print(vC.shape) neumannBC = [[5, 0]] Peclet = 5000 # vel/diffus scheme='UDS' dirichletBC = [[1, lambda b_: 1. - np.tanh(10.)], [2, lambda b_: 1. - np.tanh(10.)], [3, lambda b_: 1. - np.tanh(10.)], [4, lambda b_: 1. + np.tanh(10 * (2 * b_.center()[0] + 1.))], ] print ("start", swatch.duration()) uGrid = solveFiniteVolume(grid, a=1./Peclet, f=f, vel=vB, uBoundary=dirichletBC, duBoundary=neumannBC, scheme=scheme) pg.showLater(1) ax1,cb = show(grid) drawStreams(ax1, grid, vC, coarseMesh=pg.createGrid(x=np.linspace(-1.0, 1.0, 41), y=np.linspace(0.0, 1.0, 21)), ) print(swatch.duration()) #grid2, u2 = createFVPostProzessMesh(grid, u, dirichletBC) show(grid, data=uGrid, logScale=False, interpolate=1, tri=1,
k = 0.1 uFE = solver.solveFiniteElements(grid, a=a, b=k*k, f=pointSource, duBoundary=neumannBC, uBoundary=dirichletBC, userData={'sourcePos': sourcePosA, 'k': k}, verbose=True) pg.showLater(1) ax1, cb = show(grid, uFE, cMin=0, cMax=1, nLevs=10, colorBar=True) drawMesh(ax1, grid) f = pg.Vector(grid.cellCount(), 0) f[grid.findCell(sourcePosA).id()]=1.0/grid.findCell(sourcePosA).size() uFV = solveFiniteVolume(grid, a=a, b=k*k, f=f, duBoundary=neumannBC, uBoundary=dirichletBC, userData={'sourcePos': sourcePosA, 'k': k}, verbose=True) #print('FVM:', swatch.duration(True)) ax2, cb = show(grid, uFV, interpolate=1, tri=1, cMin=0, cMax=1, nLevs=10, colorBar=True) drawMesh(ax2, grid) pg.showNow()
ud0=0 udN=1 def uAna(x, L, v, D): """ u = \frac{1 - \e(-v_x x / D)}{1 - \e(-v_x L / D)} Check for -v -- herleiten """ return (1 - np.exp(v * x / D))/(1. - np.exp(v * L / D)) plt.plot(np.linspace(0,1,100), uAna(np.linspace(0,1,100), L=1.0, v=v[0], D=a[1]), '-', label='exact') for scheme in ['CDS', 'UDS', 'ES', 'HS', 'PS']: S, rhs = diffusionConvectionKernelGrid(grid, a, f, v, uDir=[ud0, udN], scheme=scheme) u = np.linalg.solve(S, rhs) plt.plot(pg.x(grid.cellCenter()), u[1:N+1], 'o-', label='FVM-'+scheme) vC = np.vstack((v,np.zeros(len(v)))).T uFV = solveFiniteVolume(grid, a=a, f=f, vel=vC, uBoundary=[[1,ud0],[2,udN]], scheme='HS') plt.plot(pg.x(grid.cellCenter()), uFV, 'o-', label='FVM-2 (mesh)') plt.legend() plt.show() #drawMesh(ax, grid)
#for scheme in ['CDS', 'UDS', 'ES', 'HS', 'PS']: print(vC.shape) neumannBC = [[5, 0]] Peclet = 500 # vel/diffus scheme='UDS' dirichletBC = [[1, lambda b_: 1. - np.tanh(10.)], [2, lambda b_: 1. - np.tanh(10.)], [3, lambda b_: 1. - np.tanh(10.)], [4, lambda b_: 1. + np.tanh(10 * (2 * b_.center()[0] + 1.))], ] print ("start", swatch.duration()) uGrid = solveFiniteVolume(grid, a=1./Peclet, f=f, vel=vB, uBoundary=dirichletBC, duBoundary=neumannBC, scheme=scheme) ax1,cb = show(grid) drawStreams(ax1, grid, vC, coarseMesh=pg.createGrid(x=np.linspace(-1.0, 1.0, 41), y=np.linspace(0.0, 1.0, 21)), ) print(swatch.duration()) #grid2, u2 = createFVPostProzessMesh(grid, u, dirichletBC) show(grid, data=uGrid, logScale=False, interpolate=1, tri=1, colorBar=True, axes=ax1)
ud0 = 0 udN = 1 def uAna(x, L, v, D): """ u = \frac{1 - \e(-v_x x / D)}{1 - \e(-v_x L / D)} Check for -v -- herleiten """ return (1 - np.exp(v * x / D)) / (1.0 - np.exp(v * L / D)) plt.plot(np.linspace(0, 1, 100), uAna(np.linspace(0, 1, 100), L=1.0, v=v[0], D=a[1]), "-", label="exact") for scheme in ["CDS", "UDS", "ES", "HS", "PS"]: S, rhs = diffusionConvectionKernelGrid(grid, a, f, v, uDir=[ud0, udN], scheme=scheme) u = np.linalg.solve(S, rhs) plt.plot(pg.x(grid.cellCenter()), u[1 : N + 1], "o-", label="FVM-" + scheme) vC = np.vstack((v, np.zeros(len(v)))).T uFV = solveFiniteVolume(grid, a=a, f=f, vel=vC, uBoundary=[[1, ud0], [2, udN]], scheme="HS") plt.plot(pg.x(grid.cellCenter()), uFV, "o-", label="FVM-2 (mesh)") plt.legend() plt.show() # drawMesh(ax, grid)
showLater=True) drawMesh(ax1, mesh) #print(min(u), max(u)) uAna = np.array(list(map(lambda p_: np.sin(np.arctan2(p_[1], p_[0]))/p_.abs(), mesh.positions()))) #drawStreamLines2(ax1, mesh, data=u) #ax2,cbar = showMesh(mesh, data=(u+1e-6)/(ua+1e-6), filled=True, colorBar=True, showLater=True) #showMesh(amesh) print('---:', swatch.duration(True)) uFV = solveFiniteVolume(mesh, a=a, f=f, uBoundary=uDirichlet) print('FVM:', swatch.duration(True)) ax2, cbar = showMesh(mesh, data=uFV, cMin=0, cMax=10, logScale=False, interpolate=False, shading='gouraud', tri=1, nLevs=12, colorBar=True, showLater=True) drawMesh(ax2, mesh) #allBounds = pg.solver.parseArgToBoundaries(uDirichlet, mesh) #bounds, vals = zip(*allBounds) #uDirVals = pg.solver.generateBoundaryValue(bounds, vals)
showLater=True) drawMesh(ax1, mesh) #print(min(u), max(u)) uAna = np.array( list( map(lambda p_: np.sin(np.arctan2(p_[1], p_[0])) / p_.abs(), mesh.positions()))) #drawStreamLines2(ax1, mesh, data=u) #ax2,cbar = showMesh(mesh, data=(u+1e-6)/(ua+1e-6), filled=True, colorBar=True, showLater=True) #showMesh(amesh) print('---:', swatch.duration(True)) uFV = solveFiniteVolume(mesh, a=a, f=f, uBoundary=uDirichlet) print('FVM:', swatch.duration(True)) ax2, cbar = showMesh(mesh, data=uFV, cMin=0, cMax=10, logScale=False, interpolate=False, shading='gouraud', tri=1, nLevs=12, colorBar=True, showLater=True) drawMesh(ax2, mesh)
solver.assembleBoundaryConditions(grid, S, rhs=rhs, boundArgs=dirichletBC, assembler=solver.assembleDirichletBC) uFEM[n] = solver.linsolve(S, rhs) #ax1.plot(x, uE[timeProbeID], label='FD explicit') #ax2.plot(t, uE[:,spaceProbeID], label='FD explicit') ax1.plot(x, uI[timeProbeID], '.-', label='FD implicit') ax2.plot(t, uI[:, spaceProbeID], '.-', label='FD implicit') #ax1.plot(x, uFEM[timeProbeID], label='FE implicit') #ax2.plot(t, uFEM[:,spaceProbeID], label='FE implicit') uFVM = solveFiniteVolume(grid, a=tempLF, f=0.0, times=t, u0=u0, uDirichlet=[0.0, 0.0]) print(len(uFVM), len(uFVM[0])) ax1.plot(pg.x(grid.cellCenters()), uFVM[timeProbeID], '.-', label='FV implicit') ax2.plot(t, uFVM[:, spaceProbeID], '.-', label='FV implicit') uFE = solver.solvePoisson(grid, times=t, a=tempLF, theta=0.5, u0=u0, uBoundary=dirichletBC) ax1.plot(x, uFE[timeProbeID], label='FE Crank-Nicolsen') ax2.plot(t, uFE[:, spaceProbeID], label='FE Crank-Nicolsen') ax1.legend() ax2.legend()
k = 0.1 uFE = solver.solveFiniteElements(grid, a=a, b=k*k, f=pointSource, duBoundary=neumannBC, uBoundary=dirichletBC, userData={'sourcePos': sourcePosA, 'k': k}, verbose=True) pg.showLater(1) ax1, cb = show(grid, uFE, cMin=0, cMax=1, nLevs=10, colorBar=True) drawMesh(ax1, grid) f = pg.RVector(grid.cellCount(), 0) f[grid.findCell(sourcePosA).id()]=1.0/grid.findCell(sourcePosA).size() uFV = solveFiniteVolume(grid, a=a, b=k*k, f=f, duBoundary=neumannBC, uBoundary=dirichletBC, userData={'sourcePos': sourcePosA, 'k': k}, verbose=True) #print('FVM:', swatch.duration(True)) ax2, cb = show(grid, uFV, interpolate=1, tri=1, cMin=0, cMax=1, nLevs=10, colorBar=True) drawMesh(ax2, grid) pg.showNow()