1 program cmge
2 include 'mpif.h'
3 include 'type'
4 integer ktype(NDIM)
5 real*8 x(NDIM),y(NDIM),value(NDIM)
6 real*8 wx(NDIM),wy(NDIM)
7 real*8 uk(NDIM),vk(NDIM),dfi(NDIM)
8 real*8 ax(NDIM),ay(NDIM),afi(NDIM)
9 real*8 EP0,EP,EK0,EK,E10,E1,EF0,EF,SQ0,SQ,DelE1a,DelE1o
10 real*8 fr,x0,t,dt,tmin,tmax
11 CHARACTER cGfile*11,dGfile*11,eGfile*11,fGfile*16
12 1111 format(4f12.6)
13 1112 format(1000(f10.6,1x))
14 1113 format(a12,7f10.5)
15 1114 format(I5,3X,e12.5,3X,e12.5,3X,e12.5,3X,e12.5,3X,
16 * e12.5,3X,e12.5)
17 1115 format(i5,f14.8,f14.8)
18 call MPI_Init(ierr)
19 comm=MPI_COMM_WORLD
20 call MPI_Comm_rank(comm,my_id,ierr)
21 call MPI_Comm_size(comm,np,ierr)
22 t_all=MPI_Wtime()
23 OPEN(1,FILE='new.dat')
24 call input(nnod,nn,nr,nl,x,y,ktype,value,
25 * fr,tmin,tmax)
26 close(1)
27 if (my_id.eq.0) then
28 cGFile(1:4)='cmge'
29 dGFile(1:4)='mest'
30 eGFile(1:4)='time'
31 write(cGFile(5:8),'(I4.4)') nnod
32 write(cGFile(9:10),'(I2.2)') np
33 write(dGFile(5:8),'(I4.4)') nnod
34 write(dGFile(9:10),'(I2.2)') np
35 write(eGFile(5:8),'(I4.4)') nnod
36 write(eGFile(9:10),'(I2.2)') np
37 call output(nnod,cGfile)
38 end if
39 i_shag=int(nnod/np)
40 i_step=i_shag*my_id
41 if (i_shag*np.lt.nnod) then
42 i_shag=i_shag+1
43 i_step=i_shag*my_id
44 end if
45 if (my_id.eq.np-1) then
46 i_shag= nnod-i_step
47 end if
48 dt=tmin
49 X0=-5.d0
50 kt=0
51 CALL Solit(nnod,nn,nr,nl,x,y,ktype,value,X0)
52 CALL Redefine_CoordY(X(Nn),Y(Nn),0.99d0,Nr-Nn+1,1)
53 CALL Redefine_CoordY(X(Nl),Y(Nl),0.99d0,nnod-Nl+1,-1)
54 Iter=1
55 T=0.d0
56 556 continue
57 t_begin=MPI_Wtime()
58 if (my_id.eq.0) then
59 write(*,1115) Iter,T,dt
60 end if
61 t_metod=MPI_Wtime()
62 call metod(nnod,x,y,value,ktype)
63 t_metod=MPI_Wtime()-t_metod
64 t_iter=MPI_Wtime()
65 CALL iteration(Nnod,dGfile)
66 t_iter=MPI_Wtime()-t_iter
67 do i=1,nnod
68 if (ktype(i).eq.0) then
69 wx(i)=value(i)
70 wy(i)=c(i)
71 else
72 wy(i)=value(i)
73 wx(i)=c(i)
74 end if
75 end do
76 CALL VELOXY(nnod,nn,nr,nl,x,y,wx,wy,uk,vk,dfi,
77 * dt,tmin,tmax)
78 Call Ener(nnod,nn,nr,nl,x,y,wx,wy,dfi,EP,EK,E1,SQ)
79 IF(T.Eq.0.D0) Then
80 EP0=EP
81 EK0=EK
82 E10=E1
83 EF0=EF
84 SQ0=SQ
85 EndIf
86 DelE1a=E10-E1
87 DelE1o=(E10-E1)*100/E10
88 if (my_id.eq.0) then
89 fGFile(1:4)='ener'
90 write(fGFile(5:8),'(I4.4)') nnod
91 write(fGFile(9:10),'(I2.2)') np
92 open(UNIT=3,FILE=fGfile(1:10)//'.rez',
93 * ACCESS='APPEND')
94 WRITE(3,1114)ITer,T,EP,EK,E1,DelE1a,DelE1o
95 close(3)
96 end if
97 DO I=NR+1,NL-1
98 KTYPE(I)=0
99 VALUE(I)=wx(I)+(0.5*(UK(I)**2+VK(I)**2)-
100 * Y(I)/(Fr**2))*dt
101 X(I)=X(i)+UK(I)*dt
102 Y(i)=Y(I)+VK(I)*dt
103 EndDo
104 t=t+dt
105 if (my_id.eq.0) then
106 OPEN(2,FILE=cGfile(1:10)//'.rez',ACCESS='APPEND')
107 DO I=1,Nnod
108 WRITE(2,1111) X(I),Y(I),wx(i),wy(i)
109 end do
110 write(2,1113) '[ITERATION]',t,dt,EP,EK,E1,
111 * DelE1a,DelE1o
112 close(2)
113 end if
114 Iter=Iter+1
115 t_end=MPI_Wtime()-t_begin
116 if (my_id.eq.0) then
117 write(*,*) 'time=',iter,t_end,t_iter,t_metod
118 OPEN(4,FILE=eGfile(1:10)//'.rez',ACCESS='APPEND')
119 write(4,*) iter,t_end,t_iter,t_metod
120 close(4)
121 end if
122 if (t.ge.20.d0) goto 2200
123 goto 556
124 2200 Continue
125 call MPI_Finalize(ierr)
126 STOP
127 end
Рис. 66. Листинг управляющего блока фортран-программы для реализации алгоритма решения нестационарной задачи