Skip to content

Commit 1dd68b4

Browse files
nknk567sekelle
andauthored
TDE initializers (#534)
* Read / Write starData, tdeOrbitInit, polytrope * add std-relax propagator * Move polytrope creation functions to physics/. Code-reuse in Evrard and Polytrope initializer. TDE initializers compile switch. --------- Co-authored-by: Sebastian Keller <sebastian.f.keller@gmail.com>
1 parent 5f93264 commit 1dd68b4

31 files changed

Lines changed: 1085 additions & 143 deletions

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ if (SPH_EXA_WITH_GRACKLE)
109109
endif()
110110

111111
option(SPH_EXA_WITH_DISKS "Enable disk physics and propagator" OFF)
112+
option(SPH_EXA_WITH_TDE_INIT "Enable TDE initializers" OFF)
112113

113114
add_subdirectory(domain)
114115
add_subdirectory(ryoanji)

main/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ set(COOLING_DIR ${PROJECT_SOURCE_DIR}/physics/cooling/include)
44
set(RYOANJI_DIR ${PROJECT_SOURCE_DIR}/ryoanji/src)
55
set(SPH_DIR ${PROJECT_SOURCE_DIR}/sph/include)
66
set(DISK_DIR ${PROJECT_SOURCE_DIR}/physics/Disk/include)
7+
set(POLYTROPE_DIR ${PROJECT_SOURCE_DIR}/physics/polytrope/include)
78

89
add_subdirectory(src)
910
if (BUILD_TESTING)

main/src/init/CMakeLists.txt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,27 @@
11
add_library(sim_init sim_init.cpp)
22
target_include_directories(sim_init PRIVATE ${PROJECT_SOURCE_DIR}/main/src ${COOLING_DIR} ${CSTONE_DIR} ${SPH_DIR}
3-
${MPI_CXX_INCLUDE_PATH})
3+
${MPI_CXX_INCLUDE_PATH} ${DISK_DIR})
44
target_link_libraries(sim_init PRIVATE ${MPI_CXX_LIBRARIES} OpenMP::OpenMP_CXX)
5+
6+
function(enableTDEInit exename)
7+
if (SPH_EXA_WITH_TDE_INIT)
8+
target_include_directories(${exename} PRIVATE ${POLYTROPE_DIR})
9+
target_compile_definitions(${exename} PRIVATE SPH_EXA_HAVE_TDE_INIT)
10+
target_link_libraries(${exename} PRIVATE polytrope)
11+
endif ()
12+
endfunction()
13+
14+
enableTDEInit(sim_init)
515
enableGrackle(sim_init)
616

717
if (CMAKE_CUDA_COMPILER OR CMAKE_HIP_COMPILER)
818
add_library(sim_init_gpu sim_init.cpp)
919
target_compile_definitions(sim_init_gpu PRIVATE USE_CUDA)
1020
target_include_directories(sim_init_gpu PRIVATE ${PROJECT_SOURCE_DIR}/main/src ${COOLING_DIR} ${CSTONE_DIR}
11-
${SPH_DIR} ${MPI_CXX_INCLUDE_PATH})
21+
${SPH_DIR} ${MPI_CXX_INCLUDE_PATH} ${DISK_DIR})
1222
target_link_libraries(sim_init_gpu PRIVATE ${MPI_CXX_LIBRARIES} OpenMP::OpenMP_CXX)
1323
enableGrackle(sim_init_gpu)
24+
enableTDEInit(sim_init_gpu)
1425
endif ()
1526

1627
if (CMAKE_CUDA_COMPILER)

main/src/init/evrard_cooling_init.hpp

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@
3030

3131
#pragma once
3232

33-
#include "cstone/primitives/primitives_acc.hpp"
34-
3533
#include "evrard_init.hpp"
3634
#include "cooling/cooler.hpp"
37-
3835
#include "cooling/init_chemistry.h"
3936

4037
namespace sphexa
@@ -63,31 +60,26 @@ InitSettings evrardCoolingConstants()
6360
}
6461

