Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
trixi-framework
GitHub Repository: trixi-framework/Trixi.jl
Path: blob/main/src/callbacks_step/time_series_dg.jl
2055 views
1
# By default, Julia/LLVM does not use fused multiply-add operations (FMAs).
2
# Since these FMAs can increase the performance of many numerical algorithms,
3
# we need to opt-in explicitly.
4
# See https://ranocha.de/blog/Optimizing_EC_Trixi for further details.
5
@muladd begin
6
#! format: noindent
7
8
# Store time series file for a DG solver
9
function save_time_series_file(time_series_callback,
10
mesh::Union{TreeMesh, UnstructuredMesh2D},
11
equations, dg::DG)
12
@unpack (interval, variable_names,
13
output_directory, filename, point_coordinates,
14
point_data, time, step) = time_series_callback
15
n_points = length(point_data)
16
17
h5open(joinpath(output_directory, filename), "w") do file
18
# Add context information as attributes
19
n_variables = length(variable_names)
20
attributes(file)["ndims"] = ndims(mesh)
21
attributes(file)["equations"] = get_name(equations)
22
attributes(file)["polydeg"] = polydeg(dg)
23
attributes(file)["n_vars"] = n_variables
24
attributes(file)["n_points"] = n_points
25
attributes(file)["interval"] = interval
26
attributes(file)["variable_names"] = collect(variable_names)
27
28
file["time"] = time
29
file["timestep"] = step
30
file["point_coordinates"] = point_coordinates
31
for p in 1:n_points
32
# Store data as 2D array for convenience
33
file["point_data_$p"] = reshape(point_data[p], n_variables, length(time))
34
end
35
end
36
end
37
38
# Creates cache for time series callback
39
function create_cache_time_series(point_coordinates,
40
mesh::Union{TreeMesh, UnstructuredMesh2D},
41
dg, cache)
42
# Determine element ids for point coordinates
43
element_ids = get_elements_by_coordinates(point_coordinates, mesh, dg, cache)
44
45
# Calculate & store Lagrange interpolation polynomials
46
interpolating_polynomials = calc_interpolating_polynomials(point_coordinates,
47
element_ids, mesh,
48
dg, cache)
49
50
time_series_cache = (; element_ids, interpolating_polynomials)
51
52
return time_series_cache
53
end
54
55
function get_elements_by_coordinates(coordinates, mesh, dg, cache)
56
element_ids = Vector{Int}(undef, size(coordinates, 2))
57
get_elements_by_coordinates!(element_ids, coordinates, mesh, dg, cache)
58
59
return element_ids
60
end
61
62
function calc_interpolating_polynomials(coordinates, element_ids,
63
mesh::Union{TreeMesh, UnstructuredMesh2D},
64
dg, cache)
65
interpolating_polynomials = Array{real(dg), 3}(undef,
66
nnodes(dg), ndims(mesh),
67
length(element_ids))
68
calc_interpolating_polynomials!(interpolating_polynomials, coordinates, element_ids,
69
mesh, dg,
70
cache)
71
72
return interpolating_polynomials
73
end
74
end # @muladd
75
76