From 4277e9fd3a90db389010274ab9bd200dee1e85ea Mon Sep 17 00:00:00 2001 From: Michael Schlottke-Lakemper Date: Thu, 6 Jul 2023 11:32:48 +0200 Subject: [PATCH 1/2] Provide convenience methods for Fortran interface --- examples/simple_trixi_controller.f90 | 9 +++++--- src/trixi.f90 | 34 ++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/examples/simple_trixi_controller.f90 b/examples/simple_trixi_controller.f90 index 604fcdf6..85b312fc 100644 --- a/examples/simple_trixi_controller.f90 +++ b/examples/simple_trixi_controller.f90 @@ -25,18 +25,21 @@ program simple_trixi_controller_f ! Initialize Trixi call get_command_argument(1, argument) - call trixi_initialize(trim(argument) // c_null_char) + 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(trim(argument) // c_null_char) + handle = trixi_initialize_simulation(argument) ! Get time step length write(*, '(a, e14.8)') "Current time step length: ", trixi_calculate_dt(handle) ! Main loop - do while ( trixi_is_finished(handle) == 0 ) + do + ! Exit loop once simulation is completed + if ( trixi_is_finished(handle) ) exit + call trixi_step(handle) end do diff --git a/src/trixi.f90 b/src/trixi.f90 index 60030c91..909a36d3 100644 --- a/src/trixi.f90 +++ b/src/trixi.f90 @@ -2,14 +2,14 @@ module LibTrixi implicit none interface - subroutine trixi_initialize(project_directory) bind(c) + subroutine trixi_initialize_c(project_directory) bind(c, name='trixi_initialize') use, intrinsic :: iso_c_binding, only: c_char - character(kind=c_char), intent(in) :: project_directory(*) + character(kind=c_char), dimension(*), intent(in) :: project_directory end subroutine - integer(c_int) function trixi_initialize_simulation(libelixir) bind(c) + integer(c_int) function trixi_initialize_simulation_c(libelixir) bind(c, name='trixi_initialize_simulation') use, intrinsic :: iso_c_binding, only: c_char, c_int - character(kind=c_char), intent(in) :: libelixir(*) + character(kind=c_char), dimension(*), intent(in) :: libelixir end function real(c_double) function trixi_calculate_dt(handle) bind(c) @@ -17,7 +17,7 @@ real(c_double) function trixi_calculate_dt(handle) bind(c) integer(c_int), value, intent(in) :: handle end function - integer(c_int) function trixi_is_finished(handle) bind(c) + integer(c_int) function trixi_is_finished_c(handle) bind(c, name='trixi_is_finished') use, intrinsic :: iso_c_binding, only: c_int integer(c_int), value, intent(in) :: handle end function @@ -40,4 +40,28 @@ subroutine julia_eval_string(code) bind(c) character(kind=c_char), intent(in) :: code(*) end subroutine end interface + + contains + + logical function trixi_is_finished(handle) + use, intrinsic :: iso_c_binding, only: c_int + integer(c_int), intent(in) :: handle + + trixi_is_finished = trixi_is_finished_c(handle) == 1 + end function + + subroutine trixi_initialize(project_directory) + use, intrinsic :: iso_c_binding, only: c_null_char + character(len=*), intent(in) :: project_directory + + call trixi_initialize_c(trim(adjustl(project_directory)) // c_null_char) + end subroutine + + integer(c_int) function trixi_initialize_simulation(libelixir) + use, intrinsic :: iso_c_binding, only: c_int, c_null_char + character(len=*), intent(in) :: libelixir + + trixi_initialize_simulation = trixi_initialize_simulation_c(trim(adjustl(libelixir)) // c_null_char) + end function + end module From f4dcda41307edbb79a7d41c310f2be888068b4ea Mon Sep 17 00:00:00 2001 From: Michael Schlottke-Lakemper Date: Thu, 6 Jul 2023 11:43:22 +0200 Subject: [PATCH 2/2] Make `julia_eval_string` more convenient as well --- src/trixi.f90 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/trixi.f90 b/src/trixi.f90 index 909a36d3..a9506ce6 100644 --- a/src/trixi.f90 +++ b/src/trixi.f90 @@ -35,9 +35,9 @@ subroutine trixi_finalize_simulation(handle) bind(c) subroutine trixi_finalize() bind(c) end subroutine - subroutine julia_eval_string(code) bind(c) + subroutine julia_eval_string_c(code) bind(c, name='julia_eval_string') use, intrinsic :: iso_c_binding, only: c_char - character(kind=c_char), intent(in) :: code(*) + character(kind=c_char), dimension(*), intent(in) :: code end subroutine end interface @@ -64,4 +64,10 @@ integer(c_int) function trixi_initialize_simulation(libelixir) trixi_initialize_simulation = trixi_initialize_simulation_c(trim(adjustl(libelixir)) // c_null_char) end function + subroutine julia_eval_string(code) + use, intrinsic :: iso_c_binding, only: c_null_char + character(len=*), intent(in) :: code + + call julia_eval_string_c(trim(adjustl(code)) // c_null_char) + end subroutine end module