Kesalahan segmentasi menggunakan f2py

Ini adalah tindak lanjut dari pertanyaan yang saya ajukan di sini... Bagaimana cara mengalokasikan array input dengan f2py?

Saya telah mengerjakan ulang pertanyaan sebagai tanggapan terhadap komentar. Pertanyaan aslinya tidak jelas dan terlalu panjang. Lihat komentar 1 di bawah.

Saya mencoba menggunakan f2py untuk membungkus berbagai subrutin/fungsi fortran untuk membaca keluaran data dari berbagai kode fisika atom yang ditulis dalam fortran 77. Saya menggunakan distribusi python Anaconda (python 3.4 64 bit) di Ubuntu 14.04 (64 bit) dengan rangkaian kompiler gnu (gcc, gfortran, dll.)

Saya mengalami masalah saat mencoba melakukan praalokasi array dengan python. Pertanyaan awal saya berhubungan dengan pengalokasian array karakter. Ternyata saya salah bentuk. Saya telah memperbaikinya (menurut saya), dan sekarang saya menghadapi kesalahan segmentasi. Saya telah mengkompilasi subrutin fortran dengan f2py menggunakan flag --debug-capi untuk mengaktifkan pelaporan kesalahan verbose.

Ini adalah bagian relevan dari keluaran terminal yang saya dapatkan ketika saya menjalankan skrip python saya.

debug-capi:Python C/API function adf04_2py.xxdata_04(iunit,titled,iz,iz0,iz1,bwno,npl,bwnoa,lbseta,prtwta,cprta,il,qdorb,lqdorb,qdn,iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,nv,scef,itran,maxlev,tcode,i1a,i2a,aval,scom,beth,iadftyp,lprn,lcpl,lorb,lbeth,letyp,lptyp,lrtyp,lhtyp,lityp,lstyp,lltyp,itieactn,ltied,ndlev=len(ia),ndtrn=shape(tcode,0),ndmet=len(bwnoa),ndqdn=len(qdn),nvmax=len(scef))
debug-capi:int lltyp=:input,required,scalar
debug-capi:lltyp=0

        ####### omitted ##########

debug-capi:int ndmet=len(bwnoa):input,optional,scalar
debug-capi:ndmet=1
debug-capi:Checking `len(bwnoa)>=ndmet'
debug-capi:int ndqdn=len(qdn):input,optional,scalar
debug-capi:ndqdn=1
debug-capi:Checking `len(qdn)>=ndqdn'
debug-capi:int ndlev=len(ia):input,optional,scalar
debug-capi:ndlev=1
debug-capi:Checking `len(ia)>=ndlev'
debug-capi:int lqdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cprta=:input,required,array,string array,dims(ndmet|ndmet,9|9)
debug-capi:double prtwta=:input,required,array,dims(ndmet|ndmet)
debug-capi:double beth=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:string cstrga=:input,required,array,string array,dims(ndlev|ndlev,(*)|(*))
debug-capi:double zpla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:int ltied=:input,required,array,dims(ndlev|ndlev)
debug-capi:int npla=:input,required,array,dims(ndlev|ndlev)
debug-capi:int i2a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int lbseta=:input,required,array,dims(ndmet|ndmet)
debug-capi:int i1a=:input,required,array,dims(ndtrn|ndtrn)
debug-capi:int ila=:input,required,array,dims(ndlev|ndlev)
debug-capi:double scom=:input,required,array,dims(nvmax|nvmax,ndtrn|ndtrn)
debug-capi:double qdorb=:input,required,array,dims((ndqdn*(ndqdn+1))/2|(ndqdn*(ndqdn+1))/2)
debug-capi:string cpla=:input,required,array,string array,dims(ndlev|ndlev,1|1)
debug-capi:int isa=:input,required,array,dims(ndlev|ndlev)
debug-capi:double wa=:input,required,array,dims(ndlev|ndlev)
debug-capi:int ipla=:input,required,array,dims(ndmet|ndmet,ndlev|ndlev)
debug-capi:double xja=:input,required,array,dims(ndlev|ndlev)
debug-capi:Fortran subroutine `xxdata_04(&iunit,&ndlev,&ndtrn,&ndmet,&ndqdn,&nvmax,titled,&iz,&iz0,&iz1,&bwno,&npl,bwnoa,lbseta,prtwta,cprta,&il,qdorb,lqdorb,qdn,&iorb,ia,cstrga,isa,ila,xja,wa,cpla,npla,ipla,zpla,&nv,scef,&itran,&maxlev,tcode,i1a,i2a,aval,scom,beth,&iadftyp,&lprn,&lcpl,&lorb,&lbeth,&letyp,&lptyp,&lrtyp,&lhtyp,&lityp,&lstyp,&lltyp,&itieactn,ltied,slen(titled),flen(cstrga))'
Segmentation fault (core dumped)

