Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
70b19bd
first steps towards accessing Trixi data
benegee Jul 5, 2023
8affd33
the real changes
benegee Jul 5, 2023
6a7b7c0
Merge branch 'main' into bg/get_cell_averages
benegee Jul 14, 2023
b6f1858
adapt to current main
benegee Jul 14, 2023
7a39eea
add queries and data access to fortran interface
benegee Jul 14, 2023
9ad0958
start with Fortran example for data handling
benegee Jul 14, 2023
155e895
set refinement level to 2 for testing
benegee Jul 14, 2023
b5ddfcb
enumerate is not necessary here
benegee Jul 14, 2023
5f99e56
get Fortran example working
benegee Jul 14, 2023
5db2864
use load instead of get
benegee Jul 14, 2023
874f710
Update LibTrixi.jl/src/api_c.jl
benegee Jul 14, 2023
9725e2a
Update LibTrixi.jl/src/api_c.jl
benegee Jul 14, 2023
cddfd8b
Update examples/trixi_controller_data.c
benegee Jul 14, 2023
ab7bd6e
Update LibTrixi.jl/src/api_jl.jl
benegee Jul 14, 2023
d027822
small fixes
benegee Jul 14, 2023
4dc4cb5
add all required Trixi symbols to using statement
benegee Jul 14, 2023
24f9176
Merge branch 'main' into bg/get_cell_averages
benegee Aug 3, 2023
41c3bc4
changed data interface to real(c_double)
benegee Aug 3, 2023
5d550b4
Merge branch 'main' into bg/get_cell_averages
benegee Aug 14, 2023
a39b3c9
make computation of averages dimension agnostic
benegee Aug 14, 2023
0f853f6
Update LibTrixi.jl/src/api_c.jl
benegee Aug 14, 2023
6315297
Update LibTrixi.jl/src/api_c.jl
benegee Aug 14, 2023
48aae60
Update LibTrixi.jl/src/api_c.jl
benegee Aug 14, 2023
ad0d308
doc consistent to suggestion
benegee Aug 14, 2023
5d63a53
move conversion of C to julia array from api_jl to api_c
benegee Aug 14, 2023
8a3b793
switch to 1-based Fortran array
benegee Aug 14, 2023
d71c53c
removed example, libelixir_p4est2d_dgsem_euler_sedov.jl can be used
benegee Aug 14, 2023
1af0098
add new examples to CI testing
benegee Aug 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,10 @@ jobs:
../build/examples/simple_trixi_controller_c . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia \
../build/examples/simple_trixi_controller_f . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia \
../build/examples/trixi_controller_data_c . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia \
../build/examples/trixi_controller_data_f . libelixir_p4est2d_dgsem_euler_sedov.jl
env:
LIBTRIXI_DEBUG: all
- name: Run memory checks with Valgrind
Expand All @@ -174,6 +178,10 @@ jobs:
../build/examples/simple_trixi_controller_c . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia valgrind --error-exitcode=1 -s \
../build/examples/simple_trixi_controller_f . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia \
../build/examples/trixi_controller_data_c . libelixir_p4est2d_dgsem_euler_sedov.jl
JULIA_DEPOT_PATH=~/.julia \
../build/examples/trixi_controller_data_f . libelixir_p4est2d_dgsem_euler_sedov.jl
- name: Process coverage data
if: ${{ matrix.test_type == 'coverage' }}
run: |
Expand Down
15 changes: 14 additions & 1 deletion LibTrixi.jl/src/LibTrixi.jl
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
module LibTrixi

using OrdinaryDiffEq: OrdinaryDiffEq, step!, check_error, DiscreteCallback
using Trixi: Trixi, summary_callback
using Trixi: Trixi, summary_callback, mesh_equations_solver_cache, nelements, nvariables,
nnodes, wrap_array, eachelement, cons2prim, get_node_vars, eachnode
using MPI: MPI, run_init_hooks, set_default_error_handler_return

export trixi_initialize_simulation,
Expand All @@ -19,6 +20,18 @@ export trixi_is_finished,
export trixi_step,
trixi_step_cfptr,
trixi_step_jl
export trixi_ndims,
trixi_ndims_cfptr,
trixi_ndims_jl
export trixi_nelements,
trixi_nelements_cfptr,
trixi_nelements_jl
export trixi_nvariables,
trixi_nvariables_cfptr,
trixi_nvariables_jl
export trixi_load_cell_averages,
trixi_load_cell_averages_cfptr,
trixi_load_cell_averages_jl

export SimulationState, store_simstate, load_simstate, delete_simstate!

Expand Down
72 changes: 72 additions & 0 deletions LibTrixi.jl/src/api_c.jl
Original file line number Diff line number Diff line change
Expand Up @@ -129,3 +129,75 @@ Base.@ccallable function trixi_step(simstate_handle::Cint)::Cvoid
end

