MCPcopy Create free account
hub / github.com/SeisSol/SeisSol / loadSourcesFromFSRM

Function loadSourcesFromFSRM

src/SourceTerm/Manager.cpp:356–463  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

354}
355
356auto 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

Callers 1

loadSourcesMethod · 0.85

Calls 11

findMeshIdsFunction · 0.85
cleanDoublesFunction · 0.85
makePointSourceClusterFunction · 0.85
rankMethod · 0.80
resizeMethod · 0.80
numChildrenMethod · 0.80
readMethod · 0.45
dataMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected