Skip to content

cwrapper module [WIP] #5

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
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
32 changes: 32 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dll

# Fortran module files
*.mod
*.smod

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.exe
*.out
*.app
6 changes: 6 additions & 0 deletions src/build_script.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
fypp symengine_cwrapper.fypp symengine_cwrapper.f90
fypp symengine.fypp symengine.f90
gfortran -Wall -c symengine_cwrapper.f90
gfortran -Wall -c symengine.f90
gfortran -Wall -c test_symengine.f90
gfortran -o test_symengine -I/usr/local/include/symengine symengine_cwrapper.o symengine.o test_symengine.o -L/usr/local/lib -lsymengine -lteuchos -lstdc++ -lmpfr -lgmp -lbfd -lLLVM-6.0
1,484 changes: 1,484 additions & 0 deletions src/symengine_cwrapper.fypp

Large diffs are not rendered by default.

84 changes: 84 additions & 0 deletions src/test_symengine.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
module small_test

use symengine_cwrapper
use iso_c_binding

implicit none

contains

function c_char_ptr_to_fstring(c_char_ptr) result(fc)
type(c_ptr) :: c_char_ptr
character(len=:,kind=c_char), allocatable :: fc
character(len=1000,kind=c_char), pointer :: f_string

if (.not. c_associated(c_char_ptr)) then
fc = ""
else
call c_f_pointer(c_char_ptr,f_string)
fc = f_string(1:index(f_string,c_null_char))
end if
end function

subroutine f(i)

integer(c_long), intent(in) :: i

type(c_ptr) :: s = c_null_ptr ! string

type(c_ptr) :: x = c_null_ptr
type(c_ptr) :: y = c_null_ptr
type(c_ptr) :: e = c_null_ptr
type(c_ptr) :: n = c_null_ptr

type(c_ptr) :: exception = c_null_ptr

write(*,'(A)') c_char_ptr_to_fstring(ascii_art_str())
write(*,'(A)') "Symengine version: "//c_char_ptr_to_fstring(symengine_version())
write(*,*)

call basic_new_stack(x)
call basic_new_stack(y)
call basic_new_stack(e)
call basic_new_stack(n)

exception = symbol_set(x,"x"//c_null_char)
exception = symbol_set(y,"y"//c_null_char)

exception = integer_set_si(n, i);
exception = basic_mul(e, n, x);
exception = basic_add(e, e, y);

s = basic_str(e)
print *, "Result: ", c_char_ptr_to_fstring(s)
call basic_str_free(s)
s = c_null_ptr

print *, c_associated(s), c_char_ptr_to_fstring(s)

exception = basic_parse(e,"3*x**2 + 4*y + 5*a"//c_null_char)
s = basic_str(e)
print *, "Result: ", c_char_ptr_to_fstring(s), c_associated(exception)
exception = basic_diff(s=e,expr=e,sym=x)
s = basic_str(e)
print *, "Result: ", c_char_ptr_to_fstring(s), c_associated(exception)

call basic_free_stack(x)
call basic_free_stack(y)
call basic_free_stack(e)
call basic_free_stack(n)

end subroutine

end module

program small_test_driver

use small_test
use iso_c_binding

implicit none

call f(5_c_long)

end program