当前位置:文档之家› 有限元编程算例(fortran)

有限元编程算例(fortran)

有限元编程算例(fortran)
有限元编程算例(fortran)

有限元编程算例(Fortran)

本程序通过Fortran语言编写,程序在Intel Parallel Studio XE 2013 with VS2013中成功运行,程序为《计算力学》(龙述尧等编)一书中的源程序,仅作研究学习使用,省去了敲写的麻烦。

源程序为:

!Page149

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

OPEN(5,FILE='DATAIN')

!OPEN(6,FILE='DATAOUT',STATUS='NEW')

CALL DATA

IF(IND.EQ.0)GOTO 10

EO=EO/(1.0-UN*UN)

UN=UN/(1.0-UN)

10 CALL TOTSTI

CALL LOAD

CALL SUPPOR

CALL SOLVEQ

CALL STRESS

PAUSE

!STOP

END

SUBROUTINE DATA

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

READ(5,*)NJ,NE,NZ,NDD,NPJ,IND

NJ2=NJ*2

NPJ1=NPJ+1

READ(5,*)EO,UN,GAMA,TE

READ(5,*)((JM(I,J),J=1,3),I=1,NE)

READ(5,*)((CJZ(I,J),J = 1,2),I=1,NJ)

!Page150

READ(5,*)(NZC(I),I=1,NZ)

READ(5,*)((PJ(I,J),J=1,2),I=1,NPJ1)

WRITE(6,10)(I,(CJZ(I,J),J=1,2),I=1,NJ)

10 FORMA T(4X,2HNO,6X,1HX,6X,1HY/(I6,2X,F7.2,F7.2))

RETURN

END

SUBROUTINE ELEST(MEO,IASK)

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

IE=JM(MEO,1)

JE=JM(MEO,2)

ME=JM(MEO,3)

CM=CJZ(JE,1)-CJZ(IE,1)

BM=CJZ(IE,2)-CJZ(JE,2)

CJ=CJZ(IE,1)-CJZ(ME,1)

BJ=CJZ(ME,2)-CJZ(IE,2)

AE=(BJ*CM-BM*CJ)/2.0

IF(IASK.LE.1) GOTO 50

DO 10 I=1,3

DO 10 J=1,6

B(I,J)=0.0

10 CONTINUE

B(1,1)=-BJ-BM

B(1,3)=BJ

B(1,5)=BM

B(2,2)=-CJ-CM

B(2,4)=CJ

B(2,6)=CM

B(3,1)=B(2,2)

B(3,2)=B(1,1)

B(3,3)=B(2,4)

B(3,4)=B(1,3)

B(3,5)=B(2,6)

!Page151

B(3,6)=B(1,5)

DO 20 I=1,3

DO 20 J=1,6

B(I,J)=B(I,J)/(2.0*AE) 20 CONTINUE

D(1,1)=EO/(1.0-UN*UN)

D(1,2)=EO*UN/(1.0-UN*UN) D(2,1)=D(1,2)

D(2,2)=D(1,1)

D(1,3)=0.0

D(2,3)=0.0

D(3,1)=0.0

D(3,2)=0.0

D(3,3)=EO/(2.0*(1.0+UN))

DO 30 I=1,3

DO 30 J=1,6

S(I,J)=0.0

DO 30 K=1,3

S(I,J)=S(I,J)+D(I,K)*B(K,J)

30 CONTINUE

IF(IASK.LE.2) GOTO 50

DO 40 I=1,6

DO 40 J=1,6

EKE(I,J)=0.0

DO 40 K=1,3

!**********************************Exchange B And S***********************************************

EKE(I,J)=EKE(I,J)+B(K,I)*S(K,J)*AE*TE

40 CONTINUE

50 CONTINUE

RETURN

END

SUBROUTINE TOTSTI

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

!Page152

DO 20 I=1,NJ2

DO 20 J=1,NDD

TKZ(I,J)=0.0

20 CONTINUE

!*************Not Understanded*****************************

DO 30 MEO=1,NE

CALL ELEST(MEO,3)

DO 30 I=1,3

DO 30 II=1,2

LH=2*(I-1)+II

LDH=2*(JM(MEO,I)-1)+II

DO 30 J=1,3

DO 30 JJ=1,2

L=2*(J-1)+JJ

LZ=2*(JM(MEO,J)-1)+JJ

LD=LZ-LDH+1

IF(LD.LE.0) GOTO 30

TKZ(LDH,LD)=TKZ(LDH,LD)+EKE(LH,L)

30 CONTINUE

RETURN

END

SUBROUTINE LOAD

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

DO 10 I=1,NJ2

P(I)=0.0

10 CONTINUE

IF(NPJ.EQ.0) GOTO 30

DO 20 I=1,NPJ

I1=I+1

J=IFIX(PJ(I1,2))

P(J)=PJ(I1,1)

20 CONTINUE

30 IF(GAMA.LE.0.0) GOTO 50

!Page153

DO 40 MEO=1,NE

CALL ELEST(MEO,1)

PE=-GAMA*AE*TE/3.0

IE=JM(MEO,1)

JE=JM(MEO,2)

ME=JM(MEO,3)

P(2*IE)=P(2*IE)+PE

P(2*JE)=P(2*JE)+PE

P(2*ME)=P(2*ME)+PE

40 CONTINUE

50 CONTINUE

RETURN

END

SUBROUTINE SUPPOR

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

DO 60 I=1,NZ

MZ=NZC(I)

TKZ(MZ,1)=1.0

DO 10 J=2,NDD

TKZ(MZ,J)=0.0

10 CONTINUE

IF(MZ-NDD)20,20,30

20 JO=MZ

GOTO 40

30 JO=NDD

