The TELEMAC-MASCARET system  trunk
infcel.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE infcel
3 ! *****************
4 !
5  &(xx,yy,nubo,vnoin,npoin,nelem,nseg,cmi,airst,
6  & gloseg,coord_g,eltseg,oriseg,ifabor)
7 !
8 !***********************************************************************
9 ! BIEF V6P3 21/12/20112
10 !***********************************************************************
11 !
12 !brief REPLACE OLD INFCEL: NOW COMMON NUBO (GLOSEG) WITH FE
13 ! COMPUTES CMI, AIRST AND NORMALS (VNOIN)
14 !
15 !history
16 !+ 18/06/03
17 !+ V5P4
18 !+
19 !
20 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
21 !+ 13/07/2010
22 !+ V6P0
23 !+ Translation of French comments within the FORTRAN sources into
24 !+ English comments
25 !
26 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
27 !+ 21/08/2010
28 !+ V6P0
29 !+ Creation of DOXYGEN tags for automated documentation and
30 !+ cross-referencing of the FORTRAN sources
31 !
32 !history R. ATA (EDF R&D - LNHE)
33 !+ 21/01/2013
34 !+ V6P3
35 !+ rewritten for new data structure of finite volumes
36 !+
37 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
38 !| IFAPAR |-->| IFAPAR(1:3,IELEM)=PROCESSOR NUMBERS BEHIND THE
39 !| | | 3 ELEMENT EDGES (NUMBERS FROM 0 TO NCSIZE-1)
40 !| | | IFAPAR(4:6,IELEM): -LOCAL- ELEMENT NUMBERS
41 !| | | BEHIND THE 3 EDGES
42 !| AIRST |<--| AREAS OF SUB-TRIANGLES IG1G2
43 !| CMI |<--| COORDINATES OF MID-INTERFACE POINTS
44 !| INDPU |-->| INDEX TABLE : IF 0: NOT AN INTERFACE POINT
45 !| | | IF NOT 0: ADDRESS IN THE LIST
46 !| | | OF BOUNDARY POINTS.
47 !| IFABOR |-->| IFABOR(IEL,I) IS THE ELEMENT BEHIND THE EDGE I OF
48 !| |---| ELEMENT IEL, OTHERWISE
49 !| |---| IFABOR(IEL,I) = -2 : THIS IS INTERFACE EDGE
50 !| |---| IFABOR(IEL,I) = 0 : THIS IS BOUNDARY EDGE
51 !| |---| IFABOR(IEL,I) = -1 : THIS IS LIQUID BOUNDARY EDGE
52 !| KNOLG |-->| CONVERSION FROM LOCAL TO GLOBAL NUMEBEING
53 !| KP1BOR |<--| NUMBER OF FOLLOWING AND PRECEDING NODE OF BOUNDARY POINT K.
54 !| MESH |-- | MESH STRUCTURE
55 !| NB_NEIGHB_SEG |-->| NUMBER OF NEIGHBOURING SUB-DOMAINS (FOR EDGES)
56 !| NELEM |-->| NUMBER OF ELEMENTS
57 !| NPOIN |-->| NUMBER OF POINTS
58 !| NSEG |-->| NUMBER OF SEGMENTS
59 !| NUBO |<--| FIRST AND SECOND POINT OF SEGMENTS (GLOSEG ?)
60 !| VNOIN |<--| NORMAL TO THE INTERFACE
61 !| | | (2 FIRST COMPONENTS) AND
62 !| | | SEGMENT LENGTH (3RD COMPONENT)
63 !| XX |-->| ABSCISSAE OF POINTS IN THE MESH
64 !| YY |-->| ORDINATES OF POINTS IN THE MESH
65 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
66 !
67  USE bief_def
68  IMPLICIT NONE
69 !
70 !
71 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 !
73  INTEGER, INTENT(IN) :: NSEG,NPOIN,NELEM
74 ! TO REPLACE IN NEXT RELEASE
75  INTEGER, INTENT(INOUT) :: NUBO(2,nseg)
76  INTEGER, INTENT(IN) :: GLOSEG(nseg,2)
77  INTEGER, INTENT(IN) :: ELTSEG(nelem,3)
78  INTEGER, INTENT(IN) :: ORISEG(nelem,3)
79  DOUBLE PRECISION, INTENT(IN) :: XX(npoin),YY(npoin),CMI(2,nseg)
80  DOUBLE PRECISION, INTENT(INOUT) :: VNOIN(3,nseg)
81  DOUBLE PRECISION, INTENT(INOUT) :: AIRST(2,*)
82  DOUBLE PRECISION, INTENT(IN) :: COORD_G(nseg,4)
83  INTEGER, INTENT(IN) :: IFABOR(nelem,3)
84 !
85 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
86 !
87  INTEGER NB1,NB2,ISEG,IEL,FACT,I,IER
88  DOUBLE PRECISION,PARAMETER :: EPS= 1.d-14
89  DOUBLE PRECISION X1,Y1,X2,Y2,RNORM,XGG,YGG,XG1,YG1,XG2,YG2
90 !
91  INTRINSIC abs,sqrt
92 !
93  LOGICAL, ALLOCATABLE :: YESNO(:)
94  ALLOCATE(yesno(nseg),stat=ier)
95  CALL check_allocate(ier, 'INFCEL')
96 !
97 !-----------------------------------------------------------------------
98 !
99 !-----------------
100 ! 1. INITIALISES
101 !-----------------
102 !
103  DO iseg = 1 , nseg
104  vnoin(1,iseg) = 0.d0
105  vnoin(2,iseg) = 0.d0
106  vnoin(3,iseg) = 0.d0
107  yesno(iseg) =.false.
108  ENDDO
109 !
110 !-----------------
111 ! 2. MAIN LOOP
112 !-----------------
113 !
114  DO iel=1, nelem
115  DO i = 1,3
116  IF(.NOT.yesno(eltseg(iel,i)))THEN
117  fact=1
118  iseg = eltseg(iel,i)
119 ! LET S RECUPERATE NODE NUMBERS
120  nb1 = gloseg(iseg,1)
121  nb2 = gloseg(iseg,2)
122 ! TO REMOVE REDUNDANT
123  nubo(1,iseg) = nb1
124  nubo(2,iseg) = nb2
125 ! THEIR COORDINATES
126  x1 = xx(nb1)
127  y1 = yy(nb1)
128  x2 = xx(nb2)
129  y2 = yy(nb2)
130 ! CENTER OF GRAVITY OF NEIGHBORING ELEMENTS
131  xg1 = coord_g(iseg,1)
132  yg1 = coord_g(iseg,2)
133  xg2 = coord_g(iseg,3)
134  yg2 = coord_g(iseg,4)
135  IF(ifabor(iel,i).EQ.-1.OR.ifabor(iel,i).EQ.0)THEN ! BOUNDARY SEGMENT
136  IF(abs(xg1).LT.eps.AND.abs(yg1).LT.eps)THEN !BOUNDARY SEGMENT (TO IMPROVE THE TEST!!!)
137  xg1=cmi(1,iseg) ! THIS CASE COULD REALLY HAPPEN ?!
138  yg1=cmi(2,iseg)
139  ELSEIF(abs(xg2).LT.eps.AND.abs(yg2).LT.eps)THEN
140  xg2=cmi(1,iseg)
141  yg2=cmi(2,iseg)
142  ENDIF
143  ENDIF
144 ! SURFACE OF TRIANGLES (NB1,G1,G2) AND (NB2,G1,G2)
145  airst(1,iseg)=0.5d0*abs((x1-xg1)*(y1-yg2)-
146  & (y1-yg1)*(x1-xg2))
147  airst(2,iseg)=0.5d0*abs((x2-xg1)*(y2-yg2)-
148  & (y2-yg1)*(x2-xg2))
149 ! NORMAL VECTORS TO INTERFACES AND THEIR LENGHT
150  xgg = xg1-xg2
151  ygg = yg1-yg2
152  rnorm=sqrt(xgg**2+ygg**2)
153  IF(rnorm.GT.eps) THEN
154  IF(oriseg(iel,i).EQ.2) fact=-fact
155  vnoin(1,iseg) = fact*ygg/rnorm
156  vnoin(2,iseg) = -fact*xgg/rnorm
157  vnoin(3,iseg) = rnorm
158  ELSE
159  WRITE(lu,*)'**************************************'
160  WRITE(lu,*)'INFCEL: INTERFACE LENGTH NIL',rnorm
161  WRITE(lu,*)'FOR SEGMENT',iseg
162  WRITE(lu,*)'WITH GLOBAL NODES',nb1,nb2
163  WRITE(lu,*)'**************************************'
164  CALL plante(1)
165  stop
166  ENDIF
167  yesno(iseg)=.true.
168  ENDIF
169  ENDDO
170  ENDDO
171 !
172 !---------------------------------------------------------------------
173 !
174  RETURN
175  END
subroutine infcel(XX, YY, NUBO, VNOIN, NPOIN, NELEM, NSEG, CMI, AIRST, GLOSEG, COORD_G, ELTSEG, ORISEG, IFABOR)
Definition: infcel.f:8