21 PetscBool exists = PETSC_FALSE;
23 PetscFunctionBeginUser;
24 PetscCall(PetscTestDirectory(path,
'r', &exists));
26 PetscFunctionReturn(0);
36 PetscFunctionBeginUser;
37 file = fopen(path,
"w");
38 PetscCheck(file != NULL, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Failed to open '%s' for writing.", path);
39 fputs(contents, file);
41 PetscFunctionReturn(0);
50 size_t control_path_len)
52 char bcs_path[PETSC_MAX_PATH_LEN];
53 char post_path[PETSC_MAX_PATH_LEN];
54 char output_dir[PETSC_MAX_PATH_LEN];
55 char log_dir[PETSC_MAX_PATH_LEN];
56 char control_buffer[8192];
58 PetscFunctionBeginUser;
60 PetscCall(PetscSNPrintf(bcs_path,
sizeof(bcs_path),
"%s/bcs.run", tmpdir));
61 PetscCall(PetscSNPrintf(post_path,
sizeof(post_path),
"%s/post.run", tmpdir));
62 PetscCall(PetscSNPrintf(output_dir,
sizeof(output_dir),
"%s/results", tmpdir));
63 PetscCall(PetscSNPrintf(log_dir,
sizeof(log_dir),
"%s/logs", tmpdir));
64 PetscCall(PetscSNPrintf(control_path, control_path_len,
"%s/test.control", tmpdir));
72 "-Zeta INLET constant_velocity vx=0.0 vy=0.0 vz=1.5\n"
73 "+Zeta OUTLET conservation\n"));
79 "output_particles = false\n"));
80 PetscCall(PetscSNPrintf(
82 sizeof(control_buffer),
92 "-profiling_timestep_mode off\n"
93 "-profiling_final_summary true\n"
94 "-postprocessing_config_file %s\n"
110 "-euler_field_source solve\n"
111 "-mom_solver_type EXPLICIT_RK\n"
115 "-particle_console_output_freq 0\n"
128 PetscFunctionReturn(0);
136 PetscFunctionBeginUser;
138 PetscFunctionReturn(0);
146 PetscFunctionBeginUser;
148 PetscFunctionReturn(0);
156 char control_path[PETSC_MAX_PATH_LEN];
159 PetscFunctionBeginUser;
160 PetscCall(PetscOptionsClear(NULL));
162 PetscCall(PetscOptionsSetValue(NULL,
"-control_file", control_path));
165 *simCtx_out = simCtx;
166 PetscFunctionReturn(0);
176 char tmpdir[PETSC_MAX_PATH_LEN];
178 PetscFunctionBeginUser;
181 PetscCall(
PicurvAssertBool((PetscBool)(user->
bbox.
min_coords.
x >= -2.0e-6),
"runtime fixture bbox xmin should stay inside normalized domain tolerance"));
182 PetscCall(
PicurvAssertBool((PetscBool)(user->
bbox.
max_coords.
x <= 1.0 + 2.0e-6),
"runtime fixture bbox xmax should stay inside normalized domain tolerance"));
183 PetscCall(
PicurvAssertBool((PetscBool)(user->
bbox.
max_coords.
y <= 1.0 + 2.0e-6),
"runtime fixture bbox ymax should stay inside normalized domain tolerance"));
184 PetscCall(
PicurvAssertBool((PetscBool)(user->
bbox.
max_coords.
z <= 1.0 + 2.0e-6),
"runtime fixture bbox zmax should stay inside normalized domain tolerance"));
185 PetscCall(
PicurvAssertBool((PetscBool)(simCtx->
bboxlist != NULL),
"runtime fixture should gather bboxlist through SetupDomainRankInfo"));
188 "runtime fixture rank bbox entry should include the local bbox extent"));
192 PetscFunctionReturn(0);
202 char tmpdir[PETSC_MAX_PATH_LEN];
203 char results_dir[PETSC_MAX_PATH_LEN];
204 char logs_dir[PETSC_MAX_PATH_LEN];
207 PetscFunctionBeginUser;
211 PetscCall(PetscSNPrintf(results_dir,
sizeof(results_dir),
"%s/results", tmpdir));
212 PetscCall(PetscSNPrintf(logs_dir,
sizeof(logs_dir),
"%s/logs", tmpdir));
213 PetscCall(
PicurvAssertBool((PetscBool)(user->
da != NULL),
"SetupGridAndSolvers should allocate da"));
214 PetscCall(
PicurvAssertBool((PetscBool)(user->
fda != NULL),
"SetupGridAndSolvers should allocate coordinate DM"));
220 PetscCall(
AssertDirectoryExists(results_dir,
"SetupSimulationEnvironment should create the output directory"));
221 PetscCall(
AssertDirectoryExists(logs_dir,
"SetupSimulationEnvironment should create the log directory"));
224 PetscCall(DMDAVecGetArrayRead(user->
fda, user->
Ucont, &ucont));
226 "InitializeEulerianState should seed a positive inlet-aligned interior field"));
228 "InitializeEulerianState should initialize a spatially consistent interior field"));
229 PetscCall(DMDAVecRestoreArrayRead(user->
fda, user->
Ucont, &ucont));
233 PetscFunctionReturn(0);
243 char tmpdir[PETSC_MAX_PATH_LEN];
245 PetscInt *cell_ids = NULL;
246 PetscInt *status = NULL;
248 PetscFunctionBeginUser;
255 PetscCall(
PicurvAssertBool((PetscBool)(user->
swarm != NULL),
"InitializeParticleSwarm should allocate the solver swarm"));
256 PetscCall(DMSwarmGetLocalSize(user->
swarm, &nlocal));
257 PetscCall(
PicurvAssertIntEqual(8, nlocal,
"single-rank lifecycle particle setup should own all seeded particles"));
259 PetscCall(DMSwarmGetField(user->
swarm,
"DMSwarm_CellID", NULL, NULL, (
void **)&cell_ids));
260 PetscCall(DMSwarmGetField(user->
swarm,
"DMSwarm_location_status", NULL, NULL, (
void **)&status));
261 for (PetscInt p = 0; p < nlocal; ++p) {
262 PetscCall(
PicurvAssertBool((PetscBool)(cell_ids[3 * p + 0] >= 0),
"settled particles should have a valid i cell id"));
263 PetscCall(
PicurvAssertBool((PetscBool)(cell_ids[3 * p + 1] >= 0),
"settled particles should have a valid j cell id"));
264 PetscCall(
PicurvAssertBool((PetscBool)(cell_ids[3 * p + 2] >= 0),
"settled particles should have a valid k cell id"));
267 PetscCall(DMSwarmRestoreField(user->
swarm,
"DMSwarm_CellID", NULL, NULL, (
void **)&cell_ids));
268 PetscCall(DMSwarmRestoreField(user->
swarm,
"DMSwarm_location_status", NULL, NULL, (
void **)&status));
272 PetscFunctionReturn(0);
282 PetscRandom randx = NULL, randy = NULL, randz = NULL;
283 PetscRandom rand_i = NULL, rand_j = NULL, rand_k = NULL;
284 PetscScalar sample_x = 0.0, sample_i = 0.0;
285 PetscReal seconds = 0.0;
287 PetscFunctionBeginUser;
301 PetscCall(
PicurvAssertRealNear(12.5, seconds, 1.0e-12,
"RuntimeWalltimeGuardParsePositiveSeconds parsed value"));
303 PetscCall(PetscRandomGetValue(randx, &sample_x));
304 PetscCall(PetscRandomGetValue(rand_i, &sample_i));
305 PetscCall(
PicurvAssertBool((PetscBool)(PetscRealPart(sample_x) >= 0.0 && PetscRealPart(sample_x) <= 1.0),
306 "InitializeRandomGenerators should honor the configured bbox interval"));
307 PetscCall(
PicurvAssertBool((PetscBool)(PetscRealPart(sample_i) >= 0.0 && PetscRealPart(sample_i) <= 1.0),
308 "InitializeLogicalSpaceRNGs should generate logical coordinates in [0,1]"));
310 PetscCall(PetscRandomDestroy(&randx));
311 PetscCall(PetscRandomDestroy(&randy));
312 PetscCall(PetscRandomDestroy(&randz));
313 PetscCall(PetscRandomDestroy(&rand_i));
314 PetscCall(PetscRandomDestroy(&rand_j));
315 PetscCall(PetscRandomDestroy(&rand_k));
317 PetscFunctionReturn(0);
325 SimCtx *context_only = NULL;
327 char context_tmpdir[PETSC_MAX_PATH_LEN];
328 char grid_tmpdir[PETSC_MAX_PATH_LEN];
330 PetscFunctionBeginUser;
331 PetscCall(
BuildContextOnly(&context_only, context_tmpdir,
sizeof(context_tmpdir)));
332 PetscCall(
PicurvAssertBool((PetscBool)(context_only != NULL),
"CreateSimulationContext should allocate the top-level SimCtx"));
334 PetscCall(PetscOptionsClear(NULL));
342 "SetupGridAndSolvers should allocate baseline Eulerian vectors"));
345 PetscFunctionReturn(0);
362 ierr = PetscInitialize(&argc, &argv, NULL,
"PICurv setup lifecycle tests");
367 ierr =
PicurvRunTests(
"unit-setup", cases,
sizeof(cases) /
sizeof(cases[0]));
373 ierr = PetscFinalize();
Header file for Particle Swarm management functions.
PetscErrorCode InitializeParticleSwarm(SimCtx *simCtx)
High-level particle initialization orchestrator for a simulation run.
PetscErrorCode InitializeEulerianState(SimCtx *simCtx)
High-level orchestrator to set the complete initial state of the Eulerian solver.
PetscErrorCode PerformInitializedParticleSetup(SimCtx *simCtx)
Finalizes the simulation setup at t=0, ensuring a consistent state before time marching.
PetscErrorCode InitializeRandomGenerators(UserCtx *user, PetscRandom *randx, PetscRandom *randy, PetscRandom *randz)
Initializes random number generators for assigning particle properties.
PetscErrorCode SetupGridAndSolvers(SimCtx *simCtx)
The main orchestrator for setting up all grid-related components.
PetscErrorCode InitializeBrownianRNG(SimCtx *simCtx)
Initializes a single master RNG for time-stepping physics (Brownian motion).
PetscErrorCode SetupSimulationEnvironment(SimCtx *simCtx)
Verifies and prepares the complete I/O environment for a simulation run.
PetscErrorCode CreateSimulationContext(int argc, char **argv, SimCtx **p_simCtx)
Allocates and populates the master SimulationContext object.
PetscErrorCode InitializeLogicalSpaceRNGs(PetscRandom *rand_logic_i, PetscRandom *rand_logic_j, PetscRandom *rand_logic_k)
Initializes random number generators for logical space operations [0.0, 1.0).
PetscBool RuntimeWalltimeGuardParsePositiveSeconds(const char *text, PetscReal *seconds_out)
Parse a positive floating-point seconds value from runtime metadata.
static PetscErrorCode BuildContextOnly(SimCtx **simCtx_out, char *tmpdir, size_t tmpdir_len)
Builds only the top-level simulation context used by partial-initialization cleanup tests.
static PetscErrorCode PrepareContextOnlyConfig(char *tmpdir, size_t tmpdir_len, char *control_path, size_t control_path_len)
Creates the control-file bundle needed for the context-only cleanup test.
int main(int argc, char **argv)
Runs the unit-setup PETSc test binary.
static PetscErrorCode AssertDirectoryExists(const char *path, const char *context)
Asserts that a directory path exists and is readable.
static PetscErrorCode TestSetupLifecycleRandomGeneratorsAndCleanup(void)
Tests standalone RNG initialization helpers and minimal-context cleanup.
static PetscErrorCode WriteContextOnlyFile(const char *path, const char *contents)
Writes one small temporary text file used by the partial-lifecycle context-only fixture.
static PetscErrorCode BuildLifecycleContext(PetscBool enable_particles, SimCtx **simCtx_out, char *tmpdir, size_t tmpdir_len)
Builds a full setup fixture through environment, grid, BC, and domain-rank initialization.
static PetscErrorCode FreeLifecycleContext(SimCtx **simCtx_ptr)
Finalizes and frees one lifecycle test context, then clears any PETSc options used to build it.
static PetscErrorCode TestSetupLifecycleParticleInitialization(void)
Tests particle-swarm initialization and deterministic settlement on a tiny fully initialized case.
static PetscErrorCode TestSetupLifecycleCoreSolverSetup(void)
Tests the core setup lifecycle through environment, grid, BC, rank-info, and Eulerian-state initializ...
static PetscErrorCode TestSharedRuntimeFixtureContracts(void)
Tests that the shared richer runtime fixture mirrors normalized production setup contracts.
static PetscErrorCode TestSetupLifecycleCleanupAcrossInitializationStates(void)
Tests cleanup after partial and fuller setup states without requiring unsupported double-finalization...
PetscErrorCode PicurvMakeTempDir(char *path, size_t path_len)
Creates a unique temporary directory for one test case.
PetscErrorCode PicurvCreateMinimalContexts(SimCtx **simCtx_out, UserCtx **user_out, PetscInt mx, PetscInt my, PetscInt mz)
Builds minimal SimCtx and UserCtx fixtures for C unit tests.
PetscErrorCode PicurvAssertRealNear(PetscReal expected, PetscReal actual, PetscReal tol, const char *context)
Asserts that two real values agree within tolerance.
PetscErrorCode PicurvDestroyMinimalContexts(SimCtx **simCtx_ptr, UserCtx **user_ptr)
Destroys minimal SimCtx/UserCtx fixtures and all owned PETSc objects.
PetscErrorCode PicurvDestroyRuntimeContext(SimCtx **simCtx_ptr)
Finalizes and frees a runtime context built by PicurvBuildTinyRuntimeContext.
PetscErrorCode PicurvRunTests(const char *suite_name, const PicurvTestCase *cases, size_t case_count)
Runs a named C test suite and prints pass/fail progress markers.
PetscErrorCode PicurvBuildTinyRuntimeContext(const char *bcs_contents, PetscBool enable_particles, SimCtx **simCtx_out, UserCtx **user_out, char *tmpdir, size_t tmpdir_len)
Builds a tiny runtime context through the real setup path for behavior-level tests.
PetscErrorCode PicurvAssertIntEqual(PetscInt expected, PetscInt actual, const char *context)
Asserts that two integer values are equal.
PetscErrorCode PicurvAssertBool(PetscBool value, const char *context)
Asserts that one boolean condition is true.
PetscErrorCode PicurvRemoveTempDir(const char *path)
Recursively removes a temporary directory created by PicurvMakeTempDir.
Shared declarations for the PICurv C test fixture and assertion layer.
Named test case descriptor consumed by PicurvRunTests.
PetscBool inletFaceDefined
BCFace identifiedInletBCFace
Cmpnts max_coords
Maximum x, y, z coordinates of the bounding box.
Cmpnts min_coords
Minimum x, y, z coordinates of the bounding box.
RankCellInfo * RankCellInfoMap
PetscRandom BrownianMotionRNG
A 3D point or vector with PetscScalar components.
The master context for the entire simulation.
User-defined context containing data specific to a single computational grid level.