The TELEMAC-MASCARET system  trunk
solve.f
Go to the documentation of this file.
1 ! ****************
2  SUBROUTINE solve
3 ! ****************
4 !
5  &(x, a,b,tb,cfg,infogr,mesh,aux)
6 !
7 !***********************************************************************
8 ! BIEF V6P2 21/08/2010
9 !***********************************************************************
10 !
11 !brief SOLVES A LINEAR SYSTEM OF THE FORM A X = B
12 !+
13 !+ USING ITERATIVE METHODS
14 !+ WITH POSSIBLE PRECONDITIONING.
15 !code
16 !+-----------------------------------------------------------------------
17 !+ CHOICE OF THE METHOD
18 !+-----------------------------------------------------------------------
19 !+ VALUE I MEANING I
20 !+-----------------------------------------------------------------------
21 !+ I I
22 !+ 1 I CONJUGATE GRADIENT I
23 !+ I I
24 !+ 2 I CONJUGATE RESIDUAL I
25 !+ I I
26 !+ 3 I CONJUGATE GRADIENT I
27 !+ I ON A NORMAL EQUATION I
28 !+ I I
29 !+ 4 I MINIMUM ERROR I
30 !+ I I
31 !+ 5 I SQUARED I
32 !+ I CONJUGATE GRADIENT I
33 !+ I I
34 !+ 6 I SQUARED I
35 !+ I CONJUGATE GRADIENT I
36 !+ I (CGSTAB) I
37 !+ I I
38 !+ 7 I GMRES I
39 !+ I I
40 !+ 8 I DIRECT : YSMP I
41 !+ I I
42 !+ 9 I DIRECT : MUMPS I
43 !+ I I
44 !+-----------------------------------------------------------------------
45 !
46 !warning FOR SOME PRECONDITIONING ALGORITHMS, MATRIX A
47 !+ CAN BE MODIFIED
48 !code
49 !+ PRECONDITIONING
50 !+
51 !+ NOTES : SOME PRECONDITIONING ALGORITHMS CAN BE ADDED
52 !+ (DIAGONAL 2, 3 OR 5 WITH THE OTHERS).
53 !+ THAT'S WHY PRIME NUMBERS WERE USED TO CHARACTERISE
54 !+ THE PRECONDITIONING ALGORITHMS.
55 !+ SHOULD THE USER WANT TO CUMULATE THE EFFECTS, HE/SHE
56 !+ SHOULD GIVE THE PRODUCT OF THE CORRESPONDING PRIMES
57 !+
58 !+-----------------------------------------------------------------------
59 !+ VALUE I MEANING
60 !+-----------------------------------------------------------------------
61 !+ 0 OR 1 I NO PRECONDITIONING
62 !+ I
63 !+ 2 I DIAGONAL PRECONDITIONING WITH THE MATRIX
64 !+ I DIAGONAL
65 !+ I
66 !+ 3 I BLOCK DIAGONAL PRECONDITIONING
67 !+ I
68 !+ 5 I DIAGONAL PRECONDITIONING WITH THE ABSOLUTE
69 !+ I VALUE OF THE MATRIX DIAGONAL
70 !+ I
71 !+ 7 I CROUT'S PRECONDITIONING BY ELEMENT
72 !+ I
73 !+ 11 I GAUSS-SEIDEL'S PRECONDITIONING BY ELEMENT
74 !+ I
75 !+ 13 I PRECONDITIONING MATRIX SUPPLIED BY THE USER
76 !+ I
77 !+-----------------------------------------------------------------------
78 !
79 !history J-M HERVOUET (LNHE)
80 !+ 18/02/08
81 !+ V5P9
82 !+
83 !
84 !history C. DENIS (SINETICS)
85 !+ 19/03/10
86 !+ V6P0
87 !+
88 !
89 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
90 !+ 13/07/2010
91 !+ V6P0
92 !+ Translation of French comments within the FORTRAN sources into
93 !+ English comments
94 !
95 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
96 !+ 21/08/2010
97 !+ V6P0
98 !+ Creation of DOXYGEN tags for automated documentation and
99 !+ cross-referencing of the FORTRAN sources
100 !
101 !history J-M HERVOUET (LNHE)
102 !+ 07/12/2011
103 !+ V6P2
104 !+ Call to preverseg and preverebe modified.
105 !+
106 !
107 !history J.PARISI (HRW)
108 !+ 9/08/2012
109 !+ V6P2
110 !+ Call to SD_SOLVE_4 modified.
111 !history R.NHEILI (Univerte de Perpignan, DALI)
112 !+ 24/02/2016
113 !+ V7P3
114 !+ COMPENSATED INTERFACE NODE ASSEMBLY (MODASS=3)
115 !
116 !history J-M HERVOUET (EDF LAB, LNHE)
117 !+ 23/02/2015
118 !+ V7P1
119 !+ Arguments added to PRE4_MUMPS, to correct a bug when it calls
120 !+ SD_FABSG4.
121 !
122 !history J,RIEHME (ADJOINTWARE)
123 !+ November 2016
124 !+ V7P2
125 !+ Replaced EXTERNAL statements to parallel functions / subroutines
126 !+ by the INTERFACE_PARALLEL
127 !
128 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129 !| A |-->| MATRIX OF THE SYSTEM (OR BLOCK OF MATRICES)
130 !| AUX |-->| MATRIX FOR PRECONDITIONING.
131 !| B |-->| RIGHT-HAND SIDE OF THE SYSTEM
132 !| CFG |-->| STRUCTURE OF SOLVER CONFIGURATION
133 !| | | CFG%KRYLOV IS USED ONLY IF CFG%SLV = 7 (GMRES)
134 !| INFOGR |-->| IF YES, PRINT A LOG.
135 !| MESH |-->| MESH STRUCTURE.
136 !| TB |-->| BLOCK OF VECTORS WITh AT LEAST
137 !| | | MAX(7,2+2*CFG%KRYLOV)*S VECTORS, S IS 1
138 !| | | IF A IS A MATRIX, 2 IF A BLOCK OF 4 MATRICES
139 !| | | AND 3 IF A BLOCK OF 9.
140 !| X |<->| INITIAL VALUE, THEN SOLUTION
141 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
142 !
143  USE bief, ex_solve => solve
144  USE declarations_telemac, ONLY : modass
145  USE declarations_telemac, ONLY : tbb, bb, bx, first_solve
147 !
148  USE interface_parallel, ONLY : p_max
149  IMPLICIT NONE
150 !
151 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
152 !
153  TYPE(slvcfg), INTENT(INOUT) :: CFG
154 !
155 ! STRUCTURES OF VECTORS OR BLOCKS OF VECTORS
156 !
157  TYPE(bief_obj), TARGET, INTENT(INOUT) :: X,B
158  TYPE(bief_obj), INTENT(INOUT) :: TB
159 !
160 ! STRUCTURES OF MATRIX OR BLOCK OF MATRICES
161 !
162  TYPE(bief_obj), INTENT(INOUT) :: A,AUX
163 !
164  LOGICAL, INTENT(IN) :: INFOGR
165 !
166 ! MESH STRUCTURE
167 !
168  TYPE(bief_mesh), INTENT(INOUT) :: MESH
169 !
170 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
171 !
172  INTEGER PRESTO,IG,LV,S,NBL,I
173  INTEGER IT1,IT2,IT3,IT4,IT5,IT6,IT7,IBL1,IBL2,K,IAD,ITB,ITBB
174 !
175  LOGICAL DIADON,PREXSM
176  INTEGER NPOIN_TOT
177 !
178  INTRINSIC max
179 !
180 !-----------------------------------------------------------------------
181 !
182 ! STRUCTURES OF BLOCKS OF WORKING ARRAYS
183 !
184  TYPE(bief_obj), POINTER :: PB,PX
185 !
186 !-----------------------------------------------------------------------
187 !
188 ! ALLOCATES THE BLOCK OF BLOCKS TBB AND THE BLOCKS IN TBB
189 !
190  IF(first_solve) THEN
191  CALL allblo(tbb,'TBB ')
192  CALL allblo(bb ,'BB ')
193  CALL allblo(bx ,'BX ')
194  first_solve=.false.
195  ENDIF
196  nbl = 7
197  IF(cfg%SLV.EQ.7) nbl = max(nbl,4+2*cfg%KRYLOV)
198  IF(nbl.GT.tbb%N) THEN
199  IF(tbb%N.NE.0) THEN
200  DO i=1,tbb%N
201  DEALLOCATE(tbb%ADR(i)%P%ADR)
202  NULLIFY(tbb%ADR(i)%P%ADR)
203  DEALLOCATE(tbb%ADR(i)%P)
204  NULLIFY(tbb%ADR(i)%P)
205  ENDDO
206  ENDIF
207  tbb%N=0
208  CALL allblo_in_block(tbb,nbl,'BL ')
209  ENDIF
210 !
211 !-----------------------------------------------------------------------
212 !
213  lv = mesh%LV
214 !
215 !-----------------------------------------------------------------------
216 !
217 ! VARIOUS TYPES OF SOLVED SYSTEMS S = 0 : NORMAL MATRIX
218 ! S = 1 : 1 MATRICE IN A BLOCK
219 ! S = 2 : 4 MATRICES IN A BLOCK
220 ! S = 3 : 9 MATRICES IN A BLOCK
221 !
222  IF(a%TYPE.EQ.3) THEN
223  s = 0
224  bb%N = 0
225  bx%N = 0
226  CALL addblo(bb,b)
227  CALL addblo(bx,x)
228  px => bx
229  pb => bb
230  ELSEIF(a%TYPE.EQ.4) THEN
231  IF(a%N.EQ.1) THEN
232  s = 1
233  ELSEIF(a%N.EQ.4) THEN
234  s = 2
235  ELSEIF(a%N.EQ.9) THEN
236  s = 3
237  ENDIF
238  px => x
239  pb => b
240  ENDIF
241 !
242 !----------------
243 ! DIRECT SOLVERS
244 ! ---> YSMP
245 !----------------
246 !
247  IF(cfg%SLV.EQ.8) THEN
248 !
249  IF(ncsize.GT.1) THEN
250  WRITE(lu,2019)
251 2019 FORMAT(1x,'USE THE PARALLEL DIRECT SOLVER MUMPS,',/,1x,
252  & 'SOLVER = 9',///)
253  CALL plante(1)
254  stop
255  ENDIF
256 !
257  IF(s.EQ.0) THEN
258  IF(a%TYPEXT.NE.'S'.AND.a%TYPEXT.NE.'Q') THEN
259  WRITE(lu,*) 'SOLVE (BIEF): OFF-DIAGONAL TERMS'
260  WRITE(lu,*) ' OF TYPE ',a%TYPEXT
261  WRITE(lu,*) ' NOT IMPLEMENTED'
262  CALL plante(1)
263  stop
264  ENDIF
265  CALL sd_solve_1(a%D%DIM1,mesh%NSEG,mesh%GLOSEG%I,
266  & mesh%GLOSEG%DIM1,
267  & a%D%R,a%X%R,x%R,b%R,infogr,a%TYPEXT)
268  ELSEIF(s.EQ.1) THEN
269  IF(a%ADR(1)%P%TYPEXT.NE.'S'.AND.a%ADR(1)%P%TYPEXT.NE.'Q') THEN
270  WRITE(lu,*) 'SOLVE (BIEF): DIRECT SOLVER FOR SYMMETRIC'
271  WRITE(lu,*) ' SYSTEMS ONLY'
272  CALL plante(1)
273  stop
274  ENDIF
275  CALL sd_solve_1(a%ADR(1)%P%D%DIM1,mesh%NSEG,mesh%GLOSEG%I,
276  & mesh%GLOSEG%DIM1,
277  & a%ADR(1)%P%D%R,a%ADR(1)%P%X%R,x%ADR(1)%P%R,
278  & b%ADR(1)%P%R,infogr,a%ADR(1)%P%TYPEXT)
279  ELSEIF(s.EQ.2) THEN
280  CALL sd_solve_4(mesh%NPOIN,mesh%NSEG,mesh%GLOSEG%I,
281  & a%ADR(1)%P%D%R,a%ADR(2)%P%D%R,
282  & a%ADR(3)%P%D%R,a%ADR(4)%P%D%R,
283  & a%ADR(1)%P%X%R,a%ADR(2)%P%X%R,
284  & a%ADR(3)%P%X%R,a%ADR(4)%P%X%R,
285  & x%ADR(1)%P%R,x%ADR(2)%P%R,
286  & b%ADR(1)%P%R,b%ADR(2)%P%R,infogr,
287  & a%ADR(1)%P%TYPEXT,a%ADR(2)%P%TYPEXT,
288  & a%ADR(3)%P%TYPEXT,a%ADR(4)%P%TYPEXT)
289 ! ELSEIF(S.EQ.3) THEN
290  ELSE
291  WRITE(lu,401) s
292 401 FORMAT(1x,'SOLVE (BIEF): S=',1i6,' CASE NOT IMPLEMENTED')
293  CALL plante(1)
294  stop
295  ENDIF
296  RETURN
297 !
298  ELSEIF(cfg%SLV.EQ.9) THEN
299 !
300 !----------------
301 ! DIRECT SOLVERS
302 ! ---> MUMPS
303 !----------------
304 !
305  IF(ncsize.LT.1) THEN
306  WRITE(lu,3019)
307 3019 FORMAT(1x,'MUMPS ARE NOT AVAILABLE FOR SEQUENTIAL RUNS,',/,1x,
308  & 'USE SEQUENITAL DIRECT SOLVER (SOLVER = 8) ',///)
309  CALL plante(1)
310  stop
311  ENDIF
312 !
313 ! COMPUTING THE NUMBER OF POINTS IN THE MESH BEFORE PARTITIONING
314 !
315  IF(ncsize.GT.1) THEN
316  npoin_tot=0
317  DO i=1,mesh%NPOIN
318  npoin_tot=max(mesh%KNOLG%I(i),npoin_tot)
319  ENDDO
320  npoin_tot=p_max(npoin_tot)
321  ELSE
322  npoin_tot=mesh%NPOIN
323  ENDIF
324 !
325  IF(s.EQ.0) THEN
326  WRITE(lu,402) s
327 402 FORMAT(1x,'SOLVE (BIEF): S=',1i6,1x,
328  & 'CASE NOT YET MPLEMENTED FOR MUMPS')
329  CALL plante(1)
330  stop
331  ELSEIF(s.EQ.1) THEN
332  WRITE(lu,4011) s
333  4011 FORMAT(1x,'SOLVE (BIEF): S=',1i6,' CASE NOT YET
334  & IMPLEMENTED FOR MUMPS')
335  CALL plante(1)
336  stop
337  ELSEIF(s.EQ.2) THEN
338  CALL pre4_mumps(mesh%NPOIN,mesh%NSEG,mesh%GLOSEG%I,
339  & a%ADR(1)%P%D%R,a%ADR(2)%P%D%R,
340  & a%ADR(3)%P%D%R,a%ADR(4)%P%D%R,
341  & a%ADR(1)%P%X%R,a%ADR(2)%P%X%R,
342  & a%ADR(3)%P%X%R,a%ADR(4)%P%X%R,
343  & x%ADR(1)%P%R,x%ADR(2)%P%R,
344  & b%ADR(1)%P%R,b%ADR(2)%P%R,
345  & a%ADR(1)%P%TYPEXT,a%ADR(2)%P%TYPEXT,
346  & a%ADR(3)%P%TYPEXT,a%ADR(4)%P%TYPEXT,
347  & mesh%KNOLG%I,npoin_tot)
348  ELSE
349  WRITE(lu,401) s
350  CALL plante(1)
351  stop
352  ENDIF
353  RETURN
354 !
355  ENDIF
356 !
357 !-----------------------------------------------------------------------
358 !
359  presto = cfg%PRECON
360  IF(cfg%PRECON.EQ.0) cfg%PRECON = 1
361 !
362 !-----------------------------------------------------------------------
363 !
364 ! MANAGES WORKING ARRAYS : ITB --> NEXT AVAILABLE VECTOR
365 !
366 ! ITB --> NEXT AVAILABLE VECTOR IN TB
367 ! ITBB --> NEXT AVAIALBLE BLOCK IN TBB
368 !
369  itb = 1
370  itbb = 1
371 !
372 ! ALLOCATES TWO WORKING BLOCKS WITH, EITHER A VECTOR,
373 ! OR A BLOCK OF VECTORS (CASE WHERE S IS 0).
374 ! THESE TWO BLOCKS ARE COMMON TO ALL THE METHODS.
375 !
376 ! FOR THE PRECONDITIONING MATRICES
377  IF(3*(cfg%PRECON/3).EQ.cfg%PRECON) THEN
378 ! BLOCK DIAGONAL PRECONDITIONING : S**2 DIAGONALS
379  CALL solaux(it1, tb,tbb,itb,itbb,s**2)
380  ELSE
381 ! OTHER : S DIAGONALS
382  CALL solaux(it1, tb,tbb,itb,itbb,s)
383  ENDIF
384 !
385  CALL solaux(it2, tb,tbb,itb,itbb,s)
386 !
387  IF(cfg%SLV.EQ.7) THEN
388 ! SPECIAL GMRES : ARRAYS DEPENDING ON THE SIZE OF KRYLOV
389 ! TBB(IBL1) : BLOCK OF CFG%KRYLOV VECTORS
390 ! OR BLOCK OF CFG%KRYLOV BLOCKS OF S VECTORS
391 ! TBB(IBL2) : IDEM
392 !
393  ibl1=itbb
394  itbb = itbb + 1
395  ibl2=itbb
396  itbb = itbb + 1
397  DO i=1,tbb%ADR(ibl1)%P%N
398  NULLIFY(tbb%ADR(ibl1)%P%ADR(i)%P)
399  ENDDO
400  tbb%ADR(ibl1)%P%N=0
401  DO i=1,tbb%ADR(ibl2)%P%N
402  NULLIFY(tbb%ADR(ibl2)%P%ADR(i)%P)
403  ENDDO
404  tbb%ADR(ibl2)%P%N=0
405  DO k=1,cfg%KRYLOV
406  CALL solaux(iad, tb,tbb,itb,itbb,s)
407  CALL addblo(tbb%ADR(ibl1)%P,tbb%ADR(iad)%P)
408  CALL solaux(iad, tb,tbb,itb,itbb,s)
409  CALL addblo(tbb%ADR(ibl2)%P,tbb%ADR(iad)%P)
410  ENDDO ! K
411 ! AVOIDS A WARNING FROM THE INTEL COMPILER
412  it3=-1
413  it4=-1
414  it5=-1
415  it6=-1
416  it7=-1
417  ELSE
418 ! OTHER METHODS (COULD SOMETIMES NOT ALLOCATE IT6 OR IT7)
419  CALL solaux(it3, tb,tbb,itb,itbb,s)
420  CALL solaux(it4, tb,tbb,itb,itbb,s)
421  CALL solaux(it5, tb,tbb,itb,itbb,s)
422  CALL solaux(it6, tb,tbb,itb,itbb,s)
423  CALL solaux(it7, tb,tbb,itb,itbb,s)
424 ! AVOIDS A WARNING FROM THE CRAY COMPILER
425  ibl1=1
426  ibl2=1
427 !
428  ENDIF
429 !
430 ! CROUT'S PRECONDITIONING : REQUIRES A PRELIMINARY PRECONDITIONING
431 ! THAT SETS DIAGONALS TO 1.
432 ! THE GRADIENT WILL BE DISTINGUISHED FROM THE RESIDUE (POINTER IG)
433 !
434  IF( 7*(cfg%PRECON/ 7).EQ.cfg%PRECON.OR.
435  & 11*(cfg%PRECON/11).EQ.cfg%PRECON.OR.
436  & 13*(cfg%PRECON/13).EQ.cfg%PRECON.OR.
437  & 17*(cfg%PRECON/17).EQ.cfg%PRECON ) THEN
438  ig=it6
439  IF(2*(cfg%PRECON/2).NE.cfg%PRECON.AND.
440  & 3*(cfg%PRECON/3).NE.cfg%PRECON) THEN
441 ! SELECTS DIAGONAL
442  cfg%PRECON=2*cfg%PRECON
443  ENDIF
444  ELSE
445 ! NOTE IT5 =-1 IF CFG%SLV.EQ.7 BUT IN THIS CASE IG IS USELESS
446  ig=it5
447  ENDIF
448 !
449 ! END OF: MANAGES THE WORKING ARRAYS
450 !
451 !-----------------------------------------------------------------------
452 ! -1/2 -1/2 1/2 -1/2
453 ! DIAGONAL PRECONDITIONINGS : D A D D X = D B
454 !
455  diadon = .false.
456  prexsm = .true.
457 !
458  IF(3*(cfg%PRECON/3).EQ.cfg%PRECON.AND.(s.EQ.2.OR.s.EQ.3)) THEN
459 ! BLOCK-DIAGONAL PRECONDITIONING (4 OR 9 MATRICES)
460  CALL prebdt(x,a,b,tbb%ADR(it1)%P,mesh,prexsm,diadon,s)
461 ! DOES NOT MOFIFY D11, D22, D33 WHEN PRECDT IS CALLED
462  diadon = .true.
463  ENDIF
464 !
465  IF(2*(cfg%PRECON/2).EQ.cfg%PRECON.OR.
466  & 3*(cfg%PRECON/3).EQ.cfg%PRECON.OR.
467  & 5*(cfg%PRECON/5).EQ.cfg%PRECON) THEN
468  CALL precdt(x,a,b,tbb%ADR(it1)%P,mesh,
469  & cfg%PRECON,prexsm,diadon,s)
470  ENDIF
471 !
472 !-----------------------------------------------------------------------
473 !
474 ! BUILDS THE PRECONDITIONING MATRICES:
475 !
476  IF(7*(cfg%PRECON/7).EQ.cfg%PRECON) THEN
477  CALL dcpldu(aux,a,mesh,.true.,lv)
478  ELSEIF(11*(cfg%PRECON/11).EQ.cfg%PRECON) THEN
479  CALL gsebe(aux,a,mesh)
480  ELSEIF(13*(cfg%PRECON/13).EQ.cfg%PRECON) THEN
481 ! DOES NOTHING, AUX IS SUPPLIED BY THE SUBROUTINE CALLING
482  ELSEIF(17*(cfg%PRECON/17).EQ.cfg%PRECON) THEN
483  IF(cfg%SLV.NE.1.AND.cfg%SLV.NE.2) THEN
484  WRITE(lu,*) 'PRECONDITIONING 17'
485  WRITE(lu,*) 'NOT IMPLEMENTED FOR SOLVER ',cfg%SLV
486  CALL plante(1)
487  stop
488  ENDIF
489  IF(aux%TYPE.NE.3) THEN
490  WRITE(lu,*) 'PRECONDITIONING 17'
491  WRITE(lu,*) 'NOT IMPLEMENTED FOR BLOCKS OF MATRICES'
492  CALL plante(1)
493  stop
494  ENDIF
495 !
496  IF(aux%STO.EQ.1) THEN
497  CALL preverebe(aux%X%R,a%X%R,a%TYPDIA,a%TYPEXT,
498  & mesh%IKLE%I,mesh%NPOIN,mesh%NELEM,
499  & mesh%NELMAX,mesh,mesh%TYPELM)
500  ELSE
501  CALL preverseg(aux%X%R,a%D%R,a%X%R,a%TYPDIA,a%TYPEXT,
502  & mesh%NPOIN,mesh,mesh%NSEG,mesh%TYPELM)
503  ENDIF
504 !
505  ENDIF
506 !
507 !-----------------------------------------------------------------------
508 !
509 ! PARALLEL MODE: SECOND MEMBER
510 !
511  IF(ncsize.GT.1) THEN
512  IF (modass .EQ. 1) THEN
513  CALL parcom(b,2,mesh)
514  ELSEIF (modass .EQ. 3) THEN
515  CALL parcom_comp(b,b%E,2,mesh)
516  ENDIF
517  ENDIF
518  IF (modass .EQ.3)THEN
519  b%R=b%R+b%E
520  b%E=0.d0
521  ENDIF
522 !
523 !-----------------------------------------------------------------------
524 !
525 ! SOLVES THE LINEAR SYSTEM:
526 !
527  IF(cfg%SLV.EQ.1) THEN
528 !
529 ! CONJUGATE GRADIENT
530 !
531  CALL gracjg(px, a,pb, mesh,
532  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,
533  & tbb%ADR(it5)%P,tbb%ADR(ig)%P,
534  & cfg,infogr,aux)
535 !
536  ELSEIF(cfg%SLV.EQ.2) THEN
537 !
538 ! CONJUGATE RESIDUAL
539 !
540  CALL rescjg(px, a,pb, mesh,
541  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,
542  & tbb%ADR(it4)%P,tbb%ADR(it5)%P,
543  & tbb%ADR(ig)%P,
544  & cfg,infogr,aux)
545 !
546  ELSEIF(cfg%SLV.EQ.3) THEN
547 !
548 ! NORMAL EQUATION
549 !
550  CALL equnor(px, a,pb, mesh,
551  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,
552  & tbb%ADR(it4)%P,tbb%ADR(it5)%P,
553  & tbb%ADR(ig)%P,
554  & cfg,infogr,aux)
555 !
556  ELSEIF(cfg%SLV.EQ.4) THEN
557 !
558 ! MINIMUM ERROR
559 !
560  CALL errmin(px, a,pb, mesh,
561  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,tbb%ADR(it5)%P,
562  & tbb%ADR(ig)%P,
563  & cfg,infogr,aux)
564 !
565  ELSEIF(cfg%SLV.EQ.5) THEN
566 !
567 ! SQUARED CONJUGATE GRADIENT
568 !
569  CALL cgsqua(px, a,pb, mesh,
570  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,tbb%ADR(it4)%P,
571  & tbb%ADR(it5)%P,tbb%ADR(it6)%P,tbb%ADR(it7)%P,
572  & cfg,infogr)
573 !
574  ELSEIF(cfg%SLV.EQ.6) THEN
575 !
576 ! CGSTAB
577 !
578  CALL cgstab(px, a,pb, mesh,
579  & tbb%ADR(it2)%P,tbb%ADR(it3)%P,tbb%ADR(it4)%P,
580  & tbb%ADR(it5)%P,tbb%ADR(it6)%P,tbb%ADR(it7)%P,
581  & cfg,infogr,aux)
582 !
583  ELSEIF(cfg%SLV.EQ.7) THEN
584 !
585 ! GENERALISED MINIMUM RESIDUAL
586 !
587  CALL gmres(px, a,pb,mesh,
588  & tbb%ADR(it2)%P,tbb%ADR(ibl1)%P,tbb%ADR(ibl2)%P,
589  & cfg,infogr,aux)
590 !
591 !
592  ELSE
593 !
594  WRITE(lu,400) cfg%SLV
595 400 FORMAT(1x,'SOLVE (BIEF) :',1i6,' METHOD NOT AVAILABLE :')
596  CALL plante(1)
597  stop
598 !
599  ENDIF
600 !
601 !-----------------------------------------------------------------------
602 !
603 ! INVERSES THE CHANGE IN VARIABLE IF PRECONDITIONING
604 ! DIAGONAL
605 ! DIAGONAL-BLOCK
606 !
607  IF(2*(cfg%PRECON/2).EQ.cfg%PRECON.OR.
608  & 3*(cfg%PRECON/3).EQ.cfg%PRECON.OR.
609  & 5*(cfg%PRECON/5).EQ.cfg%PRECON ) THEN
610  CALL os('X=XY ', x=px, y=tbb%ADR(it1)%P)
611  ENDIF
612 !
613  IF(3*(cfg%PRECON/3).EQ.cfg%PRECON.AND.(s.EQ.2.OR.s.EQ.3)) THEN
614  CALL um1x(x,tbb%ADR(it1)%P,s)
615  ENDIF
616 !
617 !-----------------------------------------------------------------------
618 !
619  cfg%PRECON = presto
620 !
621 !-----------------------------------------------------------------------
622 !
623  RETURN
624  END
subroutine solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
Definition: solve.f:7
subroutine dcpldu(B, A, MESH, COPY, LV)
Definition: dcpldu.f:7
subroutine allblo(BLO, NOM)
Definition: allblo.f:7
subroutine cgsqua(X, A, B, MESH, G, G0, P, K, H, AHPK, CFG, INFOGR)
Definition: cgsqua.f:7
subroutine allblo_in_block(BLO, N, NOMGEN)
subroutine pre4_mumps(NPOIN, NSEGB, GLOSEGB, DAB1, DAB2, DAB3, DAB4, XAB1, XAB2, XAB3, XAB4, XX1, XX2, CVB1, CVB2, TYPEXT1, TYPEXT2, TYPEXT3, TYPEXT4, KNOLG, NPOIN_TOT)
Definition: pre4_mumps.F:9
subroutine sd_solve_1(NPOIN, NSEGB, GLOSEG, MAXSEG, DA, XA, XINC, RHS, INFOGR, TYPEXT)
Definition: sd_solve_1.f:7
subroutine um1x(X, D, S)
Definition: um1x.f:7
subroutine preverseg(XAUX, AD, AX, TYPDIA, TYPEXT, NPOIN, MESH, NSEG3D, TYPEMESH)
Definition: preverseg.f:7
subroutine parcom_comp(X, ERRX, ICOM, MESH)
Definition: parcom_comp.f:7
subroutine gracjg(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
Definition: gracjg.F:7
subroutine gmres(X, A, B, MESH, R0, V, AV, CFG, INFOGR, AUX)
Definition: gmres.f:7
subroutine preverebe(XAUX, AX, TYPDIA, TYPEXT, IKLE, NPOIN, NELEM, NELMAX, MESH, TYPEMESH)
Definition: preverebe.f:7
subroutine addblo(BLOC, OBJ)
Definition: addblo.f:7
subroutine rescjg(X, A, B, MESH, D, AD, AG, G, R, CFG, INFOGR, AUX)
Definition: rescjg.f:7
subroutine precdt(X, A, B, D, MESH, PRECON, PREXSM, DIADON, S)
Definition: precdt.f:7
subroutine cgstab(X, A, B, MESH, P, Q, R, S, T, V, CFG, INFOGR, AUX)
Definition: cgstab.f:7
type(bief_obj), target bx
subroutine prebdt(X, A, B, D, MESH, PREXSM, DIADON, S)
Definition: prebdt.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
subroutine errmin(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
Definition: errmin.f:7
subroutine equnor(X, A, B, MESH, D, AD, AG, G, R, CFG, INFOGR, AUX)
Definition: equnor.f:7
subroutine solaux(IPT, TB, TBB, ITB, ITBB, S)
Definition: solaux.f:7
subroutine gsebe(B, A, MESH)
Definition: gsebe.f:7
subroutine sd_solve_4(NPOIN, NSEGB, GLOSEGB, DAB1, DAB2, DAB3, DAB4, XAB1, XAB2, XAB3, XAB4, XX1, XX2, CVB1, CVB2, INFOGR, TYPEXT1, TYPEXT2, TYPEXT3, TYPEXT4)
Definition: sd_solve_4.f:8
type(bief_obj), target bb
Definition: bief.f:3