diff --git a/examples/helmholtz/comparisonORAS/main.cpp b/examples/helmholtz/comparisonORAS/main.cpp
index 2fc44d5b3e8edc74a1ce086cab13fb33e502e925..254ec22d265b378372c839faa0ac30270728faf9 100644
--- a/examples/helmholtz/comparisonORAS/main.cpp
+++ b/examples/helmholtz/comparisonORAS/main.cpp
@@ -298,6 +298,63 @@ void solveOSM(const example::AbstractMesh &myMesh, gmshfem::function::ScalarFunc
 }
 
 
+struct AbstractSourceFiller {
+  virtual ~AbstractSourceFiller() = default;
+  virtual void fill(std::vector< std::tuple< double, double, double > >& src, double Lx, double Ly, double Lz, double lcWater, int numLc) = 0;
+};
+
+struct DefaultSourceFiller : public AbstractSourceFiller {
+  void fill(std::vector< std::tuple< double, double, double > >& src, double Lx, double Ly, double Lz, double lcWater, int numLc) override {
+    src.clear();
+    std::vector<double> xs = {0.175, 0.275, 0.395, 0.475, 0.575, 0.675, 0.775, 0.855};
+    std::vector<double> ys = {0.175, 0.275, 0.395, 0.475, 0.575, 0.675, 0.775, 0.855};
+    for (unsigned i = 0; i < xs.size(); ++i) {
+      xs[i] = xs[i] * Lx;
+      ys[i] = ys[i] * Ly;
+    }
+    for (int i = 0; i < xs.size(); ++i) {
+      for (int j = 0; j < ys.size(); ++j) {
+        src.push_back({xs[i], ys[j], Lz - 100});
+      }
+    }
+
+  }
+};
+
+struct CloseSourcesFiller : public AbstractSourceFiller {
+  void fill(std::vector< std::tuple< double, double, double > >& src, double Lx, double Ly, double Lz, double lcWater, int numLc) override {
+    src.clear();
+    double xmid = Lx / 2;
+    double ymid = Ly / 2;
+    std::vector< double > xs;
+    std::vector< double > ys;
+    for(int i = -4; i < 3; ++i) {
+      xs.push_back(xmid + (i + 0.5) * lcWater * numLc);
+      ys.push_back(ymid + (i + 0.5) * lcWater * numLc);
+    }
+    for (int i = 0; i < xs.size(); ++i) {
+      for (int j = 0; j < ys.size(); ++j) {
+        src.push_back({xs[i], ys[j], Lz - 100});
+      }
+    }
+  }
+};
+
+struct LineSourceFiller : public AbstractSourceFiller {
+  void fill(std::vector< std::tuple< double, double, double > >& src, double Lx, double Ly, double Lz, double lcWater, int numLc) override {
+    src.clear();
+    const int maxSrc = 64;
+    double step = lcWater * numLc;
+    for (int i = 0; i < maxSrc; ++i) {
+      double y = Ly * 0.5 + (i - maxSrc / 2) * step;
+      if (y < 0 || y > Ly) {
+        throw std::runtime_error("Source y out of bounds at i = " + std::to_string(i) + " y = " + std::to_string(y));
+      }
+      src.push_back({Lx / 2, y, Lz - 100});
+    }
+  }
+};
+
 
 int main(int argc, char **argv)
 {
@@ -368,6 +425,26 @@ int main(int argc, char **argv)
     }
   }
 
+
+  gmshfem::msg::print << "xs and ys size after : " << xs.size() << " " << ys.size() << gmshfem::msg::endl;
+  std::unique_ptr<AbstractSourceFiller> sourceFiller;
+  std::string sourceType = "default";
+  gmshDdm.userDefinedParameter(sourceType, "sourceType");
+  if (sourceType == "default") {
+    sourceFiller = std::make_unique<DefaultSourceFiller>();
+  } else if (sourceType == "close") {
+    sourceFiller = std::make_unique<CloseSourcesFiller>();
+  } else if (sourceType == "line") {
+    sourceFiller = std::make_unique<LineSourceFiller>();
+  } else {
+    gmshfem::msg::error << "Unknown source type: " << sourceType << gmshfem::msg::endl;
+    return 1;
+  }
+  xs.clear();
+
+  sourceFiller->fill(sources, geo.Lx, geo.Ly, geo.Lz, lcwater, numLc);
+
+
   if (rank == 0) gmshfem::msg::info << "Number of sources: " << sources.size() << gmshfem::msg::endl;
   mpi::barrier();