| 354 | } |
| 355 | |
| 356 | auto loadSourcesFromFSRM(const char* fileName, |
| 357 | const seissol::geometry::MeshReader& mesh, |
| 358 | seissol::initializer::LTSTree* ltsTree, |
| 359 | seissol::initializer::LTS* lts, |
| 360 | seissol::initializer::Lut* ltsLut, |
| 361 | seissol::memory::Memkind memkind) |
| 362 | -> std::unordered_map<LayerType, std::vector<seissol::kernels::PointSourceClusterPair>> { |
| 363 | // until further rewrite, we'll leave most of the raw pointers/arrays in here. |
| 364 | |
| 365 | const int rank = seissol::MPI::mpi.rank(); |
| 366 | |
| 367 | seissol::sourceterm::FSRMSource fsrm; |
| 368 | fsrm.read(std::string(fileName)); |
| 369 | |
| 370 | logInfo(rank) << "Finding meshIds for point sources..."; |
| 371 | |
| 372 | auto contained = std::vector<short>(fsrm.numberOfSources); |
| 373 | auto meshIds = std::vector<unsigned>(fsrm.numberOfSources); |
| 374 | |
| 375 | initializer::findMeshIds( |
| 376 | fsrm.centers.data(), mesh, fsrm.numberOfSources, contained.data(), meshIds.data()); |
| 377 | |
| 378 | #ifdef USE_MPI |
| 379 | logInfo(rank) << "Cleaning possible double occurring point sources for MPI..."; |
| 380 | initializer::cleanDoubles(contained.data(), fsrm.numberOfSources); |
| 381 | #endif |
| 382 | |
| 383 | auto originalIndex = std::vector<unsigned>(fsrm.numberOfSources); |
| 384 | unsigned numSources = 0; |
| 385 | for (unsigned source = 0; source < fsrm.numberOfSources; ++source) { |
| 386 | originalIndex[numSources] = source; |
| 387 | meshIds[numSources] = meshIds[source]; |
| 388 | numSources += contained[source]; |
| 389 | } |
| 390 | |
| 391 | logInfo(rank) << "Mapping point sources to LTS cells..."; |
| 392 | auto layeredClusterMapping = |
| 393 | mapPointSourcesToClusters(meshIds.data(), numSources, ltsTree, lts, ltsLut, memkind); |
| 394 | std::unordered_map<LayerType, std::vector<seissol::kernels::PointSourceClusterPair>> |
| 395 | layeredSourceClusters; |
| 396 | |
| 397 | for (auto layer : {Interior, Copy}) { |
| 398 | auto& sourceCluster = layeredSourceClusters[layer]; |
| 399 | sourceCluster.resize(ltsTree->numChildren()); |
| 400 | auto& clusterMappings = layeredClusterMapping[layer]; |
| 401 | for (unsigned cluster = 0; cluster < ltsTree->numChildren(); ++cluster) { |
| 402 | auto numberOfSources = clusterMappings[cluster].sources.size(); |
| 403 | auto sources = PointSources{memkind}; |
| 404 | sources.mode = PointSourceMode::Fsrm; |
| 405 | sources.numberOfSources = numberOfSources; |
| 406 | sources.mInvJInvPhisAtSources.resize(numberOfSources); |
| 407 | sources.tensor.resize(numberOfSources); |
| 408 | sources.onsetTime.resize(numberOfSources); |
| 409 | sources.samplingInterval.resize(numberOfSources); |
| 410 | sources.sampleOffsets[0].resize(numberOfSources + 1); |
| 411 | sources.sampleOffsets[0][0] = 0; |
| 412 | sources.sample[0].resize(fsrm.numberOfSamples * numberOfSources); |
| 413 |
no test coverage detected