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();