PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
Loading...
Searching...
No Matches
Functions
test_setup_lifecycle.c File Reference

C unit tests for setup, initialization, and cleanup lifecycle entry points. More...

#include "test_support.h"
#include "ParticleSwarm.h"
#include "initialcondition.h"
#include "runloop.h"
#include "setup.h"
#include <stdio.h>
#include <string.h>
Include dependency graph for test_setup_lifecycle.c:

Go to the source code of this file.

Functions

static PetscErrorCode AssertDirectoryExists (const char *path, const char *context)
 Asserts that a directory path exists and is readable.
 
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 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.
 
static PetscErrorCode FreeLifecycleContext (SimCtx **simCtx_ptr)
 Finalizes and frees one lifecycle test context, then clears any PETSc options used to build it.
 
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 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 TestSharedRuntimeFixtureContracts (void)
 Tests that the shared richer runtime fixture mirrors normalized production setup contracts.
 
static PetscErrorCode TestSetupLifecycleCoreSolverSetup (void)
 Tests the core setup lifecycle through environment, grid, BC, rank-info, and Eulerian-state initialization.
 
static PetscErrorCode TestSetupLifecycleParticleInitialization (void)
 Tests particle-swarm initialization and deterministic settlement on a tiny fully initialized case.
 
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 TestSetupLifecycleCleanupAcrossInitializationStates (void)
 Tests cleanup after partial and fuller setup states without requiring unsupported double-finalization behavior.
 
int main (int argc, char **argv)
 Runs the unit-setup PETSc test binary.
 

Detailed Description

C unit tests for setup, initialization, and cleanup lifecycle entry points.

Definition in file test_setup_lifecycle.c.

Function Documentation

◆ AssertDirectoryExists()

static PetscErrorCode AssertDirectoryExists ( const char *  path,
const char *  context 
)
static

Asserts that a directory path exists and is readable.

Definition at line 19 of file test_setup_lifecycle.c.

20{
21 PetscBool exists = PETSC_FALSE;
22
23 PetscFunctionBeginUser;
24 PetscCall(PetscTestDirectory(path, 'r', &exists));
25 PetscCall(PicurvAssertBool(exists, context));
26 PetscFunctionReturn(0);
27}
PetscErrorCode PicurvAssertBool(PetscBool value, const char *context)
Asserts that one boolean condition is true.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ WriteContextOnlyFile()

static PetscErrorCode WriteContextOnlyFile ( const char *  path,
const char *  contents 
)
static

Writes one small temporary text file used by the partial-lifecycle context-only fixture.

Definition at line 32 of file test_setup_lifecycle.c.

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}
Here is the caller graph for this function:

◆ PrepareContextOnlyConfig()

static PetscErrorCode PrepareContextOnlyConfig ( char *  tmpdir,
size_t  tmpdir_len,
char *  control_path,
size_t  control_path_len 
)
static

Creates the control-file bundle needed for the context-only cleanup test.

Definition at line 47 of file test_setup_lifecycle.c.

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}
static PetscErrorCode WriteContextOnlyFile(const char *path, const char *contents)
Writes one small temporary text file used by the partial-lifecycle context-only fixture.
PetscErrorCode PicurvMakeTempDir(char *path, size_t path_len)
Creates a unique temporary directory for one test case.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ FreeLifecycleContext()

static PetscErrorCode FreeLifecycleContext ( SimCtx **  simCtx_ptr)
static

Finalizes and frees one lifecycle test context, then clears any PETSc options used to build it.

Definition at line 137 of file test_setup_lifecycle.c.

138{
139 PetscFunctionBeginUser;
140 PetscCall(PicurvDestroyRuntimeContext(simCtx_ptr));
141 PetscFunctionReturn(0);
142}
PetscErrorCode PicurvDestroyRuntimeContext(SimCtx **simCtx_ptr)
Finalizes and frees a runtime context built by PicurvBuildTinyRuntimeContext.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ BuildLifecycleContext()

