Skip to content

Commit

Permalink
Initialize p4est and t8code only if possible (#1745)
Browse files Browse the repository at this point in the history
* initialize p4est and t8code only if possible

* format

* add warning if p4est/t8code are not usable
  • Loading branch information
JoshuaLampert authored Nov 21, 2023
1 parent 1635d31 commit eb0478b
Show file tree
Hide file tree
Showing 3 changed files with 45 additions and 33 deletions.
4 changes: 2 additions & 2 deletions Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Makie = "0.19"
MuladdMacro = "0.2.2"
Octavian = "0.3.5"
OffsetArrays = "1.3"
P4est = "0.4"
P4est = "0.4.9"
Polyester = "0.7.5"
PrecompileTools = "1.1"
Printf = "1"
Expand All @@ -84,7 +84,7 @@ StaticArrays = "1"
StrideArrays = "0.1.18"
StructArrays = "0.6"
SummationByPartsOperators = "0.5.41"
T8code = "0.4.1"
T8code = "0.4.3"
TimerOutputs = "0.5"
Triangulate = "2.0"
TriplotBase = "0.1"
Expand Down
18 changes: 12 additions & 6 deletions src/auxiliary/p4est.jl
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,20 @@ This function will check if `p4est` is already initialized
and if yes, do nothing, thus it is safe to call it multiple times.
"""
function init_p4est()
p4est_package_id = P4est.package_id()
if p4est_package_id >= 0
return nothing
# Only initialize p4est if P4est.jl can be used
if P4est.preferences_set_correctly()
p4est_package_id = P4est.package_id()
if p4est_package_id >= 0
return nothing
end

# Initialize `p4est` with log level ERROR to prevent a lot of output in AMR simulations
p4est_init(C_NULL, SC_LP_ERROR)
else
@warn "Preferences for P4est.jl are not set correctly. Until fixed, using `P4estMesh` will result in a crash. " *
"See also https://trixi-framework.github.io/Trixi.jl/stable/parallelization/#parallel_system_MPI"
end

# Initialize `p4est` with log level ERROR to prevent a lot of output in AMR simulations
p4est_init(C_NULL, SC_LP_ERROR)

return nothing
end

Expand Down
56 changes: 31 additions & 25 deletions src/auxiliary/t8code.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,34 +7,40 @@ is already initialized and if yes, do nothing, thus it is safe to call it
multiple times.
"""
function init_t8code()
t8code_package_id = t8_get_package_id()
if t8code_package_id >= 0
return nothing
end
# Only initialize t8code if T8code.jl can be used
if T8code.preferences_set_correctly()
t8code_package_id = t8_get_package_id()
if t8code_package_id >= 0
return nothing
end

# Initialize the sc library, has to happen before we initialize t8code.
let catch_signals = 0, print_backtrace = 0, log_handler = C_NULL
T8code.Libt8.sc_init(mpi_comm(), catch_signals, print_backtrace, log_handler,
T8code.Libt8.SC_LP_ERROR)
end
# Initialize the sc library, has to happen before we initialize t8code.
let catch_signals = 0, print_backtrace = 0, log_handler = C_NULL
T8code.Libt8.sc_init(mpi_comm(), catch_signals, print_backtrace, log_handler,
T8code.Libt8.SC_LP_ERROR)
end

if T8code.Libt8.p4est_is_initialized() == 0
# Initialize `p4est` with log level ERROR to prevent a lot of output in AMR simulations
T8code.Libt8.p4est_init(C_NULL, T8code.Libt8.SC_LP_ERROR)
end
if T8code.Libt8.p4est_is_initialized() == 0
# Initialize `p4est` with log level ERROR to prevent a lot of output in AMR simulations
T8code.Libt8.p4est_init(C_NULL, T8code.Libt8.SC_LP_ERROR)
end

# Initialize t8code with log level ERROR to prevent a lot of output in AMR simulations.
t8_init(T8code.Libt8.SC_LP_ERROR)

if haskey(ENV, "TRIXI_T8CODE_SC_FINALIZE")
# Normally, `sc_finalize` should always be called during shutdown of an
# application. It checks whether there is still un-freed memory by t8code
# and/or T8code.jl and throws an exception if this is the case. For
# production runs this is not mandatory, but is helpful during
# development. Hence, this option is only activated when environment
# variable TRIXI_T8CODE_SC_FINALIZE exists.
@warn "T8code.jl: sc_finalize will be called during shutdown of Trixi.jl."
MPI.add_finalize_hook!(T8code.Libt8.sc_finalize)
# Initialize t8code with log level ERROR to prevent a lot of output in AMR simulations.
t8_init(T8code.Libt8.SC_LP_ERROR)

if haskey(ENV, "TRIXI_T8CODE_SC_FINALIZE")
# Normally, `sc_finalize` should always be called during shutdown of an
# application. It checks whether there is still un-freed memory by t8code
# and/or T8code.jl and throws an exception if this is the case. For
# production runs this is not mandatory, but is helpful during
# development. Hence, this option is only activated when environment
# variable TRIXI_T8CODE_SC_FINALIZE exists.
@warn "T8code.jl: sc_finalize will be called during shutdown of Trixi.jl."
MPI.add_finalize_hook!(T8code.Libt8.sc_finalize)
end
else
@warn "Preferences for T8code.jl are not set correctly. Until fixed, using `T8codeMesh` will result in a crash. " *
"See also https://trixi-framework.github.io/Trixi.jl/stable/parallelization/#parallel_system_MPI"
end

return nothing
Expand Down

0 comments on commit eb0478b

Please sign in to comment.