The TELEMAC-MASCARET system  trunk
omborseg.f
Go to the documentation of this file.
1 ! *******************
2  SUBROUTINE omborseg
3 ! *******************
4 !
5  &(op,dm,xm,typexm,dn,xn,typexn,c,
6  & ndiag,mseg1,mseg2,nseg1,nseg2,nbor)
7 !
8 !***********************************************************************
9 ! BIEF V6P3 01/01/2013
10 !***********************************************************************
11 !
12 !brief OPERATIONS ON MATRICES WITH AN EDGE-BASED STORAGE
13 !+ WHERE N IS A BOUNDARY MATRIX
14 !
15 !code
16 !+ D: DIAGONAL MATRIX
17 !+ C: CONSTANT
18 !+
19 !+ OP IS A STRING OF 8 CHARACTERS, WHICH INDICATES THE OPERATION TO BE
20 !+ PERFORMED ON MATRICES M AND N, D AND C.
21 !+
22 !+ THE RESULT IS MATRIX M.
23 !+
24 !+ OP = 'M=M+N ' : ADDS N TO M
25 !
26 !history F. DECUNG (LNHE)
27 !+ 2012
28 !+ V6P3
29 !+ Adapted from omseg.f
30 !
31 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 !| C |-->| A GIVEN CONSTANT USED IN OPERATION OP
33 !| DM |<->| DIAGONAL OF M
34 !| DN |-->| DIAGONAL OF N
35 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS
36 !| NDIAG |-->| NUMBER OF TERMS IN THE DIAGONAL
37 !| MSEG1 |-->| NUMBER OF SEGMENTS OF LINE ELEMENT OF M
38 !| MSEG2 |-->| NUMBER OF SEGMENTS OF COLUMN ELEMENT OF M
39 !| NSEG1 |-->| NUMBER OF SEGMENTS OF LINE ELEMENT OF N
40 !| NSEG2 |-->| NUMBER OF SEGMENTS OF COLUMN ELEMENT OF N
41 !| OP |-->| OPERATION TO BE DONE (SEE ABOVE)
42 !| TYPEXM |-->| TYPE OF OFF-DIAGONAL TERMS OF M:
43 !| | | TYPEXM = 'Q' : ANY VALUE
44 !| | | TYPEXM = 'S' : SYMMETRIC
45 !| | | TYPEXM = '0' : ZERO
46 !| TYPEXN |-->| TYPE OF OFF-DIAGONAL TERMS OF N:
47 !| | | TYPEXN = 'Q' : ANY VALUE
48 !| | | TYPEXN = 'S' : SYMMETRIC
49 !| | | TYPEXN = '0' : ZERO
50 !| XM |-->| OFF-DIAGONAL TERMS OF M
51 !| XN |-->| OFF-DIAGONAL TERMS OF N
52 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
53 !
54  USE bief, ex_omborseg => omborseg
55 !
57  IMPLICIT NONE
58 !
59 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 !
61  INTEGER, INTENT(IN) :: NDIAG,MSEG1,MSEG2,NSEG1,NSEG2
62  INTEGER, INTENT(IN) :: NBOR(*)
63  CHARACTER(LEN=8), INTENT(IN) :: OP
64  DOUBLE PRECISION, INTENT(IN) :: DN(*)
65 ! XM AND XN MAY ONLY BE OF SIZE NSEG1 IF THE MATRIX IS SYMMETRICAL
66 ! SIZE GIVEN HERE ONLY TO CHECK BOUNDS
67  DOUBLE PRECISION, INTENT(INOUT) :: XM(mseg1+mseg2)
68  DOUBLE PRECISION, INTENT(IN) :: XN(nseg1+nseg2)
69  CHARACTER(LEN=1), INTENT(INOUT) :: TYPEXM,TYPEXN
70  DOUBLE PRECISION, INTENT(INOUT) :: DM(*)
71  DOUBLE PRECISION, INTENT(IN) :: C
72 !
73 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 !
75  INTRINSIC min
76 !
77  DOUBLE PRECISION Z(1)
78 !
79  INTEGER DIMX,DIMY
80 !
81 !-----------------------------------------------------------------------
82 ! BASICALLY, FOR SQUARED MATRICES :
83 ! XM(1:NSEG) <=> XN(1:NSEG)
84 ! XM(DIMX+1:DIMX+NSEG) <=> XN(NSEG+1:2*NSEG)
85 !
86  dimx=min(mseg1,mseg2)
87  dimy=max(nseg1,nseg2)
88 !
89  IF(op(3:8).EQ.'M+N ') THEN
90 !
91  CALL ovdb( 'X=X+Y ' , dm , dn , z , c , nbor, ndiag )
92 !
93  IF(typexn(1:1).EQ.'S') THEN
94  CALL ov('X=X+Y ', x=xm, y=xn, dim1=nseg2)
95  IF(typexm(1:1).EQ.'Q') THEN
96  CALL ov('X=X+Y ' , x=xm(dimx+1:dimx+nseg2) , y=xn,
97  & dim1=nseg2)
98  ENDIF
99  ELSEIF(typexn(1:1).EQ.'Q') THEN
100  IF(typexm(1:1).NE.'Q') THEN
101  WRITE(lu,98) typexm(1:1),op(1:8),typexn(1:1)
102 98 FORMAT(1x,'OMBORSEG (BIEF) : TYPEXM = ',a1,
103  & ' DOES NOT GO',/,1x,'FOR THE OPERATION : ',a8,
104  & ' WITH TYPEXN = ',a1)
105  CALL plante(1)
106  stop
107  ENDIF
108  CALL ov('X=X+Y ' , x=xm, y=xn, dim1=nseg2)
109  CALL ov('X=X+Y ' , x=xm(dimx+1:dimx+nseg2),
110  & y=xn(dimy+1:dimy+nseg2), dim1=nseg2)
111  ELSEIF(typexn(1:1).NE.'0') THEN
112  WRITE(lu,11) typexn(1:1)
113 11 FORMAT(1x,'OMBORSEG (BIEF) : TYPEXN UNKNOWN :',a1)
114  CALL plante(1)
115  stop
116  ENDIF
117 !
118 !-----------------------------------------------------------------------
119 !
120  ELSE
121 !
122  WRITE(lu,41) op
123 41 FORMAT(1x,'OMBORSEG (BIEF) : UNKNOWN OPERATION : ',a8)
124  CALL plante(1)
125  stop
126 !
127  ENDIF
128 !
129 !-----------------------------------------------------------------------
130 !
131  RETURN
132  END
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine omborseg(OP, DM, XM, TYPEXM, DN, XN, TYPEXN, C, NDIAG, MSEG1, MSEG2, NSEG1, NSEG2, NBOR)
Definition: omborseg.f:8
subroutine ovdb(OP, X, Y, Z, C, NBOR, NPTFR)
Definition: ovdb.f:7
Definition: bief.f:3