The TELEMAC-MASCARET system  trunk
fasp.f
Go to the documentation of this file.
1 ! ***************
2  SUBROUTINE fasp
3 ! ***************
4 !
5  &(x,y,zf,npoin,xrelv,yrelv,zrelv,np,nbor,kp1bor,nptfr,dm)
6 !
7 !***********************************************************************
8 ! BIEF V6P1 21/08/2010
9 !***********************************************************************
10 !
11 !brief INTERPOLATES THE BOTTOM ELEVATIONS FROM A SET OF
12 !+ POINTS ON THE MESH NODES.
13 !
14 !history J-M HERVOUET (LNHE)
15 !+ 20/03/08
16 !+ V5P9
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 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
32 !| DM |-->| MINIMUM DISTANCE TO BOUNDARY TO ACCEPT A POINT
33 !| KP1BOR |-->| GIVES THE NEXT BOUNDARY POINT IN A CONTOUR
34 !| NBOR |-->| GLOBAL NUMBER OF BOUNDARY POINTS
35 !| NP |-->| NUMBER OF BATHYMETRY POINTS
36 !| NPOIN |-->| NUMBER OF POINTS IN THE MESH
37 !| NPTFR |-->| NUMBER OF BOUNDARY POINTS
38 !| X,Y |-->| MESH COORDINATES
39 !| XRELV |-->| ABCISSAE OF BATHYMETRY POINTS
40 !| YRELV |-->| ORDINATES OF BATHYMETRY POINTS
41 !| ZF |<--| INTERPOLATED BATHYMETRY
42 !| ZRELV |-->| ELEVATIONS OF BATHYMETRY POINTS
43 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
44 !
45  USE bief, ex_fasp => fasp
46 !
48  IMPLICIT NONE
49 !
50 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
51 !
52  INTEGER, INTENT(IN) :: NPOIN,NP,NPTFR
53  INTEGER, INTENT(IN) :: NBOR(nptfr),KP1BOR(nptfr)
54  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin),DM
55  DOUBLE PRECISION, INTENT(IN) :: XRELV(np),YRELV(np),ZRELV(np)
56  DOUBLE PRECISION, INTENT(OUT) :: ZF(npoin)
57 !
58 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 !
60  INTEGER N,INUM,I
61 !
62  DOUBLE PRECISION DIST1,DIST2,DIST3,DIST4
63  DOUBLE PRECISION ZCADR1,ZCADR2,ZCADR3,ZCADR4
64  DOUBLE PRECISION DIFX,DIFY,DIST,X1,Y1,X2,Y2,X3,Y3,X4,Y4
65  DOUBLE PRECISION ZNUM,ZDEN
66 !
67  LOGICAL OK1,OK2,OK3,OK4
68 !
69 !-----------------------------------------------------------------------
70 !
71 ! LOOP ON THE MESH NODES:
72 !
73  DO i = 1 , npoin
74 !
75 ! INTERPOLATES THE BOTTOM FROM 4 QUADRANTS
76 !
77 ! ----> INITIALISES:
78 !
79  dist1=1.d12
80  dist2=1.d12
81  dist3=1.d12
82  dist4=1.d12
83 !
84  ok1 = .false.
85  ok2 = .false.
86  ok3 = .false.
87  ok4 = .false.
88 !
89  zcadr1=0.d0
90  zcadr2=0.d0
91  zcadr3=0.d0
92  zcadr4=0.d0
93 !
94 ! ---------> LOOP ON THE SET OF POINTS (THERE ARE NP):
95  DO n=1,np
96  difx = xrelv(n)-x(i)
97  dify = yrelv(n)-y(i)
98  dist = difx*difx + dify*dify
99 !
100  IF ( dist.LT.1.d-6 ) dist=1.d-6
101 ! ->QUADRANT 1 :
102  IF( difx.LE.0.d0.AND.dify.LE.0.d0) THEN
103  IF(dist.LE.dist1)THEN
104  x1=xrelv(n)
105  y1=yrelv(n)
106  dist1=dist
107  zcadr1=zrelv(n)
108  ok1 = .true.
109  ENDIF
110 ! ->QUADRANT 2 :
111  ELSE IF( difx.GE.0.d0.AND.dify.LE.0.d0) THEN
112  IF(dist.LE.dist2)THEN
113  x2=xrelv(n)
114  y2=yrelv(n)
115  dist2=dist
116  zcadr2=zrelv(n)
117  ok2 = .true.
118  ENDIF
119 ! ->QUADRANT 3 :
120  ELSE IF( difx.GE.0.d0.AND.dify.GE.0.d0) THEN
121  IF(dist.LE.dist3)THEN
122  x3=xrelv(n)
123  y3=yrelv(n)
124  dist3=dist
125  zcadr3=zrelv(n)
126  ok3 = .true.
127  ENDIF
128 ! ->QUADRANT 4 :
129  ELSE IF( difx.LE.0.d0.AND.dify.GE.0.d0) THEN
130  IF(dist.LE.dist4)THEN
131  x4=xrelv(n)
132  y4=yrelv(n)
133  dist4=dist
134  zcadr4=zrelv(n)
135  ok4 = .true.
136  ENDIF
137  ENDIF
138  ENDDO ! N
139 !
140 ! ---------> END OF LOOP ON THE SET OF POINTS
141 !
142  IF(ok1) CALL crosfr(x(i),y(i),x1,y1,x,y,npoin,nbor,kp1bor,
143  & nptfr,dm,ok1)
144  IF(ok2) CALL crosfr(x(i),y(i),x2,y2,x,y,npoin,nbor,kp1bor,
145  & nptfr,dm,ok2)
146  IF(ok3) CALL crosfr(x(i),y(i),x3,y3,x,y,npoin,nbor,kp1bor,
147  & nptfr,dm,ok3)
148  IF(ok4) CALL crosfr(x(i),y(i),x4,y4,x,y,npoin,nbor,kp1bor,
149  & nptfr,dm,ok4)
150 !
151  znum = 0.d0
152  zden = 0.d0
153  inum = 0
154  IF(ok1) THEN
155  znum = znum + zcadr1/dist1
156  zden = zden + 1.d0/dist1
157  inum = inum + 1
158  ENDIF
159  IF(ok2) THEN
160  znum = znum + zcadr2/dist2
161  zden = zden + 1.d0/dist2
162  inum = inum + 1
163  ENDIF
164  IF(ok3) THEN
165  znum = znum + zcadr3/dist3
166  zden = zden + 1.d0/dist3
167  inum = inum + 1
168  ENDIF
169  IF(ok4) THEN
170  znum = znum + zcadr4/dist4
171  zden = zden + 1.d0/dist4
172  inum = inum + 1
173  ENDIF
174 !
175  IF(inum.NE.0) THEN
176 ! ZF : WATER DEPTH AT THE POINT
177  zf(i)=znum/zden
178  ELSE
179  zf(i) = -1.d6
180  ENDIF
181 !
182  ENDDO ! I
183 !
184 !-----------------------------------------------------------------------
185 !
186  RETURN
187  END
subroutine fasp(X, Y, ZF, NPOIN, XRELV, YRELV, ZRELV, NP, NBOR, KP1BOR, NPTFR, DM)
Definition: fasp.f:7
subroutine crosfr(X, Y, XR, YR, XMAIL, YMAIL, NPMAX, NBOR, KP1BOR, NPTFR, DM, OK)
Definition: crosfr.f:7
Definition: bief.f:3