Pertanyaan pertama saya adalah ini. Apakah mungkin untuk mengetahui dari keluaran debug apa yang segfaulted? Saya tidak mengerti caranya.

Sebagai pertanyaan kedua, jika Anda melihat di awal keluaran debug, Anda akan melihat sesuatu yang tampak seperti pemanggilan fungsi, yang menurut saya adalah python yang memanggil fungsi dari objek bersama. Di akhir keluaran debug Anda melihat sesuatu yang hampir sama, tetapi diberi label sebagai 'sub-rutin fortran'. Variabel dalam subrutin fortran tidak memiliki urutan yang sama dengan fungsi python. Objek bersama secara otomatis dibuat oleh f2py dari kode fortran asli. Adakah yang tahu mengapa variabel-variabel ini berada dalam urutan yang berbeda?

Terima kasih sebelumnya


person ivanarnold    schedule 10.02.2016    source sumber
comment
Harap berikan kode minimal dengan perilaku yang dapat direproduksi! Kami di sini bukan untuk membaca semua kode panjang Anda. Contoh dengan subrutin tunggal adalah yang terbaik.   -  person innoSPG    schedule 10.02.2016
comment
Tidak yakin mengapa hal itu pantas mendapat penolakan? Jika Anda telah membaca posting asli saya (yang tertaut di sini) Anda akan tahu bahwa tidak ada kode minimal dalam kasus ini. Kode fortran asli panjang, dan skrip python saya tersedia di pertanyaan awal yang diposting. Bagaimanapun, ini terutama merupakan pertanyaan tentang bagaimana menafsirkan keluaran debugging dari f2py, yang telah saya berikan. Saya hanya mencoba menghindari hal yang tak terhindarkan, silakan posting seluruh komentar keluaran yang sering saya lihat di sini. Maaf telah membuang-buang waktu Anda, tetapi Anda selalu bebas untuk berhenti membaca.   -  person ivanarnold    schedule 10.02.2016
comment
Saya tidak memberi suara negatif. Bukan sifat saya untuk memberi suara negatif! Bahkan jika saya menemukan komentar Anda lebih menilai sementara hanya menebak bahwa saya, pemberi komentar juga merupakan pemberi suara negatif, saya tetap tidak akan memberi suara negatif. Itu karena pertanyaan Anda, meski sulit diikuti, tampaknya sangat masuk akal. Saya biasanya berkomentar agar OP memberikan detail lebih lanjut atau memperbaiki pertanyaan mereka. Itulah yang terjadi di sini. Dan untuk meyakinkan Anda, saya bukan ahli f2py, jadi bahkan dengan pertanyaan yang lebih jelas saya pasti tidak memiliki pengetahuan untuk menjawabnya.   -  person innoSPG    schedule 10.02.2016
comment
Cukup adil. Tidak mencoba memberikan penilaian. Dan kalau dipikir-pikir, pertanyaan saya terlalu panjang dan tidak terlalu jelas. Saya telah mengeditnya sebagaimana mestinya. Namun, dalam kasus ini, memposting versi minimal kode tidak mungkin dilakukan. Terima kasih untuk balasan Anda.   -  person ivanarnold    schedule 10.02.2016


Jawaban (1)


Tidak yakin apakah saya harus menjawab pertanyaan saya sendiri seperti ini. Jika ini melanggar protokol maka saya mohon pengampunan dari kekuatan pertukaran tumpukan yang ada.

Semua informasi IS (sejauh ini) terkandung dalam keluaran debug. Setelah mengalokasikan variabale 'scef' sebagai array numpy dengan ukuran/bentuk/tipe yang tepat, segfault hilang.

Saya masih mendapatkan kesalahan lebih lanjut, tetapi sejauh ini melalui keluaran terminal menggunakan --debug-capi dan dengan hati-hati mengubah ukuran apa pun yang bentuk/ukuran/jenisnya tidak benar tampaknya dapat memperbaikinya.

Jika ada orang lain yang mengalami masalah ini, saya harap ini bisa membantu.

person ivanarnold    schedule 10.02.2016
comment
Saya tidak yakin apakah saya harus menjawab pertanyaan saya sendiri seperti ini - jika Anda mengajukan pertanyaan tentang masalah tertentu dan kemudian menemukan sendiri solusi untuk masalah tersebut, Anda bahkan didorong< /b> untuk menjawab pertanyaan Anda sendiri! Itu sebabnya Anda bahkan bisa menerima jawaban Anda sendiri! - person Programmer; 29.06.2021