The TELEMAC-MASCARET system  trunk
precd1.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE precd1
3 ! *****************
4 !
5  &(x,a,b,d,mesh,precon,prexsm,diadon)
6 !
7 !***********************************************************************
8 ! BIEF V7P1
9 !***********************************************************************
10 !
11 !brief DIAGONAL PRECONDITIONING OF A SYSTEM A X = B
12 !+ (SEE EXPLANATIONS IN PRECDT).
13 !+
14 !+ A IS A SIMPLE MATRIX HERE.
15 !
16 !history J-M HERVOUET (LNHE)
17 !+ 06/07/2009
18 !+ V5P0
19 !+ First version (of the header...)
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (LNHE)
34 !+ 08/12/2015
35 !+ V7P1
36 !+ Rebuilding the diagonal with MESH%IFAC in parallel in case of
37 !+ diagonal preconditioning and DIADON=FALSE.
38 !+ Correction of a bug in parallel with preconditioning 5.
39 !
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !| A |-->| BLOCK OF MATRICES
42 !| B |-->| BLOCK OF RIGHT-HAND SIZES
43 !| D |<--| BLOCK OF DIAGONALS
44 !| DIADON |-->| .TRUE. : DIAGONALS ARE GIVEN
45 !| MESH |-->| MESH STRUCTURE
46 !| PRECON |-->| CHOICE OF PRECONDITIONING
47 !| PREXSM |-->| .TRUE. : PRECONDITIONING X AND B
48 !| X |<->| BLOCK OF UNKNOWN VECTORS IN THE SYSTEM
49 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
50 !
51  USE bief, ex_precd1 => precd1
52 !
54  IMPLICIT NONE
55 !
56 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57 !
58  INTEGER, INTENT(IN) :: PRECON
59  LOGICAL, INTENT(IN) :: PREXSM,DIADON
60 !
61 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 !
63 ! VECTOR STRUCTURES
64 !
65  TYPE(bief_obj), INTENT(INOUT) :: X,B,D
66 !
67 !-----------------------------------------------------------------------
68 !
69 ! MATRIX STRUCTURES
70 !
71  TYPE(bief_obj), INTENT(INOUT) :: A
72 !
73 !-----------------------------------------------------------------------
74 !
75 ! MESH STRUCTURE
76 !
77  TYPE(bief_mesh), INTENT(INOUT) :: MESH
78 !
79 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
80 !
81  INTEGER I
82 !
83 !-----------------------------------------------------------------------
84 !
85 ! PREPARES THE DIAGONALS:
86 !
87  IF(.NOT.diadon) THEN
88 !
89  CALL os( 'X=Y ' , x=d , y=a%D )
90 !
91 ! PARALLEL MODE: COMPLETE DIAGONAL BEFORE GOING FURTHER
92 !
93  IF(ncsize.GT.1) THEN
94  CALL parcom(d,2,mesh)
95  ENDIF
96 !
97 ! POSSIBLY TAKING THE ABSOLUTE VALUES
98 !
99  IF(precon.EQ.5) THEN
100  CALL os( 'X=ABS(Y)' , x=d , y=d )
101  ENDIF
102 !
103 ! TAKING THE SQUARE ROOT
104 !
105  CALL os( 'X=SQR(Y)' , x=d , y=d )
106 !
107 !-----------------------------------------------------------------------
108 ! -1
109 ! CHANGE OF VARIABLES (D ACTUALLY HOLDS D )
110 !
111  IF(prexsm) CALL os( 'X=XY ' , x=x , y=d )
112 !
113 !-----------------------------------------------------------------------
114 !
115 ! COMPUTES THE INVERSE OF THE SQUARE ROOTS OF THE DIAGONALS
116 ! THIS GIVES BACK TRUE D AND NOT D INVERTED
117 !
118  CALL os('X=1/Y ', x=d, y=d, iopt=2, infini=1.d0, zero=1.d-10)
119 !
120  ELSE
121 !
122 ! CASE WHERE D IS GIVEN, CHANGE OF VARIABLES
123 ! CHANGE OF VARIABLE (D REALLY HOLDS D)
124 !
125  IF(prexsm) THEN
126  CALL os('X=Y/Z ' , x=x , y=x , z=d)
127  ENDIF
128 !
129  ENDIF
130 !
131 !=======================================================================
132 ! PRECONDITIONING OF A:
133 !=======================================================================
134 !
135  CALL om('M=DMD ', m=a, d=d, mesh=mesh)
136 ! IF PRECON = 2 OR 3
137  IF((2*(precon/2).EQ.precon.OR.3*(precon/3).EQ.precon).AND.
138  & .NOT.diadon) THEN
139 ! VALID ONLY WITH ONE SINGLE DOMAIN
140  IF(ncsize.LE.1.OR.nptir.EQ.0) THEN
141  a%TYPDIA='I'
142  ELSE
143 ! HERE THE DIAGONAL IS REDONE WITH IFAC, SO THAT A MATRIX-VECTOR
144 ! PRODUCT WILL LEAD TO A SUM OF THE SAME NUMBERS (BUT POSSIBLY
145 ! NOT IN THE SAME ORDER). OTHERWISE IT IS NOT SURE THAT THE
146 ! ASSEMBLED DIAGONAL WOULD GIVE EXACT 1.D0.
147  DO i=1,a%D%DIM1
148  a%D%R(i)=mesh%IFAC%I(i)
149  ENDDO
150  ENDIF
151  ENDIF
152 !
153 !=======================================================================
154 !
155 ! PRECONDITIONING OF THE SECOND MEMBER
156 !
157  IF(prexsm) CALL os( 'X=XY ' , x=b , y=d )
158 !
159 !=======================================================================
160 !
161  RETURN
162  END
163 
subroutine om(OP, M, N, D, C, MESH)
Definition: om.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine precd1(X, A, B, D, MESH, PRECON, PREXSM, DIADON)
Definition: precd1.f:7
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
Definition: bief.f:3