132
اﺳﺎس ি 90 Fortran 90 Programming Examples Including Fortran 90 CD Omid Alizadeh CCGroup 1/1/2009

Fortran 90

Embed Size (px)

Citation preview

Page 1: Fortran 90

ه 90 اساس

Fortran 90 Programming Examples Including Fortran 90 CD

Omid Alizadeh CCGroup 1/1/2009

Page 2: Fortran 90
Page 3: Fortran 90

فرترنز اسـتانداردها و امكانـات فرتـرن ي ن 90فرترن . باشد ي م 77 و فرترن 90 شامل فرترن 95برنامه فرترن

90 و 95 فرتـرن ي هايژگي امكانات و وي تمامCOMPAQ FORTRAN. ز در بر دارد ي را ن77گــر شــركت ي دي بــه برنامــه هــاMICROSOFT VISUAL شــود و توســط ي را شــامل مــ77و

MICROSOFTــ ــصل م ــود ي مت ــودار ز. ش ــنم ــا ي ــف ير درصــد بخــش ه COMPAQ مختل

VISUAL FORTRANكند ي را مشخص م .

Page 4: Fortran 90

فصل اول

Page 5: Fortran 90

5

خط ي باشد كه از تعدادي ميسيا چند قسمت برنامه نو يك يله زبان فرترن شامل يبرنامه نوشته شده بوس

دسـتورات وVariable Declarationر يـ ف متغيـ ل شده است كه شامل دستورات تعريدستور تشك يبرنامـه مـ . ابـد ي ي خاتمه مـ END كلمه بههر برنامه . باشد ي م Execution Statement ٍيياجرا

ربرنامه ها ، مدول ها ،بلوك اطالعات نوشته شـود هـر ي ، ز ير بدنه اصل ي نظ ي مختلف يتواند در قسمت ها . از بـه برنامـه افـزوده شـوند ي توانند در صورت ن ير قسمت ها م ي است و سا يك بدنه اصل ي يبرنامه دارا يل عمـل بررسـ يـ كامپا ( ل شـوند يـ تواننـد بـه صـورت جداگانـه كامپا ي مختلـف برنامـه مـ يقسمت ها

) .ل آن به زبان پردازنده است يدستورات و تبددسـتورات . شـوند يم مير قابل اجرا تقس ي عبارات قابل اجرا و غ يدستورات نوشته شده به دو دسته اصل

ك يـ ي نحـوه اجـرا يـي ر اجرا يـ كنند حـال آنكـه دسـتورات غ ي را جهت اجرا مشخص م ي عمل يياجرا : دهد يش مي مختلف برنامه را نمايت قسمت هاير موقعير زيتصو. نند كين مييپردازش را تع

