Beispiel #1
0
    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)
Beispiel #2
0
  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)