gpt4 book ai didi

python - 从 Fortran/C 调用 Python 函数

转载 作者:行者123 更新时间:2023-11-28 18:33:47 26 4
gpt4 key购买 nike

我正在编写 Fortran 代码,我想使用 Python 库中的一些特殊函数和方法。这是一段 Python 代码:

from mpmath import *
from scipy.optimize import *

def g(A,B,t):
return newton(lambda x: (x - A*polylog(1.5, B*exp(-t*x))), 0.0)

在 Fortran 代码中,我想传递实数值 A、B、t 并返回 g(A,B,t) 的值(可能是复数)。这也可以在 C 中完成。

我想提一下,将 Python 与其他语言混合使用对我来说是一件新鲜事。

最佳答案

解决方案

如果有人感兴趣,我已经解决了这个问题。以下内容很有帮助:stackoverflowyolinux .

rootC.c

#include "rootC.h"
#include <Python.h>
#include <stdlib.h>

void Initialize ()
{
Py_Initialize();
}

void Finalize ()
{
Py_Finalize();
}

void root_(double* A, double* B, double* t, double* x)
{
PyObject *pName, *pModule, *pFunc;
PyObject *pArgs, *pValue, *sys, *path;
static int i;

if (i == 0)
{
++i;
Initialize();
atexit(Finalize);
}

sys = PyImport_ImportModule("sys");
path = PyObject_GetAttrString(sys, "path");
PyList_Append(path, PyString_FromString("."));

pName = PyString_FromString("rootPY");
pModule = PyImport_Import(pName);

if (!pModule)
{
PyErr_Print();
printf("ERROR in pModule\n");
exit(1);
}

pFunc = PyObject_GetAttrString(pModule, "root");
pArgs = PyTuple_New(3);
PyTuple_SetItem(pArgs, 0, PyFloat_FromDouble((*A)));
PyTuple_SetItem(pArgs, 1, PyFloat_FromDouble((*B)));
PyTuple_SetItem(pArgs, 2, PyFloat_FromDouble((*t)));

pValue = PyObject_CallObject(pFunc, pArgs);
*x = PyFloat_AsDouble(pValue);
}

rootC.h

#ifndef ROOT_H_
#define ROOT_H_

void Initialize();
void Finalize();
void root_(double*, double*, double*, double*);

#endif

rootPY.py

from mpmath import polylog, exp
from scipy.optimize import newton

def root(A,B,t):
return abs(newton(lambda x: (x - A*polylog(1.5, B*exp(-t*x))), 0.0))

rootF.F90

program main
implicit none
real*8 A, B, t, x
A = 0.4d0
B = 0.3d0
t = 0.1d0

call root(A,B,t,x)

write(*,*) x

end program main

ma​​in.c

#include "rootC.h"
#include <stdio.h>

int main()
{
double A = 0.4, B = 0.3, t = 0.1, x = 0.0;

root_(&A,&B,&t,&x);

printf("A = %f, B = %f, t = %f\n", A, B, t);

printf("x = %.15f\n", x);

return 0;
}

生成文件

CC = gcc
FC = gfortran
CFLAGS = -I/usr/include/python2.7
LFLAGS = -L/usr/local/lib -lpython2.7 -lm

.PHONY: all clean

all: rootF main

rootF: rootF.o rootC.o
$(FC) $^ -o $@ $(LFLAGS)

rootF.o: rootF.F90
$(FC) -c $< -o $@

main: main.o rootC.o
$(CC) $^ -o $@ $(LFLAGS)

main.o: main.c
$(CC) $(CFLAGS) -c $< -o $@

rootC.o: rootC.c
$(CC) $(CFLAGS) -c $< -o $@

clean:
rm -f *.o

关于python - 从 Fortran/C 调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34355191/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com