The TELEMAC-MASCARET system  trunk
matrix.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE matrix
3 ! *****************
4 !
5  &(m,op,formul,ielm1,ielm2,xmul,f,g,h,u,v,w,mesh,msk,maskel)
6 !
7 !***********************************************************************
8 ! BIEF V6P3 21/08/2010
9 !***********************************************************************
10 !
11 !brief OPERATIONS BETWEEN MATRICES.
12 !+
13 !+ THE MATRIX IS IDENTIFIED BY THE FORMULATION IN
14 !+ CHARACTER STRING FORMUL.
15 !code
16 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES HOW M IS
17 !+ MODIFIED. THE SYNTAX IS THE SAME AS THAT OF OM, FOR EXAMPLE.
18 !+
19 !+ OP='M=N '
20 !+ OP='M=TN '
21 !+ OP='M=M+N '
22 !+ OP='M=M+TN '
23 !+
24 !+ ALL THE OPERATIONS IN OM WHICH HAVE N ON THE RIGHT OF THE
25 !+ = SIGN ARE VALID.
26 !
27 !code
28 !+-----------------------------------------------------------------------
29 !+ MEANING OF IELM AND IELM2
30 !+
31 !+ TYPE OF ELEMENT NUMBER OF POINTS
32 !+
33 !+ 10 : P0 TRIANGLE 1
34 !+ 11 : P1 TRIANGLE 3
35 !+ 12 : QUASI-BUBBLE TRIANGLE 4
36 !+
37 !+ 20 : Q0 QUADRILATERAL 1
38 !+ 21 : Q1 QUADRILATERAL 4
39 !+
40 !+ 40 : TELEMAC-3D P0 PRISMS 1
41 !+ 41 : TELEMAC-3D P1 PRISMS 6
42 !+
43 !+-----------------------------------------------------------------------
44 !
45 !history J-M HERVOUET (EDF R&D, LNHE)
46 !+ 25/06/2008
47 !+
48 !+ DOES NOT CALL MATRIY IF NUMBER OF ELEMENTS IS 0
49 !
50 !history J-M HERVOUET (EDF R&D, LNHE)
51 !+ 14/10/2009
52 !+ V6P0
53 !+ ARGUMENTS ADDED TO ASSEX3
54 !
55 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
56 !+ 13/07/2010
57 !+ V6P0
58 !+ Translation of French comments within the FORTRAN sources into
59 !+ English comments
60 !
61 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
62 !+ 21/08/2010
63 !+ V6P0
64 !+ Creation of DOXYGEN tags for automated documentation and
65 !+ cross-referencing of the FORTRAN sources
66 !
67 !history J-M HERVOUET (EDF R&D, LNHE)
68 !+ 11/01/2013
69 !+ V6P3
70 !+ Arguments added to MATRIY
71 !
72 !history J-M HERVOUET (EDF LAB, LNHE)
73 !+ 13/03/2014
74 !+ V7P0
75 !+ Cases where there is no boundary element secured.
76 !
77 !history R.NHEILI (Univerte de Perpignan, DALI)
78 !+ 24/02/2016
79 !+ V7P3
80 !+ ADD MODASS=3
81 !
82 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83 !| F |-->| FUNCTION USED IN THE FORMULA
84 !| FORMUL |-->| FORMULA DESCRIBING THE RESULTING MATRIX
85 !| G |-->| FUNCTION USED IN THE FORMULA
86 !| H |-->| FUNCTION USED IN THE FORMULA
87 !| IELM1 |-->| TYPE OF ELEMENT FOR LINES
88 !| IELM2 |-->| TYPE OF ELEMENT FOR COLUMNS
89 !| M |<->| MATRIX TO BE BUILT OR MODIFIED
90 !| MASKEL |-->| MASKING OF ELEMENTS
91 !| | | =1. : NORMAL =0. : MASKED ELEMENT
92 !| MESH |-->| MESH STRUCTURE
93 !| MSK |-->| IF YES, THERE IS MASKED ELEMENTS.
94 !| OP |-->| OPERATION TO BE DONE. IF '=' THEN M=...
95 !| | | IF '+' THEN M=M+
96 !| U |-->| FUNCTION USED IN THE FORMULA (COMPONENT OF VECTOR)
97 !| V |-->| FUNCTION USED IN THE FORMULA (COMPONENT OF VECTOR)
98 !| W |-->| FUNCTION USED IN THE FORMULA (COMPONENT OF VECTOR)
99 !| XMUL |-->| COEFFICIENT FOR MULTIPLICATION
100 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
101 !
102  USE bief, ex_matrix => matrix
103  USE declarations_telemac, ONLY : modass
104 !
106  IMPLICIT NONE
107 !
108 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
109 !
110  INTEGER, INTENT(IN) :: IELM1,IELM2
111 !
112  DOUBLE PRECISION, INTENT(IN) :: XMUL
113 !
114  LOGICAL, INTENT(IN) :: MSK
115 !
116  CHARACTER(LEN=16), INTENT(IN) :: FORMUL
117  CHARACTER(LEN=8), INTENT(IN) :: OP
118 !
119  TYPE(bief_obj), INTENT(IN) :: F,G,H,U,V,W,MASKEL
120  TYPE(bief_obj), INTENT(INOUT) :: M
121  TYPE(bief_mesh), INTENT(INOUT) :: MESH
122 !
123 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
124 !
125  INTEGER NELMAX,NELEM,NPT,SS,I
126  INTEGER, DIMENSION(:), POINTER :: IKLE
127  INTEGER, DIMENSION(:), POINTER :: ELTSEG,ORISEG
128  DOUBLE PRECISION C
129  LOGICAL LEGO
130 !
131 !-----------------------------------------------------------------------
132 !
133 ! STORES 1 FOR THE WROKING ARRAY
134 ! CAN BE MODIFIED BY ASSEXT THEREAFTER
135 !
136  mesh%M%STO = 1
137 !
138 !-----------------------------------------------------------------------
139 ! CALLS THE SHUNTING AND ASSEMBLY SUBROUTINE : MATRIY
140 !-----------------------------------------------------------------------
141 !
142 ! LEGO CAN BE MODIFIED BY MATRIY
143  lego = .true.
144 !
145  IF(dimens(ielm1).EQ.mesh%DIM1) THEN
146 ! NORMAL MATRIX
147  nelem = mesh%NELEM
148  nelmax = mesh%NELMAX
149  ikle =>mesh%IKLE%I
150  eltseg=>mesh%ELTSEG%I
151  oriseg=>mesh%ORISEG%I
152  IF (modass .EQ.3) THEN
153  DO i=1, mesh%M%D%DIM1
154  mesh%M%D%E=0.d0
155  ENDDO
156  ENDIF
157  ELSE
158 ! BOUNDARY MATRIX
159  nelem = mesh%NELEB
160  nelmax = mesh%NELEBX
161  ikle =>mesh%IKLBOR%I
162  eltseg=>mesh%ELTSEGBOR%I
163  oriseg=>mesh%ORISEGBOR%I
164  ENDIF
165 !
166 ! MATRIY FILLS THE DIAGONAL AND EXTRA DIAGONAL TERMS
167 !
168 ! REFLECTS CHOICE OF PRE-ASSEMBLY STORAGE
169  IF(m%STO.EQ.1.OR.m%STO.EQ.3) THEN
170  ss = 1
171  ELSEIF(m%STO.EQ.2) THEN
172  ss = 2
173  ELSE
174  WRITE(lu,*) 'UNKNOWN STORAGE IN MATRIX'
175  CALL plante(1)
176  stop
177  ENDIF
178 !
179  IF(nelem.GT.0) THEN
180  CALL matriy(formul,mesh%M%X%R,
181  & mesh%M%TYPDIA,mesh%M%TYPEXT,
182  & xmul,f,g,h,u,v,w,
183  & f%R,g%R,h%R,u%R,v%R,w%R,
184  & mesh%W%R,lego,
185  & mesh%XEL%R,mesh%YEL%R,mesh%ZEL%R,
186  & mesh%X%R,mesh%Y%R,mesh%Z%R,
187  & mesh%SURFAC%R,mesh%LGSEG%R,
188  & mesh%IKLE%I,mesh%IKLBOR%I,mesh%NBOR%I,
189  & mesh%NELBOR%I,mesh%NULONE%I,
190  & mesh%NELEM,mesh%NELMAX,
191  & mesh%NELEB,mesh%NELEBX,ielm1,ielm2,ss,
192  & mesh%NPOIN/bief_nbpts(11,mesh),mesh,nelmax,
193  & mesh%M%STOX)
194  ENDIF
195 !
196 ! UPDATES THE INFORMATION OF THE MATRIX
197 !
198  npt = bief_nbpts(min(ielm1,ielm2),mesh)
199 !
200  IF(npt.GT.mesh%M%D%MAXDIM1) THEN
201  WRITE(lu,501) mesh%M%NAME
202  WRITE(lu,2001) ielm1
203  WRITE(lu,3001) ielm2
204  CALL plante(1)
205  stop
206  ENDIF
207 !
208  mesh%M%D%ELM = min(ielm1,ielm2)
209  mesh%M%D%DIM1 = npt
210  mesh%M%ELMLIN = ielm1
211  mesh%M%ELMCOL = ielm2
212 !
213 ! ASSEMBLES THE DIAGONAL (POSSIBLY)
214 !
215  IF(lego.AND.mesh%M%TYPDIA.EQ.'Q'.AND.nelem.GT.0) THEN
216 !
217  IF (modass .EQ.3) THEN
218  CALL assvec(mesh%M%D%R,
219  & ikle,npt,nelem,nelmax,
220  & mesh%W%R,lego,mesh%LV,msk,maskel%R,
221  & bief_nbpel(mesh%M%D%ELM,mesh),mesh%M%D%E)
222 !
223  ELSE
224  CALL assvec(mesh%M%D%R,
225  & ikle,npt,nelem,nelmax,
226  & mesh%W%R,lego,mesh%LV,msk,maskel%R,
227  & bief_nbpel(mesh%M%D%ELM,mesh))
228  ENDIF
229 !
230  ENDIF
231 !
232 ! MASKS EXTRA-DIAGONAL TERMS (POSSIBLY)
233 !
234  IF(msk.AND.nelem.GT.0) THEN
235  CALL om('M=MSK(M)',m=mesh%M,n=mesh%M,d=maskel,mesh=mesh)
236  ENDIF
237 !
238 ! ASSEMBLES EXTRA-DIAGONAL TERMS (POSSIBLY)
239 !
240  IF(m%STO.EQ.3) THEN
241 ! COPIES THE DIAGONAL
242  CALL os('X=Y ',x=mesh%MSEG%D,y=mesh%M%D)
243  mesh%MSEG%TYPDIA(1:1)='Q'
244 ! ASSEMBLES EXTRA-DIAGONAL TERMS
245  IF(mesh%M%TYPEXT.EQ.'Q'.OR.mesh%M%TYPEXT.EQ.'S') THEN
246 !
247 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
248 !
249 ! CASE OF MATRICES WITH INVERTED STORAGE OF OFF-DIAGONAL TERMS
250 ! SEE INVERSION OF DIM1_EXT AND DIM2_EXT IN CALL TO ASSEX3
251 !
252 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
253 !
254  IF(mesh%M%STOX.EQ.2) THEN
255  CALL assex3(mesh%MSEG%X%R,mesh%M%STO,mesh%M%NAME,
256  & mesh%M%ELMLIN,mesh%M%ELMCOL,
257  & mesh%M%TYPEXT,mesh%M%X%R,
258  & bief_dim2_ext(ielm1,ielm2,mesh%M%STO,
259  & mesh%M%TYPEXT,mesh),
260  & bief_dim1_ext(ielm1,ielm2,mesh%M%STO,
261  & mesh%M%TYPEXT,mesh),
262  & mesh%M%STOX,
263  & mesh,nelmax,eltseg,oriseg)
264  ELSEIF(mesh%M%STOX.EQ.1) THEN
265  CALL assex3(mesh%MSEG%X%R,mesh%M%STO,mesh%M%NAME,
266  & mesh%M%ELMLIN,mesh%M%ELMCOL,
267  & mesh%M%TYPEXT,mesh%M%X%R,
268  & bief_dim1_ext(ielm1,ielm2,mesh%M%STO,
269  & mesh%M%TYPEXT,mesh),
270  & bief_dim2_ext(ielm1,ielm2,mesh%M%STO,
271  & mesh%M%TYPEXT,mesh),
272  & mesh%M%STOX,
273  & mesh,nelmax,eltseg,oriseg)
274  ELSE
275  WRITE(lu,*) 'MATRIX: UNKNOWN STORAGE:'
276  WRITE(lu,*) 'MESH%M%STOX= : ',mesh%M%STOX
277  CALL plante(1)
278  stop
279  ENDIF
280  ENDIF
281  mesh%MSEG%TYPEXT=mesh%M%TYPEXT
282  mesh%MSEG%ELMLIN = ielm1
283  mesh%MSEG%ELMCOL = ielm2
284  mesh%MSEG%D%ELM = min(ielm1,ielm2)
285  mesh%MSEG%D%DIM1 = npt
286  mesh%MSEG%X%DIM1 = bief_dim1_ext(ielm1,ielm2,m%STO,
287  & mesh%MSEG%TYPEXT,mesh)
288  mesh%MSEG%X%DIM2 = bief_dim2_ext(ielm1,ielm2,m%STO,
289  & mesh%MSEG%TYPEXT,mesh)
290  ENDIF
291 !
292 ! DIMENSIONS OF THE ARRAY WITH EXTRADIAGONAL TERMS
293 ! BEWARE M%STO (NOT MESH%M%STO BECAUSE IT EQUALS 1)
294 ! SEE BEGINNING OF SUBROUTINE
295 !
296  mesh%M%X%DIM1 = bief_dim1_ext(ielm1,ielm2,m%STO,
297  & mesh%M%TYPEXT,mesh)
298  mesh%M%X%DIM2 = bief_dim2_ext(ielm1,ielm2,m%STO,
299  & mesh%M%TYPEXT,mesh)
300 !
301 !-----------------------------------------------------------------------
302 ! UPDATES M AFTER WORK ON MESH%M IS COMPLETE
303 !-----------------------------------------------------------------------
304 !
305  IF(nelem.GT.0) THEN
306 !
307  IF(m%STO.EQ.1) THEN
308  CALL om(op, m, mesh%M, f, c, mesh)
309  ELSEIF(m%STO.EQ.3) THEN
310  CALL om(op, m, mesh%MSEG, f, c, mesh)
311  ELSE
312  WRITE(lu,*) 'MATRIX: UNKNOWN STORAGE : ',m%STO
313  CALL plante(1)
314  stop
315  ENDIF
316 !
317  ENDIF
318 !
319 !-----------------------------------------------------------------------
320 !
321 501 FORMAT(1x,'MATRIX (BIEF) : MATRIX ',a6,' TOO SMALL')
322 2001 FORMAT(1x,' FOR IELM1 = ',1i6)
323 3001 FORMAT(1x,' AND IELM2 = ',1i6)
324 !
325 !-----------------------------------------------------------------------
326 !
327  RETURN
328  END
integer function dimens(IELM)
Definition: dimens.f:7
integer function bief_nbpts(IELM, MESH)
Definition: bief_nbpts.f:7
integer function bief_nbpel(IELM, MESH)
Definition: bief_nbpel.f:7
integer function bief_dim1_ext(IELM1, IELM2, STO, TYPEXT, MESH)
Definition: bief_dim1_ext.f:7
subroutine assvec(X, IKLE, NPOIN, NELEM, NELMAX, W, INIT, LV, MSK, MASKEL, NDP, ERRX)
Definition: assvec.f:7
subroutine om(OP, M, N, D, C, MESH)
Definition: om.f:7
integer function bief_dim2_ext(IELM1, IELM2, STO, TYPEXT, MESH)
Definition: bief_dim2_ext.f:7
subroutine matriy(FORMUL, XM, TYPDIA, TYPEXT, XMUL, SF, SG, SH, SU, SV, SW, F, G, H, U, V, W, T, LEGO, XEL, YEL, ZEL, XPT, YPT, ZPT, SURFAC, LGSEG, IKLE, IKLBOR, NBOR, NELBOR, NULONE, NELEM, NELMAX, NELEB, NELEBX, IELM1, IELM2, S, NPLAN, MESH, SIZEXMT, STOX)
Definition: matriy.f:11
subroutine matrix(M, OP, FORMUL, IELM1, IELM2, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL)
Definition: matrix.f:7
subroutine os(OP, X, Y, Z, C, IOPT, INFINI, ZERO)
Definition: os.f:7
subroutine assex3(XM, STO, NAME, IELM1, IELM2, TYPEXT, XMT, DIM1XMT, DIM2XMT, STOXMT, MESH, NELMAX, ELTSEG, ORISEG)
Definition: assex3.f:8
Definition: bief.f:3