def run(self, q0=None, dt=None, tend=None, iterations=None, **kw): """Run in parallel (PFASST).""" if q0 is None: raise ValueError, "missing initial condition" rank = self.mpi.rank state = self.state ntime = self.mpi.ntime levels = self.levels self.state.dt = dt self.state.tend = tend for F, G in self.fine_to_coarse: F.tmat, F.tmask = time_interpolation_matrix(F.sdc.nodes, G.sdc.nodes) F.rmat, F.rmask = time_interpolation_matrix(G.sdc.nodes, F.sdc.nodes) # time block loop nblocks = int(math.ceil(tend / (dt * ntime))) for block in range(nblocks): step = block * ntime + rank t0 = dt * step state.set(t0=t0, block=block, step=step) self.spread_q0(q0, t0, dt, **kw) if self.mpi.ntime > 1: self.predictor(t0, dt, **kw) for F in self.levels: F.q0[...] = F.qSDC[0] for k in range(iterations): self.iteration(k, t0, dt, **kw) # loop if nblocks > 1 and block < nblocks: if self.mpi.nspace > 1: raise ValueError, "looping not implemented for nspace > 1" T = levels[0] self.mpi.comm.Bcast(T.qend, root=self.mpi.ntime - 1) q0 = T.qend for F in levels: F.call_hooks("end-step", **kw) # done for F in levels: F.call_hooks("end", **kw)
def run(self, u0, dt, tend, iterations, cycle='V', **kwargs): """Run in parallel (PFASST).""" #### short cuts, state, options levels = self.levels nlevels = len(levels) rank = self.mpi.rank ntime = self.mpi.ntime T = levels[0] # finest/top level B = levels[nlevels-1] # coarsest/bottom level self.state.dt = dt self.state.tend = tend iterations = optdb.iterations or iterations cycles = self.cycles(optdb.cycle or cycle) #### build time interpolation matrices for l in range(nlevels-1): nodesF = levels[l].sdc.nodes nodesG = levels[l+1].sdc.nodes levels[l].time_interp_mat = time_interpolation_matrix(nodesF, nodesG) #### block loop nblocks = int(math.ceil(tend/(dt*ntime))) for block in range(nblocks): step = block*ntime + rank t0 = dt*step self.state.t0 = t0 self.state.block = block self.state.step = step self.set_initial_conditions(u0, t0, dt, **kwargs) self.predictor(t0, dt, **kwargs) # iterations for k in range(iterations): self.state.iteration = k self.iteration(k, t0, dt, cycles, **kwargs) # loop if nblocks > 1 and block < nblocks: if self.mpi.nspace > 1: raise ValueError, 'looping not implemented for nspace > 1' self.mpi.comm.Bcast(T.qend, root=self.mpi.ntime-1) u0 = T.qend T.call_hooks('end-step', **kwargs) #### done T.call_hooks('end', **kwargs)