The TELEMAC-MASCARET system  trunk
diri04.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE diri04
3 ! *****************
4 !
5  &(x1,x2,a11,a12,a21,a22,sm1,sm2,t1,t2,t3,t4,
6  & xbor1,xbor2,lidir1,lidir2,mesh,kdir,msk,maskpt)
7 !
8 !***********************************************************************
9 ! BIEF V6P1 21/08/2010
10 !***********************************************************************
11 !
12 !brief TREATS THE DIRICHLET POINTS FOR THE FOLLOWING
13 !+ SYSTEM (BLOCK OF 4 MATRICES):
14 !code
15 !+ ( A11 A12 ) ( X1 ) ( SM1 )
16 !+ ( ) ( ) = ( )
17 !+ ( A21 A22 ) ( X2 ) ( SM2 )
18 !
19 !history J-M HERVOUET (LNH)
20 !+ 30/01/95
21 !+ V5P1
22 !+
23 !
24 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
25 !+ 13/07/2010
26 !+ V6P0
27 !+ Translation of French comments within the FORTRAN sources into
28 !+ English comments
29 !
30 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
31 !+ 21/08/2010
32 !+ V6P0
33 !+ Creation of DOXYGEN tags for automated documentation and
34 !+ cross-referencing of the FORTRAN sources
35 !
36 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
37 !| A12 |<->| MATRIX IN THE 2x2 LINEAR SYSTEM
38 !| A12 |<->| MATRIX IN THE 2x2 LINEAR SYSTEM
39 !| A21 |<->| MATRIX IN THE 2x2 LINEAR SYSTEM
40 !| A22 |<->| MATRIX IN THE 2x2 LINEAR SYSTEM
41 !| KDIR |-->| CONVENTION FOR DIRICHLET BOUNDARY CONDITIONS
42 !| LIDIR1 |-->| TYPES OF BOUNDARY CONDITIONS FOR VARIABLE 1
43 !| | | IF LIMDIR(K) = KDIR THE KTH BOUNDARY POINT
44 !| | | IS OF DIRICHLET TYPE.
45 !| LIDIR2 |-->| TYPES OF BOUNDARY CONDITIONS FOR VARIABLE 2
46 !| | | IF LIMDIR(K) = KDIR THE KTH BOUNDARY POINT
47 !| | | IS OF DIRICHLET TYPE.
48 !| MASKPT |-->| MASKING PER POINT.
49 !| | | =1. : NORMAL =0. : MASKED
50 !| MESH |-->| MESH STRUCTURE
51 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
52 !| SM1 |-->| FIRST RIGHT-HAND SIDE OF THE SYSTEM.
53 !| SM2 |-->| SECOND RIGHT-HAND SIDE OF THE SYSTEM.
54 !| T1 |<->| WORK DOUBLE PRECISION ARRAY IN A BIEF_OBJ
55 !| T2 |<->| WORK DOUBLE PRECISION ARRAY IN A BIEF_OBJ
56 !| T3 |<->| WORK DOUBLE PRECISION ARRAY IN A BIEF_OBJ
57 !| T4 |<->| WORK DOUBLE PRECISION ARRAY IN A BIEF_OBJ
58 !| XBOR1 |-->| DIRICHLET BOUNDARY CONDITIONS OF VARIABLE 1
59 !| XBOR2 |-->| DIRICHLET BOUNDARY CONDITIONS OF VARIABLE 2
60 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
61 !
62  USE bief, ex_diri04 => diri04
63 !
65  IMPLICIT NONE
66 !
67 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 !
69  TYPE(bief_obj), INTENT(INOUT) :: X1,X2,SM1,SM2,T1,T2,T3,T4
70  TYPE(bief_obj), INTENT(INOUT) :: A11,A12,A21,A22
71  TYPE(bief_obj), INTENT(IN) :: XBOR1,XBOR2,MASKPT
72  INTEGER, INTENT(IN) :: KDIR,LIDIR1(*),LIDIR2(*)
73  TYPE(bief_mesh), INTENT(INOUT):: MESH
74  LOGICAL, INTENT(IN) :: MSK
75 !
76 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
77 !
78  DOUBLE PRECISION C
79 !
80  CHARACTER(LEN=1) STODIA
81 !
82 !-----------------------------------------------------------------------
83 !
84 ! 1) BUILDS ARRAYS T1,T2 CONTAINING:
85 ! THE X1 AND X2 IMPOSED VALUES IF THE POINT IS OF TYPE DIRICHLET
86 ! 0 OTHERWISE
87 !
88 ! X1,X2 3 TAKE THEIR DIRICHLET VALUE
89 !
90 !=======================================================================
91 !
92 ! BOUNDARY CONDITION FOR X1 : "XBOR1" IMPOSED
93 !
94  CALL cpstvc(x1,t1)
95  CALL os('X=C ', x=t1, c=0.d0)
96  CALL osdbif ( 'X=Y ',t1,xbor1,lidir1,kdir,mesh)
97 !
98 !-----------------------------------------------------------------------
99 !
100 ! BOUNDARY CONDITIONS FOR X2 : "XBOR2" IMPOSED
101 !
102  CALL cpstvc(x2,t2)
103  CALL os ('X=C ', x=t2, c=0.d0)
104  CALL osdbif ( 'X=Y ',t2,xbor2,lidir2,kdir,mesh)
105 !
106 !=======================================================================
107 !
108 ! 2) COMPUTES THE PRODUCT OF THE MATRIX FOR THE SYSTEM TO SOLVE
109 ! AND T1,T2
110 ! THE RESULT IS DEDUCTED FROM THE SECOND MEMBERS
111 !
112  CALL matvec('X=AY ',t3,a11,t1,c,mesh,lego=.false.)
113  CALL matvec('X=X+AY ',t3,a12,t2,c,mesh,lego=.true. )
114  CALL matvec('X=AY ',t4,a21,t1,c,mesh,lego=.false.)
115  CALL matvec('X=X+AY ',t4,a22,t2,c,mesh,lego=.true. )
116 !
117  CALL cpstvc(x1,sm1)
118  CALL cpstvc(x2,sm2)
119  CALL os('X=X-Y ', x=sm1, y=t3)
120  CALL os('X=X-Y ', x=sm2, y=t4)
121 !
122 !=======================================================================
123 !
124 ! SECOND MEMBERS OF THE EQUATIONS FOR DIRICHLET POINTS
125 ! PREPARES THE LINEAR SYSTEM
126 !
127  CALL diraux(sm1,a11%D,xbor1,t1,x1,lidir1,kdir,mesh )
128  CALL diraux(sm2,a22%D,xbor2,t2,x2,lidir2,kdir,mesh )
129 !
130  IF(msk) THEN
131  CALL ov('X=XY ', x=sm1%R, y=maskpt%R, dim1=sm1%DIM1)
132  CALL ov('X=XY ', x=x1%R, y=maskpt%R, dim1=x1%DIM1)
133  CALL ov('X=XY ', x=t1%R, y=maskpt%R, dim1=t1%DIM1)
134  CALL ov('X=XY ', x=sm2%R, y=maskpt%R, dim1=sm2%DIM1)
135  CALL ov('X=XY ', x=x2%R, y=maskpt%R, dim1=x2%DIM1)
136  CALL ov('X=XY ', x=t2%R, y=maskpt%R, dim1=t2%DIM1)
137  ENDIF
138 !
139 !=======================================================================
140 !
141 ! ERASES THE LINES AND COLUMNS FOR DIRICHLET POINTS
142 !
143 ! IT'S EQUIVALENT TO A DIAGONAL PRECONDITIONING WITH ARRAYS
144 ! T1,T2,T3
145 !
146 ! DOES NOT ALTER A11,A22,A33 DIAGONALS
147 ! BY GIVING THEM A DUMMY TYPE : '0'
148 !
149 !
150 !=======================================================================
151 ! A11 PRECONDITIONING :
152 !=======================================================================
153 !
154  stodia = a11%TYPDIA
155  a11%TYPDIA='0'
156  CALL om('M=DMD ', m=a11, d=t1, mesh=mesh)
157  a11%TYPDIA=stodia
158 !
159 !=======================================================================
160 ! A12 PRECONDITIONING :
161 !=======================================================================
162 !
163  CALL om('M=DM ', m=a12, d=t1, mesh=mesh)
164  CALL om('M=MD ', m=a12, d=t2, mesh=mesh)
165 !
166 !=======================================================================
167 ! A21 PRECONDITIONING :
168 !=======================================================================
169 !
170  CALL om('M=DM ', m=a21, d=t2, mesh=mesh)
171  CALL om('M=MD ', m=a21, d=t1, mesh=mesh)
172 !
173 !=======================================================================
174 ! A22 PRECONDITIONING :
175 !=======================================================================
176 !
177  stodia = a22%TYPDIA
178  a22%TYPDIA='0'
179  CALL om('M=DMD ', m=a22, d=t2, mesh=mesh)
180  a22%TYPDIA=stodia
181 !
182 !-----------------------------------------------------------------------
183 !
184  RETURN
185  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine diraux(X, Y, Z, W, F, INDIC, CRITER, MESH)
Definition: diraux.f:7
subroutine om(OP, M, N, D, C, MESH)
Definition: om.f:7
subroutine osdbif(OP, X, Y, INDIC, CRITER, MESH)
Definition: osdbif.f:7
subroutine cpstvc(X, Y)
Definition: cpstvc.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine diri04(X1, X2, A11, A12, A21, A22, SM1, SM2, T1, T2, T3, T4, XBOR1, XBOR2, LIDIR1, LIDIR2, MESH, KDIR, MSK, MASKPT)
Definition: diri04.f:8
subroutine matvec(OP, X, A, Y, C, MESH, LEGO)
Definition: matvec.f:7
Definition: bief.f:3