Loading graph_fortran_binding/graph_fortran_binding.f90 +101 −2 Original line number Diff line number Diff line Loading @@ -12,6 +12,10 @@ IMPLICIT NONE !> A null array for empty INTEGER(C_INTPTR_T), DIMENSION(0) :: graph_null_array !> A !------------------------------------------------------------------------------- !> @brief Class object for the binding. !------------------------------------------------------------------------------- Loading Loading @@ -69,6 +73,7 @@ piecewise_2D_cdouble PROCEDURE :: get_max_concurrency => graph_context_get_max_concurrency PROCEDURE :: set_device_number => graph_context_set_device_number PROCEDURE :: add_pre_item => graph_context_add_pre_item END TYPE !******************************************************************************* Loading Loading @@ -802,10 +807,66 @@ INTEGER(C_LONG), VALUE :: num END SUBROUTINE !------------------------------------------------------------------------------- !> @brief Add pre workflow item. !> !> @param[in] c The graph C context. !> @param[in] inputs Array of input nodes. !> @param[in] num_inputs Number of inputs. !> @param[in] outputs Array of output nodes. !> @param[in] num_outputs Number of outputs. !> @param[in] map_inputs Array of map input nodes. !> @param[in] map_outputs Array of map output nodes. !> @param[in] num_maps Number of maps. !> @param[in] random_state Optional random state, can be NULL if not used. !> @param[in] name Name for the kernel. !> @param[in] num_particles Number of elements to operate on. !------------------------------------------------------------------------------- SUBROUTINE graph_add_pre_item(c, inputs, num_inputs, & outputs, num_outputs, & map_inputs, map_outputs, num_maps, & random_state, name, num_particles) & BIND(C, NAME='graph_add_pre_item') USE, INTRINSIC :: ISO_C_BINDING IMPLICIT NONE TYPE(C_PTR), VALUE :: c INTEGER(C_INTPTR_T), VALUE :: inputs INTEGER(C_LONG), VALUE :: num_inputs INTEGER(C_INTPTR_T), VALUE :: outputs INTEGER(C_LONG), VALUE :: num_outputs INTEGER(C_INTPTR_T), VALUE :: map_inputs INTEGER(C_INTPTR_T), VALUE :: map_outputs INTEGER(C_LONG), VALUE :: num_maps TYPE(C_PTR), VALUE :: random_state CHARACTER(kind=C_CHAR), DIMENSION(*) :: name INTEGER(C_LONG), VALUE :: num_particles END SUBROUTINE END INTERFACE CONTAINS !******************************************************************************* ! Utilities !******************************************************************************* !------------------------------------------------------------------------------- !> @brief Convert a node to the pointer value. !> !> @return The pointer value. !------------------------------------------------------------------------------- FUNCTION graph_ptr(node) IMPLICIT NONE ! Declare Arguments INTEGER(C_INTPTR_T) :: graph_ptr TYPE(C_PTR), INTENT(IN) :: node ! Start of executable code. graph_ptr = TRANSFER(node, 0_C_INTPTR_T) END FUNCTION !******************************************************************************* ! CONSTRUCTION SUBROUTINES !******************************************************************************* Loading Loading @@ -1753,7 +1814,7 @@ !------------------------------------------------------------------------------- !> @brief Choose the device number. !> !> @param[in,out] c The graph C context. !> @param[in] this @ref graph_context instance. !> @param[in] num The device number. !------------------------------------------------------------------------------- SUBROUTINE graph_context_set_device_number(this, num) Loading @@ -1769,4 +1830,42 @@ END SUBROUTINE !------------------------------------------------------------------------------- !> @brief Add pre workflow item. !> !> @param[in,out] this @ref graph_context instance. !> @param[in] inputs Array of input nodes. !> @param[in] outputs Array of output nodes. !> @param[in] map_inputs Array of map input nodes. !> @param[in] map_outputs Array of map output nodes. !> @param[in] random_state Optional random state, can be NULL if not used. !> @param[in] name Name for the kernel. !> @param[in] num_particles Number of elements to operate on. !------------------------------------------------------------------------------- SUBROUTINE graph_context_add_pre_item(this, inputs, outputs, & map_inputs, map_outputs, & random_state, name, num_particles) IMPLICIT NONE ! Declare Arguments CLASS(graph_context), INTENT(INOUT) :: this INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: inputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: outputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_inputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_outputs TYPE(C_PTR), INTENT(IN) :: random_state CHARACTER(kind=C_CHAR,len=*), INTENT(IN) :: name INTEGER(C_LONG), INTENT(IN) :: num_particles ! Start of executable. CALL graph_add_pre_item(this%c_context, & LOC(inputs), INT(SIZE(inputs), KIND=C_LONG), & LOC(outputs), INT(SIZE(outputs), KIND=C_LONG), & LOC(map_inputs), LOC(map_outputs), & INT(SIZE(map_inputs), KIND=C_LONG), & random_state, name, num_particles) END SUBROUTINE END MODULE graph_tests/f_binding_test.f90 +98 −70 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state REAL(C_FLOAT), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -97,9 +98,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -107,26 +108,27 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ 2.0, 4.0, 6.0 /) Loading @@ -140,6 +142,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -172,6 +179,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state REAL(C_DOUBLE), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -190,9 +198,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -200,26 +208,27 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1, 0) = 1.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ 2.0, 4.0, 6.0 /) Loading @@ -233,6 +242,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -265,6 +279,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state COMPLEX(C_FLOAT_COMPLEX), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -283,9 +298,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -293,28 +308,29 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero), & 'Expected erfi(0) = 0.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /) Loading @@ -330,6 +346,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -362,6 +383,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -380,9 +402,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -390,28 +412,29 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero), & 'Expected erfi(0) = 0.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /) Loading @@ -427,6 +450,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading
graph_fortran_binding/graph_fortran_binding.f90 +101 −2 Original line number Diff line number Diff line Loading @@ -12,6 +12,10 @@ IMPLICIT NONE !> A null array for empty INTEGER(C_INTPTR_T), DIMENSION(0) :: graph_null_array !> A !------------------------------------------------------------------------------- !> @brief Class object for the binding. !------------------------------------------------------------------------------- Loading Loading @@ -69,6 +73,7 @@ piecewise_2D_cdouble PROCEDURE :: get_max_concurrency => graph_context_get_max_concurrency PROCEDURE :: set_device_number => graph_context_set_device_number PROCEDURE :: add_pre_item => graph_context_add_pre_item END TYPE !******************************************************************************* Loading Loading @@ -802,10 +807,66 @@ INTEGER(C_LONG), VALUE :: num END SUBROUTINE !------------------------------------------------------------------------------- !> @brief Add pre workflow item. !> !> @param[in] c The graph C context. !> @param[in] inputs Array of input nodes. !> @param[in] num_inputs Number of inputs. !> @param[in] outputs Array of output nodes. !> @param[in] num_outputs Number of outputs. !> @param[in] map_inputs Array of map input nodes. !> @param[in] map_outputs Array of map output nodes. !> @param[in] num_maps Number of maps. !> @param[in] random_state Optional random state, can be NULL if not used. !> @param[in] name Name for the kernel. !> @param[in] num_particles Number of elements to operate on. !------------------------------------------------------------------------------- SUBROUTINE graph_add_pre_item(c, inputs, num_inputs, & outputs, num_outputs, & map_inputs, map_outputs, num_maps, & random_state, name, num_particles) & BIND(C, NAME='graph_add_pre_item') USE, INTRINSIC :: ISO_C_BINDING IMPLICIT NONE TYPE(C_PTR), VALUE :: c INTEGER(C_INTPTR_T), VALUE :: inputs INTEGER(C_LONG), VALUE :: num_inputs INTEGER(C_INTPTR_T), VALUE :: outputs INTEGER(C_LONG), VALUE :: num_outputs INTEGER(C_INTPTR_T), VALUE :: map_inputs INTEGER(C_INTPTR_T), VALUE :: map_outputs INTEGER(C_LONG), VALUE :: num_maps TYPE(C_PTR), VALUE :: random_state CHARACTER(kind=C_CHAR), DIMENSION(*) :: name INTEGER(C_LONG), VALUE :: num_particles END SUBROUTINE END INTERFACE CONTAINS !******************************************************************************* ! Utilities !******************************************************************************* !------------------------------------------------------------------------------- !> @brief Convert a node to the pointer value. !> !> @return The pointer value. !------------------------------------------------------------------------------- FUNCTION graph_ptr(node) IMPLICIT NONE ! Declare Arguments INTEGER(C_INTPTR_T) :: graph_ptr TYPE(C_PTR), INTENT(IN) :: node ! Start of executable code. graph_ptr = TRANSFER(node, 0_C_INTPTR_T) END FUNCTION !******************************************************************************* ! CONSTRUCTION SUBROUTINES !******************************************************************************* Loading Loading @@ -1753,7 +1814,7 @@ !------------------------------------------------------------------------------- !> @brief Choose the device number. !> !> @param[in,out] c The graph C context. !> @param[in] this @ref graph_context instance. !> @param[in] num The device number. !------------------------------------------------------------------------------- SUBROUTINE graph_context_set_device_number(this, num) Loading @@ -1769,4 +1830,42 @@ END SUBROUTINE !------------------------------------------------------------------------------- !> @brief Add pre workflow item. !> !> @param[in,out] this @ref graph_context instance. !> @param[in] inputs Array of input nodes. !> @param[in] outputs Array of output nodes. !> @param[in] map_inputs Array of map input nodes. !> @param[in] map_outputs Array of map output nodes. !> @param[in] random_state Optional random state, can be NULL if not used. !> @param[in] name Name for the kernel. !> @param[in] num_particles Number of elements to operate on. !------------------------------------------------------------------------------- SUBROUTINE graph_context_add_pre_item(this, inputs, outputs, & map_inputs, map_outputs, & random_state, name, num_particles) IMPLICIT NONE ! Declare Arguments CLASS(graph_context), INTENT(INOUT) :: this INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: inputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: outputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_inputs INTEGER(C_INTPTR_T), DIMENSION(:), INTENT(IN) :: map_outputs TYPE(C_PTR), INTENT(IN) :: random_state CHARACTER(kind=C_CHAR,len=*), INTENT(IN) :: name INTEGER(C_LONG), INTENT(IN) :: num_particles ! Start of executable. CALL graph_add_pre_item(this%c_context, & LOC(inputs), INT(SIZE(inputs), KIND=C_LONG), & LOC(outputs), INT(SIZE(outputs), KIND=C_LONG), & LOC(map_inputs), LOC(map_outputs), & INT(SIZE(map_inputs), KIND=C_LONG), & random_state, name, num_particles) END SUBROUTINE END MODULE
graph_tests/f_binding_test.f90 +98 −70 Original line number Diff line number Diff line Loading @@ -79,6 +79,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state REAL(C_FLOAT), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -97,9 +98,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -107,26 +108,27 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ 2.0, 4.0, 6.0 /) Loading @@ -140,6 +142,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -172,6 +179,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state REAL(C_DOUBLE), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -190,9 +198,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -200,26 +208,27 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1, 0) = 1.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ 2.0, 4.0, 6.0 /) Loading @@ -233,6 +242,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -265,6 +279,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state COMPLEX(C_FLOAT_COMPLEX), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -283,9 +298,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -293,28 +308,29 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero), & 'Expected erfi(0) = 0.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /) Loading @@ -330,6 +346,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE Loading Loading @@ -362,6 +383,7 @@ TYPE(C_PTR) :: zero INTEGER(C_LONG) :: size TYPE(C_PTR) :: rand TYPE(C_PTR) :: state COMPLEX(C_DOUBLE_COMPLEX), DIMENSION(3) :: buffer1D TYPE(C_PTR) :: p1 TYPE(C_PTR) :: i Loading @@ -380,9 +402,9 @@ CALL graph%set_variable(x, value) px = graph%pseudo_variable(x) CALL assert(TRANSFER(px, 0) .ne. TRANSFER(x, 0), & CALL assert(graph_ptr(px) .ne. graph_ptr(x), & 'Expected different nodes.') CALL assert(TRANSFER(graph%remove_pseudo(px), 0) .eq. TRANSFER(x, 0), & CALL assert(graph_ptr(graph%remove_pseudo(px)) .eq. graph_ptr(x), & 'Remove pseudo failed.') y = graph%add(graph%mul(m, x), b) Loading @@ -390,28 +412,29 @@ one = graph%constant(1.0_C_DOUBLE) zero = graph%constant(0.0_C_DOUBLE) CALL assert(TRANSFER(graph%sub(one, one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sub(one, one)) .eq. graph_ptr(zero), & 'Expected 1 - 1 = 0.') CALL assert(TRANSFER(graph%div(one, one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%div(one, one)) .eq. graph_ptr(one), & 'Expected 1/1 = 1.') CALL assert(TRANSFER(graph%sqrt(one), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%sqrt(one)) .eq. graph_ptr(one), & 'Expected sqrt(1) = 1.') CALL assert(TRANSFER(graph%exp(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%exp(zero)) .eq. graph_ptr(one), & 'Expected exp(0) = 1.') CALL assert(TRANSFER(graph%log(one), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%log(one)) .eq. graph_ptr(zero), & 'Expected log(1) = 0.') CALL assert(TRANSFER(graph%pow(one, zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%pow(one, zero)) .eq. graph_ptr(one), & 'Expected pow(1,0) = 1.') CALL assert(TRANSFER(graph%erfi(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%erfi(zero)) .eq. graph_ptr(zero), & 'Expected erfi(0) = 0.') CALL assert(TRANSFER(graph%sin(zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%sin(zero)) .eq. graph_ptr(zero), & 'Expected sin(0) = 0.') CALL assert(TRANSFER(graph%cos(zero), 0) .eq. TRANSFER(one, 0), & CALL assert(graph_ptr(graph%cos(zero)) .eq. graph_ptr(one), & 'Expected cos(0) = 1.') CALL assert(TRANSFER(graph%atan(one, zero), 0) .eq. TRANSFER(zero, 0), & CALL assert(graph_ptr(graph%atan(one, zero)) .eq. graph_ptr(zero), & 'Expected atan(one, zero) = zero.') rand = graph%random(graph%random_state(0)) state = graph%random_state(0) rand = graph%random(state) i = graph%variable(1_C_LONG, 'i' // C_NULL_CHAR) buffer1D = (/ CMPLX(2.0, 0.0), CMPLX(4.0, 0.0), CMPLX(6.0, 0.0) /) Loading @@ -427,6 +450,11 @@ CALL graph%set_device_number(graph%get_max_concurrency() - 1) CALL graph%add_pre_item(graph_null_array, (/ graph_ptr(rand) /), & graph_null_array, graph_null_array, state, & 'c_binding_pre_kernel' // C_NULL_CHAR, & 1_C_LONG) DEALLOCATE(graph) END SUBROUTINE