MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_start_up.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
2# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
3# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
4# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
5# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
6# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
7# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
8# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
9# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10
11# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16
17# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20
21# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28! New line at end of file is required for FYPP
29# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
30# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
31# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
32# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
33# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
35# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
36# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
37
38# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
39# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
40# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
41
42# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43
44# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45
46# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49
50# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53
54# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55! New line at end of file is required for FYPP
56# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
57
58# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
59# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
60# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
61# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
62# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
63
64# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
65
66# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
67
68# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
69
70# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
71
72# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
73
74# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75
76# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77
78# 76 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 151 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 192 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 206 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 231 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 242 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 244 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109# 255 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
110
111# 284 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
112
113# 294 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
114
115# 304 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
116
117# 313 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
118
119# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
120
121# 340 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
122
123# 347 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
124
125# 353 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 359 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 365 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 371 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 377 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134! New line at end of file is required for FYPP
135# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
136# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
137# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
138# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
139# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
140# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
141# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
142# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
143
144# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
145# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
146# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
147
148# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
149
150# 46 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
151
152# 58 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
153
154# 68 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155
156# 98 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157
158# 110 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 120 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161! New line at end of file is required for FYPP
162# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
163
164# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
165
166# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
167
168# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
169
170# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
171
172# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
173
174# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
175
176# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
177
178# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
179
180# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
181
182# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
183
184# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
185
186# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219! New line at end of file is required for FYPP
220# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
221
222! GPU parallel region (scalar reductions, maxval/minval)
223# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
224
225! GPU parallel loop over threads (most common GPU macro)
226# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
227
228! Required closing for GPU_PARALLEL_LOOP
229# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
230
231! Mark routine for device compilation
232# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
233
234! Declare device-resident data
235# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
236
237! Inner loop within a GPU parallel region
238# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
239
240! Scoped GPU data region
241# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
242
243! Host code with device pointers (for MPI with GPU buffers)
244# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
245
246! Allocate device memory (unscoped)
247# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
248
249! Free device memory
250# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
251
252! Atomic operation on device
253# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
254
255! End atomic capture block
256# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
257
258! Copy data between host and device
259# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
260
261! Synchronization barrier
262# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
263
264! Import GPU library module (openacc or omp_lib)
265# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
266
267! Emit code only for AMD compiler
268# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
269
270! Emit code for non-Cray compilers
271# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
272
273! Emit code only for Cray compiler
274# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
275
276! Emit code for non-NVIDIA compilers
277# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
278
279# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
280# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
281! New line at end of file is required for FYPP
282# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
283
284# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
285
286! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
287! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
288! example see misc/nvidia_uvm/bind.sh. NVIDIA unified memory page placement hint
289# 57 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
290
291! Allocate and create GPU device memory
292# 77 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
293
294! Free GPU device memory and deallocate
295# 85 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
296
297! Cray-specific GPU pointer setup for vector fields
298# 109 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
299
300! Cray-specific GPU pointer setup for scalar fields
301# 125 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
302
303! Cray-specific GPU pointer setup for acoustic source spatials
304# 150 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
305
306# 156 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
307
308# 163 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
309! New line at end of file is required for FYPP
310# 2 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp" 2
311
312!>
313!! @file
314!! @brief Contains module m_start_up
315
316!> @brief Reads and validates user inputs, allocates variables, and configures MPI decomposition and I/O for post-processing
317
319
320 use, intrinsic :: iso_c_binding
321
324 use m_mpi_proxy
325 use m_mpi_common
328 use m_data_input
329 use m_data_output
331 use m_helper
334 use m_checker
335 use m_thermochem, only: num_species, species_names
337 use m_chemistry
338
339#ifdef MFC_MPI
340 use mpi
341#endif
342
343 implicit none
344
345 include 'fftw3.f03'
346
348 complex(c_double_complex), allocatable :: data_in(:), data_out(:)
349 complex(c_double_complex), allocatable :: data_cmplx(:,:,:), data_cmplx_y(:,:,:), data_cmplx_z(:,:,:)
350 real(wp), allocatable, dimension(:,:,:) :: en_real
351 real(wp), allocatable, dimension(:) :: en
353 integer :: nx, ny, nz, nxloc, nyloc, nyloc2, nzloc, nf
354 integer :: ierr
356 integer, dimension(3) :: cart3d_coords
357 integer, dimension(2) :: cart2d12_coords, cart2d13_coords
359
360contains
361
362 !> Reads the configuration file post_process.inp, in order to populate parameters in module m_global_parameters.f90 with the
363 !! user provided inputs
364 impure subroutine s_read_input_file
365
366 character(LEN=name_len) :: file_loc
367 logical :: file_check
368 integer :: iostatus
369 character(len=1000) :: line
370
371 namelist /user_inputs/ case_dir, m, n, p, t_step_start, t_step_stop, t_step_save, model_eqns, num_fluids, mpp_lim, &
383
384 file_loc = 'post_process.inp'
385 inquire (file=trim(file_loc), exist=file_check)
386
387 if (file_check) then
388 open (1, file=trim(file_loc), form='formatted', status='old', action='read')
389 read (1, nml=user_inputs, iostat=iostatus)
390
391 if (iostatus /= 0) then
392 backspace(1)
393 read (1, fmt='(A)') line
394 print *, 'Invalid line in namelist: ' // trim(line)
395 call s_mpi_abort('Invalid line in post_process.inp. It is ' // 'likely due to a datatype mismatch. Exiting.')
396 end if
397
398 close (1)
399
400 call s_update_cell_bounds(cells_bounds, m, n, p)
401
402 if (down_sample) then
403 m = int((m + 1)/3) - 1
404 n = int((n + 1)/3) - 1
405 p = int((p + 1)/3) - 1
406 end if
407
408 m_glb = m
409 n_glb = n
410 p_glb = p
411
412 nglobal = int(m_glb + 1, kind=8)*int(n_glb + 1, kind=8)*int(p_glb + 1, kind=8)
413
414 if (cfl_adap_dt .or. cfl_const_dt) cfl_dt = .true.
415
416 if (any((/bc_x%beg, bc_x%end, bc_y%beg, bc_y%end, bc_z%beg, bc_z%end/) == -17) .or. num_bc_patches > 0) then
417 bc_io = .true.
418 end if
419 else
420 call s_mpi_abort('File post_process.inp is missing. Exiting.')
421 end if
422
423 end subroutine s_read_input_file
424
425 !> Checking that the user inputs make sense, i.e. that the individual choices are compatible with the code's options and that
426 !! the combination of these choices results into a valid configuration for the post-process
427 impure subroutine s_check_input_file
428
429 character(LEN=len_trim(case_dir)) :: file_loc
430 logical :: dir_check
431
432 case_dir = adjustl(case_dir)
433
434 file_loc = trim(case_dir) // '/.'
435
436 call my_inquire(file_loc, dir_check)
437
438 if (dir_check .neqv. .true.) then
439 call s_mpi_abort('Unsupported choice for the value of ' // 'case_dir. Exiting.')
440 end if
441
443 call s_check_inputs()
444
445 end subroutine s_check_input_file
446
447 !> Load grid and conservative data for a time step, fill ghost-cell buffers, and convert to primitive variables.
448 impure subroutine s_perform_time_step(t_step)
449
450 integer, intent(inout) :: t_step
451 integer :: eta_hh, eta_mm, eta_ss
452 real(wp) :: eta_sec
453
454 if (proc_rank == 0) then
455 if (cfl_dt) then
456 eta_sec = wall_time_avg*real(n_save - 1 - t_step, wp)
457 eta_hh = int(eta_sec)/3600
458 eta_mm = mod(int(eta_sec), 3600)/60
459 eta_ss = mod(int(eta_sec), 60)
460 print '(" [", I3, "%] Saving ", I8, " of ", I0, " Time Avg = ", ES16.6, " Time/step = ", ES12.6, " ETA (HH:MM:SS) = ", I0, ":", I2.2, ":", I2.2)', &
461 & int(ceiling(100._wp*(real(t_step - n_start)/(n_save)))), t_step, n_save, wall_time_avg, wall_time, eta_hh, &
462 & eta_mm, eta_ss
463 else
464 eta_sec = wall_time_avg*real((t_step_stop - t_step)/t_step_save, wp)
465 eta_hh = int(eta_sec)/3600
466 eta_mm = mod(int(eta_sec), 3600)/60
467 eta_ss = mod(int(eta_sec), 60)
468 print '(" [", I3, "%] Saving ", I8, " of ", I0, " @ t_step = ", I8, " Time Avg = ", ES16.6, " Time/step = ", ES12.6, " ETA (HH:MM:SS) = ", I0, ":", I2.2, ":", I2.2)', &
469 & int(ceiling(100._wp*(real(t_step - t_step_start)/(t_step_stop - t_step_start + 1)))), &
470 & (t_step - t_step_start)/t_step_save + 1, (t_step_stop - t_step_start)/t_step_save + 1, t_step, &
471 & wall_time_avg, wall_time, eta_hh, eta_mm, eta_ss
472 end if
473 end if
474
475 call s_read_data_files(t_step)
476
478
479 if (buff_size > 0) then
482 end if
483
485
486 end subroutine s_perform_time_step
487
488 !> Derive requested flow quantities from primitive variables and write them to the formatted database files.
489 impure subroutine s_save_data(t_step, varname, pres, c, H)
490
491 integer, intent(inout) :: t_step
492 character(LEN=name_len), intent(inout) :: varname
493 real(wp), intent(inout) :: pres, c, h
494
495 real(wp), dimension(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, & & -offset_z%beg:p + offset_z%end) :: liutex_mag
496 real(wp), dimension(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end,-offset_z%beg:p + offset_z%end, & & 3) :: liutex_axis
497 integer :: i, j, k, l, kx, ky, kz, kf, j_glb, k_glb, l_glb
498 character(50) :: filename
499 logical :: file_exists
500 integer :: x_beg, x_end, y_beg, y_end, z_beg, z_end
501
502 if (output_partial_domain) then
504 x_beg = -offset_x%beg + x_output_idx%beg
505 x_end = offset_x%end + x_output_idx%end
506 y_beg = -offset_y%beg + y_output_idx%beg
507 y_end = offset_y%end + y_output_idx%end
508 z_beg = -offset_z%beg + z_output_idx%beg
509 z_end = offset_z%end + z_output_idx%end
510 else
511 x_beg = -offset_x%beg
512 x_end = offset_x%end + m
513 y_beg = -offset_y%beg
514 y_end = offset_y%end + n
515 z_beg = -offset_z%beg
516 z_end = offset_z%end + p
517 end if
518
520
521 if (sim_data .and. proc_rank == 0) then
524 end if
525
526 if (sim_data) then
529 end if
530
532
533 if (omega_wrt(2) .or. omega_wrt(3) .or. qm_wrt .or. liutex_wrt .or. schlieren_wrt) then
535 end if
536
537 if (omega_wrt(1) .or. omega_wrt(3) .or. qm_wrt .or. liutex_wrt .or. (n > 0 .and. schlieren_wrt)) then
539 end if
540
541 if (omega_wrt(1) .or. omega_wrt(2) .or. qm_wrt .or. liutex_wrt .or. (p > 0 .and. schlieren_wrt)) then
543 end if
544
545 if ((model_eqns == 2) .or. (model_eqns == 3) .or. (model_eqns == 4)) then
546 do i = 1, num_fluids
547 if (alpha_rho_wrt(i) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
548 q_sf(:,:,:) = q_cons_vf(i)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
549 if (model_eqns /= 4) then
550 write (varname, '(A,I0)') 'alpha_rho', i
551 else
552 write (varname, '(A,I0)') 'rho', i
553 end if
555
556 varname(:) = ' '
557 end if
558 end do
559 end if
560
561 if ((rho_wrt .or. (model_eqns == 1 .and. (cons_vars_wrt .or. prim_vars_wrt))) .and. (.not. relativity)) then
562 q_sf(:,:,:) = rho_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
563 write (varname, '(A)') 'rho'
565
566 varname(:) = ' '
567 end if
568
569 if (relativity .and. (rho_wrt .or. prim_vars_wrt)) then
570 q_sf(:,:,:) = q_prim_vf(1)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
571 write (varname, '(A)') 'rho'
573
574 varname(:) = ' '
575 end if
576
577 if (relativity .and. (rho_wrt .or. cons_vars_wrt)) then
578 ! For relativistic flow, conservative and primitive densities are different Hard-coded single-component for now
579 q_sf(:,:,:) = q_cons_vf(1)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
580 write (varname, '(A)') 'D'
582
583 varname(:) = ' '
584 end if
585
586 do i = 1, eqn_idx%E - eqn_idx%mom%beg
587 if (mom_wrt(i) .or. cons_vars_wrt) then
588 q_sf(:,:,:) = q_cons_vf(i + eqn_idx%cont%end)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
589 write (varname, '(A,I0)') 'mom', i
591
592 varname(:) = ' '
593 end if
594 end do
595
596 do i = 1, eqn_idx%E - eqn_idx%mom%beg
597 if (vel_wrt(i) .or. prim_vars_wrt) then
598 q_sf(:,:,:) = q_prim_vf(i + eqn_idx%cont%end)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
599 write (varname, '(A,I0)') 'vel', i
601
602 varname(:) = ' '
603 end if
604 end do
605
606 if (chemistry) then
607 do i = 1, num_species
608 if (chem_wrt_y(i) .or. prim_vars_wrt) then
609 q_sf(:,:,:) = q_prim_vf(eqn_idx%species%beg + i - 1)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
610 write (varname, '(A,A)') 'Y_', trim(species_names(i))
612
613 varname(:) = ' '
614 end if
615 end do
616
617 if (chem_wrt_t) then
618 q_sf(:,:,:) = q_t_sf%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
619 write (varname, '(A)') 'T'
621
622 varname(:) = ' '
623 end if
624 end if
625
626 do i = 1, eqn_idx%E - eqn_idx%mom%beg
627 if (flux_wrt(i)) then
629
630 write (varname, '(A,I0)') 'flux', i
632
633 varname(:) = ' '
634 end if
635 end do
636
637 if (e_wrt .or. cons_vars_wrt) then
638 q_sf(:,:,:) = q_cons_vf(eqn_idx%E)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
639 write (varname, '(A)') 'E'
641
642 varname(:) = ' '
643 end if
644
645 if (model_eqns == 3) then
646 do i = 1, num_fluids
647 if (alpha_rho_e_wrt(i) .or. cons_vars_wrt) then
648 q_sf = q_cons_vf(i + eqn_idx%int_en%beg - 1)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
649 write (varname, '(A,I0)') 'alpha_rho_e', i
651
652 varname(:) = ' '
653 end if
654 end do
655 end if
656
657 if (fft_wrt) then
658 do l = 0, p
659 do k = 0, n
660 do j = 0, m
661 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, l), &
662 & 0._wp)
663 end do
664 end do
665 end do
666
667 call s_mpi_fft_fwd()
668
669 en_real = 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
670
671 do l = 0, p
672 do k = 0, n
673 do j = 0, m
674 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg + 1)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, &
675 & l), 0._wp)
676 end do
677 end do
678 end do
679
680 call s_mpi_fft_fwd()
681
682 en_real = en_real + 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
683
684 do l = 0, p
685 do k = 0, n
686 do j = 0, m
687 data_cmplx(j + 1, k + 1, l + 1) = cmplx(q_cons_vf(eqn_idx%mom%beg + 2)%sf(j, k, l)/q_cons_vf(1)%sf(j, k, &
688 & l), 0._wp)
689 end do
690 end do
691 end do
692
693 call s_mpi_fft_fwd()
694
695 en_real = en_real + 0.5_wp*abs(data_cmplx_z)**2._wp/(1._wp*nx*ny*nz)**2._wp
696
697 do kf = 1, nf
698 en(kf) = 0._wp
699 end do
700
701 do l = 1, nz
702 do k = 1, nyloc2
703 do j = 1, nxloc
704 j_glb = j + cart3d_coords(2)*nxloc
705 k_glb = k + cart3d_coords(3)*nyloc2
706 l_glb = l
707
708 if (j_glb >= (m_glb + 1)/2) then
709 kx = (j_glb - 1) - (m_glb + 1)
710 else
711 kx = j_glb - 1
712 end if
713
714 if (k_glb >= (n_glb + 1)/2) then
715 ky = (k_glb - 1) - (n_glb + 1)
716 else
717 ky = k_glb - 1
718 end if
719
720 if (l_glb >= (p_glb + 1)/2) then
721 kz = (l_glb - 1) - (p_glb + 1)
722 else
723 kz = l_glb - 1
724 end if
725
726 kf = nint(sqrt(kx**2._wp + ky**2._wp + kz**2._wp)) + 1
727
728 en(kf) = en(kf) + en_real(j, k, l)
729 end do
730 end do
731 end do
732
733#ifdef MFC_MPI
734 call mpi_allreduce(mpi_in_place, en, nf, mpi_p, mpi_sum, mpi_comm_world, ierr)
735#endif
736
737 if (proc_rank == 0) then
738 call s_create_directory('En_FFT_DATA')
739 write (filename, '(a,i0,a)') 'En_FFT_DATA/En_tot', t_step, '.dat'
740 inquire (file=filename, exist=file_exists)
741 if (file_exists) then
742 call s_delete_file(trim(filename))
743 end if
744 end if
745
746 do kf = 1, nf
747 if (proc_rank == 0) then
748 write (filename, '(a,i0,a)') 'En_FFT_DATA/En_tot', t_step, '.dat'
749 inquire (file=filename, exist=file_exists)
750 if (file_exists) then
751 open (1, file=filename, position='append', status='old')
752 write (1, *) en(kf), t_step
753 close (1)
754 else
755 open (1, file=filename, status='new')
756 write (1, *) en(kf), t_step
757 close (1)
758 end if
759 end if
760 end do
761 end if
762
763 if (mhd .and. prim_vars_wrt) then
764 do i = eqn_idx%B%beg, eqn_idx%B%end
765 q_sf(:,:,:) = q_prim_vf(i)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
766
767 ! 1D: output By, Bz
768 if (n == 0) then
769 if (i == eqn_idx%B%beg) then
770 write (varname, '(A)') 'By'
771 else
772 write (varname, '(A)') 'Bz'
773 end if
774 ! 2D/3D: output Bx, By, Bz
775 else
776 if (i == eqn_idx%B%beg) then
777 write (varname, '(A)') 'Bx'
778 else if (i == eqn_idx%B%beg + 1) then
779 write (varname, '(A)') 'By'
780 else
781 write (varname, '(A)') 'Bz'
782 end if
783 end if
784
786 varname(:) = ' '
787 end do
788 end if
789
790 if (elasticity) then
791 do i = 1, eqn_idx%stress%end - eqn_idx%stress%beg + 1
792 if (prim_vars_wrt) then
793 q_sf(:,:,:) = q_prim_vf(i - 1 + eqn_idx%stress%beg)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
794 write (varname, '(A,I0)') 'tau', i
796 end if
797 varname(:) = ' '
798 end do
799 end if
800
801 if (hyperelasticity) then
802 do i = 1, eqn_idx%xi%end - eqn_idx%xi%beg + 1
803 if (prim_vars_wrt) then
804 q_sf(:,:,:) = q_prim_vf(i - 1 + eqn_idx%xi%beg)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
805 write (varname, '(A,I0)') 'xi', i
807 end if
808 varname(:) = ' '
809 end do
810 end if
811
812 if (cont_damage) then
813 q_sf(:,:,:) = q_cons_vf(eqn_idx%damage)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
814 write (varname, '(A)') 'damage_state'
816
817 varname(:) = ' '
818 end if
819
820 if (hyper_cleaning) then
821 q_sf = q_cons_vf(eqn_idx%psi)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
822 write (varname, '(A)') 'psi'
824
825 varname(:) = ' '
826 end if
827
828 if (pres_wrt .or. prim_vars_wrt) then
829 q_sf(:,:,:) = q_prim_vf(eqn_idx%E)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
830 write (varname, '(A)') 'pres'
832
833 varname(:) = ' '
834 end if
835
836 if (((model_eqns == 2) .and. (bubbles_euler .neqv. .true.)) .or. (model_eqns == 3)) then
837 do i = 1, num_fluids - 1
838 if (alpha_wrt(i) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
839 q_sf(:,:,:) = q_cons_vf(i + eqn_idx%E)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
840 write (varname, '(A,I0)') 'alpha', i
842
843 varname(:) = ' '
844 end if
845 end do
846
847 if (alpha_wrt(num_fluids) .or. (cons_vars_wrt .or. prim_vars_wrt)) then
848 if (igr) then
849 do k = z_beg, z_end
850 do j = y_beg, y_end
851 do i = x_beg, x_end
852 q_sf(i, j, k) = 1._wp
853 do l = 1, num_fluids - 1
854 q_sf(i, j, k) = q_sf(i, j, k) - q_cons_vf(eqn_idx%E + l)%sf(i, j, k)
855 end do
856 end do
857 end do
858 end do
859 else
860 q_sf(:,:,:) = q_cons_vf(eqn_idx%adv%end)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
861 end if
862 write (varname, '(A,I0)') 'alpha', num_fluids
864
865 varname(:) = ' '
866 end if
867 end if
868
869 if (gamma_wrt .or. (model_eqns == 1 .and. (cons_vars_wrt .or. prim_vars_wrt))) then
870 q_sf(:,:,:) = gamma_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
871 write (varname, '(A)') 'gamma'
873
874 varname(:) = ' '
875 end if
876
877 if (heat_ratio_wrt) then
879
880 write (varname, '(A)') 'heat_ratio'
882
883 varname(:) = ' '
884 end if
885
886 if (pi_inf_wrt .or. (model_eqns == 1 .and. (cons_vars_wrt .or. prim_vars_wrt))) then
887 q_sf(:,:,:) = pi_inf_sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
888 write (varname, '(A)') 'pi_inf'
890
891 varname(:) = ' '
892 end if
893
894 if (pres_inf_wrt) then
896
897 write (varname, '(A)') 'pres_inf'
899
900 varname(:) = ' '
901 end if
902
903 if (c_wrt) then
904 do k = -offset_z%beg, p + offset_z%end
905 do j = -offset_y%beg, n + offset_y%end
906 do i = -offset_x%beg, m + offset_x%end
907 do l = 1, eqn_idx%adv%end - eqn_idx%E
908 adv(l) = q_prim_vf(eqn_idx%E + l)%sf(i, j, k)
909 end do
910
911 pres = q_prim_vf(eqn_idx%E)%sf(i, j, k)
912
913 h = ((gamma_sf(i, j, k) + 1._wp)*pres + pi_inf_sf(i, j, k) + qv_sf(i, j, k))/rho_sf(i, j, k)
914
915 call s_compute_speed_of_sound(pres, rho_sf(i, j, k), gamma_sf(i, j, k), pi_inf_sf(i, j, k), h, adv, &
916 & 0._wp, 0._wp, c, qv_sf(i, j, k))
917
918 q_sf(i, j, k) = c
919 end do
920 end do
921 end do
922
923 write (varname, '(A)') 'c'
925
926 varname(:) = ' '
927 end if
928
929 do i = 1, 3
930 if (omega_wrt(i)) then
932
933 write (varname, '(A,I0)') 'omega', i
935
936 varname(:) = ' '
937 end if
938 end do
939
940 if (ib) then
941 q_sf(:,:,:) = real(ib_markers%sf(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, &
942 & -offset_z%beg:p + offset_z%end))
943 varname = 'ib_markers'
945 end if
946
947 if (p > 0 .and. qm_wrt) then
949
950 write (varname, '(A)') 'qm'
952
953 varname(:) = ' '
954 end if
955
956 if (liutex_wrt) then
957 call s_derive_liutex(q_prim_vf, liutex_mag, liutex_axis)
958
959 q_sf = liutex_mag
960
961 write (varname, '(A)') 'liutex_mag'
963
964 varname(:) = ' '
965
966 do i = 1, 3
967 q_sf = liutex_axis(:,:,:,i)
968
969 write (varname, '(A,I0)') 'liutex_axis', i
971
972 varname(:) = ' '
973 end do
974 end if
975
976 if (schlieren_wrt) then
978
979 write (varname, '(A)') 'schlieren'
981
982 varname(:) = ' '
983 end if
984
985 if (cf_wrt) then
986 q_sf(:,:,:) = q_cons_vf(eqn_idx%c)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
987 write (varname, '(A,I0)') 'color_function'
989 varname(:) = ' '
990 end if
991
992 if (bubbles_euler) then
993 do i = eqn_idx%adv%beg, eqn_idx%adv%end
994 q_sf(:,:,:) = q_cons_vf(i)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
995 write (varname, '(A,I0)') 'alpha', i - eqn_idx%E
997 varname(:) = ' '
998 end do
999 end if
1000
1001 if (bubbles_euler) then
1002 ! nR
1003 do i = 1, nb
1004 q_sf(:,:,:) = q_cons_vf(qbmm_idx%rs(i))%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1005 write (varname, '(A,I3.3)') 'nR', i
1007 varname(:) = ' '
1008 end do
1009
1010 ! nRdot
1011 do i = 1, nb
1012 q_sf(:,:,:) = q_cons_vf(qbmm_idx%vs(i))%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1013 write (varname, '(A,I3.3)') 'nV', i
1015 varname(:) = ' '
1016 end do
1017 if ((polytropic .neqv. .true.) .and. (.not. qbmm)) then
1018 ! nP
1019 do i = 1, nb
1020 q_sf(:,:,:) = q_cons_vf(qbmm_idx%ps(i))%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1021 write (varname, '(A,I3.3)') 'nP', i
1023 varname(:) = ' '
1024 end do
1025
1026 ! nM
1027 do i = 1, nb
1028 q_sf(:,:,:) = q_cons_vf(qbmm_idx%ms(i))%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1029 write (varname, '(A,I3.3)') 'nM', i
1031 varname(:) = ' '
1032 end do
1033 end if
1034
1035 ! number density
1036 if (adv_n) then
1037 q_sf(:,:,:) = q_cons_vf(eqn_idx%n)%sf(x_beg:x_end,y_beg:y_end,z_beg:z_end)
1038 write (varname, '(A)') 'n'
1040 varname(:) = ' '
1041 end if
1042 end if
1043
1044 if (bubbles_lagrange) then
1045 ! Void fraction field
1046 q_sf(:,:,:) = 1._wp - q_cons_vf(beta_idx)%sf(-offset_x%beg:m + offset_x%end,-offset_y%beg:n + offset_y%end, &
1047 & -offset_z%beg:p + offset_z%end)
1048 write (varname, '(A)') 'voidFraction'
1050 varname(:) = ' '
1051
1052 if (lag_txt_wrt) call s_write_lag_bubbles_results_to_text(t_step) ! text output
1053 if (lag_db_wrt) call s_write_lag_bubbles_to_formatted_database_file(t_step) ! silo file output
1054 end if
1055
1057
1058 if (sim_data .and. proc_rank == 0) then
1061 end if
1062
1064
1065 end subroutine s_save_data
1066
1067 !> Transpose 3-D complex data from x-pencil to y-pencil layout via MPI_Alltoall.
1068 subroutine s_mpi_transpose_x2y
1069
1070 complex(c_double_complex), allocatable :: sendbuf(:), recvbuf(:)
1071 integer :: dest_rank, src_rank
1072 integer :: i, j, k, l
1073
1074#ifdef MFC_MPI
1075 allocate (sendbuf(nx*nyloc*nzloc))
1076 allocate (recvbuf(nx*nyloc*nzloc))
1077
1078 do dest_rank = 0, num_procs_y - 1
1079 do l = 1, nzloc
1080 do k = 1, nyloc
1081 do j = 1, nxloc
1082 sendbuf(j + (k - 1)*nxloc + (l - 1)*nxloc*nyloc + dest_rank*nxloc*nyloc*nzloc) = data_cmplx(j &
1083 & + dest_rank*nxloc, k, l)
1084 end do
1085 end do
1086 end do
1087 end do
1088
1089 call mpi_alltoall(sendbuf, nxloc*nyloc*nzloc, mpi_c_double_complex, recvbuf, nxloc*nyloc*nzloc, mpi_c_double_complex, &
1091
1092 do src_rank = 0, num_procs_y - 1
1093 do l = 1, nzloc
1094 do k = 1, nyloc
1095 do j = 1, nxloc
1096 data_cmplx_y(j, k + src_rank*nyloc, &
1097 & l) = recvbuf(j + (k - 1)*nxloc + (l - 1)*nxloc*nyloc + src_rank*nxloc*nyloc*nzloc)
1098 end do
1099 end do
1100 end do
1101 end do
1102
1103 deallocate (sendbuf)
1104 deallocate (recvbuf)
1105#endif
1106
1107 end subroutine s_mpi_transpose_x2y
1108
1109 !> Transpose 3-D complex data from y-pencil to z-pencil layout via MPI_Alltoall.
1110 subroutine s_mpi_transpose_y2z
1111
1112 complex(c_double_complex), allocatable :: sendbuf(:), recvbuf(:)
1113 integer :: dest_rank, src_rank
1114 integer :: j, k, l
1115
1116#ifdef MFC_MPI
1117 allocate (sendbuf(ny*nxloc*nzloc))
1118 allocate (recvbuf(ny*nxloc*nzloc))
1119
1120 do dest_rank = 0, num_procs_z - 1
1121 do l = 1, nzloc
1122 do j = 1, nxloc
1123 do k = 1, nyloc2
1124 sendbuf(k + (j - 1)*nyloc2 + (l - 1)*(nyloc2*nxloc) + dest_rank*nyloc2*nxloc*nzloc) = data_cmplx_y(j, &
1125 & k + dest_rank*nyloc2, l)
1126 end do
1127 end do
1128 end do
1129 end do
1130
1131 call mpi_alltoall(sendbuf, nyloc2*nxloc*nzloc, mpi_c_double_complex, recvbuf, nyloc2*nxloc*nzloc, mpi_c_double_complex, &
1133
1134 do src_rank = 0, num_procs_z - 1
1135 do l = 1, nzloc
1136 do j = 1, nxloc
1137 do k = 1, nyloc2
1138 data_cmplx_z(j, k, &
1139 & l + src_rank*nzloc) = recvbuf(k + (j - 1)*nyloc2 + (l - 1)*(nyloc2*nxloc) &
1140 & + src_rank*nyloc2*nxloc*nzloc)
1141 end do
1142 end do
1143 end do
1144 end do
1145
1146 deallocate (sendbuf)
1147 deallocate (recvbuf)
1148#endif
1149
1150 end subroutine s_mpi_transpose_y2z
1151
1152 !> Initialize all post-process sub-modules, set up I/O pointers, and prepare FFTW plans and MPI communicators.
1153 impure subroutine s_initialize_modules
1154
1155 integer :: size_n(1), inembed(1), onembed(1)
1156
1158 if (bubbles_euler .or. bubbles_lagrange) then
1160 end if
1161 if (num_procs > 1) then
1164 end if
1170
1171 if (parallel_io .neqv. .true.) then
1173 else
1175 end if
1176
1177#ifdef MFC_MPI
1178 if (fft_wrt) then
1179 num_procs_x = (m_glb + 1)/(m + 1)
1180 num_procs_y = (n_glb + 1)/(n + 1)
1181 num_procs_z = (p_glb + 1)/(p + 1)
1182
1183 nx = m_glb + 1
1184 ny = n_glb + 1
1185 nz = p_glb + 1
1186
1187 nxloc = (m_glb + 1)/num_procs_y
1188 nyloc = n + 1
1189 nyloc2 = (n_glb + 1)/num_procs_z
1190 nzloc = p + 1
1191
1192 nf = max(nx, ny, nz)
1193
1194#ifdef MFC_DEBUG
1195# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1196 block
1197# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1198 use iso_fortran_env, only: output_unit
1199# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1200
1201# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1202 print *, 'm_start_up.fpp:887: ', '@:ALLOCATE(data_in(Nx*Nyloc*Nzloc))'
1203# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1204
1205# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1206 call flush (output_unit)
1207# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1208 end block
1209# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1210#endif
1211# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1212 allocate (data_in(nx*nyloc*nzloc))
1213# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1214
1215# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1216
1217# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1218#if defined(MFC_OpenACC)
1219# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1220!$acc enter data create(data_in)
1221# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1222#elif defined(MFC_OpenMP)
1223# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1224!$omp target enter data map(always,alloc:data_in)
1225# 887 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1226#endif
1227#ifdef MFC_DEBUG
1228# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1229 block
1230# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1231 use iso_fortran_env, only: output_unit
1232# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1233
1234# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1235 print *, 'm_start_up.fpp:888: ', '@:ALLOCATE(data_out(Nx*Nyloc*Nzloc))'
1236# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1237
1238# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1239 call flush (output_unit)
1240# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1241 end block
1242# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1243#endif
1244# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1245 allocate (data_out(nx*nyloc*nzloc))
1246# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1247
1248# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1249
1250# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1251#if defined(MFC_OpenACC)
1252# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1253!$acc enter data create(data_out)
1254# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1255#elif defined(MFC_OpenMP)
1256# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1257!$omp target enter data map(always,alloc:data_out)
1258# 888 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1259#endif
1260
1261#ifdef MFC_DEBUG
1262# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1263 block
1264# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1265 use iso_fortran_env, only: output_unit
1266# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1267
1268# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1269 print *, 'm_start_up.fpp:890: ', '@:ALLOCATE(data_cmplx(Nx, Nyloc, Nzloc))'
1270# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1271
1272# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1273 call flush (output_unit)
1274# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1275 end block
1276# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1277#endif
1278# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1279 allocate (data_cmplx(nx, nyloc, nzloc))
1280# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1281
1282# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1283
1284# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1285#if defined(MFC_OpenACC)
1286# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1287!$acc enter data create(data_cmplx)
1288# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1289#elif defined(MFC_OpenMP)
1290# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1291!$omp target enter data map(always,alloc:data_cmplx)
1292# 890 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1293#endif
1294#ifdef MFC_DEBUG
1295# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1296 block
1297# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1298 use iso_fortran_env, only: output_unit
1299# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1300
1301# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1302 print *, 'm_start_up.fpp:891: ', '@:ALLOCATE(data_cmplx_y(Nxloc, Ny, Nzloc))'
1303# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1304
1305# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1306 call flush (output_unit)
1307# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1308 end block
1309# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1310#endif
1311# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1312 allocate (data_cmplx_y(nxloc, ny, nzloc))
1313# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1314
1315# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1316
1317# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1318#if defined(MFC_OpenACC)
1319# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1320!$acc enter data create(data_cmplx_y)
1321# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1322#elif defined(MFC_OpenMP)
1323# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1324!$omp target enter data map(always,alloc:data_cmplx_y)
1325# 891 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1326#endif
1327#ifdef MFC_DEBUG
1328# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1329 block
1330# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1331 use iso_fortran_env, only: output_unit
1332# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1333
1334# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1335 print *, 'm_start_up.fpp:892: ', '@:ALLOCATE(data_cmplx_z(Nxloc, Nyloc2, Nz))'
1336# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1337
1338# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1339 call flush (output_unit)
1340# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1341 end block
1342# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1343#endif
1344# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1345 allocate (data_cmplx_z(nxloc, nyloc2, nz))
1346# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1347
1348# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1349
1350# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1351#if defined(MFC_OpenACC)
1352# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1353!$acc enter data create(data_cmplx_z)
1354# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1355#elif defined(MFC_OpenMP)
1356# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1357!$omp target enter data map(always,alloc:data_cmplx_z)
1358# 892 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1359#endif
1360
1361#ifdef MFC_DEBUG
1362# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1363 block
1364# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1365 use iso_fortran_env, only: output_unit
1366# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1367
1368# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1369 print *, 'm_start_up.fpp:894: ', '@:ALLOCATE(En_real(Nxloc, Nyloc2, Nz))'
1370# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1371
1372# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1373 call flush (output_unit)
1374# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1375 end block
1376# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1377#endif
1378# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1379 allocate (en_real(nxloc, nyloc2, nz))
1380# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1381
1382# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1383
1384# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1385#if defined(MFC_OpenACC)
1386# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1387!$acc enter data create(En_real)
1388# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1389#elif defined(MFC_OpenMP)
1390# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1391!$omp target enter data map(always,alloc:En_real)
1392# 894 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1393#endif
1394#ifdef MFC_DEBUG
1395# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1396 block
1397# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1398 use iso_fortran_env, only: output_unit
1399# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1400
1401# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1402 print *, 'm_start_up.fpp:895: ', '@:ALLOCATE(En(Nf))'
1403# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1404
1405# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1406 call flush (output_unit)
1407# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1408 end block
1409# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1410#endif
1411# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1412 allocate (en(nf))
1413# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1414
1415# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1416
1417# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1418#if defined(MFC_OpenACC)
1419# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1420!$acc enter data create(En)
1421# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1422#elif defined(MFC_OpenMP)
1423# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1424!$omp target enter data map(always,alloc:En)
1425# 895 "/home/runner/work/MFC/MFC/src/post_process/m_start_up.fpp"
1426#endif
1427
1428 size_n(1) = nx
1429 inembed(1) = nx
1430 onembed(1) = nx
1431
1432 fwd_plan_x = fftw_plan_many_dft(1, size_n, nyloc*nzloc, data_in, inembed, 1, nx, data_out, onembed, 1, nx, &
1433 & fftw_forward, fftw_measure)
1434
1435 size_n(1) = ny
1436 inembed(1) = ny
1437 onembed(1) = ny
1438
1439 fwd_plan_y = fftw_plan_many_dft(1, size_n, nxloc*nzloc, data_out, inembed, 1, ny, data_in, onembed, 1, ny, &
1440 & fftw_forward, fftw_measure)
1441
1442 size_n(1) = nz
1443 inembed(1) = nz
1444 onembed(1) = nz
1445
1446 fwd_plan_z = fftw_plan_many_dft(1, size_n, nxloc*nyloc2, data_in, inembed, 1, nz, data_out, onembed, 1, nz, &
1447 & fftw_forward, fftw_measure)
1448
1449 call mpi_cart_create(mpi_comm_world, 3, (/num_procs_x, num_procs_y, num_procs_z/), (/.true., .true., .true./), &
1450 & .false., mpi_comm_cart, ierr)
1451 call mpi_cart_coords(mpi_comm_cart, proc_rank, 3, cart3d_coords, ierr)
1452
1453 call mpi_cart_sub(mpi_comm_cart, (/.true., .true., .false./), mpi_comm_cart12, ierr)
1454 call mpi_comm_rank(mpi_comm_cart12, proc_rank12, ierr)
1455 call mpi_cart_coords(mpi_comm_cart12, proc_rank12, 2, cart2d12_coords, ierr)
1456
1457 call mpi_cart_sub(mpi_comm_cart, (/.true., .false., .true./), mpi_comm_cart13, ierr)
1458 call mpi_comm_rank(mpi_comm_cart13, proc_rank13, ierr)
1459 call mpi_cart_coords(mpi_comm_cart13, proc_rank13, 2, cart2d13_coords, ierr)
1460 end if
1461#endif
1462
1463 end subroutine s_initialize_modules
1464
1465 !> Perform a distributed forward 3-D FFT using pencil decomposition with FFTW and MPI transposes.
1466 subroutine s_mpi_fft_fwd
1467
1468 integer :: j, k, l
1469
1470#ifdef MFC_MPI
1471 do l = 1, nzloc
1472 do k = 1, nyloc
1473 do j = 1, nx
1474 data_in(j + (k - 1)*nx + (l - 1)*nx*nyloc) = data_cmplx(j, k, l)
1475 end do
1476 end do
1477 end do
1478
1479 call fftw_execute_dft(fwd_plan_x, data_in, data_out)
1480
1481 do l = 1, nzloc
1482 do k = 1, nyloc
1483 do j = 1, nx
1484 data_cmplx(j, k, l) = data_out(j + (k - 1)*nx + (l - 1)*nx*nyloc)
1485 end do
1486 end do
1487 end do
1488
1489 call s_mpi_transpose_x2y !!Change Pencil from data_cmplx to data_cmpx_y
1490
1491 do l = 1, nzloc
1492 do k = 1, nxloc
1493 do j = 1, ny
1494 data_out(j + (k - 1)*ny + (l - 1)*ny*nxloc) = data_cmplx_y(k, j, l)
1495 end do
1496 end do
1497 end do
1498
1499 call fftw_execute_dft(fwd_plan_y, data_out, data_in)
1500
1501 do l = 1, nzloc
1502 do k = 1, nxloc
1503 do j = 1, ny
1504 data_cmplx_y(k, j, l) = data_in(j + (k - 1)*ny + (l - 1)*ny*nxloc)
1505 end do
1506 end do
1507 end do
1508
1509 call s_mpi_transpose_y2z !!Change Pencil from data_cmplx_y to data_cmpx_z
1510
1511 do l = 1, nyloc2
1512 do k = 1, nxloc
1513 do j = 1, nz
1514 data_in(j + (k - 1)*nz + (l - 1)*nz*nxloc) = data_cmplx_z(k, l, j)
1515 end do
1516 end do
1517 end do
1518
1519 call fftw_execute_dft(fwd_plan_z, data_in, data_out)
1520
1521 do l = 1, nyloc2
1522 do k = 1, nxloc
1523 do j = 1, nz
1524 data_cmplx_z(k, l, j) = data_out(j + (k - 1)*nz + (l - 1)*nz*nxloc)
1525 end do
1526 end do
1527 end do
1528#endif
1529
1530 end subroutine s_mpi_fft_fwd
1531
1532 !> Set up the MPI environment, read and broadcast user inputs, and decompose the computational domain.
1533 impure subroutine s_initialize_mpi_domain
1534
1535 num_dims = 1 + min(1, n) + min(1, p)
1536
1537 call s_mpi_initialize()
1538
1539 if (proc_rank == 0) then
1540 call s_assign_default_values_to_user_inputs()
1541 call s_read_input_file()
1542 call s_check_input_file()
1543
1544 print '(" Post-processing a ", I0, "x", I0, "x", I0, " case on ", I0, " rank(s)")', m, n, p, num_procs
1545 end if
1546
1547 call s_mpi_bcast_user_inputs()
1548 call s_initialize_parallel_io()
1549 call s_mpi_decompose_computational_domain()
1550 call s_check_inputs_fft()
1551
1552 end subroutine s_initialize_mpi_domain
1553
1554 !> Destroy FFTW plans, free MPI communicators, and finalize all post-process sub-modules.
1555 impure subroutine s_finalize_modules
1556
1557 s_read_data_files => null()
1558
1559 if (fft_wrt) then
1560 if (c_associated(fwd_plan_x)) call fftw_destroy_plan(fwd_plan_x)
1561 if (c_associated(fwd_plan_y)) call fftw_destroy_plan(fwd_plan_y)
1562 if (c_associated(fwd_plan_z)) call fftw_destroy_plan(fwd_plan_z)
1563 if (allocated(data_in)) deallocate (data_in)
1564 if (allocated(data_out)) deallocate (data_out)
1565 if (allocated(data_cmplx)) deallocate (data_cmplx)
1566 if (allocated(data_cmplx_y)) deallocate (data_cmplx_y)
1567 if (allocated(data_cmplx_z)) deallocate (data_cmplx_z)
1568 if (allocated(en_real)) deallocate (en_real)
1569 if (allocated(en)) deallocate (en)
1570 call fftw_cleanup()
1571 end if
1572
1573#ifdef MFC_MPI
1574 if (fft_wrt) then
1575 if (mpi_comm_cart12 /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart12, ierr)
1576 if (mpi_comm_cart13 /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart13, ierr)
1577 if (mpi_comm_cart /= mpi_comm_null) call mpi_comm_free(mpi_comm_cart, ierr)
1578 end if
1579#endif
1580
1581 call s_finalize_data_output_module()
1582 call s_finalize_derived_variables_module()
1583 call s_finalize_data_input_module()
1584 call s_finalize_variables_conversion_module()
1585 if (num_procs > 1) then
1586 call s_finalize_mpi_proxy_module()
1587 call s_finalize_mpi_common_module()
1588 end if
1589 call s_finalize_global_parameters_module()
1590
1591 call s_mpi_finalize()
1592
1593 end subroutine s_finalize_modules
1594
1595end module m_start_up
1596
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Noncharacteristic and processor boundary condition application for ghost cells and buffer regions.
impure subroutine, public s_initialize_boundary_common_module()
Allocate and set up boundary condition buffer arrays for all coordinate directions.
subroutine, public s_populate_grid_variables_buffers
Populate the buffers of the grid variables, which are constituted of the cell-boundary locations and ...
impure subroutine, public s_populate_variables_buffers(bc_type, q_prim_vf, pb_in, mv_in, q_t_sf)
Populate the buffers of the primitive variables based on the selected boundary conditions.
Shared input validation checks for grid dimensions and AMD GPU compiler limits.
impure subroutine, public s_check_inputs_common
Checks compatibility of parameters in the input file. Used by all three stages.
Validates post-process input parameters and output format consistency.
impure subroutine, public s_check_inputs
Checks compatibility of parameters in the input file. Used by the post_process stage.
Multi-species chemistry interface for thermodynamic properties, reaction rates, and transport coeffic...
subroutine s_compute_q_t_sf(q_t_sf, q_cons_vf, bounds)
Initialize the temperature field from conservative variables by inverting the energy equation.
Platform-specific file and directory operations: create, delete, inquire, getcwd, and basename.
impure subroutine s_delete_file(filepath)
Delete a file at the given path using a platform-specific system command.
impure subroutine my_inquire(fileloc, dircheck)
Inquires on the existence of a directory.
impure subroutine s_create_directory(dir_name)
Create a directory and all its parents if it does not exist.
Reads raw simulation grid and conservative-variable data for a given time-step and fills buffer regio...
impure subroutine, public s_read_parallel_data_files(t_step)
Parallel-read the raw data files present in the corresponding time-step directory and to populate the...
type(scalar_field), public q_t_sf
Temperature field.
type(scalar_field), dimension(:), allocatable, public q_cons_vf
Conservative variables.
impure subroutine, public s_initialize_data_input_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
type(scalar_field), dimension(:), allocatable, public q_prim_vf
Primitive variables.
impure subroutine, public s_read_serial_data_files(t_step)
Read the raw data files present in the corresponding time-step directory and to populate the associat...
procedure(s_read_abstract_data_files), pointer, public s_read_data_files
type(integer_field), dimension(:,:), allocatable, public bc_type
Boundary condition identifiers.
type(integer_field), public ib_markers
Writes post-processed grid and flow-variable data to Silo-HDF5 or binary database files.
impure subroutine, public s_write_grid_to_formatted_database_file(t_step)
Write the computational grid (cell-boundary coordinates) to the formatted database slave and master f...
impure subroutine, public s_write_variable_to_formatted_database_file(varname, t_step)
Write a single flow variable field to the formatted database slave and master files for a given time ...
impure subroutine, public s_open_energy_data_file()
Open the energy data file for appending volume-integrated energy budget quantities.
impure subroutine, public s_open_intf_data_file()
Open the interface data file for appending extracted interface coordinates.
impure subroutine, public s_write_energy_data_file(q_prim_vf, q_cons_vf)
Compute volume-integrated kinetic, potential, and internal energies and write the energy budget to th...
impure subroutine, public s_write_lag_bubbles_to_formatted_database_file(t_step)
Read Lagrangian bubble restart data and write bubble positions and scalar fields to the Silo database...
impure subroutine, public s_write_intf_data_file(q_prim_vf)
Extract the volume-fraction interface contour from primitive fields and write the coordinates to the ...
impure subroutine, public s_initialize_data_output_module()
Allocate storage arrays, configure output directories, and count flow variables for formatted databas...
real(wp), dimension(:,:,:), allocatable, public q_sf
impure subroutine, public s_close_energy_data_file()
Close the energy data file.
impure subroutine, public s_close_formatted_database_file()
Close the formatted database slave file and, for the root process, the master file.
impure subroutine, public s_open_formatted_database_file(t_step)
Open (or create) the Silo-HDF5 or Binary formatted database slave and master files for a given time s...
impure subroutine, public s_close_intf_data_file()
Close the interface data file.
impure subroutine, public s_write_lag_bubbles_results_to_text(t_step)
Write the post-processed results in the folder 'lag_bubbles_data'.
impure subroutine, public s_define_output_region
Compute the cell-index bounds for the user-specified partial output domain in each coordinate directi...
impure subroutine, public s_write_ib_bodies_to_formatted_database_file(t_step)
Read IB state and write a Silo point mesh with per-body scalar fields.
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Computes derived flow quantities (sound speed, vorticity, Schlieren, etc.) from conservative and prim...
impure subroutine, public s_derive_liutex(q_prim_vf, liutex_mag, liutex_axis)
Compute the Liutex vector and its magnitude based on Xu et al. (2019).
subroutine, public s_derive_specific_heat_ratio(q_sf)
Derive the specific heat ratio from the specific heat ratio function gamma_sf. The latter is stored i...
subroutine, public s_derive_liquid_stiffness(q_sf)
Compute the liquid stiffness from the specific heat ratio function gamma_sf and the liquid stiffness ...
real(wp), dimension(:,:), allocatable, public fd_coeff_z
real(wp), dimension(:,:), allocatable, public fd_coeff_x
impure subroutine, public s_initialize_derived_variables_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
real(wp), dimension(:,:), allocatable, public fd_coeff_y
subroutine, public s_derive_vorticity_component(i, q_prim_vf, q_sf)
Compute the specified component of the vorticity from the primitive variables. From those inputs,...
impure subroutine, public s_derive_numerical_schlieren_function(q_cons_vf, q_sf)
Compute the values of the numerical Schlieren function, which are subsequently stored in the derived ...
subroutine, public s_derive_flux_limiter(i, q_prim_vf, q_sf)
Derive the flux limiter at cell boundary i+1/2. This is an approximation because the velocity used to...
subroutine, public s_derive_qm(q_prim_vf, q_sf)
Compute the Q_M criterion from the primitive variables. The Q_M function, which are subsequently stor...
Finite difference operators for computing divergence of velocity fields.
subroutine s_compute_finite_difference_coefficients(q, s_cc, fd_coeff_s, local_buff_size, fd_number_in, fd_order_in, offset_s)
Compute the centered finite-difference coefficients for first-order spatial derivatives in the s-coor...
Global parameters for the post-process: domain geometry, equation of state, and output database setti...
logical cont_damage
Continuum damage modeling.
logical hypoelasticity
Turn hypoelasticity on.
integer thermal
1 = adiabatic, 2 = isotherm, 3 = transfer
integer avg_state
Average state evaluation method.
integer recon_type
Which type of reconstruction to use.
logical, parameter chemistry
Chemistry modeling.
integer beta_idx
Index of lagrange bubbles beta.
type(int_bounds_info) offset_y
real(wp), dimension(num_fluids_max) schlieren_alpha
Per-fluid Schlieren intensity amplitude coefficients.
integer num_fluids
Number of different fluids present in the flow.
type(qbmm_idx_info) qbmm_idx
QBMM moment index mappings.
logical, dimension(3) flux_wrt
real(wp), dimension(:), allocatable y_cc
integer proc_rank
Rank of the local processor.
logical mixture_err
Mixture error limiter.
logical output_partial_domain
Specify portion of domain to output for post-processing.
real(wp), dimension(:), allocatable adv
Advection variables.
type(int_bounds_info) z_output_idx
Indices of domain to output for post-processing.
integer muscl_order
Order of accuracy for the MUSCL reconstruction.
logical alt_soundspeed
Alternate sound speed.
integer relax_model
Phase change relaxation model.
logical, dimension(3) mom_wrt
integer fd_number
Finite-difference half-stencil size: MAX(1, fd_order/2).
logical, dimension(num_fluids_max) alpha_wrt
logical, dimension(num_fluids_max) alpha_rho_wrt
logical, dimension(num_fluids_max) alpha_rho_e_wrt
type(int_bounds_info), dimension(1:3) idwbuff
integer model_eqns
Multicomponent flow model.
integer buff_size
Number of ghost cells for boundary condition storage.
integer precision
Floating point precision of the database file(s).
logical hyperelasticity
Turn hyperelasticity on.
type(physical_parameters), dimension(num_fluids_max) fluid_pp
Stiffened gas EOS parameters and Reynolds numbers per fluid.
type(bounds_info) z_output
Portion of domain to output for post-processing.
type(int_bounds_info) x_output_idx
impure subroutine s_initialize_global_parameters_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
real(wp), dimension(:), allocatable x_cc
integer fd_order
Finite-difference order for vorticity and Schlieren derivatives.
integer t_step_save
Interval between consecutive time-step directory.
type(int_bounds_info) offset_x
logical hyper_cleaning
Hyperbolic cleaning for MHD.
real(wp), dimension(:), allocatable z_cc
real(wp) bx0
Constant magnetic field in the x-direction (1D).
logical, dimension(3) omega_wrt
integer num_procs
Number of processors.
character(len=path_len) case_dir
Case folder location.
type(int_bounds_info) y_output_idx
integer weno_order
Order of accuracy for the WENO reconstruction.
type(int_bounds_info) offset_z
logical mhd
Magnetohydrodynamics.
logical parallel_io
Format of the data files.
type(cell_num_bounds) cells_bounds
logical down_sample
down sampling of the database file(s)
logical file_per_process
output format
integer t_step_start
First time-step directory.
real(wp) wall_time_avg
Wall time measurements.
logical elasticity
elasticity modeling, true for hyper or hypo
logical mpp_lim
Maximum volume fraction limiter.
integer igr_order
IGR reconstruction order.
logical, dimension(3) vel_wrt
type(subgrid_bubble_physical_parameters) bub_pp
logical, dimension(1:num_species) chem_wrt_y
logical relativity
Relativity for RMHD.
type(eqn_idx_info) eqn_idx
All conserved-variable equation index ranges and scalars.
integer num_ibs
Number of immersed boundaries.
integer(kind=8) nglobal
Total number of cells in global domain.
integer t_step_stop
Last time-step directory.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
impure subroutine, public s_initialize_bubbles_model()
Initialize bubble model arrays for Euler or Lagrangian bubbles with polytropic or non-polytropic gas.
MPI communication layer: domain decomposition, halo exchange, reductions, and parallel I/O setup.
impure subroutine s_mpi_abort(prnt, code)
The subroutine terminates the MPI execution environment.
impure subroutine s_initialize_mpi_common_module
Initialize the module.
MPI gather and scatter operations for distributing post-process grid and flow-variable data.
impure subroutine s_initialize_mpi_proxy_module
Computation of parameters, allocation procedures, and/or any other tasks needed to properly setup the...
Reads and validates user inputs, allocates variables, and configures MPI decomposition and I/O for po...
impure subroutine s_save_data(t_step, varname, pres, c, h)
Derive requested flow quantities from primitive variables and write them to the formatted database fi...
impure subroutine s_check_input_file
Checking that the user inputs make sense, i.e. that the individual choices are compatible with the co...
real(wp), dimension(:), allocatable en
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx_y
subroutine s_mpi_fft_fwd
Perform a distributed forward 3-D FFT using pencil decomposition with FFTW and MPI transposes.
type(c_ptr) fwd_plan_y
integer mpi_comm_cart13
integer num_procs_x
impure subroutine s_initialize_mpi_domain
Set up the MPI environment, read and broadcast user inputs, and decompose the computational domain.
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx_z
impure subroutine s_read_input_file
Reads the configuration file post_process.inp, in order to populate parameters in module m_global_par...
complex(c_double_complex), dimension(:), allocatable data_out
integer, dimension(2) cart2d13_coords
type(c_ptr) fwd_plan_z
integer num_procs_z
real(wp), dimension(:,:,:), allocatable en_real
complex(c_double_complex), dimension(:), allocatable data_in
integer, dimension(3) cart3d_coords
impure subroutine s_perform_time_step(t_step)
Load grid and conservative data for a time step, fill ghost-cell buffers, and convert to primitive va...
integer num_procs_y
integer mpi_comm_cart
complex(c_double_complex), dimension(:,:,:), allocatable data_cmplx
integer proc_rank12
subroutine s_mpi_transpose_x2y
Transpose 3-D complex data from x-pencil to y-pencil layout via MPI_Alltoall.
impure subroutine s_finalize_modules
Destroy FFTW plans, free MPI communicators, and finalize all post-process sub-modules.
subroutine s_mpi_transpose_y2z
Transpose 3-D complex data from y-pencil to z-pencil layout via MPI_Alltoall.
impure subroutine s_initialize_modules
Initialize all post-process sub-modules, set up I/O pointers, and prepare FFTW plans and MPI communic...
integer mpi_comm_cart12
type(c_ptr) fwd_plan_x
integer proc_rank13
integer, dimension(2) cart2d12_coords
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
subroutine s_compute_speed_of_sound(pres, rho, gamma, pi_inf, h, adv, vel_sum, c_c, c, qv)
Compute the speed of sound from thermodynamic state variables, supporting multiple equation-of-state ...
subroutine, public s_convert_conservative_to_primitive_variables(qk_cons_vf, q_t_sf, qk_prim_vf, ibounds)
Convert conserved variables (rho*alpha, rho*u, E, alpha) to primitives (rho, u, p,...
impure subroutine, public s_initialize_variables_conversion_module
Initialize the variables conversion module.
real(wp), dimension(:,:,:), allocatable, public qv_sf
Scalar liquid energy reference function.
real(wp), dimension(:,:,:), allocatable, public pi_inf_sf
Scalar liquid stiffness function.
real(wp), dimension(:,:,:), allocatable, public gamma_sf
Scalar sp. heat ratio function.
real(wp), dimension(:,:,:), allocatable, public rho_sf
Scalar density function.