2016-03-11 4 views
0

В настоящее время я конвертирую код fortran с f2py. Однако даже некоторые простые тесты вызовут ошибку malloc. Например:f2py triggers malloc error

! file name is simple.F90 
SUBROUTINE test(aout, ain, rank) 
    INTEGER :: rank 
    COMPLEX(kind=16) :: ain(rank, rank) 
    COMPLEX(kind=16), INTENT(out) :: aout(rank, rank) 
    print *, ain 
    aout = ain 
END SUBROUTINE test 

Я завернула этот код f2py -m simple -c simple.F90 и использовала его:

import simple 
import numpy as np 
ain = np.array([[1,0],[0,1]],dtype="complex") 
simple.test(ain,2) 

Выход довольно запутанный:

(2.98323129689261721470924741607413318E-4947,0.00000000000000000000000000000000000) (0.00000000000000000000000000000000000,2.98323129689261721470924741607413318E-4947) (5.43913343041483495234482095052061699E-4937,1.19445898260724927749750105155089048E-4946) (2.03058027046167518900674768173335535E-4945,5.42471021397611822645684765587671432E-4937) 
Python(9481,0x7fff7ad40000) malloc: \*** error for object 0x7fabcaa1adc8: incorrect checksum for freed object - object was probably modified after being freed. 
*** set a breakpoint in malloc_error_break to debug 
Abort trap: 6 

Fortran подпрограмма не получает правильный массив и что-то неправильно с памятью.

Дополнительная информация:

  • ОС: OS X
  • питон: 3.5.1
+0

Я думаю, что это должно быть 'kind = 8' not' kind = 16' (он указывает, чтобы указать точность каждой части комплексного числа). Однако я не знаю, вызывает ли это вашу ошибку. – DavidW

+1

На SO есть много ответов, в которых указывается, что номер вида является произвольным целочисленным значением. Когда дело доходит до комплексных чисел, почти наверняка, что число «16» НЕ отображает комплексное число с 2 8-байтовыми элементами. Тип комплексного числа такой же, как тип реального числа, способного представлять каждый компонент комплексного числа. т. е. если вы считаете, что комплексное число является 2-мя действиями 'kind = 3' (скажем), то это комплексное число должно также иметь' kind = 3'. –

+0

Обязательные ссылки http://stackoverflow.com/questions/838310/fortran-90-kind-parameter http://stackoverflow.com/questions/3170239/fortran-integer4-vs-integer4-vs-integerkind-4?lq= 1 Любой '(kind = number)' является запахом кода. Используйте именованные константы. Если вы опустите 'kind =', он все равно будет короче. –

ответ

0

Как все комментарии отметил, kind есть что быть обвинен здесь. Все проблемы решены после использования следующего соглашения.

INTEGER, PARAMETER :: dp = kind(1.0d0) 
REAL(kind=dp) :: a_real_number 
COMPLEX(kind=dp) :: a_complex_number