Example #1
0
    def __init__(self, dim, dt, dx, L,
                 D_rho, mu, walls):
        self.dim = dim
        self.dt = dt
        self.dx = dx
        self.L = L
        self.D_rho = D_rho
        self.mu = mu
        self.walls = walls

        self.i = 0
        self.t = 0.0

        nx = int(round((self.L / self.dx)))
        self.dx = L / nx
        if self.dim == 1:
            self.mesh = PeriodicGrid1D(dx=np.array([self.dx]), nx=nx)
        elif self.dim == 2:
            self.mesh = PeriodicGrid2D(dx=np.array([self.dx]),
                                       dy=np.array([self.dx]), nx=nx, ny=nx)

        self.L_perturb = self.L
        eps = 1e-2
        x = self.get_x()
        if self.dim == 1:
            perturb = eps * np.sin(2.0 * np.pi * x / self.L_perturb)
        else:
            X, Y = np.meshgrid(x, x)
            perturb = eps * np.sin(2.0 * np.pi * X * Y / self.L_perturb ** 2)
        rho_init = 1.0 + perturb
        c_init = 1.0 + perturb

        if self.walls is not None:
            rho_init *= np.logical_not(self.walls.a)
            c_init *= np.logical_not(self.walls.a)

            mask = make_mask(self.mesh, self.walls)
            self.D_rho_var = fipy.FaceVariable(mesh=self.mesh,
                                               value=self.D_rho)
            self.D_rho_var.setValue(0.0, where=mask)
            self.D_c_var = fipy.FaceVariable(mesh=self.mesh, value=1.0)
            self.D_c_var.setValue(0.0, where=mask)
        else:
            self.D_rho_var = self.D_rho
            self.D_c_var = 1.0

        self.rho = fipy.CellVariable(mesh=self.mesh, value=rho_init.T.ravel())
        self.c = fipy.CellVariable(mesh=self.mesh, value=c_init.T.ravel())

        eq_rho = (TransientTerm(var=self.rho) ==
                  DiffusionTerm(coeff=self.D_rho_var, var=self.rho) -
                  ConvectionTerm(coeff=mu * self.c.grad, var=self.rho))

        eq_c = (TransientTerm(var=self.c) ==
                DiffusionTerm(coeff=self.D_c_var, var=self.c) +
                self.rho -
                ImplicitSourceTerm(coeff=1.0, var=self.c))

        self.eq = eq_rho & eq_c
D = 1.0
n = 1000

nx = int(round(L / dx))
mesh = PeriodicGrid2D(dx=np.array([dx]), dy=np.array([dx]), nx=nx, ny=nx)

phi = fipy.CellVariable(mesh=mesh, value=0.0)

maze = bannock.walls.Maze(L, dim=2, dx=dx, d=dx, seed=None)

maze_ravel = maze.a.T.ravel()
phi0 = np.random.uniform(0.0, 1.0, size=maze_ravel.shape)
phi0 *= np.logical_not(maze_ravel)
print(phi0)
phi.setValue(phi0)

mask = make_mask(mesh, maze)
mask_D = fipy.FaceVariable(mesh=mesh, value=D)
mask_D.setValue(0.0, where=mask)

eq = fipy.TransientTerm() == fipy.DiffusionTerm(coeff=mask_D)

viewer = fipy.Matplotlib2DViewer(vars=phi, colorbar=None)
viewer.plotMesh()

for step in range(n):
    eq.solve(var=phi, dt=dt)
    viewer.plot()
    print(step)
raw_input()