The TELEMAC-MASCARET system  trunk
crosfr.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE crosfr
3 ! *****************
4 !
5  &(x,y,xr,yr,xmail,ymail,npmax,nbor,kp1bor,nptfr,dm,ok)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief WANT TO INTERPOLATE THE BOTTOM ELEVATION FOR A POINT
12 !+ WITH COORDINATES X AND Y. A POINT (XR,YR) IS USED
13 !+ IN THIS INTERPOLATION.
14 !+
15 !+ CHECKS HERE THAT THIS POINT IS NOT OUTSIDE OF THE
16 !+ DOMAIN, I.E. CHECKS THAT THE SEGMENT LINKING (X,Y)
17 !+ AND (XR,YR) DOES NOT INTERSECT WITH THE DOMAIN
18 !+ BOUNDARY.
19 !
20 !warning JMH : DOES NOT WORK IN PARALLEL MODE
21 !
22 !history J-M HERVOUET (LNHE)
23 !+ 20/03/08
24 !+ V5P9
25 !+
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 13/07/2010
29 !+ V6P0
30 !+ Translation of French comments within the FORTRAN sources into
31 !+ English comments
32 !
33 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
34 !+ 21/08/2010
35 !+ V6P0
36 !+ Creation of DOXYGEN tags for automated documentation and
37 !+ cross-referencing of the FORTRAN sources
38 !
39 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
40 !| DM |-->| MINIMUM DISTANCE TO THE BOUNDARY
41 !| KP1BOR |-->| RANK OF THE NEXT POINT ALONG THE BOUNDARY
42 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY NODES
43 !| NPMAX |-->| MAXIMUM NUMBER OF POINTS IN THE MESH
44 !| NPTFR |-->| NUMBER OF BOUNDARY NODES
45 !| OK |<--| IF YES, NO CROSSING OF BOUNDARY
46 !| | | IF NO, POINT OUTSIDE THE DOMAIN
47 !| X |-->| ABSCISSA OF POINT WHERE TO INTERPOLATE
48 !| Y | | ORDINATE OF POINT WHERE TO INTERPOLATE
49 !| XMAIL |-->| ABSCISSAE OF POINTS IN THE MESH
50 !| YMAIL |-->| ORDINATES OF POINTS IN THE MESH
51 !| XR |-->| ABSCISSA OF POINT TO BE USED FOR INTERPOLATION
52 !| XR,YR |-->| ORDINATE OF POINT TO BE USED FOR INTERPOLATION
53 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
54 !
56  IMPLICIT NONE
57 !
58 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 !
60  DOUBLE PRECISION, INTENT(IN) :: X,Y,XR,YR,DM
61  INTEGER, INTENT(IN) :: NPTFR,NPMAX
62  DOUBLE PRECISION, INTENT(IN) :: XMAIL(npmax),YMAIL(npmax)
63  INTEGER, INTENT(IN) :: NBOR(nptfr),KP1BOR(nptfr)
64  LOGICAL, INTENT(INOUT) :: OK
65 !
66 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
67 !
68  INTEGER KA
69 !
70  DOUBLE PRECISION DM2,XA,YA,XB,YB,DET,ALFA,BETA,EPS,DISTA2,DISTB2
71 !
72 !-----------------------------------------------------------------------
73 !
74 ! DOES NOT CONSIDER POINTS TOO CLOSE TO THE BOUNDARY
75 ! DM : MINIMUM DISTANCE
76  dm2 = dm**2
77 !
78  DO ka=1,nptfr
79 !
80 ! INTERSECTION OF A BOUNDARY SEGMENT AND THE SEGMENT
81 ! FORMED BY THE POINTS (X,Y) AND (XR,YR)
82 !
83  xa = xmail(nbor(ka))
84  ya = ymail(nbor(ka))
85  xb = xmail(nbor(kp1bor(ka)))
86  yb = ymail(nbor(kp1bor(ka)))
87 !
88  det = (xr-x)*(ya-yb) - (yr-y)*(xa-xb)
89 !
90  IF(abs(det).LT.1.d-6) cycle
91 !
92  alfa = ( (xa-x)*(ya-yb) - (ya-y)*(xa-xb) ) / det
93  beta = ( (xr-x)*(ya-y ) - (yr-y)*(xa-x ) ) / det
94 !
95  eps=0.05d0
96  IF(alfa.GE.eps.AND.alfa.LE.1.d0-eps.AND.
97  & beta.GE.eps.AND.beta.LE.1.d0-eps) THEN
98  ok = .false.
99  EXIT
100  ENDIF
101 !
102 ! ALSO ELIMINATES THE POINTS TOO CLOSE TO THE BOUNDARY
103 !
104  dista2 = (xr-xa)**2 + (yr-ya)**2
105  distb2 = (xr-xb)**2 + (yr-yb)**2
106  IF(dista2.LT.dm2.OR.distb2.LT.dm2) THEN
107  ok = .false.
108  EXIT
109  ENDIF
110 !
111  ENDDO ! KA
112 !
113 !-----------------------------------------------------------------------
114 !
115  RETURN
116  END
subroutine crosfr(X, Y, XR, YR, XMAIL, YMAIL, NPMAX, NBOR, KP1BOR, NPTFR, DM, OK)
Definition: crosfr.f:7