trixi_step_cfptr() = @cfunction(trixi_step, Cvoid, (Cint,))


"""
trixi_ndims(simstate_handle::Cint)::Cint

Return number of spatial dimensions.
"""
function trixi_ndims end

Base.@ccallable function trixi_ndims(simstate_handle::Cint)::Cint
simstate = load_simstate(simstate_handle)
return trixi_ndims_jl(simstate)
end

trixi_ndims_cfptr() = @cfunction(trixi_ndims, Cint, (Cint,))


"""
trixi_nelements(simstate_handle::Cint)::Cint

Return number of elements (cells).
"""
function trixi_nelements end

Base.@ccallable function trixi_nelements(simstate_handle::Cint)::Cint
simstate = load_simstate(simstate_handle)
return trixi_nelements_jl(simstate)
end

trixi_nelements_cfptr() = @cfunction(trixi_nelements, Cint, (Cint,))


"""
trixi_nvariables(simstate_handle::Cint)::Cint

Return number of variables.
"""
function trixi_nvariables end

Base.@ccallable function trixi_nvariables(simstate_handle::Cint)::Cint
simstate = load_simstate(simstate_handle)
return trixi_nvariables_jl(simstate)
end

trixi_nvariables_cfptr() = @cfunction(trixi_nvariables, Cint, (Cint,))


"""
trixi_load_cell_averages(data::Ptr{Cdouble}, simstate_handle::Cint)::Cvoid

Return cell averaged solution state.

Cell averaged values for each cell and each primitive variable are stored in a contiguous
array, where cell values for the first variable appear first and values for the other
variables subsequently (structure-of-arrays layout).

The given array has to be of correct size and memory has to be allocated beforehand.
"""
function trixi_load_cell_averages end

Base.@ccallable function trixi_load_cell_averages(data::Ptr{Cdouble}, simstate_handle::Cint)::Cvoid
simstate = load_simstate(simstate_handle)

# convert C to julia array
size = trixi_nvariables_jl(simstate) * trixi_nelements_jl(simstate)
data_jl = unsafe_wrap(Array, data, size)

trixi_load_cell_averages_jl(data_jl, simstate)
return nothing
end

trixi_load_cell_averages_cfptr() = @cfunction(trixi_load_cell_averages, Cvoid, (Ptr{Cdouble}, Cint,))
57 changes: 57 additions & 0 deletions LibTrixi.jl/src/api_jl.jl
Original file line number Diff line number Diff line change
Expand Up @@ -49,3 +49,60 @@ function trixi_step_jl(simstate)

return nothing
end

function trixi_ndims_jl(simstate)
mesh, _, _, _ = mesh_equations_solver_cache(simstate.semi)
return ndims(mesh)
end

function trixi_nelements_jl(simstate)
_, _, solver, cache = mesh_equations_solver_cache(simstate.semi)
return nelements(solver, cache)
end

function trixi_nvariables_jl(simstate)
_, equations, _, _ = mesh_equations_solver_cache(simstate.semi)
return nvariables(equations)
end

function trixi_load_cell_averages_jl(data, simstate)
mesh, equations, solver, cache = mesh_equations_solver_cache(simstate.semi)
n_elements = nelements(solver, cache)
n_variables = nvariables(equations)
n_nodes = nnodes(solver)
n_dims = ndims(mesh)

u_ode = simstate.integrator.u
u = wrap_array(u_ode, mesh, equations, solver, cache)

# all permutations of nodes indices for arbitrary dimension
node_cis = CartesianIndices(ntuple(i -> n_nodes, n_dims))

# temporary storage for mean value on current element for all variables
u_mean = get_node_vars(u, equations, solver, node_cis[1], 1)

for element in eachelement(solver, cache)

# compute mean value using nodal dg values and quadrature
u_mean = zero(u_mean)
for node_ci in node_cis
u_node_prim = cons2prim(get_node_vars(u, equations, solver, node_ci, element), equations)
weight = 1.
for node_index in Tuple(node_ci)
weight *= solver.basis.weights[node_index]
end
u_mean += u_node_prim * weight
end

# normalize to unit element
u_mean = u_mean / 2^n_dims

# copy to provided array
# all element values for first variable, then for second, ...
for ivar = 0:n_variables-1
data[element + ivar * n_elements] = u_mean[ivar+1]
end
end

return nothing
end
4 changes: 3 additions & 1 deletion examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
set ( EXAMPLES
simple_trixi_controller.c
simple_trixi_controller.f90 )
simple_trixi_controller.f90
trixi_controller_data.c
trixi_controller_data.f90 )


