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