40 DO 50 J = 2,JO

J1=MZ-J

TKZ(J1+1,J)=0.0

50 CONTINUE

P(MZ)=0.0

60 CONTINUE

RETURN

END

!Page154

SUBROUTINE SOLVEQ

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200)

NJ1=NJ2-1

DO 50 K=1,NJ1

IF(NJ2-K-NDD+1)10,10,20

10 IM=NJ2

GOTO 30

20 IM=K+NDD-1

30 K1=K+1

DO 50 I=K1,IM

L=I-K+1

C=TKZ(K,L)/TKZ(K,1)

LD1=NDD-L+1

DO 40 J=1,LD1

M=J+I-K

TKZ(I,J)=TKZ(I,J)-C*TKZ(K,M)

40 CONTINUE

P(I)=P(I)-C*P(K)

50 CONTINUE

P(NJ2)=P(NJ2)/TKZ(NJ2,1)

DO 100 I1 = 1,NJ1

I=NJ2-I1

!************************************************************************下面一行可能出错IF(NDD-NJ2+I-1)60,60,70

60 JO=NDD

GOTO 80

70 JO=NJ2-I+1

80 DO 90 J=2,JO

LH=J+I-1

P(I)=P(I)-TKZ(I,J)*P(LH)

90 CONTINUE

P(I)=P(I)/TKZ(I,1)

100 CONTINUE

!Page155

WRITE(6,110)(I,P(2*I-1),P(2*I),I=1,NJ)

!************************************************************************************ 110 FORMA T(2X,3HJD=,3X,2HU=,12X,2HV=/(I4,3X,F16.7,3X,F16.7))

RETURN

END

SUBROUTINE STRESS

COMMON/X1/NJ,NE,NZ,NDD,NPJ,IND,NJ2,EO,UN,GAMA,TE,AE

COMMON/X2/JM(100,3),NZC(50),CJZ(100,2),PJ(100,2),B(3,6),D(3,3),S(3,6),TKZ(200,20),EKE(6,6),P(200) DIMENSION WY(6),YL(3)

DO 60 MEO=1,NE

CALL ELEST(MEO,2)

DO 10 I=1,3

DO 10 J=1,2

LH=2*(I-1)+J

LDH=2*(JM(MEO,I)-1)+J

WY(LH)=P(LDH)

10 CONTINUE

DO 20 I=1,3

YL(I)=0.0

DO 20 J=1,6

YL(I)=YL(I)+S(I,J)*WY(J)

20 CONTINUE

SIGX=YL(1)

SIGY=YL(2)

TOXY=YL(3)

PYL=(SIGX+SIGY)/2.0

SIG=(SIGX-SIGY)**2/4.0+TOXY*TOXY

RYL=SQRT(SIG)

SIG1=PYL+RYL

SIG2=PYL-RYL

IF(SIGY.EQ.SIG2) GOTO 30

CETA1=TOXY/(SIGY-SIG2)

CETA=90.0-57.29578*ATAN(CETA1)

GOTO 40

!Page156

30 CETA=0.0

40 WRITE(6,50)MEO,SIGX,SIGY,TOXY,SIG1,SIG2,CETA

50

FORMA T(4X,2HE=,I3/2X,3HSX=,F11.3,3X,3HSY=,F11.3,3X,4HTAU=,F11.3/2X,3HS1=,F11.3,3X,3HS2=,F11. 3,3X,4HCET=,F11.3)

!50

FORMA T(4X,2HE=,I3/2X,3HSX=,Fll.3,3X,3HSY=,F11.3,3X,4HTAU=,F11.3/2X,3HSl=,Fll.3,3X,3HS2=,F11.3,3 X,4HCET=,F11.3)

60 CONTINUE

RETURN

END

输入文件为datain

28,36,9,10,4,0

1,0.17,0,1

1,5,2

2,5,6

2,6,3

3,6,7

3,7,4

4,7,8

5,9,6

6,9,10

6,10,7

7,10,11

7,11,8

8,11,12

9,13,10

10,13,14 10,14,11 11,14,15 11,15,12 12,15,16 13,17,14 14,17,18 14,18,15 15,18,19 15,19,16 16,19,20 17,21,18 18,21,22 18,22,19 19,22,23 19,23,20 20,23,24 21,25,22 22,25,26 22,26,23 23,26,27 23,27,24 24,27,28 0,6

1,6

2,6

3,6

0,5

1,5

2,5

3,5

0,4

1,4

2,4

3,4

0,3

1,3

2,3

3,3

0,2

1,2

2,2

3,2

0,1

1,1

2,1

3,1

0,0

1,0

2,0

3,0

7,15,23,31,39,47,49,50,55

0,0

-5E4,2

-10E4,4

-10E4,6

-5E4,8

输出结果为:DATAOUT

NO X Y

1 0.00 6.00

2 1.00 6.00

3 2.00 6.00

4 3.00 6.00

5 0.00 5.00

6 1.00 5.00

7 2.00 5.00

8 3.00 5.00

9 0.00 4.00

10 1.00 4.00

11 2.00 4.00

12 3.00 4.00

13 0.00 3.00

14 1.00 3.00

15 2.00 3.00

16 3.00 3.00

17 0.00 2.00

18 1.00 2.00

19 2.00 2.00

20 3.00 2.00

21 0.00 1.00

22 1.00 1.00

23 2.00 1.00

24 3.00 1.00

25 0.00 0.00

26 1.00 0.00

27 2.00 0.00

28 3.00 0.00

JD= U= V=

1 -29766.873 -1173917.750

2 -14003.185 -1174018.875

3 -3753.270 -1179518.125

4 0.000 -1181719.750

5 -26382.471 -1072681.500

6 -10746.993 -1073615.000

