Path: blob/main/src/solvers/dgsem_structured/subcell_limiters_2d.jl
5591 views
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).1# Since these FMAs can increase the performance of many numerical algorithms,2# we need to opt-in explicitly.3# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.4@muladd begin5#! format: noindent67function calc_bounds_twosided_interface!(var_min, var_max, variable, u,8semi, mesh::StructuredMesh{2}, equations)9_, _, dg, cache = mesh_equations_solver_cache(semi)1011for element in eachelement(dg, cache)12# Get neighboring element ids13left = cache.elements.left_neighbors[1, element]14lower = cache.elements.left_neighbors[2, element]1516if left != 017for j in eachnode(dg)18var_left = u[variable, nnodes(dg), j, left]19var_element = u[variable, 1, j, element]2021var_min[1, j, element] = min(var_min[1, j, element], var_left)22var_max[1, j, element] = max(var_max[1, j, element], var_left)2324var_min[nnodes(dg), j, left] = min(var_min[nnodes(dg), j, left],25var_element)26var_max[nnodes(dg), j, left] = max(var_max[nnodes(dg), j, left],27var_element)28end29end30if lower != 031for i in eachnode(dg)32var_lower = u[variable, i, nnodes(dg), lower]33var_element = u[variable, i, 1, element]3435var_min[i, 1, element] = min(var_min[i, 1, element], var_lower)36var_max[i, 1, element] = max(var_max[i, 1, element], var_lower)3738var_min[i, nnodes(dg), lower] = min(var_min[i, nnodes(dg), lower],39var_element)40var_max[i, nnodes(dg), lower] = max(var_max[i, nnodes(dg), lower],41var_element)42end43end44end4546return nothing47end4849@inline function calc_bounds_twosided_boundary!(var_min, var_max, variable, u, t,50boundary_conditions,51mesh::StructuredMesh{2},52equations, dg, cache)53if isperiodic(mesh)54return nothing55end56(; contravariant_vectors) = cache.elements5758linear_indices = LinearIndices(size(mesh))59if !isperiodic(mesh, 1)60# - xi direction61for cell_y in axes(mesh, 2)62element = linear_indices[begin, cell_y]63for j in eachnode(dg)64Ja1 = get_contravariant_vector(1, contravariant_vectors,651, j, element)66u_inner = get_node_vars(u, equations, dg, 1, j, element)67u_outer = get_boundary_outer_state(u_inner, t,68boundary_conditions[1], Ja1, 1,69mesh, equations, dg, cache,701, j, element)71var_outer = u_outer[variable]7273var_min[1, j, element] = min(var_min[1, j, element], var_outer)74var_max[1, j, element] = max(var_max[1, j, element], var_outer)75end76end77# + xi direction78for cell_y in axes(mesh, 2)79element = linear_indices[end, cell_y]80for j in eachnode(dg)81Ja1 = get_contravariant_vector(1, contravariant_vectors,82nnodes(dg), j, element)83u_inner = get_node_vars(u, equations, dg, nnodes(dg), j, element)84u_outer = get_boundary_outer_state(u_inner, t,85boundary_conditions[2], Ja1, 2,86mesh, equations, dg, cache,87nnodes(dg), j, element)88var_outer = u_outer[variable]8990var_min[nnodes(dg), j, element] = min(var_min[nnodes(dg), j, element],91var_outer)92var_max[nnodes(dg), j, element] = max(var_max[nnodes(dg), j, element],93var_outer)94end95end96end97if !isperiodic(mesh, 2)98# - eta direction99for cell_x in axes(mesh, 1)100element = linear_indices[cell_x, begin]101for i in eachnode(dg)102Ja2 = get_contravariant_vector(2, contravariant_vectors,103i, 1, element)104u_inner = get_node_vars(u, equations, dg, i, 1, element)105u_outer = get_boundary_outer_state(u_inner, t,106boundary_conditions[3], Ja2, 3,107mesh, equations, dg, cache,108i, 1, element)109var_outer = u_outer[variable]110111var_min[i, 1, element] = min(var_min[i, 1, element], var_outer)112var_max[i, 1, element] = max(var_max[i, 1, element], var_outer)113end114end115# - eta direction116for cell_x in axes(mesh, 1)117element = linear_indices[cell_x, end]118for i in eachnode(dg)119Ja2 = get_contravariant_vector(2, contravariant_vectors,120i, nnodes(dg), element)121u_inner = get_node_vars(u, equations, dg, i, nnodes(dg), element)122u_outer = get_boundary_outer_state(u_inner, t,123boundary_conditions[4], Ja2, 4,124mesh, equations, dg, cache,125i, nnodes(dg), element)126var_outer = u_outer[variable]127128var_min[i, nnodes(dg), element] = min(var_min[i, nnodes(dg), element],129var_outer)130var_max[i, nnodes(dg), element] = max(var_max[i, nnodes(dg), element],131var_outer)132end133end134end135136return nothing137end138139function calc_bounds_onesided_interface!(var_minmax, minmax, variable, u,140semi, mesh::StructuredMesh{2})141_, equations, dg, cache = mesh_equations_solver_cache(semi)142143for element in eachelement(dg, cache)144# Get neighboring element ids145left = cache.elements.left_neighbors[1, element]146lower = cache.elements.left_neighbors[2, element]147148if left != 0149for j in eachnode(dg)150var_left = variable(get_node_vars(u, equations, dg, nnodes(dg), j,151left), equations)152var_element = variable(get_node_vars(u, equations, dg, 1, j, element),153equations)154155var_minmax[1, j, element] = minmax(var_minmax[1, j, element], var_left)156var_minmax[nnodes(dg), j, left] = minmax(var_minmax[nnodes(dg), j,157left], var_element)158end159end160if lower != 0161for i in eachnode(dg)162var_lower = variable(get_node_vars(u, equations, dg, i, nnodes(dg),163lower), equations)164var_element = variable(get_node_vars(u, equations, dg, i, 1, element),165equations)166167var_minmax[i, 1, element] = minmax(var_minmax[i, 1, element], var_lower)168var_minmax[i, nnodes(dg), lower] = minmax(var_minmax[i, nnodes(dg),169lower],170var_element)171end172end173end174175return nothing176end177178@inline function calc_bounds_onesided_boundary!(var_minmax, minmax, variable, u, t,179boundary_conditions,180mesh::StructuredMesh{2},181equations, dg, cache)182if isperiodic(mesh)183return nothing184end185(; contravariant_vectors) = cache.elements186187linear_indices = LinearIndices(size(mesh))188if !isperiodic(mesh, 1)189# - xi direction190for cell_y in axes(mesh, 2)191element = linear_indices[begin, cell_y]192for j in eachnode(dg)193Ja1 = get_contravariant_vector(1, contravariant_vectors,1941, j, element)195u_inner = get_node_vars(u, equations, dg, 1, j, element)196u_outer = get_boundary_outer_state(u_inner, t,197boundary_conditions[1], Ja1, 1,198mesh, equations, dg, cache,1991, j, element)200var_outer = variable(u_outer, equations)201202var_minmax[1, j, element] = minmax(var_minmax[1, j, element], var_outer)203end204end205# + xi direction206for cell_y in axes(mesh, 2)207element = linear_indices[end, cell_y]208for j in eachnode(dg)209Ja1 = get_contravariant_vector(1, contravariant_vectors,210nnodes(dg), j, element)211u_inner = get_node_vars(u, equations, dg, nnodes(dg), j, element)212u_outer = get_boundary_outer_state(u_inner, t,213boundary_conditions[2], Ja1, 2,214mesh, equations, dg, cache,215nnodes(dg), j, element)216var_outer = variable(u_outer, equations)217218var_minmax[nnodes(dg), j, element] = minmax(var_minmax[nnodes(dg), j,219element],220var_outer)221end222end223end224if !isperiodic(mesh, 2)225# - eta direction226for cell_x in axes(mesh, 1)227element = linear_indices[cell_x, begin]228for i in eachnode(dg)229Ja2 = get_contravariant_vector(2, contravariant_vectors,230i, 1, element)231u_inner = get_node_vars(u, equations, dg, i, 1, element)232u_outer = get_boundary_outer_state(u_inner, t,233boundary_conditions[3], Ja2, 3,234mesh, equations, dg, cache,235i, 1, element)236var_outer = variable(u_outer, equations)237238var_minmax[i, 1, element] = minmax(var_minmax[i, 1, element], var_outer)239end240end241# + eta direction242for cell_x in axes(mesh, 1)243element = linear_indices[cell_x, end]244for i in eachnode(dg)245Ja2 = get_contravariant_vector(2, contravariant_vectors,246i, nnodes(dg), element)247u_inner = get_node_vars(u, equations, dg, i, nnodes(dg), element)248u_outer = get_boundary_outer_state(u_inner, t,249boundary_conditions[4], Ja2, 4,250mesh, equations, dg, cache,251i, nnodes(dg), element)252var_outer = variable(u_outer, equations)253254var_minmax[i, nnodes(dg), element] = minmax(var_minmax[i, nnodes(dg),255element],256var_outer)257end258end259end260261return nothing262end263end # @muladd264265266