The TELEMAC-MASCARET system  trunk
streamline.f
Go to the documentation of this file.
1 ! *****************
2  MODULE streamline
3 ! *****************
4 !
5 !
6 !***********************************************************************
7 ! BIEF 7.3
8 !***********************************************************************
9 !
10 !brief MODULE FOR PARALLEL CHARACTERISTICS FOR TELEMAC2D (OR TELEMAC3D)
11 !
12 !note JAJ PINXIT :: JACEK.JANKOWSKI@BAW.DE :: ENJOY!
13 !+ JAJ STARTED WELL FRI JUL 4 12:26:57 CEST 2008
14 !+ JAJ RUNNING WELL FRI JUL 11 16:20:21 CEST 2008
15 !+ JAJ RUNNING EVEN BETTER WED JUL 16 18:25:35 CEST 2008
16 !+ JAJ PRIVATISED MON JUL 21 10:41:04 CEST 2008
17 !+ JAJ OPTIMISED WED JUL 30 15:40:45 CEST 2008
18 !
19 !history J-M HERVOUET (LNHE)
20 !+ 31/07/2012
21 !+ V6P2
22 !+ Use of new array ELTCAR.
23 !+ Dimensions in SCARACT reviewed (previous confusion between
24 !+ NPOIN and NPLOT). INTENT(OUT) changed into INTENT(INOUT) in
25 !+ subroutine organise_char. NPOINT=NPLOT replaces NPOINT=NPOIN
26 !+ before the call to SCHAR41. ADD_CHAR11 and ADD_CHAR41 deleted.
27 !+ SCHAR11 and SCHAR41 simplified. Arguments removed in SCARACT.
28 !+ SCHAR12 and SCHAR13 added. DX,DY,DZ added to CHARAC_TYPE.
29 !+ More data saved when touching a solid boundary: XPLOT, YPLOT, DX, DY
30 !+ All this ensures strict equality of scalar and parallel runs !!!!
31 !+ However in 3D the vertical velocity is computed in Telemac-3D and
32 !+ has truncation errors, this will trigger differences.
33 !+ Now the sub-domain at the foot of the characteristic is returned
34 !+ if SCARACT called with argument POST=.TRUE.
35 !
36 !history J-M HERVOUET (LNHE)
37 !+ 08/01/2013
38 !+ V6P3
39 !+ Advection subroutines from Tomawac re-implemented here
40 !+ See SCHAR41_PER and SCHAR41_PER_4D
41 !+ A posteriori interpolation now possible in all cases.
42 !
43 !history J-M HERVOUET (LNHE)
44 !+ 28/01/2013
45 !+ V6P3
46 !+ Bug corrected in PREP_SENDBACK, IF(NCHARA.EQ.0) RETURN causes bugs
47 !+ when one processor has nothing to send, some arrays were not
48 !+ initialised.
49 !
50 !history J-M HERVOUET (LNHE)
51 !+ 22/02/2013
52 !+ V6P3
53 !+ Particle tracking in //. 3 subroutines added: send_particles,
54 !+ add_particle, del_particle, to be used by subroutine derive.
55 !
56 !history J-M HERVOUET (LNHE)
57 !+ 16/04/2013
58 !+ V6P3
59 !+ Case of successive uses of SCARACT. Bug corrected in the section
60 !+ calling organise_chars when NPLOT > LAST_NPLOT.
61 !
62 !history J-M HERVOUET (LNHE)
63 !+ 26/04/2013
64 !+ V6P3
65 !+ Organise_chars changed: new strategy of memory allocation: same
66 !+ maximum size for all processors, useful for some scenarios with
67 !+ particle. A sub-domain without initial particle must be able to
68 !+ receive one and needs memory for it.
69 !
70 !history A. JOLY (EDF R&D, LNHE)
71 !+ 22/05/2013
72 !+ V6P3
73 !+ Routines added to deal with the transport of algae. For 2D only.
74 !
75 !history C. GOEURY (EDF R&D, LNHE)
76 !+ 29/05/2013
77 !+ V7P0
78 !+ Routine SCHAR11_STO for stochastic diffusion in 2D.
79 !
80 !history J-M HERVOUET (EDF LAB, LNHE)
81 !+ 08/07/2014
82 !+ V7P0
83 !+ In subroutines SCHAR41_... updating of coordinates after touching a
84 !+ boundary was missing in RECVCHAR and caused a bug if the trajectory
85 !+ went to another subdomain just after. Look for 08/07/2014 to trace
86 !+ the corrections.
87 !
88 !history J-M HERVOUET (EDF LAB, LNHE)
89 !+ 14/08/2015
90 !+ V7P1
91 !+ Argument NRK added to SCARACT, it was hardcoded to 3. It is the
92 !+ number of sub-steps to do the characteristic pathline.
93 !
94 !history J-M HERVOUET (EDF LAB, LNHE)
95 !+ 31/08/2015
96 !+ V7P1
97 !+ Subroutine introduce_recvchar optimised (after results of a
98 !+ profiler saying we spent 12% of the time in it, but this seems
99 !+ wrong).
100 !
101 !history J-M HERVOUET (EDF LAB, LNHE)
102 !+ 13/09/2016
103 !+ V7P2
104 !+ Checking more memory allocation, with more error messages and hints
105 !+ for solving problems.
106 !
107 !history S.E.BOURBAN (HRW)
108 !+ 21/03/2017
109 !+ V7P3
110 !+ Replacement of the DATA declarations by the PARAMETER associates
111 !
112 !history J,RIEHME (ADJOINTWARE)
113 !+ November 2016
114 !+ V7P2
115 !+ Replaced EXTERNAL statements to parallel functions / subroutines
116 !+ by the INTERFACE_PARALLEL
117 !
118 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
119 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120 !
122  USE interface_parallel, ONLY : p_max,p_sum,
124  IMPLICIT NONE
125  PRIVATE
126 !
127 ! CALLED BY CHARAC (BIEF). CHARAC CALLED BY TELEMAC-2D AND 3D AND SISYPHE
128 ! CALLED BY THOMPS (TELEMAC-2D)
129 ! CALLED BY DERIVE (BIEF, USED BY TELEMAC-2D)
130 ! CALLED BY DERLAG (BIEF, USED BY TELEMAC-2D)
131 ! CALLED BY DERI3D (TELEMAC-3D)
132 !
135  PUBLIC :: del_info_alg
137  PUBLIC :: oil_organise_chars
138  PUBLIC :: dealloc_streamline
139 !
140 ! MAX_BASKET_SIZE IS THE NUMBER OF ADVECTED VARIABLES IN ONE PROCEDURE CALL
141 !
142  INTEGER, PARAMETER :: max_basket_size=10 ! LARGE
143 !
144 ! SEE CALL GET_MPI_PARAMETERS IN SCARACT
145 !
146  INTEGER last_nomb,last_nplot
147 !
148 ! THE TYPE FOR CHARACTERISTICS - LOST TRACEBACKS
149 ! DESCRIBES A TRACEBACK LEAVING A PARTITION TO ANOTHER ONE
150 ! FOR 2D WE USE 3D -> KNE AND ZP ARE OBSOLETE THEN
151 !
152 ! SEE ORG_CHARAC_TYPE1 IN LIBRARY PARALLEL
153 ! IT MUST BE THE SAME LOCAL TYPE
154 !
155 ! YA: NOW THE TYPE IS DECLARED IN DECLARATIONS_PARALLEL IN PARALLEL
156 !
157 ! TYPE CHARAC_TYPE
158 ! SEQUENCE ! BUT SEEMS USELESS
159 ! INTEGER :: MYPID ! PARTITION OF THE TRACEBACK ORIGIN (HEAD)
160 ! INTEGER :: NEPID ! THE NEIGHBOUR PARTITION THE TRACEBACK ENTERS TO
161 ! INTEGER :: INE ! THE LOCAL 2D ELEMENT NR THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
162 ! INTEGER :: KNE ! THE LOCAL LEVEL THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
163 ! INTEGER :: IOR ! THE POSITION OF THE TRAJECTORY -HEAD- IN MYPID [THE 2D/3D NODE OF ORIGIN]
164 ! INTEGER :: ISP ! CURRENT RUNGE-KUTTA STEPS PASSED AS COLLECTED
165 ! INTEGER :: NSP ! TOTAL RUNGE-KUTTA STEPS
166 ! INTEGER :: IFR ! FREQUENCY
167 ! DOUBLE PRECISION :: XP,YP,ZP,FP ! THE (X,Y,Z,F)-POSITION
168 ! DOUBLE PRECISION :: DX,DY,DZ,DF ! THE CORRESPONDING DISPLACEMENTS
169 ! DOUBLE PRECISION :: BASKET(MAX_BASKET_SIZE) ! VARIABLES INTERPOLATED AT THE FOOT
170 ! END TYPE CHARAC_TYPE
171 !
172 ! THE CORRESPONDING MPI TYPE
173 !
174  INTEGER :: characteristic
175 !
176 ! STRUCTURES FOR ALL-TO-ALL COMMUNICATION / SEND AND RECEIVE WITH COUNTERS
177 ! HEAP/SEND/RECVCOUNTS : COUNT THE NUMBER OF LOST TRACEBACKS PARTITION-WISE
178 ! S/RDISPLS : DISPLACEMENTS IN PARTITION-WISE SORTED SEND/RECVCHARS
179 ! HEAPCHAR : FOR SAVING INITIALLY LOST CHARACTERISTICS AND COLLECTING
180 ! THE IMPLANTED TRACEBACKS LOCALISED IN MY PARTITION
181 ! WHILE COLLECTING IS DONE IN HEAPCHARS, MOST ACTIVE OPERATIONS IN RECVCHAR
182 ! SENDCHAR REQUIRED DUE TO THE SPECIFIC SORTING FOR MPI_ALLTOALLV (OPTIMISE?)
183 !
184  type(charac_type),ALLOCATABLE,DIMENSION(:)::heapchar
185  type(charac_type),ALLOCATABLE,DIMENSION(:)::sendchar
186  type(charac_type),ALLOCATABLE,DIMENSION(:)::recvchar
187  INTEGER, ALLOCATABLE, DIMENSION(:)::sendcounts,sdispls
188  INTEGER, ALLOCATABLE, DIMENSION(:)::recvcounts,rdispls
189  INTEGER, ALLOCATABLE, DIMENSION(:)::heapcounts
190 ! STATIC DIMENSION FOR HEAPCHAR, SENDCHAR, RECVCHAR (SORRY, STATIC) in scaract
191  INTEGER nchdim
192 !
193 ! WORK FIELD FOR COUNTING OCCURANCES PRO RANK / SORTING SENDCHAR
194 !
195  INTEGER, ALLOCATABLE, DIMENSION(:) :: icha
196 !
197 ! STRUCTURE TO SEND THE INFO ASSOCIATED WITH ALGAE TRANSPORT
198 !
199 !
200 ! STRUCTURE TO SEND THE INFO ASSOCIATED WITH ALGAE TRANSPORT
201 ! THE STRUCTURE IS DECLARED IN DECLARATIONS_PARALLEL
202 ! YA: NOW THE TYPE IS DECLARED IN DECLARATIONS_PARALLEL IN PARALLEL
203 !
204 ! TYPE ALG_TYPE
205 ! SEQUENCE ! NECESSARY TO DEFINE MPI TYPE ALG_CHAR
206 ! INTEGER :: MYPID ! PARTITION OF THE TRACEBACK ORIGIN (HEAD)
207 ! INTEGER :: NEPID ! THE NEIGHBOUR PARTITION THE TRACEBACK ENTERS TO
208 ! INTEGER :: IGLOB ! THE GLOBAL NUMBER OF THE PARTICLES
209 ! INTEGER :: FLAG ! USED TO ALIGN FIELDS
210 ! DOUBLE PRECISION :: VX,VY,VZ ! THE (X,Y,Z) PARTICLE VELOCITY
211 ! DOUBLE PRECISION :: UX,UY,UZ ! THE (X,Y,Z) FLUID VELOCITY
212 ! DOUBLE PRECISION :: UX_AV,UY_AV,UZ_AV ! THE (X,Y,Z) AVERAGE FLUID VELOCITY
213 ! DOUBLE PRECISION :: K_AV,EPS_AV ! THE VALUES OF K AND EPS
214 ! DOUBLE PRECISION :: H_FLU ! THE WATER DEPTH AT POSITION OF VELOCITY
215 ! DOUBLE PRECISION :: PSI(3*101) ! VARIABLE PSI USED FOR THE BASSET FORCE
216 ! END TYPE ALG_TYPE
217 !
218 ! THE CORRESPONDING MPI TYPE
219 !
220  INTEGER :: alg_char
221 !
222 ! STRUCTURES FOR ALL-TO-ALL COMMUNICATION / SEND AND RECEIVE WITH COUNTERS
223 ! HEAPALG : FOR SAVING INFORMATION TO BE SEND TO AT THE SAME TIME AS
224 ! PARTICLE POSITION. HEAP/SEND/RECVCOUNTS AND S/RDISPLS ARE USED
225 ! AS WELL. SENDALG AND RECVALG ARE USED IN A SIMILAR FASHION AS
226 ! SENDCHAR AND RECVCHAR
227 !
228  TYPE(alg_type),ALLOCATABLE,DIMENSION(:)::heapalg
229  TYPE(alg_type),ALLOCATABLE,DIMENSION(:)::sendalg
230  TYPE(alg_type),ALLOCATABLE,DIMENSION(:)::recvalg
231 !
232 ! FOR OIL SPILLS
233 !
234 ! TYPE OIL_TYPE
235 ! SEQUENCE
236 ! INTEGER :: MYPID ! PARTITION OF THE TRACEBACK ORIGIN (HEAD)
237 ! INTEGER :: NEPID ! THE NEIGHBOUR PARTITION THE TRACEBACK ENTERS TO
238 ! INTEGER :: INE ! THE LOCAL 2D ELEMENT NR THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
239 ! INTEGER :: KNE ! THE LOCAL LEVEL THE TRACEBACK ENTERS IN THE NEIGBOUR PARTITION
240 ! INTEGER :: IOR ! THE POSITION OF THE TRAJECTORY -HEAD- IN MYPID [THE 2D/3D NODE OF ORIGIN]
241 ! INTEGER :: STATE ! CURRENT RUNGE-KUTTA STEPS PASSED AS COLLECTED
242 ! INTEGER :: TPSECH ! TOTAL RUNGE-KUTTA STEPS
243 ! INTEGER :: IFR ! FREQUENCY
244 ! DOUBLE PRECISION :: SURFACE
245 ! DOUBLE PRECISION :: MASS0
246 ! DOUBLE PRECISION :: MASS
247 ! DOUBLE PRECISION :: MASS_EVAP
248 ! DOUBLE PRECISION :: MASS_DISS
249 ! DOUBLE PRECISION :: MASS_HAP(10)
250 ! DOUBLE PRECISION :: MASS_COMPO(10)
251 ! DOUBLE PRECISION :: TB_HAP(10)
252 ! DOUBLE PRECISION :: TB_COMPO(10)
253 ! DOUBLE PRECISION :: SOL_HAP(10)
254 ! DOUBLE PRECISION :: SOL_COMPO(10)
255 ! END TYPE OIL_TYPE
256 !
257 ! THE CORRESPONDING MPI TYPE
258 !
259  INTEGER :: oil_charac
260 !
261 ! STRUCTURES FOR ALL-TO-ALL COMMUNICATION / SEND AND RECEIVE WITH COUNTERS
262 ! HEAP/SEND/RECVCOUNTS : COUNT THE NUMBER OF LOST TRACEBACKS PARTITION-WISE
263 ! S/RDISPLS : DISPLACEMENTS IN PARTITION-WISE SORTED SEND/RECVCHARS
264 ! HEAPCHAR : FOR SAVING INITIALLY LOST CHARACTERISTICS AND COLLECTING
265 ! THE IMPLANTED TRACEBACKS LOCALISED IN MY PARTITION
266 ! WHILE COLLECTING IS DONE IN HEAPCHARS, MOST ACTIVE OPERATIONS IN RECVCHAR
267 ! SENDCHAR REQUIRED DUE TO THE SPECIFIC SORTING FOR MPI_ALLTOALLV (OPTIMISE?)
268 !
269  type(oil_type),ALLOCATABLE,DIMENSION(:)::heapoil
270  type(oil_type),ALLOCATABLE,DIMENSION(:)::sendoil
271  type(oil_type),ALLOCATABLE,DIMENSION(:)::recvoil
272 !
273 ! IF SET TO TRUE, EVERY DETAILED DEBUGGING IS SWITCHED ON
274 !
275  LOGICAL :: trace=.false.
276 !
277 ! TO OPTIMISE PERIODICITY
278 !
279  INTEGER :: i
280  INTEGER, PARAMETER :: nplanmax=200
281  INTEGER :: eta1(nplanmax) = (/ (i+1, i = 1, nplanmax) /)
282 !
283 ! Initialisation marker for SCARACT
284 !
285  LOGICAL :: init=.true.
286 !
287  CONTAINS
288 !
289 !---------------------------------------------------------------------
290 ! <<<<<<<<<<<<<<<<<< CHARACTERISTICS: PRIVATE >>>>>>>>>>>>>>>>>>
291 !---------------------------------------------------------------------
292 !
293  SUBROUTINE deorg_charac_type
294  INTEGER ier
296  RETURN
297  END SUBROUTINE deorg_charac_type
298 !
299  SUBROUTINE dealloc_streamline
300  IF(ALLOCATED(heapchar)) DEALLOCATE(heapchar)
301  IF(ALLOCATED(sendchar)) DEALLOCATE(sendchar)
302  IF(ALLOCATED(recvchar)) DEALLOCATE(recvchar)
303  IF(ALLOCATED(sendcounts)) DEALLOCATE(sendcounts)
304  IF(ALLOCATED(sdispls)) DEALLOCATE(sdispls)
305  IF(ALLOCATED(recvcounts)) DEALLOCATE(recvcounts)
306  IF(ALLOCATED(rdispls)) DEALLOCATE(rdispls)
307  IF(ALLOCATED(heapcounts)) DEALLOCATE(heapcounts)
308  IF(ALLOCATED(icha)) DEALLOCATE(icha)
309  IF(ALLOCATED(heapalg)) DEALLOCATE(heapalg)
310  IF(ALLOCATED(sendalg)) DEALLOCATE(sendalg)
311  IF(ALLOCATED(recvalg)) DEALLOCATE(recvalg)
312  IF(ALLOCATED(heapoil)) DEALLOCATE(heapoil)
313  IF(ALLOCATED(sendoil)) DEALLOCATE(sendoil)
314  IF(ALLOCATED(recvoil)) DEALLOCATE(recvoil)
315  init=.true.
316  trace=.false.
317  RETURN
318  END SUBROUTINE dealloc_streamline
319 !
320 !---------------------------------------------------------------------
321 ! GET/SET ON DIMENSIONS AND COUNTERS
322 !---------------------------------------------------------------------
323 !
324  INTEGER FUNCTION get_max_basket_size()
326  END FUNCTION get_max_basket_size
327 !
328 !---------------------------------------------------------------------
329 ! ALLOCATE ALL STATIC FIELDS FOR ALL-TO-ALL COMMUNICATION
330 ! PREPARE THE MPI_TYPE FOR LOST CHARACTERISTICS / TRACEBACKS
331 !---------------------------------------------------------------------
332 !
333  SUBROUTINE organise_chars(NPARAM,NOMB,NCHDIM,LAST_NCHDIM) ! WATCH OUT
334  USE bief_def, ONLY: ncsize
335  IMPLICIT NONE
336  INTEGER, INTENT(IN) :: NPARAM,NOMB
337  INTEGER, INTENT(INOUT) :: NCHDIM,LAST_NCHDIM
338  INTEGER ISIZE
339  IF (.NOT.ALLOCATED(heapcounts)) ALLOCATE(heapcounts(ncsize))
340  IF (.NOT.ALLOCATED(sendcounts)) ALLOCATE(sendcounts(ncsize))
341  IF (.NOT.ALLOCATED(recvcounts)) ALLOCATE(recvcounts(ncsize))
342  IF (.NOT.ALLOCATED(sdispls)) ALLOCATE(sdispls(ncsize))
343  IF (.NOT.ALLOCATED(rdispls)) ALLOCATE(rdispls(ncsize))
344  IF (.NOT.ALLOCATED(icha)) ALLOCATE(icha(ncsize))
345  heapcounts=0
346  sendcounts=0
347  recvcounts=0
348  sdispls=0
349  rdispls=0
350  icha=0
351 !
352  nchdim=nparam
353 !
354  IF(last_nchdim.EQ.0) THEN
355 ! CASE OF A FIRST CALL (THINK THAT NCHDIM MAY BE 0)
356  isize=max(nchdim,1)
357  ALLOCATE(sendchar(isize))
358  ALLOCATE(recvchar(isize))
359  ALLOCATE(heapchar(isize))
360 ! LAST_NCHDIM WILL NEVER BE 0 AGAIN
361  last_nchdim=isize
362  ELSEIF(nchdim.GT.last_nchdim) THEN
363 ! NEW CALL WITH LARGER NCHDIM, WE HAVE TO REALLOCATE
364  DEALLOCATE(sendchar)
365  DEALLOCATE(recvchar)
366  DEALLOCATE(heapchar)
367  ALLOCATE(sendchar(nchdim))
368  ALLOCATE(recvchar(nchdim))
369  ALLOCATE(heapchar(nchdim))
370  last_nchdim=nchdim
371  ELSE
372 ! NEW CALL BUT DIMENSIONS OK, NOTHING TO DO
373  ENDIF
374  CALL org_charac_type1(nomb,characteristic) ! COMMIT THE CHARACTERISTICS TYPE FOR COMM
375  RETURN
376  END SUBROUTINE organise_chars
377 !
378 !---------------------------------------------------------------------
379 ! ALLOCATE ALL STATIC FIELDS FOR TO FIND THE ELEMENT AND SUBDOMAIN
380 ! IN ALGAE TRANSPORT
381 !---------------------------------------------------------------------
382 !
383  SUBROUTINE organise_chars_for_a(NPARAM,NOMB,NCHDIM,LAST_NCHDIM)
384  USE bief_def, ONLY: ncsize
385  IMPLICIT NONE
386  INTEGER, INTENT(IN) :: NPARAM,NOMB
387  INTEGER, INTENT(INOUT) :: NCHDIM,LAST_NCHDIM
388  INTEGER ISIZE
389 !
390 ! IN CASE OF SEQUENTIAL CALCULATIONS
391 !
392  isize=max(1,ncsize)
393  IF (.NOT.ALLOCATED(heapcounts)) ALLOCATE(heapcounts(isize))
394  IF (.NOT.ALLOCATED(sendcounts)) ALLOCATE(sendcounts(isize))
395  IF (.NOT.ALLOCATED(recvcounts)) ALLOCATE(recvcounts(isize))
396  IF (.NOT.ALLOCATED(sdispls)) ALLOCATE(sdispls(isize))
397  IF (.NOT.ALLOCATED(rdispls)) ALLOCATE(rdispls(isize))
398  IF (.NOT.ALLOCATED(icha)) ALLOCATE(icha(isize))
399  heapcounts=0
400  sendcounts=0
401  recvcounts=0
402  sdispls=0
403  rdispls=0
404  icha=0
405 !
406  nchdim=nparam
407 !
408  IF(last_nchdim.EQ.0) THEN
409 ! CASE OF A FIRST CALL (THINK THAT NCHDIM MAY BE 0)
410  isize=max(nchdim,1)
411  ALLOCATE(sendchar(isize))
412  ALLOCATE(recvchar(isize))
413  ALLOCATE(heapchar(isize))
414 ! LAST_NCHDIM WILL NEVER BE 0 AGAIN
415  last_nchdim=isize
416  ELSEIF(nchdim.GT.last_nchdim) THEN
417 ! NEW CALL WITH LARGER NCHDIM, WE HAVE TO REALLOCATE
418  DEALLOCATE(sendchar)
419  DEALLOCATE(recvchar)
420  DEALLOCATE(heapchar)
421  ALLOCATE(sendchar(nchdim))
422  ALLOCATE(recvchar(nchdim))
423  ALLOCATE(heapchar(nchdim))
424  last_nchdim=nchdim
425  ELSE
426 ! NEW CALL BUT DIMENSIONS OK, NOTHING TO DO
427  ENDIF
428 ! TO ALLOW VARIABLES TO BE ALLOCATED IN SCALAR SIMULATIONS,
429 ! BUT WITHOUT USE OF MPI
430  IF(ncsize.GT.1) THEN
431  CALL org_charac_type1(nomb,characteristic) ! COMMIT THE CHARACTERISTICS TYPE FOR COMM
432  ENDIF
433  RETURN
434  END SUBROUTINE organise_chars_for_a
435 
436 !=================================================================================
437 ! OILSPILL
438 !=================================================================================
439 !
440  SUBROUTINE oil_organise_chars(NPARAM) ! WATCH OUT
441  USE bief_def, ONLY: ncsize
442  IMPLICIT NONE
443  INTEGER, INTENT(IN) :: NPARAM
444  IF (.NOT.ALLOCATED(heapcounts)) ALLOCATE(heapcounts(ncsize))
445  IF (.NOT.ALLOCATED(sendcounts)) ALLOCATE(sendcounts(ncsize))
446  IF (.NOT.ALLOCATED(recvcounts)) ALLOCATE(recvcounts(ncsize))
447  IF (.NOT.ALLOCATED(sdispls)) ALLOCATE(sdispls(ncsize))
448  IF (.NOT.ALLOCATED(rdispls)) ALLOCATE(rdispls(ncsize))
449  IF (.NOT.ALLOCATED(icha)) ALLOCATE(icha(ncsize))
450  heapcounts=0
451  sendcounts=0
452  recvcounts=0
453  sdispls=0
454  rdispls=0
455  icha=0
456  ALLOCATE(sendoil(nparam))
457  ALLOCATE(recvoil(nparam))
458  ALLOCATE(heapoil(nparam))
459  CALL org_charac_type_oil(oil_charac) ! COMMIT THE CHARACTERISTICS TYPE FOR COMM
460  RETURN
461  END SUBROUTINE oil_organise_chars
462 
463 !=================================================================================
464 ! OILSPILL
465 !=================================================================================
466 
467 !
468 !---------------------------------------------------------------------
469 ! ALLOCATE ALL STATIC FIELDS FOR ALL-TO-ALL COMMUNICATION
470 ! PREPARE THE MPI_TYPE FOR ALGAE INFORMATION EXCHANGE
471 !---------------------------------------------------------------------
472 !
473  SUBROUTINE organise_algs(NPARAM,NOMB)
474  USE bief_def, ONLY: ncsize
475  IMPLICIT NONE
476  INTEGER, INTENT(IN) :: NPARAM,NOMB
477 !
478  IF (.NOT.ALLOCATED(heapcounts)) ALLOCATE(heapcounts(ncsize))
479  IF (.NOT.ALLOCATED(sendcounts)) ALLOCATE(sendcounts(ncsize))
480  IF (.NOT.ALLOCATED(recvcounts)) ALLOCATE(recvcounts(ncsize))
481  IF (.NOT.ALLOCATED(sdispls)) ALLOCATE(sdispls(ncsize))
482  IF (.NOT.ALLOCATED(rdispls)) ALLOCATE(rdispls(ncsize))
483  IF (.NOT.ALLOCATED(icha)) ALLOCATE(icha(ncsize))
484  heapcounts=0
485  sendcounts=0
486  recvcounts=0
487  sdispls=0
488  rdispls=0
489  icha=0
490  ALLOCATE(sendalg(nparam))
491  ALLOCATE(recvalg(nparam))
492  ALLOCATE(heapalg(nparam))
493 ! COMMIT THE CHARACTERISTICS TYPE FOR COMM
494  CALL org_charac_type_alg(alg_char,nomb)
495  RETURN
496  END SUBROUTINE organise_algs
497 !
498 !---------------------------------------------------------------------
499 ! FOR COLLECTING CHARACTERISTICS LEAVING INITIALLY A GIVEN PARTITION
500 ! TO BE CALLED IN MODIFIED CHAR11 OR CHAR41 SIMILAR TO THE ORIGINAL
501 ! BIEF SUBROUTINES / NOTE THE COUNTER NCHARA/HEAPCHAR USAGE
502 !---------------------------------------------------------------------
503 !
504  SUBROUTINE collect_char(MYPID,IOR,MYII,IFACE,KNE,IFR,
505  & ISP,NSP,XP,YP,ZP,FP,DX,DY,DZ,DF,
506  & IFAPAR,NCHDIM,NCHARA)
508  IMPLICIT NONE
509  INTEGER, INTENT(IN) :: MYPID,IOR,MYII,IFACE,KNE,IFR
510  INTEGER, INTENT(IN) :: ISP,NSP,NCHDIM
511  INTEGER, INTENT(IN) :: IFAPAR(6,*)
512  INTEGER, INTENT(INOUT) :: NCHARA
513  DOUBLE PRECISION, INTENT(IN) :: XP,YP,ZP,FP,DX,DY,DZ,DF
514  INTEGER :: NEPID,II
515  !
516  IF(nchara.EQ.0) heapcounts=0
517  nepid=ifapar(iface ,myii)
518  ii =ifapar(iface+3,myii)
519  nchara=nchara+1
520  IF(nchara.GT.nchdim) THEN ! PROBABLY EXAGGERATED
521  WRITE (lu,*) ' '
522  WRITE (lu,*) 'MODULE STREAMLINE:'
523  WRITE (lu,*) 'NCHARA=',nchara,' NCHDIM=',nchdim
524  WRITE (lu,*) 'COLLECT_CHAR::NCHARA>NCHDIM, INCREASE'
525  WRITE (lu,*) 'SECURITY COEFFICIENT FOR SCARACT'
526  WRITE (lu,*) 'MYPID=',mypid
527  CALL plante(1)
528  stop
529  ENDIF
530  heapchar(nchara)%MYPID=mypid ! THE ORIGIN PID
531  heapchar(nchara)%NEPID=nepid ! THE NEXT PID
532  heapchar(nchara)%INE=ii ! ELEMENT THERE
533  heapchar(nchara)%KNE=kne ! LEVEL THERE
534  heapchar(nchara)%IOR=ior ! THE ORIGIN 2D OR 3D NODE
535  heapchar(nchara)%ISP=isp ! R-K STEP AS COLLECTED
536  heapchar(nchara)%NSP=nsp ! R-K STEPS TO BE DONE
537  heapchar(nchara)%IFR=ifr ! FREQUENCY THERE
538  heapchar(nchara)%XP=xp ! X-POSITION
539  heapchar(nchara)%YP=yp ! Y-POSITION
540  heapchar(nchara)%ZP=zp ! Z-POSITION
541  heapchar(nchara)%FP=fp ! F-POSITION
542  heapchar(nchara)%DX=dx ! X-DISPLACEMENT
543  heapchar(nchara)%DY=dy ! Y-DISPLACEMENT
544  heapchar(nchara)%DZ=dz ! Z-DISPLACEMENT
545  heapchar(nchara)%DF=df ! F-DISPLACEMENT
546 !
547  heapcounts(nepid+1)=heapcounts(nepid+1)+1
548 !
549  RETURN
550  END SUBROUTINE collect_char
551 !
552 !---------------------------------------------------------------------
553 ! USED TO PUT THE ALGAE POSITION IN HEAPCHAR WHEN LOOKING FOR
554 ! THE ELEMENT NUMBER AND PROCESSOR AFTER ALGAE TRANSPORT
555 !---------------------------------------------------------------------
556 !
557  SUBROUTINE collect_alg(MYPID,NEPID,INE,KNE,ISP,NSP,
558  & IFR,XP,YP,ZP,FP,DX,DY,DZ,DF,
559  & NCHARA,NCHDIM)
561  IMPLICIT NONE
562  INTEGER, INTENT(IN) :: MYPID,NEPID,INE(*),KNE(*)
563  INTEGER, INTENT(IN) :: ISP,NSP,IFR,NCHARA,NCHDIM
564  DOUBLE PRECISION, INTENT(IN) :: XP(*),YP(*),ZP(*),FP(*)
565  DOUBLE PRECISION, INTENT(IN) :: DX(*),DY(*),DZ(*),DF(*)
566  INTEGER I
567 !
568  IF(nchara.GT.nchdim) THEN ! PROBABLY EXAGGERATED
569  WRITE (lu,*) ' '
570  WRITE (lu,*) 'MODULE STREAMLINE:'
571  WRITE (lu,*) 'NCHARA=',nchara,' NCHDIM=',nchdim
572  WRITE (lu,*) 'COLLECT_ALG::NCHARA>NCHDIM, INCREASE'
573  WRITE (lu,*) 'SECURITY COEFFICIENT FOR SCARACT'
574  WRITE (lu,*) 'MYPID=',mypid
575  CALL plante(1)
576  stop
577  ENDIF
578  IF(nchara.NE.0) THEN
579  DO i=1,nchara
580 ! IN PARALLEL, ONLY HEAPCOUNTS WILL BE USED
581 ! EVEN IF RECVCOUNTS ARE DEFINED
582 ! NOTE: IN PARALLEL CALCULATIONS THE ORDER OF HEAPCHAR
583 ! NEEDS TO BE DEFINED BECAUSE OF THE WAY PREP_INITIAL_SEND
584 ! IS WRITTEN
585  heapcounts(nepid+1)=i
586  heapchar(i)%MYPID=mypid ! THE ORIGIN PID
587  heapchar(i)%NEPID=nepid ! THE NEXT PID
588  heapchar(i)%NEPID=nepid ! THE NEXT PID
589  heapchar(i)%INE=ine(nchara-i+1) ! ELEMENT THERE
590  heapchar(i)%KNE=kne(nchara-i+1) ! LEVEL THERE
591  heapchar(i)%IOR=nchara-i+1 ! THE ORIGIN 2D OR 3D NODE
592  heapchar(i)%ISP=isp ! R-K STEP AS COLLECTED
593  heapchar(i)%NSP=nsp ! R-K STEPS TO BE DONE
594  heapchar(i)%IFR=ifr ! FREQUENCY THERE
595  heapchar(i)%XP=xp(nchara-i+1) ! X-POSITION
596  heapchar(i)%YP=yp(nchara-i+1) ! Y-POSITION
597  heapchar(i)%ZP=zp(nchara-i+1) ! Z-POSITION
598  heapchar(i)%FP=fp(nchara-i+1) ! F-POSITION
599  heapchar(i)%DX=dx(nchara-i+1) ! X-DISPLACEMENT
600  heapchar(i)%DY=dy(nchara-i+1) ! Y-DISPLACEMENT
601  heapchar(i)%DZ=dz(nchara-i+1) ! Z-DISPLACEMENT
602  heapchar(i)%DF=df(nchara-i+1) ! F-DISPLACEMENT
603 ! IN SCALAR MODE, ONLY RECVCOUNTS WILL BE USED
604  recvcounts(nepid+1)=i
605  recvchar(i)%MYPID=mypid ! THE ORIGIN PID
606  recvchar(i)%NEPID=nepid ! THE NEXT PID
607  recvchar(i)%INE=ine(i) ! ELEMENT THERE
608  recvchar(i)%KNE=kne(i) ! LEVEL THERE
609  recvchar(i)%IOR=i ! THE ORIGIN 2D OR 3D NODE
610  recvchar(i)%ISP=isp ! R-K STEP AS COLLECTED
611  recvchar(i)%NSP=nsp ! R-K STEPS TO BE DONE
612  recvchar(i)%IFR=ifr ! FREQUENCY THERE
613  recvchar(i)%XP=xp(i) ! X-POSITION
614  recvchar(i)%YP=yp(i) ! Y-POSITION
615  recvchar(i)%ZP=zp(i) ! Z-POSITION
616  recvchar(i)%FP=fp(i) ! F-POSITION
617  recvchar(i)%DX=dx(i) ! X-DISPLACEMENT
618  recvchar(i)%DY=dy(i) ! Y-DISPLACEMENT
619  recvchar(i)%DZ=dz(i) ! Z-DISPLACEMENT
620  recvchar(i)%DF=df(i) ! F-DISPLACEMENT
621  ENDDO
622  ENDIF
623 !
624  RETURN
625  END SUBROUTINE collect_alg
626 !
627 !---------------------------------------------------------------------
628 ! RE-INITIALISE THE STRUCTURE AFTER COMPLETING ALL ACTIONS
629 !---------------------------------------------------------------------
630 !
631  SUBROUTINE re_initialise_chars(NSEND,NLOSTCHAR,NLOSTAGAIN,NARRV)
632  IMPLICIT NONE
633  INTEGER, INTENT(OUT) :: NSEND,NLOSTCHAR,NLOSTAGAIN,NARRV
634  nlostchar=0
635  nlostagain=0
636  narrv=0
637  nsend=0
638 ! MAYBE NOT MANDATORY
639  IF (ALLOCATED(heapcounts)) heapcounts=0
640  IF (ALLOCATED(sendcounts)) sendcounts=0
641  IF (ALLOCATED(recvcounts)) recvcounts=0
642  IF (ALLOCATED(sdispls)) sdispls=0 ! NOT NECESSARY?
643  IF (ALLOCATED(rdispls)) rdispls=0 ! NOT NECESSARY?
644  IF (ALLOCATED(icha)) icha=0 ! NOT NECESSARY?
645  END SUBROUTINE re_initialise_chars
646 !
647 !---------------------------------------------------------------------
648 ! PREPARE THE INITIAL SEND OF THE LOST CHARACTERISTICS
649 ! THE FIELDS ARE PREPARED ACCORDING THE MPI_ALLTOALL(V) REQUIREMENTS
650 !---------------------------------------------------------------------
651 !
652  SUBROUTINE prep_initial_send(NSEND,NLOSTCHAR,NCHARA)
653  USE bief_def, ONLY : ncsize
654  IMPLICIT NONE
655  INTEGER, INTENT(IN) :: NSEND
656  INTEGER, INTENT(OUT) :: NLOSTCHAR
657  INTEGER, INTENT(INOUT) :: NCHARA
658  INTEGER I,N
659 ! TODO: THIS LINE IS PERHAPS A BUG, SEE PREP_SENDBACK...
660  IF(nchara.EQ.0) THEN
661  nlostchar = 0
662  RETURN
663  ENDIF
665  sdispls(1) = 0 ! CONTIGUOUS DATA
666  DO i=2,ncsize
667  sdispls(i) = sdispls(i-1)+sendcounts(i-1)
668  ENDDO
669  icha=sendcounts ! A RUNNING COUNTER PARTITION-WISE
670  DO i=1,nchara
671 ! HEAPCHAR(I)%NEPID+1 - THE PARTITION WE SEND TO / OR -1
672  IF(heapchar(i)%NEPID.GE.0) THEN
673  n=heapchar(i)%NEPID+1
674  sendchar(sdispls(n)+icha(n))=heapchar(i)
675  icha(n)=icha(n)-1
676  ENDIF
677  ENDDO
678  nlostchar = nsend
679  heapcounts=0
680  nchara=0
681  RETURN
682  END SUBROUTINE prep_initial_send
683 !
684 !---------------------------------------------------------------------
685 ! PREPARE HEAPALG AND SENDALG ACCORDING TO THE MPI_ALLTOALL(V)
686 ! REQUIREMENTS
687 !---------------------------------------------------------------------
688 !
689  SUBROUTINE prep_initial_send_alg(NSEND,NLOSTCHAR,NCHARA)
690  USE bief_def, ONLY : ncsize
691  IMPLICIT NONE
692  INTEGER, INTENT(IN) :: NSEND
693  INTEGER, INTENT(OUT) :: NLOSTCHAR
694  INTEGER, INTENT(INOUT) :: NCHARA
695  INTEGER I,N
696 ! TODO: THIS LINE IS PERHAPS A BUG, SEE PREP_SENDBACK...
697  IF(nchara.EQ.0) RETURN
699  sdispls(1) = 0 ! CONTIGUOUS DATA
700  DO i=2,ncsize
701  sdispls(i) = sdispls(i-1)+sendcounts(i-1)
702  END DO
703  icha=sendcounts ! A RUNNING COUNTER PARTITION-WISE
704  DO i=1,nchara
705 ! HEAPCHAR(I)%NEPID+1 - THE PARTITION WE SEND TO / OR -1
706  IF(heapalg(i)%NEPID.GE.0) THEN
707  n=heapalg(i)%NEPID+1
708  sendalg(sdispls(n)+icha(n))=heapalg(i)
709  icha(n)=icha(n)-1
710  ENDIF
711  ENDDO
712  nlostchar = nsend
713  heapcounts=0
714  nchara=0
715  RETURN
716  END SUBROUTINE prep_initial_send_alg
717 
718 !====================================================================
719 ! OILSPILL
720 !====================================================================
721 
722  SUBROUTINE oil_prep_initial_send(NSEND,NLOSTCHAR,NCHARA)
723  USE bief_def, ONLY : ncsize
724  IMPLICIT NONE
725  INTEGER, INTENT(IN) :: NSEND
726  INTEGER, INTENT(OUT) :: NLOSTCHAR
727  INTEGER, INTENT(INOUT) :: NCHARA
728  INTEGER I,N
729 ! TODO: THIS LINE IS PERHAPS A BUG, SEE PREP_SENDBACK...
730  IF(nchara.EQ.0) RETURN
732  sdispls(1) = 0 ! CONTIGUOUS DATA
733  DO i=2,ncsize
734  sdispls(i) = sdispls(i-1)+sendcounts(i-1)
735  END DO
736  icha=sendcounts ! A RUNNING COUNTER PARTITION-WISE
737  DO i=1,nchara
738 ! HEAPCHAR(I)%NEPID+1 - THE PARTITION WE SEND TO / OR -1
739  IF(heapoil(i)%NEPID.GE.0) THEN
740  n=heapoil(i)%NEPID+1
741  sendoil(sdispls(n)+icha(n))=heapoil(i)
742  icha(n)=icha(n)-1
743  ENDIF
744  ENDDO
745  nlostchar = nsend
746  heapcounts=0
747  nchara=0
748  RETURN
749  END SUBROUTINE oil_prep_initial_send
750 
751 !====================================================================
752 ! OILSPILL
753 !====================================================================
754 
755 !
756 !---------------------------------------------------------------------
757 ! COLLECT IMPLANTED TRACEBACKS WHICH ARE COMPLETED/LOCALISED
758 ! ON A HEAP, SETTING BY THE WAY ALSO THE NUMBER OF THE LOST-AGAIN
759 ! TRACEBACKS ACCORDINGLY TO THE PARTITION THEY SHOULD BE SEND TO
760 ! THE "LOCALISED" MARK IS SET IN ADD_CHAR11/41
761 !---------------------------------------------------------------------
762 !
763  SUBROUTINE heap_found(NLOSTAGAIN,NARRV,NCHARA)
765  IMPLICIT NONE
766  INTEGER, INTENT(OUT) :: NLOSTAGAIN
767  INTEGER, INTENT(IN) :: NARRV
768  INTEGER, INTENT(INOUT) :: NCHARA
769  INTEGER I
770  sendcounts=0
771 ! DO NOT ZEROIZE NCHARA, HEAPCOUNTS / ADDING FROM GENERATIONS!
772 ! COUNTER PARTITION-WISE, ALSO MY-OWN
773  DO i=1,narrv
774  IF(recvchar(i)%NEPID.EQ.-1) THEN ! A LOCALISED TRACEBACK
775  nchara=nchara+1
776  IF(nchara.GT.nchdim) THEN
777  WRITE (lu,*) ' '
778  WRITE(lu,*) 'MODULE STREAMLINE:'
779  WRITE(lu,*) 'NOT ENOUGH MEMORY ALLOCATION, INCREASE'
780  WRITE(lu,*) 'SECURITY COEFFICIENT FOR SCARACT'
781  CALL plante(1)
782  stop
783  ENDIF
784  heapchar(nchara) = recvchar(i) ! ALREADY INTERPOLATED?
785  heapcounts(heapchar(nchara)%MYPID+1) =
786  & heapcounts(heapchar(nchara)%MYPID+1)+1
787  ELSE ! A LOST-AGAIN CHARACTERISTIC / TO BE SORTED LATER
788  sendcounts(recvchar(i)%NEPID+1) =
789  & sendcounts(recvchar(i)%NEPID+1)+1
790  ENDIF
791  END DO
792  nlostagain=sum(sendcounts)
793  RETURN
794  END SUBROUTINE heap_found
795 !
796 !---------------------------------------------------------------------
797 ! PREPARE LOST-AGAIN TRACEBACKS FOR THE NEXT COMMUNICATION
798 ! FILL IN THE STRUCTURE FOR THE ALL-TO-ALL COMMUNICATION
799 ! NOTE THAT SENDCOUNTS ARE SET IN HEAP_FOUND
800 ! (OPTIMISE(?): HEAP-FOUND AND PREP_LOST_AGAIN CAN BE JOINED)
801 !---------------------------------------------------------------------
802 !
803  SUBROUTINE prep_lost_again(NSEND,NARRV)
804  USE bief_def, ONLY : ncsize
805  IMPLICIT NONE
806  INTEGER,INTENT(IN) :: NARRV
807  INTEGER, INTENT(OUT) :: NSEND
808  INTEGER I,N
809  sdispls(1) = 0 ! CONTIGUOUS DATA MARKER
810  DO i=2,ncsize
811  sdispls(i) = sdispls(i-1)+sendcounts(i-1)
812  ENDDO
813  icha=0
814  nsend=0
815  DO i=1,narrv
816  n=recvchar(i)%NEPID
817  IF (n.NE.-1) THEN ! A LOST-AGAIN TRACEBACK
818  icha(n+1)=icha(n+1)+1
819  nsend=nsend+1
820  sendchar(sdispls(n+1)+icha(n+1)) = recvchar(i)
821  ENDIF
822  ENDDO
823  RETURN
824  END SUBROUTINE prep_lost_again
825 !
826 !---------------------------------------------------------------------
827 ! MOVE THE HEAP OF IMPLANTED AND COMPLETED TRACEBACKS (I.E. COMPLETED
828 ! IN MY PARTITION) TO DATA STRUCTURES FOR ALL-TO-ALL COMMUNICATION
829 ! SENDCHAR IS FILLED ACCORDING TO THE MPI_ALLTOALLV REQUIREMENTS
830 ! ALL-TO-ALL PATTERN INCLUDE MY OWN LOST TRACEBACKS THAT CAME BACK
831 !---------------------------------------------------------------------
832 !
833  SUBROUTINE prep_sendback(NCHARA)
834  USE bief_def, ONLY: ipid, ncsize
835  IMPLICIT NONE
836  INTEGER, INTENT(INOUT) :: NCHARA
837  INTEGER :: I,N
838 !
840  sdispls(1) = 0 ! CONTIGUOUS DATA
841  DO i=2,ncsize
842  sdispls(i) = sdispls(i-1)+sendcounts(i-1)
843  ENDDO
844  icha=0
845  IF(nchara.GT.0) THEN
846  DO i=1,nchara
847 ! MYPID+1 - IS THE -ORIGIN- PARTITION
848  n=heapchar(i)%MYPID+1
849  icha(n)=icha(n)+1
850  sendchar(sdispls(n)+icha(n))=heapchar(i)
851 ! SIGN IN THE SENDBACK ORIGIN FOR DEBUGGING PURPOSES
852  sendchar(sdispls(n)+icha(n))%NEPID=ipid
853  ENDDO
854  ENDIF
855  heapcounts=0
856  nchara=0
857  RETURN
858  END SUBROUTINE prep_sendback
859 !
860 !---------------------------------------------------------------------
861 ! THE GLOBAL COMMUNICATION OF LOST CHARACTERISTICS - ALL-TO-ALL
862 ! (THIS IS THE HEART OF ALL THINGS / THE GLOBAL COMMUNICATION)
863 ! THE DATA IS SENT AND (NOTE!) RECEIVED -SORTED- ACCORDING TO THE
864 ! MPI_ALLTOALL(V) SPECIFICATION IN A CONTIGUOUS FIELDS
865 ! DATA FOR A GIVEN PROCESSOR/PARTITION IN FIELD SECTIONS DESCRIBED BY
866 ! DISPLACEMENTS SDISPLS AND RDISPLS
867 !---------------------------------------------------------------------
868 !
869  SUBROUTINE glob_char_comm()
870  USE bief_def, ONLY : ncsize
872  IMPLICIT NONE
873  INTEGER :: I,IER
876  & ier)
877  IF(ier.NE.mpi_success) THEN
878  WRITE(lu,*)
879  & 'STREAMLINE::GLOB_CHAR_COMM::MPI_ALLTOALL ERROR: ',ier
880  CALL plante(1)
881  stop
882  ENDIF
883  rdispls(1) = 0 ! SAVE THE RECEIVED DATA CONTIGUOUSLY
884  DO i=2,ncsize
885  rdispls(i) = rdispls(i-1)+recvcounts(i-1)
886  ENDDO
887  CALL p_mpi_alltoallv
890  & ier)
891  IF(ier.NE.mpi_success) THEN
892  WRITE(lu,*)
893  & 'STREAMLINE::GLOB_CHAR_COMM::MPI_ALLTOALLV ERROR: ',ier
894  CALL plante(1)
895  stop
896  ENDIF
897  RETURN
898  END SUBROUTINE glob_char_comm
899 !
900 !---------------------------------------------------------------------
901 ! THE GLOBAL COMMUNICATION OF ALGAE INFO - ALL-TO-ALL
902 ! THE DATA IS SENT AND (NOTE!) RECEIVED -SORTED- ACCORDING TO THE
903 ! MPI_ALLTOALL(V) SPECIFICATION IN A CONTIGUOUS FIELDS
904 ! DATA FOR A GIVEN PROCESSOR/PARTITION IN FIELD SECTIONS DESCRIBED BY
905 ! DISPLACEMENTS SDISPLS AND RDISPLS
906 !---------------------------------------------------------------------
907 !
908  SUBROUTINE glob_alg_comm()
909  USE bief_def, ONLY : ncsize
911  IMPLICIT NONE
912  INTEGER :: I,IER
913 !
916  & ier)
917 !
918  IF(ier.NE.mpi_success) THEN
919  WRITE(lu,*)
920  & ' @STREAMLINE::GLOB_CHAR_COMM::MPI_ALLTOALL ERROR: ',ier
921  CALL plante(1)
922  stop
923  ENDIF
924  rdispls(1) = 0 ! SAVE THE RECEIVED DATA CONTIGUOUSLY
925  DO i=2,ncsize
926  rdispls(i) = rdispls(i-1)+recvcounts(i-1)
927  ENDDO
928  CALL p_mpi_alltoallv
931  & ier)
932 
933  IF(ier.NE.mpi_success) THEN
934  WRITE(lu,*)
935  & ' @STREAMLINE::GLOB_ALG_COMM::MPI_ALLTOALLV ERROR: ',ier
936  CALL plante(1)
937  stop
938  ENDIF
939 !
940  RETURN
941  END SUBROUTINE glob_alg_comm
942 
943 !====================================================================
944 ! OILSPILL
945 !====================================================================
946 
947  SUBROUTINE oil_glob_char_comm()
948  USE bief_def, ONLY : ncsize
950  IMPLICIT NONE
951  INTEGER :: I,IER
954  & ier)
955  IF(ier.NE.mpi_success) THEN
956  WRITE(lu,*)
957  & ' @STREAMLINE::GLOB_CHAR_COMM::MPI_ALLTOALL ERROR: ',ier
958  CALL plante(1)
959  stop
960  ENDIF
961  rdispls(1) = 0 ! SAVE THE RECEIVED DATA CONTIGUOUSLY
962  DO i=2,ncsize
963  rdispls(i) = rdispls(i-1)+recvcounts(i-1)
964  ENDDO
965  CALL p_mpi_alltoallv
968  & ier)
969  IF(ier.NE.mpi_success) THEN
970  WRITE(lu,*)
971  & ' @STREAMLINE::GLOB_CHAR_COMM::MPI_ALLTOALLV ERROR: ',ier
972  CALL plante(1)
973  stop
974  ENDIF
975  RETURN
976  END SUBROUTINE oil_glob_char_comm
977 !
978 !====================================================================
979 ! OILSPILL
980 !====================================================================
981 !
982 
983 !---------------------------------------------------------------------
984 ! TELEMAC3D PRISMS, INTERPOLATION OF RECVCHAR
985 ! ELT,ETA AND SHP,SHZ MUST BE CORRECTLY PROVIDED VIA ADD_CHAR11
986 ! -> MATCHED TO THE RANGE 1:NRANGE (NO CHECKING - FOR SPEED!!!)
987 ! N IS THE POSITION FORESEEN FOR A GIVEN VARIABLE VAL IN THE BASKET
988 !---------------------------------------------------------------------
989 !
990  SUBROUTINE interp_recvchar_41
991  & (val,n,ikle,elt,eta,fre,shp,shz,shf,nelem,npoin2,
992  & nplan,nrange,post,nomb,perio,ya4d)
994  IMPLICIT NONE
995  INTEGER, INTENT(IN) :: N,NELEM,NPOIN2,NPLAN,NRANGE,NOMB
996  INTEGER, INTENT(IN) :: IKLE(nelem,3)
997  INTEGER, INTENT(IN) :: ELT(nrange),ETA(nrange)
998  INTEGER, INTENT(IN) :: FRE(nrange)
999  DOUBLE PRECISION, INTENT(IN) :: SHP(3,nrange),SHZ(nrange)
1000  DOUBLE PRECISION, INTENT(IN) :: SHF(*)
1001  DOUBLE PRECISION, INTENT(IN) :: VAL(npoin2,nplan,*)
1002  LOGICAL, INTENT(IN) :: POST,PERIO,YA4D
1003  INTEGER I,ETAP1,I1,I2,I3,IFR
1004  DOUBLE PRECISION UMSHZ,UMSHF
1005 !
1006 ! INTERPOLATION
1007 !
1008  IF(nomb.GT.0) THEN
1009  IF(perio) THEN
1010  eta1(nplan)=1
1011  IF(ya4d) THEN
1012  DO i=1,nrange
1013  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1014  i1=ikle(elt(i),1)
1015  i2=ikle(elt(i),2)
1016  i3=ikle(elt(i),3)
1017  umshz=1.d0-shz(i)
1018  umshf=1.d0-shf(i)
1019  etap1=eta1(eta(i))
1020  ifr=fre(i)
1021  recvchar(i)%BASKET(n) = umshf *
1022  & ((val(i1,eta(i),ifr ) * shp(1,i)
1023  & + val(i2,eta(i),ifr ) * shp(2,i)
1024  & + val(i3,eta(i),ifr ) * shp(3,i)) * umshz
1025  & +( val(i1,etap1 ,ifr ) * shp(1,i)
1026  & + val(i2,etap1 ,ifr ) * shp(2,i)
1027  & + val(i3,etap1 ,ifr ) * shp(3,i)) * shz(i) )
1028  & + shf(i) *
1029  & ((val(i1,eta(i),ifr+1) * shp(1,i)
1030  & + val(i2,eta(i),ifr+1) * shp(2,i)
1031  & + val(i3,eta(i),ifr+1) * shp(3,i)) * umshz
1032  & +( val(i1,etap1 ,ifr+1) * shp(1,i)
1033  & + val(i2,etap1 ,ifr+1) * shp(2,i)
1034  & + val(i3,etap1 ,ifr+1) * shp(3,i)) * shz(i) )
1035 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1036  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1037  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1038  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1039  WRITE(lu,*) 'FOR I=',i
1040  CALL plante(1)
1041  stop
1042 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1043  ENDIF
1044  ENDDO
1045  ELSE
1046  DO i=1,nrange
1047  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1048  etap1=eta1(eta(i))
1049  recvchar(i)%BASKET(n) =
1050  & (val(ikle(elt(i),1),eta(i),1)*shp(1,i)
1051  & +val(ikle(elt(i),2),eta(i),1)*shp(2,i)
1052  & +val(ikle(elt(i),3),eta(i),1)*shp(3,i))*(1.d0-shz(i))
1053  & +(val(ikle(elt(i),1),etap1 ,1)*shp(1,i)
1054  & +val(ikle(elt(i),2),etap1 ,1)*shp(2,i)
1055  & +val(ikle(elt(i),3),etap1 ,1)*shp(3,i))*shz(i)
1056 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1057  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1058  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1059  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1060  WRITE(lu,*) 'FOR I=',i
1061  CALL plante(1)
1062  stop
1063 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1064  ENDIF
1065  ENDDO
1066  ENDIF
1067 ! RESTORING THE ORIGINAL ETA1
1068  eta1(nplan)=nplan+1
1069  ELSE
1070  DO i=1,nrange
1071  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1072  recvchar(i)%BASKET(n) =
1073  & ( val(ikle(elt(i),1),eta(i),1) *shp(1,i)
1074  & + val(ikle(elt(i),2),eta(i),1) *shp(2,i)
1075  & + val(ikle(elt(i),3),eta(i),1) *shp(3,i))*(1.d0-shz(i))
1076  & +( val(ikle(elt(i),1),eta(i)+1,1)*shp(1,i)
1077  & + val(ikle(elt(i),2),eta(i)+1,1)*shp(2,i)
1078  & + val(ikle(elt(i),3),eta(i)+1,1)*shp(3,i))*shz(i)
1079 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1080  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1081  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1082  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1083  WRITE(lu,*) 'FOR I=',i
1084  CALL plante(1)
1085  stop
1086 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1087  ENDIF
1088  ENDDO
1089  ENDIF
1090  ENDIF
1091 !
1092 ! SAVING INTERPOLATION DATA
1093 !
1094  IF(post) THEN
1095  IF(ya4d) THEN
1096  DO i=1,nrange
1097  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1098  recvchar(i)%XP=shp(1,i)
1099  recvchar(i)%YP=shp(2,i)
1100  recvchar(i)%ZP=shp(3,i)
1101  recvchar(i)%DX=shz(i)
1102  recvchar(i)%DY=shf(i)
1103  recvchar(i)%INE=elt(i)
1104  recvchar(i)%KNE=eta(i)
1105  recvchar(i)%IFR=fre(i)
1106  ENDIF
1107  ENDDO
1108  ELSE
1109  DO i=1,nrange
1110  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1111  recvchar(i)%XP=shp(1,i)
1112  recvchar(i)%YP=shp(2,i)
1113  recvchar(i)%ZP=shp(3,i)
1114  recvchar(i)%DX=shz(i)
1115  recvchar(i)%INE=elt(i)
1116  recvchar(i)%KNE=eta(i)
1117  ENDIF
1118  ENDDO
1119  ENDIF
1120  ENDIF
1121 !
1122  RETURN
1123  END SUBROUTINE interp_recvchar_41
1124 !
1125 !---------------------------------------------------------------------
1126 ! TELEMAC2D TRIANGLES, INTERPOLATION OF RECVCHAR
1127 ! ELT AND SHP MUST BE CORRECTLY PROVIDED VIA SCHAR11
1128 ! -> MATCHED TO THE RANGE 1:NRANGE (NO CHECKING - FOR SPEED!!!)
1129 ! N IS THE POSITION FORESEEN FOR A GIVEN VARIABLE VAL IN THE BASKET
1130 !---------------------------------------------------------------------
1131 !
1132  SUBROUTINE interp_recvchar_11
1133  & (val,n,ikle,elt,shp,nelem,npoin,nrange,ielm,post,nomb)
1134  USE bief
1136  IMPLICIT NONE
1137  INTEGER, INTENT(IN) :: N,NELEM,NPOIN,NRANGE,IELM,NOMB
1138  INTEGER, INTENT(IN) :: IKLE(nelem,*)
1139  INTEGER, INTENT(IN) :: ELT(nrange)
1140  DOUBLE PRECISION, INTENT(IN) :: SHP(3,nrange)
1141  DOUBLE PRECISION, INTENT(IN) :: VAL(npoin)
1142  LOGICAL, INTENT(IN) :: POST
1143 !
1144  DOUBLE PRECISION SHP11,SHP12,SHP14
1145  DOUBLE PRECISION SHP22,SHP23,SHP24
1146  DOUBLE PRECISION SHP33,SHP31,SHP34
1147 !
1148 ! SHOULD BE SAME EPSILO THAN SCHAR11 AND INTERP
1149  DOUBLE PRECISION, PARAMETER :: EPSILO = 1.d-6
1150  INTEGER I
1151 !
1152  IF(nomb.GT.0) THEN
1153  IF(ielm.EQ.11) THEN
1154  DO i=1,nrange
1155  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1156  recvchar(i)%BASKET(n) =
1157  & val(ikle(elt(i),1)) * shp(1,i)
1158  & + val(ikle(elt(i),2)) * shp(2,i)
1159  & + val(ikle(elt(i),3)) * shp(3,i)
1160 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1161  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1162  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1163  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1164  WRITE(lu,*) 'FOR I=',i
1165  CALL plante(1)
1166  stop
1167 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1168  ENDIF
1169  ENDDO
1170  ELSEIF(ielm.EQ.12) THEN
1171  DO i=1,nrange
1172  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1173  shp11=shp(1,i)-shp(3,i)
1174  shp12=shp(2,i)-shp(3,i)
1175  shp14=3.d0*shp(3,i)
1176  shp22=shp(2,i)-shp(1,i)
1177  shp23=shp(3,i)-shp(1,i)
1178  shp24=3.d0*shp(1,i)
1179  shp33=shp(3,i)-shp(2,i)
1180  shp31=shp(1,i)-shp(2,i)
1181  shp34=3.d0*shp(2,i)
1182 ! SEE INTERP
1183  IF( shp11.GT. -2.d0*epsilo .AND.
1184  & shp11.LT.1.d0+4.d0*epsilo .AND.
1185  & shp12.GT. -2.d0*epsilo .AND.
1186  & shp12.LT.1.d0+4.d0*epsilo .AND.
1187  & shp14.LT.1.d0+4.d0*epsilo ) THEN
1188  recvchar(i)%BASKET(n) =
1189  & val(ikle(elt(i),1)) * shp11
1190  & + val(ikle(elt(i),2)) * shp12
1191  & + val(ikle(elt(i),4)) * shp14
1192  ELSEIF( shp22.GT. -2.d0*epsilo .AND.
1193  & shp22.LT.1.d0+4.d0*epsilo .AND.
1194  & shp23.GT. -2.d0*epsilo .AND.
1195  & shp23.LT.1.d0+4.d0*epsilo .AND.
1196  & shp24.LT.1.d0+4.d0*epsilo ) THEN
1197  recvchar(i)%BASKET(n) =
1198  & val(ikle(elt(i),2)) * shp22
1199  & + val(ikle(elt(i),3)) * shp23
1200  & + val(ikle(elt(i),4)) * shp24
1201  ELSEIF( shp33.GT. -2.d0*epsilo .AND.
1202  & shp33.LT.1.d0+4.d0*epsilo .AND.
1203  & shp31.GT. -2.d0*epsilo .AND.
1204  & shp31.LT.1.d0+4.d0*epsilo .AND.
1205  & shp34.LT.1.d0+4.d0*epsilo ) THEN
1206  recvchar(i)%BASKET(n) =
1207  & val(ikle(elt(i),3)) * shp33
1208  & + val(ikle(elt(i),1)) * shp31
1209  & + val(ikle(elt(i),4)) * shp34
1210  ELSE
1211  WRITE(lu,*) 'I=',i,' NOT LOCATED, ELT=',elt(i)
1212  CALL plante(1)
1213  stop
1214  ENDIF
1215 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1216  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1217  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1218  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1219  WRITE(lu,*) 'FOR I=',i
1220  CALL plante(1)
1221  stop
1222 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1223  ENDIF
1224  ENDDO
1225  ELSEIF(ielm.EQ.13) THEN
1226  DO i=1,nrange
1227  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1228  recvchar(i)%BASKET(n) =
1229  & val(ikle(elt(i),1)) * (2.d0*shp(1,i)-1.d0)* shp(1,i)
1230  & +val(ikle(elt(i),2)) * (2.d0*shp(2,i)-1.d0)* shp(2,i)
1231  & +val(ikle(elt(i),3)) * (2.d0*shp(3,i)-1.d0)* shp(3,i)
1232  & +val(ikle(elt(i),4)) * 4.d0 * shp(1,i)*shp(2,i)
1233  & +val(ikle(elt(i),5)) * 4.d0 * shp(2,i)*shp(3,i)
1234  & +val(ikle(elt(i),6)) * 4.d0 * shp(3,i)*shp(1,i)
1235 ! THIS IS JUST TO AVOID A BUG ON HP COMPILER
1236  ELSEIF(recvchar(i)%NEPID.LT.-1) THEN
1237  WRITE(lu,*) 'STREAMLINE INTERP_RECVCHAR_11'
1238  WRITE(lu,*) 'NEPID OUT OF RANGE:',recvchar(i)%NEPID
1239  WRITE(lu,*) 'FOR I=',i
1240  CALL plante(1)
1241  stop
1242 ! END OF THIS IS JUST TO AVOID A BUG ON HP COMPILER
1243  ENDIF
1244  ENDDO
1245  ELSE
1246  WRITE(lu,*) 'WRONG IELM IN INTERP_RECVCHAR_11:',ielm
1247  CALL plante(1)
1248  stop
1249  ENDIF
1250  ENDIF
1251 !
1252  IF(post) THEN
1253  IF(ielm.EQ.11.OR.ielm.EQ.12.OR.ielm.EQ.13) THEN
1254  DO i=1,nrange
1255  IF(recvchar(i)%NEPID.EQ.-1) THEN ! LOCALISED
1256  recvchar(i)%XP=shp(1,i)
1257  recvchar(i)%YP=shp(2,i)
1258  recvchar(i)%ZP=shp(3,i)
1259  recvchar(i)%INE=elt(i)
1260  ENDIF
1261  ENDDO
1262  ELSE
1263  WRITE(lu,*) 'WRONG IELM IN INTERP_RECVCHAR_11:',ielm
1264  CALL plante(1)
1265  stop
1266  ENDIF
1267  ENDIF
1268 !
1269  RETURN
1270  END SUBROUTINE interp_recvchar_11
1271 !
1272 !---------------------------------------------------------------------
1273 ! INTRODUCE RECEIVED VALUES IN THE BASKET BACK IN THE TELEMAC
1274 ! STRUCTURES, N BEING THE POSITION IN THE BASKET FOR A GIVEN VARIABLE
1275 !---------------------------------------------------------------------
1276 !
1277  SUBROUTINE introduce_recvchar(VAL,NOMB,NARRV,IELM,
1278  & SHP,SHZ,SHF,ELT,ETA,FRE,
1279  & POST,YA4D)
1280  USE bief
1281  IMPLICIT NONE
1282  INTEGER, INTENT(IN) :: NOMB,NARRV,IELM
1283  INTEGER, INTENT(INOUT) :: ELT(*),ETA(*),FRE(*)
1284  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,*),SHZ(*)
1285  DOUBLE PRECISION, INTENT(INOUT) :: SHF(*)
1286 ! IF YES, SAVE INTERPOLATION DATA
1287  LOGICAL, INTENT(IN) :: POST,YA4D
1288  TYPE(bief_obj), INTENT(INOUT) :: VAL
1289  INTEGER I,N,IPOIN,MAXDIM
1290  IF(nomb.GT.max_basket_size) THEN
1291  WRITE(lu,*) 'STREAMLINE::INTRODUCE_RECVCHAR'
1292  WRITE(lu,*) 'NOMB>MAX_BASKET_SIZE'
1293  WRITE(lu,*) 'NOMB,MAX_BASKET_SIZE=',nomb,max_basket_size
1294  CALL plante(1)
1295  stop
1296  ENDIF
1297 !
1298 ! SAVING INTERPOLATION DATA, DEPENDING ON IELM
1299 !
1300  IF(post) THEN
1301  IF(ielm.EQ.11) THEN
1302  DO i=1,narrv
1303  ipoin=recvchar(i)%IOR
1304  shp(1,ipoin)=recvchar(i)%XP
1305  shp(2,ipoin)=recvchar(i)%YP
1306  shp(3,ipoin)=recvchar(i)%ZP
1307  elt(ipoin) =recvchar(i)%INE
1308  ENDDO
1309  ELSEIF(ielm.EQ.41) THEN
1310  IF(ya4d) THEN
1311  DO i=1,narrv
1312  ipoin=recvchar(i)%IOR
1313  shp(1,ipoin)=recvchar(i)%XP
1314  shp(2,ipoin)=recvchar(i)%YP
1315  shp(3,ipoin)=recvchar(i)%ZP
1316  shz(ipoin) =recvchar(i)%DX
1317  shf(ipoin) =recvchar(i)%DY
1318  elt(ipoin) =recvchar(i)%INE
1319  eta(ipoin) =recvchar(i)%KNE
1320  fre(ipoin) =recvchar(i)%IFR
1321  ENDDO
1322  ELSE
1323  DO i=1,narrv
1324  ipoin=recvchar(i)%IOR
1325  shp(1,ipoin)=recvchar(i)%XP
1326  shp(2,ipoin)=recvchar(i)%YP
1327  shp(3,ipoin)=recvchar(i)%ZP
1328  shz(ipoin) =recvchar(i)%DX
1329  elt(ipoin) =recvchar(i)%INE
1330  eta(ipoin) =recvchar(i)%KNE
1331  ENDDO
1332  ENDIF
1333  ELSE
1334  WRITE(lu,*)'STREAMLINE::INTRODUCE_RECVCHAR'
1335  WRITE(lu,*)'UNEXPECTED IELM=',ielm
1336  CALL plante(1)
1337  stop
1338  ENDIF
1339  ENDIF
1340 !
1341 ! NOW THE INTERPOLATION, DEPENDING ON TYPE
1342 !
1343  IF(nomb.GT.0) THEN
1344  IF(val%TYPE.EQ.2) THEN
1345  DO i=1,narrv
1346  val%R(recvchar(i)%IOR)=recvchar(i)%BASKET(1)
1347  ENDDO
1348  ELSEIF(val%TYPE.EQ.4) THEN
1349 ! LOOKING FOR THE LARGEST SIZE IN ALL ARRAYS TO INTERPOLATE
1350  maxdim=val%ADR(1)%P%DIM1
1351  IF(nomb.GT.1) THEN
1352  DO n=2,nomb
1353  maxdim=max(maxdim,val%ADR(n)%P%DIM1)
1354  ENDDO
1355  ENDIF
1356  DO n=1,nomb
1357  IF(maxdim.GT.val%ADR(n)%P%DIM1) THEN
1358 ! HERE LOSS OF OPTIMISATION:
1359 ! IF CHARACTERISTICS COMPUTED FOR QUASI BUBBLE
1360 ! OR QUADRATIC, FUNCTIONS WHICH ARE LINEAR
1361 ! MUST NOT BE INTERPOLATED BEYOND THEIR SIZE.
1362  DO i=1,narrv
1363  IF(recvchar(i)%IOR.LE.val%ADR(n)%P%DIM1) THEN
1364  val%ADR(n)%P%R(recvchar(i)%IOR)=
1365  & recvchar(i)%BASKET(n)
1366  ENDIF
1367  ENDDO
1368  ELSE
1369 ! HERE NO RISK
1370  DO i=1,narrv
1371  val%ADR(n)%P%R(recvchar(i)%IOR)=
1372  & recvchar(i)%BASKET(n)
1373  ENDDO
1374  ENDIF
1375  ENDDO
1376  ELSE
1377  WRITE(lu,*)'STREAMLINE::INTRODUCE_RECVCHAR'
1378  WRITE(lu,*)'UNEXPECTED VAL%TYPE=',val%TYPE
1379  CALL plante(1)
1380  stop
1381  ENDIF
1382  ENDIF
1383  RETURN
1384  END SUBROUTINE introduce_recvchar
1385 
1386 !/////////////////////////////////////////////////////////////////////
1387 !
1388 ! TELEMAC ROUTINES MODIFIED FOR THE PURPOSE OF
1389 ! PARALLEL STREAMLINE TRACKING - MOSTLY FROM BIEF
1390 !
1391 !/////////////////////////////////////////////////////////////////////
1392 
1393 ! ******************
1394  SUBROUTINE schar41
1395 ! ******************
1396 !
1397  &( u , v , w , dt , nrk , x , y , zstar , z , ikle2 , ibor ,
1398  & xplot , yplot , zplot , dx , dy , dz , shp , shz , elt , eta ,
1399  & nplot , npoin2 , nelem2 ,nelmax2, nplan , surdet ,
1400  & sens , ifapar, nchdim,nchara,add,sigma)
1401 !
1402 !***********************************************************************
1403 ! BIEF VERSION 7.3
1404 !
1405 ! 08/11/04 : ADAPTATION A LA TRANSFORMEE SIGMA GENERALISEE
1406 ! 12/10/05 : BUG CORRIGE, VOIR VARIABLE IELE QUI ETAIT AVANT IEL
1407 ! ET EFFACAIT UN AUTRE IEL.
1408 !
1409 !
1410 !***********************************************************************
1411 !
1412 ! FONCTION :
1413 !
1414 ! REMONTEE OU DESCENTE
1415 ! DES COURBES CARACTERISTIQUES
1416 ! SUR DES PRISMES DE TELEMAC-3D
1417 ! DANS L'INTERVALLE DE TEMPS DT
1418 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
1419 !
1420 !
1421 ! DISCRETISATION :
1422 !
1423 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
1424 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
1425 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
1426 ! AUX NOEUDS DE CET ELEMENT
1427 !
1428 !
1429 ! RESTRICTIONS ET HYPOTHESES :
1430 !
1431 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
1432 !
1433 !-----------------------------------------------------------------------
1434 ! ARGUMENTS
1435 ! .________________.____.______________________________________________.
1436 ! | NOM |MODE| ROLE |
1437 ! |________________|____|______________________________________________|
1438 ! | U,V,W | -->| COMPONENTS OF ADVECTION VELOCITY
1439 ! | | | BUT W IS W* x DELTAZ (STEMS FROM TRIDW2)
1440 ! | DT | -->| PAS DE TEMPS. |
1441 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
1442 ! | X,Y,ZSTAR | -->| COORDONNEES DES POINTS DU MAILLAGE. |
1443 ! | Z | -->| COTE DANS LE MAILLAGE REEL |
1444 ! | IKLE2 | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
1445 ! | | | ET GLOBALE DU MAILLAGE 2D. |
1446 ! | IBOR | -->| NUMEROS 2D DES ELEMENTS AYANT UNE FACE COMMUNE
1447 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
1448 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
1449 ! | X..,Y..,ZPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
1450 ! | DX,DY,DZ | -- | STOCKAGE DES SOUS-PAS . |
1451 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
1452 ! | | | COURBES CARACTERISTIQUES. |
1453 ! | SHZ |<-->| COORDONNEES BARYCENTRIQUES SUIVANT Z DES |
1454 ! | | | NOEUDS DANS LEURS ETAGES "ETA" ASSOCIES. |
1455 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D CHOISIS POUR CHAQUE |
1456 ! | | | NOEUD. |
1457 ! | ETA |<-->| NUMEROS DES ETAGES CHOISIS POUR CHAQUE NOEUD.|
1458 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
1459 ! | NPOIN2 | -->| NOMBRE DE POINTS DU MAILLAGE 2D. |
1460 ! | NELEM2 | -->| NOMBRE D'ELEMENTS DU MAILLAGE 2D. |
1461 ! | NPLAN | -->| NOMBRE DE PLANS.
1462 ! | SIGMA | -->| IF YES, TRANSFORMED MESH
1463 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
1464 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
1465 ! | ISO | -- | STOCKAGE BINAIRE DE LA FACE DE SORTIE. |
1466 ! |________________|____|______________________________________________|
1467 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
1468 !-----------------------------------------------------------------------
1469 ! - APPELE PAR : CARACT
1470 ! - PROGRAMMES APPELES : NEANT
1471 !
1472 !***********************************************************************
1473 !
1474  USE bief
1475 !
1476  IMPLICIT NONE
1477 !
1478 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1479 !
1480  INTEGER , INTENT(IN) :: SENS,NPLAN,NCHDIM,NELMAX2
1481  INTEGER , INTENT(IN) :: NPOIN2,NELEM2,NPLOT,NRK
1482  INTEGER , INTENT(IN) :: IKLE2(nelmax2,3)
1483  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
1484  DOUBLE PRECISION, INTENT(IN) :: U(npoin2,nplan),V(npoin2,nplan)
1485  DOUBLE PRECISION, INTENT(IN) :: W(npoin2,nplan),SURDET(nelem2)
1486  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
1487  DOUBLE PRECISION, INTENT(INOUT) :: ZPLOT(nplot)
1488  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot),SHZ(nplot)
1489  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2),DT
1490  DOUBLE PRECISION, INTENT(IN) :: Z(npoin2,nplan),ZSTAR(nplan)
1491  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
1492  DOUBLE PRECISION, INTENT(INOUT) :: DZ(nplot)
1493  INTEGER , INTENT(IN) :: IBOR(nelmax2,5,nplan-1)
1494  INTEGER , INTENT(INOUT) :: ETA(nplot)
1495  INTEGER , INTENT(IN) :: IFAPAR(6,*)
1496  LOGICAL, INTENT(IN) :: ADD,SIGMA
1497 !
1498 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
1499 !
1500  INTEGER IELE,ISO,ISPDONE,NSP
1501  INTEGER :: IPLOT,ISP,I1,I2,I3,IEL,IET,IET2,ISOH,ISOV,IFA,ISUI(3)
1502 !
1503  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,ZP,NUM,DENOM
1504  DOUBLE PRECISION DELTAZ,PAS2,ZUP,ZDOWN,ZZ
1505 !
1506  INTRINSIC abs , int , max , sqrt
1507 !
1508  parameter( isui = (/ 2 , 3 , 1 /) )
1509  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
1510  DOUBLE PRECISION, PARAMETER :: EPSDZ = 1.d-4
1511 !
1512 !-----------------------------------------------------------------------
1513 ! FOR EVERY POINT
1514 !-----------------------------------------------------------------------
1515 !
1516  DO iplot = 1 , nplot
1517 !
1518  IF(add) THEN
1519 !
1520  xplot(iplot) = recvchar(iplot)%XP
1521  yplot(iplot) = recvchar(iplot)%YP
1522  zplot(iplot) = recvchar(iplot)%ZP
1523  dx(iplot) = recvchar(iplot)%DX
1524  dy(iplot) = recvchar(iplot)%DY
1525  dz(iplot) = recvchar(iplot)%DZ
1526  elt(iplot) = recvchar(iplot)%INE
1527  eta(iplot) = recvchar(iplot)%KNE
1528  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
1529  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
1530  iel = elt(iplot)
1531  iet = eta(iplot)
1532  xp = xplot(iplot)
1533  yp = yplot(iplot)
1534  zp = zplot(iplot)
1535  i1 = ikle2(iel,1)
1536  i2 = ikle2(iel,2)
1537  i3 = ikle2(iel,3)
1538  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
1539  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
1540  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
1541  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
1542  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
1543  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
1544  IF(sigma) THEN
1545  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
1546  ELSE
1547  zdown=shp(1,iplot)*z(i1,iet)
1548  & +shp(2,iplot)*z(i2,iet)
1549  & +shp(3,iplot)*z(i3,iet)
1550  zup =shp(1,iplot)*z(i1,iet+1)
1551  & +shp(2,iplot)*z(i2,iet+1)
1552  & +shp(3,iplot)*z(i3,iet+1)
1553  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
1554  ENDIF
1555 ! ASSUME ALL ARE LOCALISED, IT WILL BE SET OTHERWISE IF LOST-AGAIN
1556  recvchar(iplot)%NEPID=-1
1557 !
1558  ELSE
1559 !
1560  iel = elt(iplot)
1561 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL
1562 ! INTERPOLATION GIVES 0.,
1563 ! AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
1564  IF(iel.EQ.0) THEN
1565  elt(iplot)=1
1566  eta(iplot)=1
1567  shp(1,iplot)=0.d0
1568  shp(2,iplot)=0.d0
1569  shp(3,iplot)=0.d0
1570  shz(iplot)=0.d0
1571  cycle
1572  ENDIF
1573  iet = eta(iplot)
1574  i1 = ikle2(iel,1)
1575  i2 = ikle2(iel,2)
1576  i3 = ikle2(iel,3)
1577  dxp =( u(i1,iet )*shp(1,iplot)
1578  & + u(i2,iet )*shp(2,iplot)
1579  & + u(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
1580  & +( u(i1,iet+1)*shp(1,iplot)
1581  & + u(i2,iet+1)*shp(2,iplot)
1582  & + u(i3,iet+1)*shp(3,iplot) )*shz(iplot)
1583  dyp =( v(i1,iet )*shp(1,iplot)
1584  & + v(i2,iet )*shp(2,iplot)
1585  & + v(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
1586  & +( v(i1,iet+1)*shp(1,iplot)
1587  & + v(i2,iet+1)*shp(2,iplot)
1588  & + v(i3,iet+1)*shp(3,iplot) )*shz(iplot)
1589 ! VERTICAL VELOCITY NOT CONSIDERED HERE !!
1590  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
1591  ispdone=1
1592 !
1593  ENDIF
1594 !
1595  pas = sens * dt / nsp
1596 !
1597 ! LOOP ON RUNGE-KUTTA SUB-STEPS
1598 !
1599 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
1600 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
1601 ! IT IS RESTARTED HERE
1602 !
1603  DO isp = ispdone,nsp
1604 !
1605 !-----------------------------------------------------------------------
1606 ! LOCALISING THE ARRIVAL POINT
1607 !-----------------------------------------------------------------------
1608 !
1609  pas2 = pas
1610 !
1611 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
1612 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
1613 !
1614  IF(add) THEN
1615  IF(isp.EQ.ispdone) GO TO 50
1616  IF(recvchar(iplot)%NEPID.NE.-1) cycle
1617  ENDIF
1618 !
1619  iel = elt(iplot)
1620  iet = eta(iplot)
1621  i1 = ikle2(iel,1)
1622  i2 = ikle2(iel,2)
1623  i3 = ikle2(iel,3)
1624 !
1625  dx(iplot) = ((u(i1,iet )*shp(1,iplot)
1626  & + u(i2,iet )*shp(2,iplot)
1627  & + u(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
1628  & +(u(i1,iet+1)*shp(1,iplot)
1629  & + u(i2,iet+1)*shp(2,iplot)
1630  & + u(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
1631 !
1632  dy(iplot) = ((v(i1,iet )*shp(1,iplot)
1633  & + v(i2,iet )*shp(2,iplot)
1634  & + v(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
1635  & +(v(i1,iet+1)*shp(1,iplot)
1636  & + v(i2,iet+1)*shp(2,iplot)
1637  & + v(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
1638 !
1639  IF(sigma) THEN
1640  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
1641  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
1642  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
1643 !
1644  IF(deltaz.GT.epsdz) THEN
1645 ! DIVISION BY DELTAZ IS DUE TO THE FACT THAT W IS
1646 ! W* MULTIPLIED BY DELTAZ (IT STEMS FROM TRIDW2 IN TELEMAC3D)
1647  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
1648  & + w(i2,iet )*shp(2,iplot)
1649  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
1650  & +(w(i1,iet+1)*shp(1,iplot)
1651  & + w(i2,iet+1)*shp(2,iplot)
1652  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) )
1653  & * pas * (zstar(iet+1)-zstar(iet)) / deltaz
1654  ELSE
1655  dz(iplot) = 0.d0
1656  ENDIF
1657  ELSE
1658  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
1659  & + w(i2,iet )*shp(2,iplot)
1660  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
1661  & +(w(i1,iet+1)*shp(1,iplot)
1662  & + w(i2,iet+1)*shp(2,iplot)
1663  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
1664  ENDIF
1665 !
1666  xp = xplot(iplot) + dx(iplot)
1667  yp = yplot(iplot) + dy(iplot)
1668  zp = zplot(iplot) + dz(iplot)
1669 !
1670  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
1671  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
1672  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
1673  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
1674  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
1675  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
1676  IF(sigma) THEN
1677  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
1678  ELSE
1679  zdown=shp(1,iplot)*z(i1,iet)
1680  & +shp(2,iplot)*z(i2,iet)
1681  & +shp(3,iplot)*z(i3,iet)
1682  zup =shp(1,iplot)*z(i1,iet+1)
1683  & +shp(2,iplot)*z(i2,iet+1)
1684  & +shp(3,iplot)*z(i3,iet+1)
1685  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
1686  ENDIF
1687 !
1688  xplot(iplot) = xp
1689  yplot(iplot) = yp
1690  zplot(iplot) = zp
1691 !
1692  IF(add) THEN
1693 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
1694 ! AND THE NUMBER OF STEPS DONE ALREADY
1695  recvchar(iplot)%XP=xplot(iplot)
1696  recvchar(iplot)%YP=yplot(iplot)
1697  recvchar(iplot)%ZP=zplot(iplot)
1698  recvchar(iplot)%DX=dx(iplot)
1699  recvchar(iplot)%DY=dy(iplot)
1700  recvchar(iplot)%DZ=dz(iplot)
1701  recvchar(iplot)%INE=elt(iplot)
1702  recvchar(iplot)%ISP=isp
1703  ENDIF
1704 !
1705 !-----------------------------------------------------------------------
1706 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
1707 !-----------------------------------------------------------------------
1708 !
1709 50 CONTINUE
1710 !
1711  iso = 0
1712  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
1713  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
1714  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
1715  IF(shz(iplot) .LT.epsilo) iso=ibset(iso,0)
1716  IF(shz(iplot) .GT.1.d0-epsilo) iso=ibset(iso,1)
1717 !
1718  IF(iso.NE.0) THEN
1719 !
1720 !-----------------------------------------------------------------------
1721 ! HERE WE ARE OUT OF THE ELEMENT
1722 !-----------------------------------------------------------------------
1723 !
1724  isoh = iand(iso,28)
1725  isov = iand(iso, 3)
1726  iel = elt(iplot)
1727  iet = eta(iplot)
1728  xp = xplot(iplot)
1729  yp = yplot(iplot)
1730  zp = zplot(iplot)
1731 !
1732  IF(isoh.NE.0) THEN
1733 !
1734  IF(isoh.EQ.4) THEN
1735  ifa = 2
1736  ELSEIF(isoh.EQ.8) THEN
1737  ifa = 3
1738  ELSEIF(isoh.EQ.16) THEN
1739  ifa = 1
1740  ELSEIF(isoh.EQ.12) THEN
1741  ifa = 2
1742  IF(dx(iplot)*(y(ikle2(iel,3))-yp).LT.
1743  & dy(iplot)*(x(ikle2(iel,3))-xp)) ifa = 3
1744  ELSEIF(isoh.EQ.24) THEN
1745  ifa = 3
1746  IF(dx(iplot)*(y(ikle2(iel,1))-yp).LT.
1747  & dy(iplot)*(x(ikle2(iel,1))-xp)) ifa = 1
1748  ELSE
1749  ifa = 1
1750  IF(dx(iplot)*(y(ikle2(iel,2))-yp).LT.
1751  & dy(iplot)*(x(ikle2(iel,2))-xp)) ifa = 2
1752  ENDIF
1753 !
1754  IF(isov.GT.0) THEN
1755  IF(sigma) THEN
1756  IF(abs(dz(iplot)).GT.epsdz) THEN
1757 ! PERCENTAGE OF DISPLACEMENT DONE OUT OF THE ELEMENT
1758  a1 = (zp-zstar(iet+isov-1)) / dz(iplot)
1759  ELSE
1760  a1 = 0.d0
1761  ENDIF
1762  i1 = ikle2(iel,ifa)
1763  i2 = ikle2(iel,isui(ifa))
1764 ! IF EXIT POINT THROUGH LEVEL STILL IN TRIANGLE
1765 ! THEN THE REAL EXIT WAS FACES 4 OR 5
1766 ! UPPER AND LOWER TRIANGLE
1767  IF ((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
1768  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) ifa=isov+3
1769  ELSE
1770  denom=-(x(i2)-x(i1))*dy(iplot)+(y(i2)-y(i1))*dx(iplot)
1771 ! PERCENTAGE OF DISPLACEMENT DONE IN THE ELEMENT
1772  IF(abs(denom).GT.1.d-10) THEN
1773  num=-(xp-x(i1))*dy(iplot)+(yp-y(i1))*dx(iplot)
1774  a1=num/denom
1775  ELSE
1776  a1=0.d0
1777  ENDIF
1778  zdown= a1 *z(i2,iet)
1779  & +(1.d0-a1)*z(i1,iet)
1780  zup = a1 *z(i2,iet+1)
1781  & +(1.d0-a1)*z(i1,iet+1)
1782 ! ZZ: ELEVATION WHEN CROSSING SEGMENT I1-I2
1783  zz = zp-(1.d0-a1)*dz(iplot)
1784 ! EXIT THROUGH LOWER OR UPPER TRIANGLE
1785  IF(zz.GT.zup.OR.zz.LT.zdown) ifa=isov+3
1786  ENDIF
1787  ENDIF
1788 !
1789  ELSE
1790 !
1791  ifa = isov + 3
1792 !
1793  ENDIF
1794 !
1795  iel = ibor(iel,ifa,iet)
1796 !
1797  IF(ifa.LE.3) THEN
1798 !
1799 !-----------------------------------------------------------------------
1800 ! HERE WE ARRIVE IN ANOTHER ELEMENT THROUGH A QUADRANGULAR FACE
1801 !-----------------------------------------------------------------------
1802 !
1803  IF(iel.GT.0) THEN
1804 !
1805 !-----------------------------------------------------------------------
1806 ! RELOCALISING IN ADJACENT ELEMENT
1807 !-----------------------------------------------------------------------
1808 !
1809  i1 = ikle2(iel,1)
1810  i2 = ikle2(iel,2)
1811  i3 = ikle2(iel,3)
1812  elt(iplot) = iel
1813  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
1814  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
1815  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
1816  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
1817  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
1818  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
1819 !
1820  GOTO 50
1821 !
1822  ENDIF
1823 !
1824 !-----------------------------------------------------------------------
1825 ! HERE WE PASS TO A NEIGHBOUR SUBDOMAIN AND COLLECT DATA
1826 !-----------------------------------------------------------------------
1827 !
1828  IF(iel.EQ.-2) THEN
1829  IF(.NOT.add) THEN
1830 ! INTERFACE CROSSING
1831  CALL collect_char
1832  & (ipid,iplot,elt(iplot),ifa,eta(iplot),0,isp,
1833  & nsp,xplot(iplot),yplot(iplot),
1834  & zplot(iplot),0.d0,
1835  & dx(iplot),dy(iplot),dz(iplot),0.d0,
1836  & ifapar,nchdim,nchara)
1837  ELSE
1838 ! A LOST-AGAIN TRACEBACK DETECTED
1839 ! PROCESSOR NUMBER
1840  recvchar(iplot)%NEPID=ifapar(ifa,elt(iplot))
1841  recvchar(iplot)%INE=ifapar(ifa+3,elt(iplot))
1842  recvchar(iplot)%KNE=eta(iplot)
1843  ENDIF
1844 ! EXITING LOOP ON ISP
1845  EXIT
1846  ENDIF
1847 !
1848 !-----------------------------------------------------------------------
1849 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
1850 !-----------------------------------------------------------------------
1851 !
1852  dxp = dx(iplot)
1853  dyp = dy(iplot)
1854  i1 = ikle2(elt(iplot),ifa)
1855  i2 = ikle2(elt(iplot),isui(ifa))
1856  dx1 = x(i2) - x(i1)
1857  dy1 = y(i2) - y(i1)
1858 !
1859  IF(iel.EQ.-1) THEN
1860 !
1861 !-----------------------------------------------------------------------
1862 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
1863 ! AND WE GO ON
1864 !-----------------------------------------------------------------------
1865 !
1866  a1 = (dxp*dx1+dyp*dy1) / (dx1**2+dy1**2)
1867  dx(iplot) = a1 * dx1
1868  dy(iplot) = a1 * dy1
1869 !
1870  a1=((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
1871  shp( ifa ,iplot) = 1.d0 - a1
1872  shp( isui(ifa) ,iplot) = a1
1873  shp(isui(isui(ifa)),iplot) = 0.d0
1874  xplot(iplot) = x(i1) + a1 * dx1
1875  yplot(iplot) = y(i1) + a1 * dy1
1876  IF(add) THEN
1877  recvchar(iplot)%XP=xplot(iplot)
1878  recvchar(iplot)%YP=yplot(iplot)
1879  recvchar(iplot)%ZP=zplot(iplot)
1880  recvchar(iplot)%DX=dx(iplot)
1881  recvchar(iplot)%DY=dy(iplot)
1882  recvchar(iplot)%DZ=dz(iplot)
1883  ENDIF
1884 !
1885  GOTO 50
1886 !
1887  ELSEIF(iel.EQ.0) THEN
1888 !
1889 !-----------------------------------------------------------------------
1890 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
1891 !-----------------------------------------------------------------------
1892 !
1893  denom = dxp*dy1-dyp*dx1
1894  IF(abs(denom).GT.1.d-12) THEN
1895  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
1896  ELSE
1897  a1 = 0.d0
1898  ENDIF
1899  IF(a1.GT.1.d0) a1 = 1.d0
1900  IF(a1.LT.0.d0) a1 = 0.d0
1901  shp( ifa ,iplot) = 1.d0 - a1
1902  shp( isui(ifa) ,iplot) = a1
1903  shp(isui(isui(ifa)),iplot) = 0.d0
1904  xplot(iplot) = x(i1) + a1 * dx1
1905  yplot(iplot) = y(i1) + a1 * dy1
1906  IF(abs(dxp).GT.abs(dyp)) THEN
1907  a1 = (xp-xplot(iplot))/dxp
1908  ELSE
1909  a1 = (yp-yplot(iplot))/dyp
1910  ENDIF
1911  zplot(iplot) = zp - a1*dz(iplot)
1912  IF(sigma) THEN
1913  shz(iplot) = (zplot(iplot)-zstar(iet))
1914  & / (zstar(iet+1)-zstar(iet))
1915  ELSE
1916  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
1917  ENDIF
1918 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
1919 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
1920  elt(iplot) = - sens * elt(iplot)
1921 ! EXITING LOOP ON ISP
1922  EXIT
1923 !
1924  ELSE
1925 !
1926  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR41'
1927  WRITE(lu,*) 'IEL=',iel
1928  CALL plante(1)
1929  stop
1930 !
1931  ENDIF
1932 !
1933  ELSE
1934 !
1935 !-----------------------------------------------------------------------
1936 ! CASE IFA = 4 OR 5
1937 ! HERE WE EXIT THROUGH TOP OR BOTTOM OF THE PRISM
1938 !-----------------------------------------------------------------------
1939 !
1940  ifa = ifa - 4
1941 ! HENCE IFA NOW EQUALS 0 OR 1
1942 !
1943  IF(iel.EQ.1) THEN
1944 !
1945 !-----------------------------------------------------------------------
1946 ! NO NEED TO RECOMPUTE THE VELOCITIES,
1947 ! RELOCALISING IN NEW ELEMENT
1948 !-----------------------------------------------------------------------
1949 !
1950  eta(iplot) = iet + ifa + ifa - 1
1951  IF(sigma) THEN
1952  shz(iplot) = (zp-zstar(eta(iplot)))
1953  & / (zstar(eta(iplot)+1)-zstar(eta(iplot)))
1954  ELSE
1955  zdown=shp(1,iplot)*z(i1,eta(iplot))
1956  & +shp(2,iplot)*z(i2,eta(iplot))
1957  & +shp(3,iplot)*z(i3,eta(iplot))
1958  zup =shp(1,iplot)*z(i1,eta(iplot)+1)
1959  & +shp(2,iplot)*z(i2,eta(iplot)+1)
1960  & +shp(3,iplot)*z(i3,eta(iplot)+1)
1961  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
1962  ENDIF
1963 !
1964  IF(add) THEN
1965  recvchar(iplot)%KNE=eta(iplot)
1966  ENDIF
1967 !
1968  iso = isoh
1969 !
1970  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
1971  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
1972 !
1973  GOTO 50
1974 !
1975  ENDIF
1976 !
1977  IF(iel.EQ.-1) THEN
1978 !
1979 !-----------------------------------------------------------------------
1980 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE SOLIDE
1981 ! ON PROJETTE LE RELIQUAT SUR LA FRONTIERE PUIS ON SE RELOCALISE
1982 !-----------------------------------------------------------------------
1983 !
1984  dz(iplot) = 0.d0
1985 !
1986  IF(sigma) THEN
1987  zplot(iplot) = zstar(iet+ifa)
1988  ELSE
1989  zplot(iplot) = shp(1,iplot)*z(i1,iet+ifa)
1990  & +shp(2,iplot)*z(i2,iet+ifa)
1991  & +shp(3,iplot)*z(i3,iet+ifa)
1992  ENDIF
1993  shz(iplot) = ifa
1994 !
1995  iso = isoh
1996  IF(isoh.NE.0) GOTO 50
1997 !
1998  ELSE
1999 !
2000 !-----------------------------------------------------------------------
2001 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE LIQUIDE (CAS 0)
2002 ! ON ARRETE ALORS LA REMONTEE DES CARACTERISTIQUES (SIGNE DE ELT)
2003 ! OU, QUE L'ON VIENT DE TRAVERSER UN PLAN AVEC RECALCUL DES VITESSES
2004 ! DEMANDE (CAS 2)
2005 !-----------------------------------------------------------------------
2006 !
2007  IF(sigma) THEN
2008  IF(abs(dz(iplot)).GT.epsdz) THEN
2009  a1 = (zp-zstar(iet+ifa)) / dz(iplot)
2010  ELSE
2011  a1 = 0.d0
2012  ENDIF
2013  xp = xp - a1*dx(iplot)
2014  yp = yp - a1*dy(iplot)
2015  zp = zstar(iet+ifa)
2016  ELSE
2017  WRITE(lu,*) 'SORTIE EN VERTICALE PAR FRONTIERE LIQUIDE'
2018  WRITE(lu,*) 'CAS NON PROGRAMME'
2019  CALL plante(1)
2020  stop
2021  ENDIF
2022  iele = elt(iplot)
2023  i1 = ikle2(iele,1)
2024  i2 = ikle2(iele,2)
2025  i3 = ikle2(iele,3)
2026 !
2027  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2028  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iele)
2029  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2030  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iele)
2031  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2032  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iele)
2033 !
2034  IF(iel.EQ.2) THEN
2035 !
2036 !-----------------------------------------------------------------------
2037 ! LA, ON SAIT QUE LA FACE DE SORTIE SE SITUE SUR LE PLAN OU ON DEMANDE
2038 ! UN RECALCUL DES VITESSES
2039 !-----------------------------------------------------------------------
2040 !
2041 ! IF IFA = 1 EXIT THROUGH THE TOP
2042 ! IF IFA = 0 EXIT THROUGH THE BOTTOM
2043 ! THEN NEW IET IS IET+1 IF IFA = 1
2044 ! AND IET-1 IF IFA = 0
2045 ! THIS IS SUMMARISED BY IET=IET+2*IFA-1
2046 !
2047 ! RECOMPUTED VELOCITIES MUST BE TAKEN AT IET2=IET+IFA
2048 ! I.E. BOTTOM IF EXIT THROUGH THE BOTTOM
2049 ! AND TOP IF EXIT THROUGH THE TOP
2050 !
2051  iet2 = iet + ifa
2052  iet = iet + ifa + ifa - 1
2053 !
2054  pas2 = pas2 * a1
2055 !
2056  dx(iplot) = ( u(i1,iet2)*shp(1,iplot)
2057  & + u(i2,iet2)*shp(2,iplot)
2058  & + u(i3,iet2)*shp(3,iplot) ) * pas2
2059 !
2060  dy(iplot) = ( v(i1,iet2)*shp(1,iplot)
2061  & + v(i2,iet2)*shp(2,iplot)
2062  & + v(i3,iet2)*shp(3,iplot) ) * pas2
2063 !
2064  IF(sigma) THEN
2065  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
2066  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
2067  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
2068 !
2069  IF(deltaz.GT.epsdz) THEN
2070  dz(iplot) = ( w(i1,iet2)*shp(1,iplot)
2071  & + w(i2,iet2)*shp(2,iplot)
2072  & + w(i3,iet2)*shp(3,iplot) ) * pas2
2073  & * (zstar(iet+1)-zstar(iet)) / deltaz
2074  ELSE
2075  dz(iplot) = 0.d0
2076  ENDIF
2077  ELSE
2078  dz(iplot)=((w(i1,iet )*shp(1,iplot)
2079  & + w(i2,iet )*shp(2,iplot)
2080  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2081  & +(w(i1,iet+1)*shp(1,iplot)
2082  & + w(i2,iet+1)*shp(2,iplot)
2083  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) )*pas
2084  ENDIF
2085 !
2086  xp = xp + dx(iplot)
2087  yp = yp + dy(iplot)
2088  zp = zp + dz(iplot)
2089 !
2090  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2091  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iele)
2092  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2093  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iele)
2094  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2095  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iele)
2096  IF(sigma) THEN
2097  shz(iplot)=(zp-zstar(iet))/(zstar(iet+1)-zstar(iet))
2098  ELSE
2099  zdown=shp(1,iplot)*z(i1,iet)
2100  & +shp(2,iplot)*z(i2,iet)
2101  & +shp(3,iplot)*z(i3,iet)
2102  zup =shp(1,iplot)*z(i1,iet+1)
2103  & +shp(2,iplot)*z(i2,iet+1)
2104  & +shp(3,iplot)*z(i3,iet+1)
2105  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2106  ENDIF
2107 !
2108  xplot(iplot) = xp
2109  yplot(iplot) = yp
2110  zplot(iplot) = zp
2111  eta(iplot) = iet
2112 !
2113  iso = 0
2114 !
2115  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
2116  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
2117  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
2118 !
2119  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
2120  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
2121 !
2122  IF(add) THEN
2123  recvchar(iplot)%XP=xplot(iplot)
2124  recvchar(iplot)%YP=yplot(iplot)
2125  recvchar(iplot)%ZP=zplot(iplot)
2126  recvchar(iplot)%DX=dx(iplot)
2127  recvchar(iplot)%DY=dy(iplot)
2128  recvchar(iplot)%DZ=dz(iplot)
2129  ENDIF
2130 !
2131  GOTO 50
2132 !
2133  ENDIF
2134 !
2135  xplot(iplot) = xp
2136  yplot(iplot) = yp
2137  zplot(iplot) = zp
2138  shz(iplot) = ifa
2139 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
2140 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
2141  elt(iplot) = - sens * elt(iplot)
2142 ! EXITING LOOP ON ISP
2143  EXIT
2144 !
2145  ENDIF
2146 !
2147  ENDIF
2148 !
2149 ! IF(ISO.NE.0)
2150  ENDIF
2151 !
2152  ENDDO
2153 !
2154  ENDDO
2155 !
2156 !-----------------------------------------------------------------------
2157 !
2158  RETURN
2159  END SUBROUTINE schar41
2160 ! **********************
2161  SUBROUTINE schar41_sto
2162 ! **********************
2163 !
2164  &( u , v , w , dt , nrk , x , y , zstar , z , ikle2 , ibor ,
2165  & xplot , yplot , zplot , dx , dy , dz , shp , shz , elt , eta ,
2166  & nplot , npoin2 , nelem2 , nelmax2,nplan , surdet ,
2167  & sens , ifapar, nchdim,nchara,add,sigma,viscvi,stocha)
2168 !
2169 !***********************************************************************
2170 ! BIEF VERSION 7.0
2171 !
2172 !***********************************************************************
2173 !
2174 ! FONCTION : This is a mere copy of SCHAR41, but with a stochastic
2175 ! model on the horizontal.
2176 !
2177 !-----------------------------------------------------------------------
2178 ! ARGUMENTS
2179 ! .________________.____.______________________________________________.
2180 ! | NOM |MODE| ROLE |
2181 ! |________________|____|______________________________________________|
2182 ! | U,V,W | -->| COMPONENTS OF ADVECTION VELOCITY
2183 ! | | | BUT W IS W* x DELTAZ (STEMS FROM TRIDW2)
2184 ! | DT | -->| PAS DE TEMPS. |
2185 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
2186 ! | X,Y,ZSTAR | -->| COORDONNEES DES POINTS DU MAILLAGE. |
2187 ! | Z | -->| COTE DANS LE MAILLAGE REEL |
2188 ! | IKLE2 | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
2189 ! | | | ET GLOBALE DU MAILLAGE 2D. |
2190 ! | IBOR | -->| NUMEROS 2D DES ELEMENTS AYANT UNE FACE COMMUNE
2191 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
2192 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
2193 ! | X..,Y..,ZPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
2194 ! | DX,DY,DZ | -- | STOCKAGE DES SOUS-PAS . |
2195 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
2196 ! | | | COURBES CARACTERISTIQUES. |
2197 ! | SHZ |<-->| COORDONNEES BARYCENTRIQUES SUIVANT Z DES |
2198 ! | | | NOEUDS DANS LEURS ETAGES "ETA" ASSOCIES. |
2199 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D CHOISIS POUR CHAQUE |
2200 ! | | | NOEUD. |
2201 ! | ETA |<-->| NUMEROS DES ETAGES CHOISIS POUR CHAQUE NOEUD.|
2202 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
2203 ! | NPOIN2 | -->| NOMBRE DE POINTS DU MAILLAGE 2D. |
2204 ! | NELEM2 | -->| NOMBRE D'ELEMENTS DU MAILLAGE 2D. |
2205 ! | NPLAN | -->| NOMBRE DE PLANS.
2206 ! | SIGMA | -->| IF YES, TRANSFORMED MESH
2207 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
2208 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
2209 ! | ISO | -- | STOCKAGE BINAIRE DE LA FACE DE SORTIE. |
2210 ! |________________|____|______________________________________________|
2211 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
2212 !-----------------------------------------------------------------------
2213 ! - APPELE PAR : CARACT
2214 ! - PROGRAMMES APPELES : NEANT
2215 !
2216 !***********************************************************************
2217 !
2218  USE bief
2219 !
2220  IMPLICIT NONE
2221 !
2222 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2223 !
2224  INTEGER , INTENT(IN) :: SENS,NPLAN,NCHDIM,STOCHA
2225  INTEGER , INTENT(IN) :: NPOIN2,NELEM2,NPLOT,NRK,NELMAX2
2226  INTEGER , INTENT(IN) :: IKLE2(nelmax2,3)
2227  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
2228  DOUBLE PRECISION, INTENT(IN) :: U(npoin2,nplan),V(npoin2,nplan)
2229  DOUBLE PRECISION, INTENT(IN) :: W(npoin2,nplan),SURDET(nelem2)
2230  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
2231  DOUBLE PRECISION, INTENT(INOUT) :: ZPLOT(nplot)
2232  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot),SHZ(nplot)
2233  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2),DT
2234  DOUBLE PRECISION, INTENT(IN) :: Z(npoin2,nplan),ZSTAR(nplan)
2235  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
2236  DOUBLE PRECISION, INTENT(INOUT) :: DZ(nplot)
2237  INTEGER , INTENT(IN) :: IBOR(nelmax2,5,nplan-1)
2238  INTEGER , INTENT(INOUT) :: ETA(nplot)
2239  INTEGER , INTENT(IN) :: IFAPAR(6,*)
2240  LOGICAL, INTENT(IN) :: ADD,SIGMA
2241  type(bief_obj), INTENT(INOUT) :: viscvi
2242 !
2243 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2244 !
2245  INTEGER IELE,ISO,ISPDONE,NSP
2246  INTEGER :: IPLOT,ISP,I1,I2,I3,IEL,IET,IET2,ISOH,ISOV,IFA,ISUI(3)
2247 !
2248  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,ZP,NUM,DENOM
2249  DOUBLE PRECISION DELTAZ,PAS2,ZUP,ZDOWN,ZZ
2250 !
2251  INTRINSIC abs , int , max , sqrt
2252 !
2253 ! FOR STOCHASTIC DIFFUSION
2254  DOUBLE PRECISION RAND1,RAND2,A,B,C,D,E,DIFF_X,DIFF_Y,DEUXPI
2255 !
2256  parameter( isui = (/ 2 , 3 , 1 /) )
2257  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
2258  DOUBLE PRECISION, PARAMETER :: EPSDZ = 1.d-4
2259 !
2260 !-----------------------------------------------------------------------
2261 ! FOR EVERY POINT
2262 !-----------------------------------------------------------------------
2263 !
2264  DO iplot = 1 , nplot
2265 !
2266  IF(add) THEN
2267 !
2268  xplot(iplot) = recvchar(iplot)%XP
2269  yplot(iplot) = recvchar(iplot)%YP
2270  zplot(iplot) = recvchar(iplot)%ZP
2271  dx(iplot) = recvchar(iplot)%DX
2272  dy(iplot) = recvchar(iplot)%DY
2273  dz(iplot) = recvchar(iplot)%DZ
2274  elt(iplot) = recvchar(iplot)%INE
2275  eta(iplot) = recvchar(iplot)%KNE
2276  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
2277  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
2278  iel = elt(iplot)
2279  iet = eta(iplot)
2280  xp = xplot(iplot)
2281  yp = yplot(iplot)
2282  zp = zplot(iplot)
2283  i1 = ikle2(iel,1)
2284  i2 = ikle2(iel,2)
2285  i3 = ikle2(iel,3)
2286  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2287  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
2288  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2289  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
2290  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2291  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
2292  IF(sigma) THEN
2293  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
2294  ELSE
2295  zdown=shp(1,iplot)*z(i1,iet)
2296  & +shp(2,iplot)*z(i2,iet)
2297  & +shp(3,iplot)*z(i3,iet)
2298  zup =shp(1,iplot)*z(i1,iet+1)
2299  & +shp(2,iplot)*z(i2,iet+1)
2300  & +shp(3,iplot)*z(i3,iet+1)
2301  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2302  ENDIF
2303 ! ASSUME ALL ARE LOCALISED, IT WILL BE SET OTHERWISE IF LOST-AGAIN
2304  recvchar(iplot)%NEPID=-1
2305 !
2306  ELSE
2307 !
2308  iel = elt(iplot)
2309 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL
2310 ! INTERPOLATION GIVES 0.,
2311 ! AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
2312  IF(iel.EQ.0) THEN
2313  elt(iplot)=1
2314  eta(iplot)=1
2315  shp(1,iplot)=0.d0
2316  shp(2,iplot)=0.d0
2317  shp(3,iplot)=0.d0
2318  shz(iplot)=0.d0
2319  cycle
2320  ENDIF
2321  iet = eta(iplot)
2322  i1 = ikle2(iel,1)
2323  i2 = ikle2(iel,2)
2324  i3 = ikle2(iel,3)
2325  dxp =( u(i1,iet )*shp(1,iplot)
2326  & + u(i2,iet )*shp(2,iplot)
2327  & + u(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
2328  & +( u(i1,iet+1)*shp(1,iplot)
2329  & + u(i2,iet+1)*shp(2,iplot)
2330  & + u(i3,iet+1)*shp(3,iplot) )*shz(iplot)
2331  dyp =( v(i1,iet )*shp(1,iplot)
2332  & + v(i2,iet )*shp(2,iplot)
2333  & + v(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
2334  & +( v(i1,iet+1)*shp(1,iplot)
2335  & + v(i2,iet+1)*shp(2,iplot)
2336  & + v(i3,iet+1)*shp(3,iplot) )*shz(iplot)
2337 ! VERTICAL VELOCITY NOT CONSIDERED HERE !!
2338  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
2339  ispdone=1
2340 !
2341  ENDIF
2342 !
2343  pas = sens * dt / nsp
2344 !
2345 ! LOOP ON RUNGE-KUTTA SUB-STEPS
2346 !
2347 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
2348 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
2349 ! IT IS RESTARTED HERE
2350 !
2351  DO isp = ispdone,nsp
2352 !
2353 !-----------------------------------------------------------------------
2354 ! LOCALISING THE ARRIVAL POINT
2355 !-----------------------------------------------------------------------
2356 !
2357  pas2 = pas
2358 !
2359 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
2360 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
2361 !
2362  IF(add) THEN
2363  IF(isp.EQ.ispdone) GO TO 50
2364  IF(recvchar(iplot)%NEPID.NE.-1) cycle
2365  ENDIF
2366 !
2367  iel = elt(iplot)
2368  iet = eta(iplot)
2369  i1 = ikle2(iel,1)
2370  i2 = ikle2(iel,2)
2371  i3 = ikle2(iel,3)
2372 !
2373  dx(iplot) = ((u(i1,iet )*shp(1,iplot)
2374  & + u(i2,iet )*shp(2,iplot)
2375  & + u(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2376  & +(u(i1,iet+1)*shp(1,iplot)
2377  & + u(i2,iet+1)*shp(2,iplot)
2378  & + u(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
2379 !
2380  dy(iplot) = ((v(i1,iet )*shp(1,iplot)
2381  & + v(i2,iet )*shp(2,iplot)
2382  & + v(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2383  & +(v(i1,iet+1)*shp(1,iplot)
2384  & + v(i2,iet+1)*shp(2,iplot)
2385  & + v(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
2386 !
2387  IF(sigma) THEN
2388  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
2389  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
2390  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
2391 !
2392  IF(deltaz.GT.epsdz) THEN
2393 ! DIVISION BY DELTAZ IS DUE TO THE FACT THAT W IS
2394 ! W* MULTIPLIED BY DELTAZ (IT STEMS FROM TRIDW2 IN TELEMAC3D)
2395  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
2396  & + w(i2,iet )*shp(2,iplot)
2397  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2398  & +(w(i1,iet+1)*shp(1,iplot)
2399  & + w(i2,iet+1)*shp(2,iplot)
2400  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) )
2401  & * pas * (zstar(iet+1)-zstar(iet)) / deltaz
2402  ELSE
2403  dz(iplot) = 0.d0
2404  ENDIF
2405  ELSE
2406  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
2407  & + w(i2,iet )*shp(2,iplot)
2408  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2409  & +(w(i1,iet+1)*shp(1,iplot)
2410  & + w(i2,iet+1)*shp(2,iplot)
2411  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
2412  ENDIF
2413 !
2414 ! STOCHASTIC DIFFUSION
2415 !
2416  IF(stocha.EQ.1) THEN
2417 ! COMPUTING LOCAL VISCOSITY
2418  a=max(viscvi%ADR(1)%P%R(i1)*shp(1,iplot)
2419  & +viscvi%ADR(1)%P%R(i2)*shp(2,iplot)
2420  & +viscvi%ADR(1)%P%R(i3)*shp(3,iplot),0.d0)
2421  b=max(viscvi%ADR(2)%P%R(i1)*shp(1,iplot)
2422  & +viscvi%ADR(2)%P%R(i2)*shp(2,iplot)
2423  & +viscvi%ADR(2)%P%R(i3)*shp(3,iplot),0.d0)
2424 ! DISPLACEMENT DUE TO RANDOM DIFFUSION
2425  deuxpi=2.d0*acos(-1.d0)
2426  CALL random_number(rand1)
2427  CALL random_number(rand2)
2428  c=sqrt(-2.d0*log(rand1))
2429  d=c*cos(deuxpi*rand2)
2430  e=c*sin(deuxpi*rand2)
2431  diff_x=d*sqrt(2.d0*a/0.72d0)
2432  diff_y=e*sqrt(2.d0*b/0.72d0)
2433  dx(iplot) = dx(iplot) + diff_x*sqrt(abs(pas))
2434  dy(iplot) = dy(iplot) + diff_y*sqrt(abs(pas))
2435  ENDIF
2436 
2437  xp = xplot(iplot) + dx(iplot)
2438  yp = yplot(iplot) + dy(iplot)
2439  zp = zplot(iplot) + dz(iplot)
2440 !
2441  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2442  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
2443  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2444  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
2445  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2446  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
2447  IF(sigma) THEN
2448  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
2449  ELSE
2450  zdown=shp(1,iplot)*z(i1,iet)
2451  & +shp(2,iplot)*z(i2,iet)
2452  & +shp(3,iplot)*z(i3,iet)
2453  zup =shp(1,iplot)*z(i1,iet+1)
2454  & +shp(2,iplot)*z(i2,iet+1)
2455  & +shp(3,iplot)*z(i3,iet+1)
2456  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2457  ENDIF
2458 !
2459  xplot(iplot) = xp
2460  yplot(iplot) = yp
2461  zplot(iplot) = zp
2462 !
2463  IF(add) THEN
2464 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
2465 ! AND THE NUMBER OF STEPS DONE ALREADY
2466  recvchar(iplot)%XP=xplot(iplot)
2467  recvchar(iplot)%YP=yplot(iplot)
2468  recvchar(iplot)%ZP=zplot(iplot)
2469  recvchar(iplot)%DX=dx(iplot)
2470  recvchar(iplot)%DY=dy(iplot)
2471  recvchar(iplot)%DZ=dz(iplot)
2472  recvchar(iplot)%INE=elt(iplot)
2473  recvchar(iplot)%ISP=isp
2474  ENDIF
2475 !
2476 !-----------------------------------------------------------------------
2477 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
2478 !-----------------------------------------------------------------------
2479 !
2480 50 CONTINUE
2481 !
2482  iso = 0
2483  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
2484  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
2485  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
2486  IF(shz(iplot) .LT.epsilo) iso=ibset(iso,0)
2487  IF(shz(iplot) .GT.1.d0-epsilo) iso=ibset(iso,1)
2488 !
2489  IF(iso.NE.0) THEN
2490 !
2491 !-----------------------------------------------------------------------
2492 ! HERE WE ARE OUT OF THE ELEMENT
2493 !-----------------------------------------------------------------------
2494 !
2495  isoh = iand(iso,28)
2496  isov = iand(iso, 3)
2497  iel = elt(iplot)
2498  iet = eta(iplot)
2499  xp = xplot(iplot)
2500  yp = yplot(iplot)
2501  zp = zplot(iplot)
2502 !
2503  IF(isoh.NE.0) THEN
2504 !
2505  IF(isoh.EQ.4) THEN
2506  ifa = 2
2507  ELSEIF(isoh.EQ.8) THEN
2508  ifa = 3
2509  ELSEIF(isoh.EQ.16) THEN
2510  ifa = 1
2511  ELSEIF(isoh.EQ.12) THEN
2512  ifa = 2
2513  IF(dx(iplot)*(y(ikle2(iel,3))-yp).LT.
2514  & dy(iplot)*(x(ikle2(iel,3))-xp)) ifa = 3
2515  ELSEIF(isoh.EQ.24) THEN
2516  ifa = 3
2517  IF(dx(iplot)*(y(ikle2(iel,1))-yp).LT.
2518  & dy(iplot)*(x(ikle2(iel,1))-xp)) ifa = 1
2519  ELSE
2520  ifa = 1
2521  IF(dx(iplot)*(y(ikle2(iel,2))-yp).LT.
2522  & dy(iplot)*(x(ikle2(iel,2))-xp)) ifa = 2
2523  ENDIF
2524 !
2525  IF(isov.GT.0) THEN
2526  IF(sigma) THEN
2527  IF(abs(dz(iplot)).GT.epsdz) THEN
2528 ! PERCENTAGE OF DISPLACEMENT DONE OUT OF THE ELEMENT
2529  a1 = (zp-zstar(iet+isov-1)) / dz(iplot)
2530  ELSE
2531  a1 = 0.d0
2532  ENDIF
2533  i1 = ikle2(iel,ifa)
2534  i2 = ikle2(iel,isui(ifa))
2535 ! IF EXIT POINT THROUGH LEVEL STILL IN TRIANGLE
2536 ! THEN THE REAL EXIT WAS FACES 4 OR 5
2537 ! UPPER AND LOWER TRIANGLE
2538  IF ((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
2539  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) ifa=isov+3
2540  ELSE
2541  denom=-(x(i2)-x(i1))*dy(iplot)+(y(i2)-y(i1))*dx(iplot)
2542 ! PERCENTAGE OF DISPLACEMENT DONE IN THE ELEMENT
2543  IF(abs(denom).GT.1.d-10) THEN
2544  num=-(xp-x(i1))*dy(iplot)+(yp-y(i1))*dx(iplot)
2545  a1=num/denom
2546  ELSE
2547  a1=0.d0
2548  ENDIF
2549  zdown= a1 *z(i2,iet)
2550  & +(1.d0-a1)*z(i1,iet)
2551  zup = a1 *z(i2,iet+1)
2552  & +(1.d0-a1)*z(i1,iet+1)
2553 ! ZZ: ELEVATION WHEN CROSSING SEGMENT I1-I2
2554  zz = zp-(1.d0-a1)*dz(iplot)
2555 ! EXIT THROUGH LOWER OR UPPER TRIANGLE
2556  IF(zz.GT.zup.OR.zz.LT.zdown) ifa=isov+3
2557  ENDIF
2558  ENDIF
2559 !
2560  ELSE
2561 !
2562  ifa = isov + 3
2563 !
2564  ENDIF
2565 !
2566  iel = ibor(iel,ifa,iet)
2567 !
2568  IF(ifa.LE.3) THEN
2569 !
2570 !-----------------------------------------------------------------------
2571 ! HERE WE ARRIVE IN ANOTHER ELEMENT THROUGH A QUADRANGULAR FACE
2572 !-----------------------------------------------------------------------
2573 !
2574  IF(iel.GT.0) THEN
2575 !
2576 !-----------------------------------------------------------------------
2577 ! RELOCALISING IN ADJACENT ELEMENT
2578 !-----------------------------------------------------------------------
2579 !
2580  i1 = ikle2(iel,1)
2581  i2 = ikle2(iel,2)
2582  i3 = ikle2(iel,3)
2583  elt(iplot) = iel
2584  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2585  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
2586  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2587  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
2588  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2589  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
2590 !
2591  GOTO 50
2592 !
2593  ENDIF
2594 !
2595 !-----------------------------------------------------------------------
2596 ! HERE WE PASS TO A NEIGHBOUR SUBDOMAIN AND COLLECT DATA
2597 !-----------------------------------------------------------------------
2598 !
2599  IF(iel.EQ.-2) THEN
2600  IF(.NOT.add) THEN
2601 ! INTERFACE CROSSING
2602  CALL collect_char
2603  & (ipid,iplot,elt(iplot),ifa,eta(iplot),0,isp,
2604  & nsp,xplot(iplot),yplot(iplot),
2605  & zplot(iplot),0.d0,
2606  & dx(iplot),dy(iplot),dz(iplot),0.d0,
2607  & ifapar,nchdim,nchara)
2608  ELSE
2609 ! A LOST-AGAIN TRACEBACK DETECTED
2610 ! PROCESSOR NUMBER
2611  recvchar(iplot)%NEPID=ifapar(ifa,elt(iplot))
2612  recvchar(iplot)%INE=ifapar(ifa+3,elt(iplot))
2613  recvchar(iplot)%KNE=eta(iplot)
2614  ENDIF
2615 ! EXITING LOOP ON ISP
2616  EXIT
2617  ENDIF
2618 !
2619 !-----------------------------------------------------------------------
2620 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
2621 !-----------------------------------------------------------------------
2622 !
2623  dxp = dx(iplot)
2624  dyp = dy(iplot)
2625  i1 = ikle2(elt(iplot),ifa)
2626  i2 = ikle2(elt(iplot),isui(ifa))
2627  dx1 = x(i2) - x(i1)
2628  dy1 = y(i2) - y(i1)
2629 !
2630  IF(iel.EQ.-1) THEN
2631 !
2632 !-----------------------------------------------------------------------
2633 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
2634 ! AND WE GO ON
2635 !-----------------------------------------------------------------------
2636 !
2637  a1 = (dxp*dx1+dyp*dy1) / (dx1**2+dy1**2)
2638  dx(iplot) = a1 * dx1
2639  dy(iplot) = a1 * dy1
2640 !
2641  a1=((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
2642  shp( ifa ,iplot) = 1.d0 - a1
2643  shp( isui(ifa) ,iplot) = a1
2644  shp(isui(isui(ifa)),iplot) = 0.d0
2645  xplot(iplot) = x(i1) + a1 * dx1
2646  yplot(iplot) = y(i1) + a1 * dy1
2647  IF(add) THEN
2648  recvchar(iplot)%XP=xplot(iplot)
2649  recvchar(iplot)%YP=yplot(iplot)
2650  recvchar(iplot)%ZP=zplot(iplot)
2651  recvchar(iplot)%DX=dx(iplot)
2652  recvchar(iplot)%DY=dy(iplot)
2653  recvchar(iplot)%DZ=dz(iplot)
2654  ENDIF
2655 !
2656  GOTO 50
2657 !
2658  ELSEIF(iel.EQ.0) THEN
2659 !
2660 !-----------------------------------------------------------------------
2661 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
2662 !-----------------------------------------------------------------------
2663 !
2664  denom = dxp*dy1-dyp*dx1
2665  IF(abs(denom).GT.1.d-12) THEN
2666  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
2667  ELSE
2668  a1 = 0.d0
2669  ENDIF
2670  IF(a1.GT.1.d0) a1 = 1.d0
2671  IF(a1.LT.0.d0) a1 = 0.d0
2672  shp( ifa ,iplot) = 1.d0 - a1
2673  shp( isui(ifa) ,iplot) = a1
2674  shp(isui(isui(ifa)),iplot) = 0.d0
2675  xplot(iplot) = x(i1) + a1 * dx1
2676  yplot(iplot) = y(i1) + a1 * dy1
2677  IF(abs(dxp).GT.abs(dyp)) THEN
2678  a1 = (xp-xplot(iplot))/dxp
2679  ELSE
2680  a1 = (yp-yplot(iplot))/dyp
2681  ENDIF
2682  zplot(iplot) = zp - a1*dz(iplot)
2683  IF(sigma) THEN
2684  shz(iplot) = (zplot(iplot)-zstar(iet))
2685  & / (zstar(iet+1)-zstar(iet))
2686  ELSE
2687  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2688  ENDIF
2689 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
2690 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
2691  elt(iplot) = - sens * elt(iplot)
2692 ! EXITING LOOP ON ISP
2693  EXIT
2694 !
2695  ELSE
2696 !
2697  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR41'
2698  WRITE(lu,*) 'IEL=',iel
2699  CALL plante(1)
2700  stop
2701 !
2702  ENDIF
2703 !
2704  ELSE
2705 !
2706 !-----------------------------------------------------------------------
2707 ! CASE IFA = 4 OR 5
2708 ! HERE WE EXIT THROUGH TOP OR BOTTOM OF THE PRISM
2709 !-----------------------------------------------------------------------
2710 !
2711  ifa = ifa - 4
2712 ! HENCE IFA NOW EQUALS 0 OR 1
2713 !
2714  IF(iel.EQ.1) THEN
2715 !
2716 !-----------------------------------------------------------------------
2717 ! NO NEED TO RECOMPUTE THE VELOCITIES,
2718 ! RELOCALISING IN NEW ELEMENT
2719 !-----------------------------------------------------------------------
2720 !
2721  eta(iplot) = iet + ifa + ifa - 1
2722  IF(sigma) THEN
2723  shz(iplot) = (zp-zstar(eta(iplot)))
2724  & / (zstar(eta(iplot)+1)-zstar(eta(iplot)))
2725  ELSE
2726  zdown=shp(1,iplot)*z(i1,eta(iplot))
2727  & +shp(2,iplot)*z(i2,eta(iplot))
2728  & +shp(3,iplot)*z(i3,eta(iplot))
2729  zup =shp(1,iplot)*z(i1,eta(iplot)+1)
2730  & +shp(2,iplot)*z(i2,eta(iplot)+1)
2731  & +shp(3,iplot)*z(i3,eta(iplot)+1)
2732  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2733  ENDIF
2734 !
2735  IF(add) THEN
2736  recvchar(iplot)%KNE=eta(iplot)
2737  ENDIF
2738 !
2739  iso = isoh
2740 !
2741  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
2742  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
2743 !
2744  GOTO 50
2745 !
2746  ENDIF
2747 !
2748  IF(iel.EQ.-1) THEN
2749 !
2750 !-----------------------------------------------------------------------
2751 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE SOLIDE
2752 ! ON PROJETTE LE RELIQUAT SUR LA FRONTIERE PUIS ON SE RELOCALISE
2753 !-----------------------------------------------------------------------
2754 !
2755  dz(iplot) = 0.d0
2756 !
2757  IF(sigma) THEN
2758  zplot(iplot) = zstar(iet+ifa)
2759  ELSE
2760  zplot(iplot) = shp(1,iplot)*z(i1,iet+ifa)
2761  & +shp(2,iplot)*z(i2,iet+ifa)
2762  & +shp(3,iplot)*z(i3,iet+ifa)
2763  ENDIF
2764  shz(iplot) = ifa
2765 !
2766  iso = isoh
2767  IF(isoh.NE.0) GOTO 50
2768 !
2769  ELSE
2770 !
2771 !-----------------------------------------------------------------------
2772 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE LIQUIDE (CAS 0)
2773 ! ON ARRETE ALORS LA REMONTEE DES CARACTERISTIQUES (SIGNE DE ELT)
2774 ! OU, QUE L'ON VIENT DE TRAVERSER UN PLAN AVEC RECALCUL DES VITESSES
2775 ! DEMANDE (CAS 2)
2776 !-----------------------------------------------------------------------
2777 !
2778  IF(sigma) THEN
2779  IF(abs(dz(iplot)).GT.epsdz) THEN
2780  a1 = (zp-zstar(iet+ifa)) / dz(iplot)
2781  ELSE
2782  a1 = 0.d0
2783  ENDIF
2784  xp = xp - a1*dx(iplot)
2785  yp = yp - a1*dy(iplot)
2786  zp = zstar(iet+ifa)
2787  ELSE
2788  WRITE(lu,*) 'VERTICAL GETTING OUT FROM LIQUID '
2789  WRITE(lu,*) 'BOUNDARY - NON IMPLEMENTED CASE'
2790  CALL plante(1)
2791  stop
2792  ENDIF
2793  iele = elt(iplot)
2794  i1 = ikle2(iele,1)
2795  i2 = ikle2(iele,2)
2796  i3 = ikle2(iele,3)
2797 !
2798  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2799  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iele)
2800  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2801  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iele)
2802  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2803  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iele)
2804 !
2805  IF(iel.EQ.2) THEN
2806 !
2807 !-----------------------------------------------------------------------
2808 ! LA, ON SAIT QUE LA FACE DE SORTIE SE SITUE SUR LE PLAN OU ON DEMANDE
2809 ! UN RECALCUL DES VITESSES
2810 !-----------------------------------------------------------------------
2811 !
2812 ! IF IFA = 1 EXIT THROUGH THE TOP
2813 ! IF IFA = 0 EXIT THROUGH THE BOTTOM
2814 ! THEN NEW IET IS IET+1 IF IFA = 1
2815 ! AND IET-1 IF IFA = 0
2816 ! THIS IS SUMMARISED BY IET=IET+2*IFA-1
2817 !
2818 ! RECOMPUTED VELOCITIES MUST BE TAKEN AT IET2=IET+IFA
2819 ! I.E. BOTTOM IF EXIT THROUGH THE BOTTOM
2820 ! AND TOP IF EXIT THROUGH THE TOP
2821 !
2822  iet2 = iet + ifa
2823  iet = iet + ifa + ifa - 1
2824 !
2825  pas2 = pas2 * a1
2826 !
2827  dx(iplot) = ( u(i1,iet2)*shp(1,iplot)
2828  & + u(i2,iet2)*shp(2,iplot)
2829  & + u(i3,iet2)*shp(3,iplot) ) * pas2
2830 !
2831  dy(iplot) = ( v(i1,iet2)*shp(1,iplot)
2832  & + v(i2,iet2)*shp(2,iplot)
2833  & + v(i3,iet2)*shp(3,iplot) ) * pas2
2834 !
2835  IF(sigma) THEN
2836  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
2837  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
2838  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
2839 !
2840  IF(deltaz.GT.epsdz) THEN
2841  dz(iplot) = ( w(i1,iet2)*shp(1,iplot)
2842  & + w(i2,iet2)*shp(2,iplot)
2843  & + w(i3,iet2)*shp(3,iplot) ) * pas2
2844  & * (zstar(iet+1)-zstar(iet)) / deltaz
2845  ELSE
2846  dz(iplot) = 0.d0
2847  ENDIF
2848  ELSE
2849  dz(iplot)=((w(i1,iet )*shp(1,iplot)
2850  & + w(i2,iet )*shp(2,iplot)
2851  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
2852  & +(w(i1,iet+1)*shp(1,iplot)
2853  & + w(i2,iet+1)*shp(2,iplot)
2854  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) )*pas
2855  ENDIF
2856 !
2857  xp = xp + dx(iplot)
2858  yp = yp + dy(iplot)
2859  zp = zp + dz(iplot)
2860 !
2861  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
2862  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iele)
2863  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
2864  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iele)
2865  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
2866  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iele)
2867  IF(sigma) THEN
2868  shz(iplot)=(zp-zstar(iet))/(zstar(iet+1)-zstar(iet))
2869  ELSE
2870  zdown=shp(1,iplot)*z(i1,iet)
2871  & +shp(2,iplot)*z(i2,iet)
2872  & +shp(3,iplot)*z(i3,iet)
2873  zup =shp(1,iplot)*z(i1,iet+1)
2874  & +shp(2,iplot)*z(i2,iet+1)
2875  & +shp(3,iplot)*z(i3,iet+1)
2876  shz(iplot) = (zp-zdown) / max(zup-zdown,epsdz)
2877  ENDIF
2878 !
2879  xplot(iplot) = xp
2880  yplot(iplot) = yp
2881  zplot(iplot) = zp
2882  eta(iplot) = iet
2883 !
2884  iso = 0
2885 !
2886  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
2887  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
2888  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
2889 !
2890  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
2891  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
2892 !
2893  IF(add) THEN
2894  recvchar(iplot)%XP=xplot(iplot)
2895  recvchar(iplot)%YP=yplot(iplot)
2896  recvchar(iplot)%ZP=zplot(iplot)
2897  recvchar(iplot)%DX=dx(iplot)
2898  recvchar(iplot)%DY=dy(iplot)
2899  recvchar(iplot)%DZ=dz(iplot)
2900  ENDIF
2901 !
2902  GOTO 50
2903 !
2904  ENDIF
2905 !
2906  xplot(iplot) = xp
2907  yplot(iplot) = yp
2908  zplot(iplot) = zp
2909  shz(iplot) = ifa
2910 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
2911 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
2912  elt(iplot) = - sens * elt(iplot)
2913 ! EXITING LOOP ON ISP
2914  EXIT
2915 !
2916  ENDIF
2917 !
2918  ENDIF
2919 !
2920 ! IF(ISO.NE.0)
2921  ENDIF
2922 !
2923  ENDDO
2924 !
2925  ENDDO
2926 !
2927 !-----------------------------------------------------------------------
2928 !
2929  RETURN
2930  END SUBROUTINE schar41_sto
2931 ! ************************
2932  SUBROUTINE schar41_sigma
2933 ! ************************
2934 !
2935  &( u , v , w , dt , nrk , x , y , zstar , z , ikle2 , ibor ,
2936  & xplot , yplot , zplot , dx , dy , dz , shp , shz , elt , eta ,
2937  & nplot , npoin2 , nelem2 , nelmax2,nplan , surdet ,
2938  & sens , ifapar, nchdim,nchara,add)
2939 !
2940 !***********************************************************************
2941 ! BIEF VERSION 7.0 28/04/93 J-M JANIN (LNH) 30 87 72 84
2942 ! 12/10/05 J-M HERVOUET (LNHE) 01 30 87 80 18
2943 !
2944 ! 08/11/04 : ADAPTATION A LA TRANSFORMEE SIGMA GENERALISEE
2945 ! 12/10/05 : BUG CORRIGE, VOIR VARIABLE IELE QUI ETAIT AVANT IEL
2946 ! ET EFFACAIT UN AUTRE IEL.
2947 !
2948 !
2949 !***********************************************************************
2950 !
2951 ! FONCTION : Exactly like SCHAR41 but optimised for SIGMA=.TRUE.
2952 ! Could be replaced by SCHAR41.
2953 !
2954 ! REMONTEE OU DESCENTE
2955 ! DES COURBES CARACTERISTIQUES
2956 ! SUR DES PRISMES DE TELEMAC-3D
2957 ! DANS L'INTERVALLE DE TEMPS DT
2958 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
2959 !
2960 !
2961 ! DISCRETISATION :
2962 !
2963 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
2964 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
2965 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
2966 ! AUX NOEUDS DE CET ELEMENT
2967 !
2968 !
2969 ! RESTRICTIONS ET HYPOTHESES :
2970 !
2971 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
2972 !
2973 !-----------------------------------------------------------------------
2974 ! ARGUMENTS
2975 ! .________________.____.______________________________________________.
2976 ! | NOM |MODE| ROLE |
2977 ! |________________|____|______________________________________________|
2978 ! | U,V,W | -->| COMPONENTS OF ADVECTION VELOCITY
2979 ! | | | BUT W IS W* x DELTAZ (STEMS FROM TRIDW2)
2980 ! | DT | -->| PAS DE TEMPS. |
2981 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
2982 ! | X,Y,ZSTAR | -->| COORDONNEES DES POINTS DU MAILLAGE. |
2983 ! | Z | -->| COTE DANS LE MAILLAGE REEL |
2984 ! | IKLE2 | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
2985 ! | | | ET GLOBALE DU MAILLAGE 2D. |
2986 ! | IBOR | -->| NUMEROS 2D DES ELEMENTS AYANT UNE FACE COMMUNE
2987 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
2988 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
2989 ! | X..,Y..,ZPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
2990 ! | DX,DY,DZ | -- | STOCKAGE DES SOUS-PAS . |
2991 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
2992 ! | | | COURBES CARACTERISTIQUES. |
2993 ! | SHZ |<-->| COORDONNEES BARYCENTRIQUES SUIVANT Z DES |
2994 ! | | | NOEUDS DANS LEURS ETAGES "ETA" ASSOCIES. |
2995 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D CHOISIS POUR CHAQUE |
2996 ! | | | NOEUD. |
2997 ! | ETA |<-->| NUMEROS DES ETAGES CHOISIS POUR CHAQUE NOEUD.|
2998 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
2999 ! | NPOIN2 | -->| NOMBRE DE POINTS DU MAILLAGE 2D. |
3000 ! | NELEM2 | -->| NUMBER OF ELEMENTS IN THE 2D MESH
3001 ! | NELMAX2 | -->| MAXIMUM NUMBER OF ELEMENTS IN THE 2D MESH
3002 ! | NPLAN | -->| NOMBRE DE PLANS. |
3003 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
3004 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
3005 ! | ISO | -- | STOCKAGE BINAIRE DE LA FACE DE SORTIE. |
3006 ! |________________|____|______________________________________________|
3007 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
3008 !-----------------------------------------------------------------------
3009 ! - APPELE PAR : CARACT
3010 ! - PROGRAMMES APPELES : NEANT
3011 !
3012 !***********************************************************************
3013 !
3014  USE bief
3015 !
3016  IMPLICIT NONE
3017 !
3018 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3019 !
3020  INTEGER , INTENT(IN) :: SENS,NPLAN,NCHDIM,NELMAX2
3021  INTEGER , INTENT(IN) :: NPOIN2,NELEM2,NPLOT,NRK
3022  INTEGER , INTENT(IN) :: IKLE2(nelmax2,3)
3023  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
3024  DOUBLE PRECISION, INTENT(IN) :: U(npoin2,nplan),V(npoin2,nplan)
3025  DOUBLE PRECISION, INTENT(IN) :: W(npoin2,nplan),SURDET(nelem2)
3026  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
3027  DOUBLE PRECISION, INTENT(INOUT) :: ZPLOT(nplot)
3028  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot),SHZ(nplot)
3029  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2),DT
3030  DOUBLE PRECISION, INTENT(IN) :: Z(npoin2,nplan),ZSTAR(nplan)
3031  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
3032  DOUBLE PRECISION, INTENT(INOUT) :: DZ(nplot)
3033  INTEGER , INTENT(IN) :: IBOR(nelmax2,5,nplan-1)
3034  INTEGER , INTENT(INOUT) :: ETA(nplot)
3035  INTEGER , INTENT(IN) :: IFAPAR(6,*)
3036  LOGICAL, INTENT(IN) :: ADD
3037 !
3038 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3039 !
3040  INTEGER IELE,ISO,ISPDONE,NSP
3041  INTEGER :: IPLOT,ISP,I1,I2,I3,IEL,IET,IET2,ISOH,ISOV,IFA,ISUI(3)
3042 !
3043  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,ZP,DENOM
3044  DOUBLE PRECISION DELTAZ,PAS2
3045 !
3046  INTRINSIC abs , int , max , sqrt
3047 !
3048  parameter( isui = (/ 2 , 3 , 1 /) )
3049  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
3050  DOUBLE PRECISION, PARAMETER :: EPSDZ = 1.d-4
3051 !
3052 !-----------------------------------------------------------------------
3053 ! FOR EVERY POINT
3054 !-----------------------------------------------------------------------
3055 !
3056  DO iplot = 1 , nplot
3057 !
3058  IF(add) THEN
3059 !
3060  xplot(iplot) = recvchar(iplot)%XP
3061  yplot(iplot) = recvchar(iplot)%YP
3062  zplot(iplot) = recvchar(iplot)%ZP
3063  dx(iplot) = recvchar(iplot)%DX
3064  dy(iplot) = recvchar(iplot)%DY
3065  dz(iplot) = recvchar(iplot)%DZ
3066  elt(iplot) = recvchar(iplot)%INE
3067  eta(iplot) = recvchar(iplot)%KNE
3068  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
3069  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
3070  iel = elt(iplot)
3071  iet = eta(iplot)
3072  xp = xplot(iplot)
3073  yp = yplot(iplot)
3074  zp = zplot(iplot)
3075  i1 = ikle2(iel,1)
3076  i2 = ikle2(iel,2)
3077  i3 = ikle2(iel,3)
3078  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3079  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
3080  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3081  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
3082  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3083  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
3084  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
3085 ! ASSUME ALL ARE LOCALISED, IT WILL BE SET OTHERWISE IF LOST-AGAIN
3086  recvchar(iplot)%NEPID=-1
3087 !
3088  ELSE
3089 !
3090  iel = elt(iplot)
3091 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL
3092 ! INTERPOLATION GIVES 0.,
3093 ! AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
3094  IF(iel.EQ.0) THEN
3095  elt(iplot)=1
3096  eta(iplot)=1
3097  shp(1,iplot)=0.d0
3098  shp(2,iplot)=0.d0
3099  shp(3,iplot)=0.d0
3100  shz(iplot)=0.d0
3101  cycle
3102  ENDIF
3103  iet = eta(iplot)
3104  i1 = ikle2(iel,1)
3105  i2 = ikle2(iel,2)
3106  i3 = ikle2(iel,3)
3107  dxp =( u(i1,iet )*shp(1,iplot)
3108  & + u(i2,iet )*shp(2,iplot)
3109  & + u(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
3110  & +( u(i1,iet+1)*shp(1,iplot)
3111  & + u(i2,iet+1)*shp(2,iplot)
3112  & + u(i3,iet+1)*shp(3,iplot) )*shz(iplot)
3113  dyp =( v(i1,iet )*shp(1,iplot)
3114  & + v(i2,iet )*shp(2,iplot)
3115  & + v(i3,iet )*shp(3,iplot) )*(1.d0-shz(iplot))
3116  & +( v(i1,iet+1)*shp(1,iplot)
3117  & + v(i2,iet+1)*shp(2,iplot)
3118  & + v(i3,iet+1)*shp(3,iplot) )*shz(iplot)
3119  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
3120  ispdone=1
3121 !
3122  ENDIF
3123 !
3124  pas = sens * dt / nsp
3125 !
3126 ! LOOP ON RUNGE-KUTTA SUB-STEPS
3127 !
3128 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
3129 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
3130 ! IT IS RESTARTED HERE
3131 !
3132  DO isp = ispdone,nsp
3133 !
3134 !-----------------------------------------------------------------------
3135 ! LOCALISING THE ARRIVAL POINT
3136 !-----------------------------------------------------------------------
3137 !
3138  pas2 = pas
3139 !
3140 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
3141 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
3142 !
3143  IF(add) THEN
3144  IF(isp.EQ.ispdone) GO TO 50
3145  IF(recvchar(iplot)%NEPID.NE.-1) cycle
3146  ENDIF
3147 !
3148  iel = elt(iplot)
3149  iet = eta(iplot)
3150  i1 = ikle2(iel,1)
3151  i2 = ikle2(iel,2)
3152  i3 = ikle2(iel,3)
3153 !
3154  dx(iplot) = ((u(i1,iet )*shp(1,iplot)
3155  & + u(i2,iet )*shp(2,iplot)
3156  & + u(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3157  & +(u(i1,iet+1)*shp(1,iplot)
3158  & + u(i2,iet+1)*shp(2,iplot)
3159  & + u(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
3160 !
3161  dy(iplot) = ((v(i1,iet )*shp(1,iplot)
3162  & + v(i2,iet )*shp(2,iplot)
3163  & + v(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3164  & +(v(i1,iet+1)*shp(1,iplot)
3165  & + v(i2,iet+1)*shp(2,iplot)
3166  & + v(i3,iet+1)*shp(3,iplot))*shz(iplot) ) * pas
3167 !
3168  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
3169  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
3170  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
3171 !
3172  IF(deltaz.GT.epsdz) THEN
3173 ! DIVISION BY DELTAZ IS DUE TO THE FACT THAT W IS
3174 ! W* MULTIPLIED BY DELTAZ (IT STEMS FROM TRIDW2 IN TELEMAC3D)
3175  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
3176  & + w(i2,iet )*shp(2,iplot)
3177  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3178  & +(w(i1,iet+1)*shp(1,iplot)
3179  & + w(i2,iet+1)*shp(2,iplot)
3180  & + w(i3,iet+1)*shp(3,iplot))*shz(iplot) )
3181  & * pas * (zstar(iet+1)-zstar(iet)) / deltaz
3182  ELSE
3183  dz(iplot) = 0.d0
3184  ENDIF
3185 !
3186  xp = xplot(iplot) + dx(iplot)
3187  yp = yplot(iplot) + dy(iplot)
3188  zp = zplot(iplot) + dz(iplot)
3189 !
3190  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3191  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
3192  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3193  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
3194  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3195  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
3196 !
3197  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
3198 !
3199  xplot(iplot) = xp
3200  yplot(iplot) = yp
3201  zplot(iplot) = zp
3202 !
3203  IF(add) THEN
3204 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
3205 ! AND THE NUMBER OF STEPS DONE ALREADY
3206  recvchar(iplot)%XP=xplot(iplot)
3207  recvchar(iplot)%YP=yplot(iplot)
3208  recvchar(iplot)%ZP=zplot(iplot)
3209  recvchar(iplot)%DX=dx(iplot)
3210  recvchar(iplot)%DY=dy(iplot)
3211  recvchar(iplot)%DZ=dz(iplot)
3212  recvchar(iplot)%INE=elt(iplot)
3213  recvchar(iplot)%ISP=isp
3214  ENDIF
3215 !
3216 !-----------------------------------------------------------------------
3217 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
3218 !-----------------------------------------------------------------------
3219 !
3220 50 CONTINUE
3221 !
3222  iso = 0
3223  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
3224  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
3225  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
3226  IF(shz(iplot) .LT.epsilo) iso=ibset(iso,0)
3227  IF(shz(iplot) .GT.1.d0-epsilo) iso=ibset(iso,1)
3228 !
3229  IF(iso.NE.0) THEN
3230 !
3231 !-----------------------------------------------------------------------
3232 ! HERE WE ARE OUT OF THE ELEMENT
3233 !-----------------------------------------------------------------------
3234 !
3235  isoh = iand(iso,28)
3236  isov = iand(iso, 3)
3237  iel = elt(iplot)
3238  iet = eta(iplot)
3239  xp = xplot(iplot)
3240  yp = yplot(iplot)
3241  zp = zplot(iplot)
3242 !
3243  IF(isoh.NE.0) THEN
3244 !
3245  IF(isoh.EQ.4) THEN
3246  ifa = 2
3247  ELSEIF(isoh.EQ.8) THEN
3248  ifa = 3
3249  ELSEIF(isoh.EQ.16) THEN
3250  ifa = 1
3251  ELSEIF(isoh.EQ.12) THEN
3252  ifa = 2
3253  IF(dx(iplot)*(y(ikle2(iel,3))-yp).LT.
3254  & dy(iplot)*(x(ikle2(iel,3))-xp)) ifa = 3
3255  ELSEIF(isoh.EQ.24) THEN
3256  ifa = 3
3257  IF(dx(iplot)*(y(ikle2(iel,1))-yp).LT.
3258  & dy(iplot)*(x(ikle2(iel,1))-xp)) ifa = 1
3259  ELSE
3260  ifa = 1
3261  IF(dx(iplot)*(y(ikle2(iel,2))-yp).LT.
3262  & dy(iplot)*(x(ikle2(iel,2))-xp)) ifa = 2
3263  ENDIF
3264 !
3265  IF(isov.GT.0) THEN
3266  IF(abs(dz(iplot)).GT.epsdz) THEN
3267  a1 = (zp-zstar(iet+isov-1)) / dz(iplot)
3268  ELSE
3269  a1 = 0.d0
3270  ENDIF
3271  i1 = ikle2(iel,ifa)
3272  i2 = ikle2(iel,isui(ifa))
3273  IF ((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
3274  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) ifa=isov+3
3275  ENDIF
3276 !
3277  ELSE
3278 !
3279  ifa = isov + 3
3280 !
3281  ENDIF
3282 !
3283  iel = ibor(iel,ifa,iet)
3284 !
3285  IF(ifa.LE.3) THEN
3286 !
3287 !-----------------------------------------------------------------------
3288 ! HERE WE ARRIVE IN ANOTHER ELEMENT THROUGH A QUADRANGULAR FACE
3289 !-----------------------------------------------------------------------
3290 !
3291  IF(iel.GT.0) THEN
3292 !
3293 !-----------------------------------------------------------------------
3294 ! RELOCALISING IN ADJACENT ELEMENT
3295 !-----------------------------------------------------------------------
3296 !
3297  i1 = ikle2(iel,1)
3298  i2 = ikle2(iel,2)
3299  i3 = ikle2(iel,3)
3300  elt(iplot) = iel
3301  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3302  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
3303  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3304  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
3305  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3306  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
3307 !
3308  GOTO 50
3309 !
3310  ENDIF
3311 !
3312 !-----------------------------------------------------------------------
3313 ! HERE WE PASS TO A NEIGHBOUR SUBDOMAIN AND COLLECT DATA
3314 !-----------------------------------------------------------------------
3315 !
3316  IF(iel.EQ.-2) THEN
3317  IF(.NOT.add) THEN
3318 ! INTERFACE CROSSING
3319  CALL collect_char
3320  & (ipid,iplot,elt(iplot),ifa,eta(iplot),0,isp,
3321  & nsp,xplot(iplot),yplot(iplot),
3322  & zplot(iplot),0.d0,
3323  & dx(iplot),dy(iplot),dz(iplot),0.d0,
3324  & ifapar,nchdim,nchara)
3325  ELSE
3326 ! A LOST-AGAIN TRACEBACK DETECTED
3327 ! PROCESSOR NUMBER
3328  recvchar(iplot)%NEPID=ifapar(ifa,elt(iplot))
3329  recvchar(iplot)%INE=ifapar(ifa+3,elt(iplot))
3330  recvchar(iplot)%KNE=eta(iplot)
3331  ENDIF
3332 ! EXITING LOOP ON ISP
3333  EXIT
3334  ENDIF
3335 !
3336 !-----------------------------------------------------------------------
3337 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
3338 !-----------------------------------------------------------------------
3339 !
3340  dxp = dx(iplot)
3341  dyp = dy(iplot)
3342  i1 = ikle2(elt(iplot),ifa)
3343  i2 = ikle2(elt(iplot),isui(ifa))
3344  dx1 = x(i2) - x(i1)
3345  dy1 = y(i2) - y(i1)
3346 !
3347  IF(iel.EQ.-1) THEN
3348 !
3349 !-----------------------------------------------------------------------
3350 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
3351 ! AND WE GO ON
3352 !-----------------------------------------------------------------------
3353 !
3354  a1 = (dxp*dx1+dyp*dy1) / (dx1**2+dy1**2)
3355  dx(iplot) = a1 * dx1
3356  dy(iplot) = a1 * dy1
3357 !
3358  a1=((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
3359  shp( ifa ,iplot) = 1.d0 - a1
3360  shp( isui(ifa) ,iplot) = a1
3361  shp(isui(isui(ifa)),iplot) = 0.d0
3362  xplot(iplot) = x(i1) + a1 * dx1
3363  yplot(iplot) = y(i1) + a1 * dy1
3364  IF(add) THEN
3365  recvchar(iplot)%XP=xplot(iplot)
3366  recvchar(iplot)%YP=yplot(iplot)
3367  recvchar(iplot)%ZP=zplot(iplot)
3368  recvchar(iplot)%DX=dx(iplot)
3369  recvchar(iplot)%DY=dy(iplot)
3370  recvchar(iplot)%DZ=dz(iplot)
3371  ENDIF
3372 !
3373  GOTO 50
3374 !
3375  ELSEIF(iel.EQ.0) THEN
3376 !
3377 !-----------------------------------------------------------------------
3378 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
3379 !-----------------------------------------------------------------------
3380 !
3381  denom = dxp*dy1-dyp*dx1
3382  IF(abs(denom).GT.1.d-12) THEN
3383  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
3384  ELSE
3385  a1 = 0.d0
3386  ENDIF
3387  IF(a1.GT.1.d0) a1 = 1.d0
3388  IF(a1.LT.0.d0) a1 = 0.d0
3389  shp( ifa ,iplot) = 1.d0 - a1
3390  shp( isui(ifa) ,iplot) = a1
3391  shp(isui(isui(ifa)),iplot) = 0.d0
3392  xplot(iplot) = x(i1) + a1 * dx1
3393  yplot(iplot) = y(i1) + a1 * dy1
3394  IF(abs(dxp).GT.abs(dyp)) THEN
3395  a1 = (xp-xplot(iplot))/dxp
3396  ELSE
3397  a1 = (yp-yplot(iplot))/dyp
3398  ENDIF
3399  zplot(iplot) = zp - a1*dz(iplot)
3400  shz(iplot) = (zplot(iplot)-zstar(iet))
3401  & / (zstar(iet+1)-zstar(iet))
3402 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
3403 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
3404  elt(iplot) = - sens * elt(iplot)
3405 ! EXITING LOOP ON ISP
3406  EXIT
3407 !
3408  ELSE
3409 !
3410  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR41_SIGMA'
3411  WRITE(lu,*) 'IEL=',iel
3412  CALL plante(1)
3413  stop
3414 !
3415  ENDIF
3416 !
3417  ELSE
3418 !
3419 !-----------------------------------------------------------------------
3420 ! CASE IFA = 4 OR 5
3421 ! HERE WE EXIT THROUGH TOP OR BOTTOM OF THE PRISM
3422 !-----------------------------------------------------------------------
3423 !
3424  ifa = ifa - 4
3425 ! HENCE IFA NOW EQUALS 0 OR 1
3426 !
3427  IF(iel.EQ.1) THEN
3428 !
3429 !-----------------------------------------------------------------------
3430 ! NO NEED TO RECOMPUTE THE VELOCITIES,
3431 ! RELOCALISING IN NEW ELEMENT
3432 !-----------------------------------------------------------------------
3433 !
3434  eta(iplot) = iet + ifa + ifa - 1
3435  shz(iplot) = (zp-zstar(eta(iplot)))
3436  & / (zstar(eta(iplot)+1)-zstar(eta(iplot)))
3437 !
3438  IF(add) THEN
3439  recvchar(iplot)%KNE=eta(iplot)
3440  ENDIF
3441 !
3442  iso = isoh
3443 !
3444  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
3445  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
3446 !
3447  GOTO 50
3448 !
3449  ENDIF
3450 !
3451  IF(iel.EQ.-1) THEN
3452 !
3453 !-----------------------------------------------------------------------
3454 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE SOLIDE
3455 ! ON PROJETTE LE RELIQUAT SUR LA FRONTIERE PUIS ON SE RELOCALISE
3456 !-----------------------------------------------------------------------
3457 !
3458  zplot(iplot) = zstar(iet+ifa)
3459  dz(iplot) = 0.d0
3460  shz(iplot) = ifa
3461 !
3462  iso = isoh
3463  IF(isoh.NE.0) GOTO 50
3464 !
3465  ELSE
3466 !
3467 !-----------------------------------------------------------------------
3468 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE LIQUIDE (CAS 0)
3469 ! ON ARRETE ALORS LA REMONTEE DES CARACTERISTIQUES (SIGNE DE ELT)
3470 ! OU, QUE L'ON VIENT DE TRAVERSER UN PLAN AVEC RECALCUL DES VITESSES
3471 ! DEMANDE (CAS 2)
3472 !-----------------------------------------------------------------------
3473 !
3474  IF(abs(dz(iplot)).GT.epsdz) THEN
3475  a1 = (zp-zstar(iet+ifa)) / dz(iplot)
3476  ELSE
3477  a1 = 0.d0
3478  ENDIF
3479  xp = xp - a1*dx(iplot)
3480  yp = yp - a1*dy(iplot)
3481  zp = zstar(iet+ifa)
3482  iele = elt(iplot)
3483  i1 = ikle2(iele,1)
3484  i2 = ikle2(iele,2)
3485  i3 = ikle2(iele,3)
3486 !
3487  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3488  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iele)
3489  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3490  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iele)
3491  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3492  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iele)
3493 !
3494  IF(iel.EQ.2) THEN
3495 !
3496 !-----------------------------------------------------------------------
3497 ! LA, ON SAIT QUE LA FACE DE SORTIE SE SITUE SUR LE PLAN OU ON DEMANDE
3498 ! UN RECALCUL DES VITESSES
3499 !-----------------------------------------------------------------------
3500 !
3501 ! IF IFA = 1 EXIT THROUGH THE TOP
3502 ! IF IFA = 0 EXIT THROUGH THE BOTTOM
3503 ! THEN NEW IET IS IET+1 IF IFA = 1
3504 ! AND IET-1 IF IFA = 0
3505 ! THIS IS SUMMARISED BY IET=IET+2*IFA-1
3506 !
3507 ! RECOMPUTED VELOCITIES MUST BE TAKEN AT IET2=IET+IFA
3508 ! I.E. BOTTOM IF EXIT THROUGH THE BOTTOM
3509 ! AND TOP IF EXIT THROUGH THE TOP
3510 !
3511  iet2 = iet + ifa
3512  iet = iet + ifa + ifa - 1
3513 !
3514  pas2 = pas2 * a1
3515 !
3516  dx(iplot) = ( u(i1,iet2)*shp(1,iplot)
3517  & + u(i2,iet2)*shp(2,iplot)
3518  & + u(i3,iet2)*shp(3,iplot) ) * pas2
3519 !
3520  dy(iplot) = ( v(i1,iet2)*shp(1,iplot)
3521  & + v(i2,iet2)*shp(2,iplot)
3522  & + v(i3,iet2)*shp(3,iplot) ) * pas2
3523 !
3524  deltaz = (z(i1,iet+1)-z(i1,iet))*shp(1,iplot)
3525  & + (z(i2,iet+1)-z(i2,iet))*shp(2,iplot)
3526  & + (z(i3,iet+1)-z(i3,iet))*shp(3,iplot)
3527 !
3528  IF(deltaz.GT.epsdz) THEN
3529  dz(iplot) = ( w(i1,iet2)*shp(1,iplot)
3530  & + w(i2,iet2)*shp(2,iplot)
3531  & + w(i3,iet2)*shp(3,iplot) ) * pas2
3532  & * (zstar(iet+1)-zstar(iet)) / deltaz
3533  ELSE
3534  dz(iplot) = 0.d0
3535  ENDIF
3536 !
3537  xp = xp + dx(iplot)
3538  yp = yp + dy(iplot)
3539  zp = zp + dz(iplot)
3540 !
3541  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3542  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iele)
3543  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3544  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iele)
3545  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3546  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iele)
3547  shz(iplot)=(zp-zstar(iet))/(zstar(iet+1)-zstar(iet))
3548 !
3549  xplot(iplot) = xp
3550  yplot(iplot) = yp
3551  zplot(iplot) = zp
3552  eta(iplot) = iet
3553 !
3554  iso = 0
3555 !
3556  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
3557  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
3558  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
3559 !
3560  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
3561  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
3562 !
3563  IF(add) THEN
3564  recvchar(iplot)%XP=xplot(iplot)
3565  recvchar(iplot)%YP=yplot(iplot)
3566  recvchar(iplot)%ZP=zplot(iplot)
3567  recvchar(iplot)%DX=dx(iplot)
3568  recvchar(iplot)%DY=dy(iplot)
3569  recvchar(iplot)%DZ=dz(iplot)
3570  ENDIF
3571 !
3572  GOTO 50
3573 !
3574  ENDIF
3575 !
3576  xplot(iplot) = xp
3577  yplot(iplot) = yp
3578  zplot(iplot) = zp
3579  shz(iplot) = ifa
3580 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
3581 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
3582  elt(iplot) = - sens * elt(iplot)
3583 ! EXITING LOOP ON ISP
3584  EXIT
3585 !
3586  ENDIF
3587 !
3588  ENDIF
3589 !
3590 ! IF(ISO.NE.0)
3591  ENDIF
3592 !
3593  ENDDO
3594  ENDDO
3595 !
3596 !-----------------------------------------------------------------------
3597 !
3598  RETURN
3599  END SUBROUTINE schar41_sigma
3600 ! **********************
3601  SUBROUTINE schar41_per
3602 ! **********************
3603 !
3604  &( u , v , w , dt , nrk , x , y , zstar , ikle2 , ibor ,
3605  & xplot , yplot , zplot , dx , dy , dz , shp , shz , elt , eta ,
3606  & nplot , npoin2 , nelem2 , nelmax2,nplan , surdet ,
3607  & sens , ifapar, nchdim,nchara,add)
3608 !
3609 !***********************************************************************
3610 ! BIEF VERSION 7.3
3611 !
3612 !brief LIKE SCHAR41 BUT WITH PERIODICITY ON THE VERTICAL
3613 ! DIFFERENCES MAEKED WITH "PERIODICITY"
3614 !
3615 !
3616 !history J-M HERVOUET (LNHE)
3617 !+ 31/07/2012
3618 !+ V6P3
3619 !+ First version (differences taken in Tomawac)
3620 !
3621 !***********************************************************************
3622 !
3623 ! FONCTION :
3624 !
3625 ! REMONTEE OU DESCENTE
3626 ! DES COURBES CARACTERISTIQUES
3627 ! SUR DES PRISMES DE TELEMAC-3D
3628 ! DANS L'INTERVALLE DE TEMPS DT
3629 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
3630 !
3631 !
3632 ! DISCRETISATION :
3633 !
3634 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
3635 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
3636 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
3637 ! AUX NOEUDS DE CET ELEMENT
3638 !
3639 !
3640 ! RESTRICTIONS ET HYPOTHESES :
3641 !
3642 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
3643 !
3644 !-----------------------------------------------------------------------
3645 ! ARGUMENTS
3646 ! .________________.____.______________________________________________.
3647 ! | NOM |MODE| ROLE |
3648 ! |________________|____|______________________________________________|
3649 ! | U,V,W | -->| COMPONENTS OF ADVECTION VELOCITY
3650 ! | | | BUT W IS W* x DELTAZ (STEMS FROM TRIDW2)
3651 ! | DT | -->| PAS DE TEMPS. |
3652 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
3653 ! | X,Y,ZSTAR | -->| COORDONNEES DES POINTS DU MAILLAGE.
3654 ! | IKLE2 | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
3655 ! | | | ET GLOBALE DU MAILLAGE 2D. |
3656 ! | IBOR | -->| NUMEROS 2D DES ELEMENTS AYANT UNE FACE COMMUNE
3657 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
3658 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
3659 ! | X..,Y..,ZPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
3660 ! | DX,DY,DZ | -- | STOCKAGE DES SOUS-PAS . |
3661 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
3662 ! | | | COURBES CARACTERISTIQUES. |
3663 ! | SHZ |<-->| COORDONNEES BARYCENTRIQUES SUIVANT Z DES |
3664 ! | | | NOEUDS DANS LEURS ETAGES "ETA" ASSOCIES. |
3665 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D CHOISIS POUR CHAQUE |
3666 ! | | | NOEUD. |
3667 ! | ETA |<-->| NUMEROS DES ETAGES CHOISIS POUR CHAQUE NOEUD.|
3668 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
3669 ! | NPOIN2 | -->| NOMBRE DE POINTS DU MAILLAGE 2D. |
3670 ! | NELEM2 | -->| NOMBRE D'ELEMENTS DU MAILLAGE 2D. |
3671 ! | NPLAN | -->| NOMBRE DE PLANS. |
3672 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
3673 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
3674 ! | ISO | -- | STOCKAGE BINAIRE DE LA FACE DE SORTIE. |
3675 ! |________________|____|______________________________________________|
3676 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
3677 !-----------------------------------------------------------------------
3678 ! - APPELE PAR : CARACT
3679 ! - PROGRAMMES APPELES : NEANT
3680 !
3681 !***********************************************************************
3682 !
3683  USE bief
3684 !
3685  IMPLICIT NONE
3686 !
3687 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3688 !
3689  INTEGER , INTENT(IN) :: SENS,NPLAN,NCHDIM,NELMAX2
3690  INTEGER , INTENT(IN) :: NPOIN2,NELEM2,NPLOT,NRK
3691  INTEGER , INTENT(IN) :: IKLE2(nelmax2,3)
3692  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
3693  DOUBLE PRECISION, INTENT(IN) :: U(npoin2,nplan),V(npoin2,nplan)
3694  DOUBLE PRECISION, INTENT(IN) :: W(npoin2,nplan),SURDET(nelem2)
3695  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
3696  DOUBLE PRECISION, INTENT(INOUT) :: ZPLOT(nplot)
3697  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot),SHZ(nplot)
3698  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2),DT
3699 ! PERIODICITY
3700  DOUBLE PRECISION, INTENT(IN) :: ZSTAR(nplan+1)
3701  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
3702  DOUBLE PRECISION, INTENT(INOUT) :: DZ(nplot)
3703  INTEGER , INTENT(IN) :: IBOR(nelmax2,5,nplan-1)
3704  INTEGER , INTENT(INOUT) :: ETA(nplot)
3705  INTEGER , INTENT(IN) :: IFAPAR(6,*)
3706  LOGICAL , INTENT(IN) :: ADD
3707 !
3708 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
3709 !
3710  INTEGER IELE,ISO,ISPDONE,NSP,NSPMAX,IETP1
3711  INTEGER IPLOT,ISP,I1,I2,I3,IEL,IET,IET2,ISOH,ISOV,IFA,ISUI(3)
3712 !
3713  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,DZP,XP,YP,ZP,DENOM,PAS2
3714 !
3715  INTRINSIC abs , int , max , sqrt
3716 !
3717  parameter( isui = (/ 2 , 3 , 1 /) )
3718  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
3719  DOUBLE PRECISION, PARAMETER :: EPSDZ = 1.d-4
3720 !
3721  nspmax=1
3722  eta1(nplan)=1
3723 !
3724 !-----------------------------------------------------------------------
3725 ! FOR EVERY POINT
3726 !-----------------------------------------------------------------------
3727 !
3728  DO iplot = 1 , nplot
3729 !
3730  IF(add) THEN
3731 !
3732  xplot(iplot) = recvchar(iplot)%XP
3733  yplot(iplot) = recvchar(iplot)%YP
3734  zplot(iplot) = recvchar(iplot)%ZP
3735  dx(iplot) = recvchar(iplot)%DX
3736  dy(iplot) = recvchar(iplot)%DY
3737  dz(iplot) = recvchar(iplot)%DZ
3738  elt(iplot) = recvchar(iplot)%INE
3739  eta(iplot) = recvchar(iplot)%KNE
3740  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
3741  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
3742  iel = elt(iplot)
3743  iet = eta(iplot)
3744  xp = xplot(iplot)
3745  yp = yplot(iplot)
3746  zp = zplot(iplot)
3747  i1 = ikle2(iel,1)
3748  i2 = ikle2(iel,2)
3749  i3 = ikle2(iel,3)
3750  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3751  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
3752  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3753  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
3754  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3755  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
3756  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
3757 ! ASSUME ALL ARE LOCALISED, IT WILL BE SET OTHERWISE IF LOST-AGAIN
3758  recvchar(iplot)%NEPID=-1
3759 !
3760  ELSE
3761 !
3762  iel = elt(iplot)
3763 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL
3764 ! INTERPOLATION GIVES 0.,
3765 ! AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
3766  IF(iel.EQ.0) THEN
3767  elt(iplot)=1
3768  eta(iplot)=1
3769  shp(1,iplot)=0.d0
3770  shp(2,iplot)=0.d0
3771  shp(3,iplot)=0.d0
3772  shz(iplot)=0.d0
3773  cycle
3774  ENDIF
3775  iet = eta(iplot)
3776  i1 = ikle2(iel,1)
3777  i2 = ikle2(iel,2)
3778  i3 = ikle2(iel,3)
3779 ! HERE IET+1 IS ALWAYS < NPLAN+1 (SEE GTSH41)
3780  dxp = u(i1,iet )*shp(1,iplot)*(1.d0-shz(iplot))
3781  & + u(i2,iet )*shp(2,iplot)*(1.d0-shz(iplot))
3782  & + u(i3,iet )*shp(3,iplot)*(1.d0-shz(iplot))
3783  & + u(i1,iet+1)*shp(1,iplot)*shz(iplot)
3784  & + u(i2,iet+1)*shp(2,iplot)*shz(iplot)
3785  & + u(i3,iet+1)*shp(3,iplot)*shz(iplot)
3786  dyp = v(i1,iet )*shp(1,iplot)*(1.d0-shz(iplot))
3787  & + v(i2,iet )*shp(2,iplot)*(1.d0-shz(iplot))
3788  & + v(i3,iet )*shp(3,iplot)*(1.d0-shz(iplot))
3789  & + v(i1,iet+1)*shp(1,iplot)*shz(iplot)
3790  & + v(i2,iet+1)*shp(2,iplot)*shz(iplot)
3791  & + v(i3,iet+1)*shp(3,iplot)*shz(iplot)
3792  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
3793 !! PERIODICITY
3794  dzp = w(i1,iet )*shp(1,iplot)*(1.d0-shz(iplot))
3795  & + w(i2,iet )*shp(2,iplot)*(1.d0-shz(iplot))
3796  & + w(i3,iet )*shp(3,iplot)*(1.d0-shz(iplot))
3797  & + w(i1,iet+1)*shp(1,iplot)*shz(iplot)
3798  & + w(i2,iet+1)*shp(2,iplot)*shz(iplot)
3799  & + w(i3,iet+1)*shp(3,iplot)*shz(iplot)
3800 !
3801  nsp=max(nsp,int(nrk*dt*abs(dzp/(zstar(iet+1)-zstar(iet)))))
3802  nspmax = max(nspmax,nsp)
3803 !! END PERIODICITY
3804 !
3805  ispdone=1
3806 !
3807  ENDIF
3808 !
3809  pas = sens * dt / nsp
3810 !
3811 ! LOOP ON RUNGE-KUTTA SUB-STEPS
3812 !
3813 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
3814 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
3815 ! IT IS RESTARTED HERE
3816 !
3817  DO isp = ispdone,nsp
3818 !
3819 !-----------------------------------------------------------------------
3820 ! LOCALISING THE ARRIVAL POINT
3821 !-----------------------------------------------------------------------
3822 !
3823  pas2 = pas
3824 !
3825 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
3826 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
3827 !
3828  IF(add) THEN
3829  IF(isp.EQ.ispdone) GO TO 50
3830  IF(recvchar(iplot)%NEPID.NE.-1) cycle
3831  ENDIF
3832 !
3833  iel = elt(iplot)
3834  iet = eta(iplot)
3835 !! PERIODICITY IETP1 REPLACES IET+1 (BUT NOT ALWAYS)
3836  ietp1=eta1(iet)
3837 !
3838  i1 = ikle2(iel,1)
3839  i2 = ikle2(iel,2)
3840  i3 = ikle2(iel,3)
3841 !
3842  dx(iplot) = ((u(i1,iet )*shp(1,iplot)
3843  & + u(i2,iet )*shp(2,iplot)
3844  & + u(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3845  & +(u(i1,ietp1)*shp(1,iplot)
3846  & + u(i2,ietp1)*shp(2,iplot)
3847  & + u(i3,ietp1)*shp(3,iplot))*shz(iplot) )*pas
3848 !
3849  dy(iplot) = ((v(i1,iet )*shp(1,iplot)
3850  & + v(i2,iet )*shp(2,iplot)
3851  & + v(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3852  & +(v(i1,ietp1)*shp(1,iplot)
3853  & + v(i2,ietp1)*shp(2,iplot)
3854  & + v(i3,ietp1)*shp(3,iplot))*shz(iplot) )*pas
3855 !! PERIODICITY, NO DELTA, Z NEVER USED
3856 ! DELTAZ = (Z(I1,IET+1)-Z(I1,IET))*SHP(1,IPLOT)
3857 ! & + (Z(I2,IET+1)-Z(I2,IET))*SHP(2,IPLOT)
3858 ! & + (Z(I3,IET+1)-Z(I3,IET))*SHP(3,IPLOT)
3859 !
3860 ! IF(DELTAZ.GT.EPSDZ) THEN
3861 ! DIVISION BY DELTAZ IS DUE TO THE FACT THAT W IS
3862 ! W* MULTIPLIED BY DELTAZ (IT STEMS FROM TRIDW2 IN TELEMAC3D)
3863  dz(iplot) = ((w(i1,iet )*shp(1,iplot)
3864  & + w(i2,iet )*shp(2,iplot)
3865  & + w(i3,iet )*shp(3,iplot))*(1.d0-shz(iplot))
3866  & +(w(i1,ietp1)*shp(1,iplot)
3867  & + w(i2,ietp1)*shp(2,iplot)
3868  & + w(i3,ietp1)*shp(3,iplot))*shz(iplot))
3869 !! PERIODICITY, PAS DE DELTAZ
3870 ! & * PAS * (ZSTAR(IET+1)-ZSTAR(IET)) / DELTAZ
3871  & * pas
3872 ! ELSE
3873 ! DZ(IPLOT) = 0.D0
3874 ! ENDIF
3875 !
3876  xp = xplot(iplot) + dx(iplot)
3877  yp = yplot(iplot) + dy(iplot)
3878  zp = zplot(iplot) + dz(iplot)
3879 !
3880  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3881  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
3882  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3883  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
3884  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
3885  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
3886  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
3887 !
3888  xplot(iplot) = xp
3889  yplot(iplot) = yp
3890  zplot(iplot) = zp
3891 !
3892  IF(add) THEN
3893 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
3894 ! AND THE NUMBER OF STEPS DONE ALREADY
3895  recvchar(iplot)%XP=xplot(iplot)
3896  recvchar(iplot)%YP=yplot(iplot)
3897  recvchar(iplot)%ZP=zplot(iplot)
3898  recvchar(iplot)%DX=dx(iplot)
3899  recvchar(iplot)%DY=dy(iplot)
3900  recvchar(iplot)%DZ=dz(iplot)
3901  recvchar(iplot)%INE=elt(iplot)
3902  recvchar(iplot)%ISP=isp
3903  ENDIF
3904 !
3905 !-----------------------------------------------------------------------
3906 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
3907 !-----------------------------------------------------------------------
3908 !
3909 50 CONTINUE
3910 !
3911  iso = 0
3912  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
3913  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
3914  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
3915  IF(shz(iplot) .LT.epsilo) iso=ibset(iso,0)
3916  IF(shz(iplot) .GT.1.d0-epsilo) iso=ibset(iso,1)
3917 !
3918  IF(iso.NE.0) THEN
3919 !
3920 !-----------------------------------------------------------------------
3921 ! HERE WE ARE OUT OF THE ELEMENT
3922 !-----------------------------------------------------------------------
3923 !
3924  isoh = iand(iso,28)
3925  isov = iand(iso, 3)
3926  iel = elt(iplot)
3927  iet = eta(iplot)
3928  xp = xplot(iplot)
3929  yp = yplot(iplot)
3930  zp = zplot(iplot)
3931 !
3932  IF(isoh.NE.0) THEN
3933 !
3934  IF(isoh.EQ.4) THEN
3935  ifa = 2
3936  ELSEIF(isoh.EQ.8) THEN
3937  ifa = 3
3938  ELSEIF(isoh.EQ.16) THEN
3939  ifa = 1
3940  ELSEIF(isoh.EQ.12) THEN
3941  ifa = 2
3942  IF(dx(iplot)*(y(ikle2(iel,3))-yp).LT.
3943  & dy(iplot)*(x(ikle2(iel,3))-xp)) ifa = 3
3944  ELSEIF(isoh.EQ.24) THEN
3945  ifa = 3
3946  IF(dx(iplot)*(y(ikle2(iel,1))-yp).LT.
3947  & dy(iplot)*(x(ikle2(iel,1))-xp)) ifa = 1
3948  ELSE
3949  ifa = 1
3950  IF(dx(iplot)*(y(ikle2(iel,2))-yp).LT.
3951  & dy(iplot)*(x(ikle2(iel,2))-xp)) ifa = 2
3952  ENDIF
3953 !
3954  IF(isov.GT.0) THEN
3955  IF(abs(dz(iplot)).GT.epsdz) THEN
3956  a1 = (zp-zstar(iet+isov-1)) / dz(iplot)
3957  ELSE
3958  a1 = 0.d0
3959  ENDIF
3960  i1 = ikle2(iel,ifa)
3961  i2 = ikle2(iel,isui(ifa))
3962  IF ((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
3963  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) ifa=isov+3
3964  ENDIF
3965 !
3966  ELSE
3967 !
3968  ifa = isov + 3
3969 !
3970  ENDIF
3971 !
3972 ! PERIODICITY (ALL VALUES ARE THE SAME SO FAR ON THE VERTICAL
3973 ! BUT WITH PERIODICITY WE MAY HAVE IET=NPLAN AND
3974 ! IT IS NOT POSSIBLE IN IFABOR).
3975 ! IEL = IBOR(IEL,IFA,IET)
3976  iel = ibor(iel,ifa,1)
3977 ! END PERIODICITY
3978 !
3979  IF(ifa.LE.3) THEN
3980 !
3981 !-----------------------------------------------------------------------
3982 ! HERE WE ARRIVE IN ANOTHER ELEMENT THROUGH A QUADRANGULAR FACE
3983 !-----------------------------------------------------------------------
3984 !
3985  IF(iel.GT.0) THEN
3986 !
3987 !-----------------------------------------------------------------------
3988 ! RELOCALISING IN ADJACENT ELEMENT
3989 !-----------------------------------------------------------------------
3990 !
3991  i1 = ikle2(iel,1)
3992  i2 = ikle2(iel,2)
3993  i3 = ikle2(iel,3)
3994  elt(iplot) = iel
3995  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
3996  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
3997  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
3998  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
3999  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4000  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
4001 !
4002  GOTO 50
4003 !
4004  ENDIF
4005 !
4006 !-----------------------------------------------------------------------
4007 ! HERE WE PASS TO A NEIGHBOUR SUBDOMAIN AND COLLECT DATA
4008 !-----------------------------------------------------------------------
4009 !
4010  IF(iel.EQ.-2) THEN
4011  IF(.NOT.add) THEN
4012 ! INTERFACE CROSSING
4013  CALL collect_char
4014  & (ipid,iplot,elt(iplot),ifa,eta(iplot),0,isp,
4015  & nsp,xplot(iplot),yplot(iplot),
4016  & zplot(iplot),0.d0,
4017  & dx(iplot),dy(iplot),dz(iplot),0.d0,
4018  & ifapar,nchdim,nchara)
4019  ELSE
4020 ! A LOST-AGAIN TRACEBACK DETECTED
4021 ! PROCESSOR NUMBER
4022  recvchar(iplot)%NEPID=ifapar(ifa,elt(iplot))
4023  recvchar(iplot)%INE=ifapar(ifa+3,elt(iplot))
4024  recvchar(iplot)%KNE=eta(iplot)
4025  ENDIF
4026 ! EXITING LOOP ON ISP
4027  EXIT
4028  ENDIF
4029 !
4030 !-----------------------------------------------------------------------
4031 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
4032 !-----------------------------------------------------------------------
4033 !
4034  dxp = dx(iplot)
4035  dyp = dy(iplot)
4036  i1 = ikle2(elt(iplot),ifa)
4037  i2 = ikle2(elt(iplot),isui(ifa))
4038  dx1 = x(i2) - x(i1)
4039  dy1 = y(i2) - y(i1)
4040 !
4041  IF(iel.EQ.-1) THEN
4042 !
4043 !-----------------------------------------------------------------------
4044 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
4045 ! AND WE GO ON
4046 !-----------------------------------------------------------------------
4047 !
4048 ! TOMAWAC DIFFERENCES
4049 !
4050 ! STANDARD IMPLEMENTATION
4051 !
4052 !! A1 = (DXP*DX1+DYP*DY1) / (DX1**2+DY1**2)
4053 !! DX(IPLOT) = A1 * DX1
4054 !! DY(IPLOT) = A1 * DY1
4055 !
4056 !! A1=((XP-X(I1))*DX1+(YP-Y(I1))*DY1)/(DX1**2+DY1**2)
4057 !! SHP( IFA ,IPLOT) = 1.D0 - A1
4058 !! SHP( ISUI(IFA) ,IPLOT) = A1
4059 !! SHP(ISUI(ISUI(IFA)),IPLOT) = 0.D0
4060 !! XPLOT(IPLOT) = X(I1) + A1 * DX1
4061 !! YPLOT(IPLOT) = Y(I1) + A1 * DY1
4062 !! IF(ADD) THEN
4063 !! RECVCHAR(IPLOT)%XP=XPLOT(IPLOT)
4064 !! RECVCHAR(IPLOT)%YP=YPLOT(IPLOT)
4065 !! RECVCHAR(IPLOT)%ZP=ZPLOT(IPLOT)
4066 !! RECVCHAR(IPLOT)%DX=DX(IPLOT)
4067 !! RECVCHAR(IPLOT)%DY=DY(IPLOT)
4068 !! RECVCHAR(IPLOT)%DZ=DZ(IPLOT)
4069 !! ENDIF
4070 !
4071 !! GOTO 50
4072 !
4073 ! TOMAWAC IMPLEMENTATION
4074 !
4075  shp(1,iplot) = 0.d0
4076  shp(2,iplot) = 0.d0
4077  shp(3,iplot) = 0.d0
4078  elt(iplot) = - sens * elt(iplot)
4079  EXIT ! LOOP ON ISP
4080 !
4081  ELSEIF(iel.EQ.0) THEN
4082 !
4083 !-----------------------------------------------------------------------
4084 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
4085 !-----------------------------------------------------------------------
4086 !
4087  denom = dxp*dy1-dyp*dx1
4088  IF(abs(denom).GT.1.d-12) THEN
4089  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
4090  ELSE
4091  a1 = 0.d0
4092  ENDIF
4093  IF(a1.GT.1.d0) a1 = 1.d0
4094  IF(a1.LT.0.d0) a1 = 0.d0
4095  shp( ifa ,iplot) = 1.d0 - a1
4096  shp( isui(ifa) ,iplot) = a1
4097  shp(isui(isui(ifa)),iplot) = 0.d0
4098  xplot(iplot) = x(i1) + a1 * dx1
4099  yplot(iplot) = y(i1) + a1 * dy1
4100  IF(abs(dxp).GT.abs(dyp)) THEN
4101  a1 = (xp-xplot(iplot))/dxp
4102  ELSE
4103  a1 = (yp-yplot(iplot))/dyp
4104  ENDIF
4105  zplot(iplot) = zp - a1*dz(iplot)
4106  shz(iplot) = (zplot(iplot)-zstar(iet))
4107  & / (zstar(iet+1)-zstar(iet))
4108 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
4109 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
4110  elt(iplot) = - sens * elt(iplot)
4111 ! EXITING LOOP ON ISP
4112  EXIT
4113 !
4114  ELSE
4115 !
4116  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR41'
4117  WRITE(lu,*) 'IEL=',iel
4118  CALL plante(1)
4119  stop
4120 !
4121  ENDIF
4122 !
4123  ELSE
4124 !
4125 !-----------------------------------------------------------------------
4126 ! CASE IFA = 4 OR 5
4127 ! HERE WE EXIT THROUGH TOP OR BOTTOM OF THE PRISM
4128 !-----------------------------------------------------------------------
4129 !
4130  ifa = ifa - 4
4131 ! HENCE IFA NOW EQUALS 0 OR 1
4132 !
4133  IF(iel.EQ.1) THEN
4134 !
4135 !-----------------------------------------------------------------------
4136 ! NO NEED TO RECOMPUTE THE VELOCITIES,
4137 ! RELOCALISING IN NEW ELEMENT
4138 !-----------------------------------------------------------------------
4139 !
4140  eta(iplot) = iet + ifa + ifa - 1
4141 !! PERIODICITY (THIS CAN NEVER HAPPEN WITHOUT PERIODICITY)
4142  IF(eta(iplot).EQ.nplan+1) THEN
4143  eta(iplot)=1
4144  zp=zp-zstar(nplan+1)
4145  zplot(iplot)=zp
4146  ENDIF
4147  IF(eta(iplot).EQ.0) THEN
4148  eta(iplot) = nplan
4149  zp=zp+zstar(nplan+1)
4150  zplot(iplot)=zp
4151  ENDIF
4152 !! END OF PERIODICITY
4153  shz(iplot) = (zp-zstar(eta(iplot)))
4154  & / (zstar(eta(iplot)+1)-zstar(eta(iplot)))
4155 !
4156  IF(add) THEN
4157  recvchar(iplot)%KNE=eta(iplot)
4158  recvchar(iplot)%ZP=zp
4159  ENDIF
4160 !
4161  iso = isoh
4162 !
4163  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
4164  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
4165 !
4166  GOTO 50
4167 !
4168  ENDIF
4169 !
4170  IF(iel.EQ.-1) THEN
4171 !
4172 !-----------------------------------------------------------------------
4173 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE SOLIDE
4174 ! ON PROJETTE LE RELIQUAT SUR LA FRONTIERE PUIS ON SE RELOCALISE
4175 !-----------------------------------------------------------------------
4176 !
4177  zplot(iplot) = zstar(iet+ifa)
4178  dz(iplot) = 0.d0
4179  shz(iplot) = ifa
4180 !
4181  iso = isoh
4182  IF(isoh.NE.0) GOTO 50
4183 !
4184  ELSE
4185 !
4186 !-----------------------------------------------------------------------
4187 ! LA, ON SAIT QUE LA FACE DE SORTIE EST UNE FRONTIERE LIQUIDE (CAS 0)
4188 ! ON ARRETE ALORS LA REMONTEE DES CARACTERISTIQUES (SIGNE DE ELT)
4189 ! OU, QUE L'ON VIENT DE TRAVERSER UN PLAN AVEC RECALCUL DES VITESSES
4190 ! DEMANDE (CAS 2)
4191 !-----------------------------------------------------------------------
4192 !
4193  IF(abs(dz(iplot)).GT.epsdz) THEN
4194  a1 = (zp-zstar(iet+ifa)) / dz(iplot)
4195  ELSE
4196  a1 = 0.d0
4197  ENDIF
4198  xp = xp - a1*dx(iplot)
4199  yp = yp - a1*dy(iplot)
4200  zp = zstar(iet+ifa)
4201  iele = elt(iplot)
4202  i1 = ikle2(iele,1)
4203  i2 = ikle2(iele,2)
4204  i3 = ikle2(iele,3)
4205 !
4206  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
4207  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iele)
4208  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
4209  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iele)
4210  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4211  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iele)
4212 !
4213  IF(iel.EQ.2) THEN
4214 !
4215 !-----------------------------------------------------------------------
4216 ! LA, ON SAIT QUE LA FACE DE SORTIE SE SITUE SUR LE PLAN OU ON DEMANDE
4217 ! UN RECALCUL DES VITESSES
4218 !-----------------------------------------------------------------------
4219 !
4220 ! IF IFA = 1 EXIT THROUGH THE TOP
4221 ! IF IFA = 0 EXIT THROUGH THE BOTTOM
4222 ! THEN NEW IET IS IET+1 IF IFA = 1
4223 ! AND IET-1 IF IFA = 0
4224 ! THIS IS SUMMARISED BY IET=IET+2*IFA-1
4225 !
4226 ! RECOMPUTED VELOCITIES MUST BE TAKEN AT IET2=IET+IFA
4227 ! I.E. BOTTOM IF EXIT THROUGH THE BOTTOM
4228 ! AND TOP IF EXIT THROUGH THE TOP
4229 !
4230  iet2 = iet + ifa
4231  iet = iet + ifa + ifa - 1
4232 !
4233  pas2 = pas2 * a1
4234 !
4235  dx(iplot) = ( u(i1,iet2)*shp(1,iplot)
4236  & + u(i2,iet2)*shp(2,iplot)
4237  & + u(i3,iet2)*shp(3,iplot) ) * pas2
4238 !
4239  dy(iplot) = ( v(i1,iet2)*shp(1,iplot)
4240  & + v(i2,iet2)*shp(2,iplot)
4241  & + v(i3,iet2)*shp(3,iplot) ) * pas2
4242 !
4243 ! DELTAZ = (Z(I1,IET+1)-Z(I1,IET))*SHP(1,IPLOT)
4244 ! & + (Z(I2,IET+1)-Z(I2,IET))*SHP(2,IPLOT)
4245 ! & + (Z(I3,IET+1)-Z(I3,IET))*SHP(3,IPLOT)
4246 !
4247 ! IF(DELTAZ.GT.EPSDZ) THEN
4248  dz(iplot) = ( w(i1,iet2)*shp(1,iplot)
4249  & + w(i2,iet2)*shp(2,iplot)
4250  & + w(i3,iet2)*shp(3,iplot) ) * pas2
4251 ! & * (ZSTAR(IET+1)-ZSTAR(IET)) / DELTAZ
4252 ! ELSE
4253 ! DZ(IPLOT) = 0.D0
4254 ! ENDIF
4255 !
4256  xp = xp + dx(iplot)
4257  yp = yp + dy(iplot)
4258  zp = zp + dz(iplot)
4259 !
4260  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
4261  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iele)
4262  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
4263  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iele)
4264  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4265  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iele)
4266  shz(iplot)=(zp-zstar(iet))/(zstar(iet+1)-zstar(iet))
4267 !
4268  xplot(iplot) = xp
4269  yplot(iplot) = yp
4270  zplot(iplot) = zp
4271  eta(iplot) = iet
4272 !
4273  iso = 0
4274 !
4275  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,2)
4276  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,3)
4277  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,4)
4278 !
4279  IF(shz(iplot).LT. epsilo) iso=ibset(iso,0)
4280  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
4281 !
4282  IF(add) THEN
4283  recvchar(iplot)%XP=xplot(iplot)
4284  recvchar(iplot)%YP=yplot(iplot)
4285  recvchar(iplot)%ZP=zplot(iplot)
4286  recvchar(iplot)%DX=dx(iplot)
4287  recvchar(iplot)%DY=dy(iplot)
4288  recvchar(iplot)%DZ=dz(iplot)
4289  ENDIF
4290 !
4291  GOTO 50
4292 !
4293  ENDIF
4294 !
4295  xplot(iplot) = xp
4296  yplot(iplot) = yp
4297  zplot(iplot) = zp
4298  shz(iplot) = ifa
4299 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
4300 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
4301  elt(iplot) = - sens * elt(iplot)
4302 ! EXITING LOOP ON ISP
4303  EXIT
4304 !
4305  ENDIF
4306 !
4307  ENDIF
4308 !
4309 ! IF(ISO.NE.0)
4310  ENDIF
4311 !
4312  ENDDO
4313  ENDDO
4314 !
4315  IF(.NOT.add) THEN
4316  IF(ncsize.GT.1) nspmax=p_max(nspmax)
4317  WRITE(lu,*) 'NUMBER OF SUB-ITERATIONS :',nspmax
4318  ENDIF
4319 !
4320 ! RESTORING ORIGINAL ETA1
4321 !
4322  eta1(nplan)=nplan+1
4323 !
4324 !-----------------------------------------------------------------------
4325 !
4326  RETURN
4327  END SUBROUTINE schar41_per
4328 ! *************************
4329  SUBROUTINE schar41_per_4d
4330 ! *************************
4331 !
4332  &( u , v , w , f , dt , nrk , x , y , zstar , freq ,ikle2 ,ibor ,
4333  & xplot , yplot , zplot , fplot,dx , dy , dz , df,
4334  & shp , shz , shf , elt , eta ,
4335  & fre , nplot , npoin2 , nelem2 , nelmax2,nplan , nf,surdet ,
4336  & sens , ifapar, nchdim ,nchara,add)
4337 !
4338 !***********************************************************************
4339 ! BIEF VERSION 7.3
4340 !
4341 !brief LIKE SCHAR41 BUT WITH PERIODICITY ON THE VERTICAL
4342 ! DIFFERENCES MAEKED WITH "PERIODICITY"
4343 !
4344 !
4345 !history J-M HERVOUET (LNHE)
4346 !+ 12/07/2012
4347 !+ V6P3
4348 !+ First version (differences with schar41 taken in Tomawac)
4349 !
4350 !***********************************************************************
4351 !
4352 ! FONCTION :
4353 !
4354 ! REMONTEE OU DESCENTE
4355 ! DES COURBES CARACTERISTIQUES
4356 ! SUR DES PRISMES DE TELEMAC-3D
4357 ! DANS L'INTERVALLE DE TEMPS DT
4358 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
4359 !
4360 !
4361 ! DISCRETISATION :
4362 !
4363 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
4364 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
4365 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
4366 ! AUX NOEUDS DE CET ELEMENT
4367 !
4368 !
4369 ! RESTRICTIONS ET HYPOTHESES :
4370 !
4371 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
4372 !
4373 !-----------------------------------------------------------------------
4374 ! ARGUMENTS
4375 ! .________________.____.______________________________________________.
4376 ! | NOM |MODE| ROLE |
4377 ! |________________|____|______________________________________________|
4378 ! | U,V,W | -->| COMPONENTS OF ADVECTION VELOCITY
4379 ! | | | BUT W IS W* x DELTAZ (STEMS FROM TRIDW2)
4380 ! | DT | -->| PAS DE TEMPS. |
4381 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
4382 ! | X,Y,ZSTAR | -->| COORDONNEES DES POINTS DU MAILLAGE. | |
4383 ! | IKLE2 | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
4384 ! | | | ET GLOBALE DU MAILLAGE 2D. |
4385 ! | IBOR | -->| NUMEROS 2D DES ELEMENTS AYANT UNE FACE COMMUNE
4386 ! | | | AVEC L'ELEMENT . SI IBOR<0 OU NUL |
4387 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
4388 ! | X..,Y..,ZPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
4389 ! | DX,DY,DZ | -- | STOCKAGE DES SOUS-PAS . |
4390 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
4391 ! | | | COURBES CARACTERISTIQUES. |
4392 ! | SHZ |<-->| COORDONNEES BARYCENTRIQUES SUIVANT Z DES |
4393 ! | | | NOEUDS DANS LEURS ETAGES "ETA" ASSOCIES. |
4394 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D CHOISIS POUR CHAQUE |
4395 ! | | | NOEUD. |
4396 ! | ETA |<-->| NUMEROS DES ETAGES CHOISIS POUR CHAQUE NOEUD.|
4397 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
4398 ! | NPOIN2 | -->| NOMBRE DE POINTS DU MAILLAGE 2D. |
4399 ! | NELEM2 | -->| NOMBRE D'ELEMENTS DU MAILLAGE 2D. |
4400 ! | NPLAN | -->| NOMBRE DE PLANS. |
4401 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
4402 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
4403 ! | ISO | -- | STOCKAGE BINAIRE DE LA FACE DE SORTIE. |
4404 ! |________________|____|______________________________________________|
4405 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
4406 !-----------------------------------------------------------------------
4407 ! - APPELE PAR : CARACT
4408 ! - PROGRAMMES APPELES : NEANT
4409 !
4410 !***********************************************************************
4411 !
4412  USE bief
4413 !
4414  IMPLICIT NONE
4415 !
4416 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4417 !
4418  INTEGER , INTENT(IN) :: SENS,NPLAN,NCHDIM,NF,NELMAX2
4419  INTEGER , INTENT(IN) :: NPOIN2,NELEM2,NPLOT,NRK
4420  INTEGER , INTENT(IN) :: IKLE2(nelmax2,3)
4421  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
4422  DOUBLE PRECISION, INTENT(IN) :: U(npoin2,nplan,nf)
4423  DOUBLE PRECISION, INTENT(IN) :: V(npoin2,nplan,nf)
4424  DOUBLE PRECISION, INTENT(IN) :: W(npoin2,nplan,nf)
4425  DOUBLE PRECISION, INTENT(IN) :: F(npoin2,nplan,nf)
4426  DOUBLE PRECISION, INTENT(IN) :: SURDET(nelem2)
4427  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
4428  DOUBLE PRECISION, INTENT(INOUT) :: ZPLOT(nplot),FPLOT(nplot)
4429  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot),SHZ(nplot)
4430  DOUBLE PRECISION, INTENT(INOUT) :: SHF(nplot)
4431  DOUBLE PRECISION, INTENT(IN) :: X(npoin2),Y(npoin2),DT
4432 ! PERIODICITY
4433  DOUBLE PRECISION, INTENT(IN) :: ZSTAR(nplan+1)
4434  DOUBLE PRECISION, INTENT(IN) :: FREQ(nf)
4435  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
4436  DOUBLE PRECISION, INTENT(INOUT) :: DZ(nplot),DF(nplot)
4437  INTEGER , INTENT(IN) :: IBOR(nelmax2,5,nplan-1)
4438  INTEGER , INTENT(INOUT) :: ETA(nplot),FRE(nplot)
4439  INTEGER , INTENT(IN) :: IFAPAR(6,*)
4440  LOGICAL, INTENT(IN) :: ADD
4441 !
4442 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
4443 !
4444  INTEGER ISO,ISPDONE,NSP,NSPMAX
4445  INTEGER IPLOT,ISP,I1,I2,I3,IEL,IET,ISOH,ISOV,ISOF,ISOT
4446  INTEGER :: IETP1,IFA,ISUI(3),IFR
4447 !
4448  DOUBLE PRECISION PAS,A1,A2,DX1,DY1,DXP,DYP,DZP,XP,YP,ZP,FP
4449  DOUBLE PRECISION PAS2,DFP,DENOM
4450 !
4451  INTRINSIC abs , int , max , sqrt
4452 !
4453  parameter( isui = (/ 2 , 3 , 1 /) )
4454  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
4455 !
4456  nspmax=1
4457  eta1(nplan)=1
4458 !
4459 !-----------------------------------------------------------------------
4460 ! FOR EVERY POINT
4461 !-----------------------------------------------------------------------
4462 !
4463  DO iplot = 1 , nplot
4464 !
4465  IF(add) THEN
4466 !
4467  xplot(iplot) = recvchar(iplot)%XP
4468  yplot(iplot) = recvchar(iplot)%YP
4469  zplot(iplot) = recvchar(iplot)%ZP
4470  fplot(iplot) = recvchar(iplot)%FP
4471  dx(iplot) = recvchar(iplot)%DX
4472  dy(iplot) = recvchar(iplot)%DY
4473  dz(iplot) = recvchar(iplot)%DZ
4474  df(iplot) = recvchar(iplot)%DF
4475  elt(iplot) = recvchar(iplot)%INE
4476  eta(iplot) = recvchar(iplot)%KNE
4477  fre(iplot) = recvchar(iplot)%IFR
4478  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
4479  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
4480  iel = elt(iplot)
4481  iet = eta(iplot)
4482  ifr = fre(iplot)
4483  xp = xplot(iplot)
4484  yp = yplot(iplot)
4485  zp = zplot(iplot)
4486  fp = fplot(iplot)
4487  i1 = ikle2(iel,1)
4488  i2 = ikle2(iel,2)
4489  i3 = ikle2(iel,3)
4490  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
4491  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
4492  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
4493  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
4494  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4495  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
4496  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
4497  shf(iplot) = (fp-freq(ifr)) / (freq(ifr+1)-freq(ifr))
4498 ! ASSUME ALL ARE LOCALISED, IT WILL BE SET OTHERWISE IF LOST-AGAIN
4499  recvchar(iplot)%NEPID=-1
4500 !
4501  ELSE
4502 !
4503  iel = elt(iplot)
4504 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL
4505 ! INTERPOLATION GIVES 0.,
4506 ! AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
4507  IF(iel.EQ.0) THEN
4508  elt(iplot)=1
4509  eta(iplot)=1
4510  fre(iplot)=1
4511  shp(1,iplot)=0.d0
4512  shp(2,iplot)=0.d0
4513  shp(3,iplot)=0.d0
4514  shz(iplot)=0.d0
4515  shf(iplot)=0.d0
4516  cycle
4517  ENDIF
4518  iet = eta(iplot)
4519  ifr = fre(iplot)
4520  i1 = ikle2(iel,1)
4521  i2 = ikle2(iel,2)
4522  i3 = ikle2(iel,3)
4523 ! HERE IET+1 IS ALWAYS < NPLAN+1 (SEE GTSH41)
4524  dxp =(1.d0-shf(iplot))*
4525  & ((u(i1,iet ,ifr)*shp(1,iplot)
4526  & + u(i2,iet ,ifr)*shp(2,iplot)
4527  & + u(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4528  & +(u(i1,iet+1,ifr)*shp(1,iplot)
4529  & + u(i2,iet+1,ifr)*shp(2,iplot)
4530  & + u(i3,iet+1,ifr)*shp(3,iplot))*shz(iplot))
4531  & + shf(iplot)*
4532  & ((u(i1,iet ,ifr+1)*shp(1,iplot)
4533  & + u(i2,iet ,ifr+1)*shp(2,iplot)
4534  & + u(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4535  & +(u(i1,iet+1,ifr+1)*shp(1,iplot)
4536  & + u(i2,iet+1,ifr+1)*shp(2,iplot)
4537  & + u(i3,iet+1,ifr+1)*shp(3,iplot))*shz(iplot))
4538 !
4539  dyp =(1.d0-shf(iplot))*
4540  & ((v(i1,iet ,ifr)*shp(1,iplot)
4541  & + v(i2,iet ,ifr)*shp(2,iplot)
4542  & + v(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4543  & +(v(i1,iet+1,ifr)*shp(1,iplot)
4544  & + v(i2,iet+1,ifr)*shp(2,iplot)
4545  & + v(i3,iet+1,ifr)*shp(3,iplot))*shz(iplot))
4546  & + shf(iplot)*
4547  & ((v(i1,iet ,ifr+1)*shp(1,iplot)
4548  & + v(i2,iet ,ifr+1)*shp(2,iplot)
4549  & + v(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4550  & +(v(i1,iet+1,ifr+1)*shp(1,iplot)
4551  & + v(i2,iet+1,ifr+1)*shp(2,iplot)
4552  & + v(i3,iet+1,ifr+1)*shp(3,iplot))*shz(iplot))
4553 !
4554  dzp =(1.d0-shf(iplot))*
4555  & ((w(i1,iet ,ifr)*shp(1,iplot)
4556  & + w(i2,iet ,ifr)*shp(2,iplot)
4557  & + w(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4558  & +(w(i1,iet+1,ifr)*shp(1,iplot)
4559  & + w(i2,iet+1,ifr)*shp(2,iplot)
4560  & + w(i3,iet+1,ifr)*shp(3,iplot))*shz(iplot))
4561  & + shf(iplot)*
4562  & ((w(i1,iet ,ifr+1)*shp(1,iplot)
4563  & + w(i2,iet ,ifr+1)*shp(2,iplot)
4564  & + w(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4565  & +(w(i1,iet+1,ifr+1)*shp(1,iplot)
4566  & + w(i2,iet+1,ifr+1)*shp(2,iplot)
4567  & + w(i3,iet+1,ifr+1)*shp(3,iplot))*shz(iplot))
4568 !
4569  dfp =(1.d0-shf(iplot))*
4570  & ((f(i1,iet ,ifr)*shp(1,iplot)
4571  & + f(i2,iet ,ifr)*shp(2,iplot)
4572  & + f(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4573  & +(f(i1,iet+1,ifr)*shp(1,iplot)
4574  & + f(i2,iet+1,ifr)*shp(2,iplot)
4575  & + f(i3,iet+1,ifr)*shp(3,iplot))*shz(iplot))
4576  & + shf(iplot)*
4577  & ((f(i1,iet ,ifr+1)*shp(1,iplot)
4578  & + f(i2,iet ,ifr+1)*shp(2,iplot)
4579  & + f(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4580  & +(f(i1,iet+1,ifr+1)*shp(1,iplot)
4581  & + f(i2,iet+1,ifr+1)*shp(2,iplot)
4582  & + f(i3,iet+1,ifr+1)*shp(3,iplot))*shz(iplot))
4583 !
4584  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
4585  nsp=max(nsp,int(nrk*dt*abs(dzp/(zstar(iet+1)-zstar(iet)))))
4586  nsp=max(nsp,int(nrk*dt*abs(dfp/(freq(ifr)-freq(ifr+1)))))
4587  nspmax=max(nsp,nspmax)
4588 !! END PERIODICITY
4589 !
4590  ispdone=1
4591 !
4592  ENDIF
4593 !
4594  pas = sens * dt / nsp
4595 !
4596 ! LOOP ON RUNGE-KUTTA SUB-STEPS
4597 !
4598 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
4599 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
4600 ! IT IS RESTARTED HERE
4601 !
4602  DO isp = ispdone,nsp
4603 !
4604 !-----------------------------------------------------------------------
4605 ! LOCALISING THE ARRIVAL POINT
4606 !-----------------------------------------------------------------------
4607 !
4608  pas2 = pas
4609 !
4610 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
4611 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
4612 !
4613  IF(add) THEN
4614  IF(isp.EQ.ispdone) GO TO 50
4615  IF(recvchar(iplot)%NEPID.NE.-1) cycle
4616  ENDIF
4617 !
4618  iel = elt(iplot)
4619  iet = eta(iplot)
4620  ifr = fre(iplot)
4621 !! PERIODICITY IETP1 REPLACES IET+1 (BUT NOT ALWAYS)
4622  ietp1=eta1(iet)
4623  i1 = ikle2(iel,1)
4624  i2 = ikle2(iel,2)
4625  i3 = ikle2(iel,3)
4626 !
4627  dx(iplot) = ( (1.d0-shf(iplot))*
4628  & ((u(i1,iet ,ifr)*shp(1,iplot)
4629  & + u(i2,iet ,ifr)*shp(2,iplot)
4630  & + u(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4631  & +(u(i1,ietp1,ifr)*shp(1,iplot)
4632  & + u(i2,ietp1,ifr)*shp(2,iplot)
4633  & + u(i3,ietp1,ifr)*shp(3,iplot))*shz(iplot))
4634  & + shf(iplot)*
4635  & ((u(i1,iet ,ifr+1)*shp(1,iplot)
4636  & + u(i2,iet ,ifr+1)*shp(2,iplot)
4637  & + u(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4638  & +(u(i1,ietp1,ifr+1)*shp(1,iplot)
4639  & + u(i2,ietp1,ifr+1)*shp(2,iplot)
4640  & + u(i3,ietp1,ifr+1)*shp(3,iplot))*shz(iplot)))*pas
4641 !
4642  dy(iplot) = ( (1.d0-shf(iplot))*
4643  & ((v(i1,iet ,ifr)*shp(1,iplot)
4644  & + v(i2,iet ,ifr)*shp(2,iplot)
4645  & + v(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4646  & +(v(i1,ietp1,ifr)*shp(1,iplot)
4647  & + v(i2,ietp1,ifr)*shp(2,iplot)
4648  & + v(i3,ietp1,ifr)*shp(3,iplot))*shz(iplot))
4649  & + shf(iplot)*
4650  & ((v(i1,iet ,ifr+1)*shp(1,iplot)
4651  & + v(i2,iet ,ifr+1)*shp(2,iplot)
4652  & + v(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4653  & +(v(i1,ietp1,ifr+1)*shp(1,iplot)
4654  & + v(i2,ietp1,ifr+1)*shp(2,iplot)
4655  & + v(i3,ietp1,ifr+1)*shp(3,iplot))*shz(iplot)))*pas
4656 !
4657  dz(iplot) = ( (1.d0-shf(iplot))*
4658  & ((w(i1,iet ,ifr)*shp(1,iplot)
4659  & + w(i2,iet ,ifr)*shp(2,iplot)
4660  & + w(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4661  & +(w(i1,ietp1,ifr)*shp(1,iplot)
4662  & + w(i2,ietp1,ifr)*shp(2,iplot)
4663  & + w(i3,ietp1,ifr)*shp(3,iplot))*shz(iplot))
4664  & + shf(iplot)*
4665  & ((w(i1,iet ,ifr+1)*shp(1,iplot)
4666  & + w(i2,iet ,ifr+1)*shp(2,iplot)
4667  & + w(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4668  & +(w(i1,ietp1,ifr+1)*shp(1,iplot)
4669  & + w(i2,ietp1,ifr+1)*shp(2,iplot)
4670  & + w(i3,ietp1,ifr+1)*shp(3,iplot))*shz(iplot)))*pas
4671 !
4672  df(iplot) = ( (1.d0-shf(iplot))*
4673  & ((f(i1,iet ,ifr)*shp(1,iplot)
4674  & + f(i2,iet ,ifr)*shp(2,iplot)
4675  & + f(i3,iet ,ifr)*shp(3,iplot))*(1.d0-shz(iplot))
4676  & +(f(i1,ietp1,ifr)*shp(1,iplot)
4677  & + f(i2,ietp1,ifr)*shp(2,iplot)
4678  & + f(i3,ietp1,ifr)*shp(3,iplot))*shz(iplot))
4679  & + shf(iplot)*
4680  & ((f(i1,iet ,ifr+1)*shp(1,iplot)
4681  & + f(i2,iet ,ifr+1)*shp(2,iplot)
4682  & + f(i3,iet ,ifr+1)*shp(3,iplot))*(1.d0-shz(iplot))
4683  & +(f(i1,ietp1,ifr+1)*shp(1,iplot)
4684  & + f(i2,ietp1,ifr+1)*shp(2,iplot)
4685  & + f(i3,ietp1,ifr+1)*shp(3,iplot))*shz(iplot)) )*pas
4686 !
4687  xp = xplot(iplot) + dx(iplot)
4688  yp = yplot(iplot) + dy(iplot)
4689  zp = zplot(iplot) + dz(iplot)
4690  fp = fplot(iplot) + df(iplot)
4691 !
4692  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
4693  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
4694  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
4695  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
4696  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4697  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
4698  shz(iplot) = (zp-zstar(iet)) / (zstar(iet+1)-zstar(iet))
4699  shf(iplot) = (fp-freq(ifr)) / (freq(ifr+1)-freq(ifr))
4700 !
4701  xplot(iplot) = xp
4702  yplot(iplot) = yp
4703  zplot(iplot) = zp
4704  fplot(iplot) = fp
4705 !
4706  IF(add) THEN
4707 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
4708 ! AND THE NUMBER OF STEPS DONE ALREADY
4709  recvchar(iplot)%XP=xplot(iplot)
4710  recvchar(iplot)%YP=yplot(iplot)
4711  recvchar(iplot)%ZP=zplot(iplot)
4712  recvchar(iplot)%FP=fplot(iplot)
4713  recvchar(iplot)%DX=dx(iplot)
4714  recvchar(iplot)%DY=dy(iplot)
4715  recvchar(iplot)%DZ=dz(iplot)
4716  recvchar(iplot)%DF=df(iplot)
4717  recvchar(iplot)%INE=elt(iplot)
4718  recvchar(iplot)%ISP=isp
4719  ENDIF
4720 !
4721 !-----------------------------------------------------------------------
4722 ! TEST: IF THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
4723 !-----------------------------------------------------------------------
4724 !
4725 50 CONTINUE
4726 !
4727  iso = 0
4728  IF(shp(1,iplot).LT.epsilo) iso=ibset(iso,4)
4729  IF(shp(2,iplot).LT.epsilo) iso=ibset(iso,5)
4730  IF(shp(3,iplot).LT.epsilo) iso=ibset(iso,6)
4731  IF(shz(iplot).LT.epsilo) iso=ibset(iso,0)
4732  IF(shz(iplot).GT.1.d0-epsilo) iso=ibset(iso,1)
4733  IF(shf(iplot).LT.epsilo) iso=ibset(iso,2)
4734  IF(shf(iplot).GT.1.d0-epsilo) iso=ibset(iso,3)
4735 !
4736  IF(iso.NE.0) THEN
4737 !
4738 !-----------------------------------------------------------------------
4739 ! HERE: WE LEFT THE ELEMENT
4740 !-----------------------------------------------------------------------
4741 !
4742  isot = iand(iso, 3)
4743  isof = iand(iso,12)/4
4744  isov = iand(iso,15)
4745  isoh = iand(iso,112)
4746  iel = elt(iplot)
4747  iet = eta(iplot)
4748  ifr = fre(iplot)
4749  xp = xplot(iplot)
4750  yp = yplot(iplot)
4751  zp = zplot(iplot)
4752  fp = fplot(iplot)
4753 !
4754  IF(isoh.NE.0) THEN
4755 !
4756  IF(isoh.EQ.16) THEN
4757  ifa = 2
4758  ELSEIF(isoh.EQ.32) THEN
4759  ifa = 3
4760  ELSEIF(isoh.EQ.64) THEN
4761  ifa = 1
4762  ELSEIF(isoh.EQ.48) THEN
4763  ifa = 2
4764  IF(dx(iplot)*(y(ikle2(iel,3))-yp).LT.
4765  & dy(iplot)*(x(ikle2(iel,3))-xp)) ifa = 3
4766  ELSEIF(isoh.EQ.96) THEN
4767  ifa = 3
4768  IF(dx(iplot)*(y(ikle2(iel,1))-yp).LT.
4769  & dy(iplot)*(x(ikle2(iel,1))-xp)) ifa = 1
4770  ELSE
4771 ! CASE ISOH=80
4772  ifa = 1
4773  IF(dx(iplot)*(y(ikle2(iel,2))-yp).LT.
4774  & dy(iplot)*(x(ikle2(iel,2))-xp)) ifa = 2
4775  ENDIF
4776 !
4777  IF(isov.GT.0) THEN
4778  i1 = ikle2(iel,ifa)
4779  i2 = ikle2(iel,isui(ifa))
4780  IF(isof.GT.0) THEN
4781  IF(isot.GT.0) THEN
4782  a1=(fp- freq(ifr+isof-1))/df(iplot)
4783  a2=(zp-zstar(iet+isot-1))/dz(iplot)
4784  IF(a1.LT.a2) THEN
4785  IF((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
4786  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) THEN
4787  ifa=isof+5
4788  ENDIF
4789  ELSE
4790  IF((x(i2)-x(i1))*(yp-a2*dy(iplot)-y(i1)).GT.
4791  & (y(i2)-y(i1))*(xp-a2*dx(iplot)-x(i1))) THEN
4792  ifa=isot+3
4793  ENDIF
4794  ENDIF
4795  ELSE
4796  a1 = (fp-freq(ifr+isof-1)) / df(iplot)
4797  IF((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
4798  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) THEN
4799  ifa=isof+5
4800  ENDIF
4801  ENDIF
4802  ELSE
4803  a1 = (zp-zstar(iet+isot-1)) / dz(iplot)
4804  IF((x(i2)-x(i1))*(yp-a1*dy(iplot)-y(i1)).GT.
4805  & (y(i2)-y(i1))*(xp-a1*dx(iplot)-x(i1))) THEN
4806  ifa=isot+3
4807  ENDIF
4808  ENDIF
4809  ENDIF
4810 !
4811  ELSEIF(isot.GT.0) THEN
4812  ifa = isot + 3
4813  IF(isof.GT.0) THEN
4814  a1=(fp-freq(ifr+isof-1))/df(iplot)
4815  a2=(zp-zstar(iet+isot-1))/dz(iplot)
4816  IF(a1.LT.a2) ifa = isof + 5
4817  ENDIF
4818  ELSE
4819  ifa = isof + 5
4820  ENDIF
4821 !
4822  IF(ifa.LE.3) THEN
4823 !
4824 ! IEL = IBOR(IEL,IFA,IET)
4825  iel = ibor(iel,ifa,1)
4826 !
4827 !-----------------------------------------------------------------------
4828 ! HERE: THE EXIT FACE OF THE PRISM IS A RECTANGULAR FACE
4829 ! =================================================================
4830 !-----------------------------------------------------------------------
4831 !
4832  IF(iel.GT.0) THEN
4833 !
4834 !-----------------------------------------------------------------------
4835 ! HERE: THE EXIT FACE IS AN INTERIOR FACE
4836 ! MOVES TO THE ADJACENT ELEMENT
4837 !-----------------------------------------------------------------------
4838 !
4839  i1 = ikle2(iel,1)
4840  i2 = ikle2(iel,2)
4841  i3 = ikle2(iel,3)
4842 !
4843  elt(iplot) = iel
4844  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
4845  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
4846  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
4847  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
4848  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
4849  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
4850 !
4851  GOTO 50
4852 !
4853  ENDIF
4854 !
4855 !-----------------------------------------------------------------------
4856 ! HERE WE PASS TO A NEIGHBOUR SUBDOMAIN AND COLLECT DATA
4857 !-----------------------------------------------------------------------
4858 !
4859  IF(iel.EQ.-2) THEN
4860  IF(.NOT.add) THEN
4861 ! INTERFACE CROSSING
4862  CALL collect_char
4863  & (ipid,iplot,elt(iplot),ifa,eta(iplot),fre(iplot),isp,
4864  & nsp,xplot(iplot),yplot(iplot),
4865  & zplot(iplot),fplot(iplot),
4866  & dx(iplot),dy(iplot),dz(iplot),df(iplot),
4867  & ifapar,nchdim,nchara)
4868  ELSE
4869 ! A LOST-AGAIN TRACEBACK DETECTED
4870 ! PROCESSOR NUMBER
4871  recvchar(iplot)%NEPID=ifapar(ifa,elt(iplot))
4872  recvchar(iplot)%INE=ifapar(ifa+3,elt(iplot))
4873  recvchar(iplot)%KNE=eta(iplot)
4874  recvchar(iplot)%IFR=fre(iplot)
4875  ENDIF
4876 ! EXITING LOOP ON ISP
4877  EXIT
4878  ENDIF
4879 !
4880 !-----------------------------------------------------------------------
4881 ! EXIT THROUGH TOP OR BOTTOM, OR LIQUID OR SOLID BOUNDARIES
4882 !-----------------------------------------------------------------------
4883 !
4884  dxp = dx(iplot)
4885  dyp = dy(iplot)
4886  i1 = ikle2(elt(iplot),ifa)
4887  i2 = ikle2(elt(iplot),isui(ifa))
4888  dx1 = x(i2) - x(i1)
4889  dy1 = y(i2) - y(i1)
4890 !
4891  IF(iel.EQ.-1) THEN
4892 !
4893 !-----------------------------------------------------------------------
4894 ! HERE: THE EXIT FACE IS A SOLID BOUNDARY
4895 ! SETS SHP TO 0, END OF TRACING BACK (PROVISIONAL !!!!!!)
4896 !-----------------------------------------------------------------------
4897 !
4898  shp(1,iplot) = 0.d0
4899  shp(2,iplot) = 0.d0
4900  shp(3,iplot) = 0.d0
4901  elt(iplot) = - sens * elt(iplot)
4902  EXIT ! LOOP ON ISP
4903 !
4904  ENDIF
4905 !
4906 !-----------------------------------------------------------------------
4907 ! HERE: THE EXIT FACE IS A LIQUID BOUNDARY
4908 ! ENDS TRACING BACK (SIGN OF ELT)
4909 !-----------------------------------------------------------------------
4910 !
4911  denom = dxp*dy1-dyp*dx1
4912  IF(abs(denom).GT.1.d-12) THEN
4913  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
4914  ELSE
4915  a1 = 0.d0
4916  ENDIF
4917  IF(a1.GT.1.d0) a1 = 1.d0
4918  IF(a1.LT.0.d0) a1 = 0.d0
4919  shp(ifa ,iplot) = 1.d0 - a1
4920  shp(isui(ifa) ,iplot) = a1
4921  shp(isui(isui(ifa)),iplot) = 0.d0
4922  xplot(iplot) = x(i1) + a1 * dx1
4923  yplot(iplot) = y(i1) + a1 * dy1
4924  IF(abs(dxp).GT.abs(dyp)) THEN
4925  a1 = (xp-xplot(iplot))/dxp
4926  ELSE
4927  a1 = (yp-yplot(iplot))/dyp
4928  ENDIF
4929  zplot(iplot) = zp - a1*dz(iplot)
4930  shz(iplot) = (zplot(iplot)-zstar(iet))
4931  & / (zstar(iet+1)-zstar(iet))
4932  fplot(iplot) = fp - a1*df(iplot)
4933  shf(iplot) = (fplot(iplot)-freq(ifr))
4934  & / (freq(ifr+1)-freq(ifr))
4935  elt(iplot) = - sens * elt(iplot)
4936 ! END OF TRACING BACK
4937  EXIT ! LOOP ON ISP
4938 !
4939  ELSEIF(ifa.LE.5) THEN
4940 !
4941 ! IEL = IBOR(IEL,IFA,IET)
4942  iel = ibor(iel,ifa,1)
4943 !
4944 !-----------------------------------------------------------------------
4945 ! HERE: THE EXIT FACE OF THE PRISM IS A TRIANGULAR FACE IN Z
4946 ! =====================================================================
4947 !-----------------------------------------------------------------------
4948 !
4949  ifa = ifa - 4
4950 !
4951  IF(iel.EQ.1) THEN
4952 !
4953 !-----------------------------------------------------------------------
4954 ! HERE: THE EXIT FACE IS AN INTERIOR FACE
4955 ! MOVES TO THE ADJACENT ELEMENT
4956 !-----------------------------------------------------------------------
4957 !
4958  eta(iplot) = iet + ifa + ifa - 1
4959  IF(eta(iplot).EQ.nplan+1) THEN
4960  eta(iplot)=1
4961  zp=zp-zstar(nplan+1)
4962  zplot(iplot)=zp
4963  ENDIF
4964  IF(eta(iplot).EQ.0) THEN
4965  eta(iplot) = nplan
4966  zp=zp+zstar(nplan+1)
4967  zplot(iplot)=zp
4968  ENDIF
4969  shz(iplot) = (zp-zstar(eta(iplot)))
4970  & / (zstar(eta(iplot)+1)-zstar(eta(iplot)))
4971 !
4972  IF(add) THEN
4973  recvchar(iplot)%KNE=eta(iplot)
4974  recvchar(iplot)%ZP=zp
4975  ENDIF
4976 !
4977  GO TO 50
4978 !
4979  ELSE
4980  WRITE(lu,*) 'PROBLEM IN SCHAR41_PER_4D',iel,iplot
4981  CALL plante(1)
4982  stop
4983  ENDIF
4984 !
4985  ELSE
4986 !
4987 !-----------------------------------------------------------------------
4988 ! HERE: THE EXIT FACE OF THE PRISM IS A TRIANGULAR FACE FREQ
4989 ! =====================================================================
4990 !-----------------------------------------------------------------------
4991 !
4992 ! IBOR IS NOT REALLY BUILT FOR IFA = 6 OR 7 BUT IS ALWAYS 1.
4993 ! IEL = IBOR(IEL,IFA,1)
4994  iel=1
4995  ifa = ifa - 6
4996 !
4997  IF(ifa.EQ.1.AND.ifr.EQ.nf-1) iel=-1
4998  IF(ifa.EQ.0.AND.ifr.EQ.1) iel=-1
4999  IF(iel.EQ.1) THEN
5000 !
5001 !-----------------------------------------------------------------------
5002 ! HERE: THE EXIT FACE IS AN INTERIOR FACE
5003 ! MOVES TO THE ADJACENT ELEMENT
5004 !-----------------------------------------------------------------------
5005 !
5006  fre(iplot) = ifr + ifa + ifa - 1
5007  shf(iplot) = (fp-freq(fre(iplot)))
5008  & / (freq(fre(iplot)+1)-freq(fre(iplot)))
5009 !
5010  IF(add) THEN
5011  recvchar(iplot)%IFR=fre(iplot)
5012  ENDIF
5013 !
5014  GOTO 50
5015 !
5016  ELSE
5017 !
5018 !-----------------------------------------------------------------------
5019 ! HERE: THE EXIT FACE IS THE MIN OR MAX FREQUENCY
5020 ! PROJECTS THE REMAINING PART ON THE BOUNDARY AND CONTINUES
5021 !-----------------------------------------------------------------------
5022 !
5023  fplot(iplot)=freq(ifr+ifa)
5024  df(iplot)=0.d0
5025  shf(iplot)=ifa
5026  iso = isoh +isot
5027  IF(iso.NE.0) THEN
5028  GO TO 50
5029  ENDIF
5030 !
5031  ENDIF
5032 !
5033  ENDIF
5034 !
5035 ! IF(ISO.NE.0) THEN
5036  ENDIF
5037 !
5038  ENDDO
5039  ENDDO
5040 !
5041  IF(.NOT.add) THEN
5042  IF(ncsize.GT.1) nspmax=p_max(nspmax)
5043  WRITE(lu,*) 'NUMBER OF SUB-ITERATIONS :',nspmax
5044  ENDIF
5045 !
5046 ! RESTORING ORIGINAL ETA1
5047 !
5048  eta1(nplan)=nplan+1
5049 !
5050 !-----------------------------------------------------------------------
5051 !
5052  RETURN
5053  END SUBROUTINE schar41_per_4d
5054 !
5055 !-----------------------------------------------------------------------
5056 ! CHAR11 MODIFIED FOR INITIAL COLLECTING OF THE LOST CHARACTERISTICS
5057 ! I.E. THE ONES CROSSING INTERFACE PARTITIONS IN THE PARALLEL CASE
5058 ! IFAPAR :: DELIVERS LOCAL ELEMENT NUMBER AND THE PARTITION NR THERE
5059 ! WHEN CROSSING THE INTERFACE VIA A HALO ELEMENT FACE
5060 !-----------------------------------------------------------------------
5061 ! JAJ MODIFIED WED JUL 16 18:24:08 CEST 2008
5062 !
5063 ! ******************
5064  SUBROUTINE schar11
5065 ! ******************
5066 !
5067  &(u,v,dt,nrk,x,y,ikle,ifabor,xplot,yplot,dx,dy,shp,elt,
5068  & nplot,nelem,nelmax,surdet,sens,
5069  & ifapar,nchdim,nchara,add)
5070 !
5071 !***********************************************************************
5072 ! BIEF VERSION 6.2 24/04/97 J-M JANIN (LNH) 30 87 72 84
5073 !
5074 !***********************************************************************
5075 !
5076 ! FONCTION :
5077 !
5078 ! REMONTEE OU DESCENTE
5079 ! DES COURBES CARACTERISTIQUES
5080 ! SUR DES QUADRILATERES P1
5081 ! DANS L'INTERVALLE DE TEMPS DT
5082 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
5083 !
5084 !
5085 ! DISCRETISATION :
5086 !
5087 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
5088 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
5089 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
5090 ! AUX NOEUDS DE CET ELEMENT
5091 !
5092 !
5093 ! RESTRICTIONS ET HYPOTHESES :
5094 !
5095 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
5096 ! LE DERIVANT EST SUPPOSE PONCTUEL DONC NON DISPERSIF
5097 !
5098 !-----------------------------------------------------------------------
5099 ! ARGUMENTS
5100 ! .________________.____.______________________________________________.
5101 ! | NOM |MODE| ROLE |
5102 ! |________________|____|______________________________________________|
5103 ! | U,V | -->| COMPOSANTE DE LA VITESSE DU CONVECTEUR |
5104 ! | DT | -->| PAS DE TEMPS.
5105 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA.
5106 ! | X,Y | -->| COORDONNEES DES POINTS DU MAILLAGE.
5107 ! | IKLE | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE
5108 ! | | | ET GLOBALE.
5109 ! | IFABOR | -->| NUMEROS DES ELEMENTS AYANT UNE FACE COMMUNE
5110 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL
5111 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE
5112 ! | XPLOT,YPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS.
5113 ! | DX,DY | -- | STOCKAGE DES SOUS-PAS . |
5114 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES
5115 ! | | | COURBES CARACTERISTIQUES.
5116 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D AU PIED DES COURBES
5117 ! | | | CARACTERISTIQUES.
5118 ! | NPLOT | -->| NOMBRE DE DERIVANTS.
5119 ! | NELEM | -->| NOMBRE D'ELEMENTS.
5120 ! | NELMAX | -->| NOMBRE MAXIMAL D'ELEMENTS DANS LE MAILLAGE 2D
5121 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
5122 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES.
5123 ! |________________|____|______________________________________________|
5124 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
5125 !-----------------------------------------------------------------------
5126 ! - APPELE PAR : CARACT , DERIVE , DERLAG
5127 ! - PROGRAMMES APPELES : NEANT
5128 !
5129 !***********************************************************************
5130 !
5131  USE bief
5132 !
5133  IMPLICIT NONE
5134 !
5135 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5136 !
5137  INTEGER , INTENT(IN) :: SENS,NCHDIM
5138  INTEGER , INTENT(IN) :: NELEM,NELMAX,NPLOT,NRK
5139  INTEGER , INTENT(IN) :: IKLE(nelmax,3),IFABOR(nelmax,3)
5140  INTEGER , INTENT(INOUT) :: ELT(*),NCHARA
5141  DOUBLE PRECISION, INTENT(IN) :: U(*),V(*),SURDET(nelem)
5142  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(*),YPLOT(*)
5143  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,*)
5144  DOUBLE PRECISION, INTENT(IN) :: DT
5145  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*)
5146  DOUBLE PRECISION, INTENT(INOUT) :: DX(*),DY(*)
5147  INTEGER, INTENT(IN) :: IFAPAR(6,*)
5148  LOGICAL, INTENT(IN) :: ADD
5149 !
5150 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5151 !
5152  INTEGER :: IPLOT,ISP,I1,I2,I3,IEL,ISO,IFA,ISUI(3),ISUI2(3),ISPDONE
5153  INTEGER IPROC,ILOC,NSP
5154  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,DENOM
5155 !
5156  INTRINSIC int,max,min,sqrt
5157 !
5158  parameter( isui = (/ 2 , 3 , 1 /) )
5159  parameter( isui2 = (/ 3 , 1 , 2 /) )
5160  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
5161 !
5162 !-----------------------------------------------------------------------
5163 ! FOR EVERY POINT
5164 !-----------------------------------------------------------------------
5165 !
5166  DO iplot=1,nplot
5167 !
5168  IF(add) THEN
5169 !
5170  xplot(iplot) = recvchar(iplot)%XP
5171  yplot(iplot) = recvchar(iplot)%YP
5172  dx(iplot) = recvchar(iplot)%DX
5173  dy(iplot) = recvchar(iplot)%DY
5174  elt(iplot) = recvchar(iplot)%INE
5175  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
5176  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
5177  iel = elt(iplot)
5178  xp = xplot(iplot)
5179  yp = yplot(iplot)
5180  i1 = ikle(iel,1)
5181  i2 = ikle(iel,2)
5182  i3 = ikle(iel,3)
5183  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5184  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
5185  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5186  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
5187  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5188  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
5189 ! ASSUME TO BE LOCALISED IT WILL BE SET OTHERWISE IF LOST-AGAIN
5190  recvchar(iplot)%NEPID=-1
5191 !
5192  ELSE
5193  iel = elt(iplot)
5194 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL INTERPOLATION
5195 ! GIVES 0., AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
5196 ! THIS WILL NOT INTERFERE WITH ELT(IPLOT)=0 GIVEN ON LIQUID BOUNDARIES
5197 ! BY ARRAY IFABOR, THAT MAY HAPPEN LATER
5198  IF(iel.EQ.0) THEN
5199  elt(iplot)=1
5200  shp(1,iplot)=0.d0
5201  shp(2,iplot)=0.d0
5202  shp(3,iplot)=0.d0
5203  cycle
5204  ENDIF
5205  i1 = ikle(iel,1)
5206  i2 = ikle(iel,2)
5207  i3 = ikle(iel,3)
5208  dxp = u(i1)*shp(1,iplot)+u(i2)*shp(2,iplot)
5209  & +u(i3)*shp(3,iplot)
5210  dyp = v(i1)*shp(1,iplot)+v(i2)*shp(2,iplot)
5211  & +v(i3)*shp(3,iplot)
5212  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
5213  ispdone=1
5214  ENDIF
5215 !
5216  pas = sens * dt / nsp
5217 !
5218 ! LOOP ON RUNGE-KUTTA SUB-STEPS
5219 !
5220 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
5221 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
5222 ! IT IS RESTARTED HERE
5223 !
5224  DO isp=ispdone,nsp
5225 !
5226 !-----------------------------------------------------------------------
5227 ! LOCALISING THE ARRIVAL POINT
5228 !-----------------------------------------------------------------------
5229 !
5230 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
5231 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
5232 !
5233  IF(add) THEN
5234  IF(isp.EQ.ispdone) GO TO 50
5235  IF(recvchar(iplot)%NEPID.NE.-1) cycle
5236  ENDIF
5237 !
5238  iel = elt(iplot)
5239  i1 = ikle(iel,1)
5240  i2 = ikle(iel,2)
5241  i3 = ikle(iel,3)
5242 !
5243  dx(iplot) = ( u(i1)*shp(1,iplot)
5244  & + u(i2)*shp(2,iplot)
5245  & + u(i3)*shp(3,iplot) ) * pas
5246  dy(iplot) = ( v(i1)*shp(1,iplot)
5247  & + v(i2)*shp(2,iplot)
5248  & + v(i3)*shp(3,iplot) ) * pas
5249  xp = xplot(iplot) + dx(iplot)
5250  yp = yplot(iplot) + dy(iplot)
5251 !
5252  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5253  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
5254  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5255  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
5256  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5257  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
5258 !
5259  xplot(iplot) = xp
5260  yplot(iplot) = yp
5261 !
5262  IF(add) THEN
5263 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
5264 ! AND THE NUMBER OF STEPS DONE ALREADY
5265  recvchar(iplot)%XP=xplot(iplot)
5266  recvchar(iplot)%YP=yplot(iplot)
5267  recvchar(iplot)%DX=dx(iplot)
5268  recvchar(iplot)%DY=dy(iplot)
5269  recvchar(iplot)%INE=elt(iplot)
5270  recvchar(iplot)%ISP=isp
5271  ENDIF
5272 !
5273 !-----------------------------------------------------------------------
5274 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
5275 !-----------------------------------------------------------------------
5276 !
5277 50 CONTINUE
5278 !
5279  iso = 0
5280  IF(shp(1,iplot).LT.epsilo) iso = 1
5281  IF(shp(2,iplot).LT.epsilo) iso = iso + 2
5282  IF(shp(3,iplot).LT.epsilo) iso = iso + 4
5283 !
5284  IF(iso.NE.0) THEN
5285 !
5286 !-----------------------------------------------------------------------
5287 ! HERE WE ARE OUT OF THE ELEMENT
5288 !-----------------------------------------------------------------------
5289 !
5290  iel = elt(iplot)
5291  xp = xplot(iplot)
5292  yp = yplot(iplot)
5293 !
5294 ! THE 3 LINES FORMING THE TRIANGLE CUT THE PLANE INTO 7
5295 ! ZONES, NUMBERED FROM 0 (INSIDE THE TRIANGLE) TO 6
5296 ! ISO IS THE NUMBER. FOR ISO =1,2,4, THERE IS NO AMBIGUITY
5297 ! AS TO THE EDGE CROSSED. FOR ISO = 3, IT CAN BE EDGE 2
5298 ! OR 3, FOR ISO = 5 IT CAN BE EDGE 1 OR 2, FOR ISO = 6 IT
5299 ! CAN BE EDGE 1 OR 3.
5300 ! FOR CASES 3, 5 AND 6, AN INNER PRODUCT SHOWS IF THE DIRECTION
5301 ! OF THE DISPLACEMENT (DX,DY) IS ON THE RIGHT OR ON THE LEFT
5302 ! OF THE INTERSECTION BETWEEN THE TWO EDGES, SO IT GIVES
5303 ! THE REAL EDGE THAT HAS BEEN CROSSED
5304 !
5305  IF(iso.EQ.1) THEN
5306  ifa = 2
5307  ELSEIF (iso.EQ.2) THEN
5308  ifa = 3
5309  ELSEIF (iso.EQ.4) THEN
5310  ifa = 1
5311  ELSEIF (iso.EQ.3) THEN
5312  ifa = 2
5313  IF(dx(iplot)*(y(ikle(iel,3))-yp).LT.
5314  & dy(iplot)*(x(ikle(iel,3))-xp)) ifa = 3
5315  ELSEIF (iso.EQ.6) THEN
5316  ifa = 3
5317  IF (dx(iplot)*(y(ikle(iel,1))-yp).LT.
5318  & dy(iplot)*(x(ikle(iel,1))-xp)) ifa = 1
5319  ELSE
5320 ! HERE CASE ISO=5
5321  ifa = 1
5322  IF(dx(iplot)*(y(ikle(iel,2))-yp).LT.
5323  & dy(iplot)*(x(ikle(iel,2))-xp)) ifa = 2
5324  ENDIF
5325 !
5326  iel = ifabor(iel,ifa)
5327 !
5328  IF(iel.GT.0) THEN
5329 !
5330 !-----------------------------------------------------------------------
5331 ! HERE WE ARRIVE IN ANOTHER ELEMENT
5332 !-----------------------------------------------------------------------
5333 !
5334  i1 = ikle(iel,1)
5335  i2 = ikle(iel,2)
5336  i3 = ikle(iel,3)
5337 !
5338  elt(iplot) = iel
5339  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5340  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
5341  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5342  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
5343  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5344  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
5345 !
5346  GOTO 50
5347 !
5348  ENDIF
5349 !
5350 !-----------------------------------------------------------------------
5351 ! HERE WE PASS TO NEIGHBOUR SUBDOMAIN AND COLLECT DATA
5352 !-----------------------------------------------------------------------
5353 !
5354  IF(iel.EQ.-2) THEN
5355  IF(add) THEN
5356 ! A LOST-AGAIN TRACEBACK DETECTED, ALREADY HERE
5357 ! SET THE IMPLANTING PARAMETERS
5358  iproc=ifapar(ifa ,elt(iplot))
5359  iloc =ifapar(ifa+3,elt(iplot))
5360 ! ANOTHER ONE AS IPID, MEANS ALSO NOT LOCALISED
5361  recvchar(iplot)%NEPID=iproc
5362  recvchar(iplot)%INE=iloc
5363  ELSE
5364  CALL collect_char(ipid,iplot,elt(iplot),ifa,0,0,isp,nsp,
5365  & xplot(iplot),yplot(iplot),0.d0,0.d0,
5366  & dx(iplot),dy(iplot),0.d0,0.d0,
5367  & ifapar,nchdim,nchara)
5368  ENDIF
5369 ! EXITING LOOP ON ISP
5370  EXIT
5371  ENDIF
5372 !
5373 !-----------------------------------------------------------------------
5374 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
5375 !-----------------------------------------------------------------------
5376 !
5377  dxp = dx(iplot)
5378  dyp = dy(iplot)
5379  i1 = ikle(elt(iplot),ifa)
5380  i2 = ikle(elt(iplot),isui(ifa))
5381  dx1 = x(i2) - x(i1)
5382  dy1 = y(i2) - y(i1)
5383 !
5384  IF(iel.EQ.-1) THEN
5385 !
5386 !-----------------------------------------------------------------------
5387 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
5388 ! AND WE GO ON
5389 !-----------------------------------------------------------------------
5390 !
5391 ! HERE A1 IS THE PARAMETRIC COORDINATE OF THE PROJECTED
5392 ! DISPLACEMENT ON SEGMENT I1----I2
5393 !
5394  a1 = (dxp*dx1 + dyp*dy1) / (dx1**2 + dy1**2)
5395 !
5396 ! THE TOTAL DISPLACEMENT IS PROJECTED HERE, NOT THE REMAINING
5397 ! PART, BUT ONLY THE DIRECTION WILL BE USED
5398  dx(iplot) = a1 * dx1
5399  dy(iplot) = a1 * dy1
5400 !
5401 ! NOW A1 IS THE PARAMETRIC COORDINATE ON SEGMENT I1----I2
5402 ! OF THE POSITION OF THE ARRIVAL POINT, I.E. INTERSECTION
5403 ! + REMAINING DISPLACEMENT PROJECTED ON THE SEGMENT
5404 ! ITS VALUE MAY BE OUTSIDE THE RANGE (0,1). THE VALUE OF A1
5405 ! SIMPLIFIES INTO THE FOLLOWING FORMULA, BECAUSE IT IS
5406 ! SIMPLY VECTOR I1----P PROJECTED ON SEGMENT I1----I2
5407 !
5408  a1 = ((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
5409  shp( ifa ,iplot) = 1.d0 - a1
5410  shp( isui(ifa),iplot) = a1
5411  shp(isui2(ifa),iplot) = 0.d0
5412  xplot(iplot) = x(i1) + a1 * dx1
5413  yplot(iplot) = y(i1) + a1 * dy1
5414  IF(add) THEN
5415  recvchar(iplot)%XP=xplot(iplot)
5416  recvchar(iplot)%YP=yplot(iplot)
5417  recvchar(iplot)%DX=dx(iplot)
5418  recvchar(iplot)%DY=dy(iplot)
5419  ENDIF
5420 !
5421  GOTO 50
5422 !
5423  ELSEIF(iel.EQ.0) THEN
5424 !
5425 !------------------------------------------------------------------------
5426 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
5427 !------------------------------------------------------------------------
5428 !
5429  denom = dxp*dy1-dyp*dx1
5430  IF(abs(denom).GT.1.d-12) THEN
5431  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
5432  ELSE
5433  a1 = 0.d0
5434  ENDIF
5435  a1 = max(min(a1,1.d0),0.d0)
5436  shp( ifa ,iplot) = 1.d0 - a1
5437  shp( isui(ifa),iplot) = a1
5438  shp(isui2(ifa),iplot) = 0.d0
5439  xplot(iplot) = x(i1) + a1 * dx1
5440  yplot(iplot) = y(i1) + a1 * dy1
5441 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
5442 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
5443  elt(iplot) = - sens * elt(iplot)
5444  EXIT
5445 !
5446  ELSE
5447 !
5448  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR11'
5449  WRITE(lu,*) 'IEL=',iel
5450  CALL plante(1)
5451  stop
5452 !
5453  ENDIF
5454 !
5455  ENDIF
5456 !
5457  ENDDO
5458  ENDDO
5459 !
5460 !-----------------------------------------------------------------------
5461 !
5462  RETURN
5463  END SUBROUTINE schar11
5464 ! **********************
5465  SUBROUTINE schar11_sto
5466 ! **********************
5467 !
5468  &(u,v,dt,nrk,x,y,ikle,ifabor,xplot,yplot,dx,dy,shp,elt,
5469  & nplot,npoin,nelem,nelmax,surdet,sens,
5470  & ifapar,nchdim,nchara,add,ielm,visc,stocha)
5471 !
5472 !***********************************************************************
5473 ! BIEF VERSION 6.2 24/04/97 J-M JANIN (LNH) 30 87 72 84
5474 !
5475 !***********************************************************************
5476 !
5477 ! FONCTION :
5478 !
5479 ! REMONTEE OU DESCENTE
5480 ! DES COURBES CARACTERISTIQUES
5481 ! SUR DES QUADRILATERES P1
5482 ! DANS L'INTERVALLE DE TEMPS DT
5483 ! AVEC UNE DISCRETISATION ELEMENTS FINIS
5484 !
5485 !
5486 ! DISCRETISATION :
5487 !
5488 ! LE DOMAINE EST APPROCHE PAR UNE DISCRETISATION ELEMENTS FINIS
5489 ! UNE APPROXIMATION LOCALE EST DEFINIE POUR LE VECTEUR VITESSE :
5490 ! LA VALEUR EN UN POINT D'UN ELEMENT NE DEPEND QUE DES VALEURS
5491 ! AUX NOEUDS DE CET ELEMENT
5492 !
5493 !
5494 ! RESTRICTIONS ET HYPOTHESES :
5495 !
5496 ! LE CHAMP CONVECTEUR U EST SUPPOSE INDEPENDANT DU TEMPS
5497 ! LE DERIVANT EST SUPPOSE PONCTUEL DONC NON DISPERSIF
5498 !
5499 !-----------------------------------------------------------------------
5500 ! ARGUMENTS
5501 ! .________________.____.______________________________________________.
5502 ! | NOM |MODE| ROLE |
5503 ! |________________|____|______________________________________________|
5504 ! | U,V | -->| COMPOSANTE DE LA VITESSE DU CONVECTEUR |
5505 ! | DT | -->| PAS DE TEMPS.
5506 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA.
5507 ! | X,Y | -->| COORDONNEES DES POINTS DU MAILLAGE.
5508 ! | IKLE | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE
5509 ! | | | ET GLOBALE.
5510 ! | IFABOR | -->| NUMEROS DES ELEMENTS AYANT UNE FACE COMMUNE
5511 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL
5512 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE
5513 ! | XPLOT,YPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS.
5514 ! | DX,DY | -- | STOCKAGE DES SOUS-PAS . |
5515 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES
5516 ! | | | COURBES CARACTERISTIQUES.
5517 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D AU PIED DES COURBES
5518 ! | | | CARACTERISTIQUES.
5519 ! | NPLOT | -->| NOMBRE DE DERIVANTS.
5520 ! | NPOIN | -->| NOMBRE DE POINTS DU MAILLAGE.
5521 ! | NELEM | -->| NOMBRE D'ELEMENTS.
5522 ! | NELMAX | -->| NOMBRE MAXIMAL D'ELEMENTS DANS LE MAILLAGE 2D
5523 ! | SENS | -->| -1: BACKWARD CHARACTERISTICS 1: FORWARD
5524 ! | STOCHA | -->| STOCHASTIC DIFFUSION MODEL
5525 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
5526 ! |________________|____|______________________________________________|
5527 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
5528 !-----------------------------------------------------------------------
5529 ! - APPELE PAR : CARACT , DERIVE , DERLAG
5530 ! - PROGRAMMES APPELES : NEANT
5531 !
5532 !***********************************************************************
5533 !
5534  USE bief
5535 !
5536  IMPLICIT NONE
5537 !
5538 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5539 !
5540  INTEGER , INTENT(IN) :: SENS,NCHDIM,IELM,STOCHA
5541  INTEGER , INTENT(IN) :: NPOIN,NELEM,NELMAX,NPLOT,NRK
5542  INTEGER , INTENT(IN) :: IKLE(nelmax,*),IFABOR(nelmax,3)
5543  INTEGER , INTENT(INOUT) :: ELT(*),NCHARA
5544  DOUBLE PRECISION, INTENT(IN) :: U(npoin),V(npoin),SURDET(nelem)
5545  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(*),YPLOT(*)
5546  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,*)
5547  DOUBLE PRECISION, INTENT(IN) :: DT
5548  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin),VISC(npoin)
5549  DOUBLE PRECISION, INTENT(INOUT) :: DX(*),DY(*)
5550  INTEGER, INTENT(IN) :: IFAPAR(6,*)
5551  LOGICAL, INTENT(IN) :: ADD
5552 !
5553 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
5554 !
5555  INTEGER IPLOT,ISP,I1,I2,I3,I4,I5,I6
5556  INTEGER :: IEL,ISO,IFA,ISUI(3),ISUI2(3),ISPDONE
5557  INTEGER IPROC,ILOC,NSP
5558  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,DENOM
5559  DOUBLE PRECISION SHP11,SHP12,SHP14
5560  DOUBLE PRECISION SHP22,SHP23,SHP24
5561  DOUBLE PRECISION SHP33,SHP31,SHP34
5562 ! FOR STOCHASTIC DIFFUSION
5563  DOUBLE PRECISION RAND1,RAND2,A,C,D,E,DIFF_X,DIFF_Y,DEUXPI
5564 !
5565  INTRINSIC int,max,min,sqrt,acos
5566 !
5567  parameter( isui = (/ 2 , 3 , 1 /) )
5568  parameter( isui2 = (/ 3 , 1 , 2 /) )
5569  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
5570 !
5571 !-----------------------------------------------------------------------
5572 ! FOR EVERY POINT
5573 !-----------------------------------------------------------------------
5574 !
5575  deuxpi=2.d0*acos(-1.d0)
5576 !
5577  DO iplot=1,nplot
5578 !
5579  IF(add) THEN
5580 !
5581  xplot(iplot) = recvchar(iplot)%XP
5582  yplot(iplot) = recvchar(iplot)%YP
5583  dx(iplot) = recvchar(iplot)%DX
5584  dy(iplot) = recvchar(iplot)%DY
5585  elt(iplot) = recvchar(iplot)%INE
5586  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
5587  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
5588  iel = elt(iplot)
5589  xp = xplot(iplot)
5590  yp = yplot(iplot)
5591  i1 = ikle(iel,1)
5592  i2 = ikle(iel,2)
5593  i3 = ikle(iel,3)
5594  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5595  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
5596  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5597  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
5598  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5599  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
5600 ! ASSUME TO BE LOCALISED IT WILL BE SET OTHERWISE IF LOST-AGAIN
5601  recvchar(iplot)%NEPID=-1
5602 !
5603  ELSE
5604  iel = elt(iplot)
5605 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL INTERPOLATION
5606 ! GIVES 0., AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
5607 ! THIS WILL NOT INTERFERE WITH ELT(IPLOT)=0 GIVEN ON LIQUID BOUNDARIES
5608 ! BY ARRAY IFABOR, THAT MAY HAPPEN LATER
5609  IF(iel.EQ.0) THEN
5610  elt(iplot)=1
5611  shp(1,iplot)=0.d0
5612  shp(2,iplot)=0.d0
5613  shp(3,iplot)=0.d0
5614  cycle
5615  ENDIF
5616  i1 = ikle(iel,1)
5617  i2 = ikle(iel,2)
5618  i3 = ikle(iel,3)
5619 ! HERE WITHOUT CONSIDERING STOCHASTIC DIFFUSION
5620 ! NOR QUASI-BUBBLE OR QUADRATIC DISCRETISATION
5621 ! THIS IS JUST FOR COMPUTING NSP
5622  dxp = u(i1)*shp(1,iplot)+u(i2)*shp(2,iplot)
5623  & +u(i3)*shp(3,iplot)
5624  dyp = v(i1)*shp(1,iplot)+v(i2)*shp(2,iplot)
5625  & +v(i3)*shp(3,iplot)
5626  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
5627  ispdone=1
5628  ENDIF
5629 !
5630  pas = sens * dt / nsp
5631 !
5632 ! LOOP ON RUNGE-KUTTA SUB-STEPS
5633 !
5634 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
5635 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
5636 ! IT IS RESTARTED HERE
5637 !
5638  DO isp=ispdone,nsp
5639 !
5640 !-----------------------------------------------------------------------
5641 ! LOCALISING THE ARRIVAL POINT
5642 !-----------------------------------------------------------------------
5643 !
5644 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
5645 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
5646 !
5647  IF(add) THEN
5648  IF(isp.EQ.ispdone) GO TO 50
5649  IF(recvchar(iplot)%NEPID.NE.-1) cycle
5650  ENDIF
5651 !
5652  iel = elt(iplot)
5653  i1 = ikle(iel,1)
5654  i2 = ikle(iel,2)
5655  i3 = ikle(iel,3)
5656 !
5657  IF(ielm.EQ.11) THEN
5658 !
5659  dx(iplot) = ( u(i1)*shp(1,iplot)
5660  & + u(i2)*shp(2,iplot)
5661  & + u(i3)*shp(3,iplot) ) * pas
5662  dy(iplot) = ( v(i1)*shp(1,iplot)
5663  & + v(i2)*shp(2,iplot)
5664  & + v(i3)*shp(3,iplot) ) * pas
5665 !
5666  ELSEIF(ielm.EQ.12) THEN
5667 !
5668  i4 = ikle(iel,4)
5669  shp11=shp(1,iplot)-shp(3,iplot)
5670  shp12=shp(2,iplot)-shp(3,iplot)
5671  shp14=3.d0*shp(3,iplot)
5672  shp22=shp(2,iplot)-shp(1,iplot)
5673  shp23=shp(3,iplot)-shp(1,iplot)
5674  shp24=3.d0*shp(1,iplot)
5675  shp33=shp(3,iplot)-shp(2,iplot)
5676  shp31=shp(1,iplot)-shp(2,iplot)
5677  shp34=3.d0*shp(2,iplot)
5678  IF( shp11.GT. 2.d0*epsilo .AND.
5679  & shp11.LT.1.d0-4.d0*epsilo .AND.
5680  & shp12.GT. 2.d0*epsilo .AND.
5681  & shp12.LT.1.d0-4.d0*epsilo .AND.
5682  & shp14.LT.1.d0-4.d0*epsilo ) THEN
5683  dx(iplot) = ( u(i1) * shp11
5684  & + u(i2) * shp12
5685  & + u(i4) * shp14 ) * pas
5686  dy(iplot) = ( v(i1) * shp11
5687  & + v(i2) * shp12
5688  & + v(i4) * shp14 ) * pas
5689  ELSEIF( shp22.GT. 2.d0*epsilo .AND.
5690  & shp22.LT.1.d0-4.d0*epsilo .AND.
5691  & shp23.GT. 2.d0*epsilo .AND.
5692  & shp23.LT.1.d0-4.d0*epsilo .AND.
5693  & shp24.LT.1.d0-4.d0*epsilo ) THEN
5694  dx(iplot) = ( u(i2) * shp22
5695  & + u(i3) * shp23
5696  & + u(i4) * shp24 ) * pas
5697  dy(iplot) = ( v(i2) * shp22
5698  & + v(i3) * shp23
5699  & + v(i4) * shp24 ) * pas
5700  ELSEIF( shp33.GT. 2.d0*epsilo .AND.
5701  & shp33.LT.1.d0-4.d0*epsilo .AND.
5702  & shp31.GT. 2.d0*epsilo .AND.
5703  & shp31.LT.1.d0-4.d0*epsilo .AND.
5704  & shp34.LT.1.d0-4.d0*epsilo ) THEN
5705  dx(iplot) = ( u(i3) * shp33
5706  & + u(i1) * shp31
5707  & + u(i4) * shp34 ) * pas
5708  dy(iplot) = ( v(i3) * shp33
5709  & + v(i1) * shp31
5710  & + v(i4) * shp34 ) * pas
5711  ELSE
5712  WRITE(lu,*) 'SCHAR11_STO: POINT ',iplot
5713  WRITE(lu,*) 'NOT IN ELEMENT ',elt(iplot)
5714  WRITE(lu,*) 'SHP(1,IPLOT)=',shp(1,iplot)
5715  WRITE(lu,*) 'SHP(2,IPLOT)=',shp(2,iplot)
5716  WRITE(lu,*) 'SHP(3,IPLOT)=',shp(3,iplot)
5717  WRITE(lu,*) 'EPSILO=',epsilo,' IPID=',ipid
5718  CALL plante(1)
5719  stop
5720  ENDIF
5721 !
5722  ELSEIF(ielm.EQ.13) THEN
5723 !
5724  i4 = ikle(iel,4)
5725  i5 = ikle(iel,5)
5726  i6 = ikle(iel,6)
5727  dx(iplot) = ( u(i1)*(2.d0*shp(1,iplot)-1.d0)*shp(1,iplot)
5728  & + u(i2)*(2.d0*shp(2,iplot)-1.d0)*shp(2,iplot)
5729  & + u(i3)*(2.d0*shp(3,iplot)-1.d0)*shp(3,iplot)
5730  & + u(i4)*4.d0*shp(1,iplot)*shp(2,iplot)
5731  & + u(i5)*4.d0*shp(2,iplot)*shp(3,iplot)
5732  & + u(i6)*4.d0*shp(3,iplot)*shp(1,iplot)) * pas
5733  dy(iplot) = ( v(i1)*(2.d0*shp(1,iplot)-1.d0)*shp(1,iplot)
5734  & + v(i2)*(2.d0*shp(2,iplot)-1.d0)*shp(2,iplot)
5735  & + v(i3)*(2.d0*shp(3,iplot)-1.d0)*shp(3,iplot)
5736  & + v(i4)*4.d0*shp(1,iplot)*shp(2,iplot)
5737  & + v(i5)*4.d0*shp(2,iplot)*shp(3,iplot)
5738  & + v(i6)*4.d0*shp(3,iplot)*shp(1,iplot)) * pas
5739 !
5740  ELSE
5741 !
5742  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR11_STO'
5743  WRITE(lu,*) 'IELM=',ielm
5744  CALL plante(1)
5745  stop
5746 !
5747  ENDIF
5748 !
5749 ! STOCHASTIC DIFFUSION
5750 !
5751  IF(stocha.EQ.1) THEN
5752 ! COMPUTING LOCAL VISCOSITY
5753  a=max(visc(i1)*shp(1,iplot)
5754  & +visc(i2)*shp(2,iplot)
5755  & +visc(i3)*shp(3,iplot),0.d0)
5756 ! DISPLACEMENT DUE TO RANDOM DIFFUSION
5757  CALL random_number(rand1)
5758  CALL random_number(rand2)
5759  c=sqrt(-2.d0*log(rand1))
5760  d=c*cos(deuxpi*rand2)
5761  e=c*sin(deuxpi*rand2)
5762  diff_x=d*sqrt(2.d0*a/0.72d0)
5763  diff_y=e*sqrt(2.d0*a/0.72d0)
5764  dx(iplot) = dx(iplot) + diff_x*sqrt(abs(pas))
5765  dy(iplot) = dy(iplot) + diff_y*sqrt(abs(pas))
5766  ENDIF
5767 !
5768  xp = xplot(iplot) + dx(iplot)
5769  yp = yplot(iplot) + dy(iplot)
5770 !
5771  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5772  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
5773  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5774  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
5775  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5776  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
5777 !
5778  xplot(iplot) = xp
5779  yplot(iplot) = yp
5780 !
5781  IF(add) THEN
5782 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
5783 ! AND THE NUMBER OF STEPS DONE ALREADY
5784  recvchar(iplot)%XP=xplot(iplot)
5785  recvchar(iplot)%YP=yplot(iplot)
5786  recvchar(iplot)%DX=dx(iplot)
5787  recvchar(iplot)%DY=dy(iplot)
5788  recvchar(iplot)%INE=elt(iplot)
5789  recvchar(iplot)%ISP=isp
5790  ENDIF
5791 !
5792 !-----------------------------------------------------------------------
5793 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
5794 !-----------------------------------------------------------------------
5795 !
5796 50 CONTINUE
5797 !
5798  iso = 0
5799  IF(shp(1,iplot).LT.epsilo) iso = 1
5800  IF(shp(2,iplot).LT.epsilo) iso = iso + 2
5801  IF(shp(3,iplot).LT.epsilo) iso = iso + 4
5802 !
5803  IF(iso.NE.0) THEN
5804 !
5805 !-----------------------------------------------------------------------
5806 ! HERE WE ARE OUT OF THE ELEMENT
5807 !-----------------------------------------------------------------------
5808 !
5809  iel = elt(iplot)
5810  xp = xplot(iplot)
5811  yp = yplot(iplot)
5812 !
5813 ! THE 3 LINES FORMING THE TRIANGLE CUT THE PLANE INTO 7
5814 ! ZONES, NUMBERED FROM 0 (INSIDE THE TRIANGLE) TO 6
5815 ! ISO IS THE NUMBER. FOR ISO =1,2,4, THERE IS NO AMBIGUITY
5816 ! AS TO THE EDGE CROSSED. FOR ISO = 3, IT CAN BE EDGE 2
5817 ! OR 3, FOR ISO = 5 IT CAN BE EDGE 1 OR 2, FOR ISO = 6 IT
5818 ! CAN BE EDGE 1 OR 3.
5819 ! FOR CASES 3, 5 AND 6, AN INNER PRODUCT SHOWS IF THE DIRECTION
5820 ! OF THE DISPLACEMENT (DX,DY) IS ON THE RIGHT OR ON THE LEFT
5821 ! OF THE INTERSECTION BETWEEN THE TWO EDGES, SO IT GIVES
5822 ! THE REAL EDGE THAT HAS BEEN CROSSED
5823 !
5824  IF(iso.EQ.1) THEN
5825  ifa = 2
5826  ELSEIF (iso.EQ.2) THEN
5827  ifa = 3
5828  ELSEIF (iso.EQ.4) THEN
5829  ifa = 1
5830  ELSEIF (iso.EQ.3) THEN
5831  ifa = 2
5832  IF(dx(iplot)*(y(ikle(iel,3))-yp).LT.
5833  & dy(iplot)*(x(ikle(iel,3))-xp)) ifa = 3
5834  ELSEIF (iso.EQ.6) THEN
5835  ifa = 3
5836  IF (dx(iplot)*(y(ikle(iel,1))-yp).LT.
5837  & dy(iplot)*(x(ikle(iel,1))-xp)) ifa = 1
5838  ELSE
5839 ! HERE CASE ISO=5
5840  ifa = 1
5841  IF(dx(iplot)*(y(ikle(iel,2))-yp).LT.
5842  & dy(iplot)*(x(ikle(iel,2))-xp)) ifa = 2
5843  ENDIF
5844 !
5845  iel = ifabor(iel,ifa)
5846 !
5847  IF(iel.GT.0) THEN
5848 !
5849 !-----------------------------------------------------------------------
5850 ! HERE WE ARRIVE IN ANOTHER ELEMENT
5851 !-----------------------------------------------------------------------
5852 !
5853  i1 = ikle(iel,1)
5854  i2 = ikle(iel,2)
5855  i3 = ikle(iel,3)
5856 !
5857  elt(iplot) = iel
5858  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
5859  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
5860  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
5861  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
5862  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
5863  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
5864 !
5865  GOTO 50
5866 !
5867  ENDIF
5868 !
5869 !-----------------------------------------------------------------------
5870 ! HERE WE PASS TO NEIGHBOUR SUBDOMAIN AND COLLECT DATA
5871 !-----------------------------------------------------------------------
5872 !
5873  IF(iel.EQ.-2) THEN
5874  IF(add) THEN
5875 ! A LOST-AGAIN TRACEBACK DETECTED, ALREADY HERE
5876 ! SET THE IMPLANTING PARAMETERS
5877  iproc=ifapar(ifa ,elt(iplot))
5878  iloc =ifapar(ifa+3,elt(iplot))
5879 ! ANOTHER ONE AS IPID, MEANS ALSO NOT LOCALISED
5880  recvchar(iplot)%NEPID=iproc
5881  recvchar(iplot)%INE=iloc
5882  ELSE
5883  CALL collect_char(ipid,iplot,elt(iplot),ifa,0,0,isp,nsp,
5884  & xplot(iplot),yplot(iplot),0.d0,0.d0,
5885  & dx(iplot),dy(iplot),0.d0,0.d0,
5886  & ifapar,nchdim,nchara)
5887  ENDIF
5888 ! EXITING LOOP ON ISP
5889  EXIT
5890  ENDIF
5891 !
5892 !-----------------------------------------------------------------------
5893 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
5894 !-----------------------------------------------------------------------
5895 !
5896  dxp = dx(iplot)
5897  dyp = dy(iplot)
5898  i1 = ikle(elt(iplot),ifa)
5899  i2 = ikle(elt(iplot),isui(ifa))
5900  dx1 = x(i2) - x(i1)
5901  dy1 = y(i2) - y(i1)
5902 !
5903  IF(iel.EQ.-1) THEN
5904 !
5905 !-----------------------------------------------------------------------
5906 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
5907 ! AND WE GO ON
5908 !-----------------------------------------------------------------------
5909 !
5910 ! HERE A1 IS THE PARAMETRIC COORDINATE OF THE PROJECTED
5911 ! DISPLACEMENT ON SEGMENT I1----I2
5912 !
5913  a1 = (dxp*dx1 + dyp*dy1) / (dx1**2 + dy1**2)
5914 !
5915 ! THE TOTAL DISPLACEMENT IS PROJECTED HERE, NOT THE REMAINING
5916 ! PART, BUT ONLY THE DIRECTION WILL BE USED
5917  dx(iplot) = a1 * dx1
5918  dy(iplot) = a1 * dy1
5919 !
5920 ! NOW A1 IS THE PARAMETRIC COORDINATE ON SEGMENT I1----I2
5921 ! OF THE POSITION OF THE ARRIVAL POINT, I.E. INTERSECTION
5922 ! + REMAINING DISPLACEMENT PROJECTED ON THE SEGMENT
5923 ! ITS VALUE MAY BE OUTSIDE THE RANGE (0,1). THE VALUE OF A1
5924 ! SIMPLIFIES INTO THE FOLLOWING FORMULA, BECAUSE IT IS
5925 ! SIMPLY VECTOR I1----P PROJECTED ON SEGMENT I1----I2
5926 !
5927  a1 = ((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
5928  shp( ifa ,iplot) = 1.d0 - a1
5929  shp( isui(ifa),iplot) = a1
5930  shp(isui2(ifa),iplot) = 0.d0
5931  xplot(iplot) = x(i1) + a1 * dx1
5932  yplot(iplot) = y(i1) + a1 * dy1
5933  IF(add) THEN
5934  recvchar(iplot)%XP=xplot(iplot)
5935  recvchar(iplot)%YP=yplot(iplot)
5936  recvchar(iplot)%DX=dx(iplot)
5937  recvchar(iplot)%DY=dy(iplot)
5938  ENDIF
5939 !
5940  GOTO 50
5941 !
5942  ELSEIF(iel.EQ.0) THEN
5943 !
5944 !------------------------------------------------------------------------
5945 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
5946 !------------------------------------------------------------------------
5947 !
5948  denom = dxp*dy1-dyp*dx1
5949  IF(abs(denom).GT.1.d-12) THEN
5950  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
5951  ELSE
5952  a1 = 0.d0
5953  ENDIF
5954  a1 = max(min(a1,1.d0),0.d0)
5955  shp( ifa ,iplot) = 1.d0 - a1
5956  shp( isui(ifa),iplot) = a1
5957  shp(isui2(ifa),iplot) = 0.d0
5958  xplot(iplot) = x(i1) + a1 * dx1
5959  yplot(iplot) = y(i1) + a1 * dy1
5960 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
5961 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
5962  elt(iplot) = - sens * elt(iplot)
5963  EXIT
5964 !
5965  ELSE
5966 !
5967  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR11'
5968  WRITE(lu,*) 'IEL=',iel
5969  CALL plante(1)
5970  stop
5971 !
5972  ENDIF
5973 !
5974  ENDIF
5975 !
5976  ENDDO
5977  ENDDO
5978 !
5979 !-----------------------------------------------------------------------
5980 !
5981  RETURN
5982  END SUBROUTINE schar11_sto
5983 ! ******************
5984  SUBROUTINE schar12
5985 ! ******************
5986 !
5987  &(u,v,dt,nrk,x,y,ikle,ifabor,xplot,yplot,dx,dy,shp,elt,
5988  & nplot,nelem,nelmax,surdet,sens,
5989  & ifapar,nchdim,nchara,add)
5990 !
5991 !***********************************************************************
5992 ! BIEF VERSION 6.3 24/04/97 J-M JANIN (LNH) 30 87 72 84
5993 !
5994 !***********************************************************************
5995 !
5996 ! FONCTION : THIS IS A MERE COPY OF SCHAR11, EXCEPT THE INTERPOLATION
5997 ! OF VELOCITY WHICH IS HERE CONSIDERED QUASI-BUBBLE
5998 !
5999 !history J-M HERVOUET (LNHE)
6000 !+ 07/04/2013
6001 !+ V6P3
6002 !+ Correct size of velocities given to allow bound checking.
6003 !
6004 !-----------------------------------------------------------------------
6005 ! ARGUMENTS
6006 ! .________________.____.______________________________________________.
6007 ! | NOM |MODE| ROLE |
6008 ! |________________|____|______________________________________________|
6009 ! | U,V | -->| COMPOSANTE DE LA VITESSE DU CONVECTEUR |
6010 ! | DT | -->| PAS DE TEMPS. |
6011 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
6012 ! | X,Y | -->| COORDONNEES DES POINTS DU MAILLAGE. |
6013 ! | IKLE | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
6014 ! | | | ET GLOBALE. |
6015 ! | IFABOR | -->| NUMEROS DES ELEMENTS AYANT UNE FACE COMMUNE |
6016 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
6017 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
6018 ! | XPLOT,YPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
6019 ! | DX,DY | -- | STOCKAGE DES SOUS-PAS . |
6020 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
6021 ! | | | COURBES CARACTERISTIQUES. |
6022 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D AU PIED DES COURBES |
6023 ! | | | CARACTERISTIQUES. |
6024 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
6025 ! | NELEM | -->| NOMBRE D'ELEMENTS. |
6026 ! | NELMAX | -->| NOMBRE MAXIMAL D'ELEMENTS DANS LE MAILLAGE 2D|
6027 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
6028 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
6029 ! |________________|____|______________________________________________|
6030 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
6031 !-----------------------------------------------------------------------
6032 ! - PROGRAMMES APPELES : NEANT
6033 !
6034 !***********************************************************************
6035 !
6036  USE bief
6037 !
6038  IMPLICIT NONE
6039 !
6040 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6041 !
6042  INTEGER , INTENT(IN) :: SENS,NCHDIM
6043  INTEGER , INTENT(IN) :: NELEM,NELMAX,NPLOT,NRK
6044  INTEGER , INTENT(IN) :: IKLE(nelmax,4),IFABOR(nelmax,3)
6045  INTEGER , INTENT(INOUT) :: ELT(*),NCHARA
6046  DOUBLE PRECISION, INTENT(IN) :: U(*),V(*)
6047  DOUBLE PRECISION, INTENT(IN) :: SURDET(nelem)
6048  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(*),YPLOT(*)
6049  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,*)
6050  DOUBLE PRECISION, INTENT(IN) :: DT
6051  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*)
6052  DOUBLE PRECISION, INTENT(INOUT) :: DX(*),DY(*)
6053  INTEGER, INTENT(IN) :: IFAPAR(6,*)
6054  LOGICAL, INTENT(IN) :: ADD
6055 !
6056 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6057 !
6058  INTEGER :: IPLOT,ISP,I1,I2,I3,IEL,ISO,IFA,ISUI(3),ISUI2(3)
6059  INTEGER IPROC,ILOC,ISPDONE,NSP
6060  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,DENOM
6061  DOUBLE PRECISION SHP11,SHP12,SHP14
6062  DOUBLE PRECISION SHP22,SHP23,SHP24
6063  DOUBLE PRECISION SHP33,SHP31,SHP34
6064 !
6065  INTRINSIC int,max,min,sqrt
6066 !
6067  parameter( isui = (/ 2 , 3 , 1 /) )
6068  parameter( isui2 = (/ 3 , 1 , 2 /) )
6069  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
6070 !
6071 !-----------------------------------------------------------------------
6072 ! FOR EVERY POINT
6073 !-----------------------------------------------------------------------
6074 !
6075  DO iplot=1,nplot
6076 !
6077  IF(add) THEN
6078 !
6079  xplot(iplot) = recvchar(iplot)%XP
6080  yplot(iplot) = recvchar(iplot)%YP
6081  dx(iplot) = recvchar(iplot)%DX
6082  dy(iplot) = recvchar(iplot)%DY
6083  elt(iplot) = recvchar(iplot)%INE
6084  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
6085  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
6086  iel = elt(iplot)
6087  xp = xplot(iplot)
6088  yp = yplot(iplot)
6089  i1 = ikle(iel,1)
6090  i2 = ikle(iel,2)
6091  i3 = ikle(iel,3)
6092  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
6093  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
6094  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
6095  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
6096  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
6097  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
6098 ! ASSUME TO BE LOCALISED IT WILL BE SET OTHERWISE IF LOST-AGAIN
6099  recvchar(iplot)%NEPID=-1
6100 !
6101  ELSE
6102  iel = elt(iplot)
6103 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL INTERPOLATION
6104 ! GIVES 0., AND WE SKIP TO NEXT POINT IPLOT (CYCLE)
6105 ! THIS WILL NOT INTERFERE WITH ELT(IPLOT)=0 GIVEN ON LIQUID BOUNDARIES
6106 ! BY ARRAY IFABOR, THAT MAY HAPPEN LATER
6107  IF(iel.EQ.0) THEN
6108  elt(iplot)=1
6109  shp(1,iplot)=0.d0
6110  shp(2,iplot)=0.d0
6111  shp(3,iplot)=0.d0
6112  cycle
6113  ENDIF
6114  shp11=shp(1,iplot)-shp(3,iplot)
6115  shp12=shp(2,iplot)-shp(3,iplot)
6116  shp14=3.d0*shp(3,iplot)
6117  shp22=shp(2,iplot)-shp(1,iplot)
6118  shp23=shp(3,iplot)-shp(1,iplot)
6119  shp24=3.d0*shp(1,iplot)
6120  shp33=shp(3,iplot)-shp(2,iplot)
6121  shp31=shp(1,iplot)-shp(2,iplot)
6122  shp34=3.d0*shp(2,iplot)
6123  IF( shp11.GT. 2.d0*epsilo .AND.
6124  & shp11.LT.1.d0-4.d0*epsilo .AND.
6125  & shp12.GT. 2.d0*epsilo .AND.
6126  & shp12.LT.1.d0-4.d0*epsilo .AND.
6127  & shp14.LT.1.d0-4.d0*epsilo ) THEN
6128  dxp = u(ikle(iel,1)) * shp11
6129  & + u(ikle(iel,2)) * shp12
6130  & + u(ikle(iel,4)) * shp14
6131  dyp = v(ikle(iel,1)) * shp11
6132  & + v(ikle(iel,2)) * shp12
6133  & + v(ikle(iel,4)) * shp14
6134  ELSEIF( shp22.GT. 2.d0*epsilo .AND.
6135  & shp22.LT.1.d0-4.d0*epsilo .AND.
6136  & shp23.GT. 2.d0*epsilo .AND.
6137  & shp23.LT.1.d0-4.d0*epsilo .AND.
6138  & shp24.LT.1.d0-4.d0*epsilo ) THEN
6139  dxp = u(ikle(iel,2)) * shp22
6140  & + u(ikle(iel,3)) * shp23
6141  & + u(ikle(iel,4)) * shp24
6142  dyp = v(ikle(iel,2)) * shp22
6143  & + v(ikle(iel,3)) * shp23
6144  & + v(ikle(iel,4)) * shp24
6145  ELSEIF( shp33.GT. 2.d0*epsilo .AND.
6146  & shp33.LT.1.d0-4.d0*epsilo .AND.
6147  & shp31.GT. 2.d0*epsilo .AND.
6148  & shp31.LT.1.d0-4.d0*epsilo .AND.
6149  & shp34.LT.1.d0-4.d0*epsilo ) THEN
6150  dxp = u(ikle(iel,3)) * shp33
6151  & + u(ikle(iel,1)) * shp31
6152  & + u(ikle(iel,4)) * shp34
6153  dyp = v(ikle(iel,3)) * shp33
6154  & + v(ikle(iel,1)) * shp31
6155  & + v(ikle(iel,4)) * shp34
6156  ELSE
6157  WRITE(lu,*) 'SCHAR12: POINT ',iplot
6158  WRITE(lu,*) ' NOT IN ELEMENT ',iel
6159  WRITE(lu,*) 'SHP(1,IPLOT)=',shp(1,iplot)
6160  WRITE(lu,*) 'SHP(2,IPLOT)=',shp(2,iplot)
6161  WRITE(lu,*) 'SHP(3,IPLOT)=',shp(3,iplot)
6162  WRITE(lu,*) 'EPSILO=',epsilo,' IPID=',ipid,' CASE 1'
6163  WRITE(lu,*) 'SHP11=',shp11
6164  WRITE(lu,*) 'SHP12=',shp12
6165  WRITE(lu,*) 'SHP14=',shp14
6166  WRITE(lu,*) 'SHP22=',shp22
6167  WRITE(lu,*) 'SHP23=',shp23
6168  WRITE(lu,*) 'SHP24=',shp24
6169  WRITE(lu,*) 'SHP33=',shp33
6170  WRITE(lu,*) 'SHP31=',shp31
6171  WRITE(lu,*) 'SHP34=',shp34
6172  CALL plante(1)
6173  stop
6174  ENDIF
6175  nsp=max(1,int(nrk*dt*sqrt((dxp**2+dyp**2)*surdet(iel))))
6176  ispdone=1
6177  ENDIF
6178 !
6179  pas = sens*dt/nsp
6180 !
6181 ! LOOP ON RUNGE-KUTTA SUB-STEPS
6182 !
6183 ! COMPILER MUST DO NOTHING IF ISPDONE>NSP
6184 ! IN MODE "ADD", ISP = ISPDONE HAS NOT BEEN FULLY DONE
6185 ! IT IS RESTARTED HERE
6186 !
6187  DO isp=ispdone,nsp
6188 !
6189 !-----------------------------------------------------------------------
6190 ! LOCALISING THE ARRIVAL POINT
6191 !-----------------------------------------------------------------------
6192 !
6193 ! IN MODE "ADD" ITERATIONS ALREADY DONE ARE SKIPPED AND
6194 ! CHARACTERISTICS GONE IN ANOTHER SUB-DOMAIN SKIPPED
6195 !
6196  IF(add) THEN
6197  IF(isp.EQ.ispdone) GO TO 50
6198  IF(recvchar(iplot)%NEPID.NE.-1) cycle
6199  ENDIF
6200 !
6201  iel = elt(iplot)
6202  i1 = ikle(iel,1)
6203  i2 = ikle(iel,2)
6204  i3 = ikle(iel,3)
6205 !
6206  shp11=shp(1,iplot)-shp(3,iplot)
6207  shp12=shp(2,iplot)-shp(3,iplot)
6208  shp14=3.d0*shp(3,iplot)
6209  shp22=shp(2,iplot)-shp(1,iplot)
6210  shp23=shp(3,iplot)-shp(1,iplot)
6211  shp24=3.d0*shp(1,iplot)
6212  shp33=shp(3,iplot)-shp(2,iplot)
6213  shp31=shp(1,iplot)-shp(2,iplot)
6214  shp34=3.d0*shp(2,iplot)
6215  IF( shp11.GT. 2.d0*epsilo .AND.
6216  & shp11.LT.1.d0-4.d0*epsilo .AND.
6217  & shp12.GT. 2.d0*epsilo .AND.
6218  & shp12.LT.1.d0-4.d0*epsilo .AND.
6219  & shp14.LT.1.d0-4.d0*epsilo ) THEN
6220  dx(iplot) = ( u(ikle(iel,1)) * shp11
6221  & + u(ikle(iel,2)) * shp12
6222  & + u(ikle(iel,4)) * shp14 ) * pas
6223  dy(iplot) = ( v(ikle(iel,1)) * shp11
6224  & + v(ikle(iel,2)) * shp12
6225  & + v(ikle(iel,4)) * shp14 ) * pas
6226  ELSEIF( shp22.GT. 2.d0*epsilo .AND.
6227  & shp22.LT.1.d0-4.d0*epsilo .AND.
6228  & shp23.GT. 2.d0*epsilo .AND.
6229  & shp23.LT.1.d0-4.d0*epsilo .AND.
6230  & shp24.LT.1.d0-4.d0*epsilo ) THEN
6231  dx(iplot) = ( u(ikle(iel,2)) * shp22
6232  & + u(ikle(iel,3)) * shp23
6233  & + u(ikle(iel,4)) * shp24 ) * pas
6234  dy(iplot) = ( v(ikle(iel,2)) * shp22
6235  & + v(ikle(iel,3)) * shp23
6236  & + v(ikle(iel,4)) * shp24 ) * pas
6237  ELSEIF( shp33.GT. 2.d0*epsilo .AND.
6238  & shp33.LT.1.d0-4.d0*epsilo .AND.
6239  & shp31.GT. 2.d0*epsilo .AND.
6240  & shp31.LT.1.d0-4.d0*epsilo .AND.
6241  & shp34.LT.1.d0-4.d0*epsilo ) THEN
6242  dx(iplot) = ( u(ikle(iel,3)) * shp33
6243  & + u(ikle(iel,1)) * shp31
6244  & + u(ikle(iel,4)) * shp34 ) * pas
6245  dy(iplot) = ( v(ikle(iel,3)) * shp33
6246  & + v(ikle(iel,1)) * shp31
6247  & + v(ikle(iel,4)) * shp34 ) * pas
6248  ELSE
6249  WRITE(lu,*) 'SCHAR12: POINT ',iplot
6250  WRITE(lu,*) ' NOT IN ELEMENT ',elt(iplot)
6251  WRITE(lu,*) 'SHP(1,IPLOT)=',shp(1,iplot)
6252  WRITE(lu,*) 'SHP(2,IPLOT)=',shp(2,iplot)
6253  WRITE(lu,*) 'SHP(3,IPLOT)=',shp(3,iplot)
6254  WRITE(lu,*) 'EPSILO=',epsilo,' IPID=',ipid,' CASE 2'
6255  CALL plante(1)
6256  stop
6257  ENDIF
6258  xp = xplot(iplot) + dx(iplot)
6259  yp = yplot(iplot) + dy(iplot)
6260 !
6261  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
6262  & -(y(i3)-y(i2))*(xp-x(i2))) * surdet(iel)
6263  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
6264  & -(y(i1)-y(i3))*(xp-x(i3))) * surdet(iel)
6265  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
6266  & -(y(i2)-y(i1))*(xp-x(i1))) * surdet(iel)
6267 !
6268  xplot(iplot) = xp
6269  yplot(iplot) = yp
6270 !
6271  IF(add) THEN
6272 ! CONTINUOUS SETTING OF THE REACHED POSITION FOR IPLOT
6273 ! AND THE NUMBER OF STEPS DONE ALREADY
6274  recvchar(iplot)%XP=xplot(iplot)
6275  recvchar(iplot)%YP=yplot(iplot)
6276  recvchar(iplot)%DX=dx(iplot)
6277  recvchar(iplot)%DY=dy(iplot)
6278  recvchar(iplot)%INE=elt(iplot)
6279  recvchar(iplot)%ISP=isp
6280  ENDIF
6281 !
6282 !-----------------------------------------------------------------------
6283 ! TEST: IS THE PATHLINE WENT OUT THE ORIGINAL ELEMENT
6284 !-----------------------------------------------------------------------
6285 !
6286 50 CONTINUE
6287 !
6288  iso = 0
6289  IF(shp(1,iplot).LT.epsilo) iso = 1
6290  IF(shp(2,iplot).LT.epsilo) iso = iso + 2
6291  IF(shp(3,iplot).LT.epsilo) iso = iso + 4
6292 !
6293  IF(iso.NE.0) THEN
6294 !
6295 !-----------------------------------------------------------------------
6296 ! HERE WE ARE OUT OF THE ELEMENT
6297 !-----------------------------------------------------------------------
6298 !
6299  iel = elt(iplot)
6300  xp = xplot(iplot)
6301  yp = yplot(iplot)
6302 !
6303  IF(iso.EQ.1) THEN
6304  ifa = 2
6305  ELSEIF (iso.EQ.2) THEN
6306  ifa = 3
6307  ELSEIF (iso.EQ.4) THEN
6308  ifa = 1
6309  ELSEIF (iso.EQ.3) THEN
6310  ifa = 2
6311  IF(dx(iplot)*(y(ikle(iel,3))-yp).LT.
6312  & dy(iplot)*(x(ikle(iel,3))-xp)) ifa = 3
6313  ELSEIF (iso.EQ.6) THEN
6314  ifa = 3
6315  IF (dx(iplot)*(y(ikle(iel,1))-yp).LT.
6316  & dy(iplot)*(x(ikle(iel,1))-xp)) ifa = 1
6317  ELSE
6318  ifa = 1
6319  IF(dx(iplot)*(y(ikle(iel,2))-yp).LT.
6320  & dy(iplot)*(x(ikle(iel,2))-xp)) ifa = 2
6321  ENDIF
6322 !
6323  iel = ifabor(iel,ifa)
6324 !
6325  IF(iel.GT.0) THEN
6326 !
6327 !-----------------------------------------------------------------------
6328 ! HERE WE ARRIVE IN ANOTHER ELEMENT
6329 !-----------------------------------------------------------------------
6330 !
6331  i1 = ikle(iel,1)
6332  i2 = ikle(iel,2)
6333  i3 = ikle(iel,3)
6334 !
6335  elt(iplot) = iel
6336  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
6337  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
6338  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
6339  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
6340  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
6341  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
6342 !
6343  GOTO 50
6344 !
6345  ENDIF
6346 !
6347 !-----------------------------------------------------------------------
6348 ! HERE WE PASS TO NEIGHBOUR SUBDOMAIN AND COLLECT DATA
6349 !-----------------------------------------------------------------------
6350 !
6351  IF(iel.EQ.-2) THEN
6352  IF(add) THEN
6353 ! A LOST-AGAIN TRACEBACK DETECTED, ALREADY HERE
6354 ! SET THE IMPLANTING PARAMETERS
6355  iproc=ifapar(ifa ,elt(iplot))
6356  iloc =ifapar(ifa+3,elt(iplot))
6357 ! ANOTHER ONE AS IPID, MEANS ALSO NOT LOCALISED
6358  recvchar(iplot)%NEPID=iproc
6359  recvchar(iplot)%INE=iloc
6360  ELSE
6361  CALL collect_char(ipid,iplot,elt(iplot),ifa,0,0,isp,nsp,
6362  & xplot(iplot),yplot(iplot),0.d0,0.d0,
6363  & dx(iplot),dy(iplot),0.d0,0.d0,
6364  & ifapar,nchdim,nchara)
6365  ENDIF
6366 ! EXITING LOOP ON ISP
6367  EXIT
6368  ENDIF
6369 !
6370 !-----------------------------------------------------------------------
6371 ! SPECIAL TREATMENT FOR SOLID OR LIQUID BOUNDARIES
6372 !-----------------------------------------------------------------------
6373 !
6374  dxp = dx(iplot)
6375  dyp = dy(iplot)
6376  i1 = ikle(elt(iplot),ifa)
6377  i2 = ikle(elt(iplot),isui(ifa))
6378  dx1 = x(i2) - x(i1)
6379  dy1 = y(i2) - y(i1)
6380 !
6381  IF(iel.EQ.-1) THEN
6382 !
6383 !-----------------------------------------------------------------------
6384 ! HERE SOLID BOUNDARY, VELOCITY IS PROJECTED ON THE BOUNDARY
6385 ! AND WE GO ON
6386 !-----------------------------------------------------------------------
6387 !
6388  a1 = (dxp*dx1 + dyp*dy1) / (dx1**2 + dy1**2)
6389  dx(iplot) = a1 * dx1
6390  dy(iplot) = a1 * dy1
6391 !
6392  a1 = ((xp-x(i1))*dx1+(yp-y(i1))*dy1)/(dx1**2+dy1**2)
6393  shp( ifa ,iplot) = 1.d0 - a1
6394  shp( isui(ifa),iplot) = a1
6395  shp(isui2(ifa),iplot) = 0.d0
6396  xplot(iplot) = x(i1) + a1 * dx1
6397  yplot(iplot) = y(i1) + a1 * dy1
6398  IF(add) THEN
6399  recvchar(iplot)%XP=xplot(iplot)
6400  recvchar(iplot)%YP=yplot(iplot)
6401  recvchar(iplot)%DX=dx(iplot)
6402  recvchar(iplot)%DY=dy(iplot)
6403  ENDIF
6404 !
6405  GOTO 50
6406 !
6407  ELSEIF(iel.EQ.0) THEN
6408 !
6409 !-----------------------------------------------------------------------
6410 ! HERE WE HAVE A LIQUID BOUNDARY, THE CHARACTERISTIC IS STOPPED
6411 !-----------------------------------------------------------------------
6412 !
6413  denom = dxp*dy1-dyp*dx1
6414  IF(abs(denom).GT.1.d-12) THEN
6415  a1 = (dxp*(yp-y(i1))-dyp*(xp-x(i1))) / denom
6416  ELSE
6417  a1 = 0.d0
6418  ENDIF
6419  a1 = max(min(a1,1.d0),0.d0)
6420  shp( ifa ,iplot) = 1.d0 - a1
6421  shp( isui(ifa),iplot) = a1
6422  shp(isui2(ifa),iplot) = 0.d0
6423  xplot(iplot) = x(i1) + a1 * dx1
6424  yplot(iplot) = y(i1) + a1 * dy1
6425 ! THIS IS A MARKER FOR PARTICLES EXITING A DOMAIN
6426 ! SENS=-1 FOR BACKWARD CHARACTERISTICS
6427  elt(iplot) = - sens * elt(iplot)
6428  EXIT
6429 !
6430  ELSE
6431 !
6432  WRITE(lu,*) 'UNEXPECTED CASE IN SCHAR12'
6433  WRITE(lu,*) 'IEL=',iel
6434  CALL plante(1)
6435  stop
6436 !
6437  ENDIF
6438 !
6439  ENDIF
6440 !
6441  ENDDO
6442  ENDDO
6443 !
6444 !-----------------------------------------------------------------------
6445 !
6446  RETURN
6447  END SUBROUTINE schar12
6448 ! ******************
6449  SUBROUTINE schar13
6450 ! ******************
6451 !
6452  &(u,v,dt,nrk,x,y,ikle,ifabor,xplot,yplot,dx,dy,shp,elt,
6453  & nplot,nelem,nelmax,surdet,sens,
6454  & ifapar,nchdim,nchara,add)
6455 !
6456 !***********************************************************************
6457 ! BIEF VERSION 6.2 24/04/97 J-M JANIN (LNH) 30 87 72 84
6458 !
6459 !***********************************************************************
6460 !
6461 ! FONCTION : THIS IS A MERE COPY OF SCHAR11, EXCEPT THE INTERPOLATION
6462 ! OF VELOCITY WHICH IS HERE CONSIDERED QUADRATIC
6463 !
6464 !history J-M HERVOUET (LNHE)
6465 !+ 07/04/2013
6466 !+ V6P3
6467 !+ Size of velocities set to * to blind bound checking. The correct
6468 !+ quadratic size would be needed here.
6469 !
6470 !-----------------------------------------------------------------------
6471 ! ARGUMENTS
6472 ! .________________.____.______________________________________________.
6473 ! | NOM |MODE| ROLE |
6474 ! |________________|____|______________________________________________|
6475 ! | U,V | -->| COMPOSANTE DE LA VITESSE DU CONVECTEUR |
6476 ! | DT | -->| PAS DE TEMPS. |
6477 ! | NRK | -->| NOMBRE DE SOUS-PAS DE RUNGE-KUTTA. |
6478 ! | X,Y | -->| COORDONNEES DES POINTS DU MAILLAGE. |
6479 ! | IKLE | -->| TRANSITION ENTRE LES NUMEROTATIONS LOCALE |
6480 ! | | | ET GLOBALE. |
6481 ! | IFABOR | -->| NUMEROS DES ELEMENTS AYANT UNE FACE COMMUNE |
6482 ! | | | AVEC L'ELEMENT . SI IFABOR<0 OU NUL |
6483 ! | | | ON A UNE FACE LIQUIDE,SOLIDE,OU PERIODIQUE |
6484 ! | XPLOT,YPLOT |<-->| POSITIONS SUCCESSIVES DES DERIVANTS. |
6485 ! | DX,DY | -- | STOCKAGE DES SOUS-PAS . |
6486 ! | SHP |<-->| COORDONNEES BARYCENTRIQUES 2D AU PIED DES |
6487 ! | | | COURBES CARACTERISTIQUES. |
6488 ! | ELT |<-->| NUMEROS DES ELEMENTS 2D AU PIED DES COURBES |
6489 ! | | | CARACTERISTIQUES. |
6490 ! | NPLOT | -->| NOMBRE DE DERIVANTS. |
6491 ! | NPOIN | -->| NOMBRE DE POINTS DU MAILLAGE. |
6492 ! | NELEM | -->| NOMBRE D'ELEMENTS. |
6493 ! | NELMAX | -->| NOMBRE MAXIMAL D'ELEMENTS DANS LE MAILLAGE 2D|
6494 ! | SURDET | -->| VARIABLE UTILISEE PAR LA TRANSFORMEE ISOPARAM.
6495 ! | SENS | -->| DESCENTE OU REMONTEE DES CARACTERISTIQUES. |
6496 ! |________________|____|______________________________________________|
6497 ! MODE: -->(DONNEE NON MODIFIEE),<--(RESULTAT),<-->(DONNEE MODIFIEE)
6498 !-----------------------------------------------------------------------
6499 ! - PROGRAMMES APPELES : NEANT
6500 !
6501 !***********************************************************************
6502 !
6503  USE bief
6504 !
6505  IMPLICIT NONE
6506 !
6507 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6508 !
6509  INTEGER , INTENT(IN) :: SENS,NCHDIM
6510  INTEGER , INTENT(IN) :: NELEM,NELMAX,NPLOT,NRK
6511  INTEGER , INTENT(IN) :: IKLE(nelmax,6),IFABOR(nelmax,3)
6512  INTEGER , INTENT(INOUT) :: ELT(nplot),NCHARA
6513 ! QUADRATIC VELOCITIES
6514  DOUBLE PRECISION, INTENT(IN) :: U(*),V(*),SURDET(nelem)
6515  DOUBLE PRECISION, INTENT(INOUT) :: XPLOT(nplot),YPLOT(nplot)
6516  DOUBLE PRECISION, INTENT(INOUT) :: SHP(3,nplot)
6517  DOUBLE PRECISION, INTENT(IN) :: DT
6518  DOUBLE PRECISION, INTENT(IN) :: X(*),Y(*)
6519  DOUBLE PRECISION, INTENT(INOUT) :: DX(nplot),DY(nplot)
6520  INTEGER, INTENT(IN) :: IFAPAR(6,*)
6521  LOGICAL, INTENT(IN) :: ADD
6522 !
6523 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
6524 !
6525  INTEGER IPLOT,ISP,I1,I2,I3,I4,I5,I6,IEL,ISO,IFA
6526  INTEGER :: ISUI(3),ISUI2(3)
6527  INTEGER IPROC,ILOC,ISPDONE,NSP
6528  DOUBLE PRECISION PAS,A1,DX1,DY1,DXP,DYP,XP,YP,DENOM
6529 !
6530  INTRINSIC int,max,min,sqrt
6531 !
6532  parameter( isui = (/ 2 , 3 , 1 /) )
6533  parameter( isui2 = (/ 3 , 1 , 2 /) )
6534  DOUBLE PRECISION, PARAMETER :: EPSILO = -1.d-6
6535 !
6536 !-----------------------------------------------------------------------
6537 ! FOR EVERY POINT
6538 !-----------------------------------------------------------------------
6539 !
6540  DO iplot=1,nplot
6541 !
6542  IF(add) THEN
6543 !
6544  xplot(iplot) = recvchar(iplot)%XP
6545  yplot(iplot) = recvchar(iplot)%YP
6546  dx(iplot) = recvchar(iplot)%DX
6547  dy(iplot) = recvchar(iplot)%DY
6548  elt(iplot) = recvchar(iplot)%INE
6549  nsp = recvchar(iplot)%NSP ! R-K STEPS TO BE FULLFILLED
6550  ispdone = recvchar(iplot)%ISP ! R-K STEPS ALREADY DONE
6551  iel = elt(iplot)
6552  xp = xplot(iplot)
6553  yp = yplot(iplot)
6554  i1 = ikle(iel,1)
6555  i2 = ikle(iel,2)
6556  i3 = ikle(iel,3)
6557  shp(1,iplot) = ((x(i3)-x(i2))*(yp-y(i2))
6558  & -(y(i3)-y(i2))*(xp-x(i2)))*surdet(iel)
6559  shp(2,iplot) = ((x(i1)-x(i3))*(yp-y(i3))
6560  & -(y(i1)-y(i3))*(xp-x(i3)))*surdet(iel)
6561  shp(3,iplot) = ((x(i2)-x(i1))*(yp-y(i1))
6562  & -(y(i2)-y(i1))*(xp-x(i1)))*surdet(iel)
6563 ! ASSUME TO BE LOCALISED IT WILL BE SET OTHERWISE IF LOST-AGAIN
6564  recvchar(iplot)%NEPID=-1
6565 !
6566  ELSE
6567  iel = elt(iplot)
6568 ! POINTS WITH IEL=0 ARE TREATED SO THAT THE FINAL INTERPOLATION
6569 ! GIVES 0., AND WE SKIP TO NEXT POINT IPLOT (CYCLE)