6562
template<class Dataset>
66-
class EvrardGlassSphereCooling : public EvrardGlassSphere<Dataset>
63+
class EvrardGlassSphereCooling : public RadialProfile<Dataset>
6764
{
68-
using Base = EvrardGlassSphere<Dataset>;
69-
mutable InitSettings settings_;
65+
using Base = RadialProfile<Dataset>;
66+
using Base::settings_;
7067

7168
public:
7269
EvrardGlassSphereCooling(std::string initBlock, std::string settingsFile, IFileReader* reader)
73-
: EvrardGlassSphere<Dataset>(initBlock, settingsFile, reader)
70+
: Base(std::move(initBlock), evrardCoolingConstants(), std::move(settingsFile), reader)
7471
{
75-
Dataset d;
76-
settings_ = buildSettings(d, evrardCoolingConstants(), settingsFile, reader);
77-
Base::resetConstants(settings_);
7872
}
7973

8074
cstone::Box<typename Dataset::RealType> init(int rank, int numRanks, size_t cbrtNumPart, Dataset& simData,
8175
IFileReader* reader) const override
8276
{
83-
constexpr bool gpu = cstone::HaveGpu<typename Dataset::AcceleratorType>{};
84-
auto box = Base::init(rank, numRanks, cbrtNumPart, simData, reader);
85-
cstone::fill<gpu>(simData.hydro.u.begin(), simData.hydro.u.end(), settings_.at("u0"));
77+
auto radialTransform = [](auto r) { return std::sqrt(r); };
78+
auto globalBox = Base::init(rank, numRanks, cbrtNumPart, simData, reader, settings_.at("r"), radialTransform);
79+
initEvrardFields(simData.hydro, settings_);
8680
cooling::initChemistryData(simData.chem, simData.hydro.x.size());
87-
return box;
81+
return globalBox;
8882
}
89-
90-
[[nodiscard]] const InitSettings& constants() const override { return settings_; }
9183
};
9284

9385
} // namespace sphexa

main/src/init/evrard_init.hpp

Lines changed: 13 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,10 @@
11
/*
2-
* MIT License
2+
* SPH-EXA
33
*
4-
* Copyright (c) 2021 CSCS, ETH Zurich
5-
* 2021 University of Basel
4+
* Copyright (c) 2026 CSCS, ETH Zurich, University of Zurich, University of Basel
65
*
7-
* Permission is hereby granted, free of charge, to any person obtaining a copy
8-
* of this software and associated documentation files (the "Software"), to deal
9-
* in the Software without restriction, including without limitation the rights
10-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11-
* copies of the Software, and to permit persons to whom the Software is
12-
* furnished to do so, subject to the following conditions:
13-
*
14-
* The above copyright notice and this permission notice shall be included in all
15-
* copies or substantial portions of the Software.
16-
*
17-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23-
* SOFTWARE.
6+
* Please, refer to the LICENSE file in the root directory.
7+
* SPDX-License-Identifier: MIT License
248
*/
259

