The TELEMAC-MASCARET system  trunk
read_drogues.f
Go to the documentation of this file.
1 ! ***********************
2  SUBROUTINE read_drogues
3 ! ***********************
4 !
5  &( np,np_max,xp,yp,zp,tagp,clsp,eltp,shpp,
6  & npoin2,npoin3,nelem,nelmax,ikle,x,y,t2dplo )
7 !
8 !***********************************************************************
9 ! BIEF V8P0
10 !***********************************************************************
11 !
12 !brief Reads the results for a given time step from a drogues file.
13 !+ The drogues file will have to have been created previously
14 !+ by the TELEMAC system
15 !
16 !history S.E. BOURBAN (HRW)
17 !+ 21/08/2018
18 !+ V8P0
19 !+ New subroutine created to allow for continuous simulation.
20 !
21 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 !| CLSP |<--| CLASS OF DROGUES
23 !| ELTP |<--| ELEMENT FOR EACH DROGUE
24 !| IKLE |-->| CONNECTIVITY TABLE
25 !| NELEM |-->| NUMBER OF ELEMENTS IN THE MESH
26 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN THE MESH
27 !| NP |<--| NUMBER OF DROGUES
28 !| NPOIN2 |-->| NUMBER OF POINTS OF 2D MESH
29 !| NPOIN3 |-->| NUMBER OF POINTS OF 3D MESH
30 !| NP_MAX |-->| MAXIMUM NUMBER OF DROGUES
31 !| SHPP |<--| BARYCENTRIC COORDINATES OF DROGUES IN THEIR
32 !| | | ELEMENTS.
33 !| TAGP |<--| TAG OF DROGUES
34 !| T2DPLO |-->| PREVIOUS DROGUES COMPUTATION FILE
35 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
36 !| XP |<--| ABSCISSAE OF DROGUES
37 !| Y |-->| ORDINATES OF POINTS IN THE MESH
38 !| YP |<--| ORDINATES OF DROGUES
39 !| ZP |<--| ELEVATIONS OF DROGUES
40 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
41 !
42  USE bief
43  USE initial_drogues, ONLY : ndrg_tags
44  USE interface_parallel, ONLY : p_max
45 !
47  IMPLICIT NONE
48 !
49 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
50 !
51  TYPE(bief_file) , INTENT(IN) :: T2DPLO
52  INTEGER , INTENT(IN) :: NP_MAX,NELEM,NELMAX
53  INTEGER , INTENT(IN) :: NPOIN2,NPOIN3
54  INTEGER , INTENT(INOUT) :: NP
55  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
56  INTEGER, INTENT(INOUT) :: TAGP(np_max),ELTP(np_max)
57  INTEGER, INTENT(INOUT) :: CLSP(np_max)
58  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2)
59  DOUBLE PRECISION, INTENT(INOUT) :: XP(np_max),YP(np_max)
60  DOUBLE PRECISION, INTENT(INOUT) :: SHPP(3,np_max),ZP(np_max)
61 !
62 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
63 !
64  INTEGER, PARAMETER :: SIZELIGN = 3000
65  CHARACTER(LEN=SIZELIGN) :: LIGNE
66 !
67  INTEGER LUPLO, I,J,ILINE,ICHAR, ITIME(9), IFLOT,MFLOT
68  INTEGER JPID, N1,N2,N3
69  LOGICAL FOUND
70  DOUBLE PRECISION X0,Y0,X1,Y1,X2,Y2,X3,Y3,DET1,DET2,DET3,SURDET
71  REAL :: RVALUE
72  REAL, ALLOCATABLE :: RARRAY(:)
73  DOUBLE PRECISION, PARAMETER :: CHOUIA = 1.d-10
74 !
75 !-----------------------------------------------------------------------
76 !
77 ! HEADER OF BLUE KENUE PARCEL FILE IN ASCII FORM
78 !
79  IF( t2dplo%FMT .EQ.'BKBINPCL' .AND. t2dplo%LU.NE.0 ) THEN
80  luplo = t2dplo%LU
81  CLOSE(luplo)
82 !
83 !-----------------------------------------------------------------------
84 !
85 ! > READING THE HEADER OF THE DROGUES FILE
86 !
87  OPEN( luplo, file=trim(t2dplo%TELNAME),form='FORMATTED',
88  & access='STREAM', action='READ' )
89  iline = 0
90  ichar = 0
91  found = .false.
92  rewind(luplo)
93 ! COUNTS COMMENTS FOR NOW (TODO: RECORD ATTRIBUTES)
94  DO WHILE( .true. )
95  iline = iline + 1
96  READ( luplo,fmt='(A)',end=1001,err=1901 ) ligne
97  ichar = ichar + len(trim(ligne)) + 2
98  IF( ligne(1:18).EQ.':WrittenBy TELEMAC' ) found = .true.
99  IF( ligne(1:10).EQ.':EndHeader' ) EXIT
100  ENDDO
101  CLOSE(luplo)
102 !
103 ! CORE OF BLUE KENUE PARCEL FILE IN BINARY LITTLE ENDIAN FORM
104  OPEN( luplo, file=trim(t2dplo%TELNAME),form='UNFORMATTED',
105  & action='READ',convert='LITTLE_ENDIAN',
106  & access='STREAM', status='OLD' )
107 !
108 ! LOOKING FOR THE MAXIMUM NUMBER OF DROGUES FOR MEMORY ALLOCATION
109  mflot = 0
110  iline = 0
111  rewind(luplo)
112  READ(luplo) ligne(1:ichar)
113  DO WHILE( .true. )
114  READ(luplo,end=23,err=1902) itime
115  iline = iline + 1
116  READ(luplo,err=1902) iflot
117  mflot = max( mflot,iflot )
118  READ(luplo) ( rvalue, i = 1,iflot*4 )
119  IF( npoin2.NE.npoin3 ) THEN
120  READ(luplo) ( rvalue, i = 1,iflot )
121  ENDIF
122  READ(luplo) iflot
123  ENDDO
124  23 CONTINUE
125 !
126 ! CHECK AGAINST NUMBER OF PARCELS POSSIBLE
127  IF( mflot.GT.np_max ) THEN
128  WRITE(lu,33) mflot,np_max
129  33 FORMAT(1x,'READ_DROGUES:',/,
130  & 1x,' REQUIRED NUMBER OF DROGUES (',i8,')',/,
131  & 1x,' LARGER THAN THE MAXIMUM NUMBER OF DROGUES',/,
132  & 1x,' POSSIBLE (',i8,')',/,
133  & 1x,' INCREASE THE MAXIMUM OR REDUCE YOUR DENSITY.')
134  CALL plante(1)
135  stop
136  ENDIF
137 !
138 !-----------------------------------------------------------------------
139 !
140 ! > READING ALL RECORDS BUT THE LAST ONE
141 !
142  ALLOCATE( rarray(mflot) )
143  rewind(luplo)
144 !
145  READ(luplo) ligne(1:ichar)
146  DO j = 1,iline-1
147  READ(luplo) itime
148  READ(luplo) iflot
149  READ(luplo) ( rvalue, i = 1,iflot*4 )
150  IF( npoin2.NE.npoin3 ) THEN
151  READ(luplo) ( rvalue, i = 1,iflot )
152  ENDIF
153  READ(luplo) iflot
154  ENDDO
155 !
156 !-----------------------------------------------------------------------
157 !
158 ! > READING THE LAST RECORD
159 !
160  READ(luplo) itime
161  READ(luplo) iflot
162 ! X
163  READ(luplo) ( rarray(i), i = 1,iflot )
164  DO i = 1,iflot
165  xp(i) = rarray(i)
166  ENDDO
167 ! Y
168  READ(luplo) ( rarray(i), i = 1,iflot )
169  DO i = 1,iflot
170  yp(i) = rarray(i)
171  ENDDO
172 ! Z
173  IF( npoin2.NE.npoin3 ) THEN
174  READ(luplo) ( rarray(i), i = 1,iflot )
175  DO i = 1,iflot
176  zp(i) = rarray(i)
177  ENDDO
178  ENDIF
179 ! TAG
180  READ(luplo) ( rarray(i), i = 1,iflot )
181  DO i = 1,iflot
182  tagp(i) = int( rarray(i) )
183  ENDDO
184 ! CLASS
185  READ(luplo) ( rarray(i), i = 1,iflot )
186  DO i = 1,iflot
187  clsp(i) = int( rarray(i) )
188  ENDDO
189 !
190  DEALLOCATE(rarray)
191  CLOSE(luplo)
192 !
193 !-----------------------------------------------------------------------
194 !
195 ! > POSITIONING THE DORGUES WITHIN THE MESH
196 !
197  np = 0
198  IF( iflot.GT.0 ) THEN
199  DO i = 1,iflot
200 !
201  x0 = xp(i)
202  y0 = yp(i)
203 !
204 ! IDENTIFYING THE TRIANGLE WHERE THE PARCELS FELL IN
205 ! (FOR EACH PROCESSOR, AND IT MAY BE ON THE EDGE OF TWO OR MORE)
206 !
207  jpid = -1
208  DO j = 1,nelem
209 !
210  n1 = ikle( j,1 )
211  n2 = ikle( j,2 )
212  n3 = ikle( j,3 )
213  x1 = x(n1)
214  y1 = y(n1)
215  x2 = x(n2)
216  y2 = y(n2)
217  x3 = x(n3)
218  y3 = y(n3)
219 !
220  det1 = ( x3-x2 )*( y0-y2 ) - ( y3-y2 )*( x0-x2 )
221  det2 = ( x1-x3 )*( y0-y3 ) - ( y1-y3 )*( x0-x3 )
222  det3 = ( x2-x1 )*( y0-y1 ) - ( y2-y1 )*( x0-x1 )
223  IF( det1.GE.-chouia .AND.
224  & det2.GE.-chouia .AND.
225  & det3.GE.-chouia ) THEN
226  jpid = ipid
227  EXIT
228  ENDIF
229 !
230  ENDDO
231 !
232 ! /!\ IT IS IMPORTANT TO NOTE THAT NP .LE. IFLOT
233 !
234  IF( ncsize.GT.1 ) THEN
235  jpid = p_max(jpid)
236  ENDIF
237  IF( jpid.EQ.ipid ) THEN
238  np = np + 1
239  xp(np) = x0
240  yp(np) = y0
241  eltp(np) = j
242  surdet = 1.d0 / ( (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1) )
243  shpp(1,np) = det1*surdet
244  shpp(2,np) = det2*surdet
245  shpp(3,np) = det3*surdet
246  tagp(np) = tagp(i)
247  clsp(np) = clsp(i)
248  ENDIF
249 !
250  ENDDO
251  ENDIF
252 !
253  ndrg_tags = np
254  IF( ncsize.GT.1 ) ndrg_tags = p_max(ndrg_tags)
255  WRITE(lu,34) np
256  34 FORMAT(1x,'READ_DROGUES:',/,i8,
257  & 1x,' DROGUES HAVE BEEN READ FROM THE',/,
258  & 1x,' PREVIOUS DROGUES FILE.')
259 !
260 !-----------------------------------------------------------------------
261 !
262  ENDIF
263  RETURN
264 !
265 !-----------------------------------------------------------------------
266 !
267  1001 CONTINUE
268  WRITE(lu,*) ligne
269  WRITE(lu,*) 'REACHED THE END OF THE DROGUES FILE'
270  WRITE(lu,*) 'BEFORE FINDING THE END OF THE HEADER.'
271  WRITE(lu,*) 'MAYBE THIS IS NOT A DROGUES FILE.'
272  CALL plante(1)
273  stop
274  1901 CONTINUE
275  WRITE(lu,*) 'READING ERROR ON THE DROGUES FILE'
276  WRITE(lu,*) 'AT LINE OF DATA : ',iline
277  CALL plante(1)
278  stop
279  1902 CONTINUE
280  WRITE(lu,*) 'READING ERROR ON THE DROGUES FILE'
281  WRITE(lu,*) 'AFTER RECORD : ',itime
282  CALL plante(1)
283  stop
284 !
285 !-----------------------------------------------------------------------
286 !
287  RETURN
288  END
subroutine read_drogues(NP, NP_MAX, XP, YP, ZP, TAGP, CLSP, ELTP, SHPP, NPOIN2, NPOIN3, NELEM, NELMAX, IKLE, X, Y, T2DPLO)
Definition: read_drogues.f:8
Definition: bief.f:3