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 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"
118 "-particle_console_output_freq 0\n"
131 PetscFunctionReturn(0);
139 PetscFunctionBeginUser;
141 PetscFunctionReturn(0);
149 PetscFunctionBeginUser;
151 PetscFunctionReturn(0);
159 char control_path[PETSC_MAX_PATH_LEN];
162 PetscFunctionBeginUser;
163 PetscCall(PetscOptionsClear(NULL));
165 PetscCall(PetscOptionsSetValue(NULL,
"-control_file", control_path));
168 *simCtx_out = simCtx;
169 PetscFunctionReturn(0);
179 char tmpdir[PETSC_MAX_PATH_LEN];
181 PetscFunctionBeginUser;
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"));
191 "runtime fixture rank bbox entry should include the local bbox extent"));
195 PetscFunctionReturn(0);
205 char tmpdir[PETSC_MAX_PATH_LEN];
206 char results_dir[PETSC_MAX_PATH_LEN];
207 char logs_dir[PETSC_MAX_PATH_LEN];
210 PetscFunctionBeginUser;
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"));
223 PetscCall(
AssertDirectoryExists(results_dir,
"SetupSimulationEnvironment should create the output directory"));
224 PetscCall(
AssertDirectoryExists(logs_dir,
"SetupSimulationEnvironment should create the log directory"));
227 PetscCall(DMDAVecGetArrayRead(user->
fda, user->
Ucont, &ucont));
229 "InitializeEulerianState should seed a positive inlet-aligned interior field"));
231 "InitializeEulerianState should initialize a spatially consistent interior field"));
232 PetscCall(DMDAVecRestoreArrayRead(user->
fda, user->
Ucont, &ucont));
236 PetscFunctionReturn(0);
246 char tmpdir[PETSC_MAX_PATH_LEN];
248 PetscInt *cell_ids = NULL;
249 PetscInt *status = NULL;
251 PetscFunctionBeginUser;
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"));
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"));
270 PetscCall(DMSwarmRestoreField(user->
swarm,
"DMSwarm_CellID", NULL, NULL, (
void **)&cell_ids));
271 PetscCall(DMSwarmRestoreField(user->
swarm,
"DMSwarm_location_status", NULL, NULL, (
void **)&status));
275 PetscFunctionReturn(0);
285 char tmpdir[PETSC_MAX_PATH_LEN];
286 char metrics_path[PETSC_MAX_PATH_LEN];
288 PetscFunctionBeginUser;
308 PetscCall(PetscSNPrintf(metrics_path,
sizeof(metrics_path),
"%s/logs/scatter_metrics.csv", tmpdir));
310 "PerformInitializedParticleSetup should emit scatter_metrics.csv for a zero-step scalar verification run"));
312 "zero-step scalar verification setup should leave the swarm initialized"));
316 PetscFunctionReturn(0);
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;
331 PetscFunctionBeginUser;
345 PetscCall(
PicurvAssertRealNear(12.5, seconds, 1.0e-12,
"RuntimeWalltimeGuardParsePositiveSeconds parsed value"));
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]"));
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));
361 PetscFunctionReturn(0);
369 SimCtx *context_only = NULL;
371 char context_tmpdir[PETSC_MAX_PATH_LEN];
372 char grid_tmpdir[PETSC_MAX_PATH_LEN];
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"));
379 "deprecated RK4 selector should normalize to the Jameson solver enum"));
381 "deprecated RK4 residual-noise option should populate the Jameson control"));
383 "momentum absolute residual tolerance should be parsed"));
385 "momentum relative residual tolerance should be parsed"));
386 PetscCall(PetscOptionsClear(NULL));
394 "SetupGridAndSolvers should allocate baseline Eulerian vectors"));
397 PetscFunctionReturn(0);
415 ierr = PetscInitialize(&argc, &argv, NULL,
"PICurv setup lifecycle tests");
420 ierr =
PicurvRunTests(
"unit-setup", cases,
sizeof(cases) /
sizeof(cases[0]));
426 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 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.
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.
@ MOMENTUM_SOLVER_DUALTIME_PICARD_JAMESON_RK
RankCellInfo * RankCellInfoMap
VerificationScalarConfig verificationScalar
char eulerianSource[PETSC_MAX_PATH_LEN]
PetscReal mom_dt_jameson_residual_norm_noise_allowance_factor
char AnalyticalSolutionType[PETSC_MAX_PATH_LEN]
PetscRandom BrownianMotionRNG
MomentumSolverType mom_solver_type
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.