Bonjour,
Je fais appel au package mumps dans un programme principal. Le code est bon, il affiche les bons résultats.
Le code est:Par contre, quand j'essaye de faire appel à ce package dans une subroutine, il plante (erreur: ERROR RETURN: mumps_par%INFOG(1)= -2 mumps_par%INFOG(2)= 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169 PROGRAM MUMPS_TEST implicit none INCLUDE 'mpif.h' INCLUDE 'dmumps_struc.h' TYPE (DMUMPS_STRUC) mumps_par INTEGER IERR, II,k,l,i,j,nblignes,jj,MZ,Nb,NbZ double precision Q(1:5,1:5) double precision BB(1:5), param(1:43) double precision :: valeur open (unit = 60,file = 'entrees.txt', status='unknown') ! fichier des input qui doit contenir :N,NZ, les éléments de la matrice A et du vecteur B open (unit = 61,file = 'param.txt', status='unknown') !remplissage du fichier entrees.txt Nb=5 NbZ=12 do k=1,Nb do l=1,Nb Q(k,l)=0 enddo enddo !2) remplissage des éléments diagonaux Q(1,2)= 3.0 Q(2,3)=-3.0 Q(4,3)= 2.0 Q(5,5)= 1.0 Q(2,1)= 3.0 Q(1,1)= 2.0 Q(5,2)= 4.0 Q(3,4)= 2.0 Q(2,5)= 6.0 Q(3,2)= -1.0 Q(1,3)= 4.0 Q(3,3)= 1.0 !vecteur B (2 ème membre du système linéaire) tel que Ax=B BB(1)=20.0 BB(2)=24.0 BB(3)=9.0 BB(4)=6.0 BB(5)=13.0 !AFFICHAGE write(60,'(I1)') Nb !affichage du rang de Q write(60,'(I2)') NbZ !affichage du nbre des nonzéro de A sur 4 longueurs pour éviter les espaces en début de ligne du fichier input_1_iter (même si cet estpace n'est pas gênant) ! affichage de Q do k=1,5 !je parcous A jusqu'à la ligne MN do l=1,5 !je parcours toutes les colonnes if (Q(k,l)/=0) then write(60,100) k,l,Q(k,l) 100 FORMAT(I1,/,I1,/,f4.1) !format réel réparti sur 12 longueurs avec 10 chiffres après la virgule end if end do end do !affichage du vecteur B do i=1,5 write(60,105)BB(i) 105 FORMAT(f4.1) end do close(60) ! lecture du fichier entrees.txt et attribution de ses valeurs au tableau param open (60,file='entrees.txt',action='read') ! on ouvre le fichier (,status='old') nblignes=43 !nblignes=2+(NZ*3)+(dimension du vecteur B)=2+(12*3)+5=43 do jj=1,nblignes ! on lit une ligne du fichier read(60,*) valeur ! on stocke la donnee lue dans la case correspondante du tableau param(jj)=valeur write (61, *) param(jj) end do close(60) !!!Début mumps CALL MPI_INIT(IERR) !do k=1,5 !boucle dans le temps !les composantes: COMM, SYM et PAR doivent être définis par l'utilisateur avant a call with JOB=-1 ! Define a communicator for the package. mumps_par%COMM = MPI_COMM_WORLD !mis avant l'initialisation (JOB=-1) ! Initialize an instance of the package ! for L U factorization (sym = 0, with working host) mumps_par%JOB = -1 !initialise l'exemple par des valeurs par défaults (comme ICNTL) avant tout call mumps mumps_par%SYM = 0! matrice asymétrique mumps_par%PAR = 1 !PAR=1 obligatoire dans la version séquentielle CALL DMUMPS(mumps_par) !open (unit = 17,file = 'input_simpletest_real') IF (mumps_par%INFOG(1).LT.0) THEN !informations de tous les processeurs WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: "," mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF ! Define problem on the host (processor 0) IF ( mumps_par%MYID .eq. 0 ) THEN !définir une matrice centralized assembled avant la factorisation (Job=2) et l'analyse (job=1) mumps_par%N=Nb mumps_par%NZ=NbZ ALLOCATE( mumps_par%IRN ( NbZ ) ) ALLOCATE( mumps_par%JCN ( NbZ ) ) ALLOCATE( mumps_par%A( NbZ ) ) ALLOCATE( mumps_par%RHS ( Nb ) ) j=1 DO II = 1, NbZ mumps_par%IRN(II)=param(j+2) mumps_par%JCN(II)=param(j+3) mumps_par%A(II) =param(j+4) j=j+3 end do MZ=(NbZ*3)+2 DO II = 1, Nb mumps_par%RHS(II)=param(II+MZ) END DO END IF ! Call package for solution mumps_par%JOB = 6!combines the actions of calls with JOB=1 (analyse), JOB=2(factorisation), and JOB=3(solution) CALL DMUMPS(mumps_par) IF (mumps_par%INFOG(1).LT.0) THEN WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF ! Solution has been assembled on the host IF ( mumps_par%MYID .eq. 0 ) THEN WRITE(6, * ) ' Solution is ',(mumps_par%RHS(II),II=1,Nb) !afficher à l'écran la solution END IF ! Deallocate user data IF ( mumps_par%MYID .eq. 0 )THEN DEALLOCATE( mumps_par%IRN )! can be deallocated after analysis DEALLOCATE( mumps_par%JCN )! can be deallocated after analysis DEALLOCATE( mumps_par%A ) DEALLOCATE( mumps_par%RHS ) END IF ! Destroy the instance (deallocate internal data structures) mumps_par%JOB = -2 !termine l'exemple: toutes les data de la structure sont déallocated (sauf pour celles mises par l'utilsateur): on le mets au dernier appel de Dmumps CALL DMUMPS(mumps_par) IF (mumps_par%INFOG(1).LT.0) THEN WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF !end do !fin boucle temps 500 CALL MPI_FINALIZE(IERR) STOP close (61) END
: çàd qu'il n'arrive pas à lire Nb et NbZ.
le code est le suivant:des idées de solution?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176 PROGRAM MUMPS_TEST implicit none INTEGER Nb,NbZ,k,l,i ,nblignes,jj double precision Q(1:5,1:5) double precision BB(1:5), param(1:43) double precision :: valeur open (unit = 60,file = 'entrees.txt', status='unknown') ! fichier des input qui doit contenir :N,NZ, les éléments de la matrice A et du vecteur B open (unit = 61,file = 'param.txt', status='unknown') !remplissage du fichier entrees.txt Nb=5 NbZ=12 do k=1,Nb do l=1,Nb Q(k,l)=0 enddo enddo !2) remplissage des éléments diagonaux Q(1,2)= 3.0 Q(2,3)=-3.0 Q(4,3)= 2.0 Q(5,5)= 1.0 Q(2,1)= 3.0 Q(1,1)= 2.0 Q(5,2)= 4.0 Q(3,4)= 2.0 Q(2,5)= 6.0 Q(3,2)= -1.0 Q(1,3)= 4.0 Q(3,3)= 1.0 !vecteur B (2 ème membre du système linéaire) tel que Ax=B BB(1)=20.0 BB(2)=24.0 BB(3)=9.0 BB(4)=6.0 BB(5)=13.0 !AFFICHAGE write(60,'(I1)') Nb !affichage du rang de Q write(60,'(I2)') NbZ !affichage du nbre des nonzéro de A sur 4 longueurs pour éviter les espaces en début de ligne du fichier input_1_iter (même si cet estpace n'est pas gênant) ! affichage de Q do k=1,5 !je parcous A jusqu'à la ligne MN do l=1,5 !je parcours toutes les colonnes if (Q(k,l)/=0) then write(60,100) k,l,Q(k,l) 100 FORMAT(I1,/,I1,/,f4.1) !format réel réparti sur 12 longueurs avec 10 chiffres après la virgule end if end do end do !affichage du vecteur B do i=1,5 write(60,105)BB(i) 105 FORMAT(f4.1) end do close(60) ! lecture du fichier entrees.txt et attribution de ses valeurs au tableau param open (60,file='entrees.txt',action='read') ! on ouvre le fichier (,status='old') nblignes=43 !nblignes=2+(NZ*3)+(dimension du vecteur B)=2+(12*3)+5=43 do jj=1,nblignes ! on lit une ligne du fichier read(60,*) valeur ! on stocke la donnee lue dans la case correspondante du tableau param(jj)=valeur write (61, *) param(jj) end do close(60) !!!Début mumps call submump !close (61) end program MUMPS_TEST subroutine submump implicit none INCLUDE 'mpif.h' INCLUDE 'dmumps_struc.h' TYPE (DMUMPS_STRUC) mumps_par integer IERR, II, Nb, NbZ,j,MZ double precision param(1:43) CALL MPI_INIT(IERR) !do k=1,5 !boucle dans le temps !les composantes: COMM, SYM et PAR doivent être déf depuis que vous avez commencé etinis par l'utilisateur avant a call with JOB=-1 ! Define a communicator for the package. mumps_par%COMM = MPI_COMM_WORLD !mis avant l'initialisation (JOB=-1) ! Initialize an instance of the package ! for L U factorization (sym = 0, with working host) mumps_par%JOB = -1 !initialise l'exemple par des valeurs par défaults (comme ICNTL) avant tout call mumps mumps_par%SYM = 0! matrice asymétrique mumps_par%PAR = 1 !PAR=1 obligatoire dans la version séquentielle CALL DMUMPS(mumps_par) !open (unit = 17,file = 'input_simpletest_real') IF (mumps_par%INFOG(1).LT.0) THEN !informations de tous les processeurs WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: "," mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF ! Define problem on the host (processor 0) IF ( mumps_par%MYID .eq. 0 ) THEN !définir une matrice centralized assembled avant la factorisation (Job=2) et l'analyse (job=1) mumps_par%N=Nb mumps_par%NZ=NbZ ALLOCATE( mumps_par%IRN ( NbZ ) ) ALLOCATE( mumps_par%JCN ( NbZ ) ) ALLOCATE( mumps_par%A( NbZ ) ) ALLOCATE( mumps_par%RHS ( Nb ) ) j=1 DO II = 1, NbZ mumps_par%IRN(II)=param(j+2) mumps_par%JCN(II)=param(j+3) mumps_par%A(II) =param(j+4) j=j+3 end do MZ=(NbZ*3)+2 DO II = 1, Nb mumps_par%RHS(II)=param(II+MZ) END DO END IF ! Call package for solution mumps_par%JOB = 6!combines the actions of calls with JOB=1 (analyse), JOB=2(factorisation), and JOB=3(solution) CALL DMUMPS(mumps_par) IF (mumps_par%INFOG(1).LT.0) THEN WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF ! Solution has been assembled on the host IF ( mumps_par%MYID .eq. 0 ) THEN WRITE(6, * ) ' Solution is ',(mumps_par%RHS(II),II=1,Nb) !afficher à l'écran la solution END IF ! Deallocate user data IF ( mumps_par%MYID .eq. 0 )THEN DEALLOCATE( mumps_par%IRN )! can be deallocated after analysis DEALLOCATE( mumps_par%JCN )! can be deallocated after analysis DEALLOCATE( mumps_par%A ) DEALLOCATE( mumps_par%RHS ) END IF ! Destroy the instance (deallocate internal data structures) mumps_par%JOB = -2 !termine l'exemple: toutes les data de la structure sont déallocated (sauf pour celles mises par l'utilsateur): on le mets au dernier appel de Dmumps CALL DMUMPS(mumps_par) IF (mumps_par%INFOG(1).LT.0) THEN WRITE(6,'(A,A,I6,A,I9)') " ERROR RETURN: ", " mumps_par%INFOG(1)= ", mumps_par%INFOG(1), & " mumps_par%INFOG(2)= ", mumps_par%INFOG(2) GOTO 500 END IF !end do !fin boucle temps 500 CALL MPI_FINALIZE(IERR) STOP !close (61) END
Merci,
Partager