: توان استفاده نمود ير مي زي فرترن از كاراكتر هايدر برنامه ها 9 تا 0ارقام -1 )بزرگ و كوچك (يسيحروف انگل-2 _ خط فاصله -3 :ر قرار دارند ي كه در جدول زيحروف-4

Page 6: Fortran 90

6

Character Name Character Name

blank Blank (space) : Colon

= Equal sign ! Exclamation point

+ Plus sign " Quotation mark

- Minus sign % Percent sign

* Asterisk & Ampersand

/ Slash ; Semicolon

( Left parenthesis < Less than

) Right parenthesis > Greater than

, Comma ? Question mark

. Period (decimal point) $ Dollar sign (currency

symbol)

' Apostrophe

توان متن را در هر يدر قالب آزاد م . شوند ي نوشته م ثابت فرترن به دو صورت قالب آزاد و يبرنامه ها

اختـصاص دارد و (Label) ستون اول هر خط بـه برچـسب 5قسمت دلخواه نوشت اما در قالب ثابت نوشـته 72 تـا 7ن ستون ها يست در ب ي با ياختصاص دارد و برنامه م (+) يوستگيستون ششم به عالمت پ

كه نتـوان ي قرار دارد و زمانيي در ادامه خط باال ين معناست كه خط جار ي به ا يوستگيعالمت پ . شود در . م ي دهـ ي را قـرار مـ يوسـتگ ي عالمـت پ يك خط كل دستور را نوشت در ستون ششم خط بعد يدر

خـط يكـه در انتهـا ب يـ ن ترت يـ شود بـه ا ي استفاده م &از عالمت + علمت يبرنامه با قالب آزاد به جا . شود ي دو خط قرار داده ميوستگيجهت پ

حات ين است كه در قالب آزاد جهت قرار دادن توض ين دو قالب وجود دارد ا ين ا ي كه ب يگريتفاوت د ي اسـت كـه اجـرا نمـ يح خط ييخط توض . شود ي استفاده م C شود و در قالب ثابت از ي استفاده م !از

. شود يامه نوشته مشود و تنها جهت درك بهتر برن :ر آمده اند ي شوند در جدول زي استفاده ميسي كه در برنامه نوياضيعبارات ر

ييكارا عملگر

توان **

Page 7: Fortran 90

7

ضرب *

ميتقس /

ا عالمت مثبتيجمع و +

يا عالمت منفيق و يتفر -

م يم دهـ اگـر در ابتـدا ضـرب را انجـا . م ي را محاسـبه كنـ 2+6×2م مقدار عبارت ي خواه يد م يفرض كن

خواهـد 16 خواهد شد و چنانچه عمل جمع در ابتدا انجـام شـود مقـدار آن 14مقدار كل عبارت فوق يگر تقدم ندارنـد و بـرا يكديك از دو عمل جمع و ضرب نسبت به يچ يات ه ياضيحال آنكه در ر . بود

يدر زبانها . را كسب نمودياز طراح سوال در مورد تقدم عملگرها اطالعات توان ي مين دوگانگيحل ا ك تقـدم يـ ، حـل مـشكل يم امـا بـرا يازمنـد ير عبـارت فـوق ن يـ نظ يز به محاسـبه عبـارت ي ن يسيبرنامه نو

ت عملگرهـا يـ فرتـرن اولو يسيـ در زبـان برنامـه نو . عملگرها در نظر گرفتـه شـده اسـت ياستاندارد برا :ر است يبصورت ز

ت با آنچه داخل پرانتز يهمواره اولو ()

. باشد ياست م توان **

ميضرب و تقس *ا ي/

جمع و منها +ا ي -

چسباندن دو رشته //

يسه ايعبارت مقا =/ا ي= = ا ي <=ا ي >=ا ي >ا ي <.NOT. يص گزاره شرطينق .AND. ب دو گزارهيترك .OR. ي منطقياي

.EQV. معادل است با

.NEQV. ست بايمعادل ن

در . شـود يگر عملگرها قرار دارد اعمال مـ يه در جدول باالتر از د كيب همواره ابتدا عملگر ين ترت يبد

:ر عبارت مشخص شده است يت عملگرها با شماره در زير اولوي زيمثال ها

Page 8: Fortran 90

8

4 + 3 * 2 - 6/2 = 7 ^ ^ ^ ^ 2 1 4 3 (4 + 3) * 2 - 6/2 = 11 ^ ^ ^ ^ 1 2 4 3 (4 + 3 * 2 - 6)/2 = 2 ^ ^ ^ ^ 2 1 3 4 ((4 + 3) * 2 - 6)/2 = 4 ^ ^ ^ ^ 1 2 3 4

ين مثـال بـرا عنـوا ت نمـود بـه يـ ت هـا را رعا يـ ن اولو يد ا يز با ي به فرترن ن ياضيل عبارات ر ي تبد يو برا

محاسبه 43

5+

.(4+3)/5د نوشت ي در فرترن باك يـ ر ساده كرد تـا بـه يت عبارات را بر اساس جدول ز يب اولو يد به ترت يز با ي ن يدر مورد عبارات منطق

يه ستون هـا بـر رو ي شود و بق ي گزاره دوم اعمال م ي بر رو NOTستون ( .د يا غلط رس يح يجه صح ينت ) شوند ي ستون اعمال مهر دو

.NEQV. .EQV. .OR. .AND. .NOT. گزاره اول گزاره دوم F T T T F T T T F T F T F T T F T F F T F F T F F T F F

گر يكـد ي بـه ي شـود كـه دو عبـارت رشـته ا يت ها آمده است موجب مـ يكه در جدول اولو // عملگر

'ر همان ي سه عبارت زي كنند به عنوان مثال خروجي مجادي بزرگتر را ايك عبارت رشته ايبچسبند و

ABCDEF' است. ('ABC'//'DE')//'F' 'ABC'//('DE'//'F') 'ABC'//'DE'//'F'

: فرترن وجود دارند نوشته شده اند يسي كه در زبان برنامه نويگري دير عملگر هايدر جدول ز

كاربرد عملگر

.LT. or < كوچكتر است از

Page 9: Fortran 90

9

.LE. or <= است بايا مساويكوچكتر

.EQ. or = = است بايمساو

.NE. or /= ست باي نيمساو

.GT. or > بزرگتر است از

.GE. or >= است بايا مساويبزرگتر

ي مـ .FALSE.ا يـ و .TRUE.د يـ معروفنـد و باعـث تول يسه ا يـ مقا ين عملگرها به عملگرهـا يا . اعمال شوند ي و منطقي و عددي رشته اين داده هايد در ب تواننيشوند و م

توان يگرميبه عبارت د . جه عملگرهاست ين فصل به آن اشاره كرد نت ي توان در ا ي كه م يگريمطلب د

به عنوان مثـال . خواهد بود يجه عمل از چه نوع يانه مشخص كرد كه نت يات توسط را يش از انجام عمل يپ 4.ا ي دهد يجه مي را نت4 عبارت 2+2عمل

ز از همـان نـوع يـ ن يكسان انجام شود خروجـ ين دو نوع ي توان گفت كه چنانچه عملگر ب يح م يدر توض . ح خواهـد بـود يز از نوع صح ي ن يح هستند خروج ي در مثال باال چون هر دو عدد از نوع صح يعنياست

از نـوع 2 و 1 هـر دو عـدد رايـ باشـد ز ي مـ 0 عدد 2/1ان است آنكه حاصل ين م ي كه در ا يتنها نكته ا اسـت و پـس از حـذف قـسمت يقـ ي باشـد از نـوع حق 0.5د مقـدار ي كه با ي باشند و خروج يح م يصح

. شود يل مي به صفر تبدياعشارر مجموعه اعداد ي ز يحي صح ينوع عدد . ع تر است يجه نوع وس ين دو نوع متفاوت باشد نت ياگر عملگر ب

مطـرح 1/ .2 را بـه شـكل ياگر مثال بنـد قبلـ . د مختلط است ر مجموعه اعدا ي ز يقي و اعداد حق يقيحق . خواهد بود 0.5م جواب يكن

Page 10: Fortran 90

فصل دوم

Page 11: Fortran 90

11

م ياز از آنها بهره مند شو يم تا در زمان ن ياز دار يره موقت اطالعات ن ي به ذخ يسي برنامه نو يدر تمام زبانها ير محلـ يمتغ.ر فراهم شده است ي به نام متغ يسي برنامه نو يك ش يره اطالعات در ين امكان توسط ذخ يا.

رها الزم اسـت ين متغ ي به ا ي دسترس ي برا اسم و مشخصات خاص خود است و يكه دارا از حافظه است ر يـ در انتخاب نـام متغ . ر است ين آن همان نام متغ يكه اول . ف شود ي آنها تعر ي برا يژگي و يك سر يكه .كرد د به آنها توجه ي وجود دارد كه باينكات

.د با عدد شروع شود ير نباي نام متغ– 1 .د نام توابع آماده فرترن باشد ير نباي نام متغ– 2 . مجاز استفاده شود يد از كاراكترهاي در انتخاب نام تنها با– 3

شود ي خوانده مunderscoreكه ( _ و 9 تا Z ، 0 تا z ، A تا aن از ي مجاز حروف التيكاراكترهال يـ بـه دل ( Sinو ) 1ل نقـض مـورد يبـدل ( 7up بـا نـام ييرهايد توجه كرد كه متغيالبته با . باشند يم)

. مجاز در نام آنها استفاده شده است ي باشند اگرچه از كاراكترهايمجاز نم ) 3نقض مورد ود شي نه تنها با عدد شروع نمSinxنام . م ي كني مي را بررسA-B و Flor و Sinx با نام يحال اسام

د كـه يـ ن نكته توجـه كن ي شرط دوم به ا ي بررس يحال برا . ل شده است ي مجاز تشك يبلكه از كاراكترها ي باشـد پـس مـ ي نمـ يچ تابع ينام ه Sinxر ي نام تابع است و متغ Sin يعني قسمت اول Sin(x)در تابع

.د ياير به حساب بي متغيمجاز برا ك ناميتواند Flor ز ير ن ين نام متغ ي مجاز استفاده شده است همچن يم آن از كاراكترها شود و در نا يبا عدد شروع نم

ر اسـتفاده يـ ك متغيـ ي نامگـذار يتوان از آن برا ين م يبنابرا) باشد ي م Floorح يتابع جزء صح ( باشد ينم . ر باشد يك متغي تواند يل شده است پس نميتشك) dash ( –ر مجاز ي از كاراكتر غA-B اما .كرد

ل يـ رهـا بـه دل ين متغيـ را تعـداد ا يـ د زيـ اسـتفاده نكن ي تك حرفـ يد از اسام ي كن ير سع يتغدر انتخاب نام م ين صـورت تنهـا مـ يـ گـر در ا ي به عبارت د . باشد ي محدود م يسيف زبان انگل محدود بودن تعداد حرو

ست ي حروف حساس ن ي و كوچك يد و از آنجا كه فرترن به بزرگ يف كن ي را تعر z تا a ير ها يد متغ يتواناطالعـات داخـل با ناسب ترها را م يد نام متغ ي كن ين سع ي همچن . د ير استفاده كن ي متغ 26د از ي توان يتنها م

د بهتـر اسـت از يـ كن يف مـ يره نام دانشجو تعر ي ذخ ي را برا يريبه عنوان مثال اگر متغ . د يآن انتخاب كن روف كوچـك و ر حـ يـ ف نام متغيدر تعر. د يده كنا استف Name و StudentName با نام ييرهايمتغ

ر يــ تــوان متغيمــ. باشــند ي مــيكــي name و NAME يرهــاين متغي بنــابرا ندارنــديبــزرگ تفــاوتStudentName شتر بـه صـورت يـ بيي خواناي را براStudent_Name ا يـ وStudentName

.ف كرديتعر

Page 12: Fortran 90

12

تمام انواع . شود رهير ذخ يد در متغ ي با يم كه چه نوع داده ا ين كن يير الزم است تع يپس از انتخاب نام متغ :ر آمده است يره شوند در زيرها ذخي توانند در متغي كه مييداده ها

9 تـا 0و تنهـا از ارقـام است ي فاقد هرگونه نشانه ا Integerح ي عدد صح فوق يم بند يتقسبا توجه به .2 و 2. و 0.2ر ي نظياعداد باشد يم ( . ) زي ممي دارا Real يقيحال آنكه عدد حق. شود يل ميتشك شود كه عـدد اول قـسمت ي م ز در داخل پرانتز نگاشته ي ن Complexعدد مختلط . باشند ي م ياعشار. باشـند ي مـ ين دو قـسمت خـود از نـوع داده اعـشار يا. عدد است ي و عدد دوم قسمت موهوم يقيحق :م يسي نوير را مين مطلب برنامه زي امتحان ايبرا

Complex CN CN=(1,2) Print *,CN End

آن بـه ي و موهـوم يقـ يف شده اسـت و هـر دو قـسمت حق ي از نوع مختلط تعر CNر ين برنامه متغ يدر ا

ين نـشان مـ يـ باشد كه اي م (1.00000,2.00000) عدد ياما خروجح نوشته شده اند يصورت صحگـر تمـام ي باشند به عبـارت د ي م Real عدد مختلط ي و موهوم يقي حق يش فرض قسمتها يدهد بطور پ . شوند يل ميح تبدي صحين دو قسمت به نوع داده عددي در اي عدديانواع داده ها

آنـرا تـا دقـت ستم عامـل يـ بـه س م اعـشار را نـدارد وبـسته ارقـا يره تمام يت ذخ ي قابل Real ينوع داده ا م ي كني استفاده م Double Precision يرين اشكال از نوع متغي رفع ايبرا . كند ي گرد ميمشخص

دهد تا دقت اعداد خـود ين امكان را م ي باشد به كاربر ا ي م ي از اعشار ي كه نوع خاص ين نوع عدد ي ا .

اعداد متن نوع منطقي

حيصح ياعشار

مختلط

انواع داده

... و 3 ، 2مانند اعداد

3.0 يا 2.1مانند اعداد

)12 ، 23(مانند عدد

Integer Real Complex

Character Logical

Page 13: Fortran 90

13

B و Aر يـ ه دو متغ يـ اول ير مقـدارده يـ در مثال ز . ره گردد ي ذخ يشتريرا باالتر ببرد و تعداد رقم اعشار ب متفاوت است گردد يره مي كه در آنها ذخيكسان است اما مقداري

REAL A DOUBLE PRECISION B A=4*ATAN(1.) B=4*ATAN(1.) PRINT *,A,B END

:ر چاپ خواهد شد يبعد از اجرا كردن برنامه فوق مقدار ز3.141593 3.14159274101257

گر يره دارد به عبارت ديافته جهت ذخي اختصاص يت هاي با تعداد بايمي رابطه مستقيدقت انواع داده ات ها ين منظور تعداد باي ايبرا.ر داد يي توان دقت اعداد را تغيافته ميص ي تخصيت هاير تعداد باييبا تغ

BASIC يسي برنامه نويدر زبان ها. م ي كنيت ها مشخص ميرا با نوشتن نوع داده ضربدر تعداد با :جاد كرد ي اري توان با نوشتن عبارت زين نوع داده را ميت وجود دارد كه اي باينوع داده ا

INTEGER*1 A ل شده يت تشكي ب8ت از ي گردد و از آنجا كه هر بايره ميت ذخيك باي تنها در Aر ين مثال متغيدر ا

ن محدوده در يه اعداد را با بردن به اي دارد و بقي را در خود نگه م127 تا 128-ر ياست لذا تنها مقاد يره گردند و داده هايت ذخي با8ا ي 4ا ي 2ا ي 1 توانند دريح مي صحيداده ها. كتد يره ميخود ذخ DOUBLE ي همان نوع داده اREAL*8 گردند كه يره ميت ذخي با8ا ي 4 در ياعشار

PRESICIONت ي با4ح ي و صحي اعشاري نوع داده ايت هايش فرض تعداد باي است و به طور پن صورت يت به ايب نوع باين ترتيداد به از قرار يت ها را در داخل پرانتز ني توان تعداد بايم. باشد يم

: شود ينوشته مINTEGER(1) A

. توان انجام داد ي را مياضيمحاسبات ر ) Integer , Real , Complex(ن نوع داده ها ي ايبر رو

. مختلـف نوشـت ين امكان فراهم شده است تا بتوان اعداد را در مبناهـا ي فرترن ا يسيدر زبان برنامه نو تـوان ي كه داخل عالمـت نقـل قـول قـرار دارد مـ ي قبل از عدد Bله قرار دادن حرف ي را بوس دو يمبنا

. مشهورند ينرين اعداد به باي دهند اي را نشان م2 ير اعداد در مبناي زيمثال ها. مشخص كرد B"1" B’10001’ B’111001’

و O را توسط حرف 8 يمبنااعداد در . باشد ي نم ينري عدد با 2ل استفاده از رقم يبدل 'B'0112عدد .م ي دهيش مي نماZ را با حرف 16 ياعداد در مبنا

: دهد يش مي مختلف را نماير مقدار اعداد در مبناهايجدول ز

Page 14: Fortran 90

14

16 يمبنا 2 يمبنا 8 يمبنا 10 ينايم

0 0000 00 0

1 0001 01 1

2 0010 02 2

3 0011 03 3

4 0100 04 4

5 0101 05 5

6 0110 06 6

7 0111 07 7

8 1000 10 8

9 1001 11 9

A 1010 12 10

B 1011 13 11

C 1100 14 12

D 1101 15 13

E 1110 16 14

F 1111 17 15

از يكـ ي ياگـر مـتن حـاو . اسـت ‘ا ي “ ي نشانه هاي باشد داراي م textا ي كه همان متن ينوع رشته ا

شود به عنـوان مثـال ي از عالمت دوم استفاده م ي مشخص كردن نوع رشته ا يم گفته شده باشد برا يعال اسـتفاده ‘د از عالمت يم باي قرار دهير رشته ايك متغي را در ”Ali :”Helloم عبارت يچنانچه بخواه

. خواهد بود ’”Ali :”Hello‘جه عمل يپس نت. در خود متن استفاده شده است “را عالمت يم زيكنزه كـردن ي از متن ، كاراكتر ي از متن ، برش قسمت يل حذف قسمت يب از ق يين نوع داده كارها ي ا ي بر رو

توان انجام يرا نم ... نوس ، ضرب و ينوس و كس يل س ي از قب ياضياما اعمال ز . توان انجام داد يرا م ... و .داد

Page 15: Fortran 90

15

دارد كـه تنهـا ي پردازش را در خود نگه مـ يك سريا غلط بودن يح يجه صحي نتLogical ي منطق نوع باشد ي م ياضي ر ي منطق ير معادل گزاره ها ين نوع متغ يا. باشد ي م .False.ا ي .True.مقدار شامل دو

شود كه جزوه فرتـرن در دسـت اوسـت ، او پـس از نگـاه كـردن بـه يبه عنوان مثال به شخص گفته م . ك كلمه ين پردازش ها در قالب يجه ا يا نه و نت ين گزاره درست است يا ا ي دهد كه آ يص م يجزوه تشخ

فرتـرن يسيـ زبان برنامـه نو . باشد ي در فرترن م .False.ا ي .True.كه معادل كند يدا م يا نه نمود پ يبله .دهد ي انجام مي منطقيعبارت ها را درقبال ين كاريهم چن . متشكل از تمام موارد باالست كه در ادامه مطلب به آن اشاره خواهد شد Type يرينوع متغ

از دستور خالصه ن منظور يا يبرا. رسد ير ها ميف متغي باال نوبت به نحوه تعر ن تمام موارد ييتعاز پس :م ي كنير استفاده ميشده ز

ري نوع متغ1ر ي ، نام متغ2ر ي، نام متغ... : شود ير استفاده مي از دستور زي از نوع رشته اtext1 به نام يري متغي معرفيبه عنوان مثال برا

Character text1 ف ير را تعريك متغيش از يف ، بيك خط تعري توان در يكه در دستور نوشته شده است مهمانطور

:ف شده اند يح تعرير از نوع صحير سه نوع متغيدر خط دستور ز. نمود INTEGER A,B,C

اد شـده ، يـ ي شده اسـت لـذا از انـواع داده هـا ي طراح ياضياز آنجا كه فرترن جهت انجام محاسبات ر شتر از اعداد مختلط اسـتفاده يح ب ي و صح ين اعداد از اعداد اعشار ي شود و درب ياستفاده م شتر از اعداد يب شـروع N تـا I كه با حـروف يف استفاده شوند در صورتي كه بدون تعر ييرهايل متغ ين دل ي شود به ا يم

ن حـروف آغـاز شـوند يـ ر از ا يـ شوند و چنانچه با غ يف م يح تعر يش فرض بصورت صح يشوند بطور پ IMPLICIT تـوان توسـط دسـتور يش فـرض هـا را مـ ين پـ يـ ا. شـوند يف مـ يـ تعريقيحقبصورت

NONE را يديـ جديش فـرض هـا ي تـوان پـ ي مـ ي شود حذف كرد و حتيكه در اول برنامه نوشته م :ر است ين دستور به صورت زي ايف كلي تعر. به برنامه افزود IMPLICITتوسط دستور

Implicitر ي، نوع متغ1 ، سرنام 2و سرنام ...

. شـوند از نـوع نوشـته شـده انـد ين حرف شروع مـ ي كه با ا ييرهاي است كه متغ ي معن نيدستور به ا ن يا شـوند در صـورت ي شـروع مـ T و C كه با حروف يير ها ي شود كه متغ ير موجب م ين عبارت ز يبنابرا

: در نظر گرفته شوند يف از نوع رشته ايعدم تعر

IMPLICIT CHARACTER T,C

:ن صورت قابل نوشتن است يز به اي فرترن نيفرض كلش يپ

Page 16: Fortran 90

16

Implicit integer ( I-N) Implicit Real (A-H) , ( O-Z)

و H تا Aح و حروف ي صحير هاي را به متغN تا I است كه حروف ين معنياستفاده از خط فاصله به ا

O تا Zنسبت دهد ي اعشارير هاي را به متغ . س ي سهولت كـار از انـد يم كه براي دارx ري متغn يعني xn، … ، 2x ، 1x مانند يات عباراتياضيدر ر

ف كرد يس تعر ير با اند ي توان متغ يات را دارد م ياضي ر يشتر جنبه ها يم از آنجا كه فرترن ب ياستفاده كرد :م ي كنير استفاده ميس از دستور زير با اندي متغnف ي تعريبرا

ري نوع متغ1ر ينام متغ) س يتعداد اند( ، 2رينام متغ) س يتعداد اند(، ... شـود بـه عنـوان ي كه در داخـل پرانتـز نوشـته مـ ي شود عدد ي خط موجب م ير در ابتدا يوجود نام متغ

ف شده است ي باشد تعر يح م ي كه از نوع صح xس دار ير اند ي متغ 100ر يدر مثال ز . س باشد يتعداد اند :

Integer x(100) در ،ريـ به عنوان مثال در نمونه ز . ر است ي از آن متغ يس مشخص يد منظور اند ر ذكر نشو يچنانچه نوع متغ

: شود ي نوشته م23 عدد xن يپنجم

X(5)=23

س چند ي توان از اند يز م يدر فرترن ن . شود ي استفاده م يس دو بعد يك از اند يزيس ها و در ف يدر ماتر م ي كنيمر استفاده ين منظور از دستور زي اي استفاده كرد برايبعد

رير نوع متغينام متغ ) 1بعد تعداد , 2بعد تعداد , (... ، ... )25×4س يك ماتري( كند يف مي را تعريس دو بعدير با اندي متغ100ر يدستور ز

Real A(25,4) س هـا يتعـداد انـد باشد ، چنانچه يس م ي اند 4 يس و بعد دوم دارا ي اند 25 يدر مثال باال بعد اول دارا

:م ي دهير ميين تغين چنيم حال دستور باال را اي كنياستفاده م: از دمشخص نباشReal A(:,4)

4س دوم يس اول نامـشخص و تعـداد انـد ي دو بعد كه تعداد اند ي دارا Aر ي است كه متغ ين بدان معن ياا را رهي متغين و باالييم كران پايچنانچه بخواه. شود ي ختم م4 شروع و به شماره 1است كه از شماره

:م ي كنير استفاده ميم از دستور زير دهييتغ رير نوع متغينام متغ) 1ن بعد ييكران پا : 1 بعد يكران باال, ( ... ، ... :م ي دهير مييمثال باال را دوباره تغ

Real A(:,-1:2)

Page 17: Fortran 90

17

. است -1س ها از عدد يس است اما شروع اندي اند4 ين دستور داراينك بعد دوم ايااستفاده شده است : از ف آنهاي كه در تعر ييرهايمتغ( كه تعداد نامشخص دارند ي ابعاد يدار ده مق يبراف و سـپس تعـداد يـ تعرير سـه بعـد يـ ك متغير ابتدا يدر مثال ز . م ي كن ي استفاده م Allocateاز تابع ) :م يس ها را مشخص كرده اياند

Real Allocatable :: A(:,:,3) Allocate (A(11:12,4,3))

و بعـد دوم 11س بـا شـروع از ي انـد 2 ي بعـد اول دارا Allocateبعد از استفاده از دستور ن مثال يدر ا اسـتفاده مجـدد از دسـتور . شـده اسـت فيـ تعر )ف يـ ل عدم تعر يبه دل ( 1س با شروع از ي اند 4 يدارا

ALLOCATE شـود ين اجرا مواجـه مـ ي در ح يست و برنامه با خطا ير ن ير امكان پذ يك متغ ي ي برا .غام خطـا ير استفاده شده است كه برنامه پيك متغي يبرا ALLOCATEر دوبار از دستور يدر برنامه ز

: دهد يمINTEGER*4, ALLOCATABLE:: A(:) ALLOCATE(A(1)) ALLOCATE(A(2)) END

ز امكان ي باشند ني ابعاد مشخص مي كه تماميري متغي برا ALLOCATEن استفاده از دستور يهمچن . باشد و برنامه اجرا نخواهد شد ير نميپذ استفاده ALLOCATED ابعاد آن مشخص شده است از تابع ي تماميريا متغينكه آيص اي تشخيبرانصورت ير اي و در غ.TRUE. ش مشخص شده باشد مقدار آنير از پي كه متغيدر صورت. م ي كنيم

. خواهد بود .FALSE.مقدار آن د ابتـدا ين با يرها نسبت داد بنابرا ي مختلف را به متغ ي ها يژگيت الزم است و اوقا ي گاه يسيدر برنامه نو

:م ي پردازي ها ميژگين وي اياكنون به بررس. ها را شناخت و سپس از آنها استفاده كرد يژگين ويا - Allocatable

امكان يا برAllocatable يژگيد از و يم با يس ها را مشخص نكرد ير ها تعداد اند يف متغ ياگر در تعر ره تـابع يـ و غVisual Fortran 6.5 يگـر در سـر يبه عبارت د. م ي استفاده كنAllocateاستفاده از

Allocate يزگي وي كه داراييرهاي تنها قادر است به متغ Allocateس اختصاص دهد ي هستند اند . - Dimension

Page 18: Fortran 90

18

ر بـه يـ ر زيف متغ يان مثال در دستور تعر شود به عنو يرها استفاده م ي دادن بعد به متغ ي برا يژگين و ي از ا . : شود ي داده م(2,2) ابعاد C و Bو Aر يب به سه متغيترت

Real ,Dimension (2,2) ::A,B,C

:ر است ين دستور معادل دستور زيا

Real A(2,2) , B(2,2) , C(2,2)

- Parameter كه تا آخـر برنامـه ي به صورت شود يه م ر استفاد يك مقدار در متغ ي ثابت نگه داشتن ي برا يژگين و ياز ا

3.141592 از نوشتن عبارت يري جلوگ ير برا ي به عنوان مثال در برنامه ز .مقدار آن ثابت خواهد ماند :م ي كني استفاده ميژگين وي ثابت نگه داشتن آن در كل برنامه از ايره و براي ذخpر يآن را در متغ

Double Precision , Parameter :: P= 3.141592 Read *,R Print *,”Area = “ , p*R**2 Print *, “S = “ , 2*p*R End

ف يـ تعر يبـرا . م ير بكار بـر يف متغ يست آنها رادر دستور تعر ي با يم م ي ها آشنا شد يژگيحال آنكه با و

ي اسـتفاده مـ attribute – oriented و entity – oriented ها از دو نـوع يژگيرها همراه با ويمتغ ميكن

:م ي دارentity – orientedدر دستور

ري نوع متغ1 يژگي ، و2 يژگي، و ... :: 1ر ي ، نام متغ2ر ي، نام متغ... Real Allocatable , Dimension (:) :: A,B

:م ي دارattribute – orientedدر دستور

ري نوع متغ1ر ي ، نام متغ2ر ي، نام متغ... 1 يژگي و1ر يتغ ، نام م2ر ي، نام متغ... 2 يژگي و1ر ي ، نام متغ2ر ي، نام متغ...

... Real A,B Dimension (:) A,B

Page 19: Fortran 90

19

Allocatable A,B

ي هـا را بـه تمـام يژگي ويم تمامين است كه چنانچه بخواهيف اين هر دو نوع تعريتنها تفاوت موجود ب متفـاوت اعمـال يرهـا يرا بـه متغ متفـاوت ي ها يژگيم و يم از حالت اول و اگر بخواه يرها اعمال كن يمتغ .م ي كنيم از حالت دوم استفاده ميكن

ز وجـود يـ شـوند ن ي اعمـال مـ ي كه با نحوه متفاوت يگري د ي ها يژگي گفته شده و ي ها يژگيعالوه بر و . هستند Kind ها دستورات يژگين وي از ايكي. دارند

: شوند يف مير تعريح به عنوان مثال به صورت زيدر مورد نوع صح

Integer (Selected_INT_Kind(3)) A

د دو مقـدار را يـ بايدر مورد عدد اعشار . باشد ي م 103 تا -10 3ح و در بازه ي از نوع صح A عدد يعني :به عنوان مثال . وارد كرد كه عدد اول حداقل رقم اعشار و عدد دوم بازه عدد است

Real (Selected_Real_Kind(3,4))B

. باشد ي م104 تا 10 -4 رقم اعشار و در بازه3 با حداقل حيوع صحاز ن B عدديعني را حـذف Selected_Real_Kind و Selected_INT_Kind خالصـه تـر شـدن ي توان برا يم

:ر نوشت يكرد و به صورت زInteger (3) A Real (3,4) B

ر يـ از سـه دسـتور ز يكـ ياز ن منظـور يـ ا ين كرد برا يي توان طول رشته را تع ي م ير رشته ا يدر مورد متغ

:م ي كنياستفاده م Character (Len=n) 1ر ي، نام متغ...

Character (n) 1ر ي، نام متغ... Character * n 1ر ي، نام متغ...

در نظـر 1ش فـرض يف استفاده نشود طول به طور پ ين تعر ي كه از ا يدر صورت . طول رشته است nكه

حـرف n باشـد m>n حرف نوشـته شـود اگـر m حرف تعداد n با يريچنانچه در متغ. شود يگرفته م . شود ي پر مSpace رشته با ينصورت قسمت خالير ايو در غ. شود يره مير ذخياول در متغ

Character *4 C1

Page 20: Fortran 90

20

C1=”Hello”

. شود يره مي ذخHell يعني Helloن مثال چهار حرف اول يدر ا

Character *6 C1 C1=”Hello”

(Space) يك فاصـله خـال يد كه يتوجه كن. شود يره مير ذخي در متغ“ Hello“مثال مقدار ن يودر ا .بعد از كلمه وجود دارد

Page 21: Fortran 90

فصل سوم

توابع آماده فرترن

Page 22: Fortran 90

22

توابـع در . شـود ي معمـول ، از توابـع آمـاده اسـتفاده مـ ي از كارها ي انجام تعداد ي برا يسيدر برنامه نو . شوند يل ميتشك ) يورود( ند آرگومان ا چيك يك نام و ي از يحالت كل

نام تابع) 1 ي ، ورود2 ي، ورود(...

ن كـار يـ انجام ا ي دهد و برا ي را انجام م ين است كه تابع چه كار يم ا يد در مورد توابع بدان يآنچه كه با ير طراح ين موارد جدول ز ي ا يهت بررس ج. ست ي تابع چ ي كند و خروج ي استفاده م ياز چه نوع ورود

:ده است ش نام تابع ورودي توضيحات Real ABS (x)اعشاري قدر مطلق

Complex CABS (x)مختلط قدر مطلق DABS (x) دقت مضاعف قدر مطلق Integer IABS (x)صحيح قدر مطلق Real ACOS (x)اعشاري نوسيآرك كس DACOS (x) دقت مضاعف نوسيآرك كس

Real AINT (x)اعشاري يحذف قسمت اعشار DINT (x) دقت مضاعف يحذف قسمت اعشار

Real ASIN (x)اعشاري نوسيآرك س DSIN (x) دقت مضاعف نوسيآرك س

Real ATAN (x)اعشاري آرك تانژانت DTAN (x) دقت مضاعف آرك تانژانت Real ATAN2 (x)اعشاري آرك تانژانت DTAN2 (x) دقت مضاعف آرك تانژانت

Integer CHAR (x)صحيح Asciiحرف مطابق با جدول Real COS (x)اعشاري نوسيكس Complex CCOS (x)مختلط نوسيكس DCOS (x) دقت مضاعف نوسيكس

Complex CONJ (x)مختلط مزدوج عدد مختلط Real COSH (x)اعشاري كيپربولينوس هيكس DCOSH (x) دقت مضاعف كيپربولينوس هيكس

Page 23: Fortran 90

23

Real DIM (x,y)شاري اع تفاضل در صورت مثبت بودن Integer IDIM (x,y)صحيح تفاضل در صورت مثبت بودن

Real DPROD (x,y)اعشاري شتريد عدد با دقت بيتولeاعشاري بتوان عددReal EXP (x) eمختلط بتوان عددComplex CEXP (x) eدقت مضاعف بتوان عدد DEXP (x)

ICHAR (x) رشته اي مربوط به رشتهيكد اسك INDEX (String,Substring) رشته اي ان رشتهيجستجو در م

Real INT (x)اعشاري حيل عدد به صحيتبد Real IFIX (x)اعشاري حيل عدد به صحيتبد IDINT (x) دقت مضاعف حيل عدد به صحيتبد

LEN( String ) رشته اي طول رشته Real LOG (x)اعشاري يعيه طبيتم در پايلگار Real ALOG (x)اعشاري يعيه طبيم در پاتيلگار Complex CLOG (x)مختلط يعيه طبيتم در پايلگار DLOG (x) دقت مضاعف يعيه طبيتم در پايلگار Real LOG10 (x)اعشاري ه دهيتم در پايلگار Real ALOG10 (x)اعشاري ه دهيتم در پايلگار DLOG10 (x) دقت مضاعف ه دهيتم در پايلگار Real MAX (x,y,…)اعشاري مم اعداديماكز Integer MAX0 (x,y,…)صحيح مم اعداديماكز Real AMAX1 (x,y,…)اعشاري مم اعداديماكز DMAX1 (x,y,…) دقت مضاعف مم اعداديماكز Real MAX1 (x,y,…)اعشاري مم اعداديماكز Integer AMAX0 (x,y,…)صحيح مم اعداديماكز

Real MIN (x,y,…)ري اعشا موم اعدادينيم Integer MIN0 (x,y,…)صحيح موم اعدادينيم Real AMIN1 (x,y,…)اعشاري موم اعدادينيم DMIN1 (x,y,…) دقت مضاعف موم اعدادينيم

Page 24: Fortran 90

24

Real MIN1 (x,y,…)اعشاري موم اعدادينيم Integer AMIN0 (x,y,…)صحيح موم اعدادينيم Integer MOD (x,y)صحيح ماندهيباق Real AMOD (x,y)اعشاري ماندهيباق DMOD (x,y) دقت مضاعف ماندهيباق Integer REAL (x)صحيح يل عدد به اعشاريتبد Integer FLOAT (x)صحيح يل عدد به اعشاريتبد SNGL (x) دقت مضاعف يل عدد به اعشاريتبد

Real SIGN (x,y)اعشاري y به همراه عالمت xمفدار DSIGN (x,y) دقت مضاعف y همراه عالمت بهxمفدار Integer ISIGN (x,y)صحيح y به همراه عالمت xمفدار

Real SIN (x)اعشاري نوسيس Complex CSIN (x)مختلط نوسيس DSIN (x) دقت مضاعف نوسيس Real SINH (x)اعشاري كيپربولينوس هيس DSINH (x) دقت مضاعف كيپربولينوس هيس

Real SQRT (x)عشاري ا جذر Complex CSQRT (x)مختلط جذر DSQRT (x) دقت مضاعف جذر

Real TAN (x)اعشاري تانژانت DTAN (x) دقت مضاعف تانژانت

Real TANH (x)اعشاري كيپربوليتانژانت ه DTANH (x) دقت مضاعف كيپربوليتانژانت ه

ــا ــله ه ــرار دادن فاص ــر يق اول در آخ رشته

ADJUSTL ( String ) رشته اي

ــا ــله ه ــرار دادن فاص ــر در اول يق آخ رشته

ADJUSTR (String ) رشته اي

TRIM ( String ) رشته اي آخر رشتهيحذف فواصل خال LEN_TRIM ( String ) رشته اي در آخريطول متن بدون فاصله خال

Page 25: Fortran 90

فصل چهارم

يكنترل اجرا برنامه

Page 26: Fortran 90

26

يست از دسـتورات متفـاوت يـ با يرها و توابع م ي عالوه بر استفاده از متغ ي كاربرد ي نوشتن برنامه ها يبرا . م ي شود استفاده كنيح داده مين بخش توضيكه در ا

دستور و ساختار شرط-ا دسـتور يـ از ساختار ) فتد ين( فتد ي ب ي اتفاق ي شرط يم در صورت برقرار ي بخواه يسيچنانچه در برنامه نو

: شود يف مير تعريشرط به صورت زدستور . م ي كنيشرط استفاده م IF ) يعبارت شرط( ك دستور ي

رسـد چنانچـه عبـارت يا غلـط مـ يح ي از دو حالت صح يكي را محاسبه و به ي فرترن ابتدا عبارت شرط تـوان يك دسـتور مـ يـ د توجه داشت كه تنهـا يبا. شود ي درست باشد ، دستور داده شده اجرا م يشرط

. نوشت را بـا ينكـه شـروط مختلفـ يا ايـ م و يك شـرط اعمـال كنـ يـ ك دسـتور را در ي از شيم ب يچنانچه بخواه

:م ير از ساختار شرط استفاده كنيم به شكل زي توانيم ميدستورات مختلف اعمال كنThen ) 1 يعبارت شرط ( IF

بلوك دستوراتThen )2 يعبارت شرط ( Else IF

بلوك دستورات . . . Else بلوك دستوراتEnd IF

نوشـته ELSE IF باشند امـا چنانچـه ي مياري كامال اختElse و Else IF ي ساختار شرط قسمتهادردر . است يان ساختار الزامي پاي براEnd IFاستفاده از . استفاده شود Thenست از كلمه ي بايشود م شـرط اول ، چنانچـه درسـت باشـد بلـوك ي تـوان گفـت كـه پـس از بررسـ يح ساختار شـرط مـ يتوضچ يچنانچـه هـ . كنـد ي را چك م ينصورت شرط بعد ير ا ي كند و در غ يرات مربوط به آن را اجرا م دستو

مربـوط بـه ي در ساختار شرط آمده باشد بلوك دستور Elseك از دستورات باال اجرا نشود و قسمت يElse اجرا خواهد شد

رد دسـتور شـرط در نمـاگ .ض شروط باالست يب نقي معادل با تركي عبارت شرطي دارا Elseدر واقع .ر آمده است ير زيتصاو

Page 27: Fortran 90

27

: شود ي باشد عبارت مناسب چاپ ميا دو رقميك ير چنانچه عدد وارد شده ي در برنامه ز

Read *,I If ( I>=0 .AND. I<10 ) Then Print *,"Your Number has one digit" Else If ( I<100 .AND. I>9 ) Then Print *,"Your Number has two digits" Else Print *,"Your Number has more than two digits" End If PAUSE End

Page 28: Fortran 90

28

. دهد يش مي خوانده و تانژانت آنرا نما ان است رايه كه بر حسب راديك زاوينوس ي س ريبرنامه ز

Read *,A If ( A<=1 .And. A>=-1) Then Ang=Asin(A) Print *,Ang*180/3.141592,Tan(Ang) End If End

ساختار انتخاب- ر است ين ساختار به شرح زي ايحالت كل. از ساختار شرط است ين ساختار حالت خاصيا

Select Case) عبارت مورد نظر (

Case) حالت اول عبارت (

بلوك دستورات Case) حالت دوم عبارت (

بلوك دستورات. . . Case Default بلوك دستوراتEnd Select

:ر است ين ساختار معادل دستورات شرط زياThen ) يعبارت شرط== حالت اول ( If

بلوك دستورات

Then ) يعبارت شرط== حالت دوم ( Else If

بلوك دستورات. . . Else بلوك دستوراتEnd IF

Page 29: Fortran 90

29

ارت شود كه عبـ ي اجرا م يد بلوك دستورات زمان ي آ يسه دو ساختار باال بدست م يهمانگونه كه از مقا يعنـ ي در ساختار شرط اسـت Else معادل Case default از حاالت ذكر شده باشد و يكيمورد نظر

در .ن قـسمت اجـرا خواهـد شـد يـ ا ي دستور اجـرا نـشوند بلـوك دسـتور يچ كدام از بلوك ها ياگر ه .م شده است ير نماگرد دستور ترسير زيتصاو

Page 30: Fortran 90

30

د اشـتراك داشـته يـ د از نوع عبارت مورد نظر باشند و نبا يباد كه حاالت ذكر شده يد توجه داشته باش يبا Integer ، Character ، Logical از سـه حالـت يكي تنها انتخاب عبارت مورد نظر ساختار. باشند

. باشد يم را چـاپ 0نـصورت عـدد ير ا يـ و در غ 100ك وارد شـود برنامـه عـدد ير چنانچه عدد يدر دو برنامه ز

خواهد كرد حياستفاده از نوع صح: ل برنامه او

Integer A Read *,A Select Case (A) Case (1) Print *,”100” Case default Print *,”0” End select End

ياستفاده از نوع منطق: برنامه دوم Logical L1

Integer A Read *,A L1=(A==1) Select Case (L1) Case (.True.) Print *,”100” Case (.False.) Print *,”0” End select End

ح از عدد يه اعداد صح ي كل يعني n:mن صورت كه ي شود به ا ياستفاده م : جاد گستره انتخاب از ي ا يبراn تا عدد m ) با احتسابnو m ( وn: عـدد يح بزرگتر مـساو ي اعداد صحي تماميعني n و :m يعنـ ي

m عدد يا مساوي اعداد كوچكتر يتمام

شود و نـوع يك حرف از كاربر گرفته م ير يدر برنامه ز . ز استفاده كرد ي كاراكترها ن يا توان بر يم: از . شود يآن مشخص م

Character *1 C1 Read *,C1 Select Case (C1)

Case (“a”:”z”,”A”:”Z”) Print *,”Alphabetic”

Page 31: Fortran 90

31

Case ( “0”:”9”) Print *,”Number”

Case Default Print *,”Other”

End Select End

ن يهمچنـ . ك حالـت را قـرار داد يـ ش از ي تـوان بـ ي مـ Caseد كه در مقابل ي توان فهمياز برنامه باال م .ست ين حاالت ني بيچ اشتراكي باشد و هي نوع كاراكتر مز ايحالت عدد

دستور پرش ساده-

:م يم از دستور پرش استفاده كني توانيم مي شروع كني برنامه را از سطر خاصيم ادامه اجراياگر بخواهGoto Label

استفاده از دستور پرش بـدون . شود ي خط مقصد نوشته م ي باشد كه در ابتدا يك عدد م ي Labelكه ن مطلب آورده خواهد شد ي از ايدر ادامه مثال. غام خطا خواهد شد يش پي موجب نماLabelاختصاص

ي دستور پرش محاسبات-

Goto ( Label1 , Label2 , …)عدد

كـه بـه عنـوان يك باشـد بـه عـدد ين دستور ابتدا عدد مورد نظررا محاسبه كرده و چنانچه مقدار آن ياlabel 1چ يا هـ ي اعشار باشد و يا داراي و ياگر عدد مورد نظر منف... كند و ي نوشته شده است پرش م

Label دهد ي انجام نميكار خاص به آن اختصاص داده نشده باشد ، دستور . ، ي معادله درجه دو را تنهـا بـا اسـتفاده از دسـتور پـرش و دسـتور پـرش محاسـبات يشه ها ير ر يبرنامه ز : كند يمحاسبه م

Read *,A,B,C Delta=b**2-4*A*C Goto ( 10 , 20 ) Floor(Delta/(ABS(Delta)+1))+2 10 Print *,”there is no root “ Goto 30 20 Print *,”x1=”,(-B+Sqrt(Delta))/2/A Print *,”x2=”,(-B-Sqrt(Delta))/2/A 30 End

دستور ادامه- خط ي در ابتداLabelك ي اوقات به همراه ي شود و گاه ي نوشته م Continueن دستور به صورت يانـه ين زميـ در اي شود و كـاربرد خاصـ ي مين دستور باعث ادامه پردازش به خط بعدي ا ياجرا. د ي آ يم

.ز استفاده كرد ي خاتمه حلقه ني توان براين دستور مياز ا. ندارد

Page 32: Fortran 90

32

دستور توقف -

ن دستور به صـورت يا. شود ي برنامه و خاتمه برنامه استفاده م يات اجرا ي توقف عمل ين دستور برا ياز ا : شود يف مير تعريز

Stop [Stop-expresion] بستن برنامـه تحـت ي را برا يم عبارت ي كه بخواه ي در صورت را تنها به كار برد و Stopم دستور ي توان يم

در صـورت بـه كـار . م يك عدد را قرار دهـ يا يك رشته و يم ي توان يم م ي اختصاص ده handleعنوان . شود يبردن رشته عدد صفر منظور م

حلقه- ي ساختار گردش-

م ي دارنـد داشـته باشـ يصاعد عددر كه با هم تي متغ Nا يم ي بار انجام ده Nك عمل را يم يچنانچه بخواه شوند يم مي به سه دسته تقسNحلقه ها بر اساس .م ي كنياز ساختار حلقه استفاده م

حلقه نا محدود -

Do ] :نام حلقه[ ]بلوك دستورات[

End Do ]نام حلقه [

Do label ] :نام حلقه[ ]بلوك دستورات[

Label Continue ي حلقه محدود شرط-

]نام حلقه: [ Do [Label] [,] While ) يرطعبارت ش( ]بلوك دستورات [

End Do ]نام حلقه [

]نام حلقه: [ Do Label [,] While ) يعبارت شرط(

]بلوك دستورات[Label Continue

Page 33: Fortran 90

33

ي حلقه شمارش- ]نام حلقه: [ Do [Label]ر ينام متغ= ن ، كران باال يي كران پا]گام ،[

]بلوك دستورات[ End Do ]قه نام حل[

]نام حلقه: [ Do Labelرينام متغ= ن ، كران باال يي كران پا]گام ،[

]بلوك دستورات[Label Continue

: شود ي محاسبه مN !ير با استفاده از حلقه شمارشيدر برنامه ز

Read *,N Factoriel=1 Do i=1,N Factoriel=Factoriel*I End Do Print *,N,”!=”,Factoriel End

∑ر مقدار يدر برنامه ز=

100

0 !2

n

n

n : شود ي محاسبه و چاپ م

F=1 ; Sum=1 Do i= 1,100

F=F*I Sum=Sum+(2**i)/F

End Do Print *,Sum End

دستور خروج از حلقه-

ن يـ چنانچـه در مقابـل ا . است كه خود دستور در آن قـرار دارد ي خروج از حلقه اي برا Exitدستور . آن حلقه اجرا خواهد شد ي ذكر شود ، دستور خروج برايور نام حلقه ادست

دستور گردش حلقه -

انجام End Doن ي و اولCycleن ي برسد دستورات بCycle برنامه به دستور يچنانچه فرترن در اجرا .نخواهد شد

Page 34: Fortran 90

34

ن عبارت اسـت يقدار ا آن م يم و خروج يم كرده ا ي تقس 100 تا -100 را بر اعداد 1ر عدد يدر برنامه ز Cycleم بر صـفر از دسـتور ي انجام ندادن تقس ي ندارد و برا يم بر صفر معن يد تقس ي دان ي م همانطور كه .

:م ياستفاده كرده اDo i=-100 , 100

IF ( i==0) Cycle Print *,1./i.

End Do End

ستون سمت . نشان داده شده است ) در تو تو( گردش مركب ير نحوه استفاده از ساختارها يدر شكل ز . دهد يش ميراست استفاده نادرست و ستون سمت چپ استفاده درست را نما

Page 35: Fortran 90

35

Page 36: Fortran 90

36

Page 37: Fortran 90

فصل پنجم

خواندن و نوشتن

Page 38: Fortran 90

38

.)د يل بخواني به فاين بخش را همزمان با مطالب بخش دسترسيبهتر است مطالب ا( : شود ير استفاده مي ز از سه دستوريكي خواندن اطالعات از يبرا

Read) خواندن ي كنترلي هايژگيو (1ر ي، نام متغ...

Read ، قالب 1ر ي، نام متغ...

Write) خواندن ي كنترلي هايژگيو (1ر ي، نام متغ...

در . د بـه عمـل خوانـدن اسـت يـ ات جد ي افـزودن مشخـصات و خـصوص ي كنترل ي ها يژگيمنظور از و :ده شده اند ها آوريژگين وير ايجدول ز

د واژهيكل يژگيمقدار و حاتيتوض

به عبارت . كه مشخص كننده واحد ورود اطالعات است يعدد نماد *. باشد يك اشاره گر از محل ورود اطالعات ميگر يد

گاه اول داخل پرانتز قرار يچنانچه در جا. استاندارد است يورود .ست يدواژه الزم نيرد نوشتن كليگ

عدد[unit=]

. رهاست ي در متغيمشخص كننده نحوه خواندن و قرار دادن ورودگاه دوم يچنانچه در جا. ا بدون قالب است ي نماد فرمت آزاد *

ستيد واژه الزم نيرد نوشتن كليداخل پرانتز قرار گ

[=FMT] قالب

باشد در خواندن اطالعات با توجه به قالب در طول yesچنانچه نصورت پس از خواندن ير ايدر غ. كند يداده به جلو حركت م

از اول داده ي خواندن اطالعات بعدين داده ها براير از بين متغياول كنديشروع م

“yes” ا ي“no”

Advance

گفته شده Labelل به آخر آن برسد به يچنانچه در خواندن از فا كنديپرش م

Label END

گفته Label به ل به آخر ركورد برسديچنانچه در خواندن از فا . كند يشده پرش م

Label EOR

برخورد كند ييا نوشتن به خطايات خواندن ين عمليچنانچه در ح . كند ي گفته شده پرش مLabelبه

Label ERR

. باشد يل ميك خط از فايمنظور از ركورد در مطالب باال

Page 39: Fortran 90

39

: باال اعمال كرد يز در ساختارهايك حلقه را ني توان يم Read) خواندن ي كنترلي هايژگيو()...)