7 -2064.593 -1082360.750

8 0.000 -1085873.250

9 -13536.995 -964010.125

10 3372.794 -970055.125

11 7268.415 -989269.125

12 0.000 -998401.812

13 7816.581 -835383.438

14 27176.234 -861713.938

15 22063.230 -905726.125

16 0.000 -927165.188

17 29514.479 -665602.875

18 53419.637 -747340.438

19 34876.832 -839806.812

20 0.000 -881219.125

21 29580.273 -416288.719

22 52944.918 -632601.125

23 17504.195 -803765.688

24 0.000 -859481.938

25 0.000 0.000

26 -120102.820 -583505.375

27 -76202.375 -787347.188

28 0.000 -829170.812

E= 1

SX= -1489.530 SY=-101489.383 TAU= -1489.531 S1= -1467.348 S2=-101511.562 CET= 179.147 E= 2

SX= -1475.844 SY=-100654.875 TAU= -1790.500 S1= -1443.531 S2=-100687.188 CET= 178.966 E= 3

SX= -7021.670 SY=-101597.672 TAU= -3741.688 S1= -6873.875 S2=-101745.469 CET= 177.738 E= 4

SX= -8067.500 SY= -98528.750 TAU= -4459.156 S1= -7848.227 S2= -98748.023 CET= 177.185 E= 5

SX= -13143.328 SY= -99391.750 TAU= -1662.500 S1= -13111.293 S2= -99423.781 CET= 178.896 E= 6

SX= -14652.781 SY= -98337.500 TAU= -1501.062 S1= -14625.867 S2= -98364.414 CET= 178.973 E= 7

SX= -2923.122 SY=-109168.297 TAU= -5888.469 S1= -2597.762 S2=-109493.656 CET= 176.837 E= 8

SX= -716.078 SY=-103681.562 TAU= -8617.406 S1= 0.148 S2=-104397.789 CET= 175.249 E= 9

SX= -9188.316 SY=-105121.867 TAU= -9771.594 S1= -8203.125 S2=-106107.062 CET= 174.243 E= 10

SX= -12285.000 SY= -95180.250 TAU= -12199.594 S1= -10526.887 S2= -96938.359 CET= 171.799 E= 11

SX= -14170.516 SY= -95500.750 TAU= -5489.531 S1= -13801.664 S2= -95869.602 CET= 176.156 E= 12

SX= -22797.406 SY= -91347.000 TAU= -3902.844 S1= -22575.914 S2= -91568.492 CET= 176.752 E= 13

SX= -5104.269 SY=-129494.438 TAU= -11708.750 S1= -4011.727 S2=-130586.977 CET= 174.669 E= 14

SX= 969.672 SY=-108176.375 TAU= -21424.750 S1= 5024.582 S2=-112231.281 CET= 169.283 E= 15

SX= -14954.572 SY=-110883.469 TAU= -18383.531 S1= -11552.273 S2=-114285.766 CET= 169.515 E= 16

SX= -19890.141 SY= -86924.312 TAU= -25131.188 S1= -11514.844 S2= -95299.609 CET= 161.569 E= 17

SX= -22109.688 SY= -87301.625 TAU= -10225.406 S1= -20543.453 S2= -88867.859 CET= 171.292 E= 18

SX= -35190.453 SY= -77219.000 TAU= -9162.000 S1= -33280.023 S2= -79129.430 CET= 168.222 E= 19

SX= -9785.850 SY=-171444.172 TAU= -20524.969 S1= -7220.594 S2=-174009.422 CET= 172.876 E= 20

SX= 4594.438 SY=-113592.375 TAU= -46145.688 S1= 20477.398 S2=-129475.336 CET= 161.007

E= 21

SX= -25287.307 SY=-118672.312 TAU= -30023.750 S1= -16467.512 S2=-127492.109 CET= 163.629 E= 22

SX= -30634.422 SY= -71127.188 TAU= -44991.469 S1= -1543.715 S2=-100217.891 CET= 147.114 E= 23

SX= -34259.609 SY= -71743.438 TAU= -14637.906 S1= -29220.699 S2= -76782.344 CET= 161.005 E= 24

SX= -43958.047 SY= -53418.938 TAU= -17697.562 S1= -30369.627 S2= -67007.359 CET= 142.482 E= 25

SX= -19028.160 SY=-252549.000 TAU= -34958.688 S1= -13907.055 S2=-257670.094 CET= 171.666 E= 26

SX= 3973.812 SY=-114063.750 TAU= -92238.344 S1= 54459.047 S2=-164548.984 CET= 151.307 E= 27

SX= -39180.809 SY=-121400.055 TAU= -39312.688 S1= -23409.074 S2=-137171.781 CET= 158.140 E= 28

SX= -42804.766 SY= -43317.938 TAU= -65723.062 S1= 22662.211 S2=-108784.914 CET= 135.112 E= 29

SX= -42224.094 SY= -43219.188 TAU= -10273.375 S1= -32436.225 S2= -53007.055 CET= 136.386 E= 30

SX= -21830.422 SY= -25448.312 TAU= -23810.344 S1= 239.594 S2= -47518.328 CET= 137.172 E= 31

SX= -48815.199 SY=-424587.344 TAU= -79800.078 S1= -32570.844 S2=-440831.688 CET= 168.494 E= 32

SX=-132271.750 SY= -71582.000 TAU=-175409.250 S1= 76087.781 S2=-279941.531 CET= 130.093 E= 33

SX= -45090.102 SY= -56761.105 TAU= 804.781 S1= -45034.867 S2= -56816.336 CET= 3.926 E= 34

SX= 42332.711 SY= -9221.938 TAU= -47066.344 S1= 70218.328 S2= -37107.555 CET= 149.354 E= 35

