Skip to content

Commit daf3acd

Browse files
Moving Levelset Calculation to Pre-Process (#662)
1 parent efc9d67 commit daf3acd

35 files changed

+1122
-902
lines changed

src/common/m_derived_types.fpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,16 @@ module m_derived_types
3434
integer, pointer, dimension(:, :, :) :: sf => null()
3535
end type integer_field
3636

37+
!> Derived type for levelset
38+
type levelset_field
39+
real(kind(0d0)), pointer, dimension(:, :, :, :) :: sf => null()
40+
end type levelset_field
41+
42+
!> Derived type for levelset norm
43+
type levelset_norm_field
44+
real(kind(0d0)), pointer, dimension(:, :, :, :, :) :: sf => null()
45+
end type levelset_norm_field
46+
3747
type mpi_io_var
3848
integer, allocatable, dimension(:) :: view
3949
type(scalar_field), allocatable, dimension(:) :: var
@@ -44,6 +54,16 @@ module m_derived_types
4454
type(integer_field) :: var
4555
end type mpi_io_ib_var
4656

57+
type mpi_io_levelset_var
58+
integer :: view
59+
type(levelset_field) :: var
60+
end type mpi_io_levelset_var
61+
62+
type mpi_io_levelset_norm_var
63+
integer :: view
64+
type(levelset_norm_field) :: var
65+
end type mpi_io_levelset_norm_var
66+
4767
!> Derived type annexing a vector field (VF)
4868
type vector_field
4969
type(scalar_field), allocatable, dimension(:) :: vf !< Vector field

src/common/m_mpi_common.fpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ contains
6262
6363
!! @param q_cons_vf Conservative variables
6464
!! @param ib_markers track if a cell is within the immersed boundary
65-
subroutine s_initialize_mpi_data(q_cons_vf, ib_markers)
65+
!! @param levelset closest distance from every cell to the IB
66+
!! @param levelset_norm normalized vector from every cell to the closest point to the IB
67+
subroutine s_initialize_mpi_data(q_cons_vf, ib_markers, levelset, levelset_norm)
6668
6769
type(scalar_field), &
6870
dimension(sys_size), &
@@ -72,6 +74,14 @@ contains
7274
optional, &
7375
intent(in) :: ib_markers
7476
77+
type(levelset_field), &
78+
optional, &
79+
intent(IN) :: levelset
80+
81+
type(levelset_norm_field), &
82+
optional, &
83+
intent(IN) :: levelset_norm
84+
7585
integer, dimension(num_dims) :: sizes_glb, sizes_loc
7686
integer, dimension(1) :: airfoil_glb, airfoil_loc, airfoil_start
7787
@@ -137,13 +147,30 @@ contains
137147
138148
#ifdef MFC_PRE_PROCESS
139149
MPI_IO_IB_DATA%var%sf => ib_markers%sf
150+
MPI_IO_levelset_DATA%var%sf => levelset%sf
151+
MPI_IO_levelsetnorm_DATA%var%sf => levelset_norm%sf
140152
#else
141153
MPI_IO_IB_DATA%var%sf => ib_markers%sf(0:m, 0:n, 0:p)
154+
155+
#ifndef MFC_POST_PROCESS
156+
MPI_IO_levelset_DATA%var%sf => levelset%sf(0:m, 0:n, 0:p, 1:num_ibs)
157+
MPI_IO_levelsetnorm_DATA%var%sf => levelset_norm%sf(0:m, 0:n, 0:p, 1:num_ibs, 1:3)
158+
#endif
159+
142160
#endif
143161
call MPI_TYPE_CREATE_SUBARRAY(num_dims, sizes_glb, sizes_loc, start_idx, &
144162
MPI_ORDER_FORTRAN, MPI_INTEGER, MPI_IO_IB_DATA%view, ierr)
145163
call MPI_TYPE_COMMIT(MPI_IO_IB_DATA%view, ierr)
146164
165+
#ifndef MFC_POST_PROCESS
166+
call MPI_TYPE_CREATE_SUBARRAY(num_dims, sizes_glb, sizes_loc, start_idx, &
167+
MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, MPI_IO_levelset_DATA%view, ierr)
168+
call MPI_TYPE_CREATE_SUBARRAY(num_dims, sizes_glb, sizes_loc, start_idx, &
169+
MPI_ORDER_FORTRAN, MPI_DOUBLE_PRECISION, MPI_IO_levelsetnorm_DATA%view, ierr)
170+
171+
call MPI_TYPE_COMMIT(MPI_IO_levelset_DATA%view, ierr)
172+
call MPI_TYPE_COMMIT(MPI_IO_levelsetnorm_DATA%view, ierr)
173+
#endif
147174
end if
148175
149176
#ifndef MFC_POST_PROCESS

src/post_process/m_global_parameters.fpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,14 @@ module m_global_parameters
155155
integer, allocatable, dimension(:) :: start_idx !<
156156
!! Starting cell-center index of local processor in global grid
157157

158+
integer :: num_ibs !< Number of immersed boundaries
159+
158160
#ifdef MFC_MPI
159161

160162
type(mpi_io_var), public :: MPI_IO_DATA
161163
type(mpi_io_ib_var), public :: MPI_IO_IB_DATA
164+
type(mpi_io_levelset_var), public :: MPI_IO_levelset_DATA
165+
type(mpi_io_levelset_norm_var), public :: MPI_IO_levelsetnorm_DATA
162166

163167
#endif
164168

@@ -401,6 +405,9 @@ contains
401405
surface_tension = .false.
402406
adv_n = .false.
403407

408+
! IBM
409+
num_ibs = dflt_int
410+
404411
end subroutine s_assign_default_values_to_user_inputs
405412

406413
!> Computation of parameters, allocation procedures, and/or

src/post_process/m_mpi_proxy.fpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ contains
159159
& 'model_eqns', 'num_fluids', 'bc_x%beg', 'bc_x%end', 'bc_y%beg', &
160160
& 'bc_y%end', 'bc_z%beg', 'bc_z%end', 'flux_lim', 'format', &
161161
& 'precision', 'fd_order', 'thermal', 'nb', 'relax_model', &
162-
& 'n_start' ]
162+
& 'n_start', 'num_ibs' ]
163163
call MPI_BCAST(${VAR}$, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
164164
#:endfor
165165

src/post_process/m_start_up.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ subroutine s_read_input_file
8080
parallel_io, rhoref, pref, bubbles, qbmm, sigR, &
8181
R0ref, nb, polytropic, thermal, Ca, Web, Re_inv, &
8282
polydisperse, poly_sigma, file_per_process, relax, &
83-
relax_model, cf_wrt, sigma, adv_n, ib, &
83+
relax_model, cf_wrt, sigma, adv_n, ib, num_ibs, &
8484
cfl_adap_dt, cfl_const_dt, t_save, t_stop, n_start, &
8585
cfl_target, surface_tension
8686

src/simulation/m_compute_levelset.fpp renamed to src/pre_process/m_compute_levelset.fpp

Lines changed: 55 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,11 @@ module m_compute_levelset
3838

3939
contains
4040

41-
!> Initialize IBM module
4241
subroutine s_compute_circle_levelset(levelset, levelset_norm, ib_patch_id)
4342

44-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
45-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
46-
integer, intent(in) :: ib_patch_id
43+
type(levelset_field), intent(INOUT) :: levelset
44+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
45+
integer, intent(IN) :: ib_patch_id
4746

4847
real(kind(0d0)) :: radius, dist
4948
real(kind(0d0)) :: x_centroid, y_centroid
@@ -62,11 +61,11 @@ contains
6261
dist_vec(2) = y_cc(j) - y_centroid
6362
dist_vec(3) = 0
6463
dist = dsqrt(sum(dist_vec**2))
65-
levelset(i, j, 0, ib_patch_id) = dist - radius
64+
levelset%sf(i, j, 0, ib_patch_id) = dist - radius
6665
if (dist == 0) then
67-
levelset_norm(i, j, 0, ib_patch_id, :) = 0
66+
levelset_norm%sf(i, j, 0, ib_patch_id, :) = 0
6867
else
69-
levelset_norm(i, j, 0, ib_patch_id, :) = &
68+
levelset_norm%sf(i, j, 0, ib_patch_id, :) = &
7069
dist_vec(:)/dist
7170
end if
7271

@@ -77,9 +76,9 @@ contains
7776

7877
subroutine s_compute_airfoil_levelset(levelset, levelset_norm, ib_patch_id)
7978

80-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
81-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
82-
integer, intent(in) :: ib_patch_id
79+
type(levelset_field), intent(INOUT) :: levelset
80+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
81+
integer, intent(IN) :: ib_patch_id
8382

8483
real(kind(0d0)) :: radius, dist, global_dist
8584
integer :: global_id
@@ -145,11 +144,11 @@ contains
145144
dist = global_dist
146145
end if
147146

148-
levelset(i, j, 0, ib_patch_id) = dist
147+
levelset%sf(i, j, 0, ib_patch_id) = dist
149148
if (dist == 0) then
150-
levelset_norm(i, j, 0, ib_patch_id, :) = 0
149+
levelset_norm%sf(i, j, 0, ib_patch_id, :) = 0
151150
else
152-
levelset_norm(i, j, 0, ib_patch_id, :) = &
151+
levelset_norm%sf(i, j, 0, ib_patch_id, :) = &
153152
dist_vec(:)/dist
154153
end if
155154

@@ -160,9 +159,9 @@ contains
160159

161160
subroutine s_compute_3D_airfoil_levelset(levelset, levelset_norm, ib_patch_id)
162161

163-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
164-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
165-
integer, intent(in) :: ib_patch_id
162+
type(levelset_field), intent(INOUT) :: levelset
163+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
164+
integer, intent(IN) :: ib_patch_id
166165

167166
real(kind(0d0)) :: radius, dist, dist_surf, dist_side, global_dist
168167
integer :: global_id
@@ -237,18 +236,18 @@ contains
237236
dist_side = min(abs(z_cc(l) - z_min), abs(z_max - z_cc(l)))
238237

239238
if (dist_side < dist_surf) then
240-
levelset(i, j, l, ib_patch_id) = dist_side
239+
levelset%sf(i, j, l, ib_patch_id) = dist_side
241240
if (dist_side == abs(z_cc(l) - z_min)) then
242-
levelset_norm(i, j, l, ib_patch_id, :) = (/0, 0, -1/)
241+
levelset_norm%sf(i, j, l, ib_patch_id, :) = (/0, 0, -1/)
243242
else
244-
levelset_norm(i, j, l, ib_patch_id, :) = (/0, 0, 1/)
243+
levelset_norm%sf(i, j, l, ib_patch_id, :) = (/0, 0, 1/)
245244
end if
246245
else
247-
levelset(i, j, l, ib_patch_id) = dist_surf
246+
levelset%sf(i, j, l, ib_patch_id) = dist_surf
248247
if (dist == 0) then
249-
levelset_norm(i, j, l, ib_patch_id, :) = 0
248+
levelset_norm%sf(i, j, l, ib_patch_id, :) = 0
250249
else
251-
levelset_norm(i, j, l, ib_patch_id, :) = &
250+
levelset_norm%sf(i, j, l, ib_patch_id, :) = &
252251
dist_vec(:)/dist_surf
253252
end if
254253
end if
@@ -262,10 +261,10 @@ contains
262261
!> Initialize IBM module
263262
subroutine s_compute_rectangle_levelset(levelset, levelset_norm, ib_patch_id)
264263

265-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
266-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
267-
integer, intent(in) :: ib_patch_id
264+
type(levelset_field), intent(INOUT) :: levelset
265+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
268266

267+
integer :: ib_patch_id
269268
real(kind(0d0)) :: top_right(2), bottom_left(2)
270269
real(kind(0d0)) :: x, y, min_dist
271270
real(kind(0d0)) :: side_dists(4)
@@ -303,37 +302,37 @@ contains
303302
end if
304303

305304
if (min_dist == abs(side_dists(1))) then
306-
levelset(i, j, 0, ib_patch_id) = side_dists(1)
305+
levelset%sf(i, j, 0, ib_patch_id) = side_dists(1)
307306
if (side_dists(1) == 0) then
308-
levelset_norm(i, j, 0, ib_patch_id, 1) = 0d0
307+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = 0d0
309308
else
310-
levelset_norm(i, j, 0, ib_patch_id, 1) = side_dists(1)/ &
311-
abs(side_dists(1))
309+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = side_dists(1)/ &
310+
abs(side_dists(1))
312311
end if
313312

314313
else if (min_dist == abs(side_dists(2))) then
315-
levelset(i, j, 0, ib_patch_id) = side_dists(2)
314+
levelset%sf(i, j, 0, ib_patch_id) = side_dists(2)
316315
if (side_dists(2) == 0) then
317-
levelset_norm(i, j, 0, ib_patch_id, 1) = 0d0
316+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = 0d0
318317
else
319-
levelset_norm(i, j, 0, ib_patch_id, 1) = side_dists(2)/ &
320-
abs(side_dists(2))
318+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = side_dists(2)/ &
319+
abs(side_dists(2))
321320
end if
322321

323322
else if (min_dist == abs(side_dists(3))) then
324323
if (side_dists(3) == 0) then
325-
levelset_norm(i, j, 0, ib_patch_id, 1) = 0d0
324+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = 0d0
326325
else
327-
levelset_norm(i, j, 0, ib_patch_id, 1) = side_dists(3)/ &
328-
abs(side_dists(3))
326+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = side_dists(3)/ &
327+
abs(side_dists(3))
329328
end if
330329

331330
else if (min_dist == abs(side_dists(4))) then
332331
if (side_dists(4) == 0) then
333-
levelset_norm(i, j, 0, ib_patch_id, 1) = 0d0
332+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = 0d0
334333
else
335-
levelset_norm(i, j, 0, ib_patch_id, 1) = side_dists(4)/ &
336-
abs(side_dists(4))
334+
levelset_norm%sf(i, j, 0, ib_patch_id, 1) = side_dists(4)/ &
335+
abs(side_dists(4))
337336
end if
338337

339338
end if
@@ -347,9 +346,9 @@ contains
347346

348347
subroutine s_compute_sphere_levelset(levelset, levelset_norm, ib_patch_id)
349348

350-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
351-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
352-
integer, intent(in) :: ib_patch_id
349+
type(levelset_field), intent(INOUT) :: levelset
350+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
351+
integer, intent(IN) :: ib_patch_id
353352

354353
real(kind(0d0)) :: radius, dist
355354
real(kind(0d0)) :: x_centroid, y_centroid, z_centroid
@@ -369,11 +368,11 @@ contains
369368
dist_vec(2) = y_cc(j) - y_centroid
370369
dist_vec(3) = z_cc(k) - z_centroid
371370
dist = dsqrt(sum(dist_vec**2))
372-
levelset(i, j, k, ib_patch_id) = dist - radius
371+
levelset%sf(i, j, k, ib_patch_id) = dist - radius
373372
if (dist == 0) then
374-
levelset_norm(i, j, k, ib_patch_id, :) = (/1, 0, 0/)
373+
levelset_norm%sf(i, j, k, ib_patch_id, :) = (/1, 0, 0/)
375374
else
376-
levelset_norm(i, j, k, ib_patch_id, :) = &
375+
levelset_norm%sf(i, j, k, ib_patch_id, :) = &
377376
dist_vec(:)/dist
378377
end if
379378
end do
@@ -384,9 +383,9 @@ contains
384383

385384
subroutine s_compute_cylinder_levelset(levelset, levelset_norm, ib_patch_id)
386385

387-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs), intent(inout) :: levelset
388-
real(kind(0d0)), dimension(0:m, 0:n, 0:p, num_ibs, 3), intent(inout) :: levelset_norm
389-
integer, intent(in) :: ib_patch_id
386+
type(levelset_field), intent(INOUT) :: levelset
387+
type(levelset_norm_field), intent(INOUT) :: levelset_norm
388+
integer, intent(IN) :: ib_patch_id
390389

