The TELEMAC-MASCARET system  trunk
diri01.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE diri01
3 ! *****************
4 !
5  &(f, s, sm ,fbor,limdir,work1,work2,mesh,kdir,msk,maskpt)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief TAKES INTO ACCOUNT POINTS OF TYPE DIRICHLET IN A SYSTEM
12 !+ OF LINEAR EQUATIONS WITH SYMMETRICAL MATRIX.
13 !+
14 !+ IN THE EQUATIONS FOR POINTS NOT OF TYPE DIRICHLET :
15 !+ DIRICHLET VALUES ARE REMOVED.
16 !+
17 !+ IN THE EQUATIONS FOR POINTS OF TYPE DIRICHLET :
18 !+ DEFINES AN EQUATION FIXING THE IMPOSED VALUE.
19 !
20 !warning THIS SUBROUTINE IS NOT PROTECTED AGAINST DIAGONAL EQUAL
21 !+ TO 0 ON DIRICHLET POINTS; IT WILL THEN SET AN EQUATION
22 !+ 0 X = 0 ON SUCH POINTS
23 !
24 !history J-M HERVOUET (LNHE)
25 !+ 07/08/2009
26 !+ V6P0
27 !+
28 !
29 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
30 !+ 13/07/2010
31 !+ V6P0
32 !+ Translation of French comments within the FORTRAN sources into
33 !+ English comments
34 !
35 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
36 !+ 21/08/2010
37 !+ V6P0
38 !+ Creation of DOXYGEN tags for automated documentation and
39 !+ cross-referencing of the FORTRAN sources
40 !
41 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
42 !| F |<->| VALUES AT TIME N+1 AND INITIALISATION
43 !| FBOR |-->| DIRICHLET BOUNDARY CONDITIONS
44 !| KDIR |-->| CONVENTION FOR DIRICHLET BOUNDARY CONDITIONS
45 !| LIMDIR |-->| TYPES OF BOUNDARY CONDITIONS
46 !| | | IF LIMDIR(K) = KDIR LE 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 !| S |<->| MATRIX OF THE LINEAR SYSTEM
53 !| SM |-->| RIGHT HAND SIDE
54 !| WORK1 |<->| WORK ARRAY
55 !| WORK2 |<->| WORK ARRAY
56 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57 !
58  USE bief, ex_diri01 => diri01
59 !
61  IMPLICIT NONE
62 !
63 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
64 !
65  TYPE(bief_obj), INTENT(INOUT) :: F,S,SM,WORK1,WORK2
66  TYPE(bief_obj), INTENT(IN) :: FBOR,MASKPT
67  INTEGER, INTENT(IN) :: LIMDIR(*), KDIR
68  TYPE(bief_mesh), INTENT(INOUT) :: MESH
69  LOGICAL, INTENT(IN) :: MSK
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  DOUBLE PRECISION C
74 !
75  INTEGER IELMSM,IELMFB
76 !
77  CHARACTER(LEN=1) OLDDIA
78 !
79 !----------------------------------------------------------------------
80 !
81 ! DEPLOYS THE MESH STRUCTURE
82 !
83 !----------------------------------------------------------------------
84 !
85 ! BUILDS AN ARRAY WITH 0S EVERYWHERE EXCEPT AT DIRICHLET POINTS
86 ! FOR WHICH THE VALUE IS TAKEN FROM FBOR
87 ! FBOR MUST BE 0 WHEN THE POINT IS NOT OF TYPE DIRICHLET
88 !
89  CALL cpstvc(sm,work1)
90 !
91  ielmsm=sm%ELM
92  ielmfb=fbor%ELM
93  IF(ielmsm.EQ.ielmfb) THEN
94  CALL matvec( 'X=AY ' ,work2,s,fbor,c, mesh )
95  ELSE
96  CALL os( 'X=0 ' , x=work1 )
97  CALL osdbif( 'X=Y ' ,work1,fbor,limdir,kdir,mesh)
98  CALL matvec( 'X=AY ' ,work2,s,work1,c, mesh )
99  ENDIF
100 !
101 !----------------------------------------------------------------------
102 !
103 ! THE PRODUCT S WORK1 IS DEDUCTED FROM THE SECOND MEMBER.
104 ! IT MEANS THAT THE VALUES AT DIRICHLET POINTS ARE NO LONGER
105 ! UNKNOWNS IN THE EQUATIONS FOR THE OTHER POINTS.
106 !
107  CALL os( 'X=X-Y ' , x=sm , y=work2 )
108 !
109 !----------------------------------------------------------------------
110 !
111 ! BUILDS AN ARRAY WITH 1S EVERYWHERE EXCEPT AT DIRICHLET POINTS
112 ! FOR WHICH IT'S 0
113 !
114 ! WHAT'S MORE, AN EQUATION OF THE FORM DS(N) * X = DS(N) * FBOR
115 ! (WILL GIVE X=FBOR) IS SET IN THE MATRIX FOR DIRICHLET POINTS;
116 ! AND F IS INITIALISED TO ITS KNOWN VALUE.
117 ! THIS ASSUMES THAT DS(N) IS NOT 0
118 !
119  CALL diraux(sm,s%D,fbor,work2,f,limdir,kdir,mesh )
120 !
121 ! MASKING : FOR THE POINTS OF MASKED ELEMENTS THE EQUATION X=0
122 ! IS SET FOR THE DIAGONAL COEFFICIENT PRES
123 !
124  IF(msk) THEN
125  CALL ov('X=XY ', x=sm%R , y=maskpt%R, dim1=sm%DIM1)
126  CALL ov('X=XY ', x=f%R , y=maskpt%R, dim1=f%DIM1)
127  CALL ov('X=XY ', x=work2%R, y=maskpt%R, dim1=work2%DIM1)
128  ENDIF
129 !
130 !----------------------------------------------------------------------
131 !
132 ! WORK2 * S * WORK2 :
133 ! ERASES THE LINES AND COLUMNS IN S WHICH CORRESPOND TO DIRICHLET
134 ! POINTS
135 ! DOES NOT ALTER THE DIAGONAL BY DECLARING IT 0 HERE
136 !
137  olddia=s%TYPDIA
138  s%TYPDIA='0'
139  CALL om('M=DMD ', m=s, d=work2, mesh=mesh)
140  s%TYPDIA=olddia
141 !
142 !----------------------------------------------------------------------
143 !
144  RETURN
145  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 diri01(F, S, SM, FBOR, LIMDIR, WORK1, WORK2, MESH, KDIR, MSK, MASKPT)
Definition: diri01.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 matvec(OP, X, A, Y, C, MESH, LEGO)
Definition: matvec.f:7
Definition: bief.f:3