SX= -20899.344 SY= -19971.375 TAU= 16235.219

S1= -4193.512 S2= -36677.207 CET= 45.819 E= 36

SX= 73163.914 SY= -17873.250 TAU= -17873.344 S1= 76547.250 S2= -21256.586 CET= 169.281

FORTRAN 90 程序编程规范

FORTRAN 90 程序编程规范 Fortran 90 编程规范,使程序代码高度组织化,更加易读、易懂、易于维护,程序更加高效。使编出的程序更易懂、易于维护。 1 语言选择 数值预报创新系统软件开发应避免使用Fortran77 的某些过时特征以Fortran 90不一致的特征。选择Fortran 90 作为开发语言,并采用Fortran 90 的新功能,如动态内存的分配(dynamic memory allocation)、递归(recursion ), 模块(modules)、POINTER 、长变量名、自由格式等。 Fortran 77其中某些只是一些冗余的功能,这些功能已经过时,另外,还有一些在Fortran90 中被证明是不好的用法,建议不要使用。 2 Fortran 90 的新特性 2.1.1 建议使用的Fortran 90 新特性 建议使用Fortran 90 提供的模块(module ),并用Use ONLY 指定module 中哪些变量或派生类型定义可用于调用程序。 尽量使用数组下标三元组,这样可优化并减少所需的代码行数。为提高可读性,要在括号内表明数组的维数,例如: 1dArrayA(:) = 1dArrayB(:) + 1dArrayC(:) 2dArray(: , :) = scalar * Another2dArray(: , :) 当访问数组的子集时,例如在有限差分等式中,可以通过使用下标三元组实现。例如:2dArray(: , 2:len2) = scalar *( & Another2dArray(:, 1:len2 -1) & - Another2dArray(:, 2:len2) & ) 对程序单元(program units )命名,并使用End program ,End subroutine ,End interface ,End module 等结构再次指定“program unit ”的名称。 在逻辑表达式中使用>、 >=、 ==、 <、 <=、 /=,它们分别代 替.gt.、.ge.、.eq.、.lt.、.le.、.ne. 。新的表示方法更接近标准的数学符号 在变量定义中始终使用“::”;始终用“DIMENSION ”定义数组形状;始终用(len=)的语法格式声明字符变量的长度。

fortran程序案例题汇编(14道)

1.Fibonacci数列定义如下: F1=1 F2=1 F n=F n-1+F n-2 (n>2) 求Fibonacci数列的前30项。 integer f(30),i f(1)=1 f(2)=2 do i=3,30 f(i)=f(i-1)+f(i-2) enddo print*,f end 2.输入10个学生的总分,求每个学生的名次integer s(10),a(10),i,j do i=1,10 read*,s(i) enddo do i=1,10 a(i)=1 do j=1,10 if(s(i)

3.给定一组数,按照从小到大的顺序输出。integer a(10) integer p do i=1,10 read *,a(i) enddo do j=1,9 p=j do i=j+1,10 if (a(i)

4.输入若干名学生的学号和三门课程(语数英)的成绩,要求从键盘输入一个学生的学号,能打印出该学生的三门功课成绩和总分。 character*6,dimension(:),allocatable::xue integer,dimension(:,:),allocatable::g integer,dimension(:),allocatable::zong integer i,j,n character*6,xh print *,"请输入学生的个数" read *,n allocate(xue(n)) allocate(g(n,3)) allocate(zong(n)) do i=1,n read *,xue(i),(g(i,j),j=1,3) enddo do i=1,n zong(i)=0 do j=1,3 zong(i)=zong(i)+g(i,j) enddo enddo print *,"请输入你要打印的学生的学号" read *,xh do i=1,n if(xue(i)==xh)then print *,(g(i,j),j=1,3),zong(i) exit endif enddo end

fortran程序实例

1)实例3—求多个半径下的圆周长 ! z3.f90 --Fortran95 ! FUNCTIONS: ! z3 - Entry point of console application. !************************************************************************* ! PROGRAM: z3 ! PURPOSE: Entry point for the console application. !************************************************************************ program z3 ! 求多个半径下的圆周长 ! 主程序 ! PROGRAM Z3 PRINT *, 'R=',1.2,'C=',C(1.2) PRINT *, 'R=',3.4,'C=',C(3.4) PRINT *, 'R=',15.6,'C=',C(15.6) PRINT *, 'R=',567.3,'C=',C(567.3) END program z3 !子程序 FUNCTION C(R) PI=3.1415926 C=2*PI*R RETURN ! Body of z3 end

2)实例4—键盘与显示器输入/输出 a)Fortran 基本操作 b)程序指令 ! ZXZ_I_O.f90 ! FUNCTIONS: ! ZXZ_I_O - Entry point of console application. ! PROGRAM: ZXZ_I_O ! PURPOSE: Entry point for the console application. !***************输入、输出样式种种************************** program ZXZ_I_O implicit none !变量声明的位置 INTEGER(2) i; INTEGER(4) j; INTEGER(4) m; REAL n INTEGER A,B ! Variables PRINT*,'输入整数A'; READ*, A PRINT*,'输入整数B'; READ*, B B=A+B PRINT*,'B=A+B=',B WRITE(*,*) 'A*B=',A*B PRINT* ,'以上为计算机的计算结果,注意B的值'

几个fortran程序

