Hi,

I can not answer the first part of the question, about the initial value.

But for the second part, because in SPAD, the COMPLEX is
represented as
    Rep := Record(real : R, imag : R)
which is essentially a Common Lisp cons pair, so you can do this directly:

testfun(xx) == TESTFUN(xx :: DoubleFloat)$Lisp pretend Complex(DoubleFloat)

AND use "(cons repart impart)" instead of "(complex repart impart)".

- Qian

On 4/13/21 9:03 AM, Tobias Neumann wrote:
I've noticed that FriCAS doesn't have a numerical implementation of polylog's yet. So I will have to interface some C/Fortran code. For that I have constructed a small
example:

test.c:
void testfun(double arg, double* realpart, double* imagpart)
{
     *realpart = 1.0 * arg;
     *imagpart = 3.14 * arg;
     return;
}
gcc -shared -o libtest.so test.c

test.lsp:
(sb-alien:load-shared-object "./libtest.so")
(defun testfun (arg)
    (sb-alien:with-alien ((repart (double-float) 0.0d0) (impart (double-float) 0.0d0))
         (sb-alien:alien-funcall
          (sb-alien:extern-alien "testfun" (sb-alien:function sb-alien:void (double-float) (* double-float) (* double-float)))
           arg (sb-alien:addr repart) (sb-alien:addr impart)
          )
         (complex repart impart)
     )
)

And I can successfully use that function within sbcl:
sbcl --load "test.lsp"
(testfun 10.0d0)
#C(10.0d0 31.400000000000002d0)

Within FriCAS I ran ")lisp (load "test.lsp")" and it
seems to parse/load the file successfully, but I can't directly use that function, i.e.  (testfun 10.0d0) within ")fin", and neither from within FriCAS as TESTFUN(1$DoubleFloat)$Lisp:

debugger invoked on a TYPE-ERROR in thread
#<THREAD "main thread" RUNNING {1002410103}>:
   The value
     0.0d0
   is not of type
     (SB-ALIEN:ALIEN (* T))
   from the function type declaration.

As it turns out, somehow I can not give it an initial value here, and I just have to declare it with (repart (double-float)), which is fine, but I am wondering why.

The final step for me is to convert the SExpression into a FriCAS Complex(DoubleFloat). For that I looked into the SExpression domain, and it seems to be easiest to instead return (list repart impart) and then have something like:

testfun(xx) ==
     res := TESTFUN(xx :: DoubleFloat)$Lisp
     complex(float car res, float car cdr res)

Presumably I could convert this into Complex(DoubleFloat) within the Lisp code directly with some SPADCALL calls? But the current way seems to be perfectly fine, but I am wondering if this is the right/recommended way to do it. Overall I'm really happy how easy this turned out to be.

Thanks,
Tobias

--
You received this message because you are subscribed to the Google Groups "FriCAS - computer algebra system" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected] <mailto:[email protected]>. To view this discussion on the web visit https://groups.google.com/d/msgid/fricas-devel/5eb8ad23-5c3e-4b0b-8810-9cccdc42d999n%40googlegroups.com <https://groups.google.com/d/msgid/fricas-devel/5eb8ad23-5c3e-4b0b-8810-9cccdc42d999n%40googlegroups.com?utm_medium=email&utm_source=footer>.

--
You received this message because you are subscribed to the Google Groups "FriCAS - 
computer algebra system" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/fricas-devel/03201ed2-80eb-d1e7-6c27-0d6094ee45d9%40gmail.com.

Reply via email to