Path: blob/main/src/callbacks_step/time_series_dg.jl
2055 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: noindent67# Store time series file for a DG solver8function save_time_series_file(time_series_callback,9mesh::Union{TreeMesh, UnstructuredMesh2D},10equations, dg::DG)11@unpack (interval, variable_names,12output_directory, filename, point_coordinates,13point_data, time, step) = time_series_callback14n_points = length(point_data)1516h5open(joinpath(output_directory, filename), "w") do file17# Add context information as attributes18n_variables = length(variable_names)19attributes(file)["ndims"] = ndims(mesh)20attributes(file)["equations"] = get_name(equations)21attributes(file)["polydeg"] = polydeg(dg)22attributes(file)["n_vars"] = n_variables23attributes(file)["n_points"] = n_points24attributes(file)["interval"] = interval25attributes(file)["variable_names"] = collect(variable_names)2627file["time"] = time28file["timestep"] = step29file["point_coordinates"] = point_coordinates30for p in 1:n_points31# Store data as 2D array for convenience32file["point_data_$p"] = reshape(point_data[p], n_variables, length(time))33end34end35end3637# Creates cache for time series callback38function create_cache_time_series(point_coordinates,39mesh::Union{TreeMesh, UnstructuredMesh2D},40dg, cache)41# Determine element ids for point coordinates42element_ids = get_elements_by_coordinates(point_coordinates, mesh, dg, cache)4344# Calculate & store Lagrange interpolation polynomials45interpolating_polynomials = calc_interpolating_polynomials(point_coordinates,46element_ids, mesh,47dg, cache)4849time_series_cache = (; element_ids, interpolating_polynomials)5051return time_series_cache52end5354function get_elements_by_coordinates(coordinates, mesh, dg, cache)55element_ids = Vector{Int}(undef, size(coordinates, 2))56get_elements_by_coordinates!(element_ids, coordinates, mesh, dg, cache)5758return element_ids59end6061function calc_interpolating_polynomials(coordinates, element_ids,62mesh::Union{TreeMesh, UnstructuredMesh2D},63dg, cache)64interpolating_polynomials = Array{real(dg), 3}(undef,65nnodes(dg), ndims(mesh),66length(element_ids))67calc_interpolating_polynomials!(interpolating_polynomials, coordinates, element_ids,68mesh, dg,69cache)7071return interpolating_polynomials72end73end # @muladd747576