计算圆周率 REAL R,R1,R2,PI ISEED=RTC() N0=0 N=300000 DO I=1,N R1=RAN(ISEED) R2=RAN(ISEED) R=SQRT(R1*R1+R2*R2) IF(R<1.0)N0=N0+1 END DO PI=4.0*N0/N WRITE(*,*)PI END 一)蒙特卡洛计算生日问题 假设有N个人在一起,各自的生日为365天之一,根据概率理论,与很多人的直觉相反,只需23个人便有大于50%的几率人群中至少有2个人生日相同。 INTEGER M(1:10000), NUMBER1(0:364), NUMBER2 REAL X,Y ISEED=RTC() DO J=1, 10000 NUMBER1=0 X=RAN(ISEED) NUMBER1(0)=INT(365*X+1) JJJ=1 DO I=1,364 Y=RAN(ISEED) NUMBER2=INT(365*Y+1) ETR=COUNT(NUMBER1.EQ.NUMBER2) IF (ETR= =1) THEN EXIT ELSE JJJ=JJJ+1 M(J)=JJJ NUMBER1(I)=NUMBER2 END IF END DO END DO DO I=1,10000 IF(M(I).LE.23) SUM=SUM+1 END DO PRINT *,SUM/10000 END 二)MONTE CARLO SIMULATION OF ONE DIMENSIONAL DIFFUSION 蒙特卡罗计算一维扩散问题

INTEGER X,XX(1:1000,1:1000) REAL XXM(1:1000) ! X:INSTANTANEOUS POSITION OF ATOM ! XX(J,I):X*X ,J:第几天实验,I:第几步跳跃 ! XXM(I): THE MEAN OF XX WRITE(*,*) "实验天数JMAX,实验次数IMAX" READ(*,*) JMAX,IMAX ISEED=RTC() DO J=1,JMAX !第几天实验 X=0 !!! DO I=1,IMAX !第几步跳跃 RN=RAN(ISEED) IF(RN<0.5)THEN X=X+1 ELSE X=X-1 END IF XX(J,I)=X*X END DO END DO OPEN(1,FILE="C:\DIF1.DAT") DO I=1,IMAX XXM=0.0 XXM(I)=1.0*SUM(XX(1:JMAX,I))/JMAX !! WRITE(1,*) I, XXM(I) END DO CLOSE(1) END 三维的! 三)通过该程序了解FORTRAN语言如何画图(通过像素画图)USE MSFLIB INTEGER XR,YR !在的区域中画一个圆 PARAMETER XR=400,YR=400 INTEGER R, S(1:XR,1:YR) X0=XR/2 ! 圆心位置X0,YO Y0=YR/2 R=MIN(X0-10,Y0-10) !圆半径 S=0 !像素的初始状态(颜色) DO I=1,XR DO J=1,YR IF((I-X0)**2+(J-Y0)**2<=R**2)S(I,J)=10 IER=SETCOLOR(S(I,J)) IER=SETPIXEL(I,J) END DO END DO END

fortran程序30个

