The TELEMAC-MASCARET system  trunk
initial_drogues.f
Go to the documentation of this file.
1 ! **********************
2  MODULE initial_drogues
3 ! **********************
4 !
5 !***********************************************************************
6 ! TELEMAC V8P0
7 !***********************************************************************
8 !
9 !brief Module containing all subroutines to deal with drogues in
10 !+ general including randomly sampling parcels, etc.
11 !+ Module variables are mainly used for generalised input and
12 !+ output access.
13 !
14 !history S.E. BOURBAN (HRW)
15 !+ 21/08/2018
16 !+ V8P0
17 !+ Initial developments - inspired from ALGAE_TRANSP
18 !+ by A.Joly (EDF)
19 !
20 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 !
23  USE bief_def, ONLY : bief_obj, bief_mesh, ipid,ncsize
26  IMPLICIT NONE
27 !
28 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
29 !
30 ! SUBROUTINES MADE AVAILABLE
31 ! PUBLIC :: SAMPLE_WPOIN
32 !
33 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
34 !
35 ! MODULE VARIABLES
36 ! ( MAINLY USE FOR INPUT & OUTPUT AS A GENERALISATION OF THE
37 ! SPECIFCS VARIABLES INCLUDED IN MODULES DROGUES_* )
38 !
39 ! NUMBER OF DIFFERENT CLASSES OF DROGUES (ALL TYPES OF CLASSES)
40  INTEGER :: ndrg_clss
41 !
42 ! INCREMENTAL HIGHEST TAG NUMBER FOR DROGUES
43 ! TAG NUMBERS ARE UNIQUE TO ALL PARCELS
44  INTEGER :: ndrg_tags = 0
45 !
46 ! CLASS DEFINED FOR EACH NODE ON THE MESH
47 ! THE SIZE IS NELMAX, BOTH %I AND %R ARE ALLOCATED FOR FILE
48 ! EXCHANGES AND THESE ARE ALLOCATED IN POINT_*
49  TYPE(bief_obj), TARGET :: nodclss
50 !
51 ! CLASS DEFINED FOR EACH PARCEL
52 ! THE SIZE IS NFLOT_MAX, BOTH %I AND %R ARE ALLOCATED FOR FILE
53 ! EXCHANGES AND THESE ARE ALLOCATED IN POINT
54  TYPE(bief_obj), TARGET :: parclss
55 !
56 !
57 ! DROGUES PROPERTIES, DIFFERENT FOR DIFFERENT TYPES OF DROGUES
58 ! - DRG_DENSITY: COUNTING DROGUES PER SURFACE AREA
59 ! - DRG_RELEASE: TIME TO RELEASE IN SECOND
60  DOUBLE PRECISION, ALLOCATABLE :: drg_density(:)
61  DOUBLE PRECISION, ALLOCATABLE :: drg_release(:)
62 !
63 !------------------------------------------------------------------------
64 !
65  SAVE
66 !
67  CONTAINS
68 !
69 !=======================================================================
70 !
71 ! 1) RANDOM SAMPLING
72 !
73 !
74 ! ***********************
75  SUBROUTINE sample_wpoin
76 ! ***********************
77 !
78  &( np,np_max,ncls,ntag,xp,yp,tagp,clsp,eltp,shpp,dsty,
79  & npoin,nelem,nelmax,ikle,clsn,x,y )
80 !
81 !***********************************************************************
82 ! TELEMAC V8P0
83 !***********************************************************************
84 !
85 !brief Randomly sample parcels within mesh, around a set of points.
86 !+ The method goes through all points in the mesh where NODCLSS
87 !+ is not zero, and sample parts of the surrounding triangles.
88 !+ In order to be "fair" and to account for variable density and
89 !+ triangle areas, the sampling in first carried out on a sorted
90 !+ list (or cumulated required number of parcels per triangle).
91 !
92 !history S.E. BOURBAN (HRW)
93 !+ 21/08/2016
94 !+ V8P0
95 !+ Initial implementation
96 !
97 !history M.S.TURNBULL (HRW)
98 !+ 04/11/2019
99 !+ V8P2
100 !+ Corrections
101 !
102 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
103 !| CLSN |-->| CLASS AT NODES
104 !| CLSP |<->| CLASS OF EACH DROGUE
105 !| DSTY |-->| DROGUE DENSITY FOR EACH CLASS
106 !| ELTP |<->| ELEMENT FOR EACH DROGUE
107 !| IKLE |-->| CONNECTIVITY MATRIX
108 !| NELEM |-->| NUMBER OF ELEMENTS IN IKLE
109 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN IKLE
110 !| NCLS |-->| NUMBER OF CLASSES
111 !| NP |-->| NUMBER OF DROGUES TO BE CREATED
112 !| NPOIN |-->| NUMBER OF NODES IN THE MESH
113 !| NP_MAX |-->| MAXIMUM NUMBER OF DROGUES TO BE CREATED
114 !| NTAG |<->| NUMBER OF TAGS
115 !| SHPP |<->| BARYCENTRIC COORDINATES OF DROGUES
116 !| TAGP |<->| TAG OF EACH DROGUE
117 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
118 !| XP |<->| ABSCISSAE OF DROGUES
119 !| Y |-->| ORDINATES OF POINTS IN THE MESH
120 !| YP |-->| ORDINATES OF DROGUES
121 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
122 !
123 !***********************************************************************
124 !
125  IMPLICIT NONE
126 !
127 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
128 !
129  INTEGER, INTENT(INOUT) :: NP,NTAG
130  INTEGER, INTENT(IN) :: NP_MAX,NELEM,NELMAX,NPOIN,NCLS
131  INTEGER, INTENT(IN) :: IKLE(nelmax,3),CLSN(npoin)
132  INTEGER, INTENT(INOUT) :: TAGP(np_max),CLSP(np_max)
133  INTEGER, INTENT(INOUT) :: ELTP(np_max)
134  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin),DSTY(ncls)
135  DOUBLE PRECISION, INTENT(INOUT) :: XP(np_max),YP(np_max)
136  DOUBLE PRECISION, INTENT(INOUT) :: SHPP(3,np_max)
137 !
138 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
139 !
140  INTEGER I,J,K,IEL,NEL,IP,NJ, K1,K2,KI,N1,N2
141  INTEGER JPID,MT,NPI,NPP, ITAG,ICLS
142  DOUBLE PRECISION R0,LENGTH,A
143  DOUBLE PRECISION X1,Y1,X2,Y2,X3,Y3, DX1,DY1,DX2,DY2,DX3,DY3
144 !
145  INTEGER, ALLOCATABLE :: PPKLE(:),PELEM(:,:)
146  DOUBLE PRECISION, ALLOCATABLE :: AKLE(:)
147 !
148 !-----------------------------------------------------------------------
149 !
150 ! SET THE VARIABLE DROGUES' CLASS
151  mt = 0
152  DO i = 1,npoin
153  mt = max( mt,clsn(i) )
154  ENDDO
155  IF( ncsize.GT.1 ) mt = p_max( mt )
156  IF( mt.NE.ncls ) THEN
157  WRITE(lu,22) mt,ncls
158  22 FORMAT(1x,'CONDIN_DROGUES:',/,
159  & 1x,' NUMBER OF CLASSES OF DROGUES READ FROM',/,
160  & 1x,' THE GEOMETRY FILE ',i8,' DIFFERENT FROM THE',/,
161  & 1x,' NUMBER SET IN THE CAS FILE ',i8)
162  IF( mt.GT.ncls ) THEN
163  CALL plante(1)
164  stop
165  ENDIF
166  ENDIF
167 !
168 ! LOCAL MEMORY ALLOCATION - NUMBER OF TRIANGLES CONTAINING PARCELS
169 !
170  nel = 0
171  DO j = 1,nelem
172  DO k = 1,3
173  i = ikle( j,k )
174  IF( clsn(i).GT.0 ) nel = nel + 1
175  ENDDO
176  ENDDO
177  ALLOCATE( pelem(2,nel) )
178  ALLOCATE( ppkle(2*nel) )
179  ALLOCATE( akle(2*nel) )
180 !
181 ! EVALUATE TOTAL NUMBER OF PARCELS REQUIRED FOR ONE PROCESSOR
182 ! BY COMPUTING THE CUMULATED SURFACE AREA WEIGHTED BY TARGET
183 ! PARCEL DENSITY
184 !
185  iel = 0
186  a = 0.d0
187  DO j = 1,nelem
188  DO k = 1,3
189  i = ikle( j,k )
190  IF( clsn(i).GT.0 ) THEN
191  iel = iel + 1
192  pelem(1,iel) = j
193  pelem(2,iel) = k
194 !
195  n1 = ikle( j,mod(k,3)+1 )
196  n2 = ikle( j,mod(k+1,3)+1 )
197 !
198  dx1 = ( x(i)-x(n1) )/2.d0
199  dx2 = ( x(i)-x(n2) )/2.d0
200  dy1 = ( y(i)-y(n1) )/2.d0
201  dy2 = ( y(i)-y(n2) )/2.d0
202  dx3 = ( 2.d0*x(i)-x(n1)-x(n2) )/3.d0
203  dy3 = ( 2.d0*y(i)-y(n1)-y(n2) )/3.d0
204 !
205  akle(2*iel-1) = a +
206  & dsty(clsn(i)) * ( dx1*dy3-dx3*dy1 )/2.d0
207  a = akle(2*iel-1)
208  ppkle(2*iel-1) = 0
209 !
210  akle(2*iel) = a +
211  & dsty(clsn(i)) * ( dx3*dy2-dx2*dy3 )/2.d0
212  a = akle(2*iel)
213  ppkle(2*iel) = 0
214 !
215  ENDIF
216  ENDDO
217  ENDDO
218 !
219 ! TOTAL NUMBER OF PARCELS FOR CURRENT PROCESSOR
220  npi = int(a)
221  npp = npi + np
222  IF( ncsize.GT.1 ) npp = p_sum( npp )
223 ! CHECK AGAINST NUMBER OF PARCELS POSSIBLE
224  IF( npp.GT.np_max ) THEN
225  WRITE(lu,32) npp,np_max
226  32 FORMAT(1x,'DROGUES::SAMPLE_WPOIN:',/,
227  & 1x,' REQUIRED NUMBER OF DROGUES (',i8,')',/,
228  & 1x,' LARGER THAN THE MAXIMUM NUMBER OF DROGUES',/,
229  & 1x,' POSSIBLE (',i8,')',/,
230  & 1x,' INCREASE THE MAXIMUM OR REDUCE YOUR DENSITY.')
231  CALL plante(1)
232  stop
233  ENDIF
234  IF (nel.GT.0) length = akle(2*nel)
235 !
236 ! ALLOCATING UNIQUE TAG NUMBERS FOR EACH PROCESSOR
237 !
238  IF( ncsize.GT.1 ) THEN
239  npp = 0
240  DO jpid = 0,ncsize-1
241  IF( jpid.EQ.ipid ) THEN
242  npp = npp + npi
243  itag = npp
244  ENDIF
245  npp = p_max( npp )
246  ENDDO
247  itag = itag - npi
248  ELSE
249  itag = 0
250  ENDIF
251 !
252 !-----------------------------------------------------------------------
253 !
254 ! WEIGHTED SAMPLING BY POINTS (SUB-ELEMENT TRIANGLES)
255 !
256  DO ip = 1,npi
257 ! RANDOM SAMPLE
258  CALL random_number(r0)
259  r0 = r0 * length
260  IF( r0.LT.akle(1) ) THEN
261 ! SPECIAL CASE FOR 1ST QUADRILATERAL
262  ppkle(1) = ppkle(1) + 1
263  ELSE
264 ! DICHOTOMIE TO FIND WHERE THE PARCEL FALLS
265  k1 = 1
266  k2 = 2*nel
267  DO WHILE( .true. )
268  ki = int((k1+k2)/2)
269  IF( r0.GT.akle(ki) ) THEN
270  k1 = ki
271  ELSE
272  k2 = ki
273  ENDIF
274  IF( k1+1.EQ.k2 ) EXIT
275  ENDDO
276  ppkle(k2) = ppkle(k2) + 1
277  ENDIF
278 !
279  ENDDO
280 !
281 !-----------------------------------------------------------------------
282 !
283 ! SAMPLING AROUND WEIGHTED POINTS, ONE TRIANGLE AT A TIME
284  ip = np
285  DO iel = 1,nel
286 !
287  j = pelem(1,iel)
288  k = pelem(2,iel)
289  i = ikle( j,k )
290  icls = clsn(i)
291 !
292  n1 = ikle( j,mod(k,3)+1 )
293  n2 = ikle( j,mod(k+1,3)+1 )
294 !
295  x1 = ( x(i)+x(n1) )/2.d0
296  y1 = ( y(i)+y(n1) )/2.d0
297  x2 = ( x(i)+x(n2) )/2.d0
298  y2 = ( y(i)+y(n2) )/2.d0
299  x3 = ( x(i)+x(n1)+x(n2) )/3.d0
300  y3 = ( y(i)+y(n1)+y(n2) )/3.d0
301 !
302 ! SAMPLE FIRST TRIANGLE
303  nj = ppkle(2*iel-1)
304  CALL sample_triangle( ip+1,nj,np_max,j,itag,icls,
305  & tagp,clsp,eltp,shpp,
306  & xp,yp, x(i),y(i),x1,y1,x3,y3 )
307  ip = ip + nj
308 !
309 ! SAMPLE SECOND TRIANGLE
310  nj = ppkle(2*iel)
311  CALL sample_triangle( ip+1,nj,np_max,j,itag,icls,
312  & tagp,clsp,eltp,shpp,
313  & xp,yp, x(i),y(i),x3,y3,x2,y2 )
314  ip = ip + nj
315 !
316  ENDDO
317  IF( ncsize.GT.1 ) itag = p_max( itag )
318  ntag = ntag + itag
319  np = np + npi
320 !
321 !-----------------------------------------------------------------------
322 !
323 ! LOCAL MEMORY DE-ALLOCATION
324 !
325  DEALLOCATE( pelem )
326  DEALLOCATE( ppkle )
327  DEALLOCATE( akle )
328 !
329 !
330 !-----------------------------------------------------------------------
331 !
332  RETURN
333  END SUBROUTINE sample_wpoin
334 !
335 ! **************************
336  SUBROUTINE sample_triangle
337 ! **************************
338 !
339  &( ip,np,np_max,ielm,itag,icls,tagp,clsp,eltp,shpp,
340  & xp,yp,x1,y1,x2,y2,x3,y3 )
341 !
342 !***********************************************************************
343 ! TELEMAC V8P0
344 !***********************************************************************
345 !
346 !brief Randomly sample parcels within a triangle.
347 !+ In order to be "fair" from a placement view point, R1 and R2
348 !+ are generated along the two edges P0P1 and P0P2 respectively,
349 !+ therefore covering a parallelogram with parcels (assuming
350 !+ the lengths of the edges P0P1 and P0P2 are not too different).
351 !+ Half of the parallelogram is then moved back into the triangle
352 !+ by symmetry with the mid-point between P1 and P2.
353 !
354 !history S.E. BOURBAN (HRW)
355 !+ 21/08/2016
356 !+ V8P0
357 !+ Initial implementation
358 !
359 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
360 !| CLSP |<->| CLASS OF EACH DROGUE
361 !| ELTP |<->| ELEMENT FOR EACH DROGUE
362 !| ICLS |<->| CLASS TO BE ASSIGNED
363 !| IELM |-->| ELEMENT TO BE ASSIGNED
364 !| IP |-->| INDEX NUMBER OF FIRST DROGUE
365 !| ITAG |-->| TAGGING RANGE FOR DROGUES PER PROCESSOR
366 !| NP |-->| NUMBER OF DROGUES TO BE CREATED
367 !| NP_MAX |-->| MAXIMUM NUMBER OF DROGUES TO BE CREATED
368 !| SHPP |<->| BARYCENTRIC COORDINATES OF DROGUES
369 !| TAGP |<->| TAG OF EACH DROGUE
370 !| XN,YN |-->| WHERE N = 1,2,3, COORDINATES OF THE TRIANGLE WITHIN
371 !| |---| WHICH THE NEW NP DROGUES WILL BE RANDOMLY SELECTED
372 !| XP,YP |<--| COORDINATES OF THE NP NEW (RANDOMLY SAMPLED) DROGUES
373 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
374 !
375 !***********************************************************************
376 !
377  IMPLICIT NONE
378 !
379 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
380 !
381  INTEGER, INTENT(IN) :: IP,NP,NP_MAX, IELM
382  INTEGER, INTENT(INOUT) :: TAGP(np_max),CLSP(np_max)
383  INTEGER, INTENT(INOUT) :: ELTP(np_max),ITAG,ICLS
384  DOUBLE PRECISION, INTENT(INOUT) :: XP(np_max),YP(np_max)
385  DOUBLE PRECISION, INTENT(IN) :: X1,Y1,X2,Y2,X3,Y3
386  DOUBLE PRECISION, INTENT(INOUT) :: SHPP(3,np_max)
387 !
388 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
389 !
390  INTEGER I
391  DOUBLE PRECISION R1,R2, SURDET, X0,Y0
392 !
393 !-----------------------------------------------------------------------
394 !
395  DO i = ip,ip+np-1
396 !
397  CALL random_number(r1)
398  CALL random_number(r2)
399  xp(i) = x1 + r1*( x2-x1 ) + r2*( x3-x1 )
400  yp(i) = y1 + r1*( y2-y1 ) + r2*( y3-y1 )
401  IF( r2 .GT. ( 1.d0-r1 ) ) THEN
402  xp(i) = ( x3+x2 ) - xp(i)
403  yp(i) = ( y3+y2 ) - yp(i)
404  ENDIF
405 !
406  x0 = xp(i)
407  y0 = yp(i)
408  eltp(i) = ielm
409  shpp(1,i) = ( x3-x2 )*( y0-y2 ) - ( y3-y2 )*( x0-x2 )
410  shpp(2,i) = ( x1-x3 )*( y0-y3 ) - ( y1-y3 )*( x0-x3 )
411  shpp(3,i) = ( x2-x1 )*( y0-y1 ) - ( y2-y1 )*( x0-x1 )
412  surdet = 1.d0 / ( ( x2-x1 )*( y3-y1 ) - ( x3-x1 )*( y2-y1 ) )
413  shpp(1,i) = shpp(1,i) * surdet
414  shpp(2,i) = shpp(2,i) * surdet
415  shpp(3,i) = shpp(3,i) * surdet
416  itag = itag + 1
417  tagp(i) = itag
418  clsp(i) = icls
419 !
420  ENDDO
421 !
422 !-----------------------------------------------------------------------
423 !
424  RETURN
425  END SUBROUTINE sample_triangle
426 !
427 ! **************************
428  SUBROUTINE sample_polyline
429 ! **************************
430 !
431  &( np,np_max,ncls,ntag, xp,yp,tagp,clsp,eltp,shpp,dsty,
432  & ny,iy,vy,ng,xg,yg, npoin,nelem,nelmax,ikle,x,y )
433 !
434 !***********************************************************************
435 ! TELEMAC V8P0
436 !***********************************************************************
437 !
438 !brief Randomly sample parcels within a polygon defined by (XG,YG).
439 !+ The sampling method generate a parcel location within the bounds
440 !+ of the polygon, and then check if the point location is within
441 !+ the polygon.
442 !+ A better way to do it could be to use a tessalation of the
443 !+ polygon and then call on SAMPLE_WELEM
444 !
445 !history S.E. BOURBAN (HRW)
446 !+ 21/08/2016
447 !+ V8P0
448 !+ Initial implementation
449 !
450 !history M.S.TURNBULL (HRW)
451 !+ 21/11/2019
452 !+ V8P2
453 !+ Corrections
454 !
455 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
456 !| CLSP |<->| CLASS OF EACH DROGUE
457 !| DSTY |-->| DROGUE DENSITY FOR EACH CLASS
458 !| ELTP |<->| ELEMENT FOR EACH DROGUE
459 !| IKLE |-->| CONNECTIVITY MATRIX
460 !| IY |-->| ARRAYS OF NUMBER OF POINT PER POLYGONS
461 !| NCLS |-->| NUMBER OF CLASSES
462 !| NELEM |-->| NUMBER OF ELEMENTS IN IKLE
463 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN IKLE
464 !| NG |-->| NUMBER OF POLYGON VERTICES
465 !| NP |-->| NUMBER OF DROGUES TO BE CREATED
466 !| NPOIN |-->| NUMBER OF NODES IN THE MESH
467 !| NP_MAX |-->| MAXIMUM NUMBER OF DROGUES TO BE CREATED
468 !| NTAG |<->| NUMBER OF TAGS
469 !| NY |-->| NUMBER OF POLYGONS
470 !| SHPP |<->| BARYCENTRIC COORDINATES OF DROGUES
471 !| TAGP |<->| TAG OF EACH DROGUE
472 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
473 !| XG,YG |-->| COORDINATES OF THE VERTICES OF THE POLYGON WITHIN
474 !| |---| WHICH THE NEW NP DROGUESS WILL BE RANDOMLY SELECTED
475 !| XP,YP |<--| COORDINATES OF THE NP NEW (RANDOMLY SAMPLED) DROGUES
476 !| VY |-->| ARRAYS OF VALUES PER POLYGONS
477 !| Y |-->| ORDINATES OF POINTS IN THE MESH
478 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
479 !
480 !***********************************************************************
481 !
482  IMPLICIT NONE
483 !
484 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
485 !
486  INTEGER, INTENT(INOUT) :: NP,NTAG
487  INTEGER, INTENT(IN) :: NP_MAX,NELEM,NELMAX,NPOIN,NCLS
488  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
489  INTEGER, INTENT(INOUT) :: TAGP(np_max),CLSP(np_max)
490  INTEGER, INTENT(INOUT) :: ELTP(np_max)
491  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin),DSTY(ncls)
492  DOUBLE PRECISION, INTENT(INOUT) :: XP(np_max),YP(np_max)
493  DOUBLE PRECISION, INTENT(INOUT) :: SHPP(3,np_max)
494  INTEGER, INTENT(IN) :: NY,IY(ny), NG
495  DOUBLE PRECISION, INTENT(IN) :: VY(ny), XG(ng),YG(ng)
496 !
497 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
498 !
499  INTEGER I,J,K,IEL,NEL, N1,N2,N3, NPP, JPID, MT
500  INTEGER NG1,NG2, JY
501  LOGICAL FOUND
502  DOUBLE PRECISION A, R1,R2, XA,YA,XI,YI, X0,Y0,X1,Y1,X2,Y2,X3,Y3
503  DOUBLE PRECISION SURDET, DET1,DET2,DET3
504  DOUBLE PRECISION, PARAMETER :: CHOUIA = 1.d-10
505 !
506  INTEGER, ALLOCATABLE :: PPKLE(:),PELEM(:)
507 !
508 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
509 !
510  LOGICAL INPOLY
511  EXTERNAL inpoly
512 !
513 !-----------------------------------------------------------------------
514 !
515 ! SET THE VARIABLE DROGUES' CLASS
516  mt = 0
517  DO i = 1,ny
518  mt = max( mt,int(vy(i)) )
519  ENDDO
520  IF( ncsize.GT.1 ) mt = p_max( mt )
521  IF( mt.NE.ncls ) THEN
522  WRITE(lu,22) mt,ncls
523  22 FORMAT(1x,'CONDIN_DROGUES:',/,
524  & 1x,' NUMBER OF CLASSES OF DROGUES READ FROM',/,
525  & 1x,' THE POLYGON FILE ',i8,' DIFFERENT FROM THE',/,
526  & 1x,' NUMBER SET IN THE CAS FILE ',i8)
527  IF( mt.GT.ncls ) THEN
528  CALL plante(1)
529  stop
530  ENDIF
531  ENDIF
532 !
533  ALLOCATE( ppkle(nelem) )
534 !
535 !-----------------------------------------------------------------------
536 !
537  ng1 = 1
538  DO jy = 1,ny
539 ! NUMBER OF POINTS IN THE JY POLYGON
540  ng2 = int( iy(jy) )
541 !
542 !-----------------------------------------------------------------------
543 !
544 ! EVALUATING THE NUMBER OF PARCELS WITHIN THE POLYGONE
545 ! (ACROSS ALL PROCESSORS)
546 !
547 ! SIZE AND AREA OF THE POLYGON
548  a = ( xg(ng2)*yg(ng1) - xg(ng1)*yg(ng2) )
549  xa = xg(ng2)
550  ya = yg(ng2)
551  xi = xg(ng2)
552  yi = yg(ng2)
553  DO i = ng1,ng2-1
554  a = a + ( xg(i)*yg(i+1) - xg(i+1)*yg(i) )
555  xa = max( xa,xg(i) )
556  ya = max( ya,yg(i) )
557  xi = min( xi,xg(i) )
558  yi = min( yi,yg(i) )
559  ENDDO
560  a = a / 2.d0
561 !
562 ! NUMBER OF PARCELS GIVEN A SPATIAL DENSITY
563  npp = int(a*dsty(int(vy(jy)))+1.d0)
564 ! CHECK AGAINST NUMBER OF PARCELS POSSIBLE
565  IF( (np+npp).GT.np_max ) THEN
566  WRITE(lu,33) (np+npp),np_max
567  33 FORMAT(1x,'DROGUES::SAMPLE_POLYLINE:',/,
568  & 1x,' REQUIRED NUMBER OF DROGUES (',i8,')',/,
569  & 1x,' LARGER THAN THE MAXIMUM NUMBER OF DROGUES',/,
570  & 1x,' POSSIBLE (',i8,')',/,
571  & 1x,' INCREASE THE MAXIMUM OR REDUCE YOUR DENSITY.')
572  CALL plante(1)
573  stop
574  ENDIF
575 !
576 !-----------------------------------------------------------------------
577 !
578 ! IDENTIFYING THOSE ELEMENTS COVERED BY THE POLYGON
579 ! (FOR EACH PROCESSOR)
580 !
581 ! LOCAL MEMORY ALLOCATION - NUMBER OF TRIANGLES COVERED
582 !
583  nel = 0
584  DO j = 1,nelem
585  found = .false.
586  ppkle(j) = 0
587  DO k = 1,3
588  i = ikle( j,k )
589  found = found .OR.
590  & inpoly( x(i),y(i), xg(ng1:ng2),yg(ng1:ng2),ng2-ng1+1 )
591  ENDDO
592  IF( found ) THEN
593  nel = nel + 1
594  ppkle(j) = 1
595  ENDIF
596  ENDDO
597 !
598  ALLOCATE( pelem(nel) )
599 !
600  iel = 0
601  DO j = 1,nelem
602  IF( ppkle(j).NE.0 ) THEN
603  iel = iel + 1
604  pelem(iel) = j
605  ENDIF
606  ENDDO
607 !
608 !-----------------------------------------------------------------------
609 !
610 ! SAMPLING THE POLYGON USING A HIT AND MISS STRATEGY
611 !
612  DO i = 1,npp
613 !
614 ! SAMPLING OVER THE ENTIRE POLYGON
615  found = .false.
616  DO WHILE( .NOT.found )
617  IF (ncsize.GT.1) THEN
618  x0 = -1.d20
619  y0 = -1.d20
620  IF (ipid.EQ.0) THEN
621  CALL random_number(r1)
622  CALL random_number(r2)
623  x0 = xi + r1*( xa-xi )
624  y0 = yi + r2*( ya-yi )
625  ENDIF
626  x0 = p_max(x0)
627  y0 = p_max(y0)
628  ELSE
629  CALL random_number(r1)
630  CALL random_number(r2)
631  x0 = xi + r1*( xa-xi )
632  y0 = yi + r2*( ya-yi )
633  ENDIF
634  found = inpoly( x0,y0, xg(ng1:ng2),yg(ng1:ng2),ng2-ng1+1 )
635  ENDDO
636 !
637 ! IDENTIFYING THE TRIANGLE WHERE THE PARCELS FELL IN
638 ! (FOR EACH PROCESSOR, AND IT MAY BE ON THE EDGE OF TWO OR MORE)
639 !
640  jpid = -1
641  DO iel = 1,nel
642 !
643  j = pelem(iel)
644  n1 = ikle( j,1 )
645  n2 = ikle( j,2 )
646  n3 = ikle( j,3 )
647  x1 = x(n1)
648  y1 = y(n1)
649  x2 = x(n2)
650  y2 = y(n2)
651  x3 = x(n3)
652  y3 = y(n3)
653 !
654  det1 = ( x3-x2 )*( y0-y2 ) - ( y3-y2 )*( x0-x2 )
655  det2 = ( x1-x3 )*( y0-y3 ) - ( y1-y3 )*( x0-x3 )
656  det3 = ( x2-x1 )*( y0-y1 ) - ( y2-y1 )*( x0-x1 )
657  IF( det1.GE.-chouia .AND.
658  & det2.GE.-chouia .AND.
659  & det3.GE.-chouia ) THEN
660  jpid = ipid
661  EXIT
662  ENDIF
663 !
664  ENDDO
665 !
666  IF( ncsize.GT.1 ) THEN
667  jpid = p_max(jpid)
668  ntag = p_max(ntag)
669  ENDIF
670  IF( jpid.EQ.ipid ) THEN
671  np = np + 1
672  xp(np) = x0
673  yp(np) = y0
674  eltp(np) = j
675  surdet = 1.d0 / ( (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1) )
676  shpp(1,np) = det1*surdet
677  shpp(2,np) = det2*surdet
678  shpp(3,np) = det3*surdet
679  ntag = ntag + 1
680  tagp(np) = ntag
681  clsp(np) = int( vy(jy) )
682  ENDIF
683 !
684  ENDDO
685 !
686  ng1 = ng2 + 1
687  DEALLOCATE( pelem )
688 !
689  ENDDO
690 !
691  DEALLOCATE( ppkle )
692 !
693 !-----------------------------------------------------------------------
694 !
695  RETURN
696  END SUBROUTINE sample_polyline
697 !
698 ! ************************
699  SUBROUTINE sample_points
700 ! ************************
701 !
702  &( np,np_max,ncls,ntag, xp,yp,tagp,clsp,eltp,shpp, ng,xg,yg,vg,
703  & npoin,nelem,nelmax,ikle,x,y )
704 !
705 !***********************************************************************
706 ! TELEMAC V8P0
707 !***********************************************************************
708 !
709 !brief Use the X-Y-Z provided to place particles (XG,YG).
710 !
711 !history S.E. BOURBAN (HRW)
712 !+ 21/08/2016
713 !+ V8P0
714 !+ Initial implementation
715 !
716 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
717 !| CLSP |<->| CLASS OF EACH DROGUE
718 !| ELTP |<->| ELEMENT FOR EACH DROGUE
719 !| IKLE |-->| CONNECTIVITY MATRIX
720 !| NCLS |-->| NUMBER OF CLASSES
721 !| NELEM |-->| NUMBER OF ELEMENTS IN IKLE
722 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN IKLE
723 !| NG |-->| TOTAL NUMBER OF POINTS
724 !| NP |-->| NUMBER OF DROGUES TO BE CREATED
725 !| NPOIN |-->| NUMBER OF NODES IN THE MESH
726 !| NP_MAX |-->| MAXIMUM NUMBER OF DROGUES TO BE CREATED
727 !| NTAG |<->| NUMBER OF TAGS
728 !| SHPP |<->| BARYCENTRIC COORDINATES OF DROGUES
729 !| TAGP |<->| TAG OF EACH DROGUE
730 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
731 !| XG |-->| X-COORDINATE FOR ALL POINTS
732 !| YG |-->| Y-COORDINATE FOR ALL POINTS
733 !| XP,YP |<--| COORDINATES OF THE NP NEW (RANDOMLY SAMPLED) DROGUES
734 !| VG |-->| ARRAYS OF VALUES PER POINT
735 !| Y |-->| ORDINATES OF POINTS IN THE MESH
736 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
737 !
738 !***********************************************************************
739 !
740  IMPLICIT NONE
741 !
742 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
743 !
744  INTEGER, INTENT(INOUT) :: NP,NTAG
745  INTEGER, INTENT(IN) :: NP_MAX,NELEM,NELMAX,NPOIN,NCLS
746  INTEGER, INTENT(IN) :: IKLE(nelmax,3)
747  INTEGER, INTENT(INOUT) :: TAGP(np_max),CLSP(np_max)
748  INTEGER, INTENT(INOUT) :: ELTP(np_max)
749  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin)
750  DOUBLE PRECISION, INTENT(INOUT) :: XP(np_max),YP(np_max)
751  DOUBLE PRECISION, INTENT(INOUT) :: SHPP(3,np_max)
752  INTEGER, INTENT(IN) :: NG
753  DOUBLE PRECISION, INTENT(IN) :: XG(ng),YG(ng),VG(ng)
754 !
755 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
756 !
757  INTEGER I,J, N1,N2,N3, JPID, MT
758  DOUBLE PRECISION X0,Y0,X1,Y1,X2,Y2,X3,Y3
759  DOUBLE PRECISION SURDET, DET1,DET2,DET3
760  DOUBLE PRECISION, PARAMETER :: CHOUIA = 1.d-10
761 !
762 !-----------------------------------------------------------------------
763 !
764 ! SET THE VARIABLE DROGUES' CLASS
765 !
766  mt = 0
767  DO i = 1,ng
768  mt = max( mt,int(vg(i)) )
769  ENDDO
770  IF( ncsize.GT.1 ) mt = p_max( mt )
771  IF( mt.NE.ncls ) THEN
772  WRITE(lu,22) mt,ncls
773  22 FORMAT(1x,'CONDIN_DROGUES:',/,
774  & 1x,' NUMBER OF CLASSES OF DROGUES READ FROM',/,
775  & 1x,' THE X-Y-Z FILE ',i8,' DIFFERENT FROM THE',/,
776  & 1x,' NUMBER SET IN THE CAS FILE ',i8)
777  IF( mt.GT.ncls ) THEN
778  CALL plante(1)
779  stop
780  ENDIF
781  ENDIF
782 !
783 !-----------------------------------------------------------------------
784 !
785 ! NUMBER OF PARCELS GIVEN A SPATIAL DENSITY
786 !
787 ! CHECK AGAINST NUMBER OF PARCELS POSSIBLE
788  IF( (np+ng).GT.np_max ) THEN
789  WRITE(lu,33) (np+ng),np_max
790  33 FORMAT(1x,'DROGUES::SAMPLE_POLYLINE:',/,
791  & 1x,' REQUIRED NUMBER OF DROGUES (',i8,')',/,
792  & 1x,' LARGER THAN THE MAXIMUM NUMBER OF DROGUES',/,
793  & 1x,' POSSIBLE (',i8,')',/,
794  & 1x,' INCREASE THE MAXIMUM OR REDUCE YOUR DENSITY.')
795  CALL plante(1)
796  stop
797  ENDIF
798 !
799 !-----------------------------------------------------------------------
800 !
801 ! POSITIONING THE PROVIDED POINTS
802 !
803  DO i = 1,ng
804 !
805  x0 = xg(i)
806  y0 = yg(i)
807 !
808 ! IDENTIFYING THE TRIANGLE WHERE THE PARCELS FELL IN
809 ! (FOR EACH PROCESSOR, AND IT MAY BE ON THE EDGE OF TWO OR MORE)
810 !
811  jpid = -1
812  DO j = 1,nelem
813 !
814  n1 = ikle( j,1 )
815  n2 = ikle( j,2 )
816  n3 = ikle( j,3 )
817  x1 = x(n1)
818  y1 = y(n1)
819  x2 = x(n2)
820  y2 = y(n2)
821  x3 = x(n3)
822  y3 = y(n3)
823 !
824  det1 = ( x3-x2 )*( y0-y2 ) - ( y3-y2 )*( x0-x2 )
825  det2 = ( x1-x3 )*( y0-y3 ) - ( y1-y3 )*( x0-x3 )
826  det3 = ( x2-x1 )*( y0-y1 ) - ( y2-y1 )*( x0-x1 )
827  IF( det1.GE.-chouia .AND.
828  & det2.GE.-chouia .AND.
829  & det3.GE.-chouia ) THEN
830  jpid = ipid
831  EXIT
832  ENDIF
833 !
834  ENDDO
835 !
836  IF( ncsize.GT.1 ) THEN
837  jpid = p_max(jpid)
838  ntag = p_max(ntag)
839  ENDIF
840  IF( jpid.EQ.ipid ) THEN
841  np = np + 1
842  xp(np) = x0
843  yp(np) = y0
844  eltp(np) = j
845  surdet = 1.d0 / ( (x2-x1)*(y3-y1) - (x3-x1)*(y2-y1) )
846  shpp(1,np) = det1*surdet
847  shpp(2,np) = det2*surdet
848  shpp(3,np) = det3*surdet
849  ntag = ntag + 1
850  tagp(np) = ntag
851  clsp(np) = int( vg(np) )
852  ENDIF
853 !
854  ENDDO
855 !
856 !-----------------------------------------------------------------------
857 !
858  RETURN
859  END SUBROUTINE sample_points
860 !
861 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
862 !
863  END MODULE initial_drogues
subroutine sample_triangle(IP, NP, NP_MAX, IELM, ITAG, ICLS, TAGP, CLSP, ELTP, SHPP, XP, YP, X1, Y1, X2, Y2, X3, Y3)
subroutine sample_wpoin(NP, NP_MAX, NCLS, NTAG, XP, YP, TAGP, CLSP, ELTP, SHPP, DSTY, NPOIN, NELEM, NELMAX, IKLE, CLSN, X, Y)
subroutine sample_polyline(NP, NP_MAX, NCLS, NTAG, XP, YP, TAGP, CLSP, ELTP, SHPP, DSTY, NY, IY, VY, NG, XG, YG, NPOIN, NELEM, NELMAX, IKLE, X, Y)
integer ncsize
Definition: bief_def.f:49
type(bief_obj), target parclss
double precision, dimension(:), allocatable drg_density
double precision, dimension(:), allocatable drg_release
integer ipid
Definition: bief_def.f:49
type(bief_obj), target nodclss
subroutine sample_points(NP, NP_MAX, NCLS, NTAG, XP, YP, TAGP, CLSP, ELTP, SHPP, NG, XG, YG, VG, NPOIN, NELEM, NELMAX, IKLE, X, Y)