From f5ee688a95a3ad87cd5a7a996e657bf871f52384 Mon Sep 17 00:00:00 2001
From: Jean-Matthieu Etancelin <jean-matthieu.etancelin@univ-reims.fr>
Date: Mon, 16 Mar 2015 10:11:17 +0100
Subject: [PATCH] Fix multiresolution filter. Fix gravity term in baroclinic
 operator.

---
 .../hysop/gpu/cl_src/kernels/fine_to_coarse_filter.cl  |  4 ++++
 HySoP/hysop/gpu/gpu_multiresolution_filter.py          | 10 ++++++++--
 HySoP/hysop/operator/discrete/baroclinic.py            |  6 +++++-
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/HySoP/hysop/gpu/cl_src/kernels/fine_to_coarse_filter.cl b/HySoP/hysop/gpu/cl_src/kernels/fine_to_coarse_filter.cl
index 9f0436f7b..2851c6038 100644
--- a/HySoP/hysop/gpu/cl_src/kernels/fine_to_coarse_filter.cl
+++ b/HySoP/hysop/gpu/cl_src/kernels/fine_to_coarse_filter.cl
@@ -1,3 +1,7 @@
+__kernel void initialize_output(__global float* scal_out) {
+  scal_out[get_global_id(0) + get_global_id(1)*NB_OUT_X + get_global_id(2)*NB_OUT_X*NB_OUT_Y] = 0.0;
+}
+
 __kernel void coarse_to_fine_filter(__global const float* scal_in,
 				    __global float* scal_out,
 				    float scale_factor,
diff --git a/HySoP/hysop/gpu/gpu_multiresolution_filter.py b/HySoP/hysop/gpu/gpu_multiresolution_filter.py
index 091a53490..f388f61c8 100644
--- a/HySoP/hysop/gpu/gpu_multiresolution_filter.py
+++ b/HySoP/hysop/gpu/gpu_multiresolution_filter.py
@@ -124,9 +124,14 @@ class GPUFilterFineToCoarse(FilterFineToCoarse, GPUOperator):
         prg = self.cl_env.build_src(src, build_options, vec)
         self.fine_to_coarse = KernelLauncher(
             prg.coarse_to_fine_filter, self.cl_env.queue, gwi, lwi)
+        self.initialize = KernelLauncher(
+            prg.initialize_output, self.cl_env.queue,
+            self.field_out[0].data[0].shape, None)
 
     def apply(self, simulation=None):
         #evts = []
+        self.field_out[0].events.append(
+            self.initialize(self.field_out[0].gpu_data[0]))
         for iy in xrange(len(self._rmsh.weights)):
             for iz in xrange(len(self._rmsh.weights)):
                 evt = self.fine_to_coarse(self.field_in[0].gpu_data[0],
@@ -307,5 +312,6 @@ class GPUFilterFineToCoarse(FilterFineToCoarse, GPUOperator):
         # set_gh_zr.wait()
 
     def get_profiling_info(self):
-        for p in self.fine_to_coarse.profile:
-            self.profiler += p
+        for k in (self.fine_to_coarse, self.initialize):
+            for p in k.profile:
+                self.profiler += p
diff --git a/HySoP/hysop/operator/discrete/baroclinic.py b/HySoP/hysop/operator/discrete/baroclinic.py
index 2dabb1879..b02527fb2 100644
--- a/HySoP/hysop/operator/discrete/baroclinic.py
+++ b/HySoP/hysop/operator/discrete/baroclinic.py
@@ -64,6 +64,9 @@ class Baroclinic(DiscreteOperator):
             indices=self.velocity.topology.mesh.iCompute,
             method=self.method[SpaceDiscretisation])
 
+        # Gravity vector
+        self._gravity = npw.asrealarray([0., 0., -9.81])
+
         # Time stem of the previous iteration
         self._old_dt = None
 
@@ -139,7 +142,8 @@ class Baroclinic(DiscreteOperator):
             self._result[d][iCompute] -= self._tempGrad[d][iCompute]
 
         # gravity term : result = result - g
-        ### Seems not working: self._result[2][iCompute] -= 1.
+        for d in xrange(self.velocity.dimension):
+            self._result[2][iCompute] -= self._gravity[d]
 
         # baroclinicTerm = -(gradRho/rho) x (gradP/rho)
         self._tempGrad = self._gradOp(self.density[0:1], self._tempGrad)
-- 
GitLab