PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
Loading...
Searching...
No Matches
test_setup_lifecycle.c
Go to the documentation of this file.
1/**
2 * @file test_setup_lifecycle.c
3 * @brief C unit tests for setup, initialization, and cleanup lifecycle entry points.
4 */
5
6#include "test_support.h"
7
8#include "ParticleSwarm.h"
9#include "initialcondition.h"
10#include "runloop.h"
11#include "setup.h"
12
13#include <stdio.h>
14#include <string.h>
15
16/**
17 * @brief Asserts that a directory path exists and is readable.
18 */
19static PetscErrorCode AssertDirectoryExists(const char *path, const char *context)
20{
21 PetscBool exists = PETSC_FALSE;
22
23 PetscFunctionBeginUser;
24 PetscCall(PetscTestDirectory(path, 'r', &exists));
25 PetscCall(PicurvAssertBool(exists, context));
26 PetscFunctionReturn(0);
27}
28
29/**
30 * @brief Writes one small temporary text file used by the partial-lifecycle context-only fixture.
31 */
32static PetscErrorCode WriteContextOnlyFile(const char *path, const char *contents)
33{
34 FILE *file = NULL;
35
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);
40 fclose(file);
41 PetscFunctionReturn(0);
42}
43
44/**
45 * @brief Creates the control-file bundle needed for the context-only cleanup test.
46 */
47static PetscErrorCode PrepareContextOnlyConfig(char *tmpdir,
48 size_t tmpdir_len,
49 char *control_path,
50 size_t control_path_len)
51{
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];
57
58 PetscFunctionBeginUser;
59 PetscCall(PicurvMakeTempDir(tmpdir, tmpdir_len));
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));
65
66 PetscCall(WriteContextOnlyFile(
67 bcs_path,
68 "-Xi WALL noslip\n"
69 "+Xi WALL noslip\n"
70 "-Eta WALL noslip\n"
71 "+Eta WALL noslip\n"
72 "-Zeta INLET constant_velocity vx=0.0 vy=0.0 vz=1.5\n"
73 "+Zeta OUTLET conservation\n"));
74 PetscCall(WriteContextOnlyFile(
75 post_path,
76 "startTime = 0\n"
77 "endTime = 1\n"
78 "timeStep = 1\n"
79 "output_particles = false\n"));
80 PetscCall(PetscSNPrintf(
81 control_buffer,
82 sizeof(control_buffer),
83 "-start_step 0\n"
84 "-totalsteps 2\n"
85 "-ren 100.0\n"
86 "-dt 0.001\n"
87 "-finit 1\n"
88 "-ucont_x 0.0\n"
89 "-ucont_y 0.0\n"
90 "-ucont_z 1.5\n"
91 "-bcs_files %s\n"
92 "-profiling_timestep_mode off\n"
93 "-profiling_final_summary true\n"
94 "-postprocessing_config_file %s\n"
95 "-grid\n"
96 "-im 6\n"
97 "-jm 6\n"
98 "-km 6\n"
99 "-xMins 0.0\n"
100 "-xMaxs 1.0\n"
101 "-yMins 0.0\n"
102 "-yMaxs 1.0\n"
103 "-zMins 0.0\n"
104 "-zMaxs 1.0\n"
105 "-rxs 1.0\n"
106 "-rys 1.0\n"
107 "-rzs 1.0\n"
108 "-cgrids 0\n"
109 "-nblk 1\n"
110 "-euler_field_source solve\n"
111 "-mom_solver_type DUALTIME_PICARD_RK4\n"
112 "-mom_dt_rk4_residual_norm_noise_allowance_factor 1.07\n"
113 "-mom_resid_atol 1.0e-8\n"
114 "-mom_resid_rtol 1.0e-3\n"
115 "-mg_level 1\n"
116 "-poisson 0\n"
117 "-tio 0\n"
118 "-particle_console_output_freq 0\n"
119 "-logfreq 1\n"
120 "-output_dir %s\n"
121 "-restart_dir %s\n"
122 "-log_dir %s\n"
123 "-numParticles 0\n"
124 "-pinit 2\n",
125 bcs_path,
126 post_path,
127 output_dir,
128 output_dir,
129 log_dir));
130 PetscCall(WriteContextOnlyFile(control_path, control_buffer));
131 PetscFunctionReturn(0);
132}
133
134/**
135 * @brief Finalizes and frees one lifecycle test context, then clears any PETSc options used to build it.
136 */
137static PetscErrorCode FreeLifecycleContext(SimCtx **simCtx_ptr)
138{
139 PetscFunctionBeginUser;
140 PetscCall(PicurvDestroyRuntimeContext(simCtx_ptr));
141 PetscFunctionReturn(0);
142}
143
144/**
145 * @brief Builds a full setup fixture through environment, grid, BC, and domain-rank initialization.
146 */
147static PetscErrorCode BuildLifecycleContext(PetscBool enable_particles, SimCtx **simCtx_out, char *tmpdir, size_t tmpdir_len)
148{
149 PetscFunctionBeginUser;
150 PetscCall(PicurvBuildTinyRuntimeContext(NULL, enable_particles, simCtx_out, NULL, tmpdir, tmpdir_len));
151 PetscFunctionReturn(0);
152}
153
154/**
155 * @brief Builds only the top-level simulation context used by partial-initialization cleanup tests.
156 */
157static PetscErrorCode BuildContextOnly(SimCtx **simCtx_out, char *tmpdir, size_t tmpdir_len)
158{
159 char control_path[PETSC_MAX_PATH_LEN];
160 SimCtx *simCtx = NULL;
161
162 PetscFunctionBeginUser;
163 PetscCall(PetscOptionsClear(NULL));
164 PetscCall(PrepareContextOnlyConfig(tmpdir, tmpdir_len, control_path, sizeof(control_path)));
165 PetscCall(PetscOptionsSetValue(NULL, "-control_file", control_path));
166 PetscCall(CreateSimulationContext(0, NULL, &simCtx));
167 simCtx->exec_mode = EXEC_MODE_SOLVER;
168 *simCtx_out = simCtx;
169 PetscFunctionReturn(0);
170}
171
172/**
173 * @brief Tests that the shared richer runtime fixture mirrors normalized production setup contracts.
174 */
175static PetscErrorCode TestSharedRuntimeFixtureContracts(void)
176{
177 SimCtx *simCtx = NULL;
178 UserCtx *user = NULL;
179 char tmpdir[PETSC_MAX_PATH_LEN];
180
181 PetscFunctionBeginUser;
182 PetscCall(PicurvBuildTinyRuntimeContext(NULL, PETSC_FALSE, &simCtx, &user, tmpdir, sizeof(tmpdir)));
183
184 PetscCall(PicurvAssertBool((PetscBool)(user->bbox.min_coords.x >= -2.0e-6), "runtime fixture bbox xmin should stay inside normalized domain tolerance"));
185 PetscCall(PicurvAssertBool((PetscBool)(user->bbox.max_coords.x <= 1.0 + 2.0e-6), "runtime fixture bbox xmax should stay inside normalized domain tolerance"));
186 PetscCall(PicurvAssertBool((PetscBool)(user->bbox.max_coords.y <= 1.0 + 2.0e-6), "runtime fixture bbox ymax should stay inside normalized domain tolerance"));
187 PetscCall(PicurvAssertBool((PetscBool)(user->bbox.max_coords.z <= 1.0 + 2.0e-6), "runtime fixture bbox zmax should stay inside normalized domain tolerance"));
188 PetscCall(PicurvAssertBool((PetscBool)(simCtx->bboxlist != NULL), "runtime fixture should gather bboxlist through SetupDomainRankInfo"));
189 PetscCall(PicurvAssertBool((PetscBool)(user->RankCellInfoMap != NULL), "runtime fixture should gather rank-cell ownership metadata"));
190 PetscCall(PicurvAssertBool((PetscBool)(simCtx->bboxlist[simCtx->rank].max_coords.x >= user->bbox.max_coords.x - 1.0e-10),
191 "runtime fixture rank bbox entry should include the local bbox extent"));
192
193 PetscCall(PicurvRemoveTempDir(tmpdir));
194 PetscCall(FreeLifecycleContext(&simCtx));
195 PetscFunctionReturn(0);
196}
197
198/**
199 * @brief Tests the core setup lifecycle through environment, grid, BC, rank-info, and Eulerian-state initialization.
200 */
201static PetscErrorCode TestSetupLifecycleCoreSolverSetup(void)
202{
203 SimCtx *simCtx = NULL;
204 UserCtx *user = NULL;
205 char tmpdir[PETSC_MAX_PATH_LEN];
206 char results_dir[PETSC_MAX_PATH_LEN];
207 char logs_dir[PETSC_MAX_PATH_LEN];
208 Cmpnts ***ucont = NULL;
209
210 PetscFunctionBeginUser;
211 PetscCall(BuildLifecycleContext(PETSC_FALSE, &simCtx, tmpdir, sizeof(tmpdir)));
212 user = simCtx->usermg.mgctx[simCtx->usermg.mglevels - 1].user;
213
214 PetscCall(PetscSNPrintf(results_dir, sizeof(results_dir), "%s/results", tmpdir));
215 PetscCall(PetscSNPrintf(logs_dir, sizeof(logs_dir), "%s/logs", tmpdir));
216 PetscCall(PicurvAssertBool((PetscBool)(user->da != NULL), "SetupGridAndSolvers should allocate da"));
217 PetscCall(PicurvAssertBool((PetscBool)(user->fda != NULL), "SetupGridAndSolvers should allocate coordinate DM"));
218 PetscCall(PicurvAssertIntEqual(user->IM + 1, user->info.mx, "DM node count should match IM+1"));
219 PetscCall(PicurvAssertBool(user->inletFaceDefined, "SetupBoundaryConditions should identify the inlet face"));
220 PetscCall(PicurvAssertIntEqual(BC_FACE_NEG_Z, user->identifiedInletBCFace, "NEG_Z should be the configured inlet face"));
221 PetscCall(PicurvAssertBool((PetscBool)(simCtx->bboxlist != NULL), "SetupDomainRankInfo should build bboxlist"));
222 PetscCall(PicurvAssertBool((PetscBool)(user->RankCellInfoMap != NULL), "SetupDomainRankInfo should build rank-cell decomposition map"));
223 PetscCall(AssertDirectoryExists(results_dir, "SetupSimulationEnvironment should create the output directory"));
224 PetscCall(AssertDirectoryExists(logs_dir, "SetupSimulationEnvironment should create the log directory"));
225
226 PetscCall(InitializeEulerianState(simCtx));
227 PetscCall(DMDAVecGetArrayRead(user->fda, user->Ucont, &ucont));
228 PetscCall(PicurvAssertBool((PetscBool)(ucont[1][1][1].z > 0.0),
229 "InitializeEulerianState should seed a positive inlet-aligned interior field"));
230 PetscCall(PicurvAssertRealNear(ucont[1][1][1].z, ucont[2][2][2].z, 1.0e-12,
231 "InitializeEulerianState should initialize a spatially consistent interior field"));
232 PetscCall(DMDAVecRestoreArrayRead(user->fda, user->Ucont, &ucont));
233
234 PetscCall(PicurvRemoveTempDir(tmpdir));
235 PetscCall(FreeLifecycleContext(&simCtx));
236 PetscFunctionReturn(0);
237}
238
239/**
240 * @brief Tests particle-swarm initialization and deterministic settlement on a tiny fully initialized case.
241 */
243{
244 SimCtx *simCtx = NULL;
245 UserCtx *user = NULL;
246 char tmpdir[PETSC_MAX_PATH_LEN];
247 PetscInt nlocal = 0;
248 PetscInt *cell_ids = NULL;
249 PetscInt *status = NULL;
250
251 PetscFunctionBeginUser;
252 PetscCall(BuildLifecycleContext(PETSC_TRUE, &simCtx, tmpdir, sizeof(tmpdir)));
253 PetscCall(InitializeEulerianState(simCtx));
254 PetscCall(InitializeParticleSwarm(simCtx));
255 PetscCall(PerformInitializedParticleSetup(simCtx));
256
257 user = simCtx->usermg.mgctx[simCtx->usermg.mglevels - 1].user;
258 PetscCall(PicurvAssertBool((PetscBool)(user->swarm != NULL), "InitializeParticleSwarm should allocate the solver swarm"));
259 PetscCall(DMSwarmGetLocalSize(user->swarm, &nlocal));
260 PetscCall(PicurvAssertIntEqual(8, nlocal, "single-rank lifecycle particle setup should own all seeded particles"));
261
262 PetscCall(DMSwarmGetField(user->swarm, "DMSwarm_CellID", NULL, NULL, (void **)&cell_ids));
263 PetscCall(DMSwarmGetField(user->swarm, "DMSwarm_location_status", NULL, NULL, (void **)&status));
264 for (PetscInt p = 0; p < nlocal; ++p) {
265 PetscCall(PicurvAssertBool((PetscBool)(cell_ids[3 * p + 0] >= 0), "settled particles should have a valid i cell id"));
266 PetscCall(PicurvAssertBool((PetscBool)(cell_ids[3 * p + 1] >= 0), "settled particles should have a valid j cell id"));
267 PetscCall(PicurvAssertBool((PetscBool)(cell_ids[3 * p + 2] >= 0), "settled particles should have a valid k cell id"));
268 PetscCall(PicurvAssertIntEqual(ACTIVE_AND_LOCATED, status[p], "settled particles should be marked ACTIVE_AND_LOCATED"));
269 }
270 PetscCall(DMSwarmRestoreField(user->swarm, "DMSwarm_CellID", NULL, NULL, (void **)&cell_ids));
271 PetscCall(DMSwarmRestoreField(user->swarm, "DMSwarm_location_status", NULL, NULL, (void **)&status));
272
273 PetscCall(PicurvRemoveTempDir(tmpdir));
274 PetscCall(FreeLifecycleContext(&simCtx));
275 PetscFunctionReturn(0);
276}
277
278/**
279 * @brief Tests that step-zero scalar verification emits scatter_metrics.csv during initialized setup.
280 */
282{
283 SimCtx *simCtx = NULL;
284 UserCtx *user = NULL;
285 char tmpdir[PETSC_MAX_PATH_LEN];
286 char metrics_path[PETSC_MAX_PATH_LEN];
287
288 PetscFunctionBeginUser;
289 PetscCall(BuildLifecycleContext(PETSC_TRUE, &simCtx, tmpdir, sizeof(tmpdir)));
290 user = simCtx->usermg.mgctx[simCtx->usermg.mglevels - 1].user;
291 PetscCall(PetscStrncpy(simCtx->eulerianSource, "analytical", sizeof(simCtx->eulerianSource)));
292 PetscCall(PetscStrncpy(simCtx->AnalyticalSolutionType, "ZERO_FLOW", sizeof(simCtx->AnalyticalSolutionType)));
293 simCtx->StepsToRun = 0;
294 simCtx->StartStep = 0;
295 simCtx->verificationScalar.enabled = PETSC_TRUE;
296 PetscCall(PetscStrncpy(simCtx->verificationScalar.mode,
297 "analytical",
298 sizeof(simCtx->verificationScalar.mode)));
299 PetscCall(PetscStrncpy(simCtx->verificationScalar.profile,
300 "CONSTANT",
301 sizeof(simCtx->verificationScalar.profile)));
302 simCtx->verificationScalar.value = 1.25;
303
304 PetscCall(InitializeEulerianState(simCtx));
305 PetscCall(InitializeParticleSwarm(simCtx));
306 PetscCall(PerformInitializedParticleSetup(simCtx));
307
308 PetscCall(PetscSNPrintf(metrics_path, sizeof(metrics_path), "%s/logs/scatter_metrics.csv", tmpdir));
309 PetscCall(PicurvAssertFileExists(metrics_path,
310 "PerformInitializedParticleSetup should emit scatter_metrics.csv for a zero-step scalar verification run"));
311 PetscCall(PicurvAssertBool((PetscBool)(user->swarm != NULL),
312 "zero-step scalar verification setup should leave the swarm initialized"));
313
314 PetscCall(PicurvRemoveTempDir(tmpdir));
315 PetscCall(FreeLifecycleContext(&simCtx));
316 PetscFunctionReturn(0);
317}
318
319/**
320 * @brief Tests standalone RNG initialization helpers and minimal-context cleanup.
321 */
323{
324 SimCtx *simCtx = NULL;
325 UserCtx *user = NULL;
326 PetscRandom randx = NULL, randy = NULL, randz = NULL;
327 PetscRandom rand_i = NULL, rand_j = NULL, rand_k = NULL;
328 PetscScalar sample_x = 0.0, sample_i = 0.0;
329 PetscReal seconds = 0.0;
330
331 PetscFunctionBeginUser;
332 PetscCall(PicurvCreateMinimalContexts(&simCtx, &user, 4, 4, 4));
333 user->bbox.min_coords.x = 0.0;
334 user->bbox.min_coords.y = 0.0;
335 user->bbox.min_coords.z = 0.0;
336 user->bbox.max_coords.x = 1.0;
337 user->bbox.max_coords.y = 2.0;
338 user->bbox.max_coords.z = 3.0;
339
340 PetscCall(InitializeRandomGenerators(user, &randx, &randy, &randz));
341 PetscCall(InitializeLogicalSpaceRNGs(&rand_i, &rand_j, &rand_k));
342 PetscCall(InitializeBrownianRNG(simCtx));
343 PetscCall(PicurvAssertBool((PetscBool)(simCtx->BrownianMotionRNG != NULL), "InitializeBrownianRNG should allocate the Brownian RNG"));
344 PetscCall(PicurvAssertBool(RuntimeWalltimeGuardParsePositiveSeconds("12.5", &seconds), "RuntimeWalltimeGuardParsePositiveSeconds should parse positive numeric strings"));
345 PetscCall(PicurvAssertRealNear(12.5, seconds, 1.0e-12, "RuntimeWalltimeGuardParsePositiveSeconds parsed value"));
346
347 PetscCall(PetscRandomGetValue(randx, &sample_x));
348 PetscCall(PetscRandomGetValue(rand_i, &sample_i));
349 PetscCall(PicurvAssertBool((PetscBool)(PetscRealPart(sample_x) >= 0.0 && PetscRealPart(sample_x) <= 1.0),
350 "InitializeRandomGenerators should honor the configured bbox interval"));
351 PetscCall(PicurvAssertBool((PetscBool)(PetscRealPart(sample_i) >= 0.0 && PetscRealPart(sample_i) <= 1.0),
352 "InitializeLogicalSpaceRNGs should generate logical coordinates in [0,1]"));
353
354 PetscCall(PetscRandomDestroy(&randx));
355 PetscCall(PetscRandomDestroy(&randy));
356 PetscCall(PetscRandomDestroy(&randz));
357 PetscCall(PetscRandomDestroy(&rand_i));
358 PetscCall(PetscRandomDestroy(&rand_j));
359 PetscCall(PetscRandomDestroy(&rand_k));
360 PetscCall(PicurvDestroyMinimalContexts(&simCtx, &user));
361 PetscFunctionReturn(0);
362}
363
364/**
365 * @brief Tests cleanup after partial and fuller setup states without requiring unsupported double-finalization behavior.
366 */
368{
369 SimCtx *context_only = NULL;
370 SimCtx *grid_only = NULL;
371 char context_tmpdir[PETSC_MAX_PATH_LEN];
372 char grid_tmpdir[PETSC_MAX_PATH_LEN];
373
374 PetscFunctionBeginUser;
375 PetscCall(BuildContextOnly(&context_only, context_tmpdir, sizeof(context_tmpdir)));
376 PetscCall(PicurvAssertBool((PetscBool)(context_only != NULL), "CreateSimulationContext should allocate the top-level SimCtx"));
377 PetscCall(PicurvAssertIntEqual(1, context_only->block_number, "CreateSimulationContext should parse the configured block count"));
379 "deprecated RK4 selector should normalize to the Jameson solver enum"));
381 "deprecated RK4 residual-noise option should populate the Jameson control"));
382 PetscCall(PicurvAssertRealNear(1.0e-8, context_only->mom_resid_atol, 1.0e-12,
383 "momentum absolute residual tolerance should be parsed"));
384 PetscCall(PicurvAssertRealNear(1.0e-3, context_only->mom_resid_rtol, 1.0e-12,
385 "momentum relative residual tolerance should be parsed"));
386 PetscCall(PetscOptionsClear(NULL));
387 PetscCall(PicurvRemoveTempDir(context_tmpdir));
388 PetscCall(FreeLifecycleContext(&context_only));
389
390 PetscCall(BuildContextOnly(&grid_only, grid_tmpdir, sizeof(grid_tmpdir)));
391 PetscCall(SetupSimulationEnvironment(grid_only));
392 PetscCall(SetupGridAndSolvers(grid_only));
393 PetscCall(PicurvAssertBool((PetscBool)(grid_only->usermg.mgctx[grid_only->usermg.mglevels - 1].user->Ucont != NULL),
394 "SetupGridAndSolvers should allocate baseline Eulerian vectors"));
395 PetscCall(PicurvRemoveTempDir(grid_tmpdir));
396 PetscCall(FreeLifecycleContext(&grid_only));
397 PetscFunctionReturn(0);
398}
399
400/**
401 * @brief Runs the unit-setup PETSc test binary.
402 */
403int main(int argc, char **argv)
404{
405 PetscErrorCode ierr;
406 const PicurvTestCase cases[] = {
407 {"setup-lifecycle-core-solver-setup", TestSetupLifecycleCoreSolverSetup},
408 {"setup-lifecycle-particle-initialization", TestSetupLifecycleParticleInitialization},
409 {"setup-lifecycle-scatter-metrics-step-zero", TestSetupLifecycleScatterMetricsAtStepZero},
410 {"setup-lifecycle-random-generators-and-cleanup", TestSetupLifecycleRandomGeneratorsAndCleanup},
411 {"setup-lifecycle-cleanup-across-initialization-states", TestSetupLifecycleCleanupAcrossInitializationStates},
412 {"shared-runtime-fixture-contracts", TestSharedRuntimeFixtureContracts},
413 };
414
415 ierr = PetscInitialize(&argc, &argv, NULL, "PICurv setup lifecycle tests");
416 if (ierr) {
417 return (int)ierr;
418 }
419
420 ierr = PicurvRunTests("unit-setup", cases, sizeof(cases) / sizeof(cases[0]));
421 if (ierr) {
422 PetscFinalize();
423 return (int)ierr;
424 }
425
426 ierr = PetscFinalize();
427 return (int)ierr;
428}
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.
Definition runloop.c:377
PetscErrorCode InitializeRandomGenerators(UserCtx *user, PetscRandom *randx, PetscRandom *randy, PetscRandom *randz)
Initializes random number generators for assigning particle properties.
Definition setup.c:3135
PetscErrorCode SetupGridAndSolvers(SimCtx *simCtx)
The main orchestrator for setting up all grid-related components.
Definition setup.c:1302
PetscErrorCode InitializeBrownianRNG(SimCtx *simCtx)
Initializes a single master RNG for time-stepping physics (Brownian motion).
Definition setup.c:3220
PetscErrorCode SetupSimulationEnvironment(SimCtx *simCtx)
Verifies and prepares the complete I/O environment for a simulation run.
Definition setup.c:983
PetscErrorCode CreateSimulationContext(int argc, char **argv, SimCtx **p_simCtx)
Allocates and populates the master SimulationContext object.
Definition setup.c:151
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).
Definition setup.c:3176
PetscBool RuntimeWalltimeGuardParsePositiveSeconds(const char *text, PetscReal *seconds_out)
Parse a positive floating-point seconds value from runtime metadata.
Definition setup.c:18
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 TestSetupLifecycleScatterMetricsAtStepZero(void)
Tests that step-zero scalar verification emits scatter_metrics.csv during initialized setup.
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 PicurvAssertFileExists(const char *path, const char *context)
Asserts that a filesystem path exists as a readable file.
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.
UserCtx * user
Definition variables.h:538
PetscBool inletFaceDefined
Definition variables.h:857
PetscMPIInt rank
Definition variables.h:656
PetscInt block_number
Definition variables.h:728
BCFace identifiedInletBCFace
Definition variables.h:858
@ ACTIVE_AND_LOCATED
Definition variables.h:137
UserMG usermg
Definition variables.h:781
Cmpnts max_coords
Maximum x, y, z coordinates of the bounding box.
Definition variables.h:156
PetscInt StepsToRun
Definition variables.h:664
Vec Ucont
Definition variables.h:864
PetscInt StartStep
Definition variables.h:663
Cmpnts min_coords
Minimum x, y, z coordinates of the bounding box.
Definition variables.h:155
@ MOMENTUM_SOLVER_DUALTIME_PICARD_JAMESON_RK
Definition variables.h:504
PetscScalar x
Definition variables.h:101
RankCellInfo * RankCellInfoMap
Definition variables.h:911
VerificationScalarConfig verificationScalar
Definition variables.h:716
BoundingBox * bboxlist
Definition variables.h:759
char eulerianSource[PETSC_MAX_PATH_LEN]
Definition variables.h:673
PetscReal mom_dt_jameson_residual_norm_noise_allowance_factor
Definition variables.h:704
PetscScalar z
Definition variables.h:101
PetscInt mglevels
Definition variables.h:545
char AnalyticalSolutionType[PETSC_MAX_PATH_LEN]
Definition variables.h:686
PetscReal mom_resid_rtol
Definition variables.h:695
PetscRandom BrownianMotionRNG
Definition variables.h:770
DMDALocalInfo info
Definition variables.h:843
PetscScalar y
Definition variables.h:101
@ EXEC_MODE_SOLVER
Definition variables.h:626
PetscInt IM
Definition variables.h:845
MGCtx * mgctx
Definition variables.h:548
ExecutionMode exec_mode
Definition variables.h:672
PetscReal mom_resid_atol
Definition variables.h:695
BoundingBox bbox
Definition variables.h:847
MomentumSolverType mom_solver_type
Definition variables.h:693
@ BC_FACE_NEG_Z
Definition variables.h:247
A 3D point or vector with PetscScalar components.
Definition variables.h:100
The master context for the entire simulation.
Definition variables.h:653
User-defined context containing data specific to a single computational grid level.
Definition variables.h:836