foreach ( EXAMPLE ${EXAMPLES} )
Expand Down
64 changes: 64 additions & 0 deletions examples/trixi_controller_data.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
#include <stdio.h>
#include <stdlib.h>

#include <trixi.h>

int main ( int argc, char *argv[] ) {

if ( argc < 2 ) {
fprintf(stderr, "ERROR: missing arguments: PROJECT_DIR LIBELIXIR_PATH\n\n");
fprintf(stderr, "usage: %s PROJECT_DIR LIBELIXIR_PATH\n", argv[0]);
return 2;
} else if ( argc < 3 ) {
fprintf(stderr, "ERROR: missing argument: LIBELIXIR_PATH\n\n");
fprintf(stderr, "usage: %s PROJECT_DIR LIBELIXIR_PATH\n", argv[0]);
return 2;
}

// Initialize Trixi
printf("\n*** Trixi controller *** Initialize Trixi\n");
trixi_initialize( argv[1], NULL );

// Set up the Trixi simulation
// We get a handle to use subsequently
printf("\n*** Trixi controller *** Set up Trixi simulation\n");
int handle = trixi_initialize_simulation( argv[2] );

// Main loop
printf("\n*** Trixi controller *** Entering main loop\n");
while ( !trixi_is_finished( handle ) ) {

trixi_step( handle );
}

// get number of elements
int nelements = trixi_nelements( handle );
printf("\n*** Trixi controller *** nelements %d\n", nelements);

// get number of variables
int nvariables = trixi_nvariables( handle );
printf("\n*** Trixi controller *** nvariables %d\n", nvariables);

// allocate memory
double* data = malloc( sizeof(double) * nelements * nvariables );

// get averaged cell values for each variable
trixi_load_cell_averages(data, handle);

// compute temperature
const double gas_constant = 0.287;

for (int i = 0; i < nelements; ++i) {
printf("T[cell %3d] = %f\n", i, data[i+3*nelements] / (gas_constant * data[i]) );
}

// Finalize Trixi simulation
printf("\n*** Trixi controller *** Finalize Trixi simulation\n");
trixi_finalize_simulation( handle );

// Finalize Trixi
printf("\n*** Trixi controller *** Finalize Trixi\n");
trixi_finalize();

return 0;
}
78 changes: 78 additions & 0 deletions examples/trixi_controller_data.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
program simple_trixi_controller_f
use LibTrixi
use, intrinsic :: iso_fortran_env, only: error_unit
use, intrinsic :: iso_c_binding, only: c_int, c_double

implicit none

integer(c_int) :: handle, nelements, nvariables, i
character(len=256) :: argument
integer, parameter :: dp = selected_real_kind(12)
real(dp), dimension(:), pointer :: data
real(c_double) :: gas_constant


if (command_argument_count() < 1) then
call get_command_argument(0, argument)
write(error_unit, '(a)') "ERROR: missing arguments: PROJECT_DIR LIBELIXIR_PATH"
write(error_unit, '(a)') ""
write(error_unit, '(3a)') "usage: ", trim(argument), " PROJECT_DIR LIBELIXIR_PATH"
stop 1
else if (command_argument_count() < 2) then
call get_command_argument(0, argument)
write(error_unit, '(a)') "ERROR: missing argument: LIBELIXIR_PATH"
write(error_unit, '(a)') ""
write(error_unit, '(3a)') "usage: ", trim(argument), " PROJECT_DIR LIBELIXIR_PATH"
stop 1
end if


! Initialize Trixi
call get_command_argument(1, argument)
call trixi_initialize(argument)

! Set up the Trixi simulation
! We get a handle to use subsequently
call get_command_argument(2, argument)
handle = trixi_initialize_simulation(argument)

! Main loop
do
! Exit loop once simulation is completed
if ( trixi_is_finished(handle) ) exit

call trixi_step(handle)
end do

! get number of elements
nelements = trixi_nelements(handle);
write(*, '(a,i6)') "*** Trixi controller *** nelements ", nelements
write(*, '(a)') ""

! get number of variables
nvariables = trixi_nvariables( handle );
write(*, '(a,i6)') "*** Trixi controller *** nvariables ", nvariables
write(*, '(a)') ""

! allocate memory
allocate ( data(nelements*nvariables) )

! get averaged cell values for each variable
call trixi_load_cell_averages(data, handle);

! compute temperature
gas_constant = 0.287;

do i = 1,nelements
print "('T[cell ', i4, '] = ', e14.8)", i, data(i+3*nelements)/(gas_constant*data(i))
end do

write(*, '(a,i6)') "*** Trixi controller *** Finalize Trixi simulation "
write(*, '(a)') ""

! Finalize Trixi simulation
call trixi_finalize_simulation(handle)

! Finalize Trixi
call trixi_finalize()
end program
Loading