30 REAL(GRIDMAN_DP),
INTENT(IN) :: X1,Y1,X2,Y2,X3,Y3
31 REAL(GRIDMAN_DP) :: GRIDMAN_TRIAAREA,S
33 s=x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2)
34 gridman_triaarea=0.5*abs(s)
46 REAL(GRIDMAN_DP),
INTENT(IN) :: X1,Y1,X2,Y2,X3,Y3
47 REAL(GRIDMAN_DP) :: GRIDMAN_TRIAVOL,GRIDMAN_TRIAAREA
50 gridman_triavol=pi3*(x1+x2+x3)*
51 * gridman_triaarea(x1,y1,x2,y2,x3,y3)
63 REAL(GRIDMAN_DP),
INTENT(IN) :: X1,Y1,X2,Y2
64 REAL(GRIDMAN_DP) :: GRIDMAN_DIST2D
66 gridman_dist2d=sqrt((x1-x2)**2+(y1-y2)**2)
77 REAL(GRIDMAN_DP),
INTENT(IN) :: X0,Y0
78 REAL(GRIDMAN_DP),
INTENT(OUT) :: XN,YN
94 REAL(GRIDMAN_DP),
INTENT(IN) :: X1,Y1,X2,Y2
95 REAL(GRIDMAN_DP) :: GRIDMAN_CONAREA
97 gridman_conarea=
gridman_pi*(x1+x2)*sqrt((x1-x2)**2+(y1-y2)**2)
113 REAL(GRIDMAN_DP),
INTENT(IN) :: X0
115 REAL(GRIDMAN_DP),
INTENT(IN) :: Y0
117 REAL(GRIDMAN_DP),
INTENT(IN) :: V
119 REAL(GRIDMAN_DP),
INTENT(IN) :: U
121 REAL(GRIDMAN_DP),
INTENT(IN) :: X1
123 REAL(GRIDMAN_DP),
INTENT(IN) :: Y1
125 REAL(GRIDMAN_DP),
INTENT(IN) :: X2
127 REAL(GRIDMAN_DP),
INTENT(IN) :: Y2
129 REAL(GRIDMAN_DP),
INTENT(OUT) :: XI
131 REAL(GRIDMAN_DP),
INTENT(OUT) :: YI
132 LOGICAL GRIDMAN_CROSS2D
134 REAL(GRIDMAN_DP) :: D,T
136 d=v*(y2-y1)+u*(x1-x2)
137 IF(abs(d).LT.10.*tiny(d))
THEN
138 gridman_cross2d=.false.
141 t=x1*y2-x2*y1+(y1-y2)*x0+(x2-x1)*y0
143 IF(.NOT.t.GT.0.)
THEN
144 gridman_cross2d=.false.
150 IF( ( xi.GT.x1.AND.xi.GT.x2 ) .OR.
151 f ( xi.LT.x1.AND.xi.LT.x2 ) .OR.
152 f ( yi.GT.y1.AND.yi.GT.y2 ) .OR.
153 f ( yi.LT.y1.AND.yi.LT.y2 ) )
THEN
154 gridman_cross2d=.false.
156 gridman_cross2d=.true.
166 f x21,y21,x22,y22,xi,yi)
172 REAL(GRIDMAN_DP),
INTENT(IN) :: X11
174 REAL(GRIDMAN_DP),
INTENT(IN) :: Y11
176 REAL(GRIDMAN_DP),
INTENT(IN) :: X12
178 REAL(GRIDMAN_DP),
INTENT(IN) :: Y12
180 REAL(GRIDMAN_DP),
INTENT(IN) :: X21
182 REAL(GRIDMAN_DP),
INTENT(IN) :: Y21
184 REAL(GRIDMAN_DP),
INTENT(IN) :: X22
186 REAL(GRIDMAN_DP),
INTENT(IN) :: Y22
188 REAL(GRIDMAN_DP),
INTENT(OUT) :: XI
190 REAL(GRIDMAN_DP),
INTENT(OUT) :: YI
191 LOGICAL :: GRIDMAN_INTERSECT2D
193 REAL(GRIDMAN_DP) :: A1,B1,C1,A2,B2,C2,DET
197 c1=y11*(x12-x11)-x11*(y12-y11)
200 c2=y21*(x22-x21)-x21*(y22-y21)
202 IF(abs(det).GT.tiny(det))
THEN
207 IF(abs(a1).GT.abs(b1))
THEN
209 IF( ( yi.GT.y11.AND.yi.GT.y12 ) .OR.
210 f ( yi.LT.y11.AND.yi.LT.y12 ) )
THEN
211 gridman_intersect2d=.false.
216 IF( ( xi.GT.x11.AND.xi.GT.x12 ) .OR.
217 f ( xi.LT.x11.AND.xi.LT.x12 ) )
THEN
218 gridman_intersect2d=.false.
223 IF(abs(a2).GT.abs(b2))
THEN
225 IF( ( yi.GT.y21.AND.yi.GT.y22 ) .OR.
226 f ( yi.LT.y21.AND.yi.LT.y22 ))
THEN
227 gridman_intersect2d=.false.
232 IF( ( xi.GT.x21.AND.xi.GT.x22 ) .OR.
233 f ( xi.LT.x21.AND.xi.LT.x22 ))
THEN
234 gridman_intersect2d=.false.
238 gridman_intersect2d=.true.
240 gridman_intersect2d=.false.
261 INTRINSIC tiny,abs,mod
264 INTEGER(GRIDMAN_SP),
INTENT(IN) :: NP
266 REAL(GRIDMAN_DP) :: XP(np)
268 REAL(GRIDMAN_DP) :: YP(np)
270 REAL(GRIDMAN_DP) :: X0
272 REAL(GRIDMAN_DP) :: Y0
274 LOGICAL :: GRIDMAN_POINT_IN_POLYGON
276 REAL(GRIDMAN_DP) :: Y1,Y2,DY,X1,X2,DX,XI
277 INTEGER(GRIDMAN_SP) :: IP,CN
286 IF(.NOT.abs(dy).GT.10*tiny(dy)) cycle
290 IF(y1.LT.y0.AND.y0.LT.y2)
THEN
298 ELSEIF(dy.LT.0.)
THEN
301 IF(y2.LT.y0.AND.y0.LT.y1)
THEN
312 IF(mod(cn,2).EQ.0)
THEN
313 gridman_point_in_polygon=.false.
315 gridman_point_in_polygon=.true.
330 REAL(GRIDMAN_DP),
INTENT(IN) :: X1
332 REAL(GRIDMAN_DP),
INTENT(IN) :: Y1
334 REAL(GRIDMAN_DP),
INTENT(IN) :: X2
336 REAL(GRIDMAN_DP),
INTENT(IN) :: Y2
338 REAL(GRIDMAN_DP),
INTENT(IN) :: X
340 REAL(GRIDMAN_DP),
INTENT(IN) :: Y
342 REAL(GRIDMAN_DP),
INTENT(IN) :: TOL
343 LOGICAL :: GRIDMAN_CLOSE2INTERVAL2D
345 REAL(GRIDMAN_DP) :: D,DX,DY,EPS
349 d=abs(dx*x+dy*y+x2*y1-x1*y2)
350 eps=abs(dx*x)*tol+abs(dy*y)*tol+10.*tiny(x)
353 IF( abs(dy).GT.abs(dx) )
THEN
356 eps=abs(x)*tol+10.*tiny(x)
357 IF( (x.GT.x1-eps.AND.x.LT.x2+eps).OR.
358 f (x.GT.x2-eps.AND.x.LT.x1+eps))
THEN
360 gridman_close2interval2d=.true.
362 gridman_close2interval2d=.false.
367 eps=abs(y)*tol+10.*tiny(y)
368 IF( (y.GT.y1-eps.AND.y.LT.y2+eps).OR.
369 f (y.GT.y2-eps.AND.y.LT.y1+eps))
THEN
370 gridman_close2interval2d=.true.
372 gridman_close2interval2d=.false.
376 gridman_close2interval2d=.false.
logical function gridman_intersect2d(X11, Y11, X12, Y12, X21, Y21, X22, Y22, XI, YI)
Intersection of two intervals on a plane.
logical function gridman_cross2d(X0, Y0, V, U, X1, Y1, X2, Y2, XI, YI)
Intersection of "particle trajectory" with an interval (2D)
real(gridman_dp), save, public gridman_tol
Tolerance parameter which is used to compare two real numbers.
integer, parameter, public gridman_dp
Kind parameter for real numbers.
real(gridman_dp) function gridman_triavol(X1, Y1, X2, Y2, X3, Y3)
Volume of the solid of revolution obtained by rotating of a triangle around axis X=0.
logical function gridman_close2interval2d(X1, Y1, X2, Y2, X, Y, TOL)
Find if point is close to the interval within prescribed tolerance.
real(gridman_dp) function gridman_conarea(X1, Y1, X2, Y2)
Area of the conical surface obtained by rotation of the interval (X1,Y1),(X2,Y2) around X=0...
logical function gridman_point_in_polygon(XP, YP, NP, X0, Y0)
Find if point lies inside a closed polygon.
real(gridman_dp), parameter, public gridman_2pi
2PI number
real(gridman_dp) function gridman_triaarea(X1, Y1, X2, Y2, X3, Y3)
Area of a triangle.
real(gridman_dp), parameter, public gridman_pi
PI number.
Definition of data types, global constants and variables.
real(gridman_dp) function gridman_dist2d(X1, Y1, X2, Y2)
Distance between two points on a plane.
subroutine gridman_norm2d(X0, Y0, XN, YN)
Vector (XY,YN) normal to (X0,Y0)
integer, parameter, public gridman_sp
Kind parameter for integer numbers.