The TELEMAC-MASCARET system  trunk
derive.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE derive
3 ! *****************
4 !
5  &(u,v,w,dt,at,x,y,z,ikle,ifabor,lt,ielm,ielmu,ndp,ndp2,
6  & npoin,npoin2,
7  & nelem,nelmax,surdet,xflot,yflot,zflot,
8  & shpflo,shzflo,tagflo,clsflo,eltflo,etaflo,
9  & nflot,nflot_max,mesh,
10  & isub,dx,dy,dz,eltbuf,shpbuf,shzbuf,sizebuf,stocha,visc,
11  & nplan,zstar,transf,
12  & aalgae,dalgae,ralgae,ealgae,talgae,yalgae,
13  & rel_algae,tw1_algae,tw2_algae,a_algae,
14  & orbvel,ak,ep,h)
15 !
16 !***********************************************************************
17 ! BIEF V6P3 21/08/2010
18 !***********************************************************************
19 !
20 !brief - COMPUTES THE BARYCENTRIC COORDINATES OF A FLOAT
21 !+ IN THE MESH AT THE TIME OF RELEASE.
22 !+
23 !+ - COMPUTES THE SUCCESSIVE POSITIONS OF THIS FLOAT
24 !+ WHICH IS CARRIED WITHOUT FRICTION BY THE CURRENT
25 !+ (SUBSEQUENT TIMESTEPS).
26 !
27 !history J-M JANIN (LNH)
28 !+ 18/08/94
29 !+ V5P1
30 !+ Original version.
31 !
32 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
33 !+ 13/07/2010
34 !+ V6P0
35 !+ Translation of French comments within the FORTRAN sources into
36 !+ English comments
37 !
38 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
39 !+ 21/08/2010
40 !+ V6P0
41 !+ Creation of DOXYGEN tags for automated documentation and
42 !+ cross-referencing of the FORTRAN sources
43 !
44 !history J-M HERVOUET (LNHE)
45 !+ 19/06/2012
46 !+ V6P2
47 !+ Adapted for calling SCARACT instead of CHAR11. However parallelism
48 !+ will require further modifications.
49 !
50 !history J-M HERVOUET (LNHE)
51 !+ 12/03/2013
52 !+ V6P3
53 !+ New file format for Tecplot. Works in parallel. Works in 3D.
54 !
55 !history J-M HERVOUET (LNHE)
56 !+ 12/03/2013
57 !+ V6P3
58 !+ Arguments STOCHA and VISC added
59 !
60 !history A Joly
61 !+ 20/06/2013
62 !+ V6P3
63 !+ New conditions added to treat algae transport
64 !+ - Only tested in 2D
65 !+ - Does not work for quadratic elements
66 !
67 !history J-M HERVOUET (EDF LAB, LNHE)
68 !+ 14/08/2015
69 !+ V7P1
70 !+ Hardcoded argument NRK added for SCARACT.
71 !
72 !history R. ATA (EDF LAB, LNHE)
73 !+ 14/01/2017
74 !+ V7P2
75 !+ bug fix and better preparation of the call of SCARACT for 3D.
76 !+ see lines between !RA
77 !
78 !history J,RIEHME (ADJOINTWARE)
79 !+ November 2016
80 !+ V7P2
81 !+ Replaced EXTERNAL statements to parallel functions / subroutines
82 !+ by the INTERFACE_PARALLEL
83 !
84 !history M.S.TURNBULL (HRW)
85 !+ 26/11/2019
86 !+ V8P2
87 !+ Algae Dislodgement
88 !
89 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
90 !| A_ALGAE |-->| RATE OF DEGRADATION FOR ALGAE
91 !| CLSFLO |-->| CLASS OF FLOATS
92 !| DT |-->| TIME STEP (I.E. TIME INTERVAL).
93 !| DX |<->| WORK ARRAY (DISPLACEMENTS ALONG X)
94 !| DY |<->| WORK ARRAY (DISPLACEMENTS ALONG Y)
95 !| DZ |<->| WORK ARRAY (DISPLACEMENTS ALONG Z)
96 !| ELTBUF |<->| WORK ARRAY
97 !| ELTFLO |<->| NUMBERS OF ELEMENTS WHERE ARE THE FLOATS
98 !| ETAFLO |<->| LEVELS WHERE ARE THE FLOATS
99 !| | | FOR FLOATS POSITIONS.
100 !| IELM |-->| TYPE OF ELEMENT.
101 !| IELMU |-->| TYPE OF ELEMENT FOR VELOCITIES.
102 !| IFABOR |-->| ELEMENTS BEHIND THE EDGES OF ANOTHER ELEMENT
103 !| | | IF IFABOR NEGATIVE OR 0, THE EDGE IS A
104 !| | | LIQUID OR PERIODIC BOUNDARY
105 !| IKLE |-->| CONNECTIVITY TABLE.
106 !| ISUB |<->| ARRIVAL SUB-DOMAIN OF PARTICLES.
107 !| LT |-->| TIME STEP NUMBER.
108 !| MESH |<->| MESH STRUCTURE.
109 !| NDP |-->| NUMBER OF POINTS PER ELEMENT FOR IELM
110 !| NDP2 |-->| NUMBER OF POINTS PER ELEMENT FOR IELMU
111 !| NELEM |-->| NUMBER OF ELEMENTS
112 !| NELMAX |-->| MAXIMUM NUMBER OF ELEMENTS IN 2D
113 !| NFLOT |<->| NUMBER OF FLOATS.
114 !| NFLOT_MAX |<->| MAXIMUM NUMBER OF FLOATS.
115 !| NPLAN |-->| NUMBER OF PLANES FOR 3D (1 FOR 2D)
116 !| NPOIN |-->| NUMBER OF POINTS
117 !| NPOIN2 |-->| NUMBER OF POINTS IN 2D MESH
118 !| NSTAR |-->| VERTICAL DISTRIBUTION OF PLANES
119 !| ORBVEL |-->| WAVE ORBITAL VELOCITY
120 !| REL_ALGAE |-->| ALGAE RELEASE TYPE
121 !| SHPBUF |<->| WORK ARRAY
122 !| SHPFLO |<->| BARYCENTRIC COORDINATES OF FLOATS IN THEIR
123 !| | | ELEMENTS.
124 !| SHZBUF |<->| WORK ARRAY
125 !| SHZFLO |<->| BARYCENTRIC COORDINATE ON VERTICAL
126 !| SIZEBUF |-->| DILMENSION OF SOME WORK ARRAYS
127 !| SURDET |-->| 1/DETERMINANT, USED IN ISOPARAMETRIC
128 !| | | TRANSFORMATION.
129 !| TAGFLO |-->| TAGS OF FLOATS
130 !| TALGAE |-->| DURATION BEFORE ALGAE RELEASE
131 !| TRANSF |-->| 3D MESH TRANSFORMATION
132 !| TW1_ALGAE |-->| WAVE ORBITAL VELOCITY THRESHOLD FOR ALGAE 1
133 !| TW2_ALGAE |-->| WAVE ORBITAL VELOCITY THRESHOLD FOR ALGAE 2
134 !| U |-->| X-COMPONENT OF VELOCITY
135 !| V |-->| Y-COMPONENT OF VELOCITY
136 !| W |-->| Z-COMPONENT OF VELOCITY
137 !| X |-->| ABSCISSAE OF POINTS IN THE MESH
138 !| XFLOT |<->| ABSCISSAE OF FLOATS
139 !| Y |-->| ORDINATES OF POINTS IN THE MESH
140 !| YALGAE |-->| ALGAE TYPE
141 !| YFLOT |<->| ORDINATES OF FLOATS
142 !| Z |-->| ELEVATIONS OF POINTS IN THE MESH
143 !| ZFLOT |<->| ELEVATIONS OF FLOATS
144 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
145 !
146  USE bief, ex_derive => derive
148  & init_alg, sizebuf2_d,buff_1d_d,
149  & buff_2d_d, alg_dislodge,
150  & buff_elt_i
151  USE streamline
152  USE algae_transp
153 !
155  USE interface_parallel, ONLY : p_isum
156  USE initial_drogues, ONLY : parclss
157  IMPLICIT NONE
158 !
159 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
160 !
161  INTEGER , INTENT(IN) :: NPOIN,LT,IELM,IELMU,NDP,NELEM
162  INTEGER , INTENT(IN) :: NELMAX,SIZEBUF,NPOIN2
163  INTEGER , INTENT(IN) :: NFLOT_MAX,STOCHA,NPLAN,TRANSF
164  INTEGER , INTENT(INOUT) :: NFLOT
165  INTEGER , INTENT(IN) :: NDP2
166  DOUBLE PRECISION, INTENT(IN) :: DT,AT
167  DOUBLE PRECISION, INTENT(IN) :: U(*),V(*),W(*)
168  DOUBLE PRECISION, INTENT(IN) :: X(npoin),Y(npoin),Z(npoin)
169  INTEGER , INTENT(IN) :: IKLE(nelmax,ndp2)
170  INTEGER , INTENT(IN) :: IFABOR(*)
171  DOUBLE PRECISION, INTENT(IN) :: SURDET(nelem),ZSTAR(nplan)
172  DOUBLE PRECISION, INTENT(INOUT) :: XFLOT(nflot_max),DX(nflot_max)
173  DOUBLE PRECISION, INTENT(INOUT) :: YFLOT(nflot_max),DY(nflot_max)
174  DOUBLE PRECISION, INTENT(INOUT) :: ZFLOT(nflot_max),DZ(nflot_max)
175  INTEGER , INTENT(INOUT) :: TAGFLO(nflot_max)
176  INTEGER , INTENT(INOUT) :: CLSFLO(nflot_max)
177  INTEGER , INTENT(INOUT) :: ELTFLO(nflot_max)
178  INTEGER , INTENT(INOUT) :: ETAFLO(nflot_max)
179  INTEGER , INTENT(INOUT) :: ELTBUF(sizebuf)
180  INTEGER , INTENT(INOUT) :: ISUB(nflot_max)
181  DOUBLE PRECISION, INTENT(INOUT) :: SHPFLO(ndp,nflot_max)
182  DOUBLE PRECISION, INTENT(INOUT) :: SHZFLO(nflot_max)
183  DOUBLE PRECISION, INTENT(INOUT) :: SHPBUF(ndp,sizebuf)
184  DOUBLE PRECISION, INTENT(INOUT) :: SHZBUF(sizebuf)
185  TYPE(bief_obj) , INTENT(IN) :: VISC
186  TYPE(bief_mesh) , INTENT(INOUT) :: MESH
187  LOGICAL , OPTIONAL, INTENT(IN) :: AALGAE
188  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: AK(*),EP(*)
189  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: ORBVEL(*)
190  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: H(npoin)
191  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: DALGAE(*),RALGAE(*)
192  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: EALGAE(*)
193  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: TALGAE(*)
194  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: TW1_ALGAE(*)
195  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: TW2_ALGAE(*)
196  DOUBLE PRECISION, OPTIONAL, INTENT(IN) :: A_ALGAE(*)
197  INTEGER , OPTIONAL, INTENT(IN) :: YALGAE(*)
198  INTEGER , OPTIONAL, INTENT(IN) :: REL_ALGAE(*)
199 !
200 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
201 !
202  INTEGER IFLOT,FRE(1),FREBUF(1),ELT,ETF
203  INTEGER N1,N2,N3,N4,N5,N6,NOMB,SENS,NRK
204 !
205  INTEGER REL_ALG
206  DOUBLE PRECISION TW0, TW1, TW2, A_ALG
207  DOUBLE PRECISION, ALLOCATABLE :: TW(:)
208 !
209  LOGICAL SSIGMA
210 !
211  CHARACTER(LEN=11) EXTENS
212  EXTERNAL extens
213 !
214  LOGICAL ALGAE
215 !
216  SAVE tw
217 !
218 !-----------------------------------------------------------------------
219 !
220 ! HARDCODED NUMBER OF SUB-STEPS FOR COMPUTING THE PATH-LINES
221 !
222  nrk=3
223 !
224 !-----------------------------------------------------------------------
225 !
226 ! CHECKING ARGUMENTS FOR ALGAE
227 !
228  IF(PRESENT(aalgae)) THEN
229  algae=aalgae
230  ELSE
231  algae=.false.
232  ENDIF
233  IF(algae) THEN
234  IF(.NOT.PRESENT(ak).OR.
235  & .NOT.PRESENT(ep).OR.
236  & .NOT.PRESENT(h).OR.
237  & .NOT.PRESENT(dalgae).OR.
238  & .NOT.PRESENT(ralgae).OR.
239  & .NOT.PRESENT(ealgae).OR.
240  & .NOT.PRESENT(talgae).OR.
241  & .NOT.PRESENT(yalgae)) THEN
242  WRITE(lu,*) 'DERIVE: MISSING ARGUMENTS FOR ALGAE'
243  CALL plante(1)
244  stop
245  ENDIF
246  ENDIF
247 !
248 !-----------------------------------------------------------------------
249 !
250 ! PARAMETERISING THE CALL TO SCARACT
251 !
252 ! NUMBER OF PLANES, NOW GOT BY ARGUMENT
253 ! NPLAN=NPOIN/NPOIN2
254 ! NO VARIABLE TO INTERPOLATE AT THE FOOT OF CHARACTERISTICS
255  nomb=0
256 ! FORWARD TRACKING
257  sens=1
258 ! CASE OF 3D CALLS, DETECT IF SIGMA TRANSFORM
259  ssigma=ielm.EQ.41.AND.transf.NE.0.AND.transf.NE.5
260 !
261  IF(ielm.NE.11.AND.ielm.NE.41) THEN
262  WRITE(lu,124) ielm
263 124 FORMAT(1x,'DERIVE : UNEXPECTED TYPE OF ELEMENT: ',1i6)
264  CALL plante(1)
265  stop
266  ENDIF
267 !
268 !-----------------------------------------------------------------------
269 !
270 ! INITIALISING SVOID_DERIVE AND HEADER OF A TECPLOT FILE
271 !
272  IF(.NOT.deja_derive) THEN
273 !
274 ! THOUGH NOMB = 0, THESE COMPONENTS WILL BE USED IN SCARACT
275 !
276  svoid_derive%TYPE=2
277  svoid_derive%NAT = 1
278  svoid_derive%DIM1=1
279  ALLOCATE(svoid_derive%R(1))
280 !
281  IF(algae.AND.alg_dislodge)THEN
282  ALLOCATE(tw(nflot_max))
283  END IF
284 !
285  deja_derive=.true.
286 !
287  ENDIF
288 !
289  svoid_derive%ELM=ielm
290 !
291 !-----------------------------------------------------------------------
292 !
293 ! TRAJECTORIES COMPUTED FOR ALL POINTS
294 !
295 ! ALLOCATE THE ALGAE VARIABLES IF NEEDED
296 !
297  IF(algae.AND.init_alg) THEN
298  init_alg=.false.
299 ! VERIFY THAT THE BUFFER SIZE IS BIG ENOUGH FOR PARTICLE TRANSPORT
300  IF(nflot_max.GT.sizebuf)THEN
301  sizebuf2_d=nflot_max
302  ALLOCATE(buff_1d_d(sizebuf2_d))
303  ALLOCATE(buff_2d_d(ndp,sizebuf2_d))
304  ALLOCATE(buff_elt_i(sizebuf2_d))
305  ELSE
306 ! SET IT TO TRUE SO DEALL_BIEF DOES NOT TRY TO DEALLOCATE IT
307  init_alg=.true.
308  ENDIF
309  ENDIF
310 !
311  IF(algae) THEN
312  IF(lt.EQ.1) THEN
313  IF(ielmu.EQ.11) THEN
314  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
316  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
317  & ielmu,npoin,u,v,w,ak,ep,h)
318  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
319  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
320  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
321  & ielmu,npoin,u,v,w,ak,ep,h)
322  ELSEIF(ielmu.EQ.12) THEN
323  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
325  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
326  & ielmu,npoin+nelmax,u,v,w,ak,ep,h)
327  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
328  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
329  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
330  & ielmu,npoin+nelmax,u,v,w,ak,ep,h)
331  ENDIF
332  ENDIF
333  ENDIF
334 ! BACK CONVERSION WHEN SIGMA TRANSFORM
335  IF(ssigma)THEN
336  DO iflot=1,nflot
337  etf = etaflo(iflot)
338  zflot(iflot)=zstar(etf)+ shzflo(iflot)*
339  & (zstar(etf+1)-zstar(etf))
340  ENDDO
341  ENDIF
342 !
343 ! -----------------
344 ! IF ALGAE IS .TRUE., THEN USE ALGAE TRANSPORT
345 ! OTHERWISE THIS IS A NORMAL DROGUE TRANSPORT
346 ! -----------------
347 !
348  IF(algae)THEN
349 !
350 ! FILL I_A_GL, WHICH WILL BE USED TO VERIFY THAT THE ALGAE INFO IS SENT IN
351 ! THE SAME FASHION AS THE PARTICLE POSITIONS
352 !
353  DO iflot=1,nflot
354  i_a_gl%I(iflot)=tagflo(iflot)
355  END DO
356 !
357  IF(ielmu.EQ.11)THEN
358  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
359  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
360  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
361  & ielmu,npoin,u,v,w,ak,ep,h)
362  IF(alg_dislodge)THEN
363  CALL bief_interp(orbvel,tw,shpflo,ndp,shzflo,
364  & eltflo,shzbuf,fre,
365  & eltflo,nflot,npoin,nplan,ielmu,ikle,nelmax,
366  & .false.,.false.)
367  END IF
368  ELSEIF(ielmu.EQ.12)THEN
369  CALL interp_algae(nflot,nflot_max,shpflo,shzflo,eltflo,
370  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
371  & h_flu%R,npoin,ielm,ndp,ndp2,nplan,nelmax,ikle,shzbuf,
372  & ielmu,npoin+nelmax,u,v,w,ak,ep,h)
373  IF(alg_dislodge)THEN
374  CALL bief_interp(orbvel,tw,shpflo,ndp,shzflo,
375  & eltflo,shzbuf,fre,
376  & eltflo,nflot,npoin+nelmax,nplan,ielmu,ikle,nelmax,
377  & .false.,.false.)
378  END IF
379  END IF
380 !
381  DO iflot=1,nflot_max
382  parclss%I(iflot) = clsflo(iflot)
383  END DO
384 !
385  IF(alg_dislodge)THEN
386  DO iflot=1,nflot
387  rel_alg = rel_algae(clsflo(iflot))
388  IF (rel_alg.EQ.2) THEN
389  tw1 = tw1_algae(clsflo(iflot))
390  tw2 = tw2_algae(clsflo(iflot))
391  a_alg = a_algae(clsflo(iflot))
392  teff%R(iflot) = teff%R(iflot) + dt * tw(iflot)
393  tw0 = tw2 + (tw1 - tw2) * exp(-a_alg * teff%R(iflot))
394  IF (tw(iflot).GT.tw0) THEN
395  dislodge%I(iflot) = 1
396  ENDIF
397  ENDIF
398  END DO
399  END IF
400 !
401  CALL disp_algae(nflot_max,nflot,mesh%DIM1,dt,at,
402  & u_x_av_0%R,u_y_av_0%R,u_z_av_0%R,k_av_0%R,
403  & eps_av_0%R,h_flu%R,u_x_av%R,u_y_av%R,u_z_av%R,
404  & u_x_0%R,u_y_0%R,u_z_0%R,v_x_0%R,v_y_0%R,v_z_0%R,
405  & dx,dy,dz,eltflo,u_x%R,u_y%R,u_z%R,v_x%R,v_y%R,
406  & v_z%R,xflot,yflot,zflot,lt,dalgae,ralgae,ealgae,
407  & talgae,yalgae,rel_algae)
408 !
409 ! FIND THE ELEMENT AND SUBDOMAIN AFTER THE TRANSPORT (WITH A VERIFICATION
410 ! IF SIZEBUF.LT.NFLOT_MAX)
411 !
412  IF(nflot_max.GT.sizebuf)THEN
413  CALL scaract(svoid_derive,svoid_derive,u,v,w,w,x,y,zstar,
414  & zstar,
415  & xflot,yflot,zflot,zflot,dx,dy,dz,dz,z,
416  & shpflo,shzflo,shzflo,
417  & surdet,dt,ikle,ifabor,eltflo,etaflo,
418  & fre,buff_elt_i,isub,ielm,ielmu,
419  & nelem,nelmax,nomb,npoin2,ndp,nrk,
420  & nplan,1,mesh,nflot,npoin2,sens,
421  & buff_2d_d,buff_1d_d,buff_1d_d,frebuf,sizebuf2_d,
422  & apost=.true.,asigma=ssigma,aalg=algae)
423  ELSE
424  CALL scaract(svoid_derive,svoid_derive,u,v,w,w,x,y,zstar,
425  & zstar,
426  & xflot,yflot,zflot,zflot,dx,dy,dz,dz,z,
427  & shpflo,shzflo,shzflo,
428  & surdet,dt,ikle,ifabor,eltflo,etaflo,
429  & fre,eltbuf,isub,ielm,ielmu,
430  & nelem,nelmax,nomb,npoin2,ndp,nrk,
431  & nplan,1,mesh,nflot,npoin2,sens,
432  & shpbuf,shzbuf,shzbuf,frebuf,sizebuf,
433  & apost=.true.,asigma=ssigma,aalg=algae)
434  ENDIF
435  ELSE
436  CALL scaract(svoid_derive,svoid_derive,u,v,w,w,x,y,zstar,zstar,
437  & xflot,yflot,zflot,zflot,
438  & dx,dy,dz,dz,z,shpflo,shzflo,shzflo,surdet,dt,
439  & ikle,ifabor,eltflo,etaflo,
440  & fre,eltbuf,isub,ielm,ielmu,nelem,nelmax,
441  & nomb,npoin2,ndp,nrk,
442  & nplan,1,mesh,nflot,npoin2,sens,
443  & shpbuf,shzbuf,shzbuf,frebuf,sizebuf,
444  & apost=.true.,asigma=ssigma,astocha=stocha,
445 ! APOST=.TRUE. OTHERWISE ISUB IS NOT FILLED
446  & avisc=visc)
447  ENDIF
448 !
449 !-----------------------------------------------------------------------
450 !
451  IF(ncsize.GT.1.AND.nflot.GT.0) THEN
452 !
453 ! IN // XFLOT AND YFLOT MAY HAVE BEEN DESTROYED BY SCARACT
454 ! BECAUSE RE-USED FOR GENERATIONS OF LOST PARTICLES
455 ! THEY ARE REDONE HERE FOR PARTICLES WHICH ARE STILL IN THE
456 ! SUB-DOMAIN
457 !
458  IF(ielm.EQ.11) THEN
459  DO iflot=1,nflot
460  IF(isub(iflot).EQ.ipid) THEN
461  elt=eltflo(iflot)
462  IF(elt.GT.0) THEN
463  n1=ikle(elt,1)
464  n2=ikle(elt,2)
465  n3=ikle(elt,3)
466  xflot(iflot)=shpflo(1,iflot)*x(n1)
467  & +shpflo(2,iflot)*x(n2)
468  & +shpflo(3,iflot)*x(n3)
469  yflot(iflot)=shpflo(1,iflot)*y(n1)
470  & +shpflo(2,iflot)*y(n2)
471  & +shpflo(3,iflot)*y(n3)
472  ENDIF
473  ENDIF
474  ENDDO
475  ELSEIF(ielm.EQ.41) THEN
476  DO iflot=1,nflot
477  IF(isub(iflot).EQ.ipid) THEN
478  elt=eltflo(iflot)
479  IF(elt.GT.0) THEN
480  n1=ikle(elt,1)+npoin2*(etaflo(iflot)-1)
481  n2=ikle(elt,2)+npoin2*(etaflo(iflot)-1)
482  n3=ikle(elt,3)+npoin2*(etaflo(iflot)-1)
483  n4=ikle(elt,1)+npoin2* etaflo(iflot)
484  n5=ikle(elt,2)+npoin2* etaflo(iflot)
485  n6=ikle(elt,3)+npoin2* etaflo(iflot)
486  xflot(iflot)=shpflo(1,iflot)*x(n1)
487  & +shpflo(2,iflot)*x(n2)
488  & +shpflo(3,iflot)*x(n3)
489  yflot(iflot)=shpflo(1,iflot)*y(n1)
490  & +shpflo(2,iflot)*y(n2)
491  & +shpflo(3,iflot)*y(n3)
492  zflot(iflot)=(z(n1)*shpflo(1,iflot)
493  & +z(n2)*shpflo(2,iflot)
494  & +z(n3)*shpflo(3,iflot))*(1.d0-shzflo(iflot))
495  & +(z(n4)*shpflo(1,iflot)
496  & +z(n5)*shpflo(2,iflot)
497  & +z(n6)*shpflo(3,iflot))*shzflo(iflot)
498  ENDIF
499  ENDIF
500  ENDDO
501  ENDIF
502 !
503  ENDIF
504 !
505 ! SEND THE ALGAE INFORMATION IF IT IS NECESSARY
506 !
507  IF(ncsize.GT.1.AND.algae) THEN
508  IF(nflot_max.GT.sizebuf)THEN
509  CALL send_info_alg(isub,i_a_gl%I,clsflo,teff%R,dislodge%I,
510  & buff_elt_i,nflot,nflot_max,
511  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
512  & h_flu%R,u_x%R,u_y%R,u_z%R,v_x%R,v_y%R,
513  & v_z%R,nwin,mesh%DIM1,psi)
514  ELSE
515  CALL send_info_alg(isub,i_a_gl%I,clsflo,teff%R,dislodge%I,
516  & eltbuf,nflot,nflot_max,
517  & u_x_av%R,u_y_av%R,u_z_av%R,k_av%R,eps_av%R,
518  & h_flu%R,u_x%R,u_y%R,u_z%R,v_x%R,v_y%R,
519  & v_z%R,nwin,mesh%DIM1,psi)
520  ENDIF
521  ENDIF
522 !
523 ! SENDING THE PARTICLES THAT MIGRATED TO ANOTHER SUB-DOMAIN
524 !
525  IF(ncsize.GT.1) THEN
526  IF(algae) THEN
527  CALL send_particles(xflot,yflot,zflot,shpflo,shzflo,eltflo,
528  & etaflo,isub,tagflo,clsflo,ndp,nflot,nflot_max,
529  & mesh,nplan,dx=dx,dy=dy,dz=dz)
530  ELSE
531  CALL send_particles(xflot,yflot,zflot,shpflo,shzflo,eltflo,
532  & etaflo,isub,tagflo,clsflo,ndp,nflot,nflot_max,
533  & mesh,nplan)
534  ENDIF
535  ENDIF
536 !
537 !-----------------------------------------------------------------------
538 !
539 ! CASE OF LOST FLOATS (EXITED OR NOW REMOVED AFTER BEING SENT TO
540 ! ANOTHER SUB-DOMAIN)
541 !
542  iflot=1
543  IF(ncsize.GT.1) THEN
544 !
545 ! IN // MODE
546 !
547 11 CONTINUE
548 ! LOST OR MIGRATED FLOATS
549  IF(nflot.GT.0.AND.ncsize.GT.1) THEN
550  IF(eltflo(iflot).LE.0.OR.isub(iflot).NE.ipid) THEN
551 !
552 ! REMOVE ALGAE INFORMATION FROM A SUB DOMAIN IF IT IS NECESSARY
553 !
554  IF(algae) THEN
555  CALL del_info_alg(tagflo(iflot),nflot,nflot_max,
556  & mesh%TYPELM,i_a_gl%I,clsflo,eltbuf,v_x%R,v_y%R,v_z%R,
557  & u_x%R,u_y%R,u_z%R,u_x_av%R,u_y_av%R,u_z_av%R,
558  & k_av%R,eps_av%R,h_flu%R,nwin,mesh%DIM1,psi)
559  ENDIF
560 !
561  IF(algae) THEN
562  CALL del_particle(tagflo(iflot),nflot,nflot_max,xflot,
563  & yflot,zflot,tagflo,clsflo,shpflo,shzflo,eltflo,
564  & etaflo,mesh%TYPELM,
565  & dx=dx,dy=dy,dz=dz,isub=isub,
566  & teff=teff%R,dislodge=dislodge%I)
567  ELSE
568  CALL del_particle(tagflo(iflot),nflot,nflot_max,xflot,
569  & yflot,zflot,tagflo,clsflo,shpflo,shzflo,eltflo,
570  & etaflo,mesh%TYPELM,
571  & isub=isub)
572  ENDIF
573 !
574 ! THE SAME IFLOT IS NOW A NEW PARTICLE AND MUST BE CHECKED AGAIN!
575  IF(iflot.LE.nflot) GO TO 11
576  ENDIF
577 !
578  IF(algae)THEN
579 ! UPDATE DX_A,DY_A,DZ_A
580  dx_a%R(iflot)=dx(iflot)
581  dy_a%R(iflot)=dy(iflot)
582  dz_a%R(iflot)=dz(iflot)
583  ENDIF
584 !
585  iflot=iflot+1
586  IF(iflot.LE.nflot) GO TO 11
587  ENDIF
588 !
589  ELSE
590 !
591 ! IN SCALAR MODE
592 !
593 10 CONTINUE
594 ! LOST FLOATS ONLY
595  IF(nflot.GT.0) THEN
596  IF(eltflo(iflot).LE.0) THEN
597 !
598 ! REMOVE INFORMATION FROM A SUB DOMAIN IF NECESSARY
599 !
600  IF(algae) THEN
601  CALL del_info_alg(tagflo(iflot),nflot,nflot_max,
602  & mesh%TYPELM,i_a_gl%I,clsflo,eltbuf,v_x%R,v_y%R,v_z%R,
603  & u_x%R,u_y%R,u_z%R,u_x_av%R,u_y_av%R,u_z_av%R,
604  & k_av%R,eps_av%R,h_flu%R,nwin,mesh%DIM1,psi)
605  CALL del_particle(tagflo(iflot),nflot,nflot_max,xflot,
606  & yflot,zflot,tagflo,clsflo,shpflo,shzflo,eltflo,
607  & etaflo,mesh%TYPELM,dx=dx,dy=dy,dz=dz,
608  & teff=teff%R,dislodge=dislodge%I)
609  ELSE
610  CALL del_particle(tagflo(iflot),nflot,nflot_max,xflot,
611  & yflot,zflot,tagflo,clsflo,shpflo,shzflo,eltflo,
612  & etaflo,mesh%TYPELM)
613  ENDIF
614 !
615 ! THE SAME IFLOT IS NOW A NEW PARTICLE AND MUST BE CHECKED AGAIN!
616  IF(iflot.LE.nflot) GO TO 10
617  ENDIF
618 !
619  IF(algae)THEN
620 ! UPDATE DX_A,DY_A,DZ_A
621  dx_a%R(iflot)=dx(iflot)
622  dy_a%R(iflot)=dy(iflot)
623  dz_a%R(iflot)=dz(iflot)
624  ENDIF
625 !
626  iflot=iflot+1
627  IF(iflot.LE.nflot) GO TO 10
628  ENDIF
629 !
630  ENDIF
631 !
632 !-----------------------------------------------------------------------
633 !
634  RETURN
635  END SUBROUTINE derive
type(bief_obj) dy_a
Definition: algae_transp.f:56
type(bief_obj) dx_a
Definition: algae_transp.f:55
type(bief_obj) u_y_av
Definition: algae_transp.f:35
type(bief_obj) eps_av
Definition: algae_transp.f:40
subroutine, public scaract(U, UTILD, UCONV, VCONV, WCONV, FRCONV, X, Y, ZSTAR, FREQ, XCONV, YCONV, ZCONV, FCONV, DX, DY, DZ, DF, Z, SHP, SHZ, SHF, SURDET, DT, IKLE, IFABOR, ELT, ETA, FRE, ELTBUF, ISUB, IELM, IELMU, NELEM, NELMAX, NOMB, NPOIN2, NDP, NRK, NPLAN, NF, MESH, NPLOT, DIM1U, SENS, SHPBUF, SHZBUF, SHFBUF, FREBUF, SIZEBUF, APOST, APERIO, AYA4D, ASIGMA, ASTOCHA, AVISC, AALG)
Definition: streamline.f:6854
type(bief_obj) eps_av_0
Definition: algae_transp.f:38
type(bief_obj) u_x_0
Definition: algae_transp.f:43
type(bief_obj) dislodge
Definition: algae_transp.f:60
type(bief_obj) u_y
Definition: algae_transp.f:47
subroutine, public del_particle(TAG, NFLOT, NFLOT_MAX, XFLOT, YFLOT, ZFLOT, TAGFLO, CLSFLO, SHPFLO, SHZFLO, ELTFLO, ETAFLO, IELM, DX, DY, DZ, ISUB, TEFF, DISLODGE)
Definition: streamline.f:8925
subroutine, public interp_algae(NP, NP_TOT, SHP_P, SHZ_P, ELT_P, U_X_AV, U_Y_AV, U_Z_AV, K_AV, EPS_AV, H_FLU, NPOIN, IELM, NDP, NDP2, NPLAN, NELMAX, IKLE, W1, IELMU, NPOINU, UCONV, VCONV, WCONV, AK, EP, H)
Definition: algae_transp.f:320
type(bief_obj) u_z_av
Definition: algae_transp.f:36
subroutine, public bief_interp(U, UTILD, SHP, NDP, SHZ, ETA, SHF, FRE, ELT, NP, NPOIN2, NPLAN, IELM, IKLE, NELMAX, PERIO, YA4D)
Definition: streamline.f:7655
type(bief_obj) h_flu
Definition: algae_transp.f:41
type(bief_obj) v_z
Definition: algae_transp.f:54
integer function p_isum(MYPART)
Definition: p_isum.F:7
type(bief_obj) u_x
Definition: algae_transp.f:46
type(bief_obj) v_x
Definition: algae_transp.f:52
type(bief_obj) u_z
Definition: algae_transp.f:48
type(bief_obj), target parclss
type(bief_obj) u_x_av_0
Definition: algae_transp.f:31
type(bief_obj) u_z_av_0
Definition: algae_transp.f:33
subroutine transf(FA, FR, XK, KNEW, NEWF, NEWF1, TAUX1, TAUX2, NPOIN2, NDIRE, NF)
Definition: transf.f:8
type(bief_obj) v_x_0
Definition: algae_transp.f:49
type(bief_obj) u_y_av_0
Definition: algae_transp.f:32
type(bief_obj) u_y_0
Definition: algae_transp.f:44
subroutine, public send_info_alg(ISUB, TAG, CLS, TEFF, DISLODGE, FLAG, NPLOT, NPLOT_MAX, U_X_AV, U_Y_AV, U_Z_AV, K_AV, EPS_AV, H_FLU, U_X, U_Y, U_Z, V_X, V_Y, V_Z, NWIN, NDIR, PSI)
Definition: streamline.f:9087
type(bief_obj) u_z_0
Definition: algae_transp.f:45
type(bief_obj) teff
Definition: algae_transp.f:58
type(bief_obj) dz_a
Definition: algae_transp.f:57
type(bief_obj) k_av_0
Definition: algae_transp.f:37
type(bief_obj) k_av
Definition: algae_transp.f:39
subroutine, public send_particles(X, Y, Z, SHP, SHZ, ELT, ETA, ISUB, TAG, CLS, NDP, NPLOT, NPLOT_MAX, MESH, NPLAN, DX, DY, DZ)
Definition: streamline.f:8393
type(bief_obj) i_a_gl
Definition: algae_transp.f:59
subroutine derive(U, V, W, DT, AT, X, Y, Z, IKLE, IFABOR, LT, IELM, IELMU, NDP, NDP2, NPOIN, NPOIN2, NELEM, NELMAX, SURDET, XFLOT, YFLOT, ZFLOT, SHPFLO, SHZFLO, TAGFLO, CLSFLO, ELTFLO, ETAFLO, NFLOT, NFLOT_MAX, MESH, ISUB, DX, DY, DZ, ELTBUF, SHPBUF, SHZBUF, SIZEBUF, STOCHA, VISC, NPLAN, ZSTAR, TRANSF, AALGAE, DALGAE, RALGAE, EALGAE, TALGAE, YALGAE, REL_ALGAE, TW1_ALGAE, TW2_ALGAE, A_ALGAE, ORBVEL, AK, EP, H)
Definition: derive.f:16
integer nwin
Definition: algae_transp.f:68
subroutine, public disp_algae(NA_TOT, NA, NDIM, DT, AT, U_X_AV_0, U_Y_AV_0, U_Z_AV_0, K_AV_0, EPS_AV_0, H_FLU, U_X_AV, U_Y_AV, U_Z_AV, U_X_0, U_Y_0, U_Z_0, V_X_0, V_Y_0, V_Z_0, DX_A, DY_A, DZ_A, ELEM_ALG, U_X, U_Y, U_Z, V_X, V_Y, V_Z, X_A, Y_A, Z_A, LT, DALGAE, RALGAE, EALGAE, TALGAE, YALGAE, REL_ALGAE)
Definition: algae_transp.f:450
double precision, dimension(:,:,:), allocatable psi
Definition: algae_transp.f:71
type(bief_obj) v_y_0
Definition: algae_transp.f:50
type(bief_obj) u_x_av
Definition: algae_transp.f:34
type(bief_obj) v_z_0
Definition: algae_transp.f:51
subroutine, public del_info_alg(TAG, NFLOT, NFLOT_MAX, IELM, TAGFLO, CLSFLO, FLAGFLO, V_X, V_Y, V_Z, U_X, U_Y, U_Z, U_X_AV, U_Y_AV, U_Z_AV, K_AV, EPS_AV, H_FLU, NWIN, NDIR, PSI)
Definition: streamline.f:9346
Definition: bief.f:3
type(bief_obj) v_y
Definition: algae_transp.f:53