5 &(x, a,b,tb,cfg,infogr,mesh,aux)
153 TYPE(slvcfg),
INTENT(INOUT) :: CFG
157 TYPE(bief_obj),
TARGET,
INTENT(INOUT) :: X,B
158 TYPE(bief_obj),
INTENT(INOUT) :: TB
162 TYPE(bief_obj),
INTENT(INOUT) :: A,AUX
164 LOGICAL,
INTENT(IN) :: INFOGR
168 TYPE(bief_mesh),
INTENT(INOUT) :: MESH
172 INTEGER PRESTO,IG,LV,S,NBL,I
173 INTEGER IT1,IT2,IT3,IT4,IT5,IT6,IT7,IBL1,IBL2,K,IAD,ITB,ITBB
175 LOGICAL DIADON,PREXSM
184 TYPE(bief_obj),
POINTER :: PB,PX
197 IF(cfg%SLV.EQ.7) nbl = max(nbl,4+2*cfg%KRYLOV)
198 IF(nbl.GT.
tbb%N)
THEN 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)
230 ELSEIF(a%TYPE.EQ.4)
THEN 233 ELSEIF(a%N.EQ.4)
THEN 235 ELSEIF(a%N.EQ.9)
THEN 247 IF(cfg%SLV.EQ.8)
THEN 251 2019
FORMAT(1x,
'USE THE PARALLEL DIRECT SOLVER MUMPS,',/,1x,
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' 265 CALL sd_solve_1(a%D%DIM1,mesh%NSEG,mesh%GLOSEG%I,
267 & a%D%R,a%X%R,x%R,b%R,infogr,a%TYPEXT)
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' 275 CALL sd_solve_1(a%ADR(1)%P%D%DIM1,mesh%NSEG,mesh%GLOSEG%I,
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)
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)
292 401
FORMAT(1x,
'SOLVE (BIEF): S=',1i6,
' CASE NOT IMPLEMENTED')
298 ELSEIF(cfg%SLV.EQ.9)
THEN 307 3019
FORMAT(1x,
'MUMPS ARE NOT AVAILABLE FOR SEQUENTIAL RUNS,',/,1x,
308 &
'USE SEQUENITAL DIRECT SOLVER (SOLVER = 8) ',///)
318 npoin_tot=max(mesh%KNOLG%I(i),npoin_tot)
320 npoin_tot=
p_max(npoin_tot)
327 402
FORMAT(1x,
'SOLVE (BIEF): S=',1i6,1x,
328 &
'CASE NOT YET MPLEMENTED FOR MUMPS')
333 4011
FORMAT(1x,
'SOLVE (BIEF): S=',1i6,
' CASE NOT YET 334 & IMPLEMENTED FOR MUMPS')
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)
360 IF(cfg%PRECON.EQ.0) cfg%PRECON = 1
377 IF(3*(cfg%PRECON/3).EQ.cfg%PRECON)
THEN 387 IF(cfg%SLV.EQ.7)
THEN 397 DO i=1,
tbb%ADR(ibl1)%P%N
398 NULLIFY(
tbb%ADR(ibl1)%P%ADR(i)%P)
401 DO i=1,
tbb%ADR(ibl2)%P%N
402 NULLIFY(
tbb%ADR(ibl2)%P%ADR(i)%P)
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 439 IF(2*(cfg%PRECON/2).NE.cfg%PRECON.AND.
440 & 3*(cfg%PRECON/3).NE.cfg%PRECON)
THEN 442 cfg%PRECON=2*cfg%PRECON
458 IF(3*(cfg%PRECON/3).EQ.cfg%PRECON.AND.(s.EQ.2.OR.s.EQ.3))
THEN 460 CALL prebdt(x,a,b,
tbb%ADR(it1)%P,mesh,prexsm,diadon,s)
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 469 & cfg%PRECON,prexsm,diadon,s)
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 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
489 IF(aux%TYPE.NE.3)
THEN 490 WRITE(
lu,*)
'PRECONDITIONING 17' 491 WRITE(
lu,*)
'NOT IMPLEMENTED FOR BLOCKS OF MATRICES' 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)
501 CALL preverseg(aux%X%R,a%D%R,a%X%R,a%TYPDIA,a%TYPEXT,
502 & mesh%NPOIN,mesh,mesh%NSEG,mesh%TYPELM)
512 IF (modass .EQ. 1)
THEN 514 ELSEIF (modass .EQ. 3)
THEN 518 IF (modass .EQ.3)
THEN 527 IF(cfg%SLV.EQ.1)
THEN 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,
536 ELSEIF(cfg%SLV.EQ.2)
THEN 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,
546 ELSEIF(cfg%SLV.EQ.3)
THEN 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,
556 ELSEIF(cfg%SLV.EQ.4)
THEN 560 CALL errmin(px, a,pb, mesh,
561 &
tbb%ADR(it2)%P,
tbb%ADR(it3)%P,
tbb%ADR(it5)%P,
565 ELSEIF(cfg%SLV.EQ.5)
THEN 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,
574 ELSEIF(cfg%SLV.EQ.6)
THEN 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,
583 ELSEIF(cfg%SLV.EQ.7)
THEN 587 CALL gmres(px, a,pb,mesh,
588 &
tbb%ADR(it2)%P,
tbb%ADR(ibl1)%P,
tbb%ADR(ibl2)%P,
594 WRITE(
lu,400) cfg%SLV
595 400
FORMAT(1x,
'SOLVE (BIEF) :',1i6,
' METHOD NOT AVAILABLE :')
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)
613 IF(3*(cfg%PRECON/3).EQ.cfg%PRECON.AND.(s.EQ.2.OR.s.EQ.3))
THEN
subroutine solve(X, A, B, TB, CFG, INFOGR, MESH, AUX)
subroutine dcpldu(B, A, MESH, COPY, LV)
subroutine allblo(BLO, NOM)
subroutine cgsqua(X, A, B, MESH, G, G0, P, K, H, AHPK, CFG, INFOGR)
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)
subroutine sd_solve_1(NPOIN, NSEGB, GLOSEG, MAXSEG, DA, XA, XINC, RHS, INFOGR, TYPEXT)
subroutine preverseg(XAUX, AD, AX, TYPDIA, TYPEXT, NPOIN, MESH, NSEG3D, TYPEMESH)
subroutine parcom_comp(X, ERRX, ICOM, MESH)
subroutine gracjg(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
subroutine gmres(X, A, B, MESH, R0, V, AV, CFG, INFOGR, AUX)
subroutine preverebe(XAUX, AX, TYPDIA, TYPEXT, IKLE, NPOIN, NELEM, NELMAX, MESH, TYPEMESH)
subroutine addblo(BLOC, OBJ)
subroutine rescjg(X, A, B, MESH, D, AD, AG, G, R, CFG, INFOGR, AUX)
subroutine precdt(X, A, B, D, MESH, PRECON, PREXSM, DIADON, S)
subroutine cgstab(X, A, B, MESH, P, Q, R, S, T, V, CFG, INFOGR, AUX)
type(bief_obj), target bx
subroutine prebdt(X, A, B, D, MESH, PREXSM, DIADON, S)
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
subroutine parcom(X, ICOM, MESH)
subroutine errmin(X, A, B, MESH, D, AD, G, R, CFG, INFOGR, AUX)
subroutine equnor(X, A, B, MESH, D, AD, AG, G, R, CFG, INFOGR, AUX)
subroutine solaux(IPT, TB, TBB, ITB, ITBB, S)
subroutine gsebe(B, A, MESH)
subroutine sd_solve_4(NPOIN, NSEGB, GLOSEGB, DAB1, DAB2, DAB3, DAB4, XAB1, XAB2, XAB3, XAB4, XX1, XX2, CVB1, CVB2, INFOGR, TYPEXT1, TYPEXT2, TYPEXT3, TYPEXT4)
type(bief_obj), target bb