،نام 1شمارنده =گام ، كران باال ، كران پايين ( ،2شمارنده = گام ، كران باال ، كران پايين ( ، ( ... ، ... متغير

:د ير توجه كنيبه مثال زRead (*,*)((A(i,j),i=1,10),j=1,5))

:ر است ين دستور معادل دستور زياDo 1 i=1,10 Do 1 j=1,5 Read (*,*) A(i,j) 1 Continue

Page 40: Fortran 90

فصل ششم

)فرمت ( يقالب بند

Page 41: Fortran 90

41

جـاب ين مهـم ا يـ ن ا يبنـابرا . به خواندن و چاپ اطالعات اختصاص دارد يسي از برنامه نو يميبخش عظ و ن د يـ را بـه ا ي كرد به عبارت ساده تر بتوان حاالت خاص ي كند تا بتوان خواندن و نوشتن را سفارش يم

به عنوان . صفحه اشاره كرد يدانها و قالب بندي توان به اختصاص مين حاالت ميدستور داد از جمله اا در يـ برنامه نوشت كـه عمـل چـاپ اطالعـات از سـطر چهـام شـروع شـود و ي توان به گونه ا يمثال م

.ده فرض شود ي حرف اول ناد5خواندن اطالعات اجـرا يكـ ير گراف يـ فرترن در كنـسول غ يبرنامه ها . م يف كن يرا تعر دان يم م ييايدانها ب يح م يقبل از توض

م صفحه ي دانيم. م ي كن ي م يم بند ي ، ابتدا صفحه داس را تقس DOSط يگر در مح يا به عبارت د يشود يم pixel بـه نـام ياز نقـاط نـوران ) DOSصفحه ( شود ي برنامه ظاهر م ي كه در زمان اجرا ي رنگ يمشك شود در هـر يك كاراكتر استفاده ميش ي نما يكسل ها برا ين پ ي از ا يوع تعداد مجم. ل شده است يتشك

ين مجموعـه يـ از ا يحـال اگـر تعـداد . شـود يش داده مـ يك حرف نما ين مجموعه ها تنها يك از ا ي يل مـ يدان را تشك يك م يش داد ي حرف را نما ياديرند تا بتوان تعداد ز يگر قرار گ يكديكسل ها كنار يپ

ا يـ ح و ي از نـوع صـح يت مـشترك هـستند مـثال همگـ ي خـصوص ي دارا يگاه ها همگ ين جا يدهند البته ا . هستند ي از نوع رشته ايهمگ

اگر به خاطر داشـته . دانها را اعمال كرد ين م ي توان ا يم چگونه م ينيم ، بب يدان ها آشنا شد ياكنون كه با م ر را يـ دسـتور ز . ح داده شـد ير توض با نام قالب به طور مختص يژگيد در مبحث خواندن و نوشتن ، و يباش

:د يريدر نظر بگRead (*,*) A

م يحـال اگـر بخـواه . خواند يم) ت يبدون محدود( د با قالب آزاد ي را از صفحه كلAر ين دستور متغ يا :م ي كنير عمل مي از دو روش زيكيم به ير اعمال كنين متغيك قالب را بر اي

Read ( *,1) A 1 Format ( F6.2)

ا يRead (*,”(F6.2)”)A

ن يـ اي كه حاوي اختصاص داد كه در خط labelك شماره يد ي باFMTد در قسمت يني بيچنانچه مك يـ دان را در داخـل يم مي توان به طور مستقيا مي قرار دارد و Formatشماره است بالفاصله دستور

.ومه قرار داد يپرانتز و گن دستور پـرش داده نـشود اجـرا نخواهـد ي كه به ا ي زمان تا يعنيست ي ن يي دستور اجرا Formatدستور

تـوان آن را در هـر يد مـ يـ ايا نوشتن ب ي ندارد كه دستور فرمت در خط بعد از خواندن و يشد پس لزوم . برنامه قرار داد يقسمت از بدنه اصل

Space همـان ن منظـور از يي ذكـر شـده در پـا يدر مثال ها ( دان ها را شناخت ي م يد تمام ياكنون با ) شود يش داده نمي برنامه نماين اجراياست كه در ح

Page 42: Fortran 90

42

Iدان يم - : شود يف مير تعريدان به صورت زين ميا

Iدان ي طول م] . داني حداقل طول م[

ش يدان ، حداقل تعداد ارقـام نمـا ي ذكر شده در باالست و حداقل طول م يگاه ها يدان تعداد جا يطول م دان سـتاره يـ شتر باشـد ، بـه انـدازه طـول م يـ دان ب ي طول عدد از طول م چنانچه. دان است يداده شده در م

. شود يدان از سمت راست پر ميدان كمتر باشد ميچاپ خواهد شد و اگر طول عدد از طول م فرمت عدد يخروج حاتيتوض I3.3 11 011 است3دان يحداقل طول م

01 1 I3.2 I3.2 4000 *** دان كم استيطول م

0 I2.0 ستجز استثناها 0 0 I2.1

I3.2 11.1 *** رندي گي قرار ميح و عبارت منطقيدان تنها اعداد صحين ميدر ا B, O, Zدان مبنا ها ي م-

عـدد Bدان يم. د ي عمل كن Iدان ي مورد نظر برده و سپس مانند ميدان ها ابتدا عدد را به مبناين ميدر ا . برد ي م16 عدد را به Zو 8 ي عدد را به مبناO دو و يرا به مبنا

مورد يعدد در مبنا يخروج نظر

فرمت 10 يعدد در مبنا

1001 1001 9 B4 *** 1001 9 B3

01001 1001 9 B5.5 033 33 27 O4.3

7FFF 7FFF 32767 Z5

ا ي 2د از سه عد يكي عدد دوم كه يد كه دو عدد را گرفته و عدد اول را در مبنا يسي بنو ياكنون برنامه ا :ش دهد ي است نما16ا ي 8

Read *,N,IBase

Page 43: Fortran 90

43

Select case (IBase) Case (2)

Print “(B0)”,N Case (8) Print “(O0)”,N

Case (16) Print “(Z0)”,N End select End

دان بـه يـ شود كـه طـول م يجب م دان صفر در نظر گرفته شده است و مو يد طول م يني ب يهمانگونه كه م . باشد ياندازه خود خروج

Fدان ي م- :ر استي به صورت زيدان در حالت كلين ميا

Fدان ي ميطول كل. تعداد رقم اعشار گاه در نظر گرفته شـود يدان جاي ميست كه ابتدا به اندازه طول كل يدان كاف ين م ي ا ي محاسبه خروج يبرا

ز قـرار يـ گـاه بعـد مم ي گذاشته شـود در جا يگاه خالي رقم اعشار جاسپس از سمت راست به اندازه تعداد حـال . شـود يح اختـصاص داده مـ يدان به قسمت صـح يگاه ها در سمت چپ م يه جا ي شود و بق يداده م

دان ين م يآنچه در مورد ا . د شد يغام خطا مواجه خواه يد در لحظه اجرا با پ يدان را بساز يد م يچنانچه نتوان رد در يدان قرار گيح ميد بتواند به طور كامل در قسمت صح يح عدد با ي قسمت صح مهم است آنكه طول

دان يـ ميدان ستاره چـاپ خواهـد شـد و اگـر طـول قـسمت اعـشار ي مينصورت به تعداد طول كل ير ا يغ تواننـد قـرار ي اعـشار كـه در آن قـسمت مـ ي از رقمها ي عدد باشد تعداد يكمتر از طول قسمت اعشار

:د ير توجه كني زي فهم بهتر مطلب به مثالهايبرا. شوند يچاپ مرند با گرد كردن يگ

دانيم عدد يخروج حاتيتوض 15.50 15.5 F6.2

15.26 15.257 F6.2 عدد گرد شده است

F6.2 2115.25 ****** ردي گيدان قرار نميدر م

-10.10 -10.1 F6.2

12.1E2 F3.1 *** ابتدا عدد محاسبه شود F5.2 2.- 0.20- ت شوديد حتما رعايعشار باتعداد ارقام ا

Page 44: Fortran 90

44

ميدان نماد علمي -دو . به صورت زير است Eحالت كلي . تعيين مي شود E ، EN ، ESاين ميدان به وسيله سه مشخصه

.ميدان بعد نيز به همين صورت تعيين مي شوند Eدان ي ميطول كل . ي طول قسمت اعشار] E طول توان [

د سـپس از سـمت راسـت شـروع يـ گاه قرار ده يدان جا ي م يدانها ابتدا به اندازه طول كل ين م يدر هر سه ا در 2چنانچه طول توان نوشته نشده باشد آنـرا ( د ي توان جدا كن يگاه برا يكرده و به اندازه طول توان جا

ي را بـرا يگـاه بعـد يد ، جا يـ اختـصاص ده يا منفـ يگاه را به عالمت مثبت يك جا يسپس ) د يرينظر بگ د از حرف كوچـك يز باي نوشته شده باشد شما نeد كه اگر در فرمت يد توجه كن يري در نظر بگ Eحرف

ن مرحله به اندازه طـول قـسمت يبعد از ا . است Eد و اگر نوشته نشده باشد منظور همان يآن استفاده كن ي راسـت بـرا گـاه هـا در سـمت يه جايـ بق. د يـ ز اختصاص دهي را به مم يگاه بعد ياعشار جدا كرده و جا

ي مبنـ يغام خطـا ين اجرا با پ يد در ح يد كن يدان را تول ين م يد ا يچنانچه نتوان . ماند ي م يح باق يقسمت صح .د شد يدان مواجه خواهيبر اشتباه بودن م

موجـود در ي صـفرها يم از سمت چپ عـدد شـروع كـرده و تمـام يدان قرار ده يد عدد را در م يحال با م و در يسيـ نو يز م ي عدد بدست آمده را بعد مم Eدان ٍ يس در مورد م م سپ يري گ يده م يسمت چپ را ناد

سه رقم عدد ENدان يدر مورد م . م ي كن ي جا نشود آنرا گرد م ي كه كل عدد در قسمت اعشار يصورتك ي ESدان يدر مورد م. م ي دهيز قرار ميه را در سمت راست مميز و بقيبدست آمده را سمت چپ مم

د توجه كرد كـه در صـورت جـا نـشدن يبا. م يسي نو ي را در سمت راست م هيرقم را در سمت چپ و بق زان كوچـك شـدن يـ با محاسـبه م . رسد يحال نوبت به محاسبه قسمت توان م . د آنرا گرد كرد يعدد با اگر عـدد مـورد .ر كند ييدان كامال تغين ميممكن است عدد در ا. م ي كنيار مي را اخت يتوان مناسب ، عدد

بـاال قابـل ي از قـسمتها يكـ يچنانچـه . رد ي گ ي تعلق م يگاه در سمت چپ به منف يك جا ي بود ينظر منف :د ير توجه كني زياكنون به مثالها. دان ستاره چاپ خواهد شد ي مياجرا نباشد به اندازه طول كل

فرمت يورود يخروج

0.121E+03 121.454 E10.3 0.120E-02 0.0012 E10.3 1.001E+02 100.125 ES11.3

100.012E+01 1000.125 EN11.3 475.87E+03 475867.222 EN11.2

Page 45: Fortran 90

45

Lدان ي م- : شود يف مير تعريدان به صورت زين ميا

Lدان ي ميطول كل

ي را قـرار مـ Tا ي F از دو كلمه يكيگاه ين جا يگاه ها در آخر يجاد جا يار ساده بوده و با ا يدان بس ين م يا . شود يچاپ م T به صورت .True. مقدار L3دان يدر مبه عنوان نمونه دهد

A يدان رشته اي م- : شود ي قرار دادن متن استفاده ميدان براين مي ا

Aدان ي ميطول كل

شـود و در سـمت چـپ يدان پـر مـ يـ متن مورد نظر بزرگ باشد از سمت راسـت م يدان برا يچنانچه م دان چاپ خواهد يت متن به اندازه طول م نصورت از سمت راس ير ا ي گذارد و در غ ي م ي باق ي خال يجاها .دان نوشته نشود ، طول آن به اندازه طول متن خواهد بود ياگر طول م. شد

دانيم يورود يخروجAli Ali A4

Ali Ali Reza A3 Ali Reza Ali Reza A

شتر يـ تـرل ب كن ي مختلف بـرا يدانهاي را به م DOSم صفحه ي توان يم م يدان ها را شناخت ين م ياكنون كه ا

دستور تحت عنوان كنترل قالب وجود دارد كـه يدان ها تعداديم م ي و تنظ يي جابجا ياما برا م يم كن يتقس .م ي كنير به آنها اشاره ميدر ز

فرمان كنترل مثال حاتيتوض T 10 T n خواهد بود10 از ستون يدان بعديجاد ميا

TL 5 TL n رود يگاه به سمت چپ مي جا5 به اندازه يت فعلياز موقع TR 4 TR n روديگاه به سمت راست مي جا4 به اندازه يت فعلياز موقع

X n X 5 دهدي را قرار مي فاصله خال5 / [r] /3 اي /// كندي چاپ ميسه سطر خال

: كندير متوقف ميدانها را در صورت نبود متغيجاد ميادامه ا S كنديدا مي پيتگستم عامل بسياعداد به س+ قرار دادن عالمت

Page 46: Fortran 90

46

SP شودياعداد قرار داده م+ عالمت SS شودياعداد قرار داده نم+ عالمت

P k P 2 كندي ضرب مk بتوان 10عدد را در BN كند يك عدد را حذف مين ارقام ي بيفاصله خال BZ كند يل ميك عدد را به صفر تبدين ارقام ي بيفاصله خال

.د يمه مراجعه كنين فرمت ها به ضميز نحوه اعمال ا كامل اي آگاهيبرا

Page 47: Fortran 90

فصل هفتم

لي به فايدسترس

Page 48: Fortran 90

48

د نـام ي دانيهمانطور كه م. مختلف گفته شود يستم عامل هايل ها در سي در مورد نام فا يد نكات يابتدا با و ير وجود نام ضـرو . شوند ي از هم جدا م نقطهل متشكل از دو قسمت نام و پسوند است كه توسط يفا

ستم عامـل يـ ن مربـوط بـه س يد قـوان يـ لهـا با يد توجه داشت كـه در نـام فا يبا. است ياريوجود پسوند اخت حرف 8ل تنها ي و قبل از آن نام فاDOS 4.5به عنوان مثال در . ت كرد يستم را رعاي سيموجود بر رو

د از يـ نبا. اختـصاص دهـد كـاراكتر را بـه خـود 256 تواند تا يل م يندوزها نام فا يدر و . تواند باشد يم . ل ها استفاده كرد ير مجاز در نام فايف غوحر

:م يان كنيل ها را بيم دستورات باز كردن فاي خواهيم ، ميل آشنا شدياكنون كه با نام فا OPEN) ل يمشخصات باز كردن فا(

CLOSE) ل يمشخصات بستن فا(

ل يـ جهـت بـاز كـردن فا OPEN دستور د واژه ها هستند كه به ي از كل يك سر يمنظور از مشخصات ، .م ي پردازي تك تك آنها مياكنون به بررس. كنند يكمك م

- ACCESS ب يـ شـود كـه بـه ترت يان گفته ميبه دانشجو . د يار دار يان را در اخت ي دانشجو ي از اسام يستيد ل يفرض كن

د يـ توانيستم مي نفر بدا كردني پينك شما برايا. نند ي ها بنشي صندليست و به طور پشت سرهم بر رو يلامـا . ان وجـود دارد يست و نحوه نشـستن دانـشجو ين ل ي ب يبيرا ترت يد ز ي برو 20 شماره يما به صندل يمستق

ك يـ ي از نفـر قبـل بـر رو ين اجازه داده شود كه هر شخص بتواند با هـر فاصـله دلخـواه ياگر به آنها ا دا كردن نفـر يب از نفر اول شروع كرده و تا پ يتد به تر يستم با يدا كردن نفر ب ي پ يند آنگاه برا ي بنش يصندل

اگـر طـول هـر . ز صـادق اسـت يـ ل هـا ن يـ نا در مورد فا ين مثال ع يا. م ي خود ادامه ده يستم به جستجو يبد با پشت سر گذاشتن طـول ركـورد ي توان ي ام م n به ركورد ي دسترس يركورد كامال مشخص باشد برا

* (n-1) گـر متفـاوت ي ديورد هاد اما اگر طول هر ركورد با ركيبرس حرف به اول ركورد مورد نظروه اول را ياگـر شـ . م يدن بـه ركـورد مـورد نظـر بخـوان يست تك تـك ركوردهـا را تـا رسـ ي با يباشد م م يمستق ي برا ”Direct“ از دو عبارت يكي توان با نوشتن ي م يبي را ترت يم و دوم يم بنام ي مستق يدسترس

كـرد ل را مـشخص يـ بـه فا ينحـوه دسترسـ =Accessدر مقابـل يبـ ي ترت ي بـرا ”Sequential“ا يو . خواهد بود يبيش فرض ترتي پي نوشته نشود دسترسيچ عبارتيچنانچه ه.

- Action ل را صـرفا جهـت انجـام عمـل يـ م فاي تـوان ين است كه مـا مـ ي كه وجود دارد ا ياراتيگر از اخت ي د يكي

، ”Read” ، “Write“ سـه حالـت ي داراActionدواژه يـ كل. م يا فقط نوشتن باز كنـ يخواندن و “ReadWrite” حالـت فقـط ي حالت فقط خوانـدن و حالـت دوم بـرا يكه حالت اول برا . باشد ي م

ين دستور حالت سوم در نظر گرفته مـ يش فرض ايپ. انجام هر دو عمل است ينوشتن و حالت سوم برا .شود

Page 49: Fortran 90

49

- ERR ادامـه ERR دواژه يـ م در صـورت وجـود كل يخطـا مواجـه شـو غام يل با پ ين باز كردن فا يچنانچه در ح

. كند ي، پرش م آن ي نوشته شده در جلوLabelبرنامه به شماره - File

ك يـ م يچنانچـه بخـواه . كنـد قـرار داد يان ميل را بيق فاير دقيك متن كه مس يد ين كلمه با يدر مقابل ا ل ذكـر شـود يـ اگر تنهـا نـام فا . م يسي وجود بنود حتما پسوند آنرا در صورت يم با يل موجود را باز كن يفا . برنامه خواهد بود يرير قرار گيش فرض مسير پيمس- Position

باشد و محـل اشـاره گـر هـارد ي م ”ASIS” ، “Rewind” ، “Append“ از سه حالت يكيكه ش يحالـت اول پـ . كند ين م يي ، از اول و از آخر را تع يت فعل يب موقع ي باز كردن و جستو را به ترت يبرا

شود يفرض در نظر گرفته م- Status

ل مـورد نظـر ياگر فا . باز خواهد شد كه وجود داشته باشد يل تنها زمان ي باشد فا ”Old“اگر مقدار آن جـاد خواهـد شـد و در يل ايـ باشـد فا ”New“ اگر مقدار آن . وجود نداشته باشد ، خطا رخ خواهد داد

.غام خطا ظاهر خواهد شد ياشد پوجود داشته بش ياز پ كه يصورت كند و در صورت عـدم وجـود آنـرا ي باشد در صورت وجود آنرا باز م ”Unknown“اگر مقدار آن

”Replace“ يمقـدار بعـد . شـود يش فرض در نظر گرفته مـ ين حالت پ يا. كند يساخته و بعد باز م آنـرا پـاك كـرده و موجـود باشـد هـارد ي بـر رو شي از پـ ليكند اگر فا يل را ساخته و باز م ياست كه فا

مورد اسـتفاده ي زمان مي سازد tempيك فايل موقت در مسير ”Scratch“مقدار . سازد يمجددا م . ل ساخته شده با بسته شدن برنامه بسته شود است يد فايكه بارد ي گيقرار م

- Unit

ل سـاخته شـده يـ بـه فا unitك عـدد بـه عنـوان يـ د يـ كه تمام مشخصات بـاال نوشـته شـد با يحال زمان از يري جلـوگ يگـر بـرا يبه عبـارت د . ن عدد كار كرد ياختصاص داد تا در هنگام خواندن و نوشتن با ا

ل به برنامه اسـتفاده ي فاي جهت معرفUNIT. شود يك عدد استفاده م ينوشتن مجدد همه موارد باال از .رد ي گيباط داشته باشند مورد استفاده قرار مل باز شده ارتيد با فاي كه باي دستوراتي شود و در تماميم

: شوند يل دوم نوشته ميل اول دو بار در فاي خط اطالعات فا10. د ير توجه كنيبه مثال ز

Character *(*) A Open(Unit=2,File=”C:\data.dat”,ERR=23,Action=”Read”,Status=”Old”)

Page 50: Fortran 90

50

Open(Unit=3,File=”C:\data.out”,ERR=24,Action=”Write”,Status=”New”) Do i= 1, 10

Read (2,*)A Write(3,*) (A,j=1,2) End do

Close(2) Close(3) GOTO 25 23 PRINT *,”ERROR OPENING INPUT FILE” 24 PRINT *,”ERROR OPENING OUTPUT FILE” 25 End

ك طول يد ي شود و باي خطا محسوب م COMPAQ FORTRANن برنامه در يخط اول ا( )ف كرد ي تعرA ير رشته اي متغيك براياستا

د يـ ن كـار را انجـام نده يـ چنانچـه ا . م ي باز شده را بست يل ها يفا، ان كار يدپس از پا يني ب يهمانطور كه م . بندد يل ها را ميبرنامه خود به خود فا

Page 51: Fortran 90

فصل هشتم

برنامهيساختار كل

Page 52: Fortran 90

52

ر هـا در بـاال و يـ ف متغيـ م كـه تعر ي دانـ يمـ . شـد يمه نوشـته مـ برناينجا تمام كارها در بدنه اصل يتا به ا يم قسمت ها ي توان يحال م . شد ي ختم م Endبه كلمه برنامه شد و ين نوشته م ييگر در پا يدستورات د

رند ي توانند قرار گي مEndاز كلمه بعد م كهير برنامه به برنامه خود اضافه كني را تحت عنوان زيگريد -Function

يديـ ف توابـع جد يـ از بـه تعر ي خود ما ن ياز ما نوشته نشده اند و گاه ي تمام توابع مورد ن يسينامه نو در بر :م ي كنير استفاده مين منظور از ساختار زي ايم برايدار

Functionنام تابع ) ي ورود–ست آرگومان ها يل(

يبلوك دستور نام تابع... =

End Function را يا چنـد آرگومـان محاسـبات خاصـ يـ ك يد ، توابع با گرفتن يديه د همانطور كه در بحث توابع آماد

و حـداقل دارنـد يك خروجـ ين تنها ي كنند بنابرايره مير ذخيجه محاسبات را در نام متغ يانجام داده و نت ر يـ ر برنامـه ز يـ به عنوان مثال در ز. به آن اختصاص داده شود ير برنامه عدد يست در متن ز ي با يكبار م ي

يلـور نوشـته شـده اسـت و در بدنـه اصـل يق بـسط ت يـ ز طر ه ا يـ ك زاو ينوس ي محاسبه س ي برا Sin2تابع . شود ي نوشته مSin2 وSinاختالف دو تابع

Read *,A Print *,Sin(A)-Sin2(A) End Function Sin2(x) Sin2=x ; F=1 ; S=-1 Do i=3,20,2 F=F*(i-1)*i Sin2=Sin2+S*x**i/F S=S*-1 End do End Function

ن يـ ت شـود ا يـ د رعا ي كه با ينكته ا . د مانند توابع آماده است ي توابع جد يد فراخوان يني ب يهمانطور كه م بـه ي برنامه عدد اعـشار يد در بدنه اصل يف شد پس با ي تعر ي از نوع اعشار Sin2 تابع ياست كه ورود

.عنوان آرگومان قرار داده شود

Page 53: Fortran 90

53

- Subroutine نـصورت كـه يبـه ا م ي كنـ ي اسـتفاده مـ subroutineم از ي داشته باشيك خروجيش از يم ب ياگر بخواه . م ي كن ي استفاده م ي ها بعنوان خروج ي خود را به داخل تابع فرستاده و سپس از ورود ي ها يابتدا ورود .ر است ي به صورت زيساختار كل

Subroutineر برنامه ي نام ز ) ها ي ها و خروجيست وروديل( وراتبلوك دست

End Subroutine :م يسي نوين ساختار مياكنون برنامه باال را با ا

Read *,A Call Sin2(A,B) Print *,Sin(A)-B End Subroutine Sin2(x,y) y=x ; F=1 ; S=-1 Do i=3,20,2 F=F*(i-1)*i y=y+S*x**i/F S=S*-1 End do End Subroutine

. باشد ي مCall با دستورSubroutine يد فراخوانيني بي همانطور كه م

Page 54: Fortran 90

54

يسياز برنامه نويه توابع مورد نيست كليل : 1مه يضم

Name Description Argument/Function Type

ACOS ACOS(x). Returns the arc cosine of x in radians between 0 and pi. When ACOS is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ACOSD ACOSD(x). Returns the arc cosine of x in degrees between 0 and 180. When ACOSD is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ALOG ALOG(x). Returns natural log of x. x: REAL(4)

result: REAL(4)

ALOG10 ALOG10(x). Returns common log (base 10) of x.

x: REAL(4)

result: REAL(4)

ASIN ASIN(x). Returns arc sine of x in radians between ±pi/2. When ASIN is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ASIND ASIND(x). Returns arc sine of x in degrees between ±90°. When ASIND is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ATAN ATAN(x). Returns arc tangent of x in radians between ±pi/2. When ATAN is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ATAND ATAND(x). Returns arc tangent of x in degrees between ±90°. When ATAND is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

ATAN2 ATAN2(y, x). Returns the arc tangent of y/x in radians between ±pi . When ATAN2 is passed as an argument, y and x must be REAL(4).

y: Real

x: same as y

result: same type as y

ATAN2D ATAN2D(y, x). Returns the arc tangent of y/x in degrees between ±180°. When ATAN2D is passed as an argument, y and x must be REAL(4).

y: Real

x: same as y

result: same type as y

Page 55: Fortran 90

55

CCOS CCOS(x). Returns complex cosine of x. x: COMPLEX(4)

result: COMPLEX(4)

CDCOS CDCOS(x). Returns double-precision complex cosine of x.

x: COMPLEX(8)

result: COMPLEX(8)

CDEXP CDEXP(x). Returns double-precision complex value of e**x.

x: COMPLEX(8)

result: COMPLEX(8)

CDLOG CDLOG(x). Returns double-precision complex natural log of x.

x: COMPLEX(8)

result: COMPLEX(8)

CDSIN CDSIN(x). Returns double-precision complex sine of x.

x: COMPLEX(8)

result: COMPLEX(8)

CDSQRT CDSQRT(x). Returns double-precision complex square root of x.

x COMPLEX(8)

result: COMPLEX(8)

CEXP CEXP(x). Returns complex value of e**x. x: COMPLEX(4)

result: COMPLEX(4)

CLOG CLOG(x). Returns complex natural log of x. x: COMPLEX(4)

result: COMPLEX(4)

COS COS(x). Returns cosine of x radians. When COS is passed as an argument, x must be REAL(4).

x: Real or Complex

result: same type as x

COSD COSD(x). Returns cosine of x degrees. When COSD is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

COSH COSH(x). Returns the hyperbolic cosine of x. When COSH is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

COTAN COTAN (x). Returns cotangent of x in radians.

x: Real

result: same type as x

COTAND COTAND (x). Returns cotangent of x in degrees.

x: Real

Page 56: Fortran 90

56

result: same type as x

CSIN CSIN(x). Returns complex sine of x. x: COMPLEX(4)

result: COMPLEX(4)

CSQRT CSQRT(x). Returns complex square root of x.

x: COMPLEX(4)

result: COMPLEX(4)

DACOS DACOS(x). Returns double-precision arc cosine of x in radians between 0 and pi.

x: REAL(8)

result: REAL(8)

DACOSD DACOSD(x). Returns the arc cosine of x in degrees between 0 and 180. When DACOSD is passed as an argument, x must be REAL(4).

x: REAL(8)

result: REAL(8)

DASIN DASIN(x). Returns double-precision arc sine of x in radians between ±pi/2.

x: REAL(8)

result: REAL(8)

DASIND DASIND(x). Returns double-precision arc sine of x in degrees between ±90°.

x: REAL(8)

result: REAL(8)

DATAN DATAN(x). Returns double-precision arc tangent of x in radians between ±pi/2.

x: REAL(8)

result: REAL(8)

DATAND DATAND(x). Returns double-precision arc tangent of x in degrees between ±90°.

x: REAL(8)

result: REAL(8)

DATAN2 DATAN2(y, x). Returns double-precision arc tangent of y/x in radians between ±pi.

y: REAL(8)

x: REAL(8)

result: REAL(8)

DATAN2D DATAN2D(y, x). Returns double-precision arc tangent of y/x in degrees between ±180°.

y: REAL(8)

x: REAL(8)

result: REAL(8)

DCOS DCOS(x). Returns double-precision cosine of x in radians.

x: REAL(8)

result: REAL(8)

Page 57: Fortran 90

57

DCOSD DCOSD(x). Returns double-precision cosine of x in degrees.

x: REAL(8)

result: REAL(8)

DCOSH DCOSH(x). Returns double-precision hyperbolic cosine of x.

x: REAL(8)

result: REAL(8)

DCOTAN DCOTAN(x). Returns double-precision cotangent of x.

x: REAL(8)

result: REAL(8)

DEXP DEXP(x). Returns double-precision value of e**x

x: REAL(8)

result: REAL(8)

DLOG DLOG(x). Returns double-precision natural log of x.

x: REAL(8)

result: REAL(8)

DLOG10 DLOG10(x). Returns double-precision common log (base 10) of x.

x: REAL(8)

result: REAL(8)

DSIN DSIN(x). Returns double-precision sin of x in radians.

x: REAL(8)

result: REAL(8)

DSIND DSIND(x). Returns double-precision sin of x in degrees.

x: REAL(8)

result: REAL(8)

DSINH DSINH(x). Returns double-precision hyperbolic sine of x.

x: REAL(8)

result: REAL(8)

DSQRT DSQRT(x). Returns double-precision square root of x.

x: REAL(8)

result: REAL(8)

DTAN DTAN(x). Returns double-precision tangent of x in radians.

x: REAL(8)

result: REAL(8)

DTAND DTAND(x). Returns double-precision tangent of x in degrees.

x: REAL(8)

result: REAL(8)

DTANH DTANH(x). Returns double-precision hyperbolic tangent of x.

x: REAL(8)

Page 58: Fortran 90

58

result: REAL(8)

EXP EXP(x). Returns value of e**x. When EXP is passed as an argument, x must be REAL(4).

x: Real or Complex

result: same type as x

LOG LOG(x) Returns the natural log of x. x: Real or Complex

result: same type as x

LOG10 LOG10(x). Returns the common log (base 10) of x.

x: Real

result: same type as x

SIN SIN(x). Returns the sine of x radians. When SIN is passed as an argument, x must be REAL(4).

x: Real or Complex

result: same type as x

SIND SIND(x). Returns the sine of x degrees. When SIND is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

SINH SINH(x). Returns the hyperbolic sine of x. When SINH is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

SQRT SQRT(x). Returns the square root of x. When SQRT is passed as an argument, x must be REAL(4).

x: Real or Complex

result: same type as x

TAN TAN(x). Returns the tangent of x radians. When TAN is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

TAND TAND(x). Returns the tangent of x degrees. When TAND is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

TANH TANH(x). Returns the hyperbolic tangent of x. When TANH is passed as an argument, x must be REAL(4).

x: Real

result: same type as x

Page 59: Fortran 90

59

برنامه ها : 2مه يضم م دو عدد. م . محاسبه ب : 1برنامه

PROGRAM GreatestCommonDivisor IMPLICIT NONE INTEGER :: a, b, c WRITE(*,*) 'Two positive integers please --> ' READ(*,*) a, b IF (a < b) THEN ! since a >= b must be true, they c = a ! are swapped if a < b a = b b = c END IF DO ! now we have a <= b c = MOD(a, b) ! compute c, the reminder IF (c == 0) EXIT ! if c is zero, we are done. GCD = b a = b ! otherwise, b becomes a b = c ! and c becomes b END DO ! go back WRITE(*,*) 'The GCD is ', b END PROGRAM GreatestCommonDivisor

وتنيق رابطه نيك عدد از طريمحاسبه جذر : 2برنامه

PROGRAM SquareRoot IMPLICIT NONE REAL :: Input, X, NewX, Tolerance INTEGER :: Count READ(*,*) Input, Tolerance Count = 0 X = Input DO Count = Count + 1 NewX = 0.5*(X + Input/X) IF (ABS(X - NewX) < Tolerance) EXIT X = NewX END DO WRITE(*,*) 'After ', Count, ' iterations:' WRITE(*,*) ' The estimated square root is ', NewX WRITE(*,*) ' The square root from SQRT() is ', SQRT(Input) WRITE(*,*) ' Absolute error = ', ABS(SQRT(Input) - NewX) END PROGRAM SquareRoot

ك عددي عوامل اول يافتن تمامي : 3برنامه

PROGRAM Factorize IMPLICIT NONE INTEGER :: Input INTEGER :: Divisor

Page 60: Fortran 90

60

INTEGER :: Count WRITE(*,*) 'This program factorizes any integer >= 2 --> ' READ(*,*) Input Count = 0 DO IF (MOD(Input,2) /= 0 .OR. Input == 1) EXIT Count = Count + 1 WRITE(*,*) 'Factor # ', Count, ': ', 2 Input = Input / 2 END DO Divisor = 3 DO IF (Divisor > Input) EXIT DO IF (MOD(Input,Divisor) /= 0 .OR. Input == 1) EXIT Count = Count + 1 WRITE(*,*) 'Factor # ', Count, ': ', Divisor Input = Input / Divisor END DO Divisor = Divisor + 2 END DO END PROGRAM Factorize

10 در 10س يك ماتري ييش مثلث باالينما : 4برنامه

PROGRAM UpperTriangularMatrix IMPLICIT NONE INTEGER, PARAMETER :: SIZE = 10 INTEGER, DIMENSION(1:SIZE,1:SIZE) :: Matrix INTEGER :: Number INTEGER :: Position INTEGER :: i, j CHARACTER(LEN=100) :: Format READ(*,"(I5)") Number DO i = 1, Number READ(*,"(10I5)") (Matrix(i,j), j = 1, Number) END DO WRITE(*,"(1X,A)") "Input Matrix:" DO i = 1, Number WRITE(*,"(1X,10I5)") (Matrix(i,j), j = 1, Number) END DO WRITE(*,"(/1X,A)") "Upper Triangular Part:" Position = 2 DO i = 1, Number WRITE(Format,"(A,I2.2,A)") "(T", Position, ", 10I5)" WRITE(*,Format) (Matrix(i,j), j = i, Number) Position = Position + 5 END DO END PROGRAM UpperTriangularMatrix

چاپ جدول ضرب : 5مه برنا

Page 61: Fortran 90

61

PROGRAM Multiplication_Table IMPLICIT NONE INTEGER, PARAMETER :: MAX = 9 INTEGER :: i, j CHARACTER(LEN=80) :: FORMAT FORMAT = "(9(2X, I1, A, I1, A, I2))" DO i = 1, MAX WRITE(*,FORMAT) (i, '*', j, '=', i*j, j = 1, MAX) END DO END PROGRAM Multiplication_Table

مرتب كردن داده ها : 6برنامه

PROGRAM Sorting IMPLICIT NONE INTEGER, PARAMETER :: MAX_SIZE = 100 INTEGER, DIMENSION(1:MAX_SIZE) :: InputData INTEGER :: ActualSize INTEGER :: i READ(*,*) ActualSize, (InputData(i), i = 1, ActualSize) WRITE(*,*) "Input Array:" WRITE(*,*) (InputData(i), i = 1, ActualSize) CALL Sort(InputData, ActualSize) WRITE(*,*) WRITE(*,*) "Sorted Array:" WRITE(*,*) (InputData(i), i = 1, ActualSize) CONTAINS INTEGER FUNCTION FindMinimum(x, Start, End) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(IN) :: x INTEGER, INTENT(IN) :: Start, End INTEGER :: Minimum INTEGER :: Location INTEGER :: i Minimum = x(Start) Location = Start DO i = Start+1, End IF (x(i) < Minimum) THEN Minimum = x(i) Location = i END IF END DO FindMinimum = Location END FUNCTION FindMinimum SUBROUTINE Swap(a, b) IMPLICIT NONE INTEGER, INTENT(INOUT) :: a, b INTEGER :: Temp Temp = a

Page 62: Fortran 90

62

a = b b = Temp END SUBROUTINE Swap SUBROUTINE Sort(x, Size) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(INOUT) :: x INTEGER, INTENT(IN) :: Size INTEGER :: i INTEGER :: Location DO i = 1, Size-1 Location = FindMinimum(x, i, Size) CALL Swap(x(i), x(Location)) ! END DO END SUBROUTINE Sort END PROGRAM Sorting

يمحاسبه اعداد آرمسترانگ سه رقم : 7برنامه

PROGRAM ArmstrongNumber IMPLICIT NONE INTEGER :: a, b, c INTEGER :: abc, a3b3c3 INTEGER :: Count Count = 0 DO a = 0, 9 DO b = 0, 9 DO c = 0, 9 abc = a*100 + b*10 + c a3b3c3 = a**3 + b**3 + c**3 IF (abc == a3b3c3) THEN Count = Count + 1 WRITE(*,*) 'Armstrong number ', Count, ': ', abc END IF END DO END DO END DO END PROGRAM ArmstrongNumber

ي پولي توسط واحد هايالي ر1000جاد ي حاالت ايمحاسبه تمام : 8برنامه integer o open(2,file="c:\1000.txt",status="replace") write(2,*) "1000 Rls 500 Rls 200 Rls 100 Rls 50 Rls 20 Rls 10 Rls" write(2,*) "-------- ------- ------- ------- ------ ------ ------" do 1 i=0,1 !1000 rls do 1 j=0,2 !500 rls do 1 k=0,5 !200 rls do 1 l=0,10 !100 rls do 1 m=0,20 !50 rls do 1 n=0,50 !20 rls

Page 63: Fortran 90

63

do 1 o=0,100 !10 rls if & (i*1000+j*500+k*200+l*100+m*50+n*20+o*10==1000) then write(2,30) i,j,k,l,m,n,o end if 1 continue 30 format (3x,I1,10x,I1,9x,I1,9x,I2,7x,I2,7x,I2,6x,I3) end

. كه صفر وارد نشده است ي موم اعداد تا زمانينيمم و ميمحاسبه ماكز : 9برنامه Read *,A Nmax=A ; Nmin=A Do Read *,A Nmax=Max(A,Nmax) ; Nmin=Min(A,Nmin) IF (A==0.) Goto 11 End do 11 print *,"Max=",Nmax,"Min=",Nmin End

)ساده (دي به آنتحليل خرپا با اعمال نيروهاي عمو : 10برنامه

real ,allocatable :: f(:,:) real ,allocatable :: p(:) real A integer N character stat read *,N,A allocate(P(n+2)) allocate(f(-1:N+2,N+3)) do i= 1 , n+2 print *,"Please enter P",i,":" read *,P(i) pi=pi+p(i) end do Do j= 2,n+2 mp=mp+p(j)*(j-1)*A/2 end do t=(n-1)/2 g=floor(T) c2=mp/(g+1) c1=-c2+pi f(1,2)=c1*(1/sin(3.141592/3)) f(1,3)=-f(1,2)*cos(3.141592/3) f(0,2)=0 f(n+1,n+3)=0 f(n+2,n+1)=0 f(n+2,n+2)=0 do j=2, n+1 f(j,j+1)=-f(j-1,j)+p(j) f(j,j+2)=f(j-2,j)+f(j-1,j)*cos(3.141592/3)-f(j,j+1)*cos(3.141592/3) end do print *,"-----------------------------------------------" print *,"Calculation process completed" print *,"c1=",C1 print *,"c2=",C2 print *,"=",50/SIN(3.141592/3)

Page 64: Fortran 90

64

print *,"Now is the time to Show th information" 1 read *,Nj print *,"-----------------------------------------------" if (F(nj,nj+2)<0) then STAT="T" else STAT="C" END IF print *,"F(",Nj,",",Nj+2,")=",ABS(f(NJ,NJ+2)) ,"(",STAT,")" if (F(nj,nj+1)<0) then STAT="T" else STAT="C" END IF print *,"F(",Nj,",",Nj+1,")=",ABS(f(NJ,NJ+1)),"(",STAT,")" if (F(nj-2,nj)<0) then STAT="T" else STAT="C" END IF print *,"F(",Nj-2,",",Nj,")=",ABS(f(NJ-2,NJ)),"(",STAT,")" if (F(nj-1,nj)<0) then STAT="T" else STAT="C" END IF print *,"F(",Nj-1,",",Nj,")=",ABS(f(NJ-1,NJ)),"(",STAT,")" if (P(nj)<0) then STAT="T" else STAT="C" END IF print *,"P(",Nj,")=",ABS(P(NJ)),"(",STAT,")" goto 1 end

N در Nس يجمع و ضرب دو ماتر : 11برنامه program MAT_Calculation character c real ,allocatable,dimension(:,:)::A,B,M,S 1 print *,"Please enter the N that belongs to matrices A & B:" read *,N allocate (a(N,N)) allocate (B(N,N)) allocate (S(N,N)) allocate (M(N,N)) do i= 1,N do J=1,N print *,"please enter the ",i,"&",j,"object of matrices" read *,a(i,J) read *,b(i,j) s(i,j)=a(i,j)+b(i,j) end do end do

Page 65: Fortran 90

65

do t= 1 , N g=0 do while (g<N) g=g+1 do j=1,n tm=tm+A(t,j)*b(j,g) end do end do m(t,g)=tm tm=0 end do do i=1,n WRITE(*,11) (M(i,j), j = 1, n) end do print *,"Do you want to do again?" read *,C if (c=="N" .or. c=="NO" .or. c=="n" .or. c=="no") goto 12 goto 1 12 end

.ه مقلوب است يك آرايا ينكه آيص ايتشخ : 12برنامه PROGRAM Palindrome IMPLICIT NONE INTEGER, PARAMETER :: LENGTH = 30 ! maximum array size INTEGER, DIMENSION(1:LENGTH) :: x ! the array INTEGER :: Size ! actual array size (input) INTEGER :: Head ! pointer moving forward INTEGER :: Tail ! pointer moving backward INTEGER :: i ! running index READ(*,*) Size, (x(i), i = 1, Size) ! read in the input array WRITE(*,*) "Input array:" ! display the input WRITE(*,*) (x(i), i = 1, Size) Head = 1 ! scan from the beginning Tail = Size ! scan from the end DO ! checking array IF (Head >= Tail) EXIT ! exit if two pointers meet IF (x(Head) /= x(Tail)) EXIT !exit if two elements not equal Head = Head + 1 ! equal. Head moves forward Tail = Tail - 1 ! and Tail moves backward END DO ! until done WRITE(*,*) IF (Head >= Tail) THEN ! if Head cross Tail, then we have WRITE(*,*) "The input array is a palindrome" ELSE WRITE(*,*) "The input array is NOT a palindrome" END IF END PROGRAM Palindrome

سيك ماتري ييرسم مثلث باال : 13برنامه

PROGRAM UpperTriangularMatrix IMPLICIT NONE

Page 66: Fortran 90

66

INTEGER, PARAMETER :: SIZE = 10 INTEGER, DIMENSION(1:SIZE,1:SIZE) :: Matrix INTEGER :: Number INTEGER :: Position INTEGER :: I, j CHARACTER(LEN=100) :: Format READ(*,"(I5)") Number DO i = 1, Number READ(*,"(10I5)") (Matrix(i,j), j = 1, Number) END DO WRITE(*,"(1X,A)") "Input Matrix:" DO i = 1, Number WRITE(*,"(1X,10I5)") (Matrix(i,j), j = 1, Number) END DO WRITE(*,"(/1X,A)") "Upper Triangular Part:" Position = 2 DO i = 1, Number WRITE(Format,"(A,I2.2,A)") "(T", Position, ", 10I5)" WRITE(*,Format) (Matrix(i,j), j = i, Number) Position = Position + 5 END DO END PROGRAM UpperTriangularMatrix

خ به سال و ماه و روزيل عدد تاريتبد : 14رنامه ب

PROGRAM YYYYMMDDConversion IMPLICIT NONE INTERFACE ! interface block SUBROUTINE Conversion(Number, Year, Month, Day) INTEGER, INTENT(IN) :: Number INTEGER, INTENT(OUT) :: Year, Month, Day END SUBROUTINE Conversion END INTERFACE INTEGER :: YYYYMMDD, Y, M, D DO ! loop until a zero is seen WRITE(*,*) "A YYYYMMDD (e.g.,19971027) please (0 to stop)-> " READ(*,*) YYYYMMDD ! read in the value IF (YYYYMMDD == 0) EXIT ! if 0, then bail out CALL Conversion(YYYYMMDD, Y, M, D) ! do conversation WRITE(*,*) "Year = ", Y ! display results WRITE(*,*) "Month = ", M WRITE(*,*) "Day = ", D WRITE(*,*) END DO END PROGRAM YYYYMMDDConversion ! ------------------------------------------------------------------ ! SUBROUTINE Conversion(): ! This external subroutine takes an integer input Number in the ! form of YYYYMMDD and convert it to Year, Month and Day. ! ------------------------------------------------------------------ SUBROUTINE Conversion(Number, Year, Month, Day) IMPLICIT NONE

Page 67: Fortran 90

67

INTEGER, INTENT(IN) :: Number INTEGER, INTENT(OUT) :: Year, Month, Day Year = Number / 10000 Month = MOD(Number, 10000) / 100 Day = MOD(Number, 100) END SUBROUTINE Conversion

محاسبه مكان و سرعت پرتابه :15برنامه

! ------------------------------------------------------------------ ! Given t, the time since launch, u, the launch velocity, a, the ! initial angle of launch (in degree),and g, the acceleration due to ! gravity, this program computes the position (x and y coordinates) ! and the velocity (magnitude and direction) of a projectile. ! ------------------------------------------------------------------ PROGRAM Projectile IMPLICIT NONE REAL, PARAMETER :: g = 9.8 ! acceleration due to gravity REAL, PARAMETER :: PI = 3.1415926 ! you knew this. didn't you REAL :: Angle ! launch angle in degree REAL :: Time ! time to flight REAL :: Theta ! direction at time in degree REAL :: U ! launch velocity REAL :: V ! resultant velocity REAL :: Vx ! horizontal velocity REAL :: Vy ! vertical velocity REAL :: X ! horizontal displacement REAL :: Y ! vertical displacement READ(*,*) Angle, Time, U Angle = Angle * PI / 180.0 ! convert to radian X = U * COS(Angle) * Time Y = U * SIN(Angle) * Time - g*Time*Time / 2.0 Vx = U * COS(Angle) Vy = U * SIN(Angle) - g * Time V = SQRT(Vx*Vx + Vy*Vy) Theta = ATAN(Vy/Vx) * 180.0 / PI WRITE(*,*) 'Horizontal displacement : ', X WRITE(*,*) 'Vertical displacement : ', Y

Page 68: Fortran 90

68

WRITE(*,*) 'Resultant velocity : ', V WRITE(*,*) 'Direction (in degree) : ', Theta END PROGRAM Projectile

ر نمودار تابع داده شده يمحاسبه مساحت ز : 16برنامه

program area C******************************************************************** C Compute area under the curve y = x**2 + 1 given user defined C stop and stepsize C******************************************************************* real start, stop, delta, sum print *, 'Enter the interval endpoints and number of', + ' subintervals:' read *, start, stop, n delta = (stop - start) / n ! INCREMENT SIZE sum = 0 x = start + delta / 2 print *, x print *, x, stop, delta do 10 rcnt = x, stop, delta height = rcnt**2+1 area = height * delta sum = sum + area print *, height, delta, rcnt, area, sum 10 continue print *, 'Appx area using ',n,' subintervals is ',sum stop end

ه هاين آرايافتن داده خاص در بي :17برنامه

! ------------------------------------------------------------------ ! PROGRAM TableLookUp ! Given an array and a input value, this program can determine if ! the value if in the table. If it is, the array location where the ! value is stored is returned. ! ------------------------------------------------------------------ PROGRAM TableLookUp IMPLICIT NONE INTEGER, PARAMETER :: TableSize = 100 INTEGER, DIMENSION(1:TableSize) :: Table INTEGER :: ActualSize INTEGER :: Key INTEGER :: Location

Page 69: Fortran 90

69

INTEGER :: i INTEGER :: end_of_input READ(*,*) ActualSize ! read in the actual size and table READ(*,*) (Table(i), i = 1, ActualSize) WRITE(*,*) "Input Table:" WRITE(*,*) (Table(i), i = 1, ActualSize) WRITE(*,*) DO ! keep reading in a key value WRITE(*,*) "A search key please --> " READ(*,*,IOSTAT=end_of_input) Key IF (end_of_input < 0) EXIT ! EXIT of end-of-file reached Location = LookUp(Table, ActualSize, Key)! do a table look up IF (Location > 0) THEN ! display the search result WRITE(*,*) "Key value ", Key, " location ", Location ELSE WRITE(*,*) "Key value ", Key, " is not found" END IF END DO WRITE(*,*) WRITE(*,*) "Table lookup operation completes" CONTAINS ! ------------------------------------------------------------------ ! INTEGER FUNCTION LookUp(): ! Given an array x() and a key value Data, this function determines ! if Data is a member of x(). If it is, the index where Data can be ! found is returned; otherwise, it returns 0. ! ------------------------------------------------------------------ INTEGER FUNCTION LookUp(x, Size, Data) IMPLICIT NONE INTEGER, DIMENSION(1:), INTENT(IN) :: x INTEGER, INTENT(IN) :: Size INTEGER, INTENT(IN) :: Data INTEGER :: i LookUp = 0 ! assume not found DO i = 1, Size ! check each array element IF (x(i) == Data) THEN ! is it equal to Data? LookUp = i ! YES, found. Record location EXIT ! and bail out END IF END DO END FUNCTION LookUp END PROGRAM TableLookUp

يله ايرسم نمودار م : 18برنامه

PROGRAM VerticalBarChart IMPLICIT NONE CHARACTER(LEN=*), PARAMETER :: Part1 = "(1X, I5, A," CHARACTER(LEN=*), PARAMETER :: Part2 = "A, A, I2, A)" CHARACTER(LEN=2) :: Repetition CHARACTER(LEN=10), PARAMETER :: InputFormat = "(I5/(5I5))" INTEGER :: Number, i, j

Page 70: Fortran 90

70

INTEGER, DIMENSION(1:100) :: Data READ(*,InputFormat) Number, (Data(i), i=1, Number) DO i = 1, Number IF (Data(i) /= 0) THEN WRITE(Repetition,"(I2)") Data(i) WRITE(*,Part1 // Repetition // Part2) Data(i), " |", & ("*", j=1,Data(i)), " (", Data(i), ")" ELSE WRITE(*,"(1X, I5, A, I2, A)") Data(i), " | (", Data(i)& , ")" END IF END DO END PROGRAM VerticalBarChart

خيش ساعت و تاري نما :19برنامه PROGRAM CLOCK ! Program asking the computer for date and time IMPLICIT NONE CHARACTER (LEN=8) DATE ! date in format ccyymmdd CHARACTER (LEN=10) TIME ! time in format hhmmss.sss CHARACTER (LEN=5) ZONE ! time zone (rel to UTC) as Shhmm INTEGER VALUES(8) ! year, month, day, mins from UTC, ! hours, min, sec, msec CHARACTER (LEN=8) TIMESTRING ! time in the format hh:mm:ss CHARACTER (LEN=10) DATESTRING ! date in the format dd-mm-yyyy ! Ask the system for the date and time CALL DATE_AND_TIME( DATE, TIME, ZONE, VALUES ) ! Convert to desired format TIMESTRING = TIME( 1:2 ) // ':' // TIME( 3:4 ) // ':' // TIME( 5:6 ) DATESTRING = DATE( 7:8 ) // '-' // DATE( 5:6 ) // '-' // DATE( 1:4 ) ! Output the desired time and date PRINT *, 'It is ', TIMESTRING, ' on ', DATESTRING END PROGRAM CLOCK

آنهاي جدول زوابا و روابط مثلثات :20برنامه

PROGRAM TRIG_TABLE ! Compiles a table of SIN, COS, TAN against angle in DEGREES IMPLICIT NONE INTEGER DEG ! angle in degrees REAL RAD ! angle in radians REAL PI ! mathematical pi CHARACTER (LEN=*), PARAMETER :: FMTHEAD = '( 1X, A3, 3( 2X, A7 ) )' CHARACTER (LEN=*), PARAMETER :: FMTDATA = '( 1X, I3, 3( 2X, F7.4 ) )' ! formats for headings and data PI = 4.0 * ATAN( 1.0 ) WRITE ( *, FMTHEAD ) 'Deg', 'Sin', 'Cos', 'Tan' DO DEG = 0, 80, 10 RAD = DEG * PI / 180.0 WRITE ( *, FMTDATA ) DEG, SIN( RAD ), COS( RAD ), TAN( RAD ) END DO END PROGRAM TRIG_TABLE

يبرنامه جدول توان :21برنامه

Page 71: Fortran 90

71

PROGRAM EXPTABLE ! Program tabulates EXP(X) IMPLICIT NONE INTEGER :: NSTEP = 15 ! number of steps REAL :: XMIN = 0.0, XMAX = 3.0 ! interval limits REAL DELTAX ! step size REAL X ! current X value INTEGER I ! a counter ! Format specifiers CHARACTER (LEN=*), PARAMETER :: FMT1 = '( 1X, A4 , 2X, A10 )' CHARACTER (LEN=*), PARAMETER :: FMT2 = '( 1X, F4.2, 2X, 1PE10.3 )' DELTAX = ( XMAX - XMIN ) / NSTEP ! calculate step size WRITE ( *, FMT1 ) 'X', 'EXP' ! write headers DO I = 0, NSTEP X = XMIN + I * DELTAX ! set X value WRITE ( *, FMT2 ) X, EXP( X ) ! write data END DO END PROGRAM EXPTABLE

ك متنيز يبرنامه آنال :22برنامه

PROGRAM ANALYSE_TEXT IMPLICIT NONE INTEGER :: IO = 0 ! holds i/o status INTEGER :: NLETTERS = 0 ! number of letters read INTEGER :: NWORDS = 0 ! number of words read CHARACTER CH, LAST_CH ! successive characters CHARACTER (LEN=*), PARAMETER :: ALPHABET = & 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' CHARACTER, PARAMETER :: SPACE=' ' LAST_CH = SPACE ! Open the text file OPEN ( 10, FILE = 'text.dat' ) ! Read characters one-by-one until end of file is reached DO WHILE ( IO /= -1 ) ! IO=-1 means EOF ! Read one character READ ( 10, '( A1 )', IOSTAT = IO, ADVANCE = 'NO' ) CH IF ( IO == 0 ) THEN ! a character has been read PRINT *, 'Character = ', CH ! Is it a new word? IF (LAST_CH == SPACE .AND. CH /= SPACE ) NWORDS = NWORDS + 1 ! Is it a letter of the alphabet or something else? IF ( INDEX( ALPHABET, CH ) /= 0 ) NLETTERS = NLETTERS + 1 LAST_CH = CH ! update last character ELSE ! end of line or end of file PRINT *, 'IO = ', IO LAST_CH = SPACE END IF END DO ! Close the text file CLOSE (10) ! Output the analysis PRINT *, 'Number of letters = ', NLETTERS PRINT *, 'Number of words = ', NWORDS END PROGRAM ANALYSE_TEXT

ين به قطبيل مختصات كارتزيتبد :23برنامه

PROGRAM COORDINATES ! Program to convert from Cartesian to polar coordinates IMPLICIT NONE

Page 72: Fortran 90

72

EXTERNAL POLARS REAL X, Y REAL R, THETA PRINT *, 'Input coordinates X and Y' READ *, X, Y CALL POLARS( X, Y, R, THETA ) PRINT *, 'R, THETA =', R, THETA END PROGRAM COORDINATES !========================= SUBROUTINE POLARS( X, Y, R, THETA ) ! Subroutine transforming input (X, Y) to output (R, THETA) IMPLICIT NONE REAL, INTENT(IN) :: X, Y ! cartesian coordinates (input) REAL, INTENT(OUT) :: R, THETA ! polar coordinates (output) REAL, PARAMETER :: PI = 3.141593 ! the constant pi R = SQRT( X ** 2 + Y ** 2 ) ! radius THETA = ATAN2( Y, X ) ! inverse tangent between -pi and pi IF ( THETA < 0.0 ) THETA = THETA + 2.0 * PI ! angle between 0 and 2 pi THETA = THETA * 180.0 / PI ! convert to degrees END SUBROUTINE POLARS

گريرها با بكدي مقدار متغييجابجا :24برنامه

PROGRAM EXAMPLE ! Program to swap two numbers IMPLICIT NONE EXTERNAL SWAP INTEGER I, J PRINT *, 'Input integers I and J' READ *, I, J CALL SWAP( I, J ) PRINT *, 'Swapped numbers are ', I, J END PROGRAM EXAMPLE !======================================= SUBROUTINE SWAP( M, N ) IMPLICIT NONE INTEGER M, N ! numbers to be swapped INTEGER TEMP ! temporary storage TEMP = M ! store number before changing it M = N N = TEMP END SUBROUTINE SWAP

.ن دو نمره داده شده است ي كه معدلشان بيش نام دانشجوبانينما :25برنامه

PROGRAM Student_Average INTEGER N REAL , ALLOCATABLE :: Score(:) REAL Min,MAX CHARACTER , ALLOCATABLE,DIMENSION(:) :: Name(:)*20 PRINT *,"Please enter the number of students :" READ (*,"(I)") N ALLOCATE(Score(N)) ALLOCATE(Name(N)) DO I= 1 , N PRINT *,"Enter the name of the student number ",I READ (*,"(A20)") Name(I)

Page 73: Fortran 90

73

PRINT *,"Enter the score of the student number ",I READ (*,"(F5.2)") Score(I) END DO PRINT *,"Please enter the min & max score " READ (*,"(F5.2,F5.2)") Min,Max IF (Min>Max) THEN A=Max Max=Min Min=A END IF DO J=1,N IF (Score(J)>=Min .AND. Score(J)<=Max ) THEN PRINT "(A20,F5.2)" , Name(J),Score(J) END IF END DO END PROGRAM Student_Average

محاسبه مساحت مثلث :26برنامه

program Triangle real a, b, c print *, 'Enter the lengths of the three sides of the triangle' read *, a, b, c print *, 'Triangle''s area: ', triangleArea( a, b, c ) contains function triangleArea( a, b, c ) real triangleArea real, intent( in ) :: a, b, c real theta real height theta = acos( ( a**2 + b**2 - c**2 ) / ( 2.0 * a * b ) ) height = a * sin( theta ) triangleArea = 0.5 * b * height end function triangleArea end program Triangle

اريانس و انحراف از معيرن ، وايانگيمحاسبه م :27برنامه PROGRAM EXAMPLE ! Program computes mean, variance and standard deviation IMPLICIT NONE EXTERNAL STATS ! subroutine to be used INTEGER NVAL ! number of values REAL, ALLOCATABLE :: X(:) ! data values REAL MEAN, VARIANCE, STANDARD_DEVIATION ! statistics INTEGER N ! a counter ! Open data file OPEN ( 10, FILE = 'stats.dat' ) ! Read the number of points and set aside enough memory READ ( 10, * ) NVAL ALLOCATE ( X(NVAL) ) ! Read data values READ ( 10, * ) ( X(N), N = 1, NVAL ) CLOSE ( 10 ) ! Compute statistics CALL STATS( NVAL, X, MEAN, VARIANCE, STANDARD_DEVIATION )

Page 74: Fortran 90

74

! Output results PRINT *, 'Mean = ', MEAN PRINT *, 'Variance = ', VARIANCE PRINT *, 'Standard deviation = ', STANDARD_DEVIATION ! Recover computer memory DEALLOCATE ( X ) END PROGRAM EXAMPLE !=================================================== SUBROUTINE STATS( N, X, M, VAR, SD ) ! This works out the sample mean, variance and standard deviation IMPLICIT NONE INTEGER, INTENT(IN) :: N ! array size REAL, INTENT(IN) :: X(N) ! data values REAL, INTENT(OUT) :: M, VAR, SD ! statistics ! Calculate statistics using array operation SUM M = SUM( X ) / N ! mean VAR = SUM( X * X ) / N - M ** 2 ! variance SD = SQRT( VAR ) ! standard deviation END SUBROUTINE STATS

له روش نصف كردن ي معادله بوسيشه هايافتن ري:28برنامه

! ------------------------------------------------------------------- ! This program solves equations with the Bisection Method. Given ! a function f(x) = 0. The bisection method starts with two values, ! a and b such that f(a) and f(b) have opposite signs. That is, ! f(a)*f(b) < 0. Then, it is guaranteed that f(x)=0 has a root in ! the range of a and b. This program reads in a and b (Left and !Right ! in this program) and find the root in [a,b]. ! In the following, function f() is REAL FUNCTION Funct() and ! solve() is the function for solving the equation. ! ------------------------------------------------------------------- PROGRAM Bisection IMPLICIT NONE REAL, PARAMETER :: Tolerance = 0.00001 REAL :: Left, fLeft REAL :: Right, fRight REAL :: Root WRITE(*,*) 'This program can solves equation F(x) = 0' WRITE(*,*) 'Please enter two values Left and Right such that ' WRITE(*,*) 'F(Left) and F(Right) have opposite signs.' WRITE(*,*) WRITE(*,*) 'Left and Right please --> ' READ(*,*) Left, Right ! read in Left and Right fLeft = Funct(Left) ! compute their function values fRight = Funct(Right) WRITE(*,*) WRITE(*,*) 'Left = ', Left, ' f(Left) = ', fLeft

Page 75: Fortran 90

75

WRITE(*,*) 'Right = ', Right, ' f(Right) = ', fRight WRITE(*,*) IF (fLeft*fRight > 0.0) THEN WRITE(*,*) '*** ERROR: f(Left)*f(Right) must be negative ***' ELSE Root = Solve(Left, Right, Tolerance) WRITE(*,*) 'A root is ', Root END IF CONTAINS ! ------------------------------------------------------------------- ! REAL FUNCTION Funct() ! This is for function f(x). It takes a REAL formal argument and ! returns the value of f() at x. The following is sample function ! with a root in the range of -10.0 and 0.0. You can change the ! expression with your own function. ! ------------------------------------------------------------------- REAL FUNCTION Funct(x) IMPLICIT NONE REAL, INTENT(IN) :: x REAL, PARAMETER :: PI = 3.1415926 REAL, PARAMETER :: a = 0.8475 Funct = SQRT(PI/2.0)*EXP(a*x) + x/(a*a + x*x) END FUNCTION Funct ! ------------------------------------------------------------------- ! REAL FUNCTION Solve() ! This function takes Left - the left end, Right - the right end, ! and Tolerance - a tolerance value such that f(Left)*f(Right) < 0 ! and find a root in the range of Left and Right. ! This function works as follows. Because of INTENT(IN), this ! function cannot change the values of Left and Right and therefore ! the values of Left and Right are saved to a and b. ! Then, the middle point c=(a+b)/2 and its function value f(c) ! is computed. If f(a)*f(c) < 0, then a root is in [a,c]; otherwise, ! a root is in [c,b]. In the former case, replacing b and f(b) with ! c and f(c), we still maintain that a root in [a,b]. In the latter, ! replacing a and f(a) with c and f(c) will keep a root in [a,b]. ! This process will continue until |f(c)| is less than Tolerance and ! hence c can be considered as a root. ! ------------------------------------------------------------------- REAL FUNCTION Solve(Left, Right, Tolerance) IMPLICIT NONE REAL, INTENT(IN) :: Left, Right, Tolerance REAL :: a, Fa, b, Fb, c, Fc a = Left ! save Left and Right b = Right Fa = Funct(a) ! compute the function values Fb = Funct(b) IF (ABS(Fa) < Tolerance) THEN ! if f(a) is already small Solve = a ! then a is a root ELSE IF (ABS(Fb) < Tolerance) THEN ! is f(b) is small Solve = b ! then b is a root ELSE ! otherwise,

Page 76: Fortran 90

76

DO ! iterate .... c = (a + b)/2.0 ! compute the middle point Fc = Funct(c) ! and its function value IF (ABS(Fc) < Tolerance) THEN ! is it very small? Solve = c ! yes, c is a root EXIT ELSE IF (Fa*Fc < 0.0) THEN ! do f(a)*f(c) < 0 ? b = c ! replace b with c Fb = Fc ! and f(b) with f(c) ELSE ! then f(c)*f(b) < 0 holds a = c ! replace a with c Fa = Fc ! and f(a) with f(c) END IF END DO ! go back and do it again END IF END FUNCTION Solve END PROGRAM Bisection

ييمربع جادو: 29برنامه

! This program prints a magic squares array, an n by n matrix in ! each integer 1, 2, ..., n*n appears exactly once and all columns, ! rows, and diagonals sum to the same number. ! Here is the result of a sample run: ! Order of magic squares matrix? 7 ! 30 39 48 1 10 19 28 ! 38 47 7 9 18 27 29 ! 46 6 8 17 26 35 37 ! 5 14 16 25 34 36 45 ! 13 15 24 33 42 44 4 ! 21 23 32 41 43 3 12 ! 22 31 40 49 2 11 20 module stdtypes ! symbolic name for kind type of 4 byte integers integer, parameter, public :: i4 = selected_int_kind (9) ! one-byte storage of logical values. if unavailable, use default ! logical by uncommenting default logical definition above. integer (kind = i4), parameter, public :: lg = 1_i4 end module stdtypes module indexCheckM use stdtypes private public :: indexChecker contains function indexChecker (row, col, rowdim, coldim) result(indexCheck)

Page 77: Fortran 90

77

integer (kind = i4), intent (in) :: row, col, rowdim, coldim logical (kind = lg) :: indexCheck if (row >= 1 .and. row <= rowdim .and. col >= 1 .and. col <= coldim) then indexCheck = .true. else indexCheck = .false. end if end function indexChecker end module indexCheckM program magicSquares use stdtypes use indexCheckM integer (kind = i4) :: matrixOrder, ios integer (kind = i4), dimension (:,:), pointer :: matrix integer (kind = i4) :: row, col, prow, pcol, k character (len = 32) :: rowformat write (unit = *, fmt = "(a)", iostat = ios, advance = "no") & "Order of magic squares matrix? " read (unit = *, fmt = *, iostat = ios) matrixOrder if (modulo(matrixOrder, 2) == 0) then print *, "Order of magic square matrix must be odd" stop end if allocate(matrix(matrixOrder, matrixOrder)) matrix = 0 row = 1 col = (matrixOrder - 1)/2 + 1 matrix(row, col) = 1 do k = 2, matrixOrder*matrixOrder prow = row - 1 pcol = col + 1 if (indexChecker(prow, pcol, matrixOrder, matrixOrder)) then if (matrix(prow, pcol) == 0) then row = prow col = pcol else row = row + 1 end if else if (prow < 1 .and. indexChecker(1, pcol, matrixOrder, matrixOrder)) then row = matrixOrder col = pcol else if(indexChecker(prow, 1, matrixOrder, matrixOrder) .and. pcol > matrixOrder) then row = prow col = 1 else if (prow == 0 .and. pcol == matrixOrder + 1) then row = row + 1 end if matrix(row, col) = k end do

Page 78: Fortran 90

78

write (unit = rowformat, fmt = "(i16)", iostat = ios) matrixOrder*matrixOrder k = len_trim(adjustl(rowformat)) + 3 write (unit = rowformat, fmt = "(a1, i4, a1, i2, a1)", iostat = ios) & "(", matrixOrder, "I", k, ")" do k = 1, matrixOrder write (unit = *, fmt = rowformat, iostat = ios) matrix(k, 1:matrixOrder) end do end program magicSquares

ش تفاوت داده هاينما: 30برنامه

c ------------------------------------------------------------------ c Show how the same set of bits can be intepreted differently c types of variables c Instructor: Nam Sun Wang c ------------------------------------------------------------------ character a*4 integer*2 i2 real*8 x8 complex complx logical logic equivalence (a, i2, i4, x4, x8, complx, logic) c A "magic" number in decimal, hexadecimal, and binary notation c i4 = 1735287127 c i4 = #676E6157 i4 = 2#01100111011011100110000101010111 print *, 'Interpretation of 01100111011011100110000101010111' print *, 'As a character: ', a print *, 'As a 2-byte integer: ', i2 print *, 'As a 4-byte integer: ', i4 print *, 'As a 4-byte real: ', x4 print *, 'As a 8-byte real: ', x8 print *, 'As a 8-byte complex: ', complx print *, 'As a 4-byte logical: ', logic end

يز عددي آناليمثالها معادله به كمك روش نصف كردنيشه هايافتن ري : 1برنامه

PROGRAM BISECTION ! ! This program uses the bisection method to find the root of ! f(x)=exp(x)*ln(x)-x*x=0.

Page 79: Fortran 90

79

IMPLICIT NONE INTEGER :: ISTEP REAL :: A,B,DL,DX,X0,X1,F,FX ! DL = 1.0E-06 A = 1.0 B = 2.0 DX = B - A ISTEP = 0 DO WHILE (ABS(DX).GT.DL) X0 = (A+B)/2.0 IF ((FX(A)*FX(X0)).LT.0) THEN B = X0 DX = B-A ELSE A = X0 DX = B-A END IF ISTEP = ISTEP+1 END DO WRITE (6,"(I4,2F16.8)") ISTEP,X0,DX END PROGRAM BISECTION ! FUNCTION FX(X) RESULT (F) IMPLICIT NONE REAL :: F REAL, INTENT (IN) :: X ! F = EXP(X)*ALOG(X)-X*X END FUNCTION FX

وتني معادله به كمك روش نيشه هايافتن ري :2برنامه

PROGRAM NEWTON ! ! This program uses the Newton method to find the root of ! f(x)=exp(x)*ln(x)-x*x=0. ! IMPLICIT NONE INTEGER :: ISTEP REAL :: A,B,DL,DX,X0,X1,F,FX,DF,DFX ! DL = 1.0E-06 A = 1.0 B = 2.0 DX = B-A X0 = (A+B)/2.0 ISTEP = 0 DO WHILE (ABS(DX).GT.DL) X1 = X0-FX(X0)/DFX(X0) DX = X1-X0 X0 = X1 ISTEP = ISTEP+1 END DO WRITE (6,"(I4,2F16.8)") ISTEP,X0,DX END PROGRAM NEWTON ! FUNCTION FX(X) RESULT (F) IMPLICIT NONE

Page 80: Fortran 90

80

REAL :: F REAL, INTENT (IN) :: X ! F = EXP(X)*ALOG(X)-X*X END FUNCTION FX ! FUNCTION DFX (X) RESULT (DF) IMPLICIT NONE REAL :: DF REAL, INTENT (IN) :: X ! DF = EXP(X)*(ALOG(X)+1.0/X)-2.0*X END FUNCTION DFX

معادله به كمك روش سكانتيشه هايافتن ري :3برنامه

PROGRAM ROOT ! ! Main program to use the Secant Method to find the root of ! f(x)=exp(x)*ln(x)-x*x=0. ! IMPLICIT NONE INTEGER :: ISTEP REAL :: A,B,DL,DX,X0 ! DL = 1.0E-06 A = 1.0 B = 2.0 DX = (B-A)/10.0 X0 = (A+B)/2.0 CALL SECANT (DL,X0,DX,ISTEP) WRITE (6,"(I4,2F16.8)") ISTEP,X0,DX END PROGRAM ROOT ! SUBROUTINE SECANT (DL,X0,DX,ISTEP) ! ! Subroutine for the root of f(x)=0 with the secant method. IMPLICIT NONE INTEGER, INTENT (INOUT) :: ISTEP REAL, INTENT (INOUT) :: X0,DX REAL :: X1,X2,D,F,FX REAL, INTENT (IN) :: DL ! ISTEP = 0 X1 = X0+DX DO WHILE (ABS(DX).GT.DL) D = FX(X1)-FX(X0) X2 = X1-FX(X1)*(X1-X0)/D X0 = X1 X1 = X2 DX = X1-X0 ISTEP = ISTEP+1 END DO END SUBROUTINE SECANT ! FUNCTION FX(X) RESULT (F) IMPLICIT NONE

Page 81: Fortran 90

81

REAL :: F REAL, INTENT (IN) :: X ! F = EXP(X)*ALOG(X)-X*X END FUNCTION FX

مپسوني محاسبه انتگرال به روش س : 4برنامه

PROGRAM INTEGRAL ! ! Main program for evaluation of an integral with integrand ! sin(x) in the region of [0,pi/2]. IMPLICIT NONE INTEGER, PARAMETER :: N=9 INTEGER :: I REAL :: PI,H,S REAL, DIMENSION (N) :: X,F ! PI = 4.0*ATAN(1.0) H = PI/(2*(N-1)) DO I = 1, N X(I) = H*(I-1) F(I) = SIN(X(I)) END DO CALL SIMP (N,H,F,S) WRITE (6, "(F16.8)") S END PROGRAM INTEGRAL ! SUBROUTINE SIMP (N,H,FI,S) ! ! Subroutine for integration over f(x) with the Simpson rule. FI: ! integrand f(x); H: interval; S: integral. IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL :: S0,S1,S2 REAL, INTENT (OUT) :: S REAL, INTENT (IN), DIMENSION (N) :: FI ! S = 0.0 S0 = 0.0 S1 = 0.0 S2 = 0.0 DO I = 2, N-1, 2 S1 = S1+FI(I-1) S0 = S0+FI(I) S2 = S2+FI(I+1) END DO S = H*(S1+4.0*S0+S2)/3.0 ! ! If N is even, add the last slice separately ! IF (MOD(N,2).EQ.0) S = S & +H*(5.0*FI(N)+8.0*FI(N-1)-FI(N-2))/12.0 END SUBROUTINE SIMP

Page 82: Fortran 90

82

سينان ماتريمحاسبه دترم : 5برنامه

SUBROUTINE DTRM (A,N,D,INDX) ! ! Subroutine for evaluating the determinant of a matrix using ! the partial-pivoting Gaussian elimination scheme. IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,MSGN INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL, INTENT (OUT) :: D REAL, INTENT (INOUT), DIMENSION (N,N) :: A ! CALL ELGS(A,N,INDX) ! D = 1.0 DO I = 1, N D = D*A(INDX(I),I) END DO ! MSGN = 1 DO I = 1, N DO WHILE (I.NE.INDX(I)) MSGN = -MSGN J = INDX(I) INDX(I) = INDX(J) INDX(J) = J END DO END DO D = MSGN*D END SUBROUTINE DTRM ! SUBROUTINE ELGS (A,N,INDX) ! ! Subroutine to perform the partial-pivoting Gaussian elimination. ! A(N,N) is the original matrix in the input and transformed matrix ! plus the pivoting element ratios below the diagonal in the output. ! INDX(N) records the pivoting order. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,K,ITMP INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL :: C1,PI,PI1,PJ REAL, INTENT (INOUT), DIMENSION (N,N) :: A REAL, DIMENSION (N) :: C ! ! Initialize the index ! DO I = 1, N INDX(I) = I END DO ! ! Find the rescaling factors, one from each row ! DO I = 1, N C1= 0.0 DO J = 1, N

Page 83: Fortran 90

83

C1 = AMAX1(C1,ABS(A(I,J))) END DO C(I) = C1 END DO ! ! Search the pivoting (largest) element from each column ! DO J = 1, N-1 PI1 = 0.0 DO I = J, N PI = ABS(A(INDX(I),J))/C(INDX(I)) IF (PI.GT.PI1) THEN PI1 = PI K = I ENDIF END DO ! ! Interchange the rows via INDX(N) to record pivoting order ! ITMP = INDX(J) INDX(J) = INDX(K) INDX(K) = ITMP DO I = J+1, N PJ = A(INDX(I),J)/A(INDX(J),J) ! ! Record pivoting ratios below the diagonal ! A(INDX(I),J) = PJ ! ! Modify other elements accordingly ! DO K = J+1, N A(INDX(I),K) = A(INDX(I),K)-PJ*A(INDX(J),K) END DO END DO END DO ! END SUBROUTINE ELGS

يحل معادالت خط : 6برنامه

PROGRAM EX43 ! An example of solving linear equation set A(N,N)*X(N) = B(N) ! with the partial-pivoting Gaussian elimination scheme. The ! numerical values are for the Wheatstone bridge example discussed ! in Section 4.1 in the book with all resistances being 100 ohms ! and the voltage 200 volts. ! IMPLICIT NONE INTEGER, PARAMETER :: N=3 INTEGER :: I,J INTEGER, DIMENSION (N) :: INDX REAL, DIMENSION (N) :: X,B REAL, DIMENSION (N,N) :: A DATA B /200.0,0.0,0.0/, & ((A(I,J), J=1,N),I=1,N) /100.0,100.0,100.0,-100.0, & 300.0,-100.0,-100.0,-100.0, 300.0/ ! CALL LEGS (A,N,B,X,INDX) !

Page 84: Fortran 90

84

WRITE (6, "(F16.8)") (X(I), I=1,N) END PROGRAM EX43 SUBROUTINE LEGS (A,N,B,X,INDX) ! ! Subroutine to solve the equation A(N,N)*X(N) = B(N) with the ! partial-pivoting Gaussian elimination scheme. ! Copyright (c) Tao Pang 2001. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL, INTENT (INOUT), DIMENSION (N,N) :: A REAL, INTENT (INOUT), DIMENSION (N) :: B REAL, INTENT (OUT), DIMENSION (N) :: X ! CALL ELGS (A,N,INDX) ! DO I = 1, N-1 DO J = I+1, N B(INDX(J)) = B(INDX(J))-A(INDX(J),I)*B(INDX(I)) END DO END DO ! X(N) = B(INDX(N))/A(INDX(N),N) DO I = N-1, 1, -1 X(I) = B(INDX(I)) DO J = I+1, N X(I) = X(I)-A(INDX(I),J)*X(J) END DO X(I) = X(I)/A(INDX(I),I) END DO ! END SUBROUTINE LEGS ! SUBROUTINE ELGS (A,N,INDX) ! ! Subroutine to perform the partial-pivoting Gaussian elimination. ! A(N,N) is the original matrix in the input and transformed matrix ! plus the pivoting element ratios below the diagonal in the output. ! INDX(N) records the pivoting order. IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,K,ITMP INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL :: C1,PI,PI1,PJ REAL, INTENT (INOUT), DIMENSION (N,N) :: A REAL, DIMENSION (N) :: C ! ! Initialize the index ! DO I = 1, N INDX(I) = I END DO ! ! Find the rescaling factors, one from each row ! DO I = 1, N

Page 85: Fortran 90

85

C1= 0.0 DO J = 1, N C1 = AMAX1(C1,ABS(A(I,J))) END DO C(I) = C1 END DO ! ! Search the pivoting (largest) element from each column ! DO J = 1, N-1 PI1 = 0.0 DO I = J, N PI = ABS(A(INDX(I),J))/C(INDX(I)) IF (PI.GT.PI1) THEN PI1 = PI K = I ENDIF END DO ! ! Interchange the rows via INDX(N) to record pivoting order ! ITMP = INDX(J) INDX(J) = INDX(K) INDX(K) = ITMP DO I = J+1, N PJ = A(INDX(I),J)/A(INDX(J),J) ! ! Record pivoting ratios below the diagonal ! A(INDX(I),J) = PJ ! ! Modify other elements accordingly ! DO K = J+1, N A(INDX(I),K) = A(INDX(I),K)-PJ*A(INDX(J),K) END DO END DO END DO ! END SUBROUTINE ELGS

سيك ماتري معكوس : 7برنامه

SUBROUTINE MIGS (A,N,X,INDX) ! ! Subroutine to invert matrix A(N,N) with the inverse stored ! in X(N,N) in the output. Copyright (c) Tao Pang 2001. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,K INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL, INTENT (IN), DIMENSION (N,N):: A REAL, INTENT (OUT), DIMENSION (N,N):: X REAL, DIMENSION (N,N) :: B ! DO I = 1, N DO J = 1, N B(I,J) = 0.0 END DO

Page 86: Fortran 90

86

END DO DO I = 1, N B(I,I) = 1.0 END DO ! CALL ELGS (A,N,INDX) ! DO I = 1, N-1 DO J = I+1, N DO K = 1, N B(INDX(J),K) = B(INDX(J),K)-A(INDX(J),I)*B(INDX(I),K) END DO END DO END DO ! DO I = 1, N X(N,I) = B(INDX(N),I)/A(INDX(N),N) DO J = N-1, 1, -1 X(J,I) = B(INDX(J),I) DO K = J+1, N X(J,I) = X(J,I)-A(INDX(J),K)*X(K,I) END DO X(J,I) = X(J,I)/A(INDX(J),J) END DO END DO END SUBROUTINE MIGS ! SUBROUTINE ELGS (A,N,INDX) ! ! Subroutine to perform the partial-pivoting Gaussian elimination. ! A(N,N) is the original matrix in the input and transformed matrix ! plus the pivoting element ratios below the diagonal in the output. ! INDX(N) records the pivoting order. Copyright (c) Tao Pang 2001. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,K,ITMP INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL :: C1,PI,PI1,PJ REAL, INTENT (INOUT), DIMENSION (N,N) :: A REAL, DIMENSION (N) :: C ! ! Initialize the index ! DO I = 1, N INDX(I) = I END DO ! ! Find the rescaling factors, one from each row ! DO I = 1, N C1= 0.0 DO J = 1, N C1 = AMAX1(C1,ABS(A(I,J))) END DO C(I) = C1 END DO ! ! Search the pivoting (largest) element from each column ! DO J = 1, N-1

Page 87: Fortran 90

87

PI1 = 0.0 DO I = J, N PI = ABS(A(INDX(I),J))/C(INDX(I)) IF (PI.GT.PI1) THEN PI1 = PI K = I ENDIF END DO ! ! Interchange the rows via INDX(N) to record pivoting order ! ITMP = INDX(J) INDX(J) = INDX(K) INDX(K) = ITMP DO I = J+1, N PJ = A(INDX(I),J)/A(INDX(J),J) ! ! Record pivoting ratios below the diagonal ! A(INDX(I),J) = PJ ! ! Modify other elements accordingly ! DO K = J+1, N A(INDX(I),K) = A(INDX(I),K)-PJ*A(INDX(J),K) END DO END DO END DO ! END SUBROUTINE ELGS

مشتق تابع : 8برنامه

PROGRAM DERIVATIVES ! ! Main program for derivatives of f(x) = sin(x). F1: f'; ! F2: f"; D1: error in f'; and D2: error in f". ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=101 INTEGER :: I REAL :: PI,H REAL, DIMENSION (N) :: X,F,F1,D1,F2,D2 ! PI = 4.0*ATAN(1.0) H = PI/(2*100) DO I = 1, N X(I) = H*(I-1) F(I) = SIN(X(I)) END DO CALL THREE(N,H,F,F1,F2) DO I = 1, N D1(I) = F1(I)-COS(X(I)) D2(I) = F2(I)+SIN(X(I)) WRITE (6, "(5F10.6)") X(I),F1(I),D1(I),F2(I),D2(I) END DO END PROGRAM DERIVATIVES

Page 88: Fortran 90

88

! SUBROUTINE THREE (N,H,FI,F1,F2) ! ! Subroutine for 1st and 2nd order derivatives with the three-point ! formulas. Extrapolations are made at the boundaries. FI: input ! f(x); H: interval; F1: f'; and F2: f". ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL, INTENT (IN), DIMENSION (N) :: FI REAL, INTENT (OUT), DIMENSION (N) :: F1,F2 ! ! f' and f" from three-point formulas ! DO I = 2, N-1 F1(I) = (FI(I+1)-FI(I-1))/(2.*H) F2(I) = (FI(I+1)-2.0*FI(I)+FI(I-1))/(H*H) END DO ! ! Linear extrapolation for the boundary points ! F1(1) = 2.0*F1(2)-F1(3) F1(N) = 2.0*F1(N-1)-F1(N-2) F2(1) = 2.0*F2(2)-F2(3) F2(N) = 2.0*F2(N-1)-F2(N-2) END SUBROUTINE THREE

روش سكانت و رانج كاتا– يمسائل مقدار مرز : 9برنامه

PROGRAM SHOOTING ! ! Program for the boundary value problem with the shooting ! method. The Runge-Kutta and secant methods are used. IMPLICIT NONE INTEGER, PARAMETER :: N=101,M=5 REAL :: DK11,DK21,DK12,DK22,DK13,DK23,DK14,DK24 REAL :: DL,XL,XU,H,D,YL,YU,X0,DX,X1,X2,F0,F1 REAL :: Y1,Y2,G1,G1F,G2,G2F REAL, DIMENSION (2,N) :: Y ! ! Initialization of the problem ! DL = 1.0E-06 XL = 0.0 XU = 1.0 H = (XU-XL)/(N-1) D = 0.1 YL = 0.0 YU = 1.0 X0 = (YU-YL)/(XU-XL) DX = 0.01 X1 = X0+DX ! ! The secant search for the root ! Y(1,1) = YL

Page 89: Fortran 90

89

DO WHILE (ABS(D).GT.DL) ! C The!Runge-Kutta calculation of the first trial solution ! Y(2,1) = X0 DO I = 1, N-1 X = XL+H*I Y1 = Y(1,I) Y2 = Y(2,I) DK11 = H*G1F(Y1,Y2,X) DK21 = H*G2F(Y1,Y2,X) DK12 = H*G1F((Y1+DK11/2.0),(Y2+DK21/2.0),(X+H/2.0)) DK22 = H*G2F((Y1+DK11/2.0),(Y2+DK21/2.0),(X+H/2.0)) DK13 = H*G1F((Y1+DK12/2.0),(Y2+DK22/2.0),(X+H/2.0)) DK23 = H*G2F((Y1+DK12/2.0),(Y2+DK22/2.0),(X+H/2.0)) DK14 = H*G1F((Y1+DK13),(Y2+DK23),(X+H)) DK24 = H*G2F((Y1+DK13),(Y2+DK23),(X+H)) Y(1,I+1) = Y(1,I)+(DK11+2.0*(DK12+DK13)+DK14)/6.0 Y(2,I+1) = Y(2,I)+(DK21+2.0*(DK22+DK23)+DK24)/6.0 END DO F0 = Y(1,N)-1.0 ! ! Runge-Kutta calculation of the second trial solution ! Y(2,1) = X1 DO I = 1, N-1 X = XL+H*I Y1 = Y(1,I) Y2 = Y(2,I) DK11 = H*G1(Y1,Y2,X) DK21 = H*G2(Y1,Y2,X) DK12 = H*G1((Y1+DK11/2.0),(Y2+DK21/2.0),(X+H/2.0)) DK22 = H*G2((Y1+DK11/2.0),(Y2+DK21/2.0),(X+H/2.0)) DK13 = H*G1((Y1+DK12/2.0),(Y2+DK22/2.0),(X+H/2.0)) DK23 = H*G2((Y1+DK12/2.0),(Y2+DK22/2.0),(X+H/2.0)) DK14 = H*G1((Y1+DK13),(Y2+DK23),(X+H)) DK24 = H*G2((Y1+DK13),(Y2+DK23),(X+H)) Y(1,I+1) = Y(1,I)+(DK11+2.0*(DK12+DK13)+DK14)/6.0 Y(2,I+1) = Y(2,I)+(DK21+2.0*(DK22+DK23)+DK24)/6.0 END DO F1 = Y(1,N)-1.0 ! D = F1-F0 X2 = X1-F1*(X1-X0)/D X0 = X1 X1 = X2 END DO WRITE (6,"(2F16.8)") (H*(I-1), Y(1,I),I=1,N,M) END ! FUNCTION G1F (Y1,Y2,T) RESULT (G1) IMPLICIT NONE REAL :: Y1,Y2,T,G1 ! G1 = Y2 END FUNCTION G1F ! FUNCTION G2F (Y1,Y2,T) RESULT (G2) IMPLICIT NONE REAL :: PI,Y1,Y2,T,G2 !

Page 90: Fortran 90

90

PI = 4.0*ATAN(1.0) G2 =-PI*PI*(Y1+1.0)/4.0 END FUNCTION G2F

ينان چندجمله ايدترم : 10برنامه

SUBROUTINE TDPL(A,B,N,X,P) ! ! Subroutine to generate determinant polynomial P_N(X). ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: X REAL :: P0 REAL, INTENT (IN), DIMENSION (N) :: A,B REAL, INTENT (OUT), DIMENSION (N) :: P ! P0 = 1.0 IF (N.LT.1) STOP 'The dimension is less than 1.' P(1) = A(1)-X IF (N.GE.2) P(2) = (A(2)-X)*P(1)-B(1)*B(1)*P0 IF (N.GE.3) THEN DO I = 2, N-1 P(I+1) = (A(I+1)-X)*P(I)-B(I)*B(I)*P(I-1) END DO END IF END SUBROUTINE TDPL

اتگرال تابع : 11برنامه

MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! PROGRAM MCDS ! ! Integration with the direct sampling Monte Carlo scheme. The integrand ! is f(x) = x*x. ! USE CSEED IMPLICIT NONE INTEGER, PARAMETER :: M=1000000 INTEGER :: time,STIME,I INTEGER, DIMENSION (9) :: T REAL :: SUM1,SUM2,S,DS,X,F,FX,R,RANF ! ! Initial seed from the system time and forced to be odd ! STIME = time(%REF(0)) CALL gmtime(STIME,T) ISEED = T(6)+70*(T(5)+12*(T(4)+31*(T(3)+23*(T(2)+59*T(1))))) IF (MOD(ISEED,2).EQ.0) ISEED = ISEED-1 ! SUM1 = 0.0

Page 91: Fortran 90

91

SUM2 = 0.0 DO I = 1, M X = RANF() SUM1 = SUM1+FX(X) SUM2 = SUM2+FX(X)**2 END DO S = SUM1/M DS = SQRT(ABS(SUM2/M-(SUM1/M)**2)/M) WRITE(6,"(2F16.8)") S,DS END PROGRAM MCDS ! FUNCTION FX(X) RESULT (F) IMPLICIT NONE REAL :: X,F ! F = X*X END FUNCTION FX ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:12برنامه

SUBROUTINE RLXN (FN,DN,S,N,P,H) ! ! Subroutine performing one iteration of Relaxation for the one-dimensional ! stationary diffusion equation. DN is the diffusion coefficient shifted ! half step towards x=0. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H,P REAL :: H2,Q REAL, INTENT (IN), DIMENSION (N) :: DN,S REAL, INTENT (INOUT), DIMENSION (N) :: FN ! H2 = H*H

Page 92: Fortran 90

92

Q = 1.0-P DO I = 2, N-1 FN(I) = Q*FN(I)+P*(DN(I+1)*FN(I+1)+DN(I)*FN(I-1)+H2*S(I))/(DN(I+1)+DN(I)) END DO END SUBROUTINE RLXN

د يم كلريوند سديمحاسبه طول پ : 13برنامه

MODULE CB REAL :: E2,A0,R0 END MODULE CB ! PROGRAM BOND ! ! Main program to calculate the bond length of NaCl. ! ! USE CB IMPLICIT NONE INTEGER :: ISTEP REAL :: DL,X0,DX ! A0 = 1090.0 R0 = 0.33 E2 = 14.4 DL = 1.0E-06 X0 = 2.0 DX = 0.1 CALL M_SECANT (DL,X0,DX,ISTEP) WRITE (6,"(I4,2F16.8)") ISTEP,X0,DX END PROGRAM BOND ! SUBROUTINE M_SECANT (DL,X0,DX,ISTEP) ! ! Subroutine for the root of f(x) = dg(x)/dx = 0 with the ! secant method with the search toward the maximum of g(x). ! ! IMPLICIT NONE INTEGER, INTENT (OUT) :: ISTEP REAL, INTENT (IN) :: DL REAL, INTENT (INOUT) :: X0,DX REAL :: G0,G1,G2,X1,X2,D,G,GX,F,FX ! ISTEP = 0 G0 = GX(X0) X1 = X0+DX G1 = GX(X1) IF(G1.LT.G0) X1 = X0-DX DO WHILE (ABS(DX).GT.DL) D = FX(X1)-FX(X0) DX = -(X1-X0)*FX(X1)/D X2 = X1+DX G2 = GX(X2) IF(G2.LT.G1) X2 = X1-DX X0 = X1 X1 = X2 G1 = G2

Page 93: Fortran 90

93

ISTEP = ISTEP+1 END DO X0 = X2 END SUBROUTINE M_SECANT ! FUNCTION GX(X) RESULT(G) USE CB IMPLICIT NONE REAL :: X,G ! G = E2/X-A0*EXP(-X/R0) END FUNCTION GX ! FUNCTION FX(X) RESULT(F) USE CB IMPLICIT NONE REAL :: X,F ! F = E2/(X*X)-A0*EXP(-X/R0)/R0 END FUNCTION FX

:14برنامه

MODULE CSEED INTEGER ISEED END MODULE CSEED ! SUBROUTINE RMSG (N,XS,A) ! ! Subroutine for generating a random matrix in the Gaussian ! orthogonal ensemble with XS as the standard deviation of ! the off-diagonal elements. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J REAL, INTENT (IN) :: XS REAL :: G1,G2 REAL, INTENT (OUT), DIMENSION (N,N) :: A ! DO I = 1, N CALL GRNF (G1,G2) A(I,I) = SQRT(2.0)*G1*XS END DO ! DO I = 1, N DO J = I+1, N CALL GRNF(G1,G2) A(I,J) = G1*XS A(J,I) = A(I,J) END DO END DO END SUBROUTINE RMSG ! SUBROUTINE GRNF (X,Y) ! ! Two Gaussian random numbers generated from two uniform random ! numbers. !

Page 94: Fortran 90

94

IMPLICIT NONE REAL, INTENT (OUT) :: X,Y REAL :: PI,R1,R2,R,RANF ! PI = 4.0*ATAN(1.0) R1 = -ALOG(1.0-RANF()) R2 = 2.0*PI*RANF() R1 = SQRT(2.0*R1) X = R1*COS(R2) Y = R1*SIN(R2) END SUBROUTINE GRNF ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:15برنامه

SUBROUTINE ELGS (A,N,INDX) ! ! Subroutine to perform the partial-pivoting Gaussian elimination. ! A(N,N) is the original matrix in the input and transformed matrix ! plus the pivoting element ratios below the diagonal in the output. ! INDX(N) records the pivoting order. Copyright (c) Tao Pang 2001. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J,K,ITMP INTEGER, INTENT (OUT), DIMENSION (N) :: INDX REAL :: C1,PI,PI1,PJ REAL, INTENT (INOUT), DIMENSION (N,N) :: A REAL, DIMENSION (N) :: C ! ! Initialize the index ! DO I = 1, N INDX(I) = I END DO ! ! Find the rescaling factors, one from each row

Page 95: Fortran 90

95

! DO I = 1, N C1= 0.0 DO J = 1, N C1 = AMAX1(C1,ABS(A(I,J))) END DO C(I) = C1 END DO ! ! Search the pivoting (largest) element from each column ! DO J = 1, N-1 PI1 = 0.0 DO I = J, N PI = ABS(A(INDX(I),J))/C(INDX(I)) IF (PI.GT.PI1) THEN PI1 = PI K = I ENDIF END DO ! ! Interchange the rows via INDX(N) to record pivoting order ! ITMP = INDX(J) INDX(J) = INDX(K) INDX(K) = ITMP DO I = J+1, N PJ = A(INDX(I),J)/A(INDX(J),J) ! ! Record pivoting ratios below the diagonal ! A(INDX(I),J) = PJ ! ! Modify other elements accordingly ! DO K = J+1, N A(INDX(I),K) = A(INDX(I),K)-PJ*A(INDX(J),K) END DO END DO END DO ! END SUBROUTINE ELGS

: 16برنامه

SUBROUTINE FFT2D (FR,FI,N1,N2,M1,M2) ! ! Subroutine for the two-dimensional fast Fourier transform ! with N=N1*N2 and N1=2**M1 and N2=2**M2. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N1,N2,M1,M2 INTEGER :: I,J REAL, INTENT (INOUT), DIMENSION (N1,N2) :: FR,FI ! ! Transformation on the second index ! DO I = 1, N1

Page 96: Fortran 90

96

CALL FFT (FR(I,1),FI(I,1),N2,M2) END DO ! ! Transformation on the first index ! DO J = 1, N2 CALL FFT (FR(1,J),FI(1,J),N1,M1) END DO END SUBROUTINE FFT2D ! SUBROUTINE FFT (AR,AI,N,M) ! ! An example of the fast Fourier transform subroutine with N = 2**M. ! AR and AI are the real and imaginary part of data in the input and ! corresponding Fourier coefficients in the output. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N,M INTEGER :: N1,N2,I,J,K,L,L1,L2 REAL :: PI,A1,A2,Q,U,V REAL, INTENT (INOUT), DIMENSION (N) :: AR,AI ! PI = 4.0*ATAN(1.0) N2 = N/2 ! N1 = 2**M IF(N1.NE.N) STOP 'Indices do not match' ! ! Rearrange the data to the bit reversed order ! L = 1 DO K = 1, N-1 IF (K.LT.L) THEN A1 = AR(L) A2 = AI(L) AR(L) = AR(K) AR(K) = A1 AI(L) = AI(K) AI(K) = A2 END IF J = N2 DO WHILE (J.LT.L) L = L-J J = J/2 END DO L = L+J END DO ! ! Perform additions at all levels with reordered data ! L2 = 1 DO L = 1, M Q = 0.0 L1 = L2 L2 = 2*L1 DO K = 1, L1 U = COS(Q) V = -SIN(Q) Q = Q + PI/L1 DO J = K, N, L2

Page 97: Fortran 90

97

I = J + L1 A1 = AR(I)*U-AI(I)*V A2 = AR(I)*V+AI(I)*U AR(I) = AR(J)-A1 AR(J) = AR(J)+A1 AI(I) = AI(J)-A2 AI(J) = AI(J)+A2 END DO END DO END DO END SUBROUTINE FFT

لژاندريچند جمله ا : 17برنامه

SUBROUTINE LGND (LMAX,X,P) ! ! Subroutine to generate Legendre polynomials P_L(X) ! for L = 0,1,...,LMAX with given X. ! IMPLICIT NONE INTEGER, INTENT (IN) :: LMAX INTEGER :: L REAL, INTENT (IN) :: X REAL, INTENT (OUT), DIMENSION (0:LMAX) :: P ! P(0) = 1.0 P(1) = X DO L = 1, LMAX-1 P(L+1) = ((2.0*L+1)*X*P(L)-L*P(L-1))/(L+1) END DO END SUBROUTINE LGND

:18برنامه

SUBROUTINE NMRV (N,H,Q,S,U) ! ! The Numerov algorithm for the equation u"(x)+q(x)u(x)=s(x) ! as given in Eqs. (3.77)-(3.80) in the book. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL :: G,C0,C1,C2,D,UTMP REAL, INTENT (IN), DIMENSION (N) :: Q,S REAL, INTENT (OUT), DIMENSION (N) :: U ! G = H*H/12.0 ! DO I = 2, N-1 C0 = 1.0+G*((Q(I-1)-Q(I+1))/2.0+Q(I)) C1 = 2.0-G*(Q(I+1)+Q(I-1)+8.0*Q(I)) C2 = 1.0+G*((Q(I+1)-Q(I-1))/2.0+Q(I)) D = G*(S(I+1)+S(I-1)+10.0*S(I)) UTMP = C1*U(I)-C0*U(I-1)+D U(I+1) = UTMP/C2 END DO

Page 98: Fortran 90

98

END SUBROUTINE NMRV

:19برنامه

PROGRAM MILL ! ! Program to fit the Millikan experimental data to a linear curve ! p(x) = a*x+b directly. One can find a and b from partial D/partial ! a = 0 and partial D/partial b = 0 with D = sum (p(x_i)-f(x_i))**2. ! The result is a = (c1*c3-c4*n)/(c1**2-c2*n) and b = (c1*c4-c2*c3) ! /(c1**2-c2*n) with n being the number of points, c1 = sum x_i, c2 ! = sum x_i**2, c3 = sum f(x_i), and c4 = sum x_i*f(x_i). ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=15 INTEGER :: I REAL :: C1,C2,C3,C4,C,A,B REAL, DIMENSION (N) :: X,F DATA X /4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0, & 12.0,13.0,14.0,15.0,16.0,17.0,18.0/ DATA F /6.558,8.206,9.880,11.50,13.14,14.81,16.40,18.04, & 19.68,21.32,22.96,24.60,26.24,27.88,29.52/ ! C1 = 0.0 C2 = 0.0 C3 = 0.0 C4 = 0.0 DO I = 1, N C1 = C1+X(I) C2 = C2+X(I)*X(I) C3 = C3+F(I) C4 = C4+F(I)*X(I) END DO C = C1*C1-C2*N A = (C1*C3-C4*N)/C B = (C1*C4-C2*C3)/C WRITE (6, "('The fundamental charge is 'F6.4,'+-'F6.4)") A,ABS(B) END PROGRAM MILL

:20برنامه

PROGRAM INTERPOLATION2 ! ! Main program for the Lagrange interpolation with the ! upward and downward correction method. ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=5 REAL :: X,F,DF REAL, DIMENSION (N) :: XI,FI DATA XI/0.0,0.5,1.0,1.5,2.0/, & FI/1.0,0.938470,0.765198,0.511828,0.223891/ ! X = 0.9 CALL UPDOWN (N,XI,FI,X,F,DF) WRITE (6,"(3F16.8)") X,F,DF END PROGRAM INTERPOLATION2 !

Page 99: Fortran 90

99

SUBROUTINE UPDOWN (N,XI,FI,X,F,DF) ! ! Subroutine performing the Lagrange interpolation with the ! upward and downward correction method. F: interpolated ! value. DF: error estimated. ! IMPLICIT NONE INTEGER, PARAMETER :: NMAX=21 INTEGER, INTENT (IN) :: N INTEGER :: I,J,I0,J0,IT,K REAL, INTENT (IN) :: X REAL, INTENT (OUT) :: F,DF REAL :: DX,DXT,DT REAL, INTENT (IN), DIMENSION (N) :: XI,FI REAL, DIMENSION (NMAX,NMAX) :: DP,DM ! IF (N.GT.NMAX) STOP 'Dimension of the data set is too large.' DX = ABS(XI(N)-XI(1)) DO I = 1, N DP(I,I) = FI(I) DM(I,I) = FI(I) DXT = ABS(X-XI(I)) IF (DXT.LT.DX) THEN I0 = I DX = DXT END IF END DO J0 = I0 ! ! Evaluate correction matrices ! DO I = 1, N-1 DO J = 1, N-I K = J+I DT =(DP(J,K-1)-DM(J+1,K))/(XI(K)-XI(J)) DP(J,K) = DT*(XI(K)-X) DM(J,K) = DT*(XI(J)-X) END DO END DO ! ! Update the approximation ! F = FI(I0) IT = 0 IF(X.LT.XI(I0)) IT = 1 DO I = 1, N-1 IF ((IT.EQ.1).OR.(J0.EQ.N)) THEN I0 = I0-1 DF = DP(I0,J0) F = F+DF IT = 0 IF (J0.EQ.N) IT = 1 ELSE IF ((IT.EQ.0).OR.(I0.EQ.1)) THEN J0 = J0+1 DF = DM(I0,J0) F = F+DF IT = 1 IF (I0.EQ.1) IT = 0 END IF END DO DF = ABS(DF)

Page 100: Fortran 90

100

END SUBROUTINE UPDOWN

:21برنامه PROGRAM MILLIKAN ! ! Main program for a linear fit of the Millikan experimental ! data on the fundamental charge e_0 from e_n = e_0*n + de. ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=15,M=2 INTEGER :: I REAL :: SUM0,SUMT,E0,DE REAL, DIMENSION (N) :: X,F REAL, DIMENSION (M) :: A REAL, DIMENSION (M,N) :: U DATA X /4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0, & 12.0,13.0,14.0,15.0,16.0,17.0,18.0/ DATA F /6.558,8.206,9.880,11.50,13.14,14.81,16.40,18.04, & 19.68,21.32,22.96,24.60,26.24,27.88,29.52/ ! CALL PFIT (N,M,X,F,A,U) SUM0 = 0.0 SUMT = 0.0 DO I = 1, N SUM0 = SUM0+U(1,I)**2 SUMT = SUMT+X(I)*U(1,I)**2 END DO E0 = A(2) DE = A(1)-A(2)*SUMT/SUM0 WRITE (6,"(2F16.8)") E0,DE END PROGRAM MILLIKAN ! SUBROUTINE PFIT (N,M,X,F,A,U) ! ! Subroutine generating orthonormal polynomials U(M,N) up to ! (M-1)th order and coefficients A(M), for the least squares ! approximation of the function F(N) at X(N). Other variables ! used: G(K) for g_k, H(K) for h_k, S(K) for <u_k|u_k>. ! ! IMPLICIT NONE INTEGER, PARAMETER :: NMAX=101,MMAX=101 INTEGER, INTENT (IN) :: N,M INTEGER :: I,J REAL :: TMP REAL, INTENT (IN), DIMENSION (N) :: X,F REAL, INTENT (OUT), DIMENSION (M) :: A REAL, INTENT (OUT), DIMENSION (M,N) :: U REAL, DIMENSION (MMAX) :: G,H,S ! IF(N.GT.NMAX) STOP 'Too many points' IF(M.GT.MMAX) STOP 'Order too high' ! ! Set up the zeroth order polynomial u_0 ! DO I = 1, N U(1,I) = 1.0 END DO DO I = 1, N

Page 101: Fortran 90

101

TMP = U(1,I)*U(1,I) S(1) = S(1)+TMP G(1) = G(1)+X(I)*TMP A(1) = A(1)+U(1,I)*F(I) END DO G(1) = G(1)/S(1) H(1) = 0.0 A(1) = A(1)/S(1) ! ! Set up the first order polynomial u_1 ! DO I = 1, N U(2,I) = X(I)*U(1,I)-G(1)*U(1,I) S(2) = S(2)+U(2,I)**2 G(2) = G(2)+X(I)*U(2,I)**2 H(2) = H(2) + X(I)*U(2,I)*U(1,I) A(2) = A(2)+U(2,I)*F(I) END DO G(2) = G(2)/S(2) H(2) = H(2)/S(1) A(2) = A(2)/S(2) ! ! Higher order polynomials u_k from the recursive relation ! IF(M.GE.3) THEN DO I = 2, M-1 DO J = 1, N U(I+1,J) = X(J)*U(I,J)-G(I)*U(I,J)-H(I)*U(I-1,J) S(I+1) = S(I+1) + U(I+1,J)**2 G(I+1) = G(I+1) + X(J)*U(I+1,J)**2 H(I+1) = H(I+1) + X(J)*U(I+1,J)*U(I,J) A(I+1) = A(I+1) + U(I+1,J)*F(J) END DO G(I+1) = G(I+1)/S(I+1) H(I+1) = H(I+1)/S(I) A(I+1) = A(I+1)/S(I+1) END DO END IF END SUBROUTINE PFIT

:22برنامه

SUBROUTINE PFIT (N,M,X,F,A,U) ! ! Subroutine generating orthonormal polynomials U(M,N) up to ! (M-1)th order and coefficients A(M), for the least squares ! approximation of the function F(N) at X(N). Other variables ! used: G(K) for g_k, H(K) for h_k, S(K) for <u_k|u_k>. ! ! IMPLICIT NONE INTEGER, PARAMETER :: NMAX=101,MMAX=101 INTEGER, INTENT (IN) :: N,M INTEGER :: I,J REAL :: TMP REAL, INTENT (IN), DIMENSION (N) :: X,F REAL, INTENT (OUT), DIMENSION (M) :: A REAL, INTENT (OUT), DIMENSION (M,N) :: U REAL, DIMENSION (MMAX) :: G,H,S

Page 102: Fortran 90

102

! IF(N.GT.NMAX) STOP 'Too many points' IF(M.GT.MMAX) STOP 'Order too high' ! ! Set up the zeroth order polynomial u_0 ! DO I = 1, N U(1,I) = 1.0 END DO DO I = 1, N TMP = U(1,I)*U(1,I) S(1) = S(1)+TMP G(1) = G(1)+X(I)*TMP A(1) = A(1)+U(1,I)*F(I) END DO G(1) = G(1)/S(1) H(1) = 0.0 A(1) = A(1)/S(1) ! ! Set up the first order polynomial u_1 ! DO I = 1, N U(2,I) = X(I)*U(1,I)-G(1)*U(1,I) S(2) = S(2)+U(2,I)**2 G(2) = G(2)+X(I)*U(2,I)**2 H(2) = H(2)+X(I)*U(2,I)*U(1,I) A(2) = A(2)+U(2,I)*F(I) END DO G(2) = G(2)/S(2) H(2) = H(2)/S(1) A(2) = A(2)/S(2) ! ! Higher order polynomials u_k from the recursive relation ! IF(M.GE.3) THEN DO I = 2, M-1 DO J = 1, N U(I+1,J) = X(J)*U(I,J)-G(I)*U(I,J)-H(I)*U(I-1,J) S(I+1) = S(I+1) + U(I+1,J)**2 G(I+1) = G(I+1) + X(J)*U(I+1,J)**2 H(I+1) = H(I+1) + X(J)*U(I+1,J)*U(I,J) A(I+1) = A(I+1) + U(I+1,J)*F(J) END DO G(I+1) = G(I+1)/S(I+1) H(I+1) = H(I+1)/S(I) A(I+1) = A(I+1)/S(I+1) END DO END IF END SUBROUTINE PFIT

:23برنامه PROGRAM INTERPOLATION ! ! Main program for the Lagrange interpolation with the Aitken method. ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=5 REAL :: X,F,DF REAL, DIMENSION (N) :: XI,FI

Page 103: Fortran 90

103

DATA XI/0.0,0.5,1.0,1.5,2.0/, & FI/1.0,0.938470,0.765198,0.511828,0.223891/ ! X = 0.9 CALL AITKEN (N,XI,FI,X,F,DF) WRITE (6,"(3F16.8)") X,F,DF END PROGRAM INTERPOLATION ! SUBROUTINE AITKEN (N,XI,FI,X,F,DF) ! ! Subroutine performing the Lagrange interpolation with the ! Aitken method. F: interpolated value. DF: error estimated. ! ! INTEGER, PARAMETER :: NMAX=21 INTEGER, INTENT (IN) :: N INTEGER :: I,J REAL, INTENT (IN) :: X REAL, INTENT (OUT) :: F,DF REAL :: X1,X2,F1,F2 REAL, INTENT (IN), DIMENSION (N):: XI,FI REAL, DIMENSION (NMAX):: FT ! IF (N.GT.NMAX) STOP 'Dimension of the data is too large.' DO I = 1, N FT(I) = FI(I) END DO ! DO I = 1, N-1 DO J = 1, N-I X1 = XI(J) X2 = XI(J+I) F1 = FT(J) F2 = FT(J+1) FT(J) = (X-X1)/(X2-X1)*F2+(X-X2)/(X1-X2)*F1 END DO END DO F = FT(1) DF = (ABS(F-F1)+ABS(F-F2))/2.0 END SUBROUTINE AITKEN

:24برنامه MODULE CB REAL :: Q,B,W END MODULE CB ! PROGRAM PENDULUM ! ! Program for the power spectra of a driven pendulum under damping with ! the fourth order Runge-Kutta algorithm. Given parameters: Q, B, and W ! (omega_0). ! USE CB IMPLICIT NONE INTEGER, PARAMETER :: N=65536,L=128,M=16,MD=16 INTEGER :: I,J REAL :: PI,F1,H,OD,T,Y1,Y2,G1,GX1,G2,GX2 REAL :: DK11,DK21,DK12,DK22,DK13,DK23,DK14,DK24

Page 104: Fortran 90

104

REAL, DIMENSION (N) :: AR,AI,WR,WI,O REAL, DIMENSION (2,N) :: Y ! PI = 4.0*ATAN(1.0) F1 = 1.0/SQRT(FLOAT(N)) W = 2.0/3.0 H = 2.0*PI/(L*W) OD = 2.0*PI/(N*H*W*W) Q = 0.5 B = 1.15 Y(1,1) = 0.0 Y(2,1) = 2.0 ! ! Runge-Kutta algorithm to integrate the equation ! DO I = 1, N-1 T = H*I Y1 = Y(1,I) Y2 = Y(2,I) DK11 = H*GX1(Y1,Y2,T) DK21 = H*GX2(Y1,Y2,T) DK12 = H*GX1((Y1+DK11/2.0),(Y2+DK21/2.0),(T+H/2.0)) DK22 = H*GX2((Y1+DK11/2.0),(Y2+DK21/2.0),(T+H/2.0)) DK13 = H*GX1((Y1+DK12/2.0),(Y2+DK22/2.0),(T+H/2.0)) DK23 = H*GX2((Y1+DK12/2.0),(Y2+DK22/2.0),(T+H/2.0)) DK14 = H*GX1((Y1+DK13),(Y2+DK23),(T+H)) DK24 = H*GX2((Y1+DK13),(Y2+DK23),(T+H)) Y(1,I+1) = Y(1,I)+(DK11+2.0*(DK12+DK13)+DK14)/6.0 Y(2,I+1) = Y(2,I)+(DK21+2.0*(DK22+DK23)+DK24)/6.0 ! ! Bring theta back to region [-pi,pi] ! IF (ABS(Y(1,I+1)).GT.PI) THEN Y(1,I+1) = Y(1,I+1) - 2.*PI*ABS(Y(1,I+1))/Y(1,I+1) END IF END DO ! DO I = 1, N AR(I) = Y(1,I) WR(I) = Y(2,I) AI(I) = 0.0 WI(I) = 0.0 END DO CALL FFT (AR,AI,N,M) CALL FFT (WR,WI,N,M) ! DO I = 1, N O(I) = (I-1)*OD AR(I) = (F1*AR(I))**2+(F1*AI(I))**2 WR(I) = (F1*WR(I))**2+(F1*WI(I))**2 AR(I) = ALOG10(AR(I)) WR(I) = ALOG10(WR(I)) END DO WRITE(6,"(3F16.10)") (O(I),AR(I),WR(I),I=1,(L*MD),4) END PROGRAM PENDULUM ! SUBROUTINE FFT (AR,AI,N,M) ! ! An example of the fast Fourier transform subroutine with N = 2**M. ! AR and AI are the real and imaginary part of data in the input and

Page 105: Fortran 90

105

! corresponding Fourier coefficients in the output. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N,M INTEGER :: N1,N2,I,J,K,L,L1,L2 REAL :: PI,A1,A2,Q,U,V REAL, INTENT (INOUT), DIMENSION (N) :: AR,AI ! PI = 4.0*ATAN(1.0) N2 = N/2 ! N1 = 2**M IF(N1.NE.N) STOP 'Indices do not match' ! ! Rearrange the data to the bit reversed order ! L = 1 DO K = 1, N-1 IF (K.LT.L) THEN A1 = AR(L) A2 = AI(L) AR(L) = AR(K) AR(K) = A1 AI(L) = AI(K) AI(K) = A2 END IF J = N2 DO WHILE (J.LT.L) L = L-J J = J/2 END DO L = L+J END DO ! ! Perform additions at all levels with reordered data ! L2 = 1 DO L = 1, M Q = 0.0 L1 = L2 L2 = 2*L1 DO K = 1, L1 U = COS(Q) V = -SIN(Q) Q = Q + PI/L1 DO J = K, N, L2 I = J + L1 A1 = AR(I)*U-AI(I)*V A2 = AR(I)*V+AI(I)*U AR(I) = AR(J)-A1 AR(J) = AR(J)+A1 AI(I) = AI(J)-A2 AI(J) = AI(J)+A2 END DO END DO END DO END SUBROUTINE FFT ! FUNCTION GX1 (Y1,Y2,T) RESULT (G1) !

Page 106: Fortran 90

106

G1 = Y2 END FUNCTION GX1 ! FUNCTION GX2 (Y1,Y2,T) RESULT (G2) USE CB ! G2 = -Q*Y2-SIN(Y1)+B*COS(W*T) END FUNCTION GX2

:25برنامه PROGRAM SCHR ! ! Main program for solving the eigenvalue problem of the ! one-dimensional Schroedinger equation. ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=501,M=5,IMAX=100 INTEGER :: I,IM,NL,NR,ISTEP REAL :: DL,H2M,EA,EB,E,DE,XL0,XR0,H,C REAL :: XL,XR,FACT,F0,F1,E1,SUM,V,VX REAL, DIMENSION (N) :: UL,UR,QL,QR,S ! DL = 1.0E-06 H2M = 0.5 EA = 2.4 EB = 2.7 E = EA DE = 0.1 XL0 = -10.0 XR0 = 10.0 H = (XR0-XL0)/(N-1) C = 1.0/H2M UL(1) = 0.0 UL(2) = 0.01 UR(1) = 0.0 UR(2) = 0.01 ! ! Set up the potential q(x) and source s(x) ! DO I = 1, N XL = XL0+(I-1)*H XR = XR0-(I-1)*H QL(I) = C*(E-VX(XL)) QR(I) = C*(E-VX(XR)) S(I) = 0.0 END DO ! ! Find the matching point at the right turning point ! DO I = 1, N-1 IF(((QL(I)*QL(I+1)).LE.0).AND.(QL(I).GT.0)) IM = I END DO ! ! Numerov algorithm from left to right and vice versa ! NL = IM+1 NR = N-IM+2 CALL NMRV2 (NL,H,QL,S,UL) CALL NMRV2 (NR,H,QR,S,UR)

Page 107: Fortran 90

107

! ! Rescale the left solution ! FACT = UR(NR-1)/UL(IM) DO I = 1, NL UL(I) = FACT*UL(I) END DO ! F0 = UR(NR)+UL(NL)-UR(NR-2)-UL(NL-2) F0 = F0/(2.0*H*UR(NR-1)) ! ! Bisection method for the root ! ISTEP = 0 DO WHILE ((ABS(DE).GT.DL).AND.(ISTEP.LT.IMAX)) E1 = E E = (EA+EB)/2.0 DO I = 1, N QL(I) = QL(I)+C*(E-E1) QR(I) = QR(I)+C*(E-E1) END DO ! ! Find the matching point at the right turning point ! DO I = 1, N-1 IF(((QL(I)*QL(I+1)).LE.0).AND.(QL(I).GT.0)) IM = I END DO ! ! Numerov algorithm from left to right and vice versa ! NL = IM+1 NR = N-IM+2 CALL NMRV2 (NL,H,QL,S,UL) CALL NMRV2 (NR,H,QR,S,UR) ! ! Rescale the left solution ! FACT = UR(NR-1)/UL(IM) DO I = 1, NL UL(I) = FACT*UL(I) END DO ! F1 = UR(NR)+UL(NL)-UR(NR-2)-UL(NL-2) F1 = F1/(2.0*H*UR(NR-1)) ! IF ((F0*F1).LT.0) THEN EB = E DE = EB-EA ELSE EA = E DE = EB-EA F0 = F1 END IF ISTEP = ISTEP+1 END DO ! SUM = 0.0 DO I = 1, N IF(I.GT.IM) UL(I) = UR(N-I) SUM = SUM+UL(I)*UL(I) END DO

Page 108: Fortran 90

108

! WRITE(6,"(2I4)") ISTEP,IMAX WRITE(6,"(4F20.8)") E,DE,F0,F1 ! SUM=SQRT(H*SUM) DO I = 1, N, M XL = XL0+(I-1)*H UL(I) = UL(I)/SUM WRITE(15,"(4F20.8)") XL,UL(I) WRITE(16,"(4F20.8)") XL,VX(XL) END DO END PROGRAM SCHR ! FUNCTION VX (X) RESULT (V) REAL :: A,B,X,V ! A = 1.0 B = 4.0 V = 3.0-A*A*B*(B-1.0)/(COSH(A*X)**2)/2.0 END FUNCTION VX ! SUBROUTINE NMRV2 (N,H,Q,S,U) ! ! The Numerov algorithm for the equation u"(x)+q(x)u(x)=s(x) ! as given in Eqs. (3.82)-(3.85) in the book. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL,INTENT (IN) :: H REAL :: G,C0,C1,C2,D,UTMP REAL, INTENT (IN), DIMENSION (N) :: Q,S REAL, INTENT (INOUT), DIMENSION (N) :: U ! G = H*H/12.0 ! DO I = 2, N-1 C0 = 1.0+G*Q(I-1) C1 = 2.0-10.0*G*Q(I) C2 = 1.0+G*Q(I+1) D = G*(S(I+1)+S(I-1)+10.0*S(I)) UTMP = C1*U(I)-C0*U(I-1)+D U(I+1) = UTMP/C2 END DO END SUBROUTINE NMRV2

:26برنامه PROGRAM WAVE ! ! Program for the eigenvalue problem with a combination of the ! bisection method and the Numerov algorithm for u" = -k**2*u ! with boundary conditions u(0)=u(1)=0. ! ! IMPLICIT NONE INTEGER, PARAMETER :: N=101 INTEGER :: I,ISTEP REAL :: DL,H,AK,BK,DK,EK,F0,F1 REAL, DIMENSION (N) :: Q,S,U

Page 109: Fortran 90

109

! ! Initialization of the problem ! DL = 1.0E-06 H = 1.0/(N-1) AK = 2.0 BK = 4.0 DK = 1.0 EK = AK U(1) = 0.0 U(2) = 0.01 ISTEP = 0 ! DO I = 1,N S(I) = 0.0 Q(I) = EK*EK END DO CALL NMRV (N,H,Q,S,U) F0 = U(N) ! ! Bisection method for the root ! DO WHILE (ABS(DK).GT.DL) EK = (AK+BK)/2.0 DO I = 1,N Q(I) = EK*EK END DO CALL NMRV (N,H,Q,S,U) F1 = U(N) IF ((F0*F1).LT.0) THEN BK = EK DK = BK-AK ELSE AK = EK DK = BK-AK F0 = F1 END IF ISTEP = ISTEP+1 END DO WRITE (6,"(I4,3F16.8)") ISTEP,EK,DK,F1 END PROGRAM WAVE ! SUBROUTINE NMRV (N,H,Q,S,U) ! ! The Numerov algorithm for the equation u"(x)+q(x)u(x)=s(x) ! as given in Eqs. (3.77)-(3.80) in the book. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL :: G,C0,C1,C2,D,UTMP REAL, INTENT (IN), DIMENSION (N) :: Q,S REAL, INTENT (INOUT), DIMENSION (N) :: U ! G = H*H/12.0 ! DO I = 2, N-1 C0 = 1.0+G*((Q(I-1)-Q(I+1))/2.0+Q(I)) C1 = 2.0-G*(Q(I+1)+Q(I-1)+8.0*Q(I))

Page 110: Fortran 90

110

C2 = 1.0+G*((Q(I+1)-Q(I-1))/2.0+Q(I)) D = G*(S(I+1)+S(I-1)+10.0*S(I)) UTMP = C1*U(I)-C0*U(I-1)+D U(I+1) = UTMP/C2 END DO END SUBROUTINE NMRV

:27برنامه SUBROUTINE NMRV2 (N,H,Q,S,U) ! ! The Numerov algorithm for the equation u"(x)+q(x)u(x)=s(x) ! as given in Eqs. (3.82)-(3.85) in the book. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL,INTENT (IN) :: H REAL :: G,C0,C1,C2,D,UTMP REAL, INTENT (IN), DIMENSION (N) :: Q,S REAL, INTENT (INOUT), DIMENSION (N) :: U ! G = H*H/12.0 ! DO I = 2, N-1 C0 = 1.0+G*Q(I-1) C1 = 2.0-10.0*G*Q(I) C2 = 1.0+G*Q(I+1) D = G*(S(I+1)+S(I-1)+10.0*S(I)) UTMP = C1*U(I)-C0*U(I-1)+D U(I+1) = UTMP/C2 END DO END SUBROUTINE NMRV2

:28برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! SUBROUTINE PERCOLATION (L,N,M,P) ! ! Subroutine to create an N*M percolation network. ! ! INTEGER, INTENT (IN) :: N,M REAL, INTENT (IN) :: P REAL:: R,RANF LOGICAL, INTENT (OUT), DIMENSION (N,M) :: L ! DO I = 1, N DO J = 1, M R = RANF() IF(R.LT.P) THEN L(I,J) = .TRUE. ELSE L(I,J) = .FALSE. END IF END DO END DO

Page 111: Fortran 90

111

END SUBROUTINE PERCOLATION ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:29برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! SUBROUTINE GRNF (X,Y) ! ! Two Gaussian random numbers generated from two uniform random ! numbers. ! IMPLICIT NONE REAL, INTENT (OUT) :: X,Y REAL :: PI,R1,R2,R,RANF ! PI = 4.0*ATAN(1.0) R1 = -ALOG(1.0-RANF()) R2 = 2.0*PI*RANF() R1 = SQRT(2.0*R1) X = R1*COS(R2) Y = R1*SIN(R2) END SUBROUTINE GRNF ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH

Page 112: Fortran 90

112

IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:30برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! FUNCTION ERNF() RESULT (E) ! ! Exponential random number generator from a uniform random ! number generator. ! REAL E,R,RANF ! E = -ALOG(1.0-RANF()) END FUNCTION ERNF ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:31برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/

Page 113: Fortran 90

113

REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:32برنامه MODULE CB REAL :: B,E,A END MODULE CB ! PROGRAM SCATTERING ! ! This is the main program for the scattering problem. ! ! USE CB IMPLICIT NONE INTEGER, PARAMETER :: M=21,N=10001 INTEGER I,J,ISTEP REAL :: DL,B0,DB,DX,X0,X,DX0,F,FX,FB,FBX,G1,G2,RU,RUTH,SI REAL, DIMENSION (N) :: FI REAL, DIMENSION (M) :: THETA,SIG,SIG1 ! DL = 1.E-06 B0 = 0.01 DB = 0.5 DX = 0.01 E = 1.0 A = 100.0 DO I = 1, M B = B0+(I-1)*DB ! ! Calculate the first term of theta ! DO J = 1, N X = B+DX*J FI(J) = 1.0/(X*X*SQRT(FBX(X))) END DO CALL SIMP(N,DX,FI,G1) ! ! Find r_m from 1-b*b/(r*r)-U/E=0 ! X0 = B DX0 = DX CALL SECANT (DL,X0,DX0,ISTEP) ! ! Calculate the second term of theta ! DO J = 1, N X = X0+DX*J FI(J) = 1.0/(X*X*SQRT(FX(X))) END DO

Page 114: Fortran 90

114

CALL SIMP (N,DX,FI,G2) THETA(I) = 2.0*B*(G1-G2) END DO ! ! Calculate d_theta/d_b ! CALL THREE (M,DB,THETA,SIG,SIG1) ! ! Put the cross section in log form with the exact result of ! the Coulomb scattering (RUTH) ! DO I = M, 1, -1 B = B0+(I-1)*DB SIG(I) = B/ABS(SIG(I))/SIN(THETA(I)) RUTH = 1.0/SIN(THETA(I)/2.0)**4/16.0 SI = ALOG(SIG(I)) RU = ALOG(RUTH) WRITE (6,"(3F16.8)") THETA(I),SI,RU END DO END PROGRAM SCATTERING ! SUBROUTINE SIMP (N,H,FI,S) ! ! Subroutine for integration over f(x) with the Simpson rule. FI: ! integrand f(x); H: interval; S: integral. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL :: S0,S1,S2 REAL, INTENT (OUT) :: S REAL, INTENT (IN), DIMENSION (N) :: FI ! S = 0.0 S0 = 0.0 S1 = 0.0 S2 = 0.0 DO I = 2, N-1, 2 S1 = S1+FI(I-1) S0 = S0+FI(I) S2 = S2+FI(I+1) END DO S = H*(S1+4.0*S0+S2)/3.0 ! ! If N is even, add the last slice separately ! IF (MOD(N,2).EQ.0) S = S & +H*(5.0*FI(N)+8.0*FI(N-1)-FI(N-2))/12.0 END SUBROUTINE SIMP ! SUBROUTINE SECANT (DL,X0,DX,ISTEP) ! ! Subroutine for the root of f(x)=0 with the secant method. ! ! IMPLICIT NONE INTEGER, INTENT (INOUT) :: ISTEP REAL, INTENT (INOUT) :: X0,DX REAL :: X1,X2,D,F,FX REAL, INTENT (IN) :: DL

Page 115: Fortran 90

115

! ISTEP = 0 X1 = X0+DX DO WHILE (ABS(DX).GT.DL) D = FX(X1)-FX(X0) X2 = X1-FX(X1)*(X1-X0)/D X0 = X1 X1 = X2 DX = X1-X0 ISTEP = ISTEP+1 END DO END SUBROUTINE SECANT ! SUBROUTINE THREE (N,H,FI,F1,F2) ! ! Subroutine for 1st and 2nd order derivatives with the three-point ! formulas. Extrapolations are made at the boundaries. FI: input ! f(x); H: interval; F1: f'; and F2: f". ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL, INTENT (IN), DIMENSION (N) :: FI REAL, INTENT (OUT), DIMENSION (N) :: F1,F2 ! ! f' and f" from three-point formulas ! DO I = 2, N-1 F1(I) = (FI(I+1)-FI(I-1))/(2.*H) F2(I) = (FI(I+1)-2.0*FI(I)+FI(I-1))/(H*H) END DO ! ! Linear extrapolation for the boundary points ! F1(1) = 2.0*F1(2)-F1(3) F1(N) = 2.0*F1(N-1)-F1(N-2) F2(1) = 2.0*F2(2)-F2(3) F2(N) = 2.0*F2(N-1)-F2(N-2) END SUBROUTINE THREE ! FUNCTION FX(X) RESULT (F) USE CB IMPLICIT NONE REAL :: X,F,U,UX ! F = 1.0-B*B/(X*X)-UX(X)/E END FUNCTION FX ! FUNCTION FBX(X) RESULT (FB) USE CB IMPLICIT NONE REAL :: X,FB ! FB = 1.0-B*B/(X*X) END FUNCTION FBX ! FUNCTION UX(X) RESULT (U) USE CB IMPLICIT NONE REAL :: X,U

Page 116: Fortran 90

116

! U = 1.0/X*EXP(-X/A) END FUNCTION UX

:33برنامه PROGRAM EULER_CONST INCLUDE 'mpif.h' INTEGER :: N,K,IERR,IRANK,IPROC,IFINISH REAL*8, PARAMETER :: SUM25=0.577215664901532860606512D0 REAL*8 :: SUMI,SUM ! CALL MPI_INIT (IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD,IRANK,IERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,IPROC,IERR) ! IF (IRANK.EQ.0) THEN PRINT*, 'Enter total number of terms in the series: ' READ (5,*) N END IF ! ! Broadcast the total number of terms to every process ! CALL MPI_BCAST (N,1,MPI_INTEGER,0,MPI_COMM_WORLD,IERR) K = (N/IPROC) SUMI = 0.D0 ! IF (IRANK.NE.(IPROC-1)) then DO I = IRANK*K+1, (IRANK+1)*K SUMI = SUMI+1.D0/DFLOAT(I) END DO ELSE DO I = IRANK*K+1, N SUMI = SUMI + 1.D0/DFLOAT(I) END DO END IF ! ! Collect the sums from every process ! CALL MPI_REDUCE (SUMI,SUM,1,MPI_DOUBLE_PRECISION, & MPI_SUM,0,MPI_COMM_WORLD,IERR) IF (IRANK.EQ.0) THEN SUM = SUM-DLOG(DFLOAT(N)) PRINT*, 'The evaluated Euler constant is ', SUM, & 'with the estimated error of ', DABS(SUM-SUM25) END IF ! CALL MPI_FINALIZE (IFINISH) END PROGRAM EULER_CONST

:34برنامه PROGRAM TALK_0_TO_1 INCLUDE 'mpif.h' INTEGER :: IRANK,IPROC,ITAG,ISEND,IRECV,IERR,IM,ID,IFINISH INTEGER, DIMENSION (MPI_STATUS_SIZE) :: ISTAT CHARACTER*40 :: HELLO ! ITAG = 730 ID = 40 ISEND = 0

Page 117: Fortran 90

117

IRECV = 1 CALL MPI_INIT (IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD,IRANK,IERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,IPROC,IERR) PRINT*, IRANK, IPROC CALL MPI_BARRIER (MPI_COMM_WORLD,IERR) IF (IRANK.EQ.ISEND) THEN HELLO = 'I am process 0, who are you ?' IM = 29 CALL MPI_SEND (HELLO,IM,MPI_CHARACTER,IRECV, & ITAG,MPI_COMM_WORLD,IERR) PRINT*, 'I sent the message: ', HELLO ELSE IF (IRANK.EQ.IRECV) THEN CALL MPI_RECV (HELLO,ID,MPI_CHARACTER,ISEND, & ITAG,MPI_COMM_WORLD,ISTAT,IERR) PRINT*, 'I got your message which is: ', HELLO END IF CALL MPI_FINALIZE(IFINISH) END PROGRAM TALK_0_TO_1

:35برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! SUBROUTINE PERCOLATION (L,N,M,P) ! ! Subroutine to create an N*M percolation network. ! ! INTEGER, INTENT (IN) :: N,M REAL, INTENT (IN) :: P REAL:: R,RANF LOGICAL, INTENT (OUT), DIMENSION (N,M) :: L ! DO I = 1, N DO J = 1, M R = RANF() IF(R.LT.P) THEN L(I,J) = .TRUE. ELSE L(I,J) = .FALSE. END IF END DO END DO END SUBROUTINE PERCOLATION ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ)

Page 118: Fortran 90

118

IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:36برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! SUBROUTINE GRNF (X,Y) ! ! Two Gaussian random numbers generated from two uniform random ! numbers. ! IMPLICIT NONE REAL, INTENT (OUT) :: X,Y REAL :: PI,R1,R2,R,RANF ! PI = 4.0*ATAN(1.0) R1 = -ALOG(1.0-RANF()) R2 = 2.0*PI*RANF() R1 = SQRT(2.0*R1) X = R1*COS(R2) Y = R1*SIN(R2) END SUBROUTINE GRNF ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:37برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! FUNCTION ERNF() RESULT (E)

Page 119: Fortran 90

119

! ! Exponential random number generator from a uniform random ! number generator. ! REAL E,R,RANF ! E = -ALOG(1.0-RANF()) END FUNCTION ERNF ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:38برنامه MODULE CSEED INTEGER :: ISEED END MODULE CSEED ! FUNCTION RANF() RESULT (R) ! ! Uniform random number generator x(n+1) = a*x(n) mod c with ! a=7**5 and c = 2**(31)-1. ! USE CSEED IMPLICIT NONE INTEGER :: IH,IL,IT,IA,IC,IQ,IR DATA IA/16807/,IC/2147483647/,IQ/127773/,IR/2836/ REAL :: R ! IH = ISEED/IQ IL = MOD(ISEED,IQ) IT = IA*IL-IR*IH IF(IT.GT.0) THEN ISEED = IT ELSE ISEED = IC+IT END IF R = ISEED/FLOAT(IC) END FUNCTION RANF

:39برنامه

Page 120: Fortran 90

120

MODULE CB REAL :: B,E,A END MODULE CB ! PROGRAM SCATTERING ! ! This is the main program for the scattering problem. ! ! USE CB IMPLICIT NONE INTEGER, PARAMETER :: M=21,N=10001 INTEGER I,J,ISTEP REAL :: DL,B0,DB,DX,X0,X,DX0,F,FX,FB,FBX,G1,G2,RU,RUTH,SI REAL, DIMENSION (N) :: FI REAL, DIMENSION (M) :: THETA,SIG,SIG1 ! DL = 1.E-06 B0 = 0.01 DB = 0.5 DX = 0.01 E = 1.0 A = 100.0 DO I = 1, M B = B0+(I-1)*DB ! ! Calculate the first term of theta ! DO J = 1, N X = B+DX*J FI(J) = 1.0/(X*X*SQRT(FBX(X))) END DO CALL SIMP(N,DX,FI,G1) ! ! Find r_m from 1-b*b/(r*r)-U/E=0 ! X0 = B DX0 = DX CALL SECANT (DL,X0,DX0,ISTEP) ! ! Calculate the second term of theta ! DO J = 1, N X = X0+DX*J FI(J) = 1.0/(X*X*SQRT(FX(X))) END DO CALL SIMP (N,DX,FI,G2) THETA(I) = 2.0*B*(G1-G2) END DO ! ! Calculate d_theta/d_b ! CALL THREE (M,DB,THETA,SIG,SIG1) ! ! Put the cross section in log form with the exact result of ! the Coulomb scattering (RUTH) ! DO I = M, 1, -1 B = B0+(I-1)*DB SIG(I) = B/ABS(SIG(I))/SIN(THETA(I)) RUTH = 1.0/SIN(THETA(I)/2.0)**4/16.0

Page 121: Fortran 90

121

SI = ALOG(SIG(I)) RU = ALOG(RUTH) WRITE (6,"(3F16.8)") THETA(I),SI,RU END DO END PROGRAM SCATTERING ! SUBROUTINE SIMP (N,H,FI,S) ! ! Subroutine for integration over f(x) with the Simpson rule. FI: ! integrand f(x); H: interval; S: integral. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL :: S0,S1,S2 REAL, INTENT (OUT) :: S REAL, INTENT (IN), DIMENSION (N) :: FI ! S = 0.0 S0 = 0.0 S1 = 0.0 S2 = 0.0 DO I = 2, N-1, 2 S1 = S1+FI(I-1) S0 = S0+FI(I) S2 = S2+FI(I+1) END DO S = H*(S1+4.0*S0+S2)/3.0 ! ! If N is even, add the last slice separately ! IF (MOD(N,2).EQ.0) S = S & +H*(5.0*FI(N)+8.0*FI(N-1)-FI(N-2))/12.0 END SUBROUTINE SIMP ! SUBROUTINE SECANT (DL,X0,DX,ISTEP) ! ! Subroutine for the root of f(x)=0 with the secant method. ! ! IMPLICIT NONE INTEGER, INTENT (INOUT) :: ISTEP REAL, INTENT (INOUT) :: X0,DX REAL :: X1,X2,D,F,FX REAL, INTENT (IN) :: DL ! ISTEP = 0 X1 = X0+DX DO WHILE (ABS(DX).GT.DL) D = FX(X1)-FX(X0) X2 = X1-FX(X1)*(X1-X0)/D X0 = X1 X1 = X2 DX = X1-X0 ISTEP = ISTEP+1 END DO END SUBROUTINE SECANT ! SUBROUTINE THREE (N,H,FI,F1,F2) !

Page 122: Fortran 90

122

! Subroutine for 1st and 2nd order derivatives with the three-point ! formulas. Extrapolations are made at the boundaries. FI: input ! f(x); H: interval; F1: f'; and F2: f". ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H REAL, INTENT (IN), DIMENSION (N) :: FI REAL, INTENT (OUT), DIMENSION (N) :: F1,F2 ! ! f' and f" from three-point formulas ! DO I = 2, N-1 F1(I) = (FI(I+1)-FI(I-1))/(2.*H) F2(I) = (FI(I+1)-2.0*FI(I)+FI(I-1))/(H*H) END DO ! ! Linear extrapolation for the boundary points ! F1(1) = 2.0*F1(2)-F1(3) F1(N) = 2.0*F1(N-1)-F1(N-2) F2(1) = 2.0*F2(2)-F2(3) F2(N) = 2.0*F2(N-1)-F2(N-2) END SUBROUTINE THREE ! FUNCTION FX(X) RESULT (F) USE CB IMPLICIT NONE REAL :: X,F,U,UX ! F = 1.0-B*B/(X*X)-UX(X)/E END FUNCTION FX ! FUNCTION FBX(X) RESULT (FB) USE CB IMPLICIT NONE REAL :: X,FB ! FB = 1.0-B*B/(X*X) END FUNCTION FBX ! FUNCTION UX(X) RESULT (U) USE CB IMPLICIT NONE REAL :: X,U ! U = 1.0/X*EXP(-X/A) END FUNCTION UX

:40برنامه PROGRAM EULER_CONST INCLUDE 'mpif.h' INTEGER :: N,K,IERR,IRANK,IPROC,IFINISH REAL*8, PARAMETER :: SUM25=0.577215664901532860606512D0 REAL*8 :: SUMI,SUM ! CALL MPI_INIT (IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD,IRANK,IERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,IPROC,IERR)

Page 123: Fortran 90

123

! IF (IRANK.EQ.0) THEN PRINT*, 'Enter total number of terms in the series: ' READ (5,*) N END IF ! ! Broadcast the total number of terms to every process ! CALL MPI_BCAST (N,1,MPI_INTEGER,0,MPI_COMM_WORLD,IERR) K = (N/IPROC) SUMI = 0.D0 ! IF (IRANK.NE.(IPROC-1)) then DO I = IRANK*K+1, (IRANK+1)*K SUMI = SUMI+1.D0/DFLOAT(I) END DO ELSE DO I = IRANK*K+1, N SUMI = SUMI + 1.D0/DFLOAT(I) END DO END IF ! ! Collect the sums from every process ! CALL MPI_REDUCE (SUMI,SUM,1,MPI_DOUBLE_PRECISION, & MPI_SUM,0,MPI_COMM_WORLD,IERR) IF (IRANK.EQ.0) THEN SUM = SUM-DLOG(DFLOAT(N)) PRINT*, 'The evaluated Euler constant is ', SUM, & 'with the estimated error of ', DABS(SUM-SUM25) END IF ! CALL MPI_FINALIZE (IFINISH) END PROGRAM EULER_CONST

:41برنامه PROGRAM TALK_0_TO_1 INCLUDE 'mpif.h' INTEGER :: IRANK,IPROC,ITAG,ISEND,IRECV,IERR,IM,ID,IFINISH INTEGER, DIMENSION (MPI_STATUS_SIZE) :: ISTAT CHARACTER*40 :: HELLO ! ITAG = 730 ID = 40 ISEND = 0 IRECV = 1 CALL MPI_INIT (IERR) CALL MPI_COMM_RANK (MPI_COMM_WORLD,IRANK,IERR) CALL MPI_COMM_SIZE (MPI_COMM_WORLD,IPROC,IERR) PRINT*, IRANK, IPROC CALL MPI_BARRIER (MPI_COMM_WORLD,IERR) IF (IRANK.EQ.ISEND) THEN HELLO = 'I am process 0, who are you ?' IM = 29 CALL MPI_SEND (HELLO,IM,MPI_CHARACTER,IRECV, & ITAG,MPI_COMM_WORLD,IERR) PRINT*, 'I sent the message: ', HELLO ELSE IF (IRANK.EQ.IRECV) THEN CALL MPI_RECV (HELLO,ID,MPI_CHARACTER,ISEND, & ITAG,MPI_COMM_WORLD,ISTAT,IERR)

Page 124: Fortran 90

124

PRINT*, 'I got your message which is: ', HELLO END IF CALL MPI_FINALIZE(IFINISH) END PROGRAM TALK_0_TO_1

:42برنامه MODULE ORDER_AN_ARRAY PRIVATE EXCHANGE ! CONTAINS ! SUBROUTINE REARRANGE (A) IMPLICIT NONE REAL, INTENT(INOUT) :: A(:) LOGICAL, ALLOCATABLE :: MASK(:) INTEGER :: I, N INTEGER, DIMENSION(1) :: K N = SIZE (A) ALLOCATE (MASK(N)) MASK = .TRUE. DO I = 0, N-1 MASK(N-I) = .FALSE. K = MAXLOC(A,MASK) CALL EXCHANGE(A(K(1)),A(N-I)) END DO END SUBROUTINE REARRANGE ! SUBROUTINE EXCHANGE (X,Y) IMPLICIT NONE REAL, INTENT(INOUT):: X,Y REAL TX TX = X; X = Y; Y = TX END SUBROUTINE EXCHANGE ! END MODULE ORDER_AN_ARRAY ! PROGRAM RANDOM_ARRAY_ORDERED USE ORDER_AN_ARRAY ! IMPLICIT NONE INTEGER, PARAMETER :: N = 100 REAL, DIMENSION(N) :: A INTEGER :: I ! CALL RANDOM_NUMBER (A) CALL REARRANGE (A) WRITE(6, "(F10.8)") (A(I),I=1,N) END PROGRAM RANDOM_ARRAY_ORDERED

:43برنامه PROGRAM ARRAY_EXAMPLE IMPLICIT NONE REAL :: TWO_PI REAL, ALLOCATABLE :: A(:,:), B(:,:), C(:,:), D(:) INTEGER :: N,M,L,I ! TWO_PI = 8.0*ATAN(1.0) READ "(3I4)", N, M, L ALLOCATE (A(N,M)); ALLOCATE (B(L,N))

Page 125: Fortran 90

125

ALLOCATE (C(L,M)); ALLOCATE (D(M)) CALL RANDOM_NUMBER (A); CALL RANDOM_NUMBER (B); A = SIN(TWO_PI*A); B = COS(TWO_PI*B) C = MATMUL(B,A) DO I = 1, M D(I) = DOT_PRODUCT(A(:,I),B(I,:)) END DO PRINT "(8F10.6)", D END PROGRAM ARRAY_EXAMPLE

:44برنامه PROGRAM GALERKIN ! ! This program solves the one-dimensional Poisson equation with the ! Galerkin method as described in the text. ! IMPLICIT NONE INTEGER, PARAMETER :: N=99 INTEGER :: I REAL :: PI,XL,H,D,E,B0,B1,XIM,XI,XIP REAL, DIMENSION (N) :: B,A,Y,W,U ! PI = 4.0*ATAN(1.0) XL = 1.0 H = XL/(N+1) D = 2.0/H E = -1.0/H B0 = PI/H B1 = 1.0/H ! ! Find the elements in L and U ! W(1) = D U(1) = E/D DO I = 2, N W(I) = D-E*U(I-1) U(I) = E/W(I) END DO ! ! Assign the array B ! DO I = 1, N XIM = H*(I-1) XI = H*I XIP = H*(I+1) B(I) = B0*COS(PI*XI)*(XIM+XIP-2.0*XI) & +B1*(2.0*SIN(PI*XI)-SIN(PI*XIM)-SIN(PI*XIP)) END DO ! ! Find the solution ! Y(1) = B(1)/W(1) DO I = 2, N Y(I) = (B(I)-E*Y(I-1))/W(I) END DO ! A(N) = Y(N) DO I = N-1,1,-1 A(I) = Y(I)-U(I)*A(I+1) END DO

Page 126: Fortran 90

126

! WRITE (6,"(2F16.8)") (I*H,A(I), I=1,N) END PROGRAM GALERKIN

:45برنامه PROGRAM G_WATER ! ! This program solves the groundwater dynamics problem in the ! rectangular geometry through the relaxation method. ! ! IMPLICIT NONE INTEGER, PARAMETER :: NX=101,NY=51,ISKX=10,ISKY=5,ITMX=5 INTEGER :: I,J,ISTP REAL :: PI,A0,B0,H0,CH,SX,SY,HX,HY,P,X,Y REAL, DIMENSION (NX,NY) :: PHI,CK,SN ! PI = 4.0*ATAN(1.0) A0 = 1.0 B0 = -0.04 H0 = 200.0 CH = -20.0 SX = 1000.0 SY = 500.0 HX = SX/(NX-1) HY = SY/(NY-1) P = 0.5 ! ! Set up boundary conditions and initial guess of the solution ! DO I = 1, NX X = (I-1)*HX DO J = 1, NY Y = (J-1)*HY SN(I,J) = 0.0 CK(I,J) = A0+B0*Y PHI(I,J) = H0+CH*COS(PI*X/SX)*Y/SY END DO END DO ! DO ISTP = 1, ITMX ! ! Ensure the boundary conditions by the 4-point formula ! DO J = 1, NY PHI(1,J) = (4.0*PHI(2,J)-PHI(3,J))/3.0 PHI(NX,J) = (4.0*PHI(NX-1,J)-PHI(NX-2,J))/3.0 END DO ! CALL RX2D (PHI,CK,SN,NX,NY,P,HX,HY) END DO ! DO I = 1, NX, ISKX X = (I-1)*HX DO J = 1, NY, ISKY Y = (J-1)*HY WRITE (6,"(3F16.8)") X,Y,PHI(I,J) END DO END DO END PROGRAM G_WATER

Page 127: Fortran 90

127

! SUBROUTINE RX2D (FN,DN,S,NX,NY,P,HX,HY) ! ! Subroutine performing one iteration of the relaxation for ! the two-dimensional Poisson equation. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: NX,NY INTEGER :: I,J REAL, INTENT (IN) :: HX,HY,P REAL :: HX2,A,B,Q,CIP,CIM,CJP,CJM REAL, INTENT (IN), DIMENSION (NX,NY) :: DN,S REAL, INTENT (INOUT), DIMENSION (NX,NY) :: FN ! HX2 = HX*HX A = HX2/(HY*HY) B = 1.0/(4.0*(1.0+A)) Q = 1.0-P ! DO I = 2, NX-1 DO J = 2, NY-1 CIP = B*(DN(I+1,J)/DN(I,J)+1.0) CIM = B*(DN(I-1,J)/DN(I,J)+1.0) CJP = A*B*(DN(I,J+1)/DN(I,J)+1.0) CJM = A*B*(DN(I,J-1)/DN(I,J)+1.0) FN(I,J) = Q*FN(I,J)+P*(CIP*FN(I+1,J)+CIM*FN(I-1,J) & +CJP*FN(I,J+1)+CJM*FN(I,J-1)+HX2*S(I,J)) END DO END DO END SUBROUTINE RX2D

:46برنامه SUBROUTINE BSSL (BJ,BY,N,X) ! ! Subroutine to generate J_n(x) and Y_n(x) with given x and ! up to N=NMAX-NTEL. ! INTEGER, PARAMETER :: NMAX=30,NTEL=5 INTEGER, INTENT (IN) :: N INTEGER :: I,J,K REAL, INTENT (IN) :: X REAL :: PI,GAMMA,SUM,SUM1 REAL, INTENT (OUT), DIMENSION (0:N) :: BJ,BY REAL, DIMENSION (0:NMAX) :: B1 ! PI = 4.0*ATAN(1.0) GAMMA = 0.5772156649 ! B1(NMAX) = 0.0 B1(NMAX-1) = 1.0 ! ! Generating J_n(x) ! SUM = 0.0 DO I = NMAX-1, 1, -1 B1(I-1) = 2*I*B1(I)/X-B1(I+1) IF (MOD(I,2).EQ.0) SUM = SUM+2.0*B1(I) END DO SUM = SUM+B1(0) !

Page 128: Fortran 90

128

DO I = 0, N BJ(I) = B1(I)/SUM END DO ! ! Generating Y_n(x) starts here ! SUM1 = 0.0 DO K = 1, NMAX/2 SUM1 = SUM1+(-1)**K*B1(2*K)/K END DO ! SUM1 = -4.0*SUM1/(PI*SUM) BY(0) = 2.0*(ALOG(X/2.0)+GAMMA)*BJ(0)/PI+SUM1 BY(1) = (BJ(1)*BY(0)-2.0/(PI*X))/BJ(0) DO I = 1, N-1 BY(I+1) = 2*I*BY(I)/X-BY(I-1) END DO END SUBROUTINE BSSL

:47برنامه SUBROUTINE FFT (AR,AI,N,M) ! ! An example of the fast Fourier transform subroutine with N = 2**M. ! AR and AI are the real and imaginary part of data in the input and ! corresponding Fourier coefficients in the output. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N,M INTEGER :: N1,N2,I,J,K,L,L1,L2 REAL :: PI,A1,A2,Q,U,V REAL, INTENT (INOUT), DIMENSION (N) :: AR,AI ! PI = 4.0*ATAN(1.0) N2 = N/2 ! N1 = 2**M IF(N1.NE.N) STOP 'Indices do not match' ! ! Rearrange the data to the bit reversed order ! L = 1 DO K = 1, N-1 IF (K.LT.L) THEN A1 = AR(L) A2 = AI(L) AR(L) = AR(K) AR(K) = A1 AI(L) = AI(K) AI(K) = A2 END IF J = N2 DO WHILE (J.LT.L) L = L-J J = J/2 END DO L = L+J END DO ! ! Perform additions at all levels with reordered data

Page 129: Fortran 90

129

! L2 = 1 DO L = 1, M Q = 0.0 L1 = L2 L2 = 2*L1 DO K = 1, L1 U = COS(Q) V = -SIN(Q) Q = Q + PI/L1 DO J = K, N, L2 I = J + L1 A1 = AR(I)*U-AI(I)*V A2 = AR(I)*V+AI(I)*U AR(I) = AR(J)-A1 AR(J) = AR(J)+A1 AI(I) = AI(J)-A2 AI(J) = AI(J)+A2 END DO END DO END DO END SUBROUTINE FFT

:48برنامه PROGRAM DFT_EXAMPLE ! ! Example of the discrete Fourier transform with function f(x) = ! x(1-x) in [0,1]. The inverse transform is also performed for ! comparison. ! IMPLICIT NONE INTEGER, PARAMETER :: N=128,M=8 INTEGER :: I REAL :: F0,H,X REAL, DIMENSION (N) :: FR,FI,GR,GI ! F0 = 1.0/SQRT(FLOAT(N)) H = 1.0/(N-1) ! DO I = 1, N X = H*(I-1) FR(I) = X*(1.0-X) FI(I) = 0.0 END DO ! CALL DFT (FR,FI,GR,GI,N) DO I = 1, N GR(I) = F0*GR(I) GI(I) = F0*GI(I) END DO ! ! Perform inverse Fourier transform ! DO I = 1, N GI(I) = -GI(I) END DO CALL DFT (GR,GI,FR,FI,N) DO I = 1, N FR(I) = F0*FR(I) FI(I) = -F0*FI(I)

Page 130: Fortran 90

130

END DO WRITE (6,"(2F16.8)") (H*(I-1),FR(I),I=1,N,M) WRITE (6,"(2F16.8)") H*(N-1),FR(N) END PROGRAM DFT_EXAMPLE ! SUBROUTINE DFT (FR,FI,GR,GI,N) ! ! Subroutine to perform the discrete Fourier transform with ! FR and FI as the real and imaginary parts of the input and ! GR and GI as the corresponding output. ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I,J REAL :: PI,X,Q REAL, INTENT (IN), DIMENSION (N) :: FR,FI REAL, INTENT (OUT), DIMENSION (N) :: GR,GI ! PI = 4.0*ATAN(1.0) X = 2*PI/N ! DO I = 1, N GR(I) = 0.0 GI(I) = 0.0 DO J = 1, N Q = X*(J-1)*(I-1) GR(I) = GR(I)+FR(J)*COS(Q)+FI(J)*SIN(Q) GI(I) = GI(I)+FI(J)*COS(Q)-FR(J)*SIN(Q) END DO END DO END SUBROUTINE DFT

:49برنامه PROGRAM S_L_LEGENDRE ! ! Main program for solving the Legendre equation with the simplest ! algorithm for the Sturm-Liouville equation and the bisection method ! for the root search. ! IMPLICIT NONE INTEGER, PARAMETER :: N=501 INTEGER :: ISTEP REAL :: DL,H,AK,BK,DK,EK,F0,F1 REAL, DIMENSION (N) :: U ! ! Initialization of the problem ! DL = 1.0E-06 H = 2.0/(N-1) AK = 0.5 BK = 1.5 DK = 0.5 EK = AK U(1) = -1.0 U(2) = -1.0+H ISTEP = 0 CALL SMPL (N,H,EK,U) F0 = U(N)-1.0 ! ! Bisection method for the root

Page 131: Fortran 90

131

! DO WHILE (ABS(DK).GT.DL) EK = (AK+BK)/2.0 CALL SMPL (N,H,EK,U) F1 = U(N)-1.0 IF ((F0*F1).LT.0) THEN BK = EK DK = BK-AK ELSE AK = EK DK = BK-AK F0 = F1 END IF ISTEP = ISTEP+1 END DO ! WRITE (6,"(I4,3F16.8)") ISTEP,EK,DK,F1 END PROGRAM S_L_LEGENDRE ! SUBROUTINE SMPL (N,H,EK,U) ! ! The simplest algorithm for the Sturm-Liouville equation. ! ! IMPLICIT NONE INTEGER, INTENT (IN) :: N INTEGER :: I REAL, INTENT (IN) :: H,EK REAL :: H2,Q,X,P,P1 REAL, INTENT (OUT), DIMENSION (N) :: U ! H2 = 2.0*H*H Q = EK*(1.0+EK) DO I = 2, N-1 X = (I-1)*H-1.0 P = 2.0*(1.0-X*X) P1 = -2.0*X*H U(I+1) = ((2.0*P-H2*Q)*U(I)+(P1-P)*U(I-1))/(P1+P) END DO END SUBROUTINE SMPL

:50نامه بر

PROGRAM ONE_D_MOTION2 ! ! Simplest predictor-corector algorithm applied to a particle in one ! dimension under an elastic force. ! IMPLICIT NONE INTEGER, PARAMETER :: N=101,IN=5 INTEGER :: I REAL :: PI,DT REAL, DIMENSION (N) :: T,V,X ! PI = 4.0*ATAN(1.0) DT =2.0*PI/100 X(1)=0.0 T(1)=0.0 V(1)=1.0 !

Page 132: Fortran 90

132

DO I = 1, N-1 T(I+1) = I*DT ! ! Predictor for position and velocity ! X(I+1) = X(I)+V(I)*DT V(I+1) = V(I)-X(I)*DT ! ! Corrector for position and velocity ! X(I+1) = X(I)+(V(I)+V(I+1))*DT/2.0 V(I+1) = V(I)-(X(I)+X(I+1))*DT/2.0 END DO WRITE(6,"(3F16.8)") (T(I),X(I),V(I),I=1,N,IN) END PROGRAM ONE_D_MOTION2