def evolve(self):

        self.cc_data.fill_BC_all()
        phi = self.cc_data.get_var("phi")
        myg = self.cc_data.grid

        # diffusion coefficient
        k = self.rp.get_param("diffusion.k")


        # setup the MG object -- we want to solve a Helmholtz equation
        # equation of the form:
        # (alpha - beta L) phi = f
        #
        # with alpha = 1
        #      beta  = (dt/2) k
        #      f     = phi + (dt/2) k L phi
        #
        # this is the form that arises with a Crank-Nicolson discretization
        # of the diffusion equation.
        mg = MG.CellCenterMG2d(myg.nx, myg.ny,
                               xmin=myg.xmin, xmax=myg.xmax,
                               ymin=myg.ymin, ymax=myg.ymax,
                               xl_BC_type=self.cc_data.BCs['phi'].xlb,
                               xr_BC_type=self.cc_data.BCs['phi'].xrb,
                               yl_BC_type=self.cc_data.BCs['phi'].ylb,
                               yr_BC_type=self.cc_data.BCs['phi'].yrb,
                               alpha=1.0, beta=0.5*self.dt*k,
                               verbose=0)

        # form the RHS: f = phi + (dt/2) k L phi  (where L is the Laplacian)
        f = mg.soln_grid.scratch_array()
        f.v()[:,:] = phi.v() + 0.5*self.dt*k * (
            (phi.ip(1) + phi.ip(-1) - 2.0*phi.v())/myg.dx**2 +
            (phi.jp(1) + phi.jp(-1) - 2.0*phi.v())/myg.dy**2)

        mg.init_RHS(f.d)

        # initial guess is zeros
        mg.init_zeros()

        # solve the MG problem for the updated phi
        mg.solve(rtol=1.e-10)
        #mg.smooth(mg.nlevels-1,100)

        # update the solution
        phi.v()[:,:] = mg.get_solution().v()

        # increment the time
        self.cc_data.t += self.dt
        self.n += 1
build validation table for SNPs against expression data.
dataset/ETHPy150Open zingale/pyro2/diffusion/simulation.py/Simulation.evolve--crossover with--dataset/ETHPy150Open CGATOxford/cgat/obsolete/pipeline_snps.py/createSNPValidationData