程序1 PROGRAM chaper1272 INTEGER :: A(10)=(/5,7,4,8,12,2,10,3,9,11/) INTEGER :: sum=0,ave !打开一数据文件,设置一个有格式直接存取文件,将10个数分2个记录写入文件。 !数据文件生成2个记录,每个记录行长度相同,记录长度为25 OPEN(1,FILE='input21.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=25) WRITE(1,"(5I5)",REC=1)(A(I)+10,I=1,5) !按格式说明将头5个数写入第1个记录 WRITE(1,"(5I5)",REC=2)(A(I)+10,I=6,10)!按格式说明将后5个数写入第2个记录 READ(1,"(5I5)",REC=2)(A(I),I=6,10) !按格式说明从第2个记录中读取后5个数 READ(1,"(5I5)",REC=1)(A(I),I=1,5) !按格式说明从第1个记录中读取头5个数 DO I=1,10 sum=sum+A(I) ENDDO ave=sum/10 !打开一个最大记录长度为22的有格式顺序存取文件

OPEN(2,FILE='input22.dat',FORM='FORMATTED',ACCESS='D IRECT',RECL=22) WRITE(2,"('10个数之和为:',I5)",REC=1) sum !输出1记录行,记录长度为22 WRITE(2,"('10个数平均值为:',I5)",REC=2)ave !输出1记录行,记录长度为22 WRITE(2,"(A)",REC=3) '程序运行正常结束。' !输出一个记录行,记录长度为22 END 程序2 PROGRAM average REAL sum,ave INTEGER n OPEN(1,file='score.dat') PRINT*,'正在统计平均成绩,请等待。' sum=0.0;n=0 DO READ(1,*,END=100) S sum=sum+s n=n+1 ENDDO 100 ave=sum/n

FORTRAN经典入门程序20例

对于FORTRAN的初学者。这些例子可作为小练习。 1.例题:计算工资问题。每小时工资为RATE,如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate else pay=hours*rate END IF print *,"rate=", rate print *, "hours=", hours print *,"pay=",pay end 2.学生成绩问题。大于80为A级。大于60小于80为B级。小于60为C级。IF的嵌套。注意空格可以看清楚else if ,end if,print的内容. PROGRAM GRADESTUDENT READ *,GRADE IF (GRADE .GE. 80) THEN PRINT *,GRADE,"GRADE=>A" ELSE IF (GRADE.LT.60) THEN PRINT*,GRADE,"GRADE=>C" ELSE PRINT*,GRADE,"GRADE=>B" END IF END IF END 3.三个数按从小到大排序。 PROGRAM MAXMIN REAL A,B,C,T READ *,A,B,C IF (A.GT.B) THEN T=A A=B B=T ELSE END IF IF (B.GT.C) THEN T=B B=C

PROGRAM EQUATION READ (*,*) X IF (X .GE. 0.0) Y=3*X+6 IF (X .LT. 0.0) Y=-X**2+2*X-8 PRINT *,"X=",X, "Y=",Y END 6.CONTINUE语句。为了使循环的起止范围清晰,使用终端语句 例:求5! program ex1 FACT=1 do 10, N=1,5,1 ##DO 语句标号,循环不变量=初值,终值,步长FACT=FACT*N 10continue print*,FACT end 求1!+2!+3!+···+N! READ *,N FACT=1

优秀的fortran程序编程规范

Programming Guidelines for PARAMESH Software Development(NOTE: This document is heavily based upon the Introduction This document describes the programming guidelines to be used by software developers wishing to contribute software to the PARAMESH, parallel, adaptive mesh refinement software. We welcome people to contribute software and/or bug fixes to the PARAMESH AMR software. Software to be added to PARAMESH can come in 2 forms: ?Improvements to the basic PARAMESH kernal software found in the mpi_source, source and hearders directories. ?Software the addes additional functionality to PARAMESH. This type of software should be added as separate entities within the utilities directory. Complete applications should not be added as part of PARAMESH. PARAMESH is only meant to be a tool which supports parallel adaptive mesh applications and any software which supports this goal will be considered for acceptance into PARAMESH. For instance, a solver for the poisson equation that works with PARAMESH would be acceptable, but an application that solves the equation of gas dynamics would not. The PARAMESH software is slowly being evolved to be consistent with this document. Any new software which is contributed should follow these guidlines. If not, it will be rejected. This document deals mainly with Fortran 90, since most new PARAMESH software will probably be written in that language. [Throughout this document, the term "Fortran" should be understood to mean Fortran 90.] Since we expect C and C++ also to be used, a separate document dealing with them will be developed in the future. In the meantime, this document can serve as a general guideline for developing code to be used with PARAMESH in those programming languages. The guidlines in this document should be adhered to by ANY software which will be released as part of the PARAMESH package of source code. This includes software 'utilities' (stored in the paramesh/utilities directory) which add functionality to PARAMESH for different algorithms. It also should be applied to any new code developed and added to the main source code for PARAMESH in the paramesh/source, paramesh/mpi_source, or paramesh/headers directories.

平面四边形四节点等参单元Fortran源程序

C ************************************************ C * FINITE ELEMENT PROGRAM * C * FOR Two DIMENSIONAL ELASticity PROBLEM * C * WITH 4 NODE * C ************************************************ PROGRAM ELASTICITY character*32 dat,cch DIMENSION SK(80000),COOR(2,300),AE(4,11),MEL(5,200), & WG(4),JR(2,300),MA(600),R(600),iew(30),STRE(3,200) COMMON /CMN1/ NP,NE,NM,NR COMMON /CMN2/ N,MX,NH COMMON /CMN3/ RF(8),SKE(8,8),NN(8) WRITE(*,*)'PLEASE ENTER INPUT FILE NAME' READ(*,'(A)')DAT OPEN(4,FILE=dat,STATUS='OLD') OPEN(7,FILE='OUT',STATUS='UNKNOWN') READ(4,*)NP,NE,NM,NR WRITE(7,'(A,I6)')'NUMBER OF NODE---------------------NP=',np WRITE(7,'(A,I6)')'NUMBER OF ELEMENT------------------NE=',ne WRITE(7,'(A,I6)')'NUMBER OF MATERIAL-----------------NM=',nm WRITE(7,'(A,I6)')'NUMBER OF surporting---------------NC=',Nr CALL INPUT (JR,COOR,AE,MEL)

Fortran95程序设计课后习题答案(word版方便)

第四章 1.program main implicit none write(*,*) "Have a good time." write(*,*) "That's not bad." write(*,*) '"Mary" isn''t my name.' end program 2.program main real, parameter :: PI=3 implicit none.14159 real radius write(*,*) "请输入半径长" read(*,*) radius write(*,"(' 面积='f8. 3)") radius*radius*PI end program 3.program main implicit none real grades write(*,*) "请输入成绩" read(*,*) grades write(*,"(' 调整后成绩为'f8.3)") SQRT(grades)*10.0 end program 4.integer a,b real ra,rb a=2 b=3 ra=2.0 rb=3.0 write(*,*) b/a ! 输出1, 因为使用整数计算, 小数部分会无条件舍去write(*,*) rb/ra ! 输出1.5 5.p rogram main implicit none type distance real meter, inch, cm end type type(distance) :: d write(*,*) "请输入长度:" read(*,*) d%meter d%cm = d%meter*100 d%inch = d%cm/2.54 write(*,"(f8.3'米='f8.3'厘米='f8.3'英寸')") d%meter, d%cm, d%inch end program 第五章 1.program main implicit none integer money real tax write(*,*) "请输入月收入" read(*,*) money if ( money<1000 ) then tax = 0.03 else if ( money<5000) then tax = 0.1 else tax = 0.15 end if write(*,"(' 税金为'I8)") nint(money*tax) end program 2.program main implicit none integer day character(len=20) :: tv write(*,*) "请输入星期几" read(*,*) day select case(day) case(1,4) tv = "新闻" case(2,5) tv = "电视剧" case(3,6) tv = "卡通" case(7) tv = "电影" case default write(*,*) "错误的输入" stop end select write(*,*) tv end program 3.program main implicit none integer age, money real tax write(*,*) "请输入年龄" read(*,*) age write(*,*) "请输入月收入" read(*,*) money if ( age<50 ) then if ( money<1000 ) then tax = 0.03 else if ( money<5000 )then tax = 0.10 else tax = 0.15 end if else if ( money<1000 ) then tax = 0.5 else if ( money<5000 )then tax = 0.7 else tax = 0.10 end if end if write(*,"(' 税金为'I8)") nint(money*tax) end program 4.program main implicit none integer year, days logical mod_4, mod_100, mod_400 write(*,*) "请输入年份" read(*,*) year mod_4 = ( MOD(year,4) == 0 ) mod_100 = ( MOD(year,100) == 0 ) mod_400 = ( MOD(year,400) == 0 ) if ( (mod_4 .NEQV. mod_100) .or. mod_400 ) then days = 366 else days = 365 end if write(*,"('这一年有'I3'天')") days stop end program 第六章 1.program main implicit none integer i do i=1,5 write(*,*) "Fortran" end do stop end program 2.program main implicit none integer i,sum sum = 0 do i=1,99,2 sum = sum+i end do write(*,*) sum stop end program 3.program main implicit none integer, parameter :: answer = 45 integer, parameter :: max = 5 integer weight, i do i=1,max write(*,*) "请输入体重" read(*,*) weight if ( weight==answer ) exit end do if ( i<=max ) then write(*,*) "猜对了" else write(*,*) "猜错了" end if stop end program 4.program main implicit none integer, parameter :: max=10 integer i real item real ans ans = 1.0 item = 1.0 do i=2,max item = item/real(i) ans = ans+item

FORTRAN经典入门程序20例

a t i m e a n d A l t g s i n b e i n s o 对于FORTRAN 的初学者。这些例子可作为小练习。 1.例题:计算工资问题。每小时工资为RATE,如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate else pay=hours*rate END IF print *,"rate=", rate print *, "hours=", hours print *,"pay=",pay end 2.学生成绩问题。大于80为A 级。大于60小于80为B 级。小于60为C 级。 IF 的嵌套。注意空格可以 看清楚else if ,end if,print 的内容. PROGRAM GRADESTUDENT READ *,GRADE IF (GRADE .GE. 80) THEN PRINT *,GRADE,"GRADE=>A" ELSE IF (GRADE.LT.60) THEN PRINT *,GRADE,"GRADE=>C" ELSE PRINT *,GRADE,"GRADE=>B" END IF END IF END 3.三个数按从小到大排序。PROGRAM MAXMIN REAL A,B,C,T READ *,A,B,C IF (A.GT.B) THEN T=A A=B B=T ELSE END IF IF (B.GT.C) THEN T=B B=C

(完整word版)FORTRAN经典入门程序20例

对于FORTRA的初学者。这些例子可作为小练习 1.例题:计算工资问题。每小时工资为RATE如果工作超过40小时,加班呢部分工资是正常时间工资的 1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate else pay=hours*rate END IF print *, "rate=" , rate print *, "hours=" , hours print *, "pay=" ,pay end 2?学生成绩问题。大于80为A级。大于60小于80为B级。小于60为C级。IF的嵌套。注意空格可以看清楚else if ,e nd if,pri nt 的内容? PROGRAGRADESTUDENT REA0GRADE IF (GRADE .GE. 80) THEN PRINT*,GRADE, "GRADE=>A" ELSE IF (GRADELT.60) THEN PRINT*,GRADE"GRADE=>C" ELSE PRINT*,GRADE"GRADE=>B" END IF END IF END 3. 三个数按从小到大排序。 PROGRA M AXMIN REALA,B,C,T REA0A,B,C IF (A.GT.B) THEN T=A A=B B=T ELSE END IF IF (B.GT.C) THEN T=B B=C C=T

ELSE END IF IF (A.GT.B) THEN T=A A=B B=T END IF PRINT*,A,B,C END 4. 运用EISE IF语句。重做例子2 PROGRAM2 READ*,*) GRADE IF (GRADE .GE. 80.0) THEN PRINT*, GRADE, "=>A" ELSE IF(GRADE .GE. 70.0) THEN PRINT*, GRADE, "=>B" ELSE IF(GARDE .GE. 60.0) THEN PRINT*, GRADE, "=>C" ELSE PRINT*, GARDE, "=>D" END IF END 3x 6,x 0 5. 计算y 2 x 2x 8,x 0 PROGRAEQUATION READ*,*) X IF (X .GE. 0.0) Y=3*X+6 IF (X .LT. 0.0) Y=-X**2+2*X-8 PRINT*, "X=" ,X, "Y=" ,Y END 6. CONTINUED句。为了使循环的起止范围清晰,使用终端语句 例:求5! program ex1 FACT=1 do 10, N=1,5,1 ##DO语句标号,循环不变量=初值,终值,步长FACT=FACT*N 10 con ti nue print *,FACT end 求1! +2! +3! + ??? +N! READ,N FACT=1 sum=0.0 do 10, l=1,N,1

