تبدیل کد Fortran به Matlab
|
2008-02-25, 01:02 PM,
ارسال : #1
|
|||
|
|||
تبدیل کد Fortran به Matlab
برنامه یا package هست که بشه Fortran رو به Matlab تبدیل کرد؟
من شنیدم که هست؛ اگه کسی میدونه ممنون میشم بگه :roll: <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-02-25, 02:29 PM,
ارسال : #2
|
|||
|
|||
http://www.dsprelated.com/groups/matlab/show/669.php
--- You can call your own C or Fortran subroutines from MATLAB as if they were built-in functions. MATLAB callable C and Fortran programs are referred to as MEX-files. MEX-files are dynamically linked subroutines that the MATLAB interpreter can automatically load and execute. MEX-files have several applications: Large pre-existing C and Fortran programs can be called from MATLAB without having to be rewritten as M-files. Bottleneck computations (usually for-loops) that do not run fast enough in MATLAB can be recoded in C or Fortran for efficiency. MEX-files are not appropriate for all applications. MATLAB is a high-productivity system whose specialty is eliminating time-consuming, low-level programming in compiled languages like Fortran or C. In general, most programming should be done in MATLAB. Don't use the MEX facility unless your application requires it. Check out the documentation in the external interfaces section either in the matlab help section or at the Mathworks web site (<!-- w --><a class="postlink" href="http://www.mathworks.com">www.mathworks.com</a><!-- w -->). -----Original Message----- From: raghu330 [mailto:] Sent: Wednesday, January 16, 2002 4:05 AM To: Subject: [matlab] Fortran to matlab source code conversion Hello All! I have around 250+ fortran files. and I want to convert them to MATLAB. Is there any way, this can be done.. Its easy to generate C/C++ code from MATLAB scripts and vice-versa. but is there a sthg similar for FORTRAN.. thank you all in advance Cheers Raghu |
|||
2008-02-26, 05:12 PM,
ارسال : #3
|
|||
|
|||
ممنون. ولی بهترشو پیدا کردم.
اول با to_f90 کد رو optimize میکنی و بعدش با f2matlab میشه عوضش کرد. ۱ خورده bug هم دارن ولی کلا خوبن. <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-27, 12:01 PM,
ارسال : #4
|
|||
|
|||
دستور Save تو Fortran دقیقا چکار میکنه؟ مقدار متغیرها رو واسه دفعه بعدی که function خوانده میشه Save میکنه یا مقدار اونارو واسه subroutni که function مورد نظر از اونجا خوانده شده نگه میداره؟
آقای هادیان ممنون میشم کمک کنین با توجه به مهارت تون در Fortarn <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-27, 01:51 PM,
ارسال : #5
|
|||
|
|||
دستور SAVE مقدار متغيرهاي تعريف شده در يك زيربرنامه (سابروتين يا تابع) را براي دفعه بعد كه وارد اون زيربرنامه ميشين حفظ ميكنه. البته اكثر كامپايلرها بدون دستور SAVE هم در خيلي از موارد اين گزينه را اعمال ميكنند.
|
|||
2008-03-27, 04:12 PM,
ارسال : #6
|
|||
|
|||
پس با این تفسیر باید مشابه دستور PERSISTENT در Matlab باشه. آره؟
<start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-27, 04:49 PM,
ارسال : #7
|
|||
|
|||
متأسفانه من matlab بلد نيستم
|
|||
2008-03-27, 05:09 PM,
ارسال : #8
|
|||
|
|||
سلام
میشه بگیت matlab رو ار کجا دانلود کردین ؟ |
|||
2008-03-28, 04:47 PM,
ارسال : #9
|
|||
|
|||
من matlab رو خیلی وقت پیشا download کردم. بگردین link تو انجمن هست ولی فکر نمیکنم دیگه کار کنه.
آقا هادیان این var=1D20 یعنی چی؟ D چیکار میکنه تو Fortran <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-28, 05:14 PM,
ارسال : #10
|
|||
|
|||
همان 1E20 است با اين تفاوت كه وقتي Dاستفاده ميكنيد عدد بصورت دقت مضاعف است.
|
|||
2008-03-28, 05:27 PM,
ارسال : #11
|
|||
|
|||
ببخشین درباره حلقه ها در Fortran اگه برا نمونه for i=1,5 در اینجا i چه مقادیری میگیره؟ ۱و۲و۳و۴و۵ یا ۲و۳و۴و۵و۶ یا ....؟
ممنون <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-28, 05:35 PM,
ارسال : #12
|
|||
|
|||
فكر كنم منظورتون do i=1,5 باشه كه مقادير 1و2و3و4و5 ر ميگيره و پايان حلقه مقدار i برابر با 6 است.
|
|||
2008-03-28, 05:42 PM,
ارسال : #13
|
|||
|
|||
آره. من ۱ کم قاطی کردم زبونارو.
یعنی ۱و۲و۳و۴و۵و۶ وارد حلقه میشن؟ این حلقه چند بار میچرخه؟ ۵ بار یا ۶ بار؟ واسه نمونه do i=1,5 print i, end do چی چاپ میکنه در آخر؟ ۱و۲و۳و۴و۵ یا ۱و۲و۳و۴و۵و۶ ؟ ممنون <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-28, 05:52 PM,
ارسال : #14
|
|||
|
|||
ببينيد روند كار به اين شكله كه ابتدا كنترل حلقه (در مثال شما i) مقدار شروع را ميگره.
بعد بعد با مقدار نهايي اون را مقايسه ميكنه. اگر گام حلقه مثبت باشه (در مثال شما 1 است) در صورتي كه مقدار كنترل از كوچكتر يا مساوي مقدار نهايي باشه حلقه يكبار اجرا ميشه و در مورد گام منفي اگر كنترل بزرگتر يا مساوي مقدار نهايي باشد. بعد از يكبار اجرا، به اندازه گام به كنترل حلقه اضافه ميشه و مجدداً كنترل انجام ميشه. بنابراين در مثال شما كنترل حلقه ابتدا مقدار 1 ميگيره و اجرا ميشه. بعد 2 و بعد 3 و 4 و 5. بعد از اينكه مقدار 5 چاپ شد، كنترل حلقه ميشه 6 كه بزرگتر از مقدار نهايي است و از حلقه خارج ميشه. بنابراين در مثال شما مقادير 1و 2و 3 و4 و5 چاپ ميشوند. اگر بعد از حلقه يك دستور چاپ بگذاريد كه i را چاپ كند مقدار 6 چاپ ميشود. ضمناً يك نكته را دقت كنيد كه اگر در بدنه حلقه مقدار شروع، پايان يا گام حلقه را تغيير بديد ، اثري در تعداد دفعات اجرا و همچنين مقدار متغير كنترل حلقه ندارند و مقدار متغير كنترل حلقه را هم نميتونيد در بدنه حلقه تغيير بدين. (به نظرم c از اين نظر با فرترن متفاوت باشه ولي مطمئن نيستم.) |
|||
2008-03-31, 01:04 PM,
ارسال : #15
|
|||
|
|||
Matlab از این نظر که در بدنه حلقه نمیشه مقدار متغیر کنترل حلقه را تغییر داد شبیه Fortarn هست ولی مقدار i بعد از خروج از حلقه برابر مقدار نهایی ( در نمونه بالا ۵ ) است.
ممنون واسه توضیح کاملتون. <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-31, 04:07 PM,
ارسال : #16
|
|||
|
|||
آقا چند تا سوال دیگه:
این INTEGER*4 یا REAL*4 یعنی چی؟ شما واسه اینکه از دستور STOP استفاده نکنین چه راهی رو پیشنهاد میکنین؟ اگه یه متغیری به شکل character*60 fname تعریف شده باشه و بعد در برنامه دستور fname(1:6)='0o.dat' داده شده باشه. این یعنی چی؟ دستور FLOAT و INT چه فرقی دارن با هم؟ <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-03-31, 11:06 PM,
ارسال : #17
|
|||
|
|||
integer*4 يعني براي ذخيره عدد 4 بايت استفاده ميكنه و پيشفرض كامپايلرها است (البته اين عدد براي برخي كامپايلرها مثل salford متفاوت است ولي تا آنجا كه من ميدونم بقيه يكسان عمل ميكنند.) real*4 عدد اعشاري با دقت معمولي است كه فكر ميكنم معادل float در c است.
ميتونيد روند اجراي برنامه را با شرط و موارد ديگه طوري تنظيم كنيد كه اتوماتيك اجراي برنامه به انتها برسه و دستور Stop نداشته باشيد ولي بودنش چيز بدي نيست. character*60 يك رشته حرفي بطول 60 كاراكتر ايجاد ميكنه. fname(1:6)='0o.dat' در محلهاي 1 تا 6 رشته حرفي عبارتي كه سمت راست نوشتيد را جايگزين ميكند. floatو int در C معادل real يا real*4 و integer در فرترن است. |
|||
2008-04-10, 04:33 PM,
ارسال : #18
|
|||
|
|||
سلام دوباره
آقای هادیان در فهمیدن منظور این کد در جمله IF یه کم شک دارم. شما چی فکر میکنین؟ کد : DO 15 NL=NJ,NK میخوام بدونم کنترل برنامه چطوریه در IF و این ۱۵ یعنی که مقدار بعدی NL در حلقه اجرا میشه؟ برای نمونه اگه NL از ۱ تا ۵ باشه و در NL=3 مقدار A برابر صفر شه؟ <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
2008-04-12, 09:31 AM,
ارسال : #19
|
|||
|
|||
اين دستور IF محاسباتي از موارد منسوخ زبان فرترن است. در برنامه شما اگر A مقدار منفي يا مثبت باشد كنترل به خط شماره 12 منتقل ميشود (همان دستور goto) و اگر A برابر با صفر باشد كنترل به خط 15 ميرود. همانطور كه ميدانيد اين دستور اولاً مساوي بودن را بايد بررسي كند كه در مورد اعداد حقيقي بدليل نحوه ذخيره آنها در حافظه ميتواند همراه با خطا باشد و همچنين عملاً سه دستور goto را در درون خود دارد كه استفاده از اين دستور هم منسوخ شده و توصيه نميشود. در مثال شما اگر A برابر با صفر شود، كنترل به خط 15 ميرود و در نتيجه حلقه با مقدار بعدي يعني NL=4 به كار خود ادامه ميدهد. راهنماي مربوط به اين قسمت را manual فرترن براتون ميگذارم.
کد : IF -- Arithmetic |
|||
2008-04-15, 03:03 PM,
ارسال : #20
|
|||
|
|||
خیلی ممنون. دیگه من از این به بعد از تشکر کردن فاکتور میگیرم و فقط سوال میکنم.
این کد به نظرم خیلی مسخره میاد. میخواستم ببینم واقعا همینتوره یا نه!؟ کد : dummy_w=SIGN(-1,dummy_w)*DABS(dummy_w) به نظرم این خط یعنی dummy_w = dummy_w درسته؟ بود و نبودشم هیچ فرقی نداره! آره؟ <start> You hit Root. Root hits you. Root sends you TERM signal. You barely survive. Root sends you KILL signal. You die. --more-- </end> |
|||
|