The TELEMAC-MASCARET system  trunk
om.f
Go to the documentation of this file.
1 ! *************
2  SUBROUTINE om
3 ! *************
4 !
5  &( op , m , n , d , c , mesh )
6 !
7 !***********************************************************************
8 ! BIEF V7P0 21/08/2010
9 !***********************************************************************
10 !
11 !brief OPERATIONS ON MATRICES.
12 !code
13 !+ D: DIAGONAL MATRIX
14 !+ C: CONSTANT
15 !+
16 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES THE OPERATION TO BE
17 !+ PERFORMED ON MATRICES M AND N, D AND C.
18 !+
19 !+ THE RESULT IS MATRIX M.
20 !+
21 !+ OP = 'M=N ' : COPIES N IN M
22 !+ OP = 'M=CN ' : MULTIPLIES N BY C
23 !+ OP = 'M=CM ' : MULTIPLIES M BY C
24 !+ OP = 'M=M+CN ' : ADDS CN TO M
25 !+ OP = 'M=MD ' : M X D
26 !+ OP = 'M=DM ' : D X M
27 !+ OP = 'M=DMD ' : D X M X D
28 !+ OP = 'M=0 ' : SETS M TO 0 (TO BE CHECKED)
29 !+ OP = 'M=X(M) ' : NOT SYMMETRICAL FORM OF M
30 !+ OP = 'M=TN ' : COPIES TRANSPOSE OF N IN M
31 !+ OP = 'M=MSK(M)' : MASKS M EXTRADIAGONAL TERMS
32 !
33 !warning BE CAREFUL IF A NEW OPERATION IS ADDED TO THE LIST
34 !warning IF OP CONTAINS N, IT THEN MEANS THAT MATRIX N IS USED
35 !
36 !history ALGIANE FROEHLY
37 !+ 13/02/2008
38 !+
39 !+ ADDED OM1113 AND OM1311
40 !
41 !history J-M HERVOUET (LNHE) ; F LEPEINTRE (LNH)
42 !+ 05/02/2010
43 !+ V6P0
44 !+ CALL TO OMSEGBOR MODIFIED, OMSEGPAR SUPPRESSED
45 !
46 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
47 !+ 13/07/2010
48 !+ V6P0
49 !+ Translation of French comments within the FORTRAN sources into
50 !+ English comments
51 !
52 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
53 !+ 21/08/2010
54 !+ V6P0
55 !+ Creation of DOXYGEN tags for automated documentation and
56 !+ cross-referencing of the FORTRAN sources
57 !
58 !history F. DECUNG (LNHE)
59 !+ 01/01/2013
60 !+ V6P3
61 !+ omborseg added : operations on matrices with an edge-based storage
62 ! where N is a boundary matrix
63 !
64 !history J-M HERVOUET (EDF LAB, LNHE)
65 !+ 13/03/2014
66 !+ V7P0
67 !+ Now written to enable different numbering of boundary points and
68 !+ boundary segments.
69 !history R.NHEILI (Univerte de Perpignan, DALI)
70 !+ 24/02/2016
71 !+ V7P3
72 !+ ADD MODASS=3
73 !
74 !
75 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76 !| C |-->| A GIVEN CONSTANT USED IN OPERATION OP
77 !| D |-->| A DIAGONAL MATRIX
78 !| M |<->| RESULTING MATRIX
79 !| MESH |-->| MESH STRUCTURE
80 !| N |-->| MATRIX USED IN FORMULA OP
81 !| OP |-->| OPERATION TO BE DONE (SEE ABOVE)
82 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
83 !
84  USE bief, ex_om => om
85  USE declarations_telemac, ONLY : modass
86 !
88  IMPLICIT NONE
89 !
90 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
91 !
92  CHARACTER(LEN=8), INTENT(IN) :: OP
93  TYPE(bief_obj) , INTENT(INOUT), TARGET, OPTIONAL :: M
94  TYPE(bief_obj) , INTENT(IN), TARGET, OPTIONAL :: N
95  TYPE(bief_obj) , INTENT(IN), TARGET, OPTIONAL :: D
96  DOUBLE PRECISION, INTENT(IN), OPTIONAL :: C
97  TYPE(bief_mesh) , INTENT(IN), OPTIONAL :: MESH
98 !
99 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
100 !
101  INTEGER IELM1,IELM2,IELN1,IELN2,NELEM,NELMAX
102  INTEGER NDIAGM,NDIAGN,NDIAGX,MSEG1,MSEG2,NSEG1,NSEG2
103  INTEGER STOM,STON,NPTFR,MDIAGX
104  INTEGER SIZXN,SZMXN,NETAGE
105 !
106  LOGICAL YAN,YAD,YAC
107  TYPE(bief_obj), POINTER :: NN
108  TYPE(bief_obj), POINTER :: DD
109  DOUBLE PRECISION CC
110 !
111  CHARACTER(LEN=1) TYPDIM,TYPEXM,TYPDIN,TYPEXN
112 !
113  INTEGER, DIMENSION(:), POINTER :: IKLE
114 !
115  yan=.false.
116  yad=.false.
117  yac=.false.
118  IF(inclus(op,'N')) yan=.true.
119  IF(inclus(op,'D').OR.inclus(op,'MSK')) yad=.true.
120  IF(inclus(op,'C')) yac=.true.
121 !
122  IF(yan) THEN
123  IF(PRESENT(n)) THEN
124  nn=>n
125  ELSE
126  WRITE(lu,*) "---------------------------------"
127  WRITE(lu,2) op
128 2 FORMAT(1x,'OM (BIEF) : N MISSING AND OPERATION ',a8,' ASKED')
129  CALL plante(1)
130  stop
131  ENDIF
132  ELSE
133  nn=>m
134  ENDIF
135 !
136  IF(yad) THEN
137  IF(PRESENT(d)) THEN
138  dd=>d
139  ELSE
140  WRITE(lu,*) "---------------------------------"
141  WRITE(lu,4) op
142 4 FORMAT(1x,'OM (BIEF) : D MISSING AND OPERATION ',a8,' ASKED')
143  CALL plante(1)
144  stop
145  ENDIF
146  ELSE
147  dd=>m%D
148  ENDIF
149 !
150  IF(PRESENT(c)) THEN
151  cc=c
152  ELSE
153  IF(yac) THEN
154  WRITE(lu,*) "---------------------------------"
155  WRITE(lu,6) op
156 6 FORMAT(1x,'OM (BIEF) : C MISSING AND OPERATION ',a8,' ASKED')
157  CALL plante(1)
158  stop
159  ENDIF
160  ENDIF
161 !
162 !-----------------------------------------------------------------------
163 !
164 ! CASE WHERE THE STRUCTURE OF M BECOMES THAT OF N
165 !
166  IF(op(3:8).EQ.'N '.OR.op(3:8).EQ.'CN ') THEN
167  CALL cpstmt(n,m)
168  ELSEIF(op(3:8).EQ.'TN ') THEN
169  CALL cpstmt(n,m,trans=.true.)
170  ENDIF
171 !
172 ! EXTRACTS THE CHARACTERISTICS OF MATRIX M
173 !
174  typdim = m%TYPDIA
175  typexm = m%TYPEXT
176  stom = m%STO
177  ndiagm = m%D%DIM1
178  mdiagx = m%D%MAXDIM1
179  ielm1 = m%ELMLIN
180  ielm2 = m%ELMCOL
181 !
182  IF(op(3:8).EQ.'X(M) ') THEN
183  IF(m%ELMLIN.NE.m%ELMCOL) THEN
184  WRITE(lu,901) m%NAME
185 901 FORMAT(1x,'OM (BIEF) : M (REAL NAME: ',a6,') NOT SQUARE')
186  WRITE(lu,701)
187 701 FORMAT(1x,' IS ALREADY NON SYMMETRICAL')
188  CALL plante(1)
189  stop
190  ENDIF
191  IF(m%X%MAXDIM2*m%X%MAXDIM1.LT.
192  & bief_dim1_ext(ielm1,ielm2,stom,'Q',mesh)*
193  & bief_dim2_ext(ielm1,ielm2,stom,'Q',mesh) ) THEN
194  WRITE(lu,401) m%NAME
195  WRITE(lu,801)
196 801 FORMAT(1x,' TO BECOME NON SYMMETRICAL')
197  CALL plante(1)
198  stop
199  ENDIF
200  ENDIF
201 !
202 !-----------------------------------------------------------------------
203 !
204 ! EXTRACTS THE CHARACTERISTICS OF MATRIX N (OPTIONAL)
205 !
206  IF(inclus(op,'N')) THEN
207  typdin = nn%TYPDIA
208  typexn = nn%TYPEXT
209  ston = nn%STO
210  ndiagn = nn%D%DIM1
211  ndiagx = nn%D%MAXDIM1
212 !
213  sizxn = nn%X%DIM1
214  szmxn = nn%X%MAXDIM1
215 !
216 ! 07/02/03 : DIVISION BY NDIAGN=0 AVOIDED (SUBDOMAIN WITHOUT BOUNDARY POINTS
217 ! IN PARALLEL). COURTESY OLIVER GOETHEL (HANNOVER UNIVERSITY)
218 !
219  IF(ndiagn.GT.0) THEN
220  netage = ndiagm/ndiagn - 1
221  ELSE
222  netage = 0
223  ENDIF
224 !
225  ieln1 = nn%ELMLIN
226  ieln2 = nn%ELMCOL
227  IF(ndiagn.GT.mdiagx) THEN
228  WRITE(lu,401) m%NAME
229 401 FORMAT(1x,'OM (BIEF) : M (REAL NAME: ',a6,') TOO SMALL')
230  CALL plante(1)
231  stop
232  ENDIF
233  ELSE
234  ieln1 = ielm1
235  ieln2 = ielm2
236  ston = stom
237  ENDIF
238 !
239 !-----------------------------------------------------------------------
240 !
241 ! DEPLOYMENT OF THE MESH STRUCTURE
242 !
243 ! STANDARD MATRIX
244  IF(dimens(ielm1).EQ.mesh%DIM1) THEN
245  ikle=>mesh%IKLE%I
246  nelem = mesh%NELEM
247  nelmax= mesh%NELMAX
248  ELSE
249 ! BOUNDARY MATRIX
250  ikle=>mesh%IKLBOR%I
251  nelem = mesh%NELEB
252  nelmax = mesh%NELEBX
253  ENDIF
254 !
255  nptfr= mesh%NPTFR
256 !
257 !-----------------------------------------------------------------------
258 !
259 ! TRADITIONAL EBE STORAGE:
260 !
261  IF(stom.EQ.1.AND.ston.EQ.1) THEN
262 !
263  IF(ielm1.EQ.1.AND.ielm2.EQ.1) THEN
264 !
265 ! ELEMENTS WITH 2 POINTS
266 !
267  CALL om0101(op,m%D%R,typdim,m%X%R,typexm,
268  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
269  & ikle,nelem,nelmax,ndiagm)
270 !
271 !
272 ! ELEMENTS WITH 3 POINTS
273 !
274  ELSEIF( (ielm1.EQ.2 .AND.ielm2.EQ.2 ) .OR.
275  & (ielm1.EQ.11.AND.ielm2.EQ.11) .OR.
276  & (ielm1.EQ.61.AND.ielm2.EQ.61) .OR.
277  & (ielm1.EQ.81.AND.ielm2.EQ.81) ) THEN
278 !
279  IF( (ieln1.EQ.2 .AND.ieln2.EQ.2 ) .OR.
280  & (ieln1.EQ.11.AND.ieln2.EQ.11) .OR.
281  & (ieln1.EQ.61.AND.ieln2.EQ.61) .OR.
282  & (ieln1.EQ.81.AND.ieln2.EQ.81) ) THEN
283 !
284  IF (modass .EQ. 3) THEN
285  CALL om1111(op , m%D%R,typdim,m%X%R,typexm ,
286  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
287  & ikle,nelem,nelmax,ndiagm,
288  & dm_err=m%D%E, dn_err=nn%D%E,
289  & d_err=d%E)
290  ELSE
291  CALL om1111(op , m%D%R,typdim,m%X%R,typexm ,
292  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
293  & ikle,nelem,nelmax,ndiagm)
294  ENDIF
295 !
296  ELSEIF(ieln1.EQ.1.AND.ieln2.EQ.1) THEN
297 !
298  CALL om1101(op , m%D%R,typdim,m%X%R,typexm,
299  & nn%D%R,typdin,nn%X%R,typexn,cc,
300  & mesh%NULONE%I,mesh%NELBOR%I,
301  & mesh%NBOR%I,
302  & nelmax,ndiagm,ndiagn,mesh%NELEBX,
303  & mesh%NELEB)
304 !
305  ELSE
306  WRITE(lu,101) m%NAME
307  WRITE(lu,201) ielm1,ielm2
308  WRITE(lu,151) nn%NAME
309  WRITE(lu,251) ieln1,ieln2
310  WRITE(lu,301)
311  CALL plante(1)
312  stop
313  ENDIF
314 !
315 ! ELEMENTS WITH 4 POINTS
316 !
317  ELSEIF( (ielm1.EQ.21.AND.ielm2.EQ.21) .OR.
318  & (ielm1.EQ.71.AND.ielm2.EQ.71) .OR.
319  & (ielm1.EQ.31.AND.ielm2.EQ.31) .OR.
320  & (ielm1.EQ.51.AND.ielm2.EQ.51) .OR.
321  & (ielm1.EQ.12.AND.ielm2.EQ.12) ) THEN
322 !
323  IF( (ieln1.EQ.21.AND.ieln2.EQ.21) .OR.
324  & (ieln1.EQ.71.AND.ieln2.EQ.71) .OR.
325  & (ieln1.EQ.31.AND.ieln2.EQ.31) .OR.
326  & (ieln1.EQ.51.AND.ieln2.EQ.51) .OR.
327  & (ieln1.EQ.12.AND.ieln2.EQ.12) ) THEN
328 !
329  CALL om2121(op , m%D%R,typdim,m%X%R,typexm ,
330  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
331  & ikle,nelem,nelmax,ndiagm)
332  ELSEIF( (ielm1.EQ.12.AND.ielm2.EQ.12) .AND.
333  & (ieln1.EQ.1 .AND.ieln2.EQ.1 ) ) THEN
334 !
335  CALL om1201(op , m%D%R,typdim,m%X%R,typexm,
336  & nn%D%R,typdin,nn%X%R,typexn,cc,
337  & mesh%NULONE%I,mesh%NELBOR%I,
338  & mesh%NBOR%I,
339  & nelmax,ndiagm,ndiagn,mesh%NELEBX,
340  & mesh%NELEB)
341  ELSEIF(( (ielm1.EQ.51.AND.ielm2.EQ.51) .AND.
342  & (ieln1.EQ.61.AND.ieln2.EQ.61)) ) THEN
343 ! PRISMS SPLIT IN TETRAHEDRONS M INTERIOR MATRIX
344 ! N LATERAL BOUNDARY MATRIX
345  CALL om5161(op,m%D%R,typdim,m%X%R,typexm,
346  & nn%D%R,typdin,nn%X%R,typexn,cc,
347  & mesh%NULONE%I,mesh%NELBOR%I,mesh%NBOR%I,
348  & nelmax,ndiagn,sizxn,szmxn)
349 !
350  ELSEIF(( (ielm1.EQ.31.AND.ielm2.EQ.31) .AND.
351  & (ieln1.EQ.81.AND.ieln2.EQ.81)) ) THEN
352 ! NOT STRUCTURED TETRAHEDRONS M INTERIOR MATRIX
353 ! N LATERAL BOUNDARY MATRIX
354  CALL om3181(op,m%D%R,typdim,m%X%R,typexm,
355  & nn%D%R,typdin,nn%X%R,typexn,cc,
356  & mesh%NULONE%I,mesh%NELBOR%I,mesh%NBOR%I,
357  & nelmax,ndiagn,mesh%NELEB)
358 !
359  ELSEIF( (ielm1.EQ.51.AND.ielm2.EQ.51) .AND.
360  & (ieln1.EQ.11.AND.ieln2.EQ.11) ) THEN
361 ! PRISMS SPLIT IN TETRAHEDRONS M INTERIOR MATRIX
362 ! N BOTTOM (NB) OR SURFACE (NS) BOUNDARY MATRIX
363 ! OPERATIONS M+NB AND M+NS
364  CALL om5111(op , m%D%R,typdim,m%X%R,typexm,
365  & nn%D%R,typdin,nn%X%R,typexn,
366  & ndiagn,ndiagx,sizxn,netage,nelmax)
367 !
368  ELSE
369  WRITE(lu,101) m%NAME
370  WRITE(lu,201) ielm1,ielm2
371  WRITE(lu,151) nn%NAME
372  WRITE(lu,251) ieln1,ieln2
373  WRITE(lu,301)
374  CALL plante(1)
375  stop
376  ENDIF
377 !
378 ! RECTANGULAR MATRICES WITH 3 AND 4 POINTS
379 !
380  ELSEIF(ielm1.EQ.11.AND.ielm2.EQ.12) THEN
381 !
382  IF((ieln1.EQ.11.AND.ieln2.EQ.12).OR.
383  & (ieln1.EQ.12.AND.ieln2.EQ.11.AND.op(1:4).EQ.'M=TN')) THEN
384  CALL om1112(op , m%D%R,typdim,m%X%R,typexm ,
385  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
386  & ikle,nelem,nelmax,ndiagm)
387  ELSE
388  WRITE(lu,101) m%NAME
389  WRITE(lu,201) ielm1,ielm2
390  WRITE(lu,151) nn%NAME
391  WRITE(lu,251) ieln1,ieln2
392  WRITE(lu,301)
393  CALL plante(1)
394  stop
395  ENDIF
396 !
397 ! RECTANGULAR MATRICES WITH 4 AND 3 POINTS
398 !
399  ELSEIF(ielm1.EQ.12.AND.ielm2.EQ.11) THEN
400 !
401  IF((ieln1.EQ.12.AND.ieln2.EQ.11).OR.
402  & (ieln1.EQ.11.AND.ieln2.EQ.12.AND.op(1:4).EQ.'M=TN')) THEN
403  CALL om1211(op , m%D%R,typdim,m%X%R,typexm ,
404  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
405  & ikle,nelem,nelmax,ndiagm)
406  ELSE
407  WRITE(lu,101) m%NAME
408  WRITE(lu,201) ielm1,ielm2
409  WRITE(lu,151) nn%NAME
410  WRITE(lu,251) ieln1,ieln2
411  WRITE(lu,301)
412  CALL plante(1)
413  stop
414  ENDIF
415 !
416 ! ELEMENTS WITH 6 POINTS
417 !
418  ELSEIF( (ielm1.EQ.41.AND.ielm2.EQ.41).OR.
419  & (ielm1.EQ.13.AND.ielm2.EQ.13) ) THEN
420 !
421  IF( (ieln1.EQ.41.AND.ieln2.EQ.41).OR.
422  & (ieln1.EQ.13.AND.ieln2.EQ.13) ) THEN
423 !
424  CALL om4141(op,m%D%R,typdim,m%X%R,typexm,
425  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
426  & ikle,nelem,nelmax,ndiagm,m%STOX)
427 !
428  ELSEIF(ieln1.EQ.71.AND.ieln2.EQ.71) THEN
429 !
430  CALL om4121(op,m%D%R,typdim,m%X%R,typexm,
431  & nn%D%R,typdin,nn%X%R,typexn,cc,
432  & mesh%NULONE%I,mesh%NELBOR%I,mesh%NBOR%I,
433  & nelmax,ndiagn,sizxn,szmxn)
434 !
435  ELSEIF(ieln1.EQ.11.AND.ieln2.EQ.11) THEN
436 !
437  CALL om4111(op , m%D%R,typdim,m%X%R,typexm,
438  & nn%D%R,typdin,nn%X%R,typexn,
439  & ndiagn,ndiagx,sizxn,netage,nelmax)
440 !
441  ELSEIF( (ielm1.EQ.13.AND.ielm2.EQ.13) .AND.
442  & (ieln1.EQ.2 .AND.ieln2.EQ.2 ) ) THEN
443 !
444  CALL om1302(op , m%D%R,typdim,m%X%R,typexm,
445  & nn%D%R,typdin,nn%X%R,typexn,cc,
446  & mesh%NULONE%I,mesh%NELBOR%I,
447  & mesh%NBOR%I,
448  & nelmax,ndiagm,nptfr,mesh%NELEBX,
449  & mesh%NELEB)
450 !
451  ELSE
452  WRITE(lu,101) m%NAME
453  WRITE(lu,201) ielm1,ielm2
454  WRITE(lu,151) nn%NAME
455  WRITE(lu,251) ieln1,ieln2
456  WRITE(lu,301)
457  CALL plante(1)
458  stop
459  ENDIF
460 !
461 ! RECTANGULAR MATRICES WITH 3 AND 6 POINTS
462 !
463  ELSEIF(ielm1.EQ.11.AND.ielm2.EQ.13) THEN
464 !
465  IF((ieln1.EQ.11.AND.ieln2.EQ.13).OR.
466  & (ieln1.EQ.13.AND.ieln2.EQ.11.AND.op(1:4).EQ.'M=TN')) THEN
467  CALL om1113(op , m%D%R,typdim,m%X%R,typexm ,
468  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
469  & ikle,nelem,nelmax,ndiagm)
470  ELSE
471  WRITE(lu,101) m%NAME
472  WRITE(lu,201) ielm1,ielm2
473  WRITE(lu,151) nn%NAME
474  WRITE(lu,251) ieln1,ieln2
475  WRITE(lu,301)
476  CALL plante(1)
477  stop
478  ENDIF
479 !
480 ! RECTANGULAR MATRICES WITH 6 AND 3 POINTS
481 !
482  ELSEIF(ielm1.EQ.13.AND.ielm2.EQ.11) THEN
483 !
484  IF((ieln1.EQ.13.AND.ieln2.EQ.11).OR.
485  & (ieln1.EQ.11.AND.ieln2.EQ.13.AND.op(1:4).EQ.'M=TN')) THEN
486  CALL om1311(op , m%D%R,typdim,m%X%R,typexm ,
487  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
488  & ikle,nelem,nelmax,ndiagm)
489  ELSE
490  WRITE(lu,101) m%NAME
491  WRITE(lu,201) ielm1,ielm2
492  WRITE(lu,151) nn%NAME
493  WRITE(lu,251) ieln1,ieln2
494  WRITE(lu,301)
495  CALL plante(1)
496  stop
497  ENDIF
498 !
499 ! COMBINATION OF IELM1 AND IELM2 NOT IMPLEMENTED: ERROR
500 !
501  ELSE
502  WRITE(lu,101) m%NAME
503  WRITE(lu,201) ielm1,ielm2
504  WRITE(lu,411) stom,ston
505  WRITE(lu,301)
506  CALL plante(1)
507  stop
508  ENDIF
509 !
510  ELSEIF(stom.EQ.3.AND.ston.EQ.3) THEN
511 !
512 ! STORAGE BY SEGMENT
513 !
514  IF(m%ELMCOL.NE.nn%ELMCOL.OR.m%ELMLIN.NE.nn%ELMLIN) THEN
515 ! WRITE(LU,*) 'M ET N DE STRUCTURES DIFFERENTES',M%ELMCOL
516 ! CALL PLANTE(1)
517 ! STOP
518 !
519 ! EDGE-BASED STORAGE FOR M AND N
520 ! THIS CAN HAPPEN ONLY WHEN N IS A BOUNDARY MATRIX (FD : REALLY?)
521 ! TESTED SO FAR FOR TETRA (81) AND TRIANGLES (31)
522 ! BORDER SEGMENTS ARE LINKED TO THE NSEGBOR FIRST SEGMENTS
523 !
524  mseg1 = bief_nbseg(m%ELMLIN,mesh)
525  mseg2 = bief_nbseg(m%ELMCOL,mesh)
526  nseg1 = bief_nbseg(nn%ELMLIN,mesh)
527  nseg2 = bief_nbseg(nn%ELMCOL,mesh)
528 !
529  CALL omborseg(op,m%D%R,m%X%R,typexm,
530  & nn%D%R,nn%X%R,typexn,cc,
531  & ndiagn,mseg1,mseg2,nseg1,nseg2,
532  & mesh%NBOR%I)
533 !
534  ELSE
535 !
536  nseg1 = bief_nbseg(m%ELMLIN,mesh)
537  nseg2 = bief_nbseg(m%ELMCOL,mesh)
538 !
539 ! IN LINEAR-QUADRATIC RECTANGULAR MATRICES, PURELY QUADRATIC
540 ! SEGMENTS ARE NOT CONSIDERED (NUMBER 13,14 AND 15, SO 3 PER ELEMENT)
541 !
542  IF(ielm1.EQ.11.AND.ielm2.EQ.13) THEN
543  nseg2=nseg2-3*nelem
544  ELSEIF(ielm1.EQ.13.AND.ielm2.EQ.11) THEN
545  nseg1=nseg1-3*nelem
546  ENDIF
547 !
548 ! IN LINEAR-QUADRATIC RECTANGULAR MATRICES, PURELY QUADRATIC
549 ! SEGMENTS ARE NOT CONSIDERED (NUMBER 13,14 AND 15, SO 3 PER ELEMENT)
550 !
551  CALL omseg(op , m%D%R,typdim,m%X%R,typexm,
552  & nn%D%R,typdin,nn%X%R,typexn,dd%R,cc,
553  & ndiagm,nseg1,nseg2,mesh%GLOSEG%I,
554  & mesh%GLOSEG%MAXDIM1)
555 !
556  ENDIF
557 !
558  ELSEIF(stom.EQ.3.AND.ston.EQ.1) THEN
559 !
560 ! EDGE-BASED STORAGE FOR M AND EBE FOR N
561 ! THIS CAN HAPPEN ONLY WHEN N IS A BOUNDARY MATRIX
562 !
563  IF( ( m%ELMLIN.EQ.11.AND. m%ELMCOL.EQ.11.AND.
564  & nn%ELMLIN.EQ.1 .AND.nn%ELMCOL.EQ.1) .OR.
565  & ( m%ELMLIN.EQ.12.AND. m%ELMCOL.EQ.12.AND.
566  & nn%ELMLIN.EQ.1 .AND.nn%ELMCOL.EQ.1) .OR.
567  & ( m%ELMLIN.EQ.13.AND. m%ELMCOL.EQ.13.AND.
568  & nn%ELMLIN.EQ.1 .AND.nn%ELMCOL.EQ.1) .OR.
569  & ( m%ELMLIN.EQ.13.AND. m%ELMCOL.EQ.13.AND.
570  & nn%ELMLIN.EQ.2 .AND.nn%ELMCOL.EQ.2) ) THEN
571 !
572  nseg1 = bief_nbseg(m%ELMLIN,mesh)
573  nseg2 = bief_nbseg(m%ELMCOL,mesh)
574 !
575  CALL omsegbor(op,m%D%R,typdim,m%X%R,typexm,
576  & nn%D%R,typdin,nn%X%R,typexn,cc,
577  & ndiagm,nseg1,mesh%NBOR%I,
578  & nptfr,m%ELMLIN,nn%ELMLIN,
579  & bief_nbseg(11,mesh),
580  & mesh%IKLBOR%I,mesh%NELEBX,mesh%NELEB)
581 !
582  ELSE
583  WRITE(lu,*) 'OM : UNEXPECTED CASE IN SEGMENT STORAGE'
584  WRITE(lu,*) ' M%ELMLIN=',m%ELMLIN
585  WRITE(lu,*) ' M%ELMCOL=',m%ELMCOL
586  WRITE(lu,*) ' M%NAME=',m%NAME
587  WRITE(lu,*) ' NN%ELMLIN=',nn%ELMLIN
588  WRITE(lu,*) ' NN%ELMCOL=',nn%ELMCOL
589  WRITE(lu,*) ' NN%NAME=',nn%NAME
590  WRITE(lu,*) ' IMPLEMENTATION MISSING'
591  CALL plante(1)
592  stop
593  ENDIF
594 !
595 ! COMBINATION OF IELM1 AND IELM2 NOT IMPLEMENTED: ERROR
596 !
597 ! ELSE
598 ! WRITE(LU,101) M%NAME
599 ! WRITE(LU,201) IELM1,IELM2
600 ! WRITE(LU,411) STOM,STON
601 ! WRITE(LU,301)
602 ! CALL PLANTE(1)
603 ! STOP
604 ! ENDIF
605 !
606  ELSE
607 !
608 ! STORAGE COMBINATION NOT IMPLEMENTED
609 !
610  WRITE(lu,101) m%NAME
611  WRITE(lu,411) stom,ston
612  WRITE(lu,301)
613  CALL plante(1)
614  stop
615 !
616  ENDIF
617 !
618 !-----------------------------------------------------------------------
619 !
620 ! RE-ENCODES THE NEW TYPE
621 !
622  m%TYPDIA = typdim
623  m%TYPEXT = typexm
624  IF(op(3:8).EQ.'X(M) ') THEN
625  m%X%DIM1=bief_dim1_ext(ielm1,ielm2,stom,'Q',mesh)
626  m%X%DIM2=bief_dim2_ext(ielm1,ielm2,stom,'Q',mesh)
627  ENDIF
628 !
629 !-----------------------------------------------------------------------
630 !
631 101 FORMAT(1x,'OM (BIEF) : MATRIX M (REAL NAME:',a6,')')
632 151 FORMAT(1x,'OM (BIEF) : MATRIX N (REAL NAME:',a6,')')
633 201 FORMAT(1x,' IELM1 = ',1i6,' IELM2 = ',1i6)
634 251 FORMAT(1x,' IELN1 = ',1i6,' IELN2 = ',1i6)
635 301 FORMAT(1x,' THIS CASE IS NOT IMPLEMENTED')
636 411 FORMAT(1x,'AND STORAGES M : ',1i6,' STON : ',1i6)
637 !
638 !-----------------------------------------------------------------------
639 !
640  RETURN
641  END
subroutine omseg(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, NDIAG, NSEG1, NSEG2, GLOSEG, SIZGLO)
Definition: omseg.f:8
subroutine cpstmt(X, Y, TRANS)
Definition: cpstmt.f:7
integer function dimens(IELM)
Definition: dimens.f:7
subroutine om1111(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG, DM_ERR, DN_ERR, D_ERR)
Definition: om1111.f:8
subroutine om1201(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, NDIAG, NPTFR, NELEBX, NELEB)
Definition: om1201.f:8
integer function bief_dim1_ext(IELM1, IELM2, STO, TYPEXT, MESH)
Definition: bief_dim1_ext.f:7
subroutine om0101(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om0101.f:8
subroutine om2121(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om2121.f:8
subroutine om4121(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, SIZDN, SIZXN, SZMXN)
Definition: om4121.f:8
subroutine omsegbor(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NDIAG, NSEG1, NBOR, NPTFR, IELM1, IELN1, NSEG11, IKLBOR, NELEBX, NELEB)
Definition: omsegbor.f:9
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 om1311(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om1311.f:8
subroutine omborseg(OP, DM, XM, TYPEXM, DN, XN, TYPEXN, C, NDIAG, MSEG1, MSEG2, NSEG1, NSEG2, NBOR)
Definition: omborseg.f:8
subroutine om4111(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, SIZDN, SZMDN, SIZXN, NETAGE, NELMAX3D)
Definition: om4111.f:8
subroutine om5111(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, SIZDN, SZMDN, SIZXN, NETAGE, NELMAX3D)
Definition: om5111.f:8
subroutine om1113(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om1113.f:8
subroutine om1211(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om1211.f:8
logical function inclus(C1, C2)
Definition: inclus.f:7
subroutine om1302(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, NDIAG, NPTFR, NELEBX, NELEB)
Definition: om1302.f:8
subroutine om4141(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG, STOX)
Definition: om4141.f:8
subroutine om1112(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, D, C, IKLE, NELEM, NELMAX, NDIAG)
Definition: om1112.f:8
subroutine om5161(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, SIZDN, SIZXN, SZMXN)
Definition: om5161.f:8
subroutine om3181(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, SIZDN, NELEB)
Definition: om3181.f:8
integer function bief_nbseg(IELM, MESH)
Definition: bief_nbseg.f:7
subroutine om1101(OP, DM, TYPDIM, XM, TYPEXM, DN, TYPDIN, XN, TYPEXN, C, NULONE, NELBOR, NBOR, NELMAX, NDIAG, NPTFR, NELEBX, NELEB)
Definition: om1101.f:8
Definition: bief.f:3