The TELEMAC-MASCARET system  trunk
proxim.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE proxim
3 ! *****************
4 !
5  &(ip,xp,yp,x,y,np,npoin,ikle,nelem,nelmax)
6 !
7 !***********************************************************************
8 ! BIEF V7P3
9 !***********************************************************************
10 !
11 !brief IDENTIFIES THE POINTS OF THE MESH CLOSEST TO A SET
12 !+ OF GIVEN POINTS.
13 !
14 !history J-M HERVOUET (LNHE)
15 !+ 03/07/2009
16 !+ V6P0
17 !+
18 !
19 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
20 !+ 13/07/2010
21 !+ V6P0
22 !+ Translation of French comments within the FORTRAN sources into
23 !+ English comments
24 !
25 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
26 !+ 21/08/2010
27 !+ V6P0
28 !+ Creation of DOXYGEN tags for automated documentation and
29 !+ cross-referencing of the FORTRAN sources
30 !
31 !history J-M HERVOUET (LNHE)
32 !+ 16/11/2012
33 !+ V6P3
34 !+ Write statements added.
35 !
36 !history J-M HERVOUET (LNHE)
37 !+ 24/12/2013
38 !+ V7P0
39 !+ In parallel the distance between given points and points in the
40 !+ mesh must be now less than 1.D-8 instead of 1.D-4 (to avoid
41 !+ problems with subroutine ecrspe in Tomawac)
42 !
43 !history J-M HERVOUET (LNHE)
44 !+ 14/11/2014
45 !+ V7P0
46 !+ Checking that a point belongs to at least one sub-domain in
47 !+ parallel mode.
48 !
49 !history J-M HERVOUET (LNHE)
50 !+ 16/06/2016
51 !+ V7P2
52 !+ Reverting to the original algorithm in sequential mode, for parallel
53 !+ also: choosing the nearest point in the mesh. In case of parallelism
54 !+ the nearest of all points in all sub-domains is chosen.
55 !
56 !history J-M HERVOUET (LNHE)
57 !+ 29/10/2017
58 !+ V7P3
59 !+ Once a processor has found a source point, it must be communicated
60 !+ to others in case this point is on an interface. This is done by
61 !+ simply comparing the coordinates.
62 !
63 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
64 !| IKLE |-->| CONNECTIVITY TABLE.
65 !| IP |<--| ADDRESSES OF NEAREST POINTS
66 !| NELEM |-->| NUMBER OF ELEMENTS
67 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS
68 !| NP |-->| NUMBER OF POINTS IN THE SET
69 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
70 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
71 !| XP |-->| ABSCISSAE OF POINTS IN THE SET
72 !| Y |-->| ORDINATES OF POINTS IN THE MESH
73 !| YP |-->| ORDINATES OF POINTS IN THE SET
74 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
75 !
77  USE bief, ex_proxim => proxim
78 !
80  IMPLICIT NONE
81 !
82 !
83 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
84 !
85  INTEGER, INTENT(IN) :: NP,NPOIN,NELEM,NELMAX
86  INTEGER, INTENT(INOUT) :: IP(np)
87  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
88 !
89  DOUBLE PRECISION, INTENT(IN) :: XP(np),YP(np),X(npoin),Y(npoin)
90 !
91 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
92 !
93  INTEGER I,K,IELEM
94  DOUBLE PRECISION X1,Y1,X2,Y2,X3,Y3,A31,A12,A23,DIST2,D2
95  DOUBLE PRECISION XX,YY
96 !
97  INTRINSIC sqrt
98 !
99 !-----------------------------------------------------------------------
100 !
101  IF(np.GT.0) THEN
102  DO k=1,np
103  ip(k)=0
104  dist2=1.d10
105  xx=-1.d10
106  yy=-1.d10
107 !
108 ! LOOP ON THE TRIANGLES TO FIND THE NEAREST POINT IN THE (SUB-)DOMAIN:
109 !
110  DO ielem=1,nelem
111  x1=x(ikle(ielem,1))
112  x2=x(ikle(ielem,2))
113  x3=x(ikle(ielem,3))
114  y1=y(ikle(ielem,1))
115  y2=y(ikle(ielem,2))
116  y3=y(ikle(ielem,3))
117  a31=xp(k)*y3-yp(k)*x3+x3*y1-x1*y3+x1*yp(k)-xp(k)*y1
118  a12=xp(k)*y1-yp(k)*x1+x1*y2-x2*y1+x2*yp(k)-xp(k)*y2
119  a23=xp(k)*y2-yp(k)*x2+x2*y3-x3*y2+x3*yp(k)-xp(k)*y3
120  IF(a31.GT.-1.d-6.AND.a12.GT.-1.d-6.AND.a23.GT.-1.d-6) THEN
121 ! TAKES THE NEAREST NODE
122  DO i=1,3
123  d2=(xp(k)-x(ikle(ielem,i)))**2+(yp(k)-y(ikle(ielem,i)))**2
124  IF(d2.LT.dist2) THEN
125  ip(k)=ikle(ielem,i)
126  xx=x(ikle(ielem,i))
127  yy=y(ikle(ielem,i))
128  dist2=d2
129  ENDIF
130  ENDDO
131  ENDIF
132  ENDDO
133 !
134 ! CHECKING THAT THE POINT IS IN THE GLOBAL DOMAIN
135 ! IF YES PRINTING THE COORDINATES OF THE NEAREST POINT FOUND
136 !
137  i=ip(k)
138  IF(ncsize.GT.1) i=p_max(i)
139  IF(i.EQ.0) THEN
140 ! THE POINT IS NOT IN THE DOMAIN
141  WRITE(lu,*)
142  WRITE(lu,*) 'SPECTRUM OR SOURCE POINT ',k,' OUTSIDE DOMAIN'
143  CALL plante(1)
144  stop
145  ELSE
146 ! THE POINT IS IN THE DOMAIN. IN PARALLEL SEVERAL NEAREST POINTS
147 ! MAY HAVE BEEN FOUND, FINDING THE REAL NEAREST ONE
148  x1=xx
149  y1=yy
150  IF(ncsize.GT.1) THEN
151  IF(dist2.NE.p_min(dist2)) THEN
152  x1=0.d0
153  y1=0.d0
154  ENDIF
155  x1=p_min(x1)+p_max(x1)
156  y1=p_min(y1)+p_max(y1)
157 ! ALL PROCESSORS HAVING THE POINT MUST KNOW IT
158 ! YET POINTS WITHIN A TRIANGLE IN ANOTHER PROCESSOR
159 ! AND FALLEN BACK ON AN INTERFACE HAVE BEEN OVERLOOKED
160 ! SO FAR BY OTHER PROCESSORS.
161  DO i=1,npoin
162  IF(x(i).EQ.x1.AND.y(i).EQ.y1) ip(k)=i
163  ENDDO
164  ENDIF
165  WRITE(lu,*)
166  WRITE(lu,*) 'SOURCE POINT ',k,'PUT ON POINT'
167  WRITE(lu,*) x1,' AND ',y1
168  d2 = sqrt(p_min(dist2))
169  WRITE(lu,*) 'LOCATED AT ',d2,' METRES'
170 ! LINE FEED FOR THE LISTING
171  IF(k.EQ.np) WRITE(lu,*)
172  ENDIF
173  ENDDO
174  ENDIF
175 !
176 !-----------------------------------------------------------------------
177 !
178  RETURN
179  END
subroutine proxim(IP, XP, YP, X, Y, NP, NPOIN, IKLE, NELEM, NELMAX)
Definition: proxim.f:7
Definition: bief.f:3