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.