用fortran语言开发的windows程序框架

!*********************************************************************** !****************(第一部分)有用的数据、子程序模块、函数模块************* !*********************************************************************** Module VarGlob integer(4) :: results !存储函数的返回值 logical*4 :: logicalt !存储函数的返回值 End Module VarGlob !*********************************************************************** !****************************(第二部分)程序入口************************* !*********************************************************************** integer function WinMain( hInstance, hPrevInstance, lpszCmdLine, nCmdShow ) !DEC$ IF DEFINED(_X86_) !DEC$ ATTRIBUTES STDCALL, ALIAS : '_WinMain@16' :: WinMain !DEC$ ELSE !DEC$ ATTRIBUTES STDCALL, ALIAS : 'WinMain' :: WinMain !DEC$ ENDIF use IFwin !包含有用的模块 use VarGlob !有用的数据模块 Implicit None integer hInstance !定义窗口的实例 integer hPrevInstance !定义句柄 integer nCmdShow !窗口的显示方式 integer lpszCmdLine !指向字符串的指针 !●●●●●●●●●●定义函数接口●●●●●●●●●● !定义函数接口,注意这一段是必须的 interface integer*4 function MainWndProc ( hwnd, message, wParam, lParam ) !DEC$ IF DEFINED(_X86_) !DEC$ ATTRIBUTES STDCALL, ALIAS : '_MainWndProc@16' :: MainWndProc !DEC$ ELSE !DEC$ ATTRIBUTES STDCALL, ALIAS : 'MainWndProc' :: MainWndProc !DEC$ ENDIF integer(4) :: hwnd integer(4) :: message integer(4) :: wParam integer(4) :: lParam end function end interface !●●●●●●●●●●定义函数接口●●●●●●●●●● type (T_WNDCLASS) :: wc !窗口类结构体 type (T_MSG) :: msg !消息结构体 integer(4) :: hWnd character*100 lpszClassName,lpszAppName lpszClassName = "Generic"C !窗口类名 lpszAppName = "FORTRAN+IVF10.0开发的windows程序框架"C !窗口标题 if(hPrevInstance .eq. 0) then