391390
real(kind(0d0)) :: radius, dist
392391
real(kind(0d0)) :: x_centroid, y_centroid, z_centroid
@@ -434,20 +433,20 @@ contains
434433
- radius
435434

436435
if (dist_side < abs(dist_surface)) then
437-
levelset(i, j, k, ib_patch_id) = -dist_side
436+
levelset%sf(i, j, k, ib_patch_id) = -dist_side
438437
if (dist_side == abs(side_pos - boundary%beg)) then
439-
levelset_norm(i, j, k, ib_patch_id, :) = -dist_sides_vec
438+
levelset_norm%sf(i, j, k, ib_patch_id, :) = -dist_sides_vec
440439
else
441-
levelset_norm(i, j, k, ib_patch_id, :) = dist_sides_vec
440+
levelset_norm%sf(i, j, k, ib_patch_id, :) = dist_sides_vec
442441
end if
443442
else
444-
levelset(i, j, k, ib_patch_id) = dist_surface
443+
levelset%sf(i, j, k, ib_patch_id) = dist_surface
445444

446-
levelset_norm(i, j, k, ib_patch_id, :) = &
445+
levelset_norm%sf(i, j, k, ib_patch_id, :) = &
447446
(pos_vec - centroid_vec)*dist_surface_vec
448-
levelset_norm(i, j, k, ib_patch_id, :) = &
449-
levelset_norm(i, j, k, ib_patch_id, :)/ &
450-
norm2(levelset_norm(i, j, k, ib_patch_id, :))
447+
levelset_norm%sf(i, j, k, ib_patch_id, :) = &
448+
levelset_norm%sf(i, j, k, ib_patch_id, :)/ &
449+
norm2(levelset_norm%sf(i, j, k, ib_patch_id, :))
451450
end if
452451
end do
453452
end do

0 commit comments

Comments
 (0)