diff --git a/fortran_examples/test_n2.F90 b/fortran_examples/test_n2.F90 new file mode 100644 index 0000000000000000000000000000000000000000..10b0c1bb270e411f9c27ba0e16c6302a26703132 --- /dev/null +++ b/fortran_examples/test_n2.F90 @@ -0,0 +1,174 @@ +!******************************************************************************* +!* This file is part of QuickSched. +! * Coypright (c) 2017 Aidan Chalk (aidan.chalk@stfc.ac.uk) +! * +! * This program is free software: you can redistribute it and/or modify +! * it under the terms of the GNU Lesser General Public License as published +! * by the Free Software Foundation, either version 3 of the License, or +! * (at your option) any later version. +! * +! * This program is distributed in the hope that it will be useful, +! * but WITHOUT ANY WARRANTY; without even the implied warranty of +! * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +! * GNU General Public License for more details. +! * +! * You should have received a copy of the GNU Lesser General Public License +! * along with this program. If not, see <http://www.gnu.org/licenses/>. +! * +! ******************************************************************************/ + +Module parts +Use, Intrinsic :: ISO_C_BINDING +Implicit None + + Integer, Parameter :: sp = Selected_Real_Kind(6,37) ! single real + Integer, Parameter :: dp = Selected_Real_Kind(15,307) ! double real + Integer(Kind=C_INT), Parameter :: type_self=1, type_pair=2 + +Type Cell + +Real(Kind=dp), dimension(:), Allocatable :: fx, fy, fz, dx, dy, dz +Integer :: num_parts + + + +End Type Cell + +Type(Cell), Dimension(:), Allocatable :: cells + +Contains + +Subroutine Interact_single(cell_i) +Integer :: i,j + +End Subroutine + +Subroutine Interact(cell_i, cell_j) + +Integer, Intent(in) :: cell_i, cell_j + +Integer :: i, j +Real(Kind=dp) :: xx, yy, zz, r, f, ir, ir6, ir12, fxx, fyy, fzz, fix, fiy, fiz + + + +do i=1,cells(cell_i)%num_parts + fix = 0.0_dp + fiy = 0.0_dp + fiz = 0.0_dp + do j=1, cells(cell_j)%num_parts + + xx = cells(cell_i)%dx(i) - cells(cell_j)%dx(j) + yy = cells(cell_i)%dy(i) - cells(cell_j)%dy(j) + zz = cells(cell_i)%dz(i) - cells(cell_j)%dz(j) + + r = xx*xx + yy*yy + zz*zz + r = sqrt(r) + ir = 0.1_dp/r + ir6 = ir*ir + ir6 = ir6*ir6*ir6 + ir12 = ir6*ir6 + + f = 4.0_dp* (ir12-ir6) + fxx = f * xx + fyy = f * yy + fzz = f * zz + + fix = fix + fxx + fiy = fiy + fyy + fiz = fiz + fzz + + cells(cell_j)%fx(j) = cells(cell_j)%fx(j) - fxx + cells(cell_j)%fy(j) = cells(cell_j)%fy(j) - fyy + cells(cell_j)%fz(j) = cells(cell_j)%fz(j) - fzz + end do + cells(cell_i)%fx(i) = cells(cell_i)%fx(i) + fix + cells(cell_i)%fy(i) = cells(cell_i)%fy(i) + fiy + cells(cell_i)%fz(i) = cells(cell_i)%fz(i) + fiz +end do + +End Subroutine + +Subroutine init_cells(cell_num, count) +Integer, Intent(in) :: cell_num, count + +Allocate(cells(cell_num)%fx(1:count)) +Allocate(cells(cell_num)%fy(1:count)) +Allocate(cells(cell_num)%fz(1:count)) +Allocate(cells(cell_num)%dx(1:count)) +Allocate(cells(cell_num)%dy(1:count)) +Allocate(cells(cell_num)%dz(1:count)) + +cells(cell_num)%fx = 0.0_dp +cells(cell_num)%fy = 0.0_dp +cells(cell_num)%fz = 0.0_dp + +Call Random_Number(cells(cell_num)%dx) +Call Random_Number(cells(cell_num)%dy) +Call Random_Number(cells(cell_num)%dz) + +dx = dx * 10.0_dp +dy = dy * 10.0_dp +dz = dz * 10.0_dp + +End Subroutine init_cells + +Subroutine runner(typ, data) BIND(C) +Use, Intrinsic :: ISO_C_BINDING +Use quicksched +Implicit None + +Integer(Kind=C_INT), VALUE :: typ +Type(C_PTR), VALUE :: data +Integer(Kind=C_INT), Pointer :: c(:) + +call c_f_pointer(data, c, [2]) + +If(typ == type_self) then + +else +call Interact(c(1), c(2)) +end if + +End Subroutine runner + +End Module parts + + +Program main +Use, Intrinsic :: ISO_C_BINDING +Use quicksched +Use parts +Implicit None +Integer(Kind=C_INT) :: i,j, temp +Type(C_PTR) :: sched +Integer(Kind=C_INT), Target :: data(0:10) +Type(C_PTR) :: dta_ptr +Integer(Kind=C_INT), Dimension(1:1000) :: cell_res + +Allocate(cells(1:1000)) +do i = 1, 1000 + call cell_init(i, 1000) +end do + +sched = f_qsched_create() +call qsched_init(qsched, 24, 0) + +do i=1, 1000 + cell_res(i) = qsched_addres(qsched, qsched_owner_none, qsched_res_none) +end do + +do i=1, 1000 + data + do j=i+1, 1000 + + end do +end do + + + + + + + +end Program