2610
/*! @file
@@ -34,19 +18,14 @@
3418
#include <map>
3519

3620
#include "cstone/primitives/primitives_acc.hpp"
37-
#include "cstone/sfc/box.hpp"
3821
#include "cstone/tree/continuum.hpp"
39-
#include "sph/eos.hpp"
4022

41-
#include "isim_init.hpp"
42-
#include "early_sync.hpp"
43-
#include "grid.hpp"
44-
#include "utils.hpp"
23+
#include "radial_profile.hpp"
4524

4625
namespace sphexa
4726
{
4827

49-
std::map<std::string, double> evrardConstants()
28+
InitSettings evrardConstants()
5029
{
5130
return {{"gravConstant", 1.}, {"r", 1.}, {"mTotal", 1.}, {"gamma", 5. / 3.}, {"u0", 0.05},
5231
{"minDt", 1e-4}, {"minDt_m1", 1e-4}, {"mui", 10}, {"ng0", 100}, {"ngmax", 150}};
@@ -101,22 +80,6 @@ void initEvrardFields(Dataset& d, const std::map<std::string, double>& constants
10180
d.h = std::move(h);
10281
}
10382

104-
template<class Vector>
105-
void contractRhoProfile(Vector& x, Vector& y, Vector& z)
106-
{
107-
#pragma omp parallel for schedule(static)
108-
for (size_t i = 0; i < x.size(); i++)
109-
{
110-
auto radius0 = std::sqrt(x[i] * x[i] + y[i] * y[i] + z[i] * z[i]);
111-
112-
// multiply coordinates by sqrt(r) to generate a density profile ~ 1/r
113-
auto contraction = std::sqrt(radius0);
114-
x[i] *= contraction;
115-
y[i] *= contraction;
116-
z[i] *= contraction;
117-
}
118-
}
119-
12083
//! @brief Estimate SFC partition of the Evrard sphere based on approximate continuum particle counts
12184
template<class KeyType, class T>
12285
std::tuple<KeyType, KeyType> estimateEvrardSfcPartition(size_t cbrtNumPart, const cstone::Box<T>& box, int rank,
@@ -142,74 +105,25 @@ std::tuple<KeyType, KeyType> estimateEvrardSfcPartition(size_t cbrtNumPart, cons
142105
}
143106

144107
template<class Dataset>
145-
class EvrardGlassSphere : public ISimInitializer<Dataset>
108+
class EvrardGlassSphere : public RadialProfile<Dataset>
146109
{
147-
std::string glassBlock;
148-
mutable InitSettings settings_;
110+
using Base = RadialProfile<Dataset>;
111+
using Base::settings_;
149112

150113
public:
151114
explicit EvrardGlassSphere(std::string initBlock, std::string settingsFile, IFileReader* reader)
152-
: glassBlock(std::move(initBlock))
115+
: Base(std::move(initBlock), evrardConstants(), std::move(settingsFile), reader)
153116
{
154-
Dataset d;
155-
settings_ = buildSettings(d, evrardConstants(), settingsFile, reader);
156117
}
157118

158119
cstone::Box<typename Dataset::RealType> init(int rank, int numRanks, size_t cbrtNumPart, Dataset& simData,
159120
IFileReader* reader) const override
160121
{
161-
auto& d = simData.hydro;
162-
using KeyType = typename Dataset::KeyType;
163-
using T = typename Dataset::RealType;
164-
165-
std::vector<T> xBlock, yBlock, zBlock;
166-
readTemplateBlock(glassBlock, reader, xBlock, yBlock, zBlock);
167-
size_t blockSize = xBlock.size();
168-
169-
int multi1D = std::rint(cbrtNumPart / std::cbrt(blockSize));
170-
cstone::Vec3<int> multiplicity = {multi1D, multi1D, multi1D};
171-
172-
T r = settings_.at("r");
173-
cstone::Box<T> globalBox(-r, r, cstone::BoundaryType::open);
174-
175-
auto [keyStart, keyEnd] = equiDistantSfcSegments<KeyType>(rank, numRanks, 100);
176-
177-
std::vector<T> x, y, z;
178-
auto t0 = std::chrono::high_resolution_clock::now();
179-
assembleCuboid<T>(keyStart, keyEnd, globalBox, multiplicity, xBlock, yBlock, zBlock, x, y, z);
180-
cutSphere(r, x, y, z);
181-
auto t1 = std::chrono::high_resolution_clock::now();
182-
if (rank == 0) std::cout << "assembly " << std::chrono::duration<float>(t1 - t0).count() << std::endl;
183-
184-
size_t numParticlesGlobal = x.size();
185-
MPI_Allreduce(MPI_IN_PLACE, &numParticlesGlobal, 1, MpiType<size_t>{}, MPI_SUM, simData.comm);
186-
187-
contractRhoProfile(x, y, z);
188-
189-
t0 = std::chrono::high_resolution_clock::now();
190-
d.x = x; // uploads to GPU if active
191-
d.y = y;
192-
d.z = z;
193-
syncCoords<KeyType>(rank, numRanks, numParticlesGlobal, d.x, d.y, d.z, globalBox);
194-
// 2nd call needed to reduce imbalance, 1st call is not able to fully balance number of particles per rank
195-
syncCoords<KeyType>(rank, numRanks, numParticlesGlobal, d.x, d.y, d.z, globalBox);
196-
t1 = std::chrono::high_resolution_clock::now();
197-
if (rank == 0) std::cout << "earlySync " << std::chrono::duration<float>(t1 - t0).count() << std::endl;
198-
199-
d.resize(d.x.size());
200-
201-
settings_["numParticlesGlobal"] = double(numParticlesGlobal);
202-
BuiltinWriter attributeSetter(settings_);
203-
d.loadOrStoreAttributes(&attributeSetter);
204-
205-
initEvrardFields(d, settings_);
206-
122+
auto radialTransform = [](auto r) { return std::sqrt(r); };
123+
auto globalBox = Base::init(rank, numRanks, cbrtNumPart, simData, reader, settings_.at("r"), radialTransform);
124+
initEvrardFields(simData.hydro, settings_);
207125
return globalBox;
208126
}
209-
210-
void resetConstants(InitSettings newSettings) { settings_ = std::move(newSettings); }
211-
212-
[[nodiscard]] const InitSettings& constants() const override { return settings_; }
213127
};
214128

215129
} // namespace sphexa

main/src/init/factory.hpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,26 @@ std::unique_ptr<ISimInitializer<Dataset>> initializerFactory(std::string testCas
9292
if (glassBlock.empty()) { throw std::runtime_error("need a valid glass block for evrard-cooling\n"); }
9393
return SimInitializers<Dataset>::makeEvrardCooling(glassBlock, settingsFile, reader);
9494
}
95+
if (testNamedBase == "polytrope")
96+
{
97+
if (glassBlock.empty()) { throw std::runtime_error("need a valid glass block to create polytrope\n"); }
98+
else { return SimInitializers<Dataset>::makePolytrope(glassBlock, settingsFile, reader); }
99+
}
100+
if (testCase.starts_with("tde-orbit"))
101+
{
102+
// use as: --init tde-orbit:file.h5:2 to read from step 2 of file.h5
103+
const std::string filePathAndStep = strAfterSign(testCase, ":");
104+
const std::string filePath = strBeforeSign(filePathAndStep, ":");
105+
const int step = numberAfterSign(filePathAndStep, ":");
106+
std::printf("%s\n", testCase.c_str());
107+
std::printf("%s\n", filePath.c_str());
108+
std::printf("step: %d\n", step);
109+
if (std::filesystem::exists(filePath))
110+
{
111+
return SimInitializers<Dataset>::makeTDEOrbitInit(filePath, step, reader);
112+
}
113+
}
114+
95115
if (std::filesystem::exists(strBeforeSign(testCase, ":")))
96116
{
97117
return SimInitializers<Dataset>::makeFile(strBeforeSign(testCase, ":"), numberAfterSign(testCase, ":"), reader);

main/src/init/file_init.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -244,13 +244,16 @@ class FileSplitInit : public ISimInitializer<Dataset>
244244
replicateField(reader, "vx", d.vx, T(1));
245245
replicateField(reader, "vy", d.vy, T(1));
246246
replicateField(reader, "vz", d.vz, T(1));
247-
replicateField(reader, "temp", d.temp, T(1));
247+
if (d.isAllocated("temp")) { replicateField(reader, "temp", d.temp, T(1)); }
248+
else if (d.isAllocated("u")) { replicateField(reader, "u", d.u, T(1)); }
248249
cstone::fill<gpu>(d.du_m1.begin(), d.du_m1.end(), 0);
249250
cstone::fill<gpu>(d.rung.begin(), d.rung.end(), 0);
250251
cstone::scaleGpuAcc<gpu>(d.vx.data(), d.vx.data() + d.vx.size(), d.x_m1.data(), d.minDt);
251252
cstone::scaleGpuAcc<gpu>(d.vy.data(), d.vy.data() + d.vy.size(), d.y_m1.data(), d.minDt);
252253
cstone::scaleGpuAcc<gpu>(d.vz.data(), d.vz.data() + d.vz.size(), d.z_m1.data(), d.minDt);
253254

255+
generateParticleIDs<gpu>(d.id);
256+
254257
if (d.isAllocated("alpha"))
255258
{
256259
try

main/src/init/isim_init.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ struct SimInitializers
7272
static InitPtr makeSedovGrid();
7373
static InitPtr makeTurbulence(std::string glassBlock, std::string settingsFile, IFileReader* reader);
7474
static InitPtr makeWindShock(std::string glassBlock, std::string settingsFile, IFileReader* reader);
75+
static InitPtr makePolytrope(std::string glassBlock, std::string settingsFile, IFileReader* reader);
76+
static InitPtr makeTDEOrbitInit(const std::string& filePath, int initStep, IFileReader* reader);
7577
};
7678

7779
extern template struct SimInitializers<SimulationData<cstone::CpuTag>>;

main/src/init/kelvin_helmholtz_init.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,11 @@
3333

3434
#include "cstone/primitives/primitives_acc.hpp"
3535
#include "cstone/sfc/box.hpp"
36-
#include "cstone/sfc/sfc.hpp"
37-
#include "cstone/primitives/gather.hpp"
3836

39-
#include "isim_init.hpp"
4037
#include "grid.hpp"
4138
#include "utils.hpp"
39+
#include "early_sync.hpp"
40+
#include "isim_init.hpp"
4241

4342
namespace sphexa
4443
{

0 commit comments

Comments
 (0)