นี่คือการติดตามคำถามที่ฉันถามที่นี่... ฉันจะจัดสรรอาร์เรย์อินพุตด้วย f2py ได้อย่างไร
ฉันได้ปรับปรุงคำถามเพื่อตอบสนองต่อความคิดเห็น คำถามเดิมไม่ชัดเจนและยาวเกินไป ดูความคิดเห็นที่ 1 ด้านล่าง
ฉันกำลังพยายามใช้ f2py เพื่อรวมรูทีนย่อย/ฟังก์ชัน fortran ต่างๆ สำหรับการอ่านข้อมูลที่ส่งออกจากรหัสฟิสิกส์อะตอมมิกต่างๆ ที่เขียนใน fortran 77 ฉันใช้การกระจาย Anaconda python (python 3.4 64 บิต) บน Ubuntu 14.04 (64 บิต) ด้วยชุดคอมไพเลอร์ gnu (gcc, gfortran ฯลฯ )
ฉันมีปัญหาในการพยายามจัดสรรอาร์เรย์ล่วงหน้าใน python คำถามเดิมของฉันเกี่ยวข้องกับการจัดสรรอาร์เรย์อักขระ ปรากฎว่าฉันมีรูปร่างผิดปกติ ฉันได้แก้ไขปัญหานั้นแล้ว (ฉันคิดว่า) และตอนนี้กำลังเผชิญกับข้อผิดพลาดในการแบ่งส่วน ฉันได้รวบรวมรูทีนย่อย fortran ด้วย f2py โดยใช้แฟล็ก --debug-capi
เพื่อเปิดใช้งานการรายงานข้อผิดพลาดแบบละเอียด
นี่คือส่วนที่เกี่ยวข้องของเอาต์พุตเทอร์มินัลที่ฉันได้รับเมื่อฉันรันสคริปต์ Python
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)
คำถามแรกของฉันคือสิ่งนี้ เป็นไปได้ไหมที่จะบอกได้ว่ามีอะไรเกิดขึ้นบ้างจากเอาต์พุตการดีบัก ฉันไม่เห็นวิธีการ
สำหรับคำถามที่สอง หากคุณดูที่จุดเริ่มต้นของเอาต์พุตการดีบัก คุณจะเห็นสิ่งที่ดูเหมือนการเรียกใช้ฟังก์ชัน ซึ่งฉันเชื่อว่าเป็น python เรียกใช้ฟังก์ชันจากอ็อบเจ็กต์ที่แชร์ ในตอนท้ายของเอาต์พุตการดีบัก คุณจะเห็นบางสิ่งที่เกือบจะเหมือนกัน แต่ถูกระบุว่าเป็น 'รูทีนย่อย fortran' ตัวแปรในรูทีนย่อย fortran ไม่อยู่ในลำดับเดียวกันกับฟังก์ชัน python วัตถุที่ใช้ร่วมกันถูกสร้างขึ้นโดยอัตโนมัติโดย f2py จากรหัส fortran ดั้งเดิม มีใครรู้บ้างไหมว่าเหตุใดตัวแปรเหล่านี้จึงอยู่ในลำดับที่แตกต่างกัน
ขอบคุณล่วงหน้า