#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,
Ejemplo n.º 2
0
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()