1 program cmge
2 include 'mpif.h'
3 include 'type'
4 integer ktype(NDIM)
5 real*8 x(NDIM),y(NDIM),value(NDIM),pi,angle1,angle2
6 real*8 angle,wx(NDIM),wy(NDIM),yk(NDIM)
7 real*8 yc,xl,xr,yl,yr,fr,eps
8 real*8 dd,dd1,qi,qii
9 complex*16 z(NDIM),iq,tmp,tmp2,v1,v2
10 complex*16 v_a(NDIM)
11 INTEGER*2 irow,dummy,ixl,ixr,iyl,iyr
12 CHARACTER cGfile*11,dGfile*11,eGfile*11,
13 * fGfile*16,tGfile*11
14 call MPI_Init(ierr)
15 comm=MPI_COMM_WORLD
16 call MPI_Comm_rank(comm,my_id,ierr)
17 call MPI_Comm_size(comm,np,ierr)
18 t_all=MPI_Wtime()
19 OPEN(1,FILE='new.dat')
20 call input(nnod,nn,nr,nl,x,y,ktype,value,fr,eps)
21 close(1)
22 call MPI_Barrier(comm,ierr)
23 if (my_id.eq.0) then
24 fGFile(1:4)='cmge'
25 dGFile(1:4)='mest'
26 eGFile(1:4)='time'
27 write(cGFile(5:8),'(I4.4)') nnod
28 write(cGFile(9:10),'(I2.2)') np
29 write(dGFile(5:8),'(I4.4)') nnod
30 write(dGFile(9:10),'(I2.2)') np
31 write(eGFile(5:8),'(I4.4)') nnod
32 write(eGFile(9:10),'(I2.2)') np
33 end if
34 i_shag=int(nnod/np)
35 i_step=i_shag*my_id
36 if (i_shag*np.lt.nnod) then
37 i_shag=i_shag+1
38 i_step=i_shag*my_id
39 end if
40 if (my_id.eq.np-1) then
41 i_shag= nnod-i_step
42 end if
43 lxnul=nr+(nl-nr)/2
44 CALL Redefine_Coord(X(nr),Y(nr),0.99d0,Lxnul-nr+1,1)
45 CALL Redefine_Coord(X(lxnul),Y(lxnul),
46 * 0.99d0,nl-Lxnul+1,-1)
47 Iter=1
48 step=0.01
49 it=1
50 1000 continue
51 t_begin=MPI_Wtime()
52 If(It.Eq.2) Then
53 Fr1=Fr
54 Fr=Fr-step
55 fGFile(1:1)='V'
56 write(fGFile(2:5),'(I4.4)') nnod
57 write(fGFile(5:8),'(I4.4)') NINT(Fr1*10000)
58 Iter=1
59 OPEN(5,file=fGfile(1:8)//'.rez')
60 DO I = 1,Nnod
61 READ(5,*) k,X(I),Y(I),Ktype(I),Value(I)
62 ENDDO
63 CLOSE(5)
64 End If
65 556 continue
66 YC=Y(lxnul)
67 yh=1.d0
68 DO I=nl,Nr+2,-1
69 QI=DSQRT(1.d0-(1.d0-Fr*Fr)*(Y(I)-YH)/(YC-YH))
70 QII=DSQRT(1.d0-(1.d0-Fr*Fr)*(Y(I-1)-YH)/(YC-YH))
71 SI =DSQRT((X(I)-X(I-1))**2.d0+(Y(I)-Y(I-1))**2.d0)
72 value(I-1)=value(I)+(QI+QII)*SI/2.d0
73 EndDo
74 104 Format(1x,I4,2(2x,E15.9),2x,I2,2x,2E15.9)
75 1232 format(2f10.5,i2,f10.5)
76 1112 format(1000(f10.6,1x))
77 2222 format(e20.10)
78 t_metod=MPI_Wtime()
79 call metod(nnod,x,y,value,ktype)
80 t_metod=MPI_Wtime()-t_metod
81 t_iter=MPI_Wtime()
82 CALL iteration(Nnod,dGfile)
83 t_iter=MPI_Wtime()-t_iter
84 do i=1,nnod
85 if (ktype(i).eq.0) then
86 wx(i)=value(i)
87 wy(i)=c(i)
88 else
89 wy(i)=value(i)
90 wx(i)=c(i)
91 end if
92 end do
93 DO I= Nr+1,Nl-1
94 y(i)=y(i)-(wy(i)-1.d0)
95 end do
96 Iter=Iter+1
97 SMAX=0.d0
98 DO I=Nr+1,Nl-1
99 IF(SMAX.LE.DABS(wY(I)-1.d0)) SMAX=DABS(wY(I)-1.d0)
100 end do
101 t_end=MPI_Wtime()-t_begin
102 if (my_id.eq.0) then
103 write(*,*) iter,eps,smax,y(lxnul),Fr
104 OPEN(4,FILE=eGfile(1:10)//'.rez',ACCESS='APPEND')
105 write(4,*) iter,t_end,t_iter,t_metod
106 close(4)
107 end if
108 if(smax.le.eps) goto 1111
109 goto 556
110 t_all=MPI_Wtime()-t_all
111 if (my_id.eq.0) then
112 OPEN(4,FILE=eGfile(1:10)//'.rez',ACCESS='APPEND')
113 write(4,*) iter,t_all
114 close(4)
115 end if
116 1111 Frud=Dsqrt(2.*(Yc-1.)/(1.-Fr*Fr))
117 if (my_id.eq.0) then
118 tGFile(1:1)='V'
119 write(tGFile(2:5),'(I4.4)') nnod
120 write(tGFile(5:8),'(I4.4)') NINT(Fr*10000)
121 OPEN(15,file=tGfile(1:8)//'.rez')
122 It=2
123 Fr1=Fr
124 DO I = 1,Nnod
125 Write(15,104) I,X(I),Y(I),Ktype(I),Value(I)
126 ENDDO
127 ah=y(lxnul)-1.d0
128 Write(15,*) 'Амплитуда=',Ah
129 Write(15,*) Iter-1
130 Write(15,*) 'ПАРАМЕТР V=',Fr,'ЧИСЛО ФрудА FR=',
131 * Frud
132 write(15,*) Frud,ah
133 WRITE(15,*) 'максимальное отклонение=',Smax
134 CLOSE(15)
135 OPEN(2,FILE='cmge.rez',ACCESS='APPEND')
136 write(2,*) fr,frud,ah,iter
137 close(2)
138 end if
139 It=2
140 t_end_all=MPI_Wtime()-t_all
141 if (my_id.eq.0) then
142 OPEN(7,FILE='time_all.rez',ACCESS='APPEND')
143 write(7,*) 'P: ',np,' N: ',nnod,' F: ',
144 * fr,' T: ',t_end_all
145 close(7)
146 end if
147 IF(FR.GT.0.00001) goto 1000
148 call MPI_Finalize(ierr)
149 STOP
150 end
Рис. 65. Листинг управляющего блока фортран-программы для реализации алгоритма решения стационарной задачи