Skip to content
Snippets Groups Projects
Commit b63ffa96 authored by Boris Martin's avatar Boris Martin
Browse files

Flexible source configs

parent c80b0c7d
No related branches found
No related tags found
No related merge requests found
Pipeline #12862 passed
...@@ -298,6 +298,63 @@ void solveOSM(const example::AbstractMesh &myMesh, gmshfem::function::ScalarFunc ...@@ -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) int main(int argc, char **argv)
{ {
...@@ -368,6 +425,26 @@ 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; if (rank == 0) gmshfem::msg::info << "Number of sources: " << sources.size() << gmshfem::msg::endl;
mpi::barrier(); mpi::barrier();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment