terminat0r
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Хорошо, объясню проблему. программа на довольно таки тяжелой смеси C и Cpp юзер-функция в принципе тоже на С но могу написать обертку на фортране если надо юзер-функции как принято в C лол, через void бросается уродливая структура с кучей параметров. Я к этому должен прикрутить ODEPACK как либу и вместо ODE решателя с GSL (перепробовал все сольверы ни один не справляется ) использовать lsoda или lsodar (это опционально - я уже наперед мечтаю) В сети есть несколько версий lsoda на С но переводили какие-то недалекие люди мягко говоря - изуродовали интерфейсы, выбросили возможность задать свой якобиан, зашили параметры по дефолту и тд odepack я брал этот http://people.sc.fsu.edu/~jburkardt/f77_src/odepack/odepack.html Код: SUBROUTINE DLSODA (F, NEQ, Y, T, TOUT, ITOL, RTOL, ATOL, ITASK, 1 ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, JT) EXTERNAL F, JAC INTEGER NEQ, ITOL, ITASK, ISTATE, IOPT, LRW, IWORK, LIW, JT DOUBLE PRECISION Y, T, TOUT, RTOL, ATOL, RWORK DIMENSION NEQ(*), Y(*), RTOL(*), ATOL(*), RWORK(LRW), IWORK(LIW) SUBROUTINE DLSODAR (F, NEQ, Y, T, TOUT, ITOL, RTOL, ATOL, ITASK, 1 ISTATE, IOPT, RWORK, LRW, IWORK, LIW, JAC, JT, 2 G, NG, JROOT) EXTERNAL F, JAC, G INTEGER NEQ, ITOL, ITASK, ISTATE, IOPT, LRW, IWORK, LIW, JT, 1 NG, JROOT DOUBLE PRECISION Y, T, TOUT, RTOL, ATOL, RWORK DIMENSION NEQ(*), Y(*), RTOL(*), ATOL(*), RWORK(LRW), IWORK(LIW), 1 JROOT(NG) SUBROUTINE F (NEQ, T, Y, YDOT) DOUBLE PRECISION T, Y(*), YDOT(*) C which supplies the vector function f by loading YDOT(i) with f(i). | но на С эта юзер функция была такой Код: int f(double t, const double x[], double dxdt[], void *params) | neq не критично - переделаю - а вот как мне этот кусок void-а через dlsoda пропихнуть? Это та самая структура |