The TELEMAC-MASCARET system  trunk
fropro.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE fropro
3 ! *****************
4 !
5  &(nbor,ikle,nelem,nelmax,npoin,npmax,nptfr,ielm,
6  & iklem1,limvoi,optass,produc,mxptvs,t1,
7  & gloseg,sizglo,nseg)
8 !
9 !***********************************************************************
10 ! BIEF V6P3 21/08/2010
11 !***********************************************************************
12 !
13 !brief COMPUTES THE ARRAYS GIVING ADRESSES FOR
14 !+ FRONTAL MATRIX-VECTOR PRODUCT.
15 !
16 !history J-M HERVOUET (LNHE)
17 !+ 20/03/08
18 !+ V5P9
19 !+
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (EDF R&D, LNHE)
34 !+ 11/03/2013
35 !+ V6P3
36 !+ Dimension of LIMVOI now set to 11.
37 !
38 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39 !| GLOSEG |-->| FIRST AND SECOND POINT OF SEGMENTS
40 !| IELM |-->| TYPE OF ELEMENT.
41 !| | | 11 : TRIANGLES.
42 !| | | 21 : QUADRANGLES.
43 !| IKLE |-->| CONNECTIVITY TABLE.
44 !| IKLEM1 |<--| VARIOUS ADDRESSES IN OFF-DIAGONAL PART
45 !| | | OF A MATRIX
46 !| LIMVOI |<--| LIMVOI(K,1) : BEGINNING OF SERIES WITH K NEIGHBOURS
47 !| | | LIMVOI(K,2) : END OF SERIES WITH K NEIGHBOURS
48 !| MXPTVS |-->| MAXIMUM NUMBER OF NEIGHBOURS OF A POINT
49 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS
50 !| NELEM |-->| NUMBER OF ELEMENTS
51 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
52 !| NPMAX |-->| MAXIMUM NUMBER OF POINTS
53 !| NPOIN |-->| NUMBER OF POINTS
54 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
55 !| NSEG |-->| NUMBER OF SEGMENTS
56 !| OPTASS |-->| OPTION OF MATRIX STORAGE
57 !| | | 1: ELEMENT PER ELEMENT 3: EDGE-BASED
58 !| PRODUC |-->| CHOICE OF MATRIX-VECTOR PRODUCT
59 !| | | 1: NORMAL 2: FRONTAL
60 !| SIZGLO |-->| FIRST DIMENSION OF GLOSEG
61 !| T1 |-->| INTEGER WORK ARRAY
62 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63 !
64  USE bief, ex_fropro => fropro
65 !
67  IMPLICIT NONE
68 !
69 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
70 !
71  INTEGER, INTENT(IN) :: NELMAX,NPMAX,MXPTVS,NELEM
72  INTEGER, INTENT(IN) :: NPOIN,NPTFR,IELM,OPTASS,PRODUC
73  INTEGER, INTENT(IN) :: NSEG,SIZGLO,NBOR(*)
74  INTEGER, INTENT(IN) :: IKLE(nelmax,*),GLOSEG(sizglo,2)
75  INTEGER, INTENT(OUT) :: IKLEM1(npmax,mxptvs,4,2)
76 ! 11: SEE ALMESH AND OPASS
77  INTEGER, INTENT(OUT) :: LIMVOI(11,2)
78  INTEGER, INTENT(OUT) :: T1(npoin)
79 !
80 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
81 !
82  INTEGER IELEM,IPTFR,IPOIN,ISG,K,I,I1,I2,NBVOIS
83 !
84 !-----------------------------------------------------------------------
85 !
86  IF(ielm.NE.11) THEN
87  WRITE(lu,901) ielm
88 901 FORMAT(1x,'FROPRO: IELM=',1i6,' UNKNOWN TYPE OF ELEMENT')
89  CALL plante(1)
90  stop
91  ENDIF
92 !
93  IF(produc.EQ.2) THEN
94 !
95 !=======================================================================
96 ! COMPUTES THE NUMBER OF NEIGHBOURING POINTS AND ELEMENTS
97 !=======================================================================
98 !
99  DO ipoin = 1,npoin
100  t1(ipoin) = 0
101  ENDDO
102 !
103 ! NUMBER OF ELEMENTS NEIGHBOURING A POINT
104 !
105  DO ielem = 1,nelem
106  t1(ikle(ielem,1)) = t1(ikle(ielem,1)) + 1
107  t1(ikle(ielem,2)) = t1(ikle(ielem,2)) + 1
108  t1(ikle(ielem,3)) = t1(ikle(ielem,3)) + 1
109  ENDDO
110 !
111 ! NUMBER OF POINTS NEIGHBOURING A POINT
112 ! = NUMBER OF ELEMENTS NEIGHBOURING A POINT
113 ! + 1 ON BOUNDARIES
114 !
115  DO iptfr = 1,nptfr
116  t1(nbor(iptfr)) = t1(nbor(iptfr)) + 1
117  ENDDO
118 !
119 !=======================================================================
120 ! CHECKS THAT THE RENUMBERING WAS MADE CORRECTLY IN STBTEL
121 ! FILLS IN LIMVOI AND IKLEM1
122 !=======================================================================
123 !
124  IF(t1(1).EQ.0) THEN
125  WRITE(lu,97)
126 97 FORMAT(1x,'FROPRO: POINT NUMBER 1 HAS NO NEIGHBOUR')
127  CALL plante(1)
128  stop
129  ENDIF
130 !
131  DO ipoin = 2,npoin
132  IF(t1(ipoin).LT.t1(ipoin-1)) THEN
133  WRITE(lu,99)
134 99 FORMAT(1x,'FROPRO: FRONTAL PRODUCT REQUIRES A',/,1x,
135  & 'RENUMBERING OF POINTS WITH STBTEL')
136  CALL plante(1)
137  stop
138  ELSEIF(t1(ipoin).GT.mxptvs) THEN
139  WRITE(lu,95) ipoin
140 95 FORMAT(1x,'FROPRO: POINT ',1i6,' HAS TOO MANY NEIGHBOURS')
141  CALL plante(1)
142  stop
143  ENDIF
144  ENDDO
145 !
146 ! BUILDS ARRAY LIMVOI
147 ! LIMVOI(K,1) : BEGINNING OF SERIES WITH K NEIGHBOURS
148 ! LIMVOI(K,2) : END OF SERIES WITH K NEIGHBOURS
149 !
150  DO k=1,mxptvs
151  limvoi(k,1) = 0
152  limvoi(k,2) = 0
153  ENDDO
154 ! POINT 1 IS THE BEGINNING OF SERIES WITH T1(1) NEIGHBOURS
155  nbvois = t1(1)
156  limvoi(nbvois,1) = 1
157  DO i=2,npoin
158  IF(t1(i).NE.nbvois) THEN
159 ! PREVIOUS POINT WAS AN END OF A SERIES
160  limvoi(nbvois,2) = i-1
161 ! CURRENT POINT IS THE BEGINNING OF A SERIES
162  nbvois = t1(i)
163  limvoi(nbvois,1) = i
164  ENDIF
165  ENDDO
166 ! POINT NPOIN IS THE END OF ITS SERIES
167  limvoi(nbvois,2) = npoin
168 !
169 ! ARRAYS FOR FRONTAL MATRIX-VECTOR PRODUCT :
170 !
171  DO ipoin = 1,npoin
172  t1(ipoin) = 1
173  ENDDO
174 !
175  IF(optass.EQ.3) THEN
176 !
177 ! IY DOES NOT DEPEND HERE ON THE DIRECT OR TRANSPOSE CHARACTER
178  DO isg = 1,nseg
179  i1 = gloseg(isg,1)
180  i2 = gloseg(isg,2)
181 !
182 ! ANY MATRIX
183 ! IXM IN DIRECT PRODUCT
184  iklem1(i1,t1(i1),1,1) = isg
185  iklem1(i2,t1(i2),1,1) = isg + nseg
186 ! IY IN DIRECT PRODUCT
187  iklem1(i1,t1(i1),2,1) = i2
188  iklem1(i2,t1(i2),2,1) = i1
189 ! IXM IN TRANSPOSE PRODUCT
190  iklem1(i1,t1(i1),3,1) = isg + nseg
191  iklem1(i2,t1(i2),3,1) = isg
192 ! IY IN TRANSPOSE PRODUCT
193  iklem1(i1,t1(i1),4,1) = i2
194  iklem1(i2,t1(i2),4,1) = i1
195 !
196 ! SYMMETRICAL MATRIX
197 ! IXM IN DIRECT PRODUCT
198  iklem1(i1,t1(i1),1,2) = isg
199  iklem1(i2,t1(i2),1,2) = isg
200 ! IY IN DIRECT PRODUCT
201  iklem1(i1,t1(i1),2,2) = i2
202  iklem1(i2,t1(i2),2,2) = i1
203 ! IXM IN TRANSPOSE PRODUCT
204  iklem1(i1,t1(i1),3,2) = isg
205  iklem1(i2,t1(i2),3,2) = isg
206 ! IY IN TRANSPOSE PRODUCT
207  iklem1(i1,t1(i1),4,2) = i2
208  iklem1(i2,t1(i2),4,2) = i1
209 !
210 ! UPDATES THE NUMBER OF NEIGHBOURS
211  t1(i1) = t1(i1) + 1
212  t1(i2) = t1(i2) + 1
213  ENDDO
214 !
215  ELSE
216  WRITE(lu,*) 'UNKNOWN STORAGE IN FROPRO :',optass
217  CALL plante(1)
218  stop
219  ENDIF
220 !
221  ENDIF
222 !
223 !-----------------------------------------------------------------------
224 !
225  RETURN
226  END
subroutine fropro(NBOR, IKLE, NELEM, NELMAX, NPOIN, NPMAX, NPTFR, IELM, IKLEM1, LIMVOI, OPTASS, PRODUC, MXPTVS, T1, GLOSEG, SIZGLO, NSEG)
Definition: fropro.f:9
Definition: bief.f:3