46 PetscFunctionBeginUser;
49 ierr = PetscNew(p_simCtx); CHKERRQ(ierr);
81 simCtx->
ren = 100.0; simCtx->
cfl = 0.1; simCtx->
vnn = 0.1;
91 simCtx->
max_angle = -54. * 3.1415926 / 180.;
101 strcpy(simCtx->
grid_file,
"config/grid.dat");
109 ierr = PetscMalloc1(1, &simCtx->
bcs_files); CHKERRQ(ierr);
110 ierr = PetscStrallocpy(
"config/bcs.dat", &simCtx->
bcs_files[0]); CHKERRQ(ierr);
113 simCtx->
U_bc = 0.0; simCtx->
ccc = 0;
130 simCtx->
ibm = NULL; simCtx->
ibmv = NULL; simCtx->
fsi = NULL;
134 strcpy(simCtx->
allowedFile,
"config/whitelist.dat");
135 simCtx->
useCfg = PETSC_FALSE;
148 ierr = PetscNew(&simCtx->
pps); CHKERRQ(ierr);
152 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &simCtx->
rank); CHKERRQ(ierr);
153 ierr = MPI_Comm_size(PETSC_COMM_WORLD, &simCtx->
size); CHKERRQ(ierr);
155 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD, NULL,
"config/control.dat", PETSC_FALSE);
156 if (ierr == PETSC_ERR_FILE_OPEN) {
157 if (simCtx->
rank == 0) {
158 PetscPrintf(PETSC_COMM_SELF,
"INFO: Could not open optional 'control.dat' file. Proceeding with defaults and command-line options.\n");
168 ierr = PetscOptionsGetString(NULL, NULL,
"-func_config_file", simCtx->
allowedFile, PETSC_MAX_PATH_LEN, &simCtx->
useCfg); CHKERRQ(ierr);
174 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load allowed functions from '%s'. Falling back to default list.\n", __func__, simCtx->
allowedFile);
175 simCtx->
useCfg = PETSC_FALSE;
183 ierr = PetscStrallocpy(
"main", &simCtx->
allowedFuncs[0]); CHKERRQ(ierr);
184 ierr = PetscStrallocpy(
"CreateSimulationContext", &simCtx->
allowedFuncs[1]); CHKERRQ(ierr);
199 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load critical profiling functions from '%s'. Falling back to default list.\n", __func__, simCtx->
criticalFuncsFile);
208 ierr = PetscStrallocpy(
"Flow_Solver", &simCtx->
criticalFuncs[0]); CHKERRQ(ierr);
209 ierr = PetscStrallocpy(
"AdvanceSimulation", &simCtx->
criticalFuncs[1]); CHKERRQ(ierr);
210 ierr = PetscStrallocpy(
"LocateAllParticlesInGrid_TEST", &simCtx->
criticalFuncs[2]); CHKERRQ(ierr);
211 ierr = PetscStrallocpy(
"InterpolateAllFieldsToSwarm", &simCtx->
criticalFuncs[3]); CHKERRQ(ierr);
223 ierr = PetscOptionsGetInt(NULL, NULL,
"-rstart", &simCtx->
StartStep, &simCtx->
rstart_flg); CHKERRQ(ierr);
227 ierr = PetscOptionsGetReal(NULL, NULL,
"-ti", &simCtx->
StartTime, NULL); CHKERRQ(ierr);
229 ierr = PetscOptionsGetInt(NULL,NULL,
"-totalsteps", &simCtx->
StepsToRun, NULL); CHKERRQ(ierr);
230 ierr = PetscOptionsGetBool(NULL, NULL,
"-only_setup", &simCtx->
OnlySetup, NULL); CHKERRQ(ierr);
231 ierr = PetscOptionsGetReal(NULL, NULL,
"-dt", &simCtx->
dt, NULL); CHKERRQ(ierr);
232 ierr = PetscOptionsGetInt(NULL, NULL,
"-tio", &simCtx->
tiout, NULL); CHKERRQ(ierr);
237 ierr = PetscOptionsGetInt(NULL, NULL,
"-imm", &simCtx->
immersed, NULL); CHKERRQ(ierr);
238 ierr = PetscOptionsGetInt(NULL, NULL,
"-fsi", &simCtx->
movefsi, NULL); CHKERRQ(ierr);
239 ierr = PetscOptionsGetInt(NULL, NULL,
"-rfsi", &simCtx->
rotatefsi, NULL); CHKERRQ(ierr);
240 ierr = PetscOptionsGetInt(NULL, NULL,
"-sediment", &simCtx->
sediment, NULL); CHKERRQ(ierr);
241 ierr = PetscOptionsGetInt(NULL, NULL,
"-rheology", &simCtx->
rheology, NULL); CHKERRQ(ierr);
242 ierr = PetscOptionsGetInt(NULL, NULL,
"-inv", &simCtx->
invicid, NULL); CHKERRQ(ierr);
243 ierr = PetscOptionsGetInt(NULL, NULL,
"-TwoD", &simCtx->
TwoD, NULL); CHKERRQ(ierr);
244 ierr = PetscOptionsGetInt(NULL, NULL,
"-thin", &simCtx->
thin, NULL); CHKERRQ(ierr);
245 ierr = PetscOptionsGetInt(NULL, NULL,
"-mframe", &simCtx->
moveframe, NULL); CHKERRQ(ierr);
246 ierr = PetscOptionsGetInt(NULL, NULL,
"-rframe", &simCtx->
rotateframe, NULL); CHKERRQ(ierr);
247 ierr = PetscOptionsGetInt(NULL, NULL,
"-blk", &simCtx->
blank, NULL); CHKERRQ(ierr);
248 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_z", &simCtx->
dgf_z, NULL); CHKERRQ(ierr);
249 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_y", &simCtx->
dgf_y, NULL); CHKERRQ(ierr);
250 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_x", &simCtx->
dgf_x, NULL); CHKERRQ(ierr);
251 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_az", &simCtx->
dgf_az, NULL); CHKERRQ(ierr);
252 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ay", &simCtx->
dgf_ay, NULL); CHKERRQ(ierr);
253 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ax", &simCtx->
dgf_ax, NULL); CHKERRQ(ierr);
257 ierr = PetscOptionsGetInt(NULL, NULL,
"-cop", &simCtx->
cop, NULL); CHKERRQ(ierr);
258 ierr = PetscOptionsGetInt(NULL, NULL,
"-fish", &simCtx->
fish, NULL); CHKERRQ(ierr);
259 ierr = PetscOptionsGetInt(NULL, NULL,
"-pizza", &simCtx->
pizza, NULL); CHKERRQ(ierr);
260 ierr = PetscOptionsGetInt(NULL, NULL,
"-turbine", &simCtx->
turbine, NULL); CHKERRQ(ierr);
261 ierr = PetscOptionsGetInt(NULL, NULL,
"-fishcyl", &simCtx->
fishcyl, NULL); CHKERRQ(ierr);
262 ierr = PetscOptionsGetInt(NULL, NULL,
"-eel", &simCtx->
eel, NULL); CHKERRQ(ierr);
263 ierr = PetscOptionsGetInt(NULL, NULL,
"-cstart", &simCtx->
fish_c, NULL); CHKERRQ(ierr);
264 ierr = PetscOptionsGetInt(NULL, NULL,
"-wing", &simCtx->
wing, NULL); CHKERRQ(ierr);
265 ierr = PetscOptionsGetInt(NULL, NULL,
"-mhv", &simCtx->
MHV, NULL); CHKERRQ(ierr);
266 ierr = PetscOptionsGetInt(NULL, NULL,
"-hydro", &simCtx->
hydro, NULL); CHKERRQ(ierr);
267 ierr = PetscOptionsGetInt(NULL, NULL,
"-lv", &simCtx->
LV, NULL); CHKERRQ(ierr);
268 ierr = PetscOptionsGetInt(NULL, NULL,
"-Pipe", &simCtx->
Pipe, NULL); CHKERRQ(ierr);
272 ierr = PetscOptionsGetInt(NULL, NULL,
"-imp", &simCtx->
implicit, NULL); CHKERRQ(ierr);
273 ierr = PetscOptionsGetInt(NULL, NULL,
"-imp_type", &simCtx->
implicit_type, NULL); CHKERRQ(ierr);
274 ierr = PetscOptionsGetInt(NULL, NULL,
"-imp_MAX_IT", &simCtx->
imp_MAX_IT, NULL); CHKERRQ(ierr);
275 ierr = PetscOptionsGetReal(NULL, NULL,
"-imp_atol", &simCtx->
imp_atol, NULL); CHKERRQ(ierr);
276 ierr = PetscOptionsGetReal(NULL, NULL,
"-imp_rtol", &simCtx->
imp_rtol, NULL); CHKERRQ(ierr);
277 ierr = PetscOptionsGetReal(NULL, NULL,
"-imp_stol", &simCtx->
imp_stol, NULL); CHKERRQ(ierr);
278 ierr = PetscOptionsGetInt(NULL, NULL,
"-central", &simCtx->
central, NULL); CHKERRQ(ierr);
281 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_level", &simCtx->
mglevels, NULL); CHKERRQ(ierr);
282 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_max_it", &simCtx->
mg_MAX_IT, NULL); CHKERRQ(ierr);
283 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_idx", &simCtx->
mg_idx, NULL); CHKERRQ(ierr);
284 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_pre_it", &simCtx->
mg_preItr, NULL); CHKERRQ(ierr);
285 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_post_it", &simCtx->
mg_poItr, NULL); CHKERRQ(ierr);
288 ierr = PetscOptionsGetInt(NULL, NULL,
"-poisson", &simCtx->
poisson, NULL); CHKERRQ(ierr);
289 ierr = PetscOptionsGetReal(NULL, NULL,
"-poisson_tol", &simCtx->
poisson_tol, NULL); CHKERRQ(ierr);
290 ierr = PetscOptionsGetInt(NULL, NULL,
"-str", &simCtx->
STRONG_COUPLING, NULL); CHKERRQ(ierr);
291 ierr = PetscOptionsGetInt(NULL, NULL,
"-init1", &simCtx->
InitialGuessOne, NULL); CHKERRQ(ierr);
292 ierr = PetscOptionsGetReal(NULL, NULL,
"-ren", &simCtx->
ren, NULL); CHKERRQ(ierr);
293 ierr = PetscOptionsGetReal(NULL, NULL,
"-cfl", &simCtx->
cfl, NULL); CHKERRQ(ierr);
294 ierr = PetscOptionsGetReal(NULL, NULL,
"-vnn", &simCtx->
vnn, NULL); CHKERRQ(ierr);
295 ierr = PetscOptionsGetInt(NULL, NULL,
"-finit", &simCtx->
FieldInitialization, NULL); CHKERRQ(ierr);
296 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_x", &simCtx->
InitialConstantContra.
x, NULL); CHKERRQ(ierr);
297 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_y", &simCtx->
InitialConstantContra.
y, NULL); CHKERRQ(ierr);
298 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_z", &simCtx->
InitialConstantContra.
z, NULL); CHKERRQ(ierr);
303 ierr = PetscOptionsGetInt(NULL, NULL,
"-body", &simCtx->
NumberOfBodies, NULL); CHKERRQ(ierr);
305 ierr = PetscOptionsGetReal(NULL, NULL,
"-St_exp", &simCtx->
St_exp, NULL); CHKERRQ(ierr);
306 ierr = PetscOptionsGetReal(NULL, NULL,
"-wlngth", &simCtx->
wavelength, NULL); CHKERRQ(ierr);
307 ierr = PetscOptionsGetReal(NULL, NULL,
"-x_c", &simCtx->
CMx_c, NULL); CHKERRQ(ierr);
308 ierr = PetscOptionsGetReal(NULL, NULL,
"-y_c", &simCtx->
CMy_c, NULL); CHKERRQ(ierr);
309 ierr = PetscOptionsGetReal(NULL, NULL,
"-z_c", &simCtx->
CMz_c, NULL); CHKERRQ(ierr);
310 ierr = PetscOptionsGetInt(NULL, NULL,
"-reg", &simCtx->
regime, NULL); CHKERRQ(ierr);
311 ierr = PetscOptionsGetInt(NULL, NULL,
"-radi", &simCtx->
radi, NULL); CHKERRQ(ierr);
312 ierr = PetscOptionsGetReal(NULL, NULL,
"-chact_leng", &simCtx->
chact_leng, NULL); CHKERRQ(ierr);
318 ierr = PetscOptionsGetInt(NULL, NULL,
"-nblk", &simCtx->
block_number, NULL); CHKERRQ(ierr);
319 ierr = PetscOptionsGetInt(NULL, NULL,
"-inlet", &simCtx->
inletprofile, NULL); CHKERRQ(ierr);
320 ierr = PetscOptionsGetInt(NULL, NULL,
"-Ogrid", &simCtx->
Ogrid, NULL); CHKERRQ(ierr);
322 ierr = PetscOptionsGetInt(NULL, NULL,
"-grid1d", &simCtx->
grid1d, NULL); CHKERRQ(ierr);
323 ierr = PetscOptionsGetBool(NULL, NULL,
"-grid", &simCtx->
generate_grid, NULL); CHKERRQ(ierr);
324 ierr = PetscOptionsGetString(NULL, NULL,
"-grid_file", simCtx->
grid_file, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
325 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_x", &simCtx->
da_procs_x, NULL); CHKERRQ(ierr);
326 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_y", &simCtx->
da_procs_y, NULL); CHKERRQ(ierr);
327 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_z", &simCtx->
da_procs_z, NULL); CHKERRQ(ierr);
328 ierr = PetscOptionsGetInt(NULL, NULL,
"-i_periodic", &simCtx->
i_periodic, NULL); CHKERRQ(ierr);
329 ierr = PetscOptionsGetInt(NULL, NULL,
"-j_periodic", &simCtx->
j_periodic, NULL); CHKERRQ(ierr);
330 ierr = PetscOptionsGetInt(NULL, NULL,
"-k_periodic", &simCtx->
k_periodic, NULL); CHKERRQ(ierr);
331 ierr = PetscOptionsGetInt(NULL, NULL,
"-pbc_domain", &simCtx->
blkpbc, NULL); CHKERRQ(ierr);
333 ierr = PetscOptionsGetReal(NULL, NULL,
"-grid_rotation_angle", &simCtx->
grid_rotation_angle, NULL); CHKERRQ(ierr);
334 ierr = PetscOptionsGetReal(NULL, NULL,
"-Croty", &simCtx->
Croty, NULL); CHKERRQ(ierr);
335 ierr = PetscOptionsGetReal(NULL, NULL,
"-Crotz", &simCtx->
Crotz, NULL); CHKERRQ(ierr);
337 char file_list_str[PETSC_MAX_PATH_LEN * 10];
339 ierr = PetscOptionsGetString(NULL, NULL,
"-bcs_files", file_list_str,
sizeof(file_list_str), &bcs_flg); CHKERRQ(ierr);
340 ierr = PetscOptionsGetReal(NULL, NULL,
"-U_bc", &simCtx->
U_bc, NULL); CHKERRQ(ierr);
346 ierr = PetscFree(simCtx->
bcs_files[0]); CHKERRQ(ierr);
347 ierr = PetscFree(simCtx->
bcs_files); CHKERRQ(ierr);
354 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
357 token = strtok(str_copy,
",");
360 token = strtok(NULL,
",");
362 ierr = PetscFree(str_copy); CHKERRQ(ierr);
366 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
367 token = strtok(str_copy,
",");
369 ierr = PetscStrallocpy(token, &simCtx->
bcs_files[i]); CHKERRQ(ierr);
370 token = strtok(NULL,
",");
372 ierr = PetscFree(str_copy); CHKERRQ(ierr);
378 ierr = PetscOptionsGetInt(NULL, NULL,
"-les", &simCtx->
les, NULL); CHKERRQ(ierr);
379 ierr = PetscOptionsGetInt(NULL, NULL,
"-rans", &simCtx->
rans, NULL); CHKERRQ(ierr);
380 ierr = PetscOptionsGetInt(NULL, NULL,
"-wallfunction", &simCtx->
wallfunction, NULL); CHKERRQ(ierr);
381 ierr = PetscOptionsGetInt(NULL, NULL,
"-mixed", &simCtx->
mixed, NULL); CHKERRQ(ierr);
382 ierr = PetscOptionsGetInt(NULL, NULL,
"-clark", &simCtx->
clark, NULL); CHKERRQ(ierr);
383 ierr = PetscOptionsGetInt(NULL, NULL,
"-dynamic_freq", &simCtx->
dynamic_freq, NULL); CHKERRQ(ierr);
384 ierr = PetscOptionsGetReal(NULL, NULL,
"-max_cs", &simCtx->
max_cs, NULL); CHKERRQ(ierr);
385 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_ik", &simCtx->
testfilter_ik, NULL); CHKERRQ(ierr);
386 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_1d", &simCtx->
testfilter_1d, NULL); CHKERRQ(ierr);
387 ierr = PetscOptionsGetInt(NULL, NULL,
"-i_homo_filter", &simCtx->
i_homo_filter, NULL); CHKERRQ(ierr);
388 ierr = PetscOptionsGetInt(NULL, NULL,
"-j_homo_filter", &simCtx->
j_homo_filter, NULL); CHKERRQ(ierr);
389 ierr = PetscOptionsGetInt(NULL, NULL,
"-k_homo_filter", &simCtx->
k_homo_filter, NULL); CHKERRQ(ierr);
390 ierr = PetscOptionsGetBool(NULL, NULL,
"-averaging", &simCtx->
averaging, NULL); CHKERRQ(ierr);
394 ierr = PetscOptionsGetInt(NULL, NULL,
"-numParticles", &simCtx->
np, NULL); CHKERRQ(ierr);
395 ierr = PetscOptionsGetBool(NULL, NULL,
"-read_fields", &simCtx->
readFields, NULL); CHKERRQ(ierr);
400 ierr = PetscOptionsGetBool(NULL, NULL,
"-rs_fsi", &simCtx->
rstart_fsi, NULL); CHKERRQ(ierr);
401 ierr = PetscOptionsGetInt(NULL, NULL,
"-duplicate", &simCtx->
duplicate, NULL); CHKERRQ(ierr);
405 ierr = PetscOptionsGetInt(NULL, NULL,
"-logfreq", &simCtx->
LoggingFrequency, NULL); CHKERRQ(ierr);
408 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_INCOMP,
"Number of BC files (%d) does not match number of blocks (%d). Use -bcs_files \"file1.dat,file2.dat,...\".", simCtx->
num_bcs_files, simCtx->
block_number);
414 ierr = PetscOptionsGetString(NULL,NULL,
"-postprocessing_config_file",simCtx->
PostprocessingControlFile,PETSC_MAX_PATH_LEN,NULL); CHKERRQ(ierr);
415 ierr = PetscNew(&simCtx->
pps); CHKERRQ(ierr);
420 for (PetscInt i = 0; i < simCtx->
nAllowed; ++i) {
432 ierr = PetscLogDefaultBegin(); CHKERRQ(ierr);
437 PetscFunctionReturn(0);
617 PetscFunctionBeginUser;
621 for (PetscInt level = usermg->
mglevels-1; level >=0; level--) {
622 for (PetscInt bi = 0; bi < nblk; bi++) {
625 if(!user->
da || !user->
fda) {
626 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMs not properly initialized in UserCtx before vector creation.");
633 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucont); CHKERRQ(ierr); ierr = VecSet(user->
Ucont, 0.0); CHKERRQ(ierr);
634 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucat); CHKERRQ(ierr); ierr = VecSet(user->
Ucat, 0.0); CHKERRQ(ierr);
635 ierr = DMCreateGlobalVector(user->
da, &user->
P); CHKERRQ(ierr); ierr = VecSet(user->
P, 0.0); CHKERRQ(ierr);
636 ierr = DMCreateGlobalVector(user->
da, &user->
Nvert); CHKERRQ(ierr); ierr = VecSet(user->
Nvert, 0.0); CHKERRQ(ierr);
638 ierr = DMCreateLocalVector(user->
fda, &user->
lUcont); CHKERRQ(ierr); ierr = VecSet(user->
lUcont, 0.0); CHKERRQ(ierr);
639 ierr = DMCreateLocalVector(user->
fda, &user->
lUcat); CHKERRQ(ierr); ierr = VecSet(user->
lUcat, 0.0); CHKERRQ(ierr);
640 ierr = DMCreateLocalVector(user->
da, &user->
lP); CHKERRQ(ierr); ierr = VecSet(user->
lP, 0.0); CHKERRQ(ierr);
641 ierr = DMCreateLocalVector(user->
da, &user->
lNvert); CHKERRQ(ierr); ierr = VecSet(user->
lNvert, 0.0); CHKERRQ(ierr);
644 if (level == usermg->
mglevels - 1) {
645 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_o, 0.0); CHKERRQ(ierr);
646 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_rm1); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_rm1, 0.0); CHKERRQ(ierr);
647 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucat_o, 0.0); CHKERRQ(ierr);
648 ierr = VecDuplicate(user->
P, &user->
P_o); CHKERRQ(ierr); ierr = VecSet(user->
P_o, 0.0); CHKERRQ(ierr);
649 ierr = VecDuplicate(user->
lUcont, &user->
lUcont_o); CHKERRQ(ierr); ierr = VecSet(user->
lUcont_o, 0.0); CHKERRQ(ierr);
651 ierr = DMCreateLocalVector(user->
da, &user->
lNvert_o); CHKERRQ(ierr); ierr = VecSet(user->
lNvert_o, 0.0); CHKERRQ(ierr);
652 ierr = VecDuplicate(user->
Nvert, &user->
Nvert_o); CHKERRQ(ierr); ierr = VecSet(user->
Nvert_o, 0.0); CHKERRQ(ierr);
657 ierr = DMCreateGlobalVector(user->
fda, &user->
Csi); CHKERRQ(ierr); ierr = VecSet(user->
Csi, 0.0); CHKERRQ(ierr);
658 ierr = VecDuplicate(user->
Csi, &user->
Eta); CHKERRQ(ierr); ierr = VecSet(user->
Eta, 0.0); CHKERRQ(ierr);
659 ierr = VecDuplicate(user->
Csi, &user->
Zet); CHKERRQ(ierr); ierr = VecSet(user->
Zet, 0.0); CHKERRQ(ierr);
660 ierr = DMCreateGlobalVector(user->
da, &user->
Aj); CHKERRQ(ierr); ierr = VecSet(user->
Aj, 0.0); CHKERRQ(ierr);
661 ierr = VecDuplicate(user->
Aj, &user->
Phi); CHKERRQ(ierr); ierr = VecSet(user->
Phi, 0.0); CHKERRQ(ierr);
663 ierr = DMCreateLocalVector(user->
fda, &user->
lCsi); CHKERRQ(ierr); ierr = VecSet(user->
lCsi, 0.0); CHKERRQ(ierr);
664 ierr = VecDuplicate(user->
lCsi, &user->
lEta); CHKERRQ(ierr); ierr = VecSet(user->
lEta, 0.0); CHKERRQ(ierr);
665 ierr = VecDuplicate(user->
lCsi, &user->
lZet); CHKERRQ(ierr); ierr = VecSet(user->
lZet, 0.0); CHKERRQ(ierr);
666 ierr = DMCreateLocalVector(user->
da, &user->
lAj); CHKERRQ(ierr); ierr = VecSet(user->
lAj, 0.0); CHKERRQ(ierr);
667 ierr = VecDuplicate(user->
lAj, &user->
lPhi); CHKERRQ(ierr); ierr = VecSet(user->
lPhi, 0.0); CHKERRQ(ierr);
670 ierr = VecDuplicate(user->
Csi, &user->
ICsi); CHKERRQ(ierr); ierr = VecSet(user->
ICsi, 0.0); CHKERRQ(ierr);
671 ierr = VecDuplicate(user->
Csi, &user->
IEta); CHKERRQ(ierr); ierr = VecSet(user->
IEta, 0.0); CHKERRQ(ierr);
672 ierr = VecDuplicate(user->
Csi, &user->
IZet); CHKERRQ(ierr); ierr = VecSet(user->
IZet, 0.0); CHKERRQ(ierr);
673 ierr = VecDuplicate(user->
Csi, &user->
JCsi); CHKERRQ(ierr); ierr = VecSet(user->
JCsi, 0.0); CHKERRQ(ierr);
674 ierr = VecDuplicate(user->
Csi, &user->
JEta); CHKERRQ(ierr); ierr = VecSet(user->
JEta, 0.0); CHKERRQ(ierr);
675 ierr = VecDuplicate(user->
Csi, &user->
JZet); CHKERRQ(ierr); ierr = VecSet(user->
JZet, 0.0); CHKERRQ(ierr);
676 ierr = VecDuplicate(user->
Csi, &user->
KCsi); CHKERRQ(ierr); ierr = VecSet(user->
KCsi, 0.0); CHKERRQ(ierr);
677 ierr = VecDuplicate(user->
Csi, &user->
KEta); CHKERRQ(ierr); ierr = VecSet(user->
KEta, 0.0); CHKERRQ(ierr);
678 ierr = VecDuplicate(user->
Csi, &user->
KZet); CHKERRQ(ierr); ierr = VecSet(user->
KZet, 0.0); CHKERRQ(ierr);
680 ierr = VecDuplicate(user->
Aj, &user->
IAj); CHKERRQ(ierr); ierr = VecSet(user->
IAj, 0.0); CHKERRQ(ierr);
681 ierr = VecDuplicate(user->
Aj, &user->
JAj); CHKERRQ(ierr); ierr = VecSet(user->
JAj, 0.0); CHKERRQ(ierr);
682 ierr = VecDuplicate(user->
Aj, &user->
KAj); CHKERRQ(ierr); ierr = VecSet(user->
KAj, 0.0); CHKERRQ(ierr);
684 ierr = VecDuplicate(user->
lCsi, &user->
lICsi); CHKERRQ(ierr); ierr = VecSet(user->
lICsi, 0.0); CHKERRQ(ierr);
685 ierr = VecDuplicate(user->
lCsi, &user->
lIEta); CHKERRQ(ierr); ierr = VecSet(user->
lIEta, 0.0); CHKERRQ(ierr);
686 ierr = VecDuplicate(user->
lCsi, &user->
lIZet); CHKERRQ(ierr); ierr = VecSet(user->
lIZet, 0.0); CHKERRQ(ierr);
687 ierr = VecDuplicate(user->
lCsi, &user->
lJCsi); CHKERRQ(ierr); ierr = VecSet(user->
lJCsi, 0.0); CHKERRQ(ierr);
688 ierr = VecDuplicate(user->
lCsi, &user->
lJEta); CHKERRQ(ierr); ierr = VecSet(user->
lJEta, 0.0); CHKERRQ(ierr);
689 ierr = VecDuplicate(user->
lCsi, &user->
lJZet); CHKERRQ(ierr); ierr = VecSet(user->
lJZet, 0.0); CHKERRQ(ierr);
690 ierr = VecDuplicate(user->
lCsi, &user->
lKCsi); CHKERRQ(ierr); ierr = VecSet(user->
lKCsi, 0.0); CHKERRQ(ierr);
691 ierr = VecDuplicate(user->
lCsi, &user->
lKEta); CHKERRQ(ierr); ierr = VecSet(user->
lKEta, 0.0); CHKERRQ(ierr);
692 ierr = VecDuplicate(user->
lCsi, &user->
lKZet); CHKERRQ(ierr); ierr = VecSet(user->
lKZet, 0.0); CHKERRQ(ierr);
694 ierr = VecDuplicate(user->
lAj, &user->
lIAj); CHKERRQ(ierr); ierr = VecSet(user->
lIAj, 0.0); CHKERRQ(ierr);
695 ierr = VecDuplicate(user->
lAj, &user->
lJAj); CHKERRQ(ierr); ierr = VecSet(user->
lJAj, 0.0); CHKERRQ(ierr);
696 ierr = VecDuplicate(user->
lAj, &user->
lKAj); CHKERRQ(ierr); ierr = VecSet(user->
lKAj, 0.0); CHKERRQ(ierr);
699 ierr = DMCreateGlobalVector(user->
fda, &user->
Cent); CHKERRQ(ierr); ierr = VecSet(user->
Cent, 0.0); CHKERRQ(ierr);
700 ierr = DMCreateLocalVector(user->
fda, &user->
lCent); CHKERRQ(ierr); ierr = VecSet(user->
lCent, 0.0); CHKERRQ(ierr);
702 ierr = VecDuplicate(user->
Cent, &user->
GridSpace); CHKERRQ(ierr); ierr = VecSet(user->
GridSpace, 0.0); CHKERRQ(ierr);
706 ierr = VecDuplicate(user->
Cent, &user->
Centx); CHKERRQ(ierr); ierr = VecSet(user->
Centx, 0.0); CHKERRQ(ierr);
707 ierr = VecDuplicate(user->
Cent, &user->
Centy); CHKERRQ(ierr); ierr = VecSet(user->
Centy, 0.0); CHKERRQ(ierr);
708 ierr = VecDuplicate(user->
Cent, &user->
Centz); CHKERRQ(ierr); ierr = VecSet(user->
Centz, 0.0); CHKERRQ(ierr);
712 if (simCtx->
les || simCtx->
rans) {
713 ierr = DMCreateGlobalVector(user->
da, &user->
Nu_t); CHKERRQ(ierr); ierr = VecSet(user->
Nu_t, 0.0); CHKERRQ(ierr);
714 ierr = DMCreateLocalVector(user->
da, &user->
lNu_t); CHKERRQ(ierr); ierr = VecSet(user->
lNu_t, 0.0); CHKERRQ(ierr);
726 ierr = DMCreateGlobalVector(user->
da,&user->
Psi); CHKERRQ(ierr); ierr = VecSet(user->
Psi,0.0); CHKERRQ(ierr);
732 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Ubcs); CHKERRQ(ierr);
733 ierr = VecSet(user->
Bcs.
Ubcs, 0.0); CHKERRQ(ierr);
734 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Uch); CHKERRQ(ierr);
735 ierr = VecSet(user->
Bcs.
Uch, 0.0); CHKERRQ(ierr);
741 ierr = VecDuplicate(user->
P, &user->
P_nodal); CHKERRQ(ierr);
742 ierr = VecSet(user->
P_nodal, 0.0); CHKERRQ(ierr);
744 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_nodal); CHKERRQ(ierr);
745 ierr = VecSet(user->
Ucat_nodal, 0.0); CHKERRQ(ierr);
747 ierr = VecDuplicate(user->
P, &user->
Qcrit); CHKERRQ(ierr);
748 ierr = VecSet(user->
Qcrit, 0.0); CHKERRQ(ierr);
760 PetscFunctionReturn(0);
783 Vec globalVec = NULL;
787 PetscFunctionBeginUser;
788 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
792 if (strcmp(fieldName,
"Ucat") == 0) {
793 globalVec = user->
Ucat;
794 localVec = user->
lUcat;
796 }
else if (strcmp(fieldName,
"Ucont") == 0) {
797 globalVec = user->
Ucont;
800 }
else if (strcmp(fieldName,
"P") == 0) {
804 }
else if (strcmp(fieldName,
"Csi") == 0) {
805 globalVec = user->
Csi;
806 localVec = user->
lCsi;
808 }
else if (strcmp(fieldName,
"Eta") == 0) {
809 globalVec = user->
Eta;
810 localVec = user->
lEta;
812 }
else if (strcmp(fieldName,
"Zet") == 0) {
813 globalVec = user->
Zet;
814 localVec = user->
lZet;
816 }
else if (strcmp(fieldName,
"Nvert") == 0) {
817 globalVec = user->
Nvert;
821 }
else if (strcmp(fieldName,
"Aj") == 0) {
822 globalVec = user->
Aj;
823 localVec = user->
lAj;
825 }
else if (strcmp(fieldName,
"Cent") == 0) {
826 globalVec = user->
Cent;
827 localVec = user->
lCent;
829 }
else if (strcmp(fieldName,
"GridSpace") == 0) {
833 }
else if (strcmp(fieldName,
"ICsi") == 0){
834 globalVec = user->
ICsi;
835 localVec = user->
lICsi;
837 }
else if (strcmp(fieldName,
"IEta") == 0){
838 globalVec = user->
IEta;
839 localVec = user->
lIEta;
841 }
else if (strcmp(fieldName,
"IZet") == 0){
842 globalVec = user->
IZet;
843 localVec = user->
lIZet;
845 }
else if (strcmp(fieldName,
"JCsi") == 0){
846 globalVec = user->
JCsi;
847 localVec = user->
lJCsi;
849 }
else if (strcmp(fieldName,
"JEta") == 0){
850 globalVec = user->
JEta;
851 localVec = user->
lJEta;
853 }
else if (strcmp(fieldName,
"JZet") == 0){
854 globalVec = user->
JZet;
855 localVec = user->
lJZet;
857 }
else if (strcmp(fieldName,
"KCsi") == 0){
858 globalVec = user->
KCsi;
859 localVec = user->
lKCsi;
861 }
else if (strcmp(fieldName,
"KEta") == 0){
862 globalVec = user->
KEta;
863 localVec = user->
lKEta;
865 }
else if (strcmp(fieldName,
"KZet") == 0){
866 globalVec = user->
KZet;
867 localVec = user->
lKZet;
869 }
else if (strcmp(fieldName,
"IAj") == 0){
870 globalVec = user->
IAj;
871 localVec = user->
lIAj;
873 }
else if (strcmp(fieldName,
"JAj") == 0){
874 globalVec = user->
JAj;
875 localVec = user->
lJAj;
877 }
else if (strcmp(fieldName,
"KAj") == 0){
878 globalVec = user->
KAj;
879 localVec = user->
lKAj;
881 }
else if (strcmp(fieldName,
"Phi") == 0){
882 globalVec = user->
Phi;
883 localVec = user->
lPhi;
886 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
"Field '%s' not recognized for ghost update.", fieldName);
891 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Global vector for field '%s' is NULL.", fieldName);
894 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Local vector for field '%s' is NULL.", fieldName);
897 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"DM for field '%s' is NULL.", fieldName);
901 rank, fieldName, (
void*)dm, (
void*)globalVec, (
void*)localVec);
907 PetscReal norm_global_before;
908 ierr = VecNorm(globalVec, NORM_INFINITY, &norm_global_before); CHKERRQ(ierr);
918 ierr = DMGlobalToLocalBegin(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
919 ierr = DMGlobalToLocalEnd(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
926 PetscReal norm_local_after;
927 ierr = VecNorm(localVec, NORM_INFINITY, &norm_local_after); CHKERRQ(ierr);
932 if (strcmp(fieldName,
"Ucat") == 0) {
933 PetscMPIInt rank_test;
934 MPI_Comm_rank(PETSC_COMM_WORLD, &rank_test);
937 DMDALocalInfo info_check;
938 ierr = DMDAGetLocalInfo(dm, &info_check); CHKERRQ(ierr);
941 Cmpnts ***lUcat_arr_test = NULL;
942 PetscErrorCode ierr_test = 0;
944 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Testing '%s' access immediately after ghost update...\n", rank_test, fieldName);
945 ierr_test = DMDAVecGetArrayDOFRead(dm, localVec, &lUcat_arr_test);
948 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d getting '%s' array after ghost update!\n", rank_test, ierr_test, fieldName);
949 }
else if (!lUcat_arr_test) {
950 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR NULL pointer getting '%s' array after ghost update!\n", rank_test, fieldName);
954 PetscInt k_int = info_check.zs + (info_check.zm > 1 ? 1 : 0);
955 PetscInt j_int = info_check.ys + (info_check.ym > 1 ? 1 : 0);
956 PetscInt i_int = info_check.xs + (info_check.xm > 1 ? 1 : 0);
962 if (k_int >= info_check.mz - 1) {
963 k_int = info_check.mz - 2;
970 if (j_int >= info_check.my - 1) {
971 j_int = info_check.my - 2;
978 if (i_int >= info_check.mx - 1) {
979 i_int = info_check.mx - 2;
986 if (k_int >= info_check.zs && k_int < info_check.zs + info_check.zm &&
987 j_int >= info_check.ys && j_int < info_check.ys + info_check.ym &&
988 i_int >= info_check.xs && i_int < info_check.xs + info_check.xm)
990 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read OWNED INTERIOR [%d][%d][%d] (Global)\n", rank_test, k_int, j_int, i_int);
991 Cmpnts test_val_owned_interior = lUcat_arr_test[k_int][j_int][i_int];
992 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned interior: x=%g\n", rank_test, test_val_owned_interior.
x);
994 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Skipping interior test read for non-owned index [%d][%d][%d].\n", rank_test, k_int, j_int, i_int);
999 PetscInt k_bnd = info_check.zs;
1000 PetscInt j_bnd = info_check.ys;
1001 PetscInt i_bnd = info_check.xs;
1002 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read OWNED BOUNDARY [%d][%d][%d] (Global)\n", rank_test, k_bnd, j_bnd, i_bnd);
1003 Cmpnts test_val_owned_boundary = lUcat_arr_test[k_bnd][j_bnd][i_bnd];
1004 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned boundary: x=%g\n", rank_test, test_val_owned_boundary.
x);
1008 if (info_check.zs > 0) {
1009 PetscInt k_ghost = info_check.zs - 1;
1010 PetscInt j_ghost = info_check.ys;
1011 PetscInt i_ghost = info_check.xs;
1012 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read GHOST [%d][%d][%d] (Global)\n", rank_test, k_ghost, j_ghost, i_ghost);
1013 Cmpnts test_val_ghost = lUcat_arr_test[k_ghost][j_ghost][i_ghost];
1020 ierr_test = DMDAVecRestoreArrayDOFRead(dm, localVec, &lUcat_arr_test);
1021 if(ierr_test){
LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d restoring '%s' array after test read!\n", rank_test, ierr_test, fieldName); }
1028 PetscFunctionReturn(0);
1346 PetscInt *xs_cell_global_out,
1347 PetscInt *xm_cell_local_out)
1349 PetscErrorCode ierr = 0;
1350 PetscInt xs_node_global_rank;
1351 PetscInt num_nodes_owned_rank;
1352 PetscInt GlobalNodesInDim_from_info;
1354 PetscFunctionBeginUser;
1357 if (!info_nodes || !xs_cell_global_out || !xm_cell_local_out) {
1358 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"Null pointer passed to GetOwnedCellRange.");
1363 xs_node_global_rank = info_nodes->xs;
1364 num_nodes_owned_rank = info_nodes->xm;
1365 GlobalNodesInDim_from_info = info_nodes->mx;
1366 }
else if (dim == 1) {
1367 xs_node_global_rank = info_nodes->ys;
1368 num_nodes_owned_rank = info_nodes->ym;
1369 GlobalNodesInDim_from_info = info_nodes->my;
1370 }
else if (dim == 2) {
1371 xs_node_global_rank = info_nodes->zs;
1372 num_nodes_owned_rank = info_nodes->zm;
1373 GlobalNodesInDim_from_info = info_nodes->mz;
1375 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
"Invalid dimension %d in GetOwnedCellRange. Must be 0, 1, or 2.", dim);
1380 if (GlobalNodesInDim_from_info <= 1) {
1381 *xs_cell_global_out = xs_node_global_rank;
1382 *xm_cell_local_out = 0;
1383 PetscFunctionReturn(0);
1386 if (GlobalNodesInDim_from_info < 0 ) {
1387 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
"GlobalNodesInDim %d from DMDALocalInfo must be non-negative for dimension %d.", GlobalNodesInDim_from_info, dim);
1392 *xs_cell_global_out = xs_node_global_rank;
1395 if (num_nodes_owned_rank == 0) {
1396 *xm_cell_local_out = 0;
1402 PetscInt last_possible_origin_global_idx = GlobalNodesInDim_from_info - 2;
1406 PetscInt first_potential_origin_on_rank = xs_node_global_rank;
1412 PetscInt last_potential_origin_on_rank = xs_node_global_rank + num_nodes_owned_rank - 2;
1415 PetscInt actual_last_origin_this_rank_can_form = PetscMin(last_potential_origin_on_rank, last_possible_origin_global_idx);
1421 if (first_potential_origin_on_rank > actual_last_origin_this_rank_can_form) {
1422 *xm_cell_local_out = 0;
1426 *xm_cell_local_out = actual_last_origin_this_rank_can_form - first_potential_origin_on_rank + 1;
1429 PetscFunctionReturn(ierr);
1787 PetscErrorCode ierr;
1789 Cmpnts ***lcsi_arr, ***leta_arr, ***lzet_arr;
1792 PetscReal ***lnvert_arr;
1793 PetscReal ***laj_arr;
1795 PetscFunctionBeginUser;
1801 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
1803 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Contra2Cart requires lUcont, lCsi/Eta/Zet, lNvert, and Ucat to be non-NULL.");
1808 ierr = DMDAVecGetArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
1809 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
1810 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
1811 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
1812 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
1813 ierr = DMDAVecGetArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
1818 ierr = DMDAVecGetArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
1825 PetscInt i_start = (info.xs == 0) ? info.xs + 1 : info.xs;
1826 PetscInt i_end = (info.xs + info.xm == info.mx) ? info.xs + info.xm - 1 : info.xs + info.xm;
1828 PetscInt j_start = (info.ys == 0) ? info.ys + 1 : info.ys;
1829 PetscInt j_end = (info.ys + info.ym == info.my) ? info.ys + info.ym - 1 : info.ys + info.ym;
1831 PetscInt k_start = (info.zs == 0) ? info.zs + 1 : info.zs;
1832 PetscInt k_end = (info.zs + info.zm == info.mz) ? info.zs + info.zm - 1 : info.zs + info.zm;
1836 for (PetscInt k_cell = k_start; k_cell < k_end; ++k_cell) {
1837 for (PetscInt j_cell = j_start; j_cell < j_end; ++j_cell) {
1838 for (PetscInt i_cell = i_start; i_cell < i_end; ++i_cell) {
1845 PetscReal mat[3][3];
1849 mat[0][0] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
x + lcsi_arr[k_cell][j_cell][i_cell].
x);
1850 mat[0][1] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
y + lcsi_arr[k_cell][j_cell][i_cell].
y);
1851 mat[0][2] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
z + lcsi_arr[k_cell][j_cell][i_cell].
z);
1853 mat[1][0] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
x + leta_arr[k_cell][j_cell][i_cell].
x);
1854 mat[1][1] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
y + leta_arr[k_cell][j_cell][i_cell].
y);
1855 mat[1][2] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
z + leta_arr[k_cell][j_cell][i_cell].
z);
1857 mat[2][0] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
x + lzet_arr[k_cell][j_cell][i_cell].
x);
1858 mat[2][1] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
y + lzet_arr[k_cell][j_cell][i_cell].
y);
1859 mat[2][2] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
z + lzet_arr[k_cell][j_cell][i_cell].
z);
1864 q[0] = 0.5 * (lucont_arr[k_cell][j_cell][i_cell-1].
x + lucont_arr[k_cell][j_cell][i_cell].
x);
1865 q[1] = 0.5 * (lucont_arr[k_cell][j_cell-1][i_cell].
y + lucont_arr[k_cell][j_cell][i_cell].
y);
1866 q[2] = 0.5 * (lucont_arr[k_cell-1][j_cell][i_cell].
z + lucont_arr[k_cell][j_cell][i_cell].
z);
1869 PetscReal det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
1870 mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
1871 mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
1873 if (PetscAbsReal(det) < 1.0e-18) {
1874 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Transformation matrix determinant is near zero at cell (%d,%d,%d) \n", i_cell, j_cell, k_cell);
1877 PetscReal det_inv = 1.0 / det;
1879 PetscReal det0 = q[0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
1880 q[1] * (mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1]) +
1881 q[2] * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]);
1883 PetscReal det1 = -q[0] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
1884 q[1] * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]) -
1885 q[2] * (mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]);
1887 PetscReal det2 = q[0] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]) -
1888 q[1] * (mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0]) +
1889 q[2] * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]);
1893 gucat_arr[k_cell][j_cell][i_cell].
x = det0 * det_inv;
1894 gucat_arr[k_cell][j_cell][i_cell].
y = det1 * det_inv;
1895 gucat_arr[k_cell][j_cell][i_cell].
z = det2 * det_inv;
1901 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
1902 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
1903 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
1904 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
1905 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
1906 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
1907 ierr = DMDAVecRestoreArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
1910 PetscFunctionReturn(0);
2073 DM da = user->
da, fda = user->
fda;
2074 DMDALocalInfo info = user->
info;
2078 PetscInt xs = info.xs, xe = info.xs + info.xm;
2079 PetscInt ys = info.ys, ye = info.ys + info.ym;
2080 PetscInt zs = info.zs, ze = info.zs + info.zm;
2081 PetscInt mx = info.mx, my = info.my, mz = info.mz;
2083 PetscInt lxs, lys, lzs, lxe, lye, lze;
2087 PetscReal ***div, ***aj, ***nvert,***p;
2095 if (xs==0) lxs = xs+1;
2096 if (ys==0) lys = ys+1;
2097 if (zs==0) lzs = zs+1;
2099 if (xe==mx) lxe = xe-1;
2100 if (ye==my) lye = ye-1;
2101 if (ze==mz) lze = ze-1;
2103 DMDAVecGetArray(fda,user->
lUcont, &ucont);
2104 DMDAVecGetArray(da, user->
lAj, &aj);
2105 VecDuplicate(user->
P, &Div);
2106 DMDAVecGetArray(da, Div, &div);
2107 DMDAVecGetArray(da, user->
lNvert, &nvert);
2108 DMDAVecGetArray(da, user->
P, &p);
2109 for (k=lzs; k<lze; k++) {
2110 for (j=lys; j<lye; j++){
2111 for (i=lxs; i<lxe; i++) {
2112 if (k==10 && j==10 && i==1){
2113 LOG_ALLOW(
LOCAL,
LOG_INFO,
"Pressure[10][10][1] = %f | Pressure[10][10][0] = %f \n ",p[k][j][i],p[k][j][i-1]);
2116 if (k==10 && j==10 && i==mx-3)
2117 LOG_ALLOW(
LOCAL,
LOG_INFO,
"Pressure[10][10][%d] = %f | Pressure[10][10][%d] = %f \n ",mx-2,p[k][j][mx-2],mx-1,p[k][j][mx-1]);
2121 DMDAVecRestoreArray(da, user->
P, &p);
2124 for (k=lzs; k<lze; k++) {
2125 for (j=lys; j<lye; j++) {
2126 for (i=lxs; i<lxe; i++) {
2127 maxdiv = fabs((ucont[k][j][i].x - ucont[k][j][i-1].x +
2128 ucont[k][j][i].y - ucont[k][j-1][i].y +
2129 ucont[k][j][i].z - ucont[k-1][j][i].z)*aj[k][j][i]);
2130 if (nvert[k][j][i] + nvert[k+1][j][i] + nvert[k-1][j][i] +
2131 nvert[k][j+1][i] + nvert[k][j-1][i] +
2132 nvert[k][j][i+1] + nvert[k][j][i-1] > 0.1) maxdiv = 0.;
2133 div[k][j][i] = maxdiv;
2141 for (j=ys; j<ye; j++) {
2142 for (i=xs; i<xe; i++) {
2150 for (j=ys; j<ye; j++) {
2151 for (i=xs; i<xe; i++) {
2159 for (k=zs; k<ze; k++) {
2160 for (j=ys; j<ye; j++) {
2168 for (k=zs; k<ze; k++) {
2169 for (j=ys; j<ye; j++) {
2177 for (k=zs; k<ze; k++) {
2178 for (i=xs; i<xe; i++) {
2186 for (k=zs; k<ze; k++) {
2187 for (i=xs; i<xe; i++) {
2192 DMDAVecRestoreArray(da, Div, &div);
2193 PetscInt MaxFlatIndex;
2195 VecMax(Div, &MaxFlatIndex, &maxdiv);
2197 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"[Step %d]] The Maximum Divergence is %e at flat index %d.\n",ti,maxdiv,MaxFlatIndex);
2202 for (k=zs; k<ze; k++) {
2203 for (j=ys; j<ye; j++) {
2204 for (i=xs; i<xe; i++) {
2205 if (
Gidx(i,j,k,user) == MaxFlatIndex) {
2206 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"[Step %d] The Maximum Divergence(%e) is at location [%d][%d][%d]. \n", ti, maxdiv,k,j,i);
2217 DMDAVecRestoreArray(da, user->
lNvert, &nvert);
2218 DMDAVecRestoreArray(fda, user->
lUcont, &ucont);
2219 DMDAVecRestoreArray(da, user->
lAj, &aj);