static PetscErrorCode BuildLifecycleContext ( PetscBool  enable_particles,
SimCtx **  simCtx_out,
char *  tmpdir,
size_t  tmpdir_len 
)
static

Builds a full setup fixture through environment, grid, BC, and domain-rank initialization.

Definition at line 147 of file test_setup_lifecycle.c.

148{
149 PetscFunctionBeginUser;
150 PetscCall(PicurvBuildTinyRuntimeContext(NULL, enable_particles, simCtx_out, NULL, tmpdir, tmpdir_len));
151 PetscFunctionReturn(0);
152}
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.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ BuildContextOnly()

static PetscErrorCode BuildContextOnly ( SimCtx **  simCtx_out,
char *  tmpdir,
size_t  tmpdir_len 
)
static

Builds only the top-level simulation context used by partial-initialization cleanup tests.

Definition at line 157 of file test_setup_lifecycle.c.

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}
PetscErrorCode CreateSimulationContext(int argc, char **argv, SimCtx **p_simCtx)
Allocates and populates the master SimulationContext object.
Definition setup.c:151
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.
@ EXEC_MODE_SOLVER
Definition variables.h:626
ExecutionMode exec_mode
Definition variables.h:672
The master context for the entire simulation.
Definition variables.h:653
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSharedRuntimeFixtureContracts()

static PetscErrorCode TestSharedRuntimeFixtureContracts ( void  )
static

Tests that the shared richer runtime fixture mirrors normalized production setup contracts.

Definition at line 175 of file test_setup_lifecycle.c.

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}
static PetscErrorCode FreeLifecycleContext(SimCtx **simCtx_ptr)
Finalizes and frees one lifecycle test context, then clears any PETSc options used to build it.
PetscErrorCode PicurvRemoveTempDir(const char *path)
Recursively removes a temporary directory created by PicurvMakeTempDir.
PetscMPIInt rank
Definition variables.h:656
Cmpnts max_coords
Maximum x, y, z coordinates of the bounding box.
Definition variables.h:156
Cmpnts min_coords
Minimum x, y, z coordinates of the bounding box.
Definition variables.h:155
PetscScalar x
Definition variables.h:101
RankCellInfo * RankCellInfoMap
Definition variables.h:911
BoundingBox * bboxlist
Definition variables.h:759
PetscScalar z
Definition variables.h:101
PetscScalar y
Definition variables.h:101
BoundingBox bbox
Definition variables.h:847
User-defined context containing data specific to a single computational grid level.
Definition variables.h:836
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSetupLifecycleCoreSolverSetup()

static PetscErrorCode TestSetupLifecycleCoreSolverSetup ( void  )
static

Tests the core setup lifecycle through environment, grid, BC, rank-info, and Eulerian-state initialization.

Definition at line 201 of file test_setup_lifecycle.c.

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}
PetscErrorCode InitializeEulerianState(SimCtx *simCtx)
High-level orchestrator to set the complete initial state of the Eulerian solver.
static PetscErrorCode AssertDirectoryExists(const char *path, const char *context)
Asserts that a directory path exists and is readable.
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.
PetscErrorCode PicurvAssertRealNear(PetscReal expected, PetscReal actual, PetscReal tol, const char *context)
Asserts that two real values agree within tolerance.
PetscErrorCode PicurvAssertIntEqual(PetscInt expected, PetscInt actual, const char *context)
Asserts that two integer values are equal.
UserCtx * user
Definition variables.h:538
PetscBool inletFaceDefined
Definition variables.h:857
BCFace identifiedInletBCFace
Definition variables.h:858
UserMG usermg
Definition variables.h:781
Vec Ucont
Definition variables.h:864
PetscInt mglevels
Definition variables.h:545
DMDALocalInfo info
Definition variables.h:843
PetscInt IM
Definition variables.h:845
MGCtx * mgctx
Definition variables.h:548
@ BC_FACE_NEG_Z
Definition variables.h:247
A 3D point or vector with PetscScalar components.
Definition variables.h:100
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSetupLifecycleParticleInitialization()

static PetscErrorCode TestSetupLifecycleParticleInitialization ( void  )
static

Tests particle-swarm initialization and deterministic settlement on a tiny fully initialized case.

Definition at line 242 of file test_setup_lifecycle.c.

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}
PetscErrorCode InitializeParticleSwarm(SimCtx *simCtx)
High-level particle initialization orchestrator for a simulation run.
PetscErrorCode PerformInitializedParticleSetup(SimCtx *simCtx)
Finalizes the simulation setup at t=0, ensuring a consistent state before time marching.
Definition runloop.c:377
@ ACTIVE_AND_LOCATED
Definition variables.h:137
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSetupLifecycleScatterMetricsAtStepZero()

static PetscErrorCode TestSetupLifecycleScatterMetricsAtStepZero ( void  )
static

Tests that step-zero scalar verification emits scatter_metrics.csv during initialized setup.

Definition at line 281 of file test_setup_lifecycle.c.

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}
PetscErrorCode PicurvAssertFileExists(const char *path, const char *context)
Asserts that a filesystem path exists as a readable file.
PetscInt StepsToRun
Definition variables.h:664
PetscInt StartStep
Definition variables.h:663
VerificationScalarConfig verificationScalar
Definition variables.h:716
char eulerianSource[PETSC_MAX_PATH_LEN]
Definition variables.h:673
char AnalyticalSolutionType[PETSC_MAX_PATH_LEN]
Definition variables.h:686
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSetupLifecycleRandomGeneratorsAndCleanup()

static PetscErrorCode TestSetupLifecycleRandomGeneratorsAndCleanup ( void  )
static

Tests standalone RNG initialization helpers and minimal-context cleanup.

Definition at line 322 of file test_setup_lifecycle.c.

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}
PetscErrorCode InitializeRandomGenerators(UserCtx *user, PetscRandom *randx, PetscRandom *randy, PetscRandom *randz)
Initializes random number generators for assigning particle properties.
Definition setup.c:3135
PetscErrorCode InitializeBrownianRNG(SimCtx *simCtx)
Initializes a single master RNG for time-stepping physics (Brownian motion).
Definition setup.c:3220
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
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 PicurvDestroyMinimalContexts(SimCtx **simCtx_ptr, UserCtx **user_ptr)
Destroys minimal SimCtx/UserCtx fixtures and all owned PETSc objects.
PetscRandom BrownianMotionRNG
Definition variables.h:770
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TestSetupLifecycleCleanupAcrossInitializationStates()

static PetscErrorCode TestSetupLifecycleCleanupAcrossInitializationStates ( void  )
static

Tests cleanup after partial and fuller setup states without requiring unsupported double-finalization behavior.

Definition at line 367 of file test_setup_lifecycle.c.

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}
PetscErrorCode SetupGridAndSolvers(SimCtx *simCtx)
The main orchestrator for setting up all grid-related components.
Definition setup.c:1302
PetscErrorCode SetupSimulationEnvironment(SimCtx *simCtx)
Verifies and prepares the complete I/O environment for a simulation run.
Definition setup.c:983
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.
PetscInt block_number
Definition variables.h:728
@ MOMENTUM_SOLVER_DUALTIME_PICARD_JAMESON_RK
Definition variables.h:504
PetscReal mom_dt_jameson_residual_norm_noise_allowance_factor
Definition variables.h:704
PetscReal mom_resid_rtol
Definition variables.h:695
PetscReal mom_resid_atol
Definition variables.h:695
MomentumSolverType mom_solver_type
Definition variables.h:693
Here is the call graph for this function:
Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char **  argv 
)

Runs the unit-setup PETSc test binary.

Definition at line 403 of file test_setup_lifecycle.c.

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}
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 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 PicurvRunTests(const char *suite_name, const PicurvTestCase *cases, size_t case_count)
Runs a named C test suite and prints pass/fail progress markers.
Named test case descriptor consumed by PicurvRunTests.
Here is the call graph for this function: