common_util.jl 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. """
  2. cf. 3.3.1 Interface velocity extension [`Rodriguez 2024`](https://theses.fr/s384455)
  3. """
  4. function indices_extension(grid, LS, inside_ext, periodic_x, periodic_y)
  5. _MIXED_L = collect(intersect(Set(LS.MIXED), Set(findall(LS.geoL.emptied))))
  6. _MIXED_S = collect(intersect(Set(LS.MIXED), Set(findall(LS.geoS.emptied))))
  7. _MIXED = vcat(_MIXED_L, _MIXED_S)
  8. indices_ext1 = vcat(LS.SOLID, _MIXED, LS.LIQUID)
  9. if periodic_x && periodic_y
  10. indices_ext = collect(intersect(Set(indices_ext1), Set(vcat(
  11. vec(inside_ext), grid.ind.b_left[1][2:end-1], grid.ind.b_bottom[1][2:end-1],
  12. grid.ind.b_right[1][2:end-1], grid.ind.b_top[1][2:end-1]
  13. ))))
  14. elseif !periodic_x && periodic_y
  15. indices_ext = collect(intersect(Set(indices_ext1), Set(vcat(
  16. vec(inside_ext), grid.ind.b_bottom[1][2:end-1], grid.ind.b_top[1][2:end-1]
  17. ))))
  18. elseif periodic_x && !periodic_y
  19. indices_ext = collect(intersect(Set(indices_ext1), Set(vcat(
  20. vec(inside_ext), grid.ind.b_left[1][2:end-1], grid.ind.b_right[1][2:end-1]
  21. ))))
  22. else
  23. indices_ext = collect(intersect(Set(indices_ext1), Set(inside_ext)))
  24. end
  25. left_ext = collect(intersect(Set(grid.ind.b_left[1][2:end-1]), Set(indices_ext1)))
  26. bottom_ext = collect(intersect(Set(grid.ind.b_bottom[1][2:end-1]), Set(indices_ext1)))
  27. right_ext = collect(intersect(Set(grid.ind.b_right[1][2:end-1]), Set(indices_ext1)))
  28. top_ext = collect(intersect(Set(grid.ind.b_top[1][2:end-1]), Set(indices_ext1)))
  29. return indices_ext, left_ext, bottom_ext, right_ext, top_ext
  30. end
  31. """
  32. handles 2 crossing levelsets, levelsets are combined at grid.LS[end]
  33. 8:11 volume
  34. * periodic_x
  35. * periodic_y
  36. * empty = true
  37. """
  38. function update_all_ls_data(num, grid, grid_u, grid_v, BC_int, periodic_x, periodic_y, empty = true,one_fluid_model=false)
  39. # if num.one_fluid_model == 1
  40. # print("\n dummy volume green")
  41. # xmax = num.x[end]
  42. # xmin = num.x[1]
  43. # ymax = num.y[end]
  44. # ymin = num.y[1]
  45. # vol = (xmax-xmin)*(ymax-ymin)/(grid.nx*grid.ny)
  46. # grid.LS[end].geoL.dcap[:,:,5] .= vol
  47. # grid_u.LS[end].geoL.dcap[:,:,5] .= vol
  48. # grid_v.LS[end].geoL.dcap[:,:,5] .= vol
  49. # end
  50. if num.nLS > 1
  51. for iLS in 1:num.nLS
  52. update_ls_data(num, grid, grid_u, grid_v, iLS, grid.LS[iLS].u, grid.LS[iLS].κ, BC_int, BC_int[iLS], periodic_x, periodic_y, false, empty,one_fluid_model)
  53. grid.LS[iLS].geoL.cap0 .= grid.LS[iLS].geoL.cap
  54. grid.LS[iLS].mid_point0 .= grid.LS[iLS].mid_point
  55. end
  56. combine_levelsets!(num, grid)
  57. NB_indices = update_ls_data(num, grid, grid_u, grid_v, num._nLS, grid.LS[end].u, grid.LS[end].κ, BC_int, DummyBC(), periodic_x, periodic_y, true, empty,one_fluid_model)
  58. grid.LS[end].geoL.cap0 .= grid.LS[end].geoL.cap
  59. grid.LS[end].mid_point0 .= grid.LS[end].mid_point
  60. crossing_2levelsets!(num, grid, grid.LS[1], grid.LS[2], BC_int)
  61. crossing_2levelsets!(num, grid_u, grid_u.LS[1], grid_u.LS[2], BC_int)
  62. crossing_2levelsets!(num, grid_v, grid_v.LS[1], grid_v.LS[2], BC_int)
  63. # for iLS in 1:num.nLS
  64. # extend_contact_line!(grid, grid.LS[iLS])
  65. # end
  66. for iLS in 1:num.nLS
  67. postprocess_grids2!(grid, grid.LS[iLS], grid_u, grid_u.LS[iLS], grid_v, grid_v.LS[iLS], periodic_x, periodic_y, false)
  68. end
  69. postprocess_grids2!(grid, grid.LS[end], grid_u, grid_u.LS[end], grid_v, grid_v.LS[end], periodic_x, periodic_y, true)
  70. else
  71. NB_indices = update_ls_data(num, grid, grid_u, grid_v, 1, grid.LS[1].u, grid.LS[1].κ, BC_int, BC_int[1], periodic_x, periodic_y, true, empty,one_fluid_model)
  72. grid.LS[1].geoL.cap0 .= grid.LS[1].geoL.cap
  73. grid.LS[1].mid_point0 .= grid.LS[1].mid_point
  74. postprocess_grids2!(grid, grid.LS[1], grid_u, grid_u.LS[1], grid_v, grid_v.LS[1], periodic_x, periodic_y, true)
  75. end
  76. return NB_indices
  77. end
  78. """
  79. updates LS on p-grid, interpolates LS from scalar grid (p) to u and v grids
  80. """
  81. function update_ls_data(num, grid, grid_u, grid_v, iLS, u, κ, BC_int, bc_int, periodic_x, periodic_y, neighbours, empty = true,one_fluid_model=false)
  82. NB_indices = update_ls_data_grid(num, grid, grid.LS[iLS], u, κ, periodic_x, periodic_y)
  83. #interpolate from scalar grid (p) to u and v grids
  84. interpolate_scalar!(grid, grid_u, grid_v, u, grid_u.LS[iLS].u, grid_v.LS[iLS].u)
  85. _ = update_ls_data_grid(num, grid_u, grid_u.LS[iLS], grid_u.LS[iLS].u, grid_u.LS[iLS].κ, periodic_x, periodic_y)
  86. _ = update_ls_data_grid(num, grid_v, grid_v.LS[iLS], grid_v.LS[iLS].u, grid_v.LS[iLS].κ, periodic_x, periodic_y)
  87. postprocess_grids1!(num, grid, grid.LS[iLS], grid_u, grid_u.LS[iLS], grid_v, grid_v.LS[iLS], periodic_x, periodic_y, neighbours, empty, BC_int,one_fluid_model)
  88. for i in 1:num.nLS
  89. if is_wall(BC_int[i])
  90. idx_solid = Base.union(grid.LS[i].SOLID, findall(grid.LS[i].geoL.emptied))
  91. # @inbounds κ[idx_solid] .= 0.0
  92. @inbounds κ[grid.LS[i].SOLID] .= 0.0
  93. end
  94. end
  95. i_ext, l_ext, b_ext, r_ext, t_ext = indices_extension(grid, grid.LS[iLS], grid.ind.inside, periodic_x, periodic_y)
  96. field_extension!(grid, u, κ, i_ext, l_ext, b_ext, r_ext, t_ext, num.NB, periodic_x, periodic_y)
  97. if is_fs(bc_int)
  98. locate_contact_line!(num, grid, iLS, grid.LS[iLS].cl, grid.LS[iLS].MIXED, BC_int)
  99. locate_contact_line!(num, grid_u, iLS, grid_u.LS[iLS].cl, grid_u.LS[iLS].MIXED, BC_int)
  100. locate_contact_line!(num, grid_v, iLS, grid_v.LS[iLS].cl, grid_v.LS[iLS].MIXED, BC_int)
  101. # Apply inhomogeneous BC to more than one grid point by extending the contact line
  102. # extend_contact_line!(grid, grid.LS[iLS])
  103. # extend_contact_line!(grid_u, grid_u.LS[iLS].cl, num.n_ext_cl)
  104. # extend_contact_line!(grid_v, grid_v.LS[iLS].cl, num.n_ext_cl)
  105. end
  106. return NB_indices
  107. end
  108. """
  109. call marching_squares!, get_interface_location!, get_curvature
  110. """
  111. function update_ls_data_grid(num, grid, LS, u, κ, periodic_x, periodic_y)
  112. LS.α .= NaN
  113. LS.faces .= 0.0
  114. LS.mid_point .= [Point(0.0, 0.0)]
  115. marching_squares!(num,grid, LS, u, periodic_x, periodic_y)
  116. LS.MIXED, LS.SOLID, LS.LIQUID = get_cells_indices(LS.iso, grid.ind.all_indices)
  117. NB_indices_base = get_NB_width_indices_base(num.NB)
  118. NB_indices = get_NB_width(grid, LS.MIXED, NB_indices_base)
  119. get_interface_location!(grid, LS, periodic_x, periodic_y)
  120. LS.geoL.emptied .= false
  121. LS.geoS.emptied .= false
  122. LS.geoL.double_emptied .= false
  123. LS.geoS.double_emptied .= false
  124. κ .= 0.0
  125. get_curvature(num, grid, LS.geoL, u, κ, LS.MIXED, periodic_x, periodic_y)
  126. return NB_indices
  127. end
  128. function update_stefan_velocity(num, grid, iLS, u, TS, TL, periodic_x, periodic_y, λ, Vmean)
  129. Stefan_velocity!(num, grid, grid.LS[iLS], grid.V, TS, TL, grid.LS[iLS].MIXED, periodic_x, periodic_y)
  130. grid.V[grid.LS[iLS].MIXED] .*= 1. ./ λ
  131. if Vmean
  132. a = mean(grid.V[grid.LS[iLS].MIXED])
  133. grid.V[grid.LS[iLS].MIXED] .= a
  134. end
  135. i_ext, l_ext, b_ext, r_ext, t_ext = indices_extension(grid, grid.LS[iLS], grid.ind.inside, periodic_x, periodic_y)
  136. field_extension!(grid, u, grid.V, i_ext, l_ext, b_ext, r_ext, t_ext, num.NB, periodic_x, periodic_y)
  137. end
  138. function update_free_surface_velocity(num, grid_u, grid_v, iLS, uD, vD, periodic_x, periodic_y)
  139. # grid_u.V .= reshape(veci(uD,grid_u,iLS+1), grid_u)
  140. # grid_v.V .= reshape(veci(vD,grid_v,iLS+1), grid_v)
  141. grid_u.V .= reshape(vec1(uD,grid_u), grid_u)
  142. grid_v.V .= reshape(vec1(vD,grid_v), grid_v)
  143. i_u_ext, l_u_ext, b_u_ext, r_u_ext, t_u_ext = indices_extension(grid_u, grid_u.LS[iLS], grid_u.ind.inside, periodic_x, periodic_y)
  144. i_v_ext, l_v_ext, b_v_ext, r_v_ext, t_v_ext = indices_extension(grid_v, grid_v.LS[iLS], grid_v.ind.inside, periodic_x, periodic_y)
  145. field_extension!(grid_u, grid_u.LS[iLS].u, grid_u.V, i_u_ext, l_u_ext, b_u_ext, r_u_ext, t_u_ext, num.NB, periodic_x, periodic_y)
  146. field_extension!(grid_v, grid_v.LS[iLS].u, grid_v.V, i_v_ext, l_v_ext, b_v_ext, r_v_ext, t_v_ext, num.NB, periodic_x, periodic_y)
  147. end