9#define __FUNCT__ "SetInitialInteriorField"
18 PetscFunctionBeginUser;
32 PetscFunctionReturn(0);
37 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
39 const PetscInt im_phys = info.mx - 1;
40 const PetscInt jm_phys = info.my - 1;
41 const PetscInt km_phys = info.mz - 1;
48 (
double)u_cart, (
double)v_cart, (
double)w_cart,
55 PetscFunctionReturn(0);
59 const PetscBool needs_flow_dir = (PetscBool)(
63 PetscInt flow_axis = 0;
64 PetscReal flow_dir_sign = 1.0;
72 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_USER,
73 "Streamwise Constant and Poiseuille IC modes require either an INLET face or -flow_direction.");
74 flow_axis = (PetscInt)fd / 2;
75 flow_dir_sign = ((PetscInt)fd % 2 == 0) ? 1.0 : -1.0;
77 (
int)fd, (
int)flow_axis, (
double)flow_dir_sign);
81 Cmpnts ***csi_arr, ***eta_arr, ***zet_arr;
82 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
83 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
84 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
87 ierr = DMDAVecGetArray(user->
fda, user->
Ucont, &ucont_arr); CHKERRQ(ierr);
90 const PetscInt xs = info.xs, xe = info.xs + info.xm;
91 const PetscInt ys = info.ys, ye = info.ys + info.ym;
92 const PetscInt zs = info.zs, ze = info.zs + info.zm;
94 for (k = zs; k < ze; k++) {
95 for (j = ys; j < ye; j++) {
96 for (i = xs; i < xe; i++) {
109 const PetscBool is_interior = (i > 0 && i < im_phys &&
110 j > 0 && j < jm_phys &&
111 k > 0 && k < km_phys);
114 Cmpnts ucont_val = {0.0, 0.0, 0.0};
115 PetscReal normal_velocity_mag = 0.0;
125 PetscInt cs1, cs2, n1, n2;
126 if (flow_axis == 0) { cs1 = j; cs2 = k; n1 = jm_phys; n2 = km_phys; }
127 else if (flow_axis == 1) { cs1 = i; cs2 = k; n1 = im_phys; n2 = km_phys; }
128 else { cs1 = i; cs2 = j; n1 = im_phys; n2 = jm_phys; }
129 const PetscReal w1 = (PetscReal)(n1 - 2);
130 const PetscReal w2 = (PetscReal)(n2 - 2);
131 const PetscReal n1_norm = (cs1 - (1.0 + w1 / 2.0)) / (w1 / 2.0);
132 const PetscReal n2_norm = (cs2 - (1.0 + w2 / 2.0)) / (w2 / 2.0);
134 (1.0 - n1_norm * n1_norm) * (1.0 - n2_norm * n2_norm);
135 if (normal_velocity_mag < 0.0) normal_velocity_mag = 0.0;
144 if (normal_velocity_mag != 0.0) {
145 const PetscReal signed_vel = normal_velocity_mag * flow_dir_sign * user->
GridOrientation;
146 if (flow_axis == 0) {
147 const PetscReal area = sqrt(csi_arr[k][j][i].x * csi_arr[k][j][i].x +
148 csi_arr[k][j][i].y * csi_arr[k][j][i].y +
149 csi_arr[k][j][i].z * csi_arr[k][j][i].z);
150 ucont_val.
x = signed_vel * area;
151 }
else if (flow_axis == 1) {
152 const PetscReal area = sqrt(eta_arr[k][j][i].x * eta_arr[k][j][i].x +
153 eta_arr[k][j][i].y * eta_arr[k][j][i].y +
154 eta_arr[k][j][i].z * eta_arr[k][j][i].z);
155 ucont_val.
y = signed_vel * area;
157 const PetscReal area = sqrt(zet_arr[k][j][i].x * zet_arr[k][j][i].x +
158 zet_arr[k][j][i].y * zet_arr[k][j][i].y +
159 zet_arr[k][j][i].z * zet_arr[k][j][i].z);
160 ucont_val.
z = signed_vel * area;
163 ucont_arr[k][j][i] = ucont_val;
168 ierr = DMDAVecRestoreArray(user->
fda, user->
Ucont, &ucont_arr); CHKERRQ(ierr);
171 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &csi_arr); CHKERRQ(ierr);
172 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &eta_arr); CHKERRQ(ierr);
173 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &zet_arr); CHKERRQ(ierr);
177 PetscFunctionReturn(0);
181#define __FUNCT__ "LoadInitialUcont"
190 PetscFunctionBeginUser;
206 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
207 "Unsupported file initial-condition field selector %d.",
212 PetscFunctionReturn(0);
216#define __FUNCT__ "PopulateInitialUcont"
225 PetscFunctionBeginUser;
231 PetscFunctionReturn(0);
235#define __FUNCT__ "FinalizeBlockState"
242 PetscFunctionBeginUser;
268 PetscFunctionReturn(0);
273#define __FUNCT__ "SetInitialFluidState_FreshStart"
281 PetscFunctionBeginUser;
285 for (PetscInt bi = 0; bi < simCtx->
block_number; bi++) {
306 for (PetscInt bi = 0; bi < simCtx->
block_number; bi++) {
315 PetscFunctionReturn(0);
319#define __FUNCT__ "SetInitialFluidState_Load"
327 PetscFunctionBeginUser;
331 for (PetscInt bi = 0; bi < simCtx->
block_number; bi++) {
349 PetscFunctionReturn(0);
353#define __FUNCT__ "InitializeEulerianState"
363 PetscFunctionBeginUser;
392 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"FRESH START in ANALYTICAL mode. Initializing Analytical Solution type: %s (t=%.4f,step=%d).\n",
401 for (PetscInt bi = 0; bi < simCtx->
block_number; bi++) {
409 PetscFunctionReturn(0);
PetscErrorCode AnalyticalSolutionEngine(SimCtx *simCtx)
Dispatches to the appropriate analytical solution function based on simulation settings.
PetscErrorCode SynchronizePeriodicStaggeredFields(UserCtx *user, PetscInt num_fields, const FieldId field_ids[])
Synchronizes persistent component-staggered vector fields.
PetscErrorCode ApplyBoundaryConditions(UserCtx *user)
Main boundary-condition orchestrator executed during solver timestepping.
PetscErrorCode SynchronizePeriodicCellFields(UserCtx *user, PetscInt num_fields, const FieldId field_ids[])
Synchronizes periodic endpoint cells for a list of cell-centered fields.
const char * FieldCanonicalName(FieldId field_id)
Return the canonical printable name for an ID.
FieldId
Compile-time identity for a catalogued Eulerian field.
static PetscErrorCode SetInitialFluidState_Load(SimCtx *simCtx)
Restore Eulerian fields from checkpoint files for a restart simulation.
PetscErrorCode SetInitialInteriorField(UserCtx *user, FieldId field_id)
Internal helper implementation: SetInitialInteriorField().
static PetscErrorCode SetInitialFluidState_FreshStart(SimCtx *simCtx)
Initialize Eulerian fields for a new simulation without restart data.
static PetscErrorCode LoadInitialUcont(UserCtx *user)
Load a staged file IC and return with Ucont populated.
PetscErrorCode InitializeEulerianState(SimCtx *simCtx)
Internal helper implementation: InitializeEulerianState().
PetscErrorCode PopulateInitialUcont(UserCtx *user)
Dispatch one fresh-start IC and return with Ucont populated.
static PetscErrorCode FinalizeBlockState(UserCtx *user)
Complete one initial-condition block after its interior values are assigned.
PetscErrorCode ReadSimulationFields(UserCtx *user, PetscInt ti)
Reads binary field data for velocity, pressure, and other required vectors.
PetscErrorCode ReadFieldData(UserCtx *user, const char *field_name, Vec field_vec, const char *ext)
Reads data for a specific field from a file into the provided vector.
PetscErrorCode RestoreFieldStatisticsState(SimCtx *simCtx, PetscInt ti)
Restores field-statistics window state and accumulators from a checkpoint.
#define LOCAL
Logging scope definitions for controlling message output.
#define GLOBAL
Scope for global logging across all processes.
#define LOG_ALLOW(scope, level, fmt,...)
Logging macro that checks both the log level and whether the calling function is in the allowed-funct...
#define PROFILE_FUNCTION_END
Marks the end of a profiled code block.
@ LOG_TRACE
Very fine-grained tracing information for in-depth debugging.
@ LOG_INFO
Informational messages about program execution.
@ LOG_WARNING
Non-critical issues that warrant attention.
@ LOG_DEBUG
Detailed debugging information.
#define PROFILE_FUNCTION_BEGIN
Marks the beginning of a profiled code block (typically a function).
PetscErrorCode UpdateSolverHistoryVectors(UserCtx *user, PetscBool preserve_previous_state)
Copies the current time step's solution fields into history vectors (e.g., U(t_n) -> U_o,...
PetscErrorCode UniformCart2Contra(UserCtx *user, PetscReal u, PetscReal v, PetscReal w)
Populate contravariant fluxes from one uniform Cartesian velocity.
PetscErrorCode Contra2Cart(UserCtx *user)
Reconstructs Cartesian velocity (Ucat) at cell centers from contravariant velocity (Ucont) defined on...
PetscErrorCode UpdateLocalGhosts(UserCtx *user, FieldId field_id)
Updates the local vector (including ghost points) from its corresponding global vector.
PetscErrorCode Cart2Contra(UserCtx *user)
Convert the ghosted Cartesian velocity field to contravariant face fluxes.
PetscReal icVelocityPhysical
PetscBool inletFaceDefined
BCFace identifiedInletBCFace
InitialConditionMode initialConditionMode
SimCtx * simCtx
Back-pointer to the master simulation context.
FlowDirection flowDirection
char * current_io_directory
char eulerianSource[PETSC_MAX_PATH_LEN]
FlowDirection
Primary flow direction for streamwise IC and Poiseuille modes.
char initialConditionDirectory[PETSC_MAX_PATH_LEN]
char AnalyticalSolutionType[PETSC_MAX_PATH_LEN]
@ IC_MODE_CONSTANT_CARTESIAN
@ IC_MODE_CONSTANT_STREAMWISE
Cmpnts InitialConstantContra
char _io_context_buffer[PETSC_MAX_PATH_LEN]
InitialConditionField initialConditionField
PetscBool restartHistoryAvailable
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.