diff --git a/parmepy/new_ParMePy/Operator/AdvectionDOp.py b/parmepy/new_ParMePy/Operator/AdvectionDOp.py index 1edac44dddac2e40cd3c5fc0947ab358374feb87..850f45469d6269d7e545274a304bce5a070528f0 100644 --- a/parmepy/new_ParMePy/Operator/AdvectionDOp.py +++ b/parmepy/new_ParMePy/Operator/AdvectionDOp.py @@ -61,9 +61,8 @@ class AdvectionDOp(DiscreteOperator): c_time = time.time() ## ------------------- NumPy Optimisation # Particle update - self.resultScalar.values[:] = self.scalar.values[:] - self.resultPosition.values[:] = self.velocity.domain.points[:] - #print self.resultPosition.values + self.resultScalar.values[...] = self.scalar.values[...] + self.resultPosition.values[...] = self.velocity.domain.points[...] # Advection self.numMethod.integrate(self.velocity.domain.points, self.velocity.values, self.resultPosition.values, t, dt, splittingDirection) #print self.resultPosition.values diff --git a/parmepy/new_ParMePy/Operator/RemeshingDOp.py b/parmepy/new_ParMePy/Operator/RemeshingDOp.py index 1a4e7d232f2a88d7bbda25f9d3f1031ccbfd8a6f..bb709ea38b16f9a378b92d9f91b818b8ff58235e 100644 --- a/parmepy/new_ParMePy/Operator/RemeshingDOp.py +++ b/parmepy/new_ParMePy/Operator/RemeshingDOp.py @@ -68,7 +68,7 @@ class RemeshingDOp(DiscreteOperator): if self.gpu_kernel is None: c_time = time.time() ## ------------------- NumPy Optimisation - self.resultScalar.values[:] = 0. + self.resultScalar.values[...] = 0. self.numMethod.remesh(self.ppos.values, self.pscal.values, splittingDirection) ## ------------------- self.compute_time += (time.time() - c_time) diff --git a/parmepy/new_ParMePy/Problem/DiscreteTransportProblem.py b/parmepy/new_ParMePy/Problem/DiscreteTransportProblem.py index 9b0d7f7681b2ff47ce37b1bf659284f2fdc3cef0..ddf8fbd93adbd01a9f71b101e2c1286a78dbaee7 100644 --- a/parmepy/new_ParMePy/Problem/DiscreteTransportProblem.py +++ b/parmepy/new_ParMePy/Problem/DiscreteTransportProblem.py @@ -66,10 +66,10 @@ class DiscreteTransportProblem(DiscreteProblem): for op in self.operators: c_time += op.compute_time c_flop += op.total_flop - print "Time", op, op.compute_time, "s \t", (op.total_flop/op.compute_time) * 1e-9, "GFlop/s" + print "Time", op, op.compute_time, "s \t", (op.total_flop / op.compute_time) * 1e-9, "GFlop/s" q_time += op.queued_time s_time += op.submit_time - print "Computing time : ", c_time, "s \t", (c_flop/c_time) * 1e-9, "GFlop/s" + print "Computing time : ", c_time, "s \t", (c_flop / c_time) * 1e-9, "GFlop/s" if not self.operators[0].gpu_kernel is None: print "OpenCL queued time : ", q_time, "s" print "OpenCL submit time : ", s_time, "s" diff --git a/parmepy/new_ParMePy/Utils/Linear.py b/parmepy/new_ParMePy/Utils/Linear.py index be85e2eb62bc8064423d2c0377236ad9382f42c1..38fe792b5c427f412eb05b5c657bcb078f1442b2 100644 --- a/parmepy/new_ParMePy/Utils/Linear.py +++ b/parmepy/new_ParMePy/Utils/Linear.py @@ -25,7 +25,6 @@ class Linear(InterpolationMethod): self.grid = grid self.gvalues = gvalues self.dim_range = xrange(self.grid.dimension) - self.ind = np.empty(grid.shape, dtype=dtype_integer) self.nb_flop = 9 def interpolate(self, t, ppos, dir): @@ -38,9 +37,12 @@ class Linear(InterpolationMethod): @param dir : interpolation direction @return particle velocity, velocity at position ppos. """ + ind = np.empty(self.grid.shape, dtype=dtype_integer) a0 = ((ppos - self.grid.min) / self.grid.elementSize) - self.ind[...] = (np.round(np.abs(a0))) * np.sign(a0) - index = [self.ind[..., i] for i in self.dim_range] + ind[...] = (np.round(np.abs(a0))) * np.sign(a0) + ind[..., dir] = np.floor(a0[..., dir]) + #ind[...] = (np.round(np.abs(a0))) * np.sign(a0) + index = [ind[..., i] for i in self.dim_range] index[dir] = (index[dir] + self.grid.elementNumber[dir]) % self.grid.elementNumber[dir] y = (ppos[..., dir] - self.grid[index][..., dir]) / self.grid.elementSize[dir] res = np.copy(self.gvalues.values) diff --git a/parmepy/new_ParMePy/Utils/M6Prime.py b/parmepy/new_ParMePy/Utils/M6Prime.py index 98f6f289b7b6e62eb10c4ec01ae733ba36b615e0..e965760bc93e84c42be8e82335a523bc01549df4 100644 --- a/parmepy/new_ParMePy/Utils/M6Prime.py +++ b/parmepy/new_ParMePy/Utils/M6Prime.py @@ -17,7 +17,6 @@ class M6Prime(RemeshingMethod): """ RemeshingMethod.__init__(self, grid, gvalues) self.dim_range = xrange(self.grid.dimension) - self.ind = np.empty(grid.shape, dtype=dtype_integer) self.nb_flop = 106 def remesh(self, ppos, pscal, dir): @@ -28,28 +27,41 @@ class M6Prime(RemeshingMethod): @param pscal : particle scalar. @param dir : direction to remesh. """ + ind = np.empty(self.grid.shape, dtype=dtype_integer) a0 = ((ppos - self.grid.min) / self.grid.elementSize) - self.ind[...] = (np.round(np.abs(a0))) * np.sign(a0) - index = [self.ind[..., i] for i in self.dim_range] - x0 = (ppos[..., dir] - self.ind[..., dir] * self.grid.elementSize[dir] - self.grid.min[dir]) / self.grid.elementSize[dir] + ind[...] = (np.round(np.abs(a0))) * np.sign(a0) + ind[..., dir] = np.floor(a0[..., dir]) + x0 = (ppos[..., dir] - ind[..., dir] * self.grid.elementSize[dir] - self.grid.min[dir]) / self.grid.elementSize[dir] am2 = (-(x0) * (5. * (x0 + 2.) - 8.) * (x0 - 1.) ** 3) / 24. am = x0 * (x0 - 1.) * (25. * (x0 + 1.) ** 3 - 114. * (x0 + 1.) ** 2 + 153. * (x0 + 1.) - 48.) / 24. a0 = -(x0 - 1.) * (25. * x0 ** 4 - 38. * x0 ** 3 - 3. * x0 ** 2 + 12. * x0 + 12.) / 12. ap = x0 * (25. * (1. - x0) ** 4 - 38. * (1. - x0) ** 3 - 3. * (1. - x0) ** 2 + 12. * (1. - x0) + 12.) / 12. ap2 = (1. - x0) * (-x0) * (25. * (2. - x0) ** 3 - 114. * (2. - x0) ** 2 + 153. * (2. - x0) - 48.) / 24. ap3 = -(1. - x0) * ((5. * (3. - x0) - 8.) * (-x0) ** 3) / 24. - index[dir] = (index[dir] - 2 + self.grid.elementNumber[dir]) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * am2 - index[dir] = (index[dir] + 1 ) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * am - index[dir] = (index[dir] + 1 ) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * a0 - index[dir] = (index[dir] + 1 ) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * ap - index[dir] = (index[dir] + 1 ) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * ap2 - index[dir] = (index[dir] + 1 ) % self.grid.elementNumber[dir] - self.gvalues.values[tuple(index)] += pscal * ap3 + + ind[..., dir] = (ind[..., dir] - 2 + self.grid.elementNumber[dir]) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), am2.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w + + ind[..., dir] = (ind[..., dir] + 1) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), am.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w + + ind[..., dir] = (ind[..., dir] + 1) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), a0.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w + + ind[..., dir] = (ind[..., dir] + 1) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), ap.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w + + ind[..., dir] = (ind[..., dir] + 1) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), ap2.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w + + ind[..., dir] = (ind[..., dir] + 1) % self.grid.elementNumber[dir] + for i_index, ps, w in zip(ind.reshape((-1,2)), pscal.reshape((-1)), ap3.reshape((-1))): + self.gvalues.values[tuple(i_index)] += ps * w def __str__(self): """ToString method"""