The TELEMAC-MASCARET system  trunk
sd_solve_1.f
Go to the documentation of this file.
1 ! *********************
2  SUBROUTINE sd_solve_1
3 ! *********************
4 !
5  &(npoin,nsegb,gloseg,maxseg,da,xa,xinc,rhs,infogr,typext)
6 !
7 !***********************************************************************
8 ! BIEF V7P0 21/07/2011
9 !***********************************************************************
10 !
11 !brief DIRECT RESOLUTION OF A SYMMETRICAL LINEAR SYSTEM WITH
12 !+ MINIMUM DEGREE PERMUTATION AND LDLT DECOMPOSITION.
13 !+
14 !+ FROM SEGMENT STORAGE TO COMPACT STORAGE (MORSE).
15 !code
16 !+ IMPORTANT NOTE: INSPIRED FROM PACKAGE CMLIB3 - YALE UNIVERSITE-YSMP
17 !+
18 !+
19 !+ YALE SPARSE MATRIX PACKAGE - NONSYMMETRIC CODES
20 !+ SOLVING THE SYSTEM OF EQUATIONS MX = B
21 !+ (UNCOMPRESSED POINTER STORAGE)
22 !+
23 !+ I. CALLING SEQUENCES
24 !+ THE COEFFICIENT MATRIX CAN BE PROCESSED BY AN ORDERING ROUTINE
25 !+ (E.G., TO REDUCE FILLIN OR ENSURE NUMERICAL STABILITY) BEFORE USING
26 !+ THE REMAINING SUBROUTINES. IF NO REORDERING IS DONE, THEN SET
27 !+ R(I) = C(I) = IC(I) = I FOR I=1,...,N. THE CALLING SEQUENCE IS --
28 !+ ( (MATRIX ORDERING))
29 !+ NSF (SYMBOLIC FACTORIZATION TO DETERMINE WHERE FILLIN WILL
30 !+ OCCUR DURING NUMERIC FACTORIZATION)
31 !+ NNF (NUMERIC FACTORIZATION INTO PRODUCT LDU OF UNIT LOWER
32 !+ TRIANGULAR MATRIX L, DIAGONAL MATRIX D, AND UNIT UPPER
33 !+ TRIANGULAR MATRIX U, AND SOLUTION OF LINEAR SYSTEM)
34 !+ NNS (SOLUTION OF LINEAR SYSTEM FOR ADDITIONAL RIGHT-HAND
35 !+ OR SIDE USING LDU FACTORIZATION FROM NNF)
36 !+ NNT (SOLUTION OF TRANSPOSED LINEAR SYSTEM FOR ADDITIONAL
37 !+ RIGHT-HAND SIDE USING LDU FACTORIZATION FROM NNF)
38 !+
39 !+ II. STORAGE OF SPARSE MATRICES
40 !+ THE NONZERO ENTRIES OF THE COEFFICIENT MATRIX M ARE STORED
41 !+ ROW-BY-ROW IN_SS1 THE ARRAY A. TO IDENTIFY THE INDIVIDUAL NONZERO
42 !+ ENTRIES IN_SS1 EACH ROW, WE NEED TO KNOW IN_SS1 WHICH COLUMN EACH ENTRY
43 !+ LIES. THE COLUMN INDICES WHICH CORRESPOND TO THE NONZERO ENTRIES
44 !+ OF M ARE STORED IN_SS1 THE ARRAY JA; I.E., IF A(K) = M(I,J), THEN
45 !+ JA(K) = J. IN_SS1 ADDITION, WE NEED TO KNOW WHERE EACH ROW STARTS AND
46 !+ HOW LONG IT IS. THE INDEX POSITIONS IN_SS1 JA AND A WHERE THE ROWS OF
47 !+ M BEGIN ARE STORED IN_SS1 THE ARRAY IA; I.E., IF M(I,J) IS THE FIRST
48 !+ NONZERO ENTRY (STORED) IN_SS1 THE I-TH ROW AND A(K) = M(I,J), THEN
49 !+ IA(I) = K. MOREOVER, THE INDEX IN_SS1 JA AND A OF THE FIRST LOCATION
50 !+ FOLLOWING THE LAST ELEMENT IN_SS1 THE LAST ROW IS STORED IN_SS1 IA(N+1).
51 !+ THUS, THE NUMBER OF ENTRIES IN_SS1 THE I-TH ROW IS GIVEN BY
52 !+ IA(I+1) - IA(I), THE NONZERO ENTRIES OF THE I-TH ROW ARE STORED
53 !+ CONSECUTIVELY IN_SS1
54 !+ A(IA(I)), A(IA(I)+1), ..., A(IA(I+1)-1),
55 !+ AND THE CORRESPONDING COLUMN INDICES ARE STORED CONSECUTIVELY IN_SS1
56 !+ JA(IA(I)), JA(IA(I)+1), ..., JA(IA(I+1)-1).
57 !+ FOR EXAMPLE, THE 5 BY 5 MATRIX
58 !+ ( 1. 0. 2. 0. 0.)
59 !+ ( 0. 3. 0. 0. 0.)
60 !+ M = ( 0. 4. 5. 6. 0.)
61 !+ ( 0. 0. 0. 7. 0.)
62 !+ ( 0. 0. 0. 8. 9.)
63 !+ WOULD BE STORED AS
64 !+ \ 1 2 3 4 5 6 7 8 9
65 !+ ---+--------------------------
66 !+ IA \ 1 3 4 7 8 10
67 !+ JA \ 1 3 2 2 3 4 4 4 5
68 !+ A \ 1. 2. 3. 4. 5. 6. 7. 8. 9. .
69 !+
70 !+ THE STRICT TRIANGULAR PORTIONS OF THE MATRICES L AND U ARE
71 !+ STORED IN_SS1 THE SAME FASHION USING THE ARRAYS IL, JL, L AND
72 !+ IU, JU, U RESPECTIVELY. THE DIAGONAL ENTRIES OF L AND U ARE
73 !+ ASSUMED TO BE EQUAL TO ONE AND ARE NOT STORED. THE ARRAY D
74 !+ CONTAINS THE RECIPROCALS OF THE DIAGONAL ENTRIES OF THE MATRIX D.
75 !+
76 !+ III. ADDITIONAL STORAGE SAVINGS
77 !+ IN_SS1 NSF, R AND IC CAN BE THE SAME ARRAY IN_SS1 THE CALLING
78 !+ SEQUENCE IF NO REORDERING OF THE COEFFICIENT MATRIX HAS BEEN DONE.
79 !+ IN_SS1 NNF, R, C AND IC CAN ALL BE THE SAME ARRAY IF NO REORDERING
80 !+ HAS BEEN DONE. IF ONLY THE ROWS HAVE BEEN REORDERED, THEN C AND IC
81 !+ CAN BE THE SAME ARRAY. IF THE ROW AND COLUMN ORDERINGS ARE THE
82 !+ SAME, THEN R AND C CAN BE THE SAME ARRAY. Z AND ROW CAN BE THE
83 !+ SAME ARRAY.
84 !+ IN_SS1 NNS OR NNT, R AND C CAN BE THE SAME ARRAY IF NO REORDERING
85 !+ HAS BEEN DONE OR IF THE ROW AND COLUMN ORDERINGS ARE THE SAME. Z
86 !+ AND B CAN BE THE SAME ARRAY; HOWEVER, THEN B WILL BE DESTROYED.
87 !+
88 !+ IV. PARAMETERS
89 !+ FOLLOWING IS A LIST OF PARAMETERS TO THE PROGRAMS. NAMES ARE
90 !+ UNIFORM AMONG THE VARIOUS SUBROUTINES. CLASS ABBREVIATIONS ARE --
91 !+ N - INTEGER VARIABLE
92 !+ F - REAL VARIABLE
93 !+ V - SUPPLIES A VALUE TO A SUBROUTINE
94 !+ R - RETURNS A RESULT FROM A SUBROUTINE
95 !+ I - USED INTERNALLY BY A SUBROUTINE
96 !+ A - ARRAY
97 !+
98 !+ CLASS \ PARAMETER
99 !+ ------+----------
100 !+ FVA \ A - NONZERO ENTRIES OF THE COEFFICIENT MATRIX M, STORED
101 !+ \ BY ROWS.
102 !+ \ SIZE = NUMBER OF NONZERO ENTRIES IN_SS1 M.
103 !+ FVA \ B - RIGHT-HAND SIDE B.
104 !+ \ SIZE = N.
105 !+ NVA \ C - ORDERING OF THE COLUMNS OF M.
106 !+ \ SIZE = N.
107 !+ FVRA \ D - RECIPROCALS OF THE DIAGONAL ENTRIES OF THE MATRIX D.
108 !+ \ SIZE = N.
109 !+ NR \ FLAG - ERROR FLAG; VALUES AND THEIR MEANINGS ARE --
110 !+ \ 0 NO ERRORS DETECTED
111 !+ \ N+K NULL ROW IN_SS1 A -- ROW = K
112 !+ \ 2N+K DUPLICATE ENTRY IN_SS1 A -- ROW = K
113 !+ \ 3N+K INSUFFICIENT STORAGE FOR JL -- ROW = K
114 !+ \ 4N+1 INSUFFICIENT STORAGE FOR L
115 !+ \ 5N+K NULL PIVOT -- ROW = K
116 !+ \ 6N+K INSUFFICIENT STORAGE FOR JU -- ROW = K
117 !+ \ 7N+1 INSUFFICIENT STORAGE FOR U
118 !+ \ 8N+K ZERO PIVOT -- ROW = K
119 !+ NVA \ IA - POINTERS TO DELIMIT THE ROWS IN_SS1 A.
120 !+ \ SIZE = N+1.
121 !+ NVA \ IC - INVERSE OF THE ORDERING OF THE COLUMNS OF M; I.E.,
122 !+ \ IC(C(I) = I FOR I=1,...N.
123 !+ \ SIZE = N.
124 !+ NVRA \ IL - POINTERS TO DELIMIT THE ROWS IN_SS1 L.
125 !+ \ SIZE = N+1.
126 !+ NVRA \ IU - POINTERS TO DELIMIT THE ROWS IN_SS1 U.
127 !+ \ SIZE = N+1.
128 !+ NVA \ JA - COLUMN NUMBERS CORRESPONDING TO THE ELEMENTS OF A.
129 !+ \ SIZE = SIZE OF A.
130 !+ NVRA \ JL - COLUMN NUMBERS CORRESPONDING TO THE ELEMENTS OF L.
131 !+ \ SIZE = JLMAX.
132 !+ NV \ JLMAX - DECLARED DIMENSION OF JL; JLMAX MUST BE LARGER THAN
133 !+ \ THE NUMBER OF NONZERO ENTRIES IN_SS1 THE STRICT LOWER
134 !+ \ TRIANGLE OF M PLUS FILLIN (IL(N+1)-1 AFTER NSF).
135 !+ NVRA \ JU - COLUMN NUMBERS CORRESPONDING TO THE ELEMENTS OF U.
136 !+ \ SIZE = JUMAX.
137 !+ NV \ JUMAX - DECLARED DIMENSION OF JU; JUMAX MUST BE LARGER THAN
138 !+ \ THE NUMBER OF NONZERO ENTRIES IN_SS1 THE STRICT UPPER
139 !+ \ TRIANGLE OF M PLUS FILLIN (IU(N+1)-1 AFTER NSF).
140 !+ FVRA \ L - NONZERO ENTRIES IN_SS1 THE STRICT LOWER TRIANGULAR PORTION
141 !+ \ OF THE MATRIX L, STORED BY ROWS.
142 !+ \ SIZE = LMAX
143 !+ NV \ LMAX - DECLARED DIMENSION OF L; LMAX MUST BE LARGER THAN
144 !+ \ THE NUMBER OF NONZERO ENTRIES IN_SS1 THE STRICT LOWER
145 !+ \ TRIANGLE OF M PLUS FILLIN (IL(N+1)-1 AFTER NSF).
146 !+ NV \ N - NUMBER OF VARIABLES/EQUATIONS.
147 !+ NVA \ R - ORDERING OF THE ROWS OF M.
148 !+ \ SIZE = N.
149 !+ FVRA \ U - NONZERO ENTRIES IN_SS1 THE STRICT UPPER TRIANGULAR PORTION
150 !+ \ OF THE MATRIX U, STORED BY ROWS.
151 !+ \ SIZE = UMAX.
152 !+ NV \ UMAX - DECLARED DIMENSION OF U; UMAX MUST BE LARGER THAN
153 !+ \ THE NUMBER OF NONZERO ENTRIES IN_SS1 THE STRICT UPPER
154 !+ \ TRIANGLE OF M PLUS FILLIN (IU(N+1)-1 AFTER NSF).
155 !+ FRA \ Z - SOLUTION X.
156 !+ \ SIZE = N.
157 !
158 !history E. RAZAFINDRAKOTO (LNH)
159 !+ 20/11/06
160 !+ V5P7
161 !+
162 !
163 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
164 !+ 13/07/2010
165 !+ V6P0
166 !+ Translation of French comments within the FORTRAN sources into
167 !+ English comments
168 !
169 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
170 !+ 21/08/2010
171 !+ V6P0
172 !+ Creation of DOXYGEN tags for automated documentation and
173 !+ cross-referencing of the FORTRAN sources
174 !
175 !history J-M HERVOUET (LNHE)
176 !+ 23/08/2012
177 !+ V6P2
178 !+ Size of ISP_SS1 doubled IN_SS1 non symmetric cases.
179 !
180 !history J-M HERVOUET (EDF LAB, LNHE)
181 !+ 18/04/2014
182 !+ V7P0
183 !+ Checking that 2*NSP is less than HUGE(1). Meshes with about
184 !+ 2 millions of points will trigger memory allocations of numbers
185 !+ greater than the largest I4 integer.
186 !
187 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
188 !| DA |-->| MATRIX DIAGONAL COEFFICIENTS
189 !| XA |-->| OFF-DIAGONAL TERM OF MATRIX
190 !| GLOSEG |-->| GLOBAL NUMBER OF SEGMENTS OF THE MATRIX
191 !| INFOGR |-->| IF, YES INFORMATIONS ON LISTING
192 !| MAXSEG |-->| MAXIMUM NUMBER OF SEGMENTS
193 !| NPOIN |-->| NUMBER OF UNKNOWN
194 !| NSEGB |-->| NUMBER OF SEGMENTS
195 !| RHS |-->| SECOND MEMBER OF LINEAR EQUATION
196 !| TYPEXT |---| = 'S' : SYMETRIC MATRIX
197 !| XINC |<--| SOLUTION
198 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
199 !
200  USE bief, ex_sd_solve_1 => sd_solve_1
202  & indtri_ss1,inx_ss1,ac_ss1,
203  & actri_ss1,isp_ss1,rsp_ss1,
204  & indtri_ss1,size_in,size_ip,
205  & size_isegip,size_iw1,size_indtri,
206  & size_inx,size_ac,size_actri,
207  & size_isp,size_rsp,size_ipx,
208  & ipx_ss1
209 !
211  IMPLICIT NONE
212 !
213 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
214 !
215  INTEGER, INTENT(IN) :: NPOIN,NSEGB,MAXSEG
216  INTEGER, INTENT(IN) :: GLOSEG(maxseg,2)
217  LOGICAL, INTENT(IN) :: INFOGR
218  DOUBLE PRECISION, INTENT(IN) :: XA(*),RHS(npoin)
219  DOUBLE PRECISION, INTENT(INOUT) :: XINC(npoin),DA(npoin)
220  CHARACTER(LEN=1), INTENT(IN) :: TYPEXT
221 !
222 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
223 !
224  INTEGER MEMFACTOR,IERR,NPBLK,NSEGBLK,NSP,ESP,INDIC,FLAG,I,IERRK
225 !
226 !
227 !
228 !-----------------------------------------------------------------------
229 !
230 ! CORRECTS DIAGONALS (TIDAL FLATS WITH MASKING)
231 !
232  DO i=1,npoin
233  IF(abs(da(i)).LT.1.d-15) da(i)=1.d0
234  ENDDO
235 !
236 !-----------------------------------------------------------------------
237 !
238  IF(infogr) THEN
239  WRITE(lu,*) ' DIRECT SYSTEM SOLVER'
240  ENDIF
241 !
242  npblk=npoin
243  nsegblk=nsegb
244 !
245 ! 1. MEMFACTOR: MEMORY FACTOR FOR SIZE ISP_SS1 AND RSP_SS1 IN_SS1 ODRV AND SDRV
246 ! =======================================================================
247 !
248  IF(typext.EQ.'S') THEN
249  memfactor = 5
250  ELSE
251  memfactor = 15
252  ENDIF
253  nsp=memfactor*(npblk+4*nsegblk)
254  esp=memfactor*(npblk+4*nsegblk)
255 !
256 ! 2. ALLOCATES ARRAYS (OR REALLOCATES IF TOO SMALL)
257 ! =======================================================================
258 !
259  IF(size_in.EQ.0) THEN
260  ALLOCATE(in_ss1(npblk+1))
261  size_in= npblk+1
262  ELSEIF( npblk+1.GT.size_in) THEN
263  DEALLOCATE(in_ss1)
264  ALLOCATE(in_ss1(npblk+1))
265  size_in= npblk+1
266  ENDIF
267 !
268  IF(size_ip.EQ.0) THEN
269  ALLOCATE(ip_ss1(nsegblk*2))
270  size_ip= nsegblk*2
271  ELSEIF( nsegblk*2.GT.size_ip) THEN
272  DEALLOCATE(ip_ss1)
273  ALLOCATE(ip_ss1(nsegblk*2))
274  size_ip= nsegblk*2
275  ENDIF
276 !
277  IF(size_isegip.EQ.0) THEN
278  ALLOCATE(isegip_ss1(nsegblk*2+1))
279  size_isegip= nsegblk*2+1
280  ELSEIF( nsegblk*2+1.GT.size_isegip) THEN
281  DEALLOCATE(isegip_ss1)
282  ALLOCATE(isegip_ss1(nsegblk*2+1))
283  size_isegip= nsegblk*2+1
284  ENDIF
285 !
286  IF(size_iw1.EQ.0) THEN
287  ALLOCATE(iw1_ss1(npblk))
288  size_iw1= npblk
289  ELSEIF( npblk.GT.size_iw1) THEN
290  DEALLOCATE(iw1_ss1)
291  ALLOCATE(iw1_ss1(npblk))
292  size_iw1= npblk
293  ENDIF
294 !
295  IF(size_indtri.EQ.0) THEN
296  ALLOCATE(indtri_ss1(npblk))
297  size_indtri= npblk
298  ELSEIF( npblk.GT.size_indtri) THEN
299  DEALLOCATE(indtri_ss1)
300  ALLOCATE(indtri_ss1(npblk))
301  size_indtri= npblk
302  ENDIF
303 !
304  IF(size_inx.EQ.0) THEN
305  ALLOCATE(inx_ss1(npblk+1))
306  size_inx= npblk+1
307  ELSEIF( npblk+1.GT.size_inx) THEN
308  DEALLOCATE(inx_ss1)
309  ALLOCATE(inx_ss1(npblk+1))
310  size_inx= npblk+1
311  ENDIF
312 !
313  IF(size_ipx.EQ.0) THEN
314  ALLOCATE(ipx_ss1(nsegblk*2+npblk+1))
315  size_ipx= nsegblk*2+npblk+1
316  ELSEIF( nsegblk*2+npblk+1.GT.size_ipx) THEN
317  DEALLOCATE(ipx_ss1)
318  ALLOCATE(ipx_ss1(nsegblk*2+npblk+1))
319  size_ipx= nsegblk*2+npblk+1
320  ENDIF
321 !
322  IF(size_ac.EQ.0) THEN
323  ALLOCATE(ac_ss1(nsegblk*2+npblk+1))
324  size_ac= nsegblk*2+npblk+1
325  ELSEIF( nsegblk*2+npblk+1.GT.size_ac) THEN
326  DEALLOCATE(ac_ss1)
327  ALLOCATE(ac_ss1(nsegblk*2+npblk+1))
328  size_ac= nsegblk*2+npblk+1
329  ENDIF
330 !
331  IF(size_actri.EQ.0) THEN
332  ALLOCATE(actri_ss1(npblk))
333  size_actri= npblk
334  ELSEIF( npblk.GT.size_actri) THEN
335  DEALLOCATE(actri_ss1)
336  ALLOCATE(actri_ss1(npblk))
337  size_actri= npblk
338  ENDIF
339 !
340  IF(typext.EQ.'S') THEN
341 !
342  IF(size_isp.EQ.0) THEN
343  ALLOCATE(isp_ss1(nsp))
344  ELSEIF( nsp.GT.size_isp) THEN
345  DEALLOCATE(isp_ss1)
346  ALLOCATE(isp_ss1(nsp))
347  ENDIF
348  size_isp= nsp
349 !
350  ELSE
351 !
352  IF(2*nsp.LT.nsp) THEN
353  WRITE(lu,*) 'SIZE OF LARGEST INTEGER ',huge(1)
354  WRITE(lu,*) 'TRESPASSED BY 2*NSP, NSP=',nsp
355  CALL plante(1)
356  stop
357  ENDIF
358 !
359  IF(size_isp.EQ.0) THEN
360  ALLOCATE(isp_ss1(2*nsp))
361  ELSEIF( 2*nsp.GT.size_isp) THEN
362  DEALLOCATE(isp_ss1)
363  ALLOCATE(isp_ss1(2*nsp))
364  ENDIF
365  size_isp= 2*nsp
366 !
367  ENDIF
368 !
369  IF(size_rsp.EQ.0) THEN
370  ALLOCATE(rsp_ss1(esp))
371  size_rsp= esp
372  ELSEIF( esp.GT.size_rsp) THEN
373  DEALLOCATE(rsp_ss1)
374  ALLOCATE(rsp_ss1(esp))
375  size_rsp= esp
376  ENDIF
377 !
378 ! 3. BUILDS NONSYMMETRICAL COMPACT STORAGE (IN_SS1,IP_SS1)
379 ! WITHOUT THE DIAGONAL AND (INX_SS1,IPX_SS1) WITH THE DIAGONAL
380 ! =======================================================================
381 !
382  CALL sd_strssd(npblk,nsegblk,gloseg(1,1),gloseg(1,2),
384 !
385  IF(typext.EQ.'S') THEN
386 ! XA IS THE OFF-DIAGONAL TERMS AND MAY COME DIRECTLY FROM TELEMAC
387 ! HENCE THE LOWER TRIANGULAR PART MAY NOT BE BUILT, WE GIVE TWICE XA
388 ! INSTEAD OF XA,XA(NSEGBLK+1)
389  CALL sd_fabcad(npblk,nsegblk,in_ss1,ip_ss1,isegip_ss1,
390  & indtri_ss1,iw1_ss1,inx_ss1,ipx_ss1,actri_ss1,xa,
391  & xa,da,ac_ss1)
392 ! ISTRI !!
393  ELSE
394  CALL sd_fabcad(npblk,nsegblk,in_ss1,ip_ss1,isegip_ss1,
395  & indtri_ss1,iw1_ss1,inx_ss1,ipx_ss1,actri_ss1,xa,
396  & xa(nsegblk+1),da,ac_ss1)
397  ENDIF
398 !
399 ! 4. MINIMUM DEGREE PERMUTATION (YSMP PACKAGE)
400 ! =======================================================================
401 !
402  indic=1
403 !
404  CALL sd_odrv(npblk,inx_ss1,ipx_ss1,ac_ss1,in_ss1,iw1_ss1,nsp,
405  & isp_ss1,indic,flag)
406 ! PERM,INVP
407 !
408  IF(flag.NE.0) THEN
409  WRITE(lu,*) 'INCREASE THE MEMORY FACTOR (MEMFACTOR)',
410  & ' IN_SS1 THE ROUTINE SD_SOLVE_1'
411  CALL plante(1)
412  stop
413  ENDIF
414 !
415 !---> SECOND MEMBER OF THE SYSTEM
416 !
417 ! 5. LDLT DECOMPOSITION AND RESOLUTION (YSMP PACKAGE)
418 !
419  IF(typext.EQ.'S') THEN
420 ! PERM,INVP
421  CALL sd_sdrv(npblk,in_ss1,iw1_ss1,inx_ss1,ipx_ss1,ac_ss1,rhs,
422  & xinc,nsp,isp_ss1,rsp_ss1,esp,indic,flag)
423  ELSE
424  CALL sd_cdrv(npblk,in_ss1,in_ss1,iw1_ss1,inx_ss1,ipx_ss1,
425  & ac_ss1,rhs,xinc,
426  & nsp,isp_ss1,rsp_ss1,esp,indic,flag)
427  ENDIF
428 !
429  IF(typext.EQ.'S') THEN
430  IF(flag.NE.0) THEN
431  ierr=flag-8*npblk
432  IF(ierr.GT.0) THEN
433  WRITE(lu,*) 'MATRIX WITH ZERO PIVOT AT ROW'
434  WRITE(lu,*) ierr
435  ELSE
436  WRITE(lu,*) 'ADD 1 TO THE MEMORY FACTOR (MEMFACTOR)',
437  & ' IN_SS1 SUBROUTINE SD_SOLVE_1'
438  ENDIF
439  CALL plante(1)
440  stop
441  ENDIF
442  ELSE
443 !
444 !---> COMMENTS THE ERROR: FLAG_SD_NDRV:
445 !
446 ! FLAG - ERROR FLAG; VALUES AND THEIR MEANINGS ARE --
447 ! 0 NO ERRORS DETECTED
448 ! N+K NULL ROW IN_SS1 A -- ROW = K
449 ! 2N+K DUPLICATE ENTRY IN_SS1 A -- ROW = K
450 ! 3N+K INSUFFICIENT STORAGE IN_SS1 NSF -- ROW = K
451 ! 4N+1 INSUFFICIENT STORAGE IN_SS1 NNF
452 ! 5N+K NULL PIVOT -- ROW = K
453 ! 6N+K INSUFFICIENT STORAGE IN_SS1 NSF -- ROW = K
454 ! 7N+1 INSUFFICIENT STORAGE IN_SS1 NNF
455 ! 8N+K ZERO PIVOT -- ROW = K
456 ! 10N+1 INSUFFICIENT STORAGE IN_SS1 NDRV
457 ! 11N+1 ILLEGAL PATH SPECIFICATION (INDIC)
458  IF(flag.NE.0) THEN
459  ierr=int(flag/npblk)
460  IF(ierr.EQ.3.OR.ierr.EQ.5.OR.ierr.EQ.8) THEN
461  ierrk=flag-ierr*npblk
462  WRITE(lu,*) 'MATRIX WITH ZERO PIVOT AT ROW'
463  WRITE(lu,*) ierrk
464  ELSE
465  WRITE(lu,*) 'INCREASE THE MEMORY FACTOR (MEMFACTOR)',
466  & ' IN_SS1 SUBROUTINE SD_SOLVE_1'
467  ENDIF
468  CALL plante(1)
469  stop
470  ENDIF
471  ENDIF
472 !
473 !-----------------------------------------------------------------------
474 !
475  RETURN
476  END
subroutine sd_sdrv(N, P, IP, IA, JA, A, B, Z, NSP, ISP, RSP, ESP, PATH, FLAG)
Definition: sd_sdrv.f:7
integer, dimension(:), allocatable ip_ss1
integer, dimension(:), allocatable iw1_ss1
subroutine sd_solve_1(NPOIN, NSEGB, GLOSEG, MAXSEG, DA, XA, XINC, RHS, INFOGR, TYPEXT)
Definition: sd_solve_1.f:7
subroutine sd_odrv(N, IA, JA, A, P, IP, NSP, ISP, PATH, FLAG)
Definition: sd_odrv.f:7
integer, dimension(:), allocatable in_ss1
subroutine sd_cdrv(N, R, C, IC, IA, JA, A, B, Z, NSP, ISP, RSP, ESP, PATH, FLAG)
Definition: sd_cdrv.f:7
integer, dimension(:), allocatable isegip_ss1
subroutine sd_strssd(NPBLK, NSEGBLK, GLOSEG1, GLOSEG2, IN, IP, ISEGIP, IW)
Definition: sd_strssd.f:7
subroutine sd_fabcad(NPBLK, NSEGBLK, IN, IP, ISEGIP, INDTRI, ISTRI, INX, IPX, ACTRI, XA1, XA2, DA, AC)
Definition: sd_fabcad.f:8
Definition: bief.f:3