just sharing/archiving. fortran wrapper: ! lapdog.so ! f95 -shared -o lapdog.so types.o constants.o utils.o lapack.o linalg.o lapdog.o -llapack module lapdog use linalg, only: solve ! https://github.com/certik/fortran-utils use iso_c_binding, only: c_int, c_double implicit none contains subroutine solver(n,a,b,x) bind(c) integer(c_int), intent(in) :: n real(c_double), intent(in) :: a(n,n) real(c_double), intent(in) :: b(n) real(c_double), intent(out) :: x(n) x = solve(a,b) end subroutine solver end module lapdog
nim test program: # test.nim # nim c test.nim const N = 3 type m1 = array[1..N, float64] m2 = array[1..N, m1] proc solver(n: ptr int; a: m2; b: m1; x: var m1) {. dynlib: "./lapdog.so", importc .} when isMainModule: # solve for x, y, z where: # 1) 1x + 1y − 1z = 4 # 2) 1x − 2y + 3z = −6 # 3) 2x + 3y + 1z = 7 var n: int = N A: m2 B: m1 X: m1 A[1][1] = 1 A[1][2] = 1 A[1][3] = 2 A[2][1] = 1 A[2][2] = -2 A[2][3] = 3 A[3][1] = -1 A[3][2] = 3 A[3][3] = 1 B[1] = 4 B[2] = -6 B[3] = 7 solver(n.addr(),A,B,X) for i in 1..N: echo X[i]