MFC
Exascale flow solver
Loading...
Searching...
No Matches
m_muscl.fpp.f90
Go to the documentation of this file.
1# 1 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
2!>
3!! @file
4!! @brief Contains module m_muscl
5
6# 1 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 1
7# 1 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 1
8# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
9# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
10# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
11# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
12# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
13# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
14
15# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
16# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
17# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
18
19# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
20# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
21# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
22
23# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
24
25# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
26
27# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
28
29# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
30
31# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
32
33# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
34
35# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
36
37# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
38! New line at end of file is required for FYPP
39# 2 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
40# 1 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 1
41# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
42# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
43# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
44# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
45# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
46# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
47
48# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
49# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
50# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
51
52# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
53# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
54# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
55
56# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
57
58# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
59
60# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
61
62# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
63
64# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
65
66# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
67
68# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
69
70# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
71! New line at end of file is required for FYPP
72# 2 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp" 2
73
74# 4 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
75# 5 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
76# 6 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
77# 7 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
78# 8 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
79
80# 20 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
81
82# 43 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
83
84# 48 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
85
86# 53 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
87
88# 58 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
89
90# 63 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
91
92# 68 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
93
94# 81 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
95
96# 86 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
97
98# 91 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
99
100# 96 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
101
102# 101 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
103
104# 106 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
105
106# 111 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
107
108# 116 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
109
110# 121 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
111
112# 126 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
113
114# 156 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
115
116# 197 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
117
118# 211 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
119
120# 236 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
121
122# 247 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
123
124# 249 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
125# 260 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
126
127# 310 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
128
129# 320 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
130
131# 330 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
132
133# 339 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
134
135# 356 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
136
137# 366 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
138
139# 373 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
140
141# 379 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
142
143# 385 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
144
145# 391 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
146
147# 397 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
148
149# 403 "/home/runner/work/MFC/MFC/src/common/include/omp_macros.fpp"
150! New line at end of file is required for FYPP
151# 3 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
152# 1 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 1
153# 1 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp" 1
154# 2 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
155# 3 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
156# 4 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
157# 5 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
158# 6 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
159
160# 8 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
161# 9 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
162# 10 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
163
164# 15 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
165# 16 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
166# 17 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
167
168# 24 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
169
170# 53 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
171
172# 65 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
173
174# 75 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
175
176# 105 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
177
178# 117 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
179
180# 127 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
181
182# 174 "/home/runner/work/MFC/MFC/src/common/include/shared_parallel_macros.fpp"
183! New line at end of file is required for FYPP
184# 2 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp" 2
185
186# 7 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
187
188# 17 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
189
190# 22 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
191
192# 27 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
193
194# 32 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
195
196# 37 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
197
198# 42 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
199
200# 47 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
201
202# 52 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
203
204# 57 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
205
206# 62 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
207
208# 73 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
209
210# 78 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
211
212# 83 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
213
214# 88 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
215
216# 103 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
217
218# 131 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
219
220# 160 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
221
222# 175 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
223
224# 193 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
225
226# 215 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
227
228# 244 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
229
230# 259 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
231
232# 269 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
233
234# 278 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
235
236# 294 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
237
238# 304 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
239
240# 311 "/home/runner/work/MFC/MFC/src/common/include/acc_macros.fpp"
241! New line at end of file is required for FYPP
242# 4 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp" 2
243
244! GPU parallel region (scalar reductions, maxval/minval)
245# 23 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
246
247! GPU parallel loop over threads (most common GPU macro)
248# 43 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
249
250! Required closing for GPU_PARALLEL_LOOP
251# 55 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
252
253! Mark routine for device compilation
254# 112 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
255
256! Declare device-resident data
257# 130 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
258
259! Inner loop within a GPU parallel region
260# 145 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
261
262! Scoped GPU data region
263# 164 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
264
265! Host code with device pointers (for MPI with GPU buffers)
266# 193 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
267
268! Allocate device memory (unscoped)
269# 207 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
270
271! Free device memory
272# 219 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
273
274! Atomic operation on device
275# 231 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
276
277! End atomic capture block
278# 242 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
279
280! Copy data between host and device
281# 254 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
282
283! Synchronization barrier
284# 266 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
285
286! Import GPU library module (openacc or omp_lib)
287# 275 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
288
289! Emit code only for AMD compiler
290# 282 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
291
292! Emit code for non-Cray compilers
293# 289 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
294
295! Emit code only for Cray compiler
296# 296 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
297
298! Emit code for non-NVIDIA compilers
299# 303 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
300
301# 305 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
302# 306 "/home/runner/work/MFC/MFC/src/common/include/parallel_macros.fpp"
303! New line at end of file is required for FYPP
304# 2 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp" 2
305
306# 14 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
307
308! Caution: This macro requires the use of a binding script to set CUDA_VISIBLE_DEVICES, such that we have one GPU device per MPI
309! rank. That's because for both cudaMemAdvise (preferred location) and cudaMemPrefetchAsync we use location = device_id = 0. For an
310! example see misc/nvidia_uvm/bind.sh.
311# 52 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
312
313! Allocate and create GPU device memory
314# 72 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
315
316! Free GPU device memory and deallocate
317# 80 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
318
319! Cray-specific GPU pointer setup for vector fields
320# 104 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
321
322! Cray-specific GPU pointer setup for scalar fields
323# 120 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
324
325! Cray-specific GPU pointer setup for acoustic source spatials
326# 145 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
327
328# 151 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
329
330# 158 "/home/runner/work/MFC/MFC/src/common/include/macros.fpp"
331! New line at end of file is required for FYPP
332# 6 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp" 2
333
334!> @brief MUSCL reconstruction with interface sharpening for contact-preserving advection
336
342#ifdef MFC_OpenACC
343 use openacc
344#endif
345
346 use m_mpi_proxy
347 use m_helper
348 use m_thinc
349 use m_nvtx
350
352
353 integer :: v_size
354
355# 27 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
356#if defined(MFC_OpenACC)
357# 27 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
358!$acc declare create(v_size)
359# 27 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
360#elif defined(MFC_OpenMP)
361# 27 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
362!$omp declare target (v_size)
363# 27 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
364#endif
365
367
368# 30 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
369#if defined(MFC_OpenACC)
370# 30 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
371!$acc declare create(is1_muscl, is2_muscl, is3_muscl)
372# 30 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
373#elif defined(MFC_OpenMP)
374# 30 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
375!$omp declare target (is1_muscl, is2_muscl, is3_muscl)
376# 30 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
377#endif
378
379 !> @name The cell-average variables that will be MUSCL-reconstructed, unpacked into an array for performance
380 !> @{
381 real(wp), allocatable, dimension(:,:,:,:) :: v_rs_ws_muscl
382 !> @}
383
384# 36 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
385#if defined(MFC_OpenACC)
386# 36 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
387!$acc declare create(v_rs_ws_muscl)
388# 36 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
389#elif defined(MFC_OpenMP)
390# 36 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
391!$omp declare target (v_rs_ws_muscl)
392# 36 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
393#endif
394
395contains
396
397 !> Allocate and initialize MUSCL reconstruction working arrays
399
400 ! Initializing in x-direction
401 is1_muscl%beg = -buff_size; is1_muscl%end = m - is1_muscl%beg
402 if (n == 0) then
403 is2_muscl%beg = 0
404 else
405 is2_muscl%beg = -buff_size
406 end if
407
408 is2_muscl%end = n - is2_muscl%beg
409
410 if (p == 0) then
411 is3_muscl%beg = 0
412 else
413 is3_muscl%beg = -buff_size
414 end if
415
416 is3_muscl%end = p - is3_muscl%beg
417
418#ifdef MFC_DEBUG
419# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
420 block
421# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
422 use iso_fortran_env, only: output_unit
423# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
424
425# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
426 print *, 'm_muscl.fpp:61: ', '@:ALLOCATE(v_rs_ws_muscl(is1_muscl%beg:is1_muscl%end, is2_muscl%beg:is2_muscl%end, is3_muscl%beg:is3_muscl%end, 1:sys_size))'
427# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
428
429# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
430 call flush (output_unit)
431# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
432 end block
433# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
434#endif
435# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
436 allocate (v_rs_ws_muscl(is1_muscl%beg:is1_muscl%end, is2_muscl%beg:is2_muscl%end, is3_muscl%beg:is3_muscl%end, 1:sys_size))
437# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
438
439# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
440
441# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
442#if defined(MFC_OpenACC)
443# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
444!$acc enter data create(v_rs_ws_muscl)
445# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
446#elif defined(MFC_OpenMP)
447# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
448!$omp target enter data map(always,alloc:v_rs_ws_muscl)
449# 61 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
450#endif
451
452 if (n == 0) return
453
454 ! initializing in y-direction
455 is2_muscl%beg = -buff_size; is2_muscl%end = n - is2_muscl%beg
456 is1_muscl%beg = -buff_size; is1_muscl%end = m - is1_muscl%beg
457
458 if (p == 0) then
459 is3_muscl%beg = 0
460 else
461 is3_muscl%beg = -buff_size
462 end if
463
464 is3_muscl%end = p - is3_muscl%beg
465
466 if (p == 0) return
467
468 ! initializing in z-direction
469 is2_muscl%beg = -buff_size; is2_muscl%end = n - is2_muscl%beg
470 is1_muscl%beg = -buff_size; is1_muscl%end = m - is1_muscl%beg
471 is3_muscl%beg = -buff_size; is3_muscl%end = p - is3_muscl%beg
472
473 end subroutine s_initialize_muscl_module
474
475 !> Perform MUSCL reconstruction of left and right cell-boundary values from cell-averaged variables
476 subroutine s_muscl(v_vf, vL_rs_vf_x, vR_rs_vf_x, muscl_dir, is1_muscl_d, is2_muscl_d, is3_muscl_d)
477
478 type(scalar_field), dimension(1:), intent(in) :: v_vf
479 real(wp), dimension(idwbuff(1)%beg:,idwbuff(2)%beg:,idwbuff(3)%beg:,1:), intent(inout) :: vl_rs_vf_x, vr_rs_vf_x
480 integer, intent(in) :: muscl_dir
481 type(int_bounds_info), intent(in) :: is1_muscl_d, is2_muscl_d, is3_muscl_d
482 integer :: j, k, l, i
483 real(wp) :: slopel, sloper, slope
484
485 is1_muscl = is1_muscl_d
486 is2_muscl = is2_muscl_d
487 is3_muscl = is3_muscl_d
488
489
490# 100 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
491#if defined(MFC_OpenACC)
492# 100 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
493!$acc update device(is1_muscl, is2_muscl, is3_muscl)
494# 100 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
495#elif defined(MFC_OpenMP)
496# 100 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
497!$omp target update to(is1_muscl, is2_muscl, is3_muscl)
498# 100 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
499#endif
500
501 if (muscl_order == muscl_order_first_order) then
502 if (muscl_dir == 1) then
503
504# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
505
506# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
507#if defined(MFC_OpenACC)
508# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
509!$acc parallel loop collapse(4) gang vector default(present)
510# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
511#elif defined(MFC_OpenMP)
512# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
513
514# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
515
516# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
517
518# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
519!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
520# 104 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
521#endif
522 do i = 1, ubound(v_vf, 1)
523 do l = is3_muscl%beg, is3_muscl%end
524 do k = is2_muscl%beg, is2_muscl%end
525 do j = is1_muscl%beg, is1_muscl%end
526 vl_rs_vf_x(j, k, l, i) = v_vf(i)%sf(j, k, l)
527 vr_rs_vf_x(j, k, l, i) = v_vf(i)%sf(j, k, l)
528 end do
529 end do
530 end do
531 end do
532
533# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
534#if defined(MFC_OpenACC)
535# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
536!$acc end parallel loop
537# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
538#elif defined(MFC_OpenMP)
539# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
540
541# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
542!$omp end target teams loop
543# 115 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
544#endif
545 else if (muscl_dir == 2) then
546
547# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
548
549# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
550#if defined(MFC_OpenACC)
551# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
552!$acc parallel loop collapse(4) gang vector default(present)
553# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
554#elif defined(MFC_OpenMP)
555# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
556
557# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
558
559# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
560
561# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
562!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
563# 117 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
564#endif
565 do i = 1, ubound(v_vf, 1)
566 do l = is3_muscl%beg, is3_muscl%end
567 do j = is1_muscl%beg, is1_muscl%end
568 do k = is2_muscl%beg, is2_muscl%end
569 vl_rs_vf_x(k, j, l, i) = v_vf(i)%sf(k, j, l)
570 vr_rs_vf_x(k, j, l, i) = v_vf(i)%sf(k, j, l)
571 end do
572 end do
573 end do
574 end do
575
576# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
577#if defined(MFC_OpenACC)
578# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
579!$acc end parallel loop
580# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
581#elif defined(MFC_OpenMP)
582# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
583
584# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
585!$omp end target teams loop
586# 128 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
587#endif
588 else if (muscl_dir == 3) then
589
590# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
591
592# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
593#if defined(MFC_OpenACC)
594# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
595!$acc parallel loop collapse(4) gang vector default(present)
596# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
597#elif defined(MFC_OpenMP)
598# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
599
600# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
601
602# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
603
604# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
605!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer)
606# 130 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
607#endif
608 do i = 1, ubound(v_vf, 1)
609 do j = is1_muscl%beg, is1_muscl%end
610 do k = is2_muscl%beg, is2_muscl%end
611 do l = is3_muscl%beg, is3_muscl%end
612 vl_rs_vf_x(l, k, j, i) = v_vf(i)%sf(l, k, j)
613 vr_rs_vf_x(l, k, j, i) = v_vf(i)%sf(l, k, j)
614 end do
615 end do
616 end do
617 end do
618
619# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
620#if defined(MFC_OpenACC)
621# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
622!$acc end parallel loop
623# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
624#elif defined(MFC_OpenMP)
625# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
626
627# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
628!$omp end target teams loop
629# 141 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
630#endif
631 end if
632 end if
633
634 v_size = ubound(v_vf, 1)
635
636# 146 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
637#if defined(MFC_OpenACC)
638# 146 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
639!$acc update device(v_size)
640# 146 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
641#elif defined(MFC_OpenMP)
642# 146 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
643!$omp target update to(v_size)
644# 146 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
645#endif
646
647 if (muscl_order /= muscl_order_first_order) then
648
649# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
650
651# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
652#if defined(MFC_OpenACC)
653# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
654!$acc parallel loop collapse(4) gang vector default(present) private(j, k, l, i)
655# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
656#elif defined(MFC_OpenMP)
657# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
658
659# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
660
661# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
662
663# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
664!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) private(j, k, l, i)
665# 149 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
666#endif
667 do i = 1, v_size
668 do l = idwbuff(3)%beg, idwbuff(3)%end
669 do k = idwbuff(2)%beg, idwbuff(2)%end
670 do j = idwbuff(1)%beg, idwbuff(1)%end
671 v_rs_ws_muscl(j, k, l, i) = v_vf(i)%sf(j, k, l)
672 end do
673 end do
674 end do
675 end do
676
677# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
678#if defined(MFC_OpenACC)
679# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
680!$acc end parallel loop
681# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
682#elif defined(MFC_OpenMP)
683# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
684
685# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
686!$omp end target teams loop
687# 159 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
688#endif
689 end if
690
691 if (muscl_order == muscl_order_second_order) then
692 ! MUSCL Reconstruction
693# 168 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
694# 169 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
695# 170 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
696 if (muscl_dir == 1) then
697
698# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
699
700# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
701#if defined(MFC_OpenACC)
702# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
703!$acc parallel loop collapse(4) gang vector default(present) private(i, j, k, l, slopeL, slopeR, slope)
704# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
705#elif defined(MFC_OpenMP)
706# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
707
708# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
709
710# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
711
712# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
713!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
714# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
715!$omp& private(i, j, k, l, slopeL, slopeR, slope)
716# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
717#endif
718 do l = is3_muscl%beg, is3_muscl%end
719 do k = is2_muscl%beg, is2_muscl%end
720 do j = is1_muscl%beg, is1_muscl%end
721 do i = 1, v_size
722 slopel = v_rs_ws_muscl(j + 1, k, l, i) - v_rs_ws_muscl(j, k, l, i)
723 sloper = v_rs_ws_muscl(j, k, l, i) - v_rs_ws_muscl(j - 1, k, l, i)
724 slope = 0._wp
725
726 if (muscl_lim == muscl_lim_unlimited) then ! unlimited (central difference)
727 slope = 5e-1_wp*(slopel + sloper)
728 else if (muscl_lim == muscl_lim_minmod) then ! minmod
729 if (slopel*sloper > muscl_eps) then
730 slope = min(abs(slopel), abs(sloper))
731 end if
732 if (slopel < 0._wp) slope = -slope
733 else if (muscl_lim == muscl_lim_mc) then ! MC
734 if (slopel*sloper > muscl_eps) then
735 slope = min(2._wp*abs(slopel), 2._wp*abs(sloper))
736 slope = min(slope, 5e-1_wp*(abs(slopel) + abs(sloper)))
737 end if
738 if (slopel < 0._wp) slope = -slope
739 else if (muscl_lim == muscl_lim_van_albada) then ! Van Albada
740 if (slopel*sloper > muscl_eps) then
741 slope = ((slopel + sloper)*slopel*sloper)/(slopel**2._wp + sloper**2._wp)
742 end if
743 else if (muscl_lim == muscl_lim_van_leer) then ! Van Leer
744 if (slopel*sloper > muscl_eps) then
745 slope = 2._wp*slopel*sloper/(slopel + sloper)
746 end if
747 else if (muscl_lim == muscl_lim_superbee) then ! SUPERBEE
748 if (slopel*sloper > muscl_eps) then
749 slope = -1._wp*min(-min(2._wp*abs(slopel), abs(sloper)), -min(abs(slopel), &
750 & 2._wp*abs(sloper)))
751 end if
752 end if
753
754 ! reconstruct from left side
755 vl_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) - (5.e-1_wp*slope)
756
757 ! reconstruct from the right side
758 vr_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) + (5.e-1_wp*slope)
759 end do
760 end do
761 end do
762 end do
763
764# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
765#if defined(MFC_OpenACC)
766# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
767!$acc end parallel loop
768# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
769#elif defined(MFC_OpenMP)
770# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
771
772# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
773!$omp end target teams loop
774# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
775#endif
776 end if
777# 168 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
778# 169 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
779# 170 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
780 if (muscl_dir == 2) then
781
782# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
783
784# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
785#if defined(MFC_OpenACC)
786# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
787!$acc parallel loop collapse(4) gang vector default(present) private(i, j, k, l, slopeL, slopeR, slope)
788# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
789#elif defined(MFC_OpenMP)
790# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
791
792# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
793
794# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
795
796# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
797!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
798# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
799!$omp& private(i, j, k, l, slopeL, slopeR, slope)
800# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
801#endif
802 do l = is3_muscl%beg, is3_muscl%end
803 do k = is1_muscl%beg, is1_muscl%end
804 do j = is2_muscl%beg, is2_muscl%end
805 do i = 1, v_size
806 slopel = v_rs_ws_muscl(j, k + 1, l, i) - v_rs_ws_muscl(j, k, l, i)
807 sloper = v_rs_ws_muscl(j, k, l, i) - v_rs_ws_muscl(j, k - 1, l, i)
808 slope = 0._wp
809
810 if (muscl_lim == muscl_lim_unlimited) then ! unlimited (central difference)
811 slope = 5e-1_wp*(slopel + sloper)
812 else if (muscl_lim == muscl_lim_minmod) then ! minmod
813 if (slopel*sloper > muscl_eps) then
814 slope = min(abs(slopel), abs(sloper))
815 end if
816 if (slopel < 0._wp) slope = -slope
817 else if (muscl_lim == muscl_lim_mc) then ! MC
818 if (slopel*sloper > muscl_eps) then
819 slope = min(2._wp*abs(slopel), 2._wp*abs(sloper))
820 slope = min(slope, 5e-1_wp*(abs(slopel) + abs(sloper)))
821 end if
822 if (slopel < 0._wp) slope = -slope
823 else if (muscl_lim == muscl_lim_van_albada) then ! Van Albada
824 if (slopel*sloper > muscl_eps) then
825 slope = ((slopel + sloper)*slopel*sloper)/(slopel**2._wp + sloper**2._wp)
826 end if
827 else if (muscl_lim == muscl_lim_van_leer) then ! Van Leer
828 if (slopel*sloper > muscl_eps) then
829 slope = 2._wp*slopel*sloper/(slopel + sloper)
830 end if
831 else if (muscl_lim == muscl_lim_superbee) then ! SUPERBEE
832 if (slopel*sloper > muscl_eps) then
833 slope = -1._wp*min(-min(2._wp*abs(slopel), abs(sloper)), -min(abs(slopel), &
834 & 2._wp*abs(sloper)))
835 end if
836 end if
837
838 ! reconstruct from left side
839 vl_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) - (5.e-1_wp*slope)
840
841 ! reconstruct from the right side
842 vr_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) + (5.e-1_wp*slope)
843 end do
844 end do
845 end do
846 end do
847
848# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
849#if defined(MFC_OpenACC)
850# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
851!$acc end parallel loop
852# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
853#elif defined(MFC_OpenMP)
854# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
855
856# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
857!$omp end target teams loop
858# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
859#endif
860 end if
861# 168 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
862# 169 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
863# 170 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
864 if (muscl_dir == 3) then
865
866# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
867
868# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
869#if defined(MFC_OpenACC)
870# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
871!$acc parallel loop collapse(4) gang vector default(present) private(i, j, k, l, slopeL, slopeR, slope)
872# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
873#elif defined(MFC_OpenMP)
874# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
875
876# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
877
878# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
879
880# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
881!$omp target teams loop defaultmap(firstprivate:scalar) bind(teams,parallel) collapse(4) defaultmap(tofrom:aggregate) defaultmap(tofrom:allocatable) defaultmap(tofrom:pointer) &
882# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
883!$omp& private(i, j, k, l, slopeL, slopeR, slope)
884# 171 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
885#endif
886 do l = is1_muscl%beg, is1_muscl%end
887 do k = is2_muscl%beg, is2_muscl%end
888 do j = is3_muscl%beg, is3_muscl%end
889 do i = 1, v_size
890 slopel = v_rs_ws_muscl(j, k, l + 1, i) - v_rs_ws_muscl(j, k, l, i)
891 sloper = v_rs_ws_muscl(j, k, l, i) - v_rs_ws_muscl(j, k, l - 1, i)
892 slope = 0._wp
893
894 if (muscl_lim == muscl_lim_unlimited) then ! unlimited (central difference)
895 slope = 5e-1_wp*(slopel + sloper)
896 else if (muscl_lim == muscl_lim_minmod) then ! minmod
897 if (slopel*sloper > muscl_eps) then
898 slope = min(abs(slopel), abs(sloper))
899 end if
900 if (slopel < 0._wp) slope = -slope
901 else if (muscl_lim == muscl_lim_mc) then ! MC
902 if (slopel*sloper > muscl_eps) then
903 slope = min(2._wp*abs(slopel), 2._wp*abs(sloper))
904 slope = min(slope, 5e-1_wp*(abs(slopel) + abs(sloper)))
905 end if
906 if (slopel < 0._wp) slope = -slope
907 else if (muscl_lim == muscl_lim_van_albada) then ! Van Albada
908 if (slopel*sloper > muscl_eps) then
909 slope = ((slopel + sloper)*slopel*sloper)/(slopel**2._wp + sloper**2._wp)
910 end if
911 else if (muscl_lim == muscl_lim_van_leer) then ! Van Leer
912 if (slopel*sloper > muscl_eps) then
913 slope = 2._wp*slopel*sloper/(slopel + sloper)
914 end if
915 else if (muscl_lim == muscl_lim_superbee) then ! SUPERBEE
916 if (slopel*sloper > muscl_eps) then
917 slope = -1._wp*min(-min(2._wp*abs(slopel), abs(sloper)), -min(abs(slopel), &
918 & 2._wp*abs(sloper)))
919 end if
920 end if
921
922 ! reconstruct from left side
923 vl_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) - (5.e-1_wp*slope)
924
925 ! reconstruct from the right side
926 vr_rs_vf_x(j, k, l, i) = v_rs_ws_muscl(j, k, l, i) + (5.e-1_wp*slope)
927 end do
928 end do
929 end do
930 end do
931
932# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
933#if defined(MFC_OpenACC)
934# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
935!$acc end parallel loop
936# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
937#elif defined(MFC_OpenMP)
938# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
939
940# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
941!$omp end target teams loop
942# 217 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
943#endif
944 end if
945# 220 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
946 end if
947
948 if (int_comp > 0 .and. v_size >= eqn_idx%adv%end) then
949 call nvtxstartrange("WENO-INTCOMP")
950# 225 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
951 if (muscl_dir == 1) then
952 call s_thinc_compression(v_rs_ws_muscl, vl_rs_vf_x, vr_rs_vf_x, muscl_dir, is1_muscl, is2_muscl, is3_muscl)
953 end if
954# 225 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
955 if (muscl_dir == 2) then
956 call s_thinc_compression(v_rs_ws_muscl, vl_rs_vf_x, vr_rs_vf_x, muscl_dir, is1_muscl, is2_muscl, is3_muscl)
957 end if
958# 225 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
959 if (muscl_dir == 3) then
960 call s_thinc_compression(v_rs_ws_muscl, vl_rs_vf_x, vr_rs_vf_x, muscl_dir, is1_muscl, is2_muscl, is3_muscl)
961 end if
962# 229 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
963 call nvtxendrange()
964 end if
965
966 end subroutine s_muscl
967
968 !> Finalize the MUSCL module
970
971#ifdef MFC_DEBUG
972# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
973 block
974# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
975 use iso_fortran_env, only: output_unit
976# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
977
978# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
979 print *, 'm_muscl.fpp:237: ', '@:DEALLOCATE(v_rs_ws_muscl)'
980# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
981
982# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
983 call flush (output_unit)
984# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
985 end block
986# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
987#endif
988# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
989
990# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
991#if defined(MFC_OpenACC)
992# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
993!$acc exit data delete(v_rs_ws_muscl)
994# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
995#elif defined(MFC_OpenMP)
996# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
997!$omp target exit data map(release:v_rs_ws_muscl)
998# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
999#endif
1000# 237 "/home/runner/work/MFC/MFC/src/simulation/m_muscl.fpp"
1001 deallocate (v_rs_ws_muscl)
1002
1003 end subroutine s_finalize_muscl_module
1004
1005end module m_muscl
integer, intent(in) k
integer, intent(in) j
integer, intent(in) l
Compile-time constant parameters: default values, tolerances, and physical constants.
integer, parameter muscl_lim_van_albada
integer, parameter muscl_lim_van_leer
integer, parameter muscl_lim_mc
integer, parameter muscl_order_second_order
integer, parameter muscl_order_first_order
integer, parameter muscl_lim_unlimited
integer, parameter muscl_lim_superbee
integer, parameter muscl_lim_minmod
Shared derived types for field data, patch geometry, bubble dynamics, and MPI I/O structures.
Global parameters for the computational domain, fluid properties, and simulation algorithm configurat...
integer buff_size
Number of ghost cells for boundary condition storage.
Utility routines for bubble model setup, coordinate transforms, array sampling, and special functions...
MPI halo exchange, domain decomposition, and buffer packing/unpacking for the simulation solver.
MUSCL reconstruction with interface sharpening for contact-preserving advection.
real(wp), dimension(:,:,:,:), allocatable v_rs_ws_muscl
type(int_bounds_info) is2_muscl
type(int_bounds_info) is3_muscl
subroutine, public s_muscl(v_vf, vl_rs_vf_x, vr_rs_vf_x, muscl_dir, is1_muscl_d, is2_muscl_d, is3_muscl_d)
Perform MUSCL reconstruction of left and right cell-boundary values from cell-averaged variables.
type(int_bounds_info) is1_muscl
subroutine, public s_initialize_muscl_module()
Allocate and initialize MUSCL reconstruction working arrays.
integer v_size
subroutine, public s_finalize_muscl_module()
Finalize the MUSCL module.
NVIDIA NVTX profiling API bindings for GPU performance instrumentation.
Definition m_nvtx.f90:6
THINC and MTHINC interface compression for volume fraction sharpening. THINC (int_comp=1): 1D directi...
Conservative-to-primitive variable conversion, mixture property evaluation, and pressure computation.
Integer bounds for variables.