FORTRAN经典入门程序20例

对于FORTRAN 的初学者。这些例子可作为小练习。 1.例题:计算工资问题。每小时工资为RATE, 如果工作超过40小时,加班呢部分工资是正常时间工资的1.5倍。 C Payroll with overtime program payroll real rate, hours, pay read (*,*) rate, hours if (hours>40) then pay=40*rate+(hours-40)*1.5*rate print *, "pay=" ,pay end 2.学生成绩问题。大于80为A级。大于60小于80为B级。小于60为C级。IF的嵌套。注意空格可以看清楚else if ,end if,print 的内容. PROGRAM GRADESTUDENT READ *,GRADE IF (GRADE .GE. 80) THEN PRINT *,GRADE, "GRADE=>A" ELSE IF (GRADE.LT.60) THEN PRINT *,GRADE, "GRADE=>C" ELSE PRINT *,GRADE, "GRADE=>B" END IF END IF END 3.三个数按从小到大排序。 PROGRAM MAXMIN REAL A,B,C,T READ *,A,B,C IF (A.GT.B) THEN END IF IF (B.GT.C) THEN T=B B=C

PRINT *,A,B,C END 4.运用EISE IF 语句。重做例子2 PROGRAM ex2 READ (*,*) GRADE IF (GRADE .GE. 80.0) THEN PRINT *, GRADE, "=>A" ELSE IF(GRADE .GE. 70.0) THEN PRINT *, GRADE, "=>B" ELSE IF(GARDE .GE. 60.0) THEN PRINT *, GRADE, "=>C" ELSE PRINT *, GARDE, "=>D" END IF END 5. 计算y 3x26,x 0 x2 2x 8,x 0 END 6.CONTINUE 语句。为了使循环的起止范围清晰,使用终端语句例:求5!program ex1 FACT=1 do 10, N=1,5,1 ##DO 语句标号,循环不变量=初值,终值,步长FACT=FACT*N 10 continue print*,FACT end 求1!+2!+3!+···+N! READ *,N FACT=1

Fortran经典编程语言笔记(你值得拥有)

FORTRAN笔记 2014.10.07 目录 第七讲_FORTRAN的基本知识.ppt (2) FORTRAN语言程序设计初步 (2) FORTRAN源程序的书写格式(以77为例) (2) 变量 (2) 变量类型 (2) 算术运算符和运算优先级 (3) 赋值语句 (3) 参数语句(PARAMETER语句) (4) END语句 (4) PAUSE语句 (4) 逻辑运算和选择结构 (4) 关系表达式 (4) FORTRAN中数组的定义及使用 (4) 其他 (5) 1. fortran语言定义CHARACTER*6 TTL(14,3),CNAM(400)是什么意思? (5) 2. fortran里character*10 是什么意思 (6) 3. Fortran中kind是什么函数? (6)

第七讲_FORTRAN的基本知识.ppt FORTRAN语言程序设计初步 FORTRAN是Formula Translation的缩写,意为“公式翻译”,它是为科学、工程问题或企事业管理中的那些能够用数学公式表达的问题而设计的,其数值计算的功能较强。 常用的是FORTRAN77和FORTRAN90两种标准。 1、一个程序由若干个程序单位组成。主程序和每一个子程序分别是一个独立的程序单位。 2、每一个程序单位都是以“END”结束的。 3、一个程序单位包括若干行。 1)语句行。由一个FORTRAN语句组成。 2)非语句行,即注释行。 4、FORTRAN程序中的语句可以没有标号,也可以有标号,根据需要而定。标号的作用是标志一个语句以便被其他语句引用。 5、一个程序单位中各类语句的位置是有一定规定的。 6、FORTRAN源程序必须按一定的格式书写。 FORTRAN源程序的书写格式(以77为例) 每一行有80列,分别如下: 1、第1-5列为标号区。一行中第一列为“C”或“*”,该行即被认为是注释行。 2、第6列为“续行标志区”,如果在一行的第6列上写一个非空格和非零的字符,则该行作为其上一行的续行。 3、第7-72列为语句区。 4、第73-80列,注释区。 变量 变量名:一个变量需要用一个名字(变量名)来识别。在同一个程序单位中不能用同一个变量名代表两个不同的变量。 FORTRAN的变量名按以下规则选定: 1)第一个字符必须是字母,即变量名必须以字母开头; 2)在一个字母后面可以跟1-5为数字或字母。 如果选定的变量名超过6个字符,则只有前面6个字符有效。 注:在变量名中大写与小写字母是等价的。 变量类型 整型变量Integer、实型变量Real、双精度变量Double Precision、复型变量Complex、逻辑型变量Logical和字符型变量Character。 1、隐含约定(I-N规则) FORTRAN规定:在程序中的变量名,凡以字母I,J,K,L,M,N六个字母开头的,即认为该变量为整型变量。

相关主题
文本预览
相关文档 最新文档