The TELEMAC-MASCARET system  trunk
inbief.f
Go to the documentation of this file.
1 ! *****************
2  SUBROUTINE inbief
3 ! *****************
4 !
5  &(lihbor,klog,it1,it2,it3,lvmac,ielmx,
6  & lambd0,spheri,mesh,t1,t2,optass,produc,equa,mesh2d)
7 !
8 !***********************************************************************
9 ! BIEF V7P3
10 !***********************************************************************
11 !
12 !brief PREPARES THE DATA STRUCTURE FOR BIEF.
13 !+ THE INTEGER AND REAL ARRAYS DESCRIBING THE MESH
14 !+ ARE BUILT AND STORED IN MESH.
15 !
16 !history J-M HERVOUET (LNHE) ; REGINA NEBAUER; LAM MINH PHUONG; EMILE RAZAFINDRAKOTO
17 !+ 05/02/2010
18 !+ V6P0
19 !+ COMP_SEG UPDATED FOR QUADRATIC TRIANGLES
20 !
21 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
22 !+ 13/07/2010
23 !+ V6P0
24 !+ Translation of French comments within the FORTRAN sources into
25 !+ English comments
26 !
27 !history N.DURAND (HRW), S.E.BOURBAN (HRW)
28 !+ 21/08/2010
29 !+ V6P0
30 !+ Creation of DOXYGEN tags for automated documentation and
31 !+ cross-referencing of the FORTRAN sources
32 !
33 !history J-M HERVOUET (LNHE) ; REGINA NEBAUER; LAM MINH PHUONG; EMILE RAZAFINDRAKOTO
34 !+ 07/12/2011
35 !+ V6P2
36 !+ Checking elements for building GLOSEG. New optional argument MESH2D.
37 !+ for prisms split into tetrahedrons (call of STOSEG51)
38 !
39 !history J-M HERVOUET (LNHE)
40 !+ 10/09/2012
41 !+ V6P2
42 !+ Different call to VOISIN31, and call added for IELM=51
43 !
44 !history J-M HERVOUET (LNHE)
45 !+ 06/03/2013
46 !+ V6P3
47 !+ XEL, YEL now built in 3D. SURFAC based on XEL and YEL. Mercator
48 !+ projection treated in 3D.
49 !
50 !history R. ATA (EDF R&D - LNHE)
51 !+ 21/05/2013
52 !+ V6P3
53 !+ add centre_mass_seg, new infcel, hloc.
54 !
55 !history J-M HERVOUET (EDF LAB, LNHE)
56 !+ 28/03/2014
57 !+ V7P0
58 !+ Now written to enable different numbering of boundary points and
59 !+ boundary segments.
60 !
61 !history J-M HERVOUET (EDF LAB, LNHE)
62 !+ 09/05/2014
63 !+ V7P0
64 !+ Allocation of new vectors of I8 integers MESH%WI8 and MESH%TI8
65 !+ for finite element assembly with integers.
66 !history R.NHEILI (Univerte de Perpignan, DALI)
67 !+ 24/02/2016
68 !+ V7P3
69 !+ ALLOCATE BUF_SEND_ERR AND BUD_RECV_ERR
70 !
71 !history J-M HERVOUET (EDF LAB, LNHE)
72 !+ 30/07/2015
73 !+ V7P1
74 !+ Call of make_eltcar modified to compute IFAC. FAC suppressed.
75 !
76 !history M.S.TURNBULL (HRW)
77 !+ 24/09/2015
78 !+ V7P1
79 !+ Correction to the computation of the both Y and XDEL in spherical
80 !+ coordinates, accounting for the fact that the Earth is round.
81 !
82 !history J-M HERVOUET (Jubilado)
83 !+ 10/09/2017
84 !+ V7P3
85 !+ MESH%IKLE%DIM1 replaced with MESH%IKLE%MAXDIM1 in calls to VOISIN,
86 !+ VOISIN31 and ELEBD. NELEM replaced with MESH%ELTSEG%DIM1 in the
87 !+ call to COMP_NH_COM_SEG.
88 !
89 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
90 !| EQUA |-->| IDENTIFICATION OF PROGRAM OR EQUATIONS SOLVED
91 !| IELMX |-->| THE MORE COMPLEX ELEMENT USED (FOR MEMORY)
92 !| IT1 |<->| INTEGER WORK ARRAY IN A BIEF_OBJ STRUCTURE
93 !| IT2 |<->| INTEGER WORK ARRAY IN A BIEF_OBJ STRUCTURE
94 !| IT3 |<->| INTEGER WORK ARRAY IN A BIEF_OBJ STRUCTURE
95 !| KLOG |-->| CONVENTION FOR SOLID BOUNDARY
96 !| LAMBD0 |-->| LATITUDE OF ORIGIN POINT (SPHERICAL COORDINATES)
97 !| LIHBOR |-->| TYPES OF BOUNDARY CONDITIONS ON DEPTH
98 !| LVMAC |-->| VECTOR LENGTH (IF VECTOR MACHINE)
99 !| MESH |-->| MESH STRUCTURE
100 !| MESH2D |-->| UNDERLYING 2D MESH (FOR PRISMS AND PRISMS SPLIT
101 !| | | INTO TETRAHEDRONS)
102 !| OPTASS |-->| OPTION FOR MATRIX STORAGE.
103 !| PRODUC |-->| OPTION FOR MATRIX x VECTOR PRODUCT.
104 !| SPHERI |-->| LOGICAL, IF YES : SPHERICAL COORDINATES.
105 !| T1 |<->| WORK BIEF_OBJ STRUCTURE
106 !| T2 |<->| WORK BIEF_OBJ STRUCTURE
107 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108 !
109  USE bief, ex_inbief => inbief
111 !
113  IMPLICIT NONE
114 !
115 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
116 !
117  INTEGER, INTENT(IN) :: IELMX,OPTASS,PRODUC,KLOG,LVMAC
118  INTEGER, INTENT(IN) :: LIHBOR(*)
119  DOUBLE PRECISION, INTENT(IN) :: LAMBD0
120  LOGICAL, INTENT(IN) :: SPHERI
121  CHARACTER(LEN=20) :: EQUA
122  TYPE(bief_mesh), INTENT(INOUT) :: MESH
123  TYPE(bief_obj), INTENT(INOUT) :: T1,T2,IT1,IT2,IT3
124  TYPE(bief_mesh), INTENT(INOUT), OPTIONAL :: MESH2D
125 !
126 !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
127 !
128  INTEGER I,IELEM,NELEM,NELMAX,NPTFR,NPOIN,IELM,IPLAN,I3D
129  INTEGER MXPTVS,NPLAN
130  INTEGER LV,NDP,IDP,I1,I2,I3,NPOIN2
131  INTEGER NPTFR2,NELEM2,NELMAX2,NELEB2,NELEB
132  INTEGER NELCOU,IELEM3D
133 !
134  DOUBLE PRECISION X2,X3,Y2,Y3
135 !
136 !-----------------------------------------------------------------------
137 ! FOR CALL TO VOISIN31
138  INTEGER IKLESTR(1,3)
139 !
140 ! DEPLOYMENT OF THE DATA STRUCTURE
141 !
142  nelem = mesh%NELEM
143  nelmax= mesh%NELMAX
144  npoin = mesh%NPOIN
145  ielm = mesh%X%ELM
146  ndp = bief_nbpel(ielm,mesh)
147  nptfr = mesh%NPTFR
148  neleb = mesh%NELEB
149 !
150 ! WITH PRISMS, DIFFERENT FROM 2D VALUES, OTHERWISE
151 !
152  IF(ielm.EQ.41.OR.ielm.EQ.51) THEN
153  npoin2 =bief_nbpts(11,mesh)
154  nelem2 =bief_nbpts(10,mesh)
155  nelmax2 =bief_nbmpts(10,mesh)
156  nptfr2 =bief_nbpts(1,mesh)
157  nplan =npoin/npoin2
158  ELSEIF(ielm.EQ.11.OR.ielm.EQ.31) THEN
159  npoin2 =npoin
160  nelem2 =nelem
161  nelmax2 =nelmax
162  nptfr2 =nptfr
163  neleb2 =neleb
164  nplan =1
165  ELSE
166  WRITE(lu,*) 'UNEXPECTED ELEMENT IN INBIEF:',ielm
167  CALL plante(1)
168  stop
169  ENDIF
170 !
171 ! FINITE ELEMENT ASSEMBLY WITH I8 INTEGERS
172 !
173  IF(modass.EQ.2) THEN
174  ALLOCATE(mesh%WI8(nelmax*ndp))
175  ALLOCATE(mesh%TI8(npoin))
176  ENDIF
177 !
178 ! PARALLEL MODE : INITIALISES THE ARRAYS NHP,NHM
179 ! INDPU,FAC, ETC.
180 !
181 !
182  IF(ncsize.GT.1) THEN
183 !
184  CALL parini(mesh%NHP%I,mesh%NHM%I,mesh%INDPU%I,
185  & npoin2,mesh%NACHB%I,nplan,mesh,
186  & mesh%NB_NEIGHB,mesh%NB_NEIGHB_SEG,
187  & nelem2,mesh%IFAPAR%I,modass)
188 !
189  ELSE
190 ! THESE STUCTURES ARE ALLOCATED IN PARINI
191  CALL bief_allvec(2,mesh%NB_NEIGHB_PT,'NBNGPT',0,1,0,mesh)
192  CALL bief_allvec(2,mesh%LIST_SEND ,'LSSEND',0,1,0,mesh)
193  CALL bief_allvec(2,mesh%NH_COM ,'NH_COM',0,1,0,mesh)
194  CALL bief_allvec(2,mesh%NB_NEIGHB_PT_SEG,'NBNGSG',0,1,0,mesh)
195  CALL bief_allvec(2,mesh%LIST_SEND_SEG,'LSSESG',0,1,0,mesh)
196  CALL bief_allvec(2,mesh%NH_COM_SEG ,'NH_CSG',0,1,0,mesh)
197  CALL bief_allvec(1,mesh%BUF_SEND ,'BUSEND',0,1,0,mesh)
198  CALL bief_allvec(1,mesh%BUF_RECV ,'BURECV',0,1,0,mesh)
199  IF (modass .EQ.3) THEN
200  CALL bief_allvec(1,mesh%BUF_SEND_ERR ,'BUSEND_ERR',0,1,0,mesh)
201  CALL bief_allvec(1,mesh%BUF_RECV_ERR ,'BURECV_ERR',0,1,0,mesh)
202  ENDIF
203 !
204  ENDIF
205 !
206 !-----------------------------------------------------------------------
207 !
208 ! COMPUTES THE NEIGHBOURS OF THE BOUNDARY FACES (TRIANGULAR MESH)
209 !
210 ! NOTE: SEE CPIKLE2 AND CPIKLE3 IN 3D. IKLE CAN HERE BE 3D BECAUSE
211 ! THE BEGINNING OF IKLE IN 3D IS THE SAME AS THAT IN 2D (THE
212 ! FIRST 3 POINTS OF THE PRISMS OR TETRAHEDRONS CORRESPOND
213 ! TO THE 3 POINTS OF THE BOTTOM TRIANGLES)
214 !
215 !
216  IF(ielm.EQ.11.OR.ielm.EQ.41.OR.ielm.EQ.51) THEN
217  CALL voisin(mesh%IFABOR%I,nelem2,nelmax2,ielm,mesh%IKLE%I,
218  & mesh%IKLE%MAXDIM1,
219  & npoin2,mesh%NACHB%I,mesh%NBOR%I,nptfr2,it1%I,it2%I)
220 !
221  ELSEIF(ielm.NE.31) THEN
222  WRITE(lu,*) 'UNEXPECTED ELEMENT IN INBIEF:',ielm
223  CALL plante(1)
224  stop
225  ENDIF
226 !
227 !-----------------------------------------------------------------------
228 !
229  IF(ielm.EQ.11.OR.ielm.EQ.41.OR.ielm.EQ.51) THEN
230 !
231 ! CASES WITH A FIRST CALL IN 2D
232 !
233  mxptvs = mesh%MXPTVS
234 ! HERE IFABOR FOR IELM=51 MUST STILL BE 2D
235 ! SO VOISIN31 CALLED LATER
236 !
237 ! NOTE: IN 3D IKLBOR BUILT HERE WITH NELEB 2D AND NELEBX 3D.
238 !
239  CALL elebd(mesh%NELBOR%I,mesh%NULONE%I,mesh%KP1BOR%I,
240  & mesh%IFABOR%I,mesh%NBOR%I,mesh%IKLE%I,
241  & mesh%IKLE%MAXDIM1,
242  & mesh%IKLBOR%I,nelem2,nelmax2,npoin2,nptfr2,ielm,
243  & lihbor,klog,mesh%ISEG%I,
244  & it1%I,it2%I,it3%I,mesh%NELEBX,mesh%NELEB)
245 !
246  ENDIF
247 !
248 ! 3D CASES
249 !
250  IF(ielm.EQ.31) THEN
251 !
252 ! BUILDING ARRAYS FOR TETRAHEDRONS
253 !
254  CALL voisin31(mesh%IFABOR%I,nelem,nelmax,ielm,mesh%IKLE%I,
255  & mesh%IKLE%MAXDIM1,npoin,mesh%NBOR%I,nptfr,
256  & lihbor,klog,mesh%INDPU%I,iklestr,neleb2)
257 !
258  CALL elebd31(mesh%NELBOR%I,mesh%NULONE%I,mesh%IKLBOR%I,
259  & mesh%IFABOR%I,mesh%NBOR%I,mesh%IKLE%I,
260  & nelem,neleb,nelmax,npoin,nptfr,ielm)
261 !
262  ELSEIF(ielm.EQ.41) THEN
263 !
264 ! COMPLETES ARRAYS FOR PRISMS
265 !
266  CALL eleb3d(mesh%IKLE%I,mesh%NBOR%I,
267  & mesh%NELBOR%I,mesh%IKLBOR%I,
268  & mesh%NELEB,mesh%NELEBX,
269  & mesh%NULONE%I,nelmax2,npoin2,nplan,nplan-1,nptfr2)
270 !
271  ELSEIF(ielm.EQ.51) THEN
272 !
273 ! COMPLETES ARRAYS FOR PRISMS SPLIT INTO TETRAHEDRONS
274 !
275  IF(PRESENT(mesh2d)) THEN
276 ! NOTE THE USE OF MESH2D FOR NELBOR AND NULONE
277 ! THIS IS FOR CALLING STOSEG
278  CALL eleb3dt(mesh%IKLE%I,mesh%NBOR%I,mesh%NELBOR%I,
279  & mesh2d%NELBOR%I,mesh%IKLBOR%I,
280  & mesh%NELEB,mesh%NELEBX,mesh%NULONE%I,nelmax2,
281  & npoin2,nplan,nplan-1,nptfr2,
282  & mesh2d%IKLBOR%I,mesh2d%NELEB,mesh2d%NELEBX)
283  ELSE
284  WRITE(lu,*) 'ARGUMENT MESH2D SHOULD BE ADDED TO INBIEF'
285  WRITE(lu,*) 'FOR A CALL WITH IELM=51'
286  CALL plante(1)
287  stop
288  ENDIF
289 !
290  ELSEIF(ielm.NE.11) THEN
291 !
292  WRITE(lu,*) 'INBIEF UNEXPECTED ELEMENT: ',ielm
293  CALL plante(1)
294  stop
295 !
296  ENDIF
297 !
298 !-----------------------------------------------------------------------
299 !
300 ! LOOKS FOR VECTORISATION POSSIBILITIES
301 !
302  IF(ielm.EQ.11) THEN
303 !
304  IF(lvmac.NE.1) THEN
305  WRITE(lu,201) lvmac
306 201 FORMAT(1x,'INBIEF (BIEF): VECTOR MACHINE',/,1x,
307  & 'WITH VECTOR LENGTH :',1i6,
308  & ' (ACCORDING TO YOUR DATA OR IN THE DICTIONNARY OF KEY-WORDS)')
309  CALL veclen(lv,ndp,mesh%IKLE%I,nelem,nelmax,npoin,t1%R)
310  IF(lv.LT.lvmac) THEN
311  WRITE(lu,301) lv
312 301 FORMAT(1x,'THIS LENGTH IS REDUCED TO ',1i4,' BY THE NUMBERING
313  &OF THE ELEMENTS (SEE STBTEL DOCUMENTATION)')
314  ENDIF
315  ELSE
316  lv = 1
317  WRITE(lu,401)
318 401 FORMAT(1x,'INBIEF (BIEF): NOT A VECTOR MACHINE',
319  & ' (ACCORDING TO YOUR DATA)')
320  ENDIF
321 !
322  mesh%LV = lv
323 !
324  ENDIF
325 !
326 !-----------------------------------------------------------------------
327 !
328 ! MERCATOR PROJECTION (TRIANGLES AND PRISMS ONLY)
329 !
330  IF(spheri.AND.ielm.NE.11.AND.ielm.NE.41) THEN
331  WRITE(lu,399)
332 399 FORMAT(1x,'INBIEF (BIEF) : ELEMENT NOT IMPLEMENTED WITH',/,1x,
333  & 'MERCATOR PROJECTION:',1i3)
334  CALL plante(1)
335  stop
336  ENDIF
337 !
338  IF(spheri) THEN
339 !
340  CALL cpstvc(mesh%X,t1)
341  CALL cpstvc(mesh%Y,t2)
342  CALL latitu(t2%R,mesh%COSLAT%R,mesh%SINLAT%R,
343  & lambd0,mesh%Y%R,npoin2)
344  CALL corlat
345 !
346  IF(ielm.EQ.11.OR.ielm.EQ.41) THEN
347  DO i=1,npoin2
348  t1%R(i)=mesh%X%R(i)
349 ! T2%R(I)=MESH%Y%R(I)*MESH%COSLAT%R(I)
350  ENDDO
351  ENDIF
352 ! COMPLETING UPPER LAYERS FOR 3D MESHES
353  IF(ielm.EQ.41) THEN
354  DO iplan=2,nplan
355  DO i=1,npoin2
356  i3d=(iplan-1)*npoin2+i
357  t1%R(i3d)=mesh%X%R(i3d)
358  t2%R(i3d)=t2%R(i)
359  ENDDO
360  ENDDO
361  ENDIF
362 !
363 ! CONVERTS TO COORDINATES BY ELEMENTS (STARTING WITH X AND Y)
364  CALL pttoel(mesh%XEL,t1,mesh)
365  CALL pttoel(mesh%YEL,t2,mesh)
366 !
367  ELSE
368 !
369 ! NOTE: IN 3D MESH%X AND MESH%Y FULLY BUILT IN ALMESH
370 !
371 ! CONVERTS TO COORDINATES BY ELEMENTS (STARTING WITH X AND Y)
372 !
373  CALL pttoel(mesh%XEL,mesh%X,mesh)
374  CALL pttoel(mesh%YEL,mesh%Y,mesh)
375 !
376  ENDIF
377 !
378 !-----------------------------------------------------------------------
379 !
380 ! CONVERTS TO A LOCAL SYSTEM IN X AND Y, WITH POINT 1 AT ORIGIN
381 !
382  DO idp=2,ndp
383  CALL ov_2('X=X-Y ',mesh%XEL%R,idp,
384  & mesh%XEL%R,1 ,
385  & mesh%XEL%R,1 , 0.d0 , nelmax , nelem )
386  CALL ov_2('X=X-Y ',mesh%YEL%R,idp,
387  & mesh%YEL%R,1 ,
388  & mesh%YEL%R,1 , 0.d0 , nelmax , nelem )
389  ENDDO
390 !
391  CALL ov('X=C ', x=mesh%XEL%R, c=0.d0, dim1=nelem)
392  CALL ov('X=C ', x=mesh%YEL%R, c=0.d0, dim1=nelem)
393 !
394 !
395  IF(spheri) THEN
396 !
397  IF(PRESENT(mesh2d)) THEN
398  CALL longitu(mesh2d%XEL%R,mesh%COSLAT%R,mesh2d%IKLE%I,
399  & nelmax2,nelem2)
400  nelcou = (nplan-1)*nelmax2
401  DO iplan=1,nplan-1
402  DO ielem=1,nelem2
403  ielem3d=(iplan-1)*nelmax2+ielem
404 ! 3 POINTS OF THE BOTTOM
405  mesh%XEL%R(ielem3d) =mesh2d%XEL%R(ielem)
406  mesh%XEL%R(ielem3d+nelcou )=mesh2d%XEL%R(ielem+nelmax2)
407  mesh%XEL%R(ielem3d+2*nelcou)=mesh2d%XEL%R(ielem+2*nelmax2)
408 ! 3 POINTS OF THE TOP
409  mesh%XEL%R(ielem3d+3*nelcou)=mesh%XEL%R(ielem3d)
410  mesh%XEL%R(ielem3d+4*nelcou)=mesh%XEL%R(ielem3d+nelcou)
411  mesh%XEL%R(ielem3d+5*nelcou)=mesh%XEL%R(ielem3d+2*nelcou)
412  ENDDO
413  ENDDO
414  ELSE
415  CALL longitu(mesh%XEL%R,mesh%COSLAT%R,mesh%IKLE%I,
416  & nelmax,nelem)
417  ENDIF
418 !
419  ENDIF
420 !
421 ! IF DONE FOR Z (BUT IN MOVING MESHES SHOULD NOT BE USED !!!!)
422 !
423 ! IF(MESH%DIM1.EQ.3) THEN
424 ! CALL PTTOEL(MESH%ZEL,MESH%Z,MESH)
425 ! DO IDP=2,NDP
426 ! CALL OV_2('X=X-Y ',MESH%ZEL%R,IDP,
427 ! & MESH%ZEL%R,1 ,
428 ! & MESH%ZEL%R,1 , 0.D0 , NELMAX , NELEM )
429 ! ENDDO
430 ! CALL OV('X=C ', X=MESH%ZEL%R, C=0.D0, NELEM )
431 ! ENDIF
432 !
433 !-----------------------------------------------------------------------
434 !
435 ! COMPUTES THE GEOMETRICAL COEFFICIENTS FOR EACH ELEMENT
436 !
437  IF(ielm.EQ.11) THEN
438 !
439  CALL geoelt(mesh%SURDET%R,mesh%SURFAC%R,
440  & mesh%XEL%R ,mesh%YEL%R ,nelem,nelmax,ielm)
441 !
442 ! FOR THE TIME BEING, SURDET IS ONLY USED BY CARACT, WHICH DOES NOT
443 ! WORK ON THE MESH IN SPHERICAL COORDINATES.
444 ! ERASES SURDET COMPUTED BY GEOELE FROM XEL AND YEL
445 !
446  IF(spheri) THEN
447 !
448  DO ielem = 1 , nelem
449  i1 = mesh%IKLE%I(ielem)
450  i2 = mesh%IKLE%I(ielem+nelmax)
451  i3 = mesh%IKLE%I(ielem+2*nelmax)
452  x2 = - mesh%X%R(i1) + mesh%X%R(i2)
453  x3 = - mesh%X%R(i1) + mesh%X%R(i3)
454  y2 = - mesh%Y%R(i1) + mesh%Y%R(i2)
455  y3 = - mesh%Y%R(i1) + mesh%Y%R(i3)
456  mesh%SURDET%R(ielem) = 1.d0 / (x2*y3 - x3*y2)
457  ENDDO
458 !
459  ENDIF
460 !
461  ELSEIF(ielm.EQ.41.OR.ielm.EQ.51.OR.ielm.EQ.31) THEN
462 !
463 ! FOR PRISMS, SURFAC IS THE SURFACE OF THE TRIANGLES
464 ! FOR ELEMENTS 51 AND 31 ???????? SHOULD NOT BE USED...
465 !
466  DO ielem = 1 , nelem
467  x2 = mesh%XEL%R(ielem+nelmax)
468  x3 = mesh%XEL%R(ielem+2*nelmax)
469  y2 = mesh%YEL%R(ielem+nelmax)
470  y3 = mesh%YEL%R(ielem+2*nelmax)
471  mesh%SURFAC%R(ielem) = 0.5d0 * (x2*y3 - x3*y2)
472  ENDDO
473 !
474  ELSE
475  WRITE(lu,*) 'UNEXPECTED ELEMENT IN INBIEF:',ielm
476  CALL plante(1)
477  stop
478  ENDIF
479 !
480 !-----------------------------------------------------------------------
481 !
482 ! DEFINES THE OUTGOING NORMALS AT THE BOUNDARIES
483 ! AND THE DISTANCES TO THE BOUNDARY
484 !
485  IF(ielm.EQ.11) THEN
486 !
487  CALL normab(mesh%XNEBOR%R,mesh%YNEBOR%R,
488  & mesh%XSGBOR%R,mesh%YSGBOR%R,
489  & mesh%DISBOR%R,mesh%SURFAC%R,nelmax,mesh%NELBOR%I,
490  & mesh%NULONE%I,mesh%LGSEG%R,nptfr,mesh,
491  & mesh%XEL%R,mesh%YEL%R,mesh%IKLBOR%I,
492  & mesh%NELEBX,mesh%NELEB)
493 !
494  ENDIF
495 !
496 !-----------------------------------------------------------------------
497 !
498 ! DATA STRUCTURE FOR EDGE-BASED STORAGE (FROM 5.9 ON ALWAYS DONE IN 2D)
499 ! (FROM 6.2 ON ALWAYS DONE IN 3D)
500 ! SEE CALL TO COMP_SEG BELOW TO COMPLETE THE STRUCTURE
501 !
502  IF(ielm.EQ.11) THEN
503 !
504  CALL stoseg(mesh%IFABOR%I,nelem,nelmax,nelmax,ielmx,mesh%IKLE%I,
505  & mesh%NBOR%I,nptfr,mesh%GLOSEG%I,mesh%GLOSEG%MAXDIM1,
506  & mesh%ELTSEG%I,mesh%ORISEG%I,mesh%NSEG,
507  & mesh%NELBOR%I,mesh%NULONE%I,
508  & mesh%KNOLG%I,mesh%IKLBOR%I,mesh%NELEBX,mesh%NELEB)
509 !
510  ELSEIF(ielm.EQ.41) THEN
511 !
512  CALL stoseg41(mesh%IFABOR%I,nelmax,ielmx,mesh%IKLE%I,mesh%NBOR%I,
513  & mesh%GLOSEG%I,mesh%GLOSEG%MAXDIM1,
514  & mesh%ELTSEG%I,mesh%ORISEG%I,
515  & mesh%NELBOR%I,mesh%NULONE%I,
516  & nelmax2,nelem2,nptfr2,npoin2,nplan,mesh%KNOLG%I,
517  & bief_nbseg(11,mesh),
518  & mesh%IKLBOR%I,mesh%NELEBX,mesh%NELEB)
519 !
520  ELSEIF(ielm.EQ.51) THEN
521 !
522  IF(PRESENT(mesh2d)) THEN
523 ! NOTE THE USE OF MESH2D FOR NELBOR AND NULONE
524 ! THIS IS FOR CALLING STOSEG
525  CALL stoseg51(mesh%IFABOR%I,nelmax,ielmx,
526  & mesh%IKLE%I,mesh%NBOR%I,
527  & mesh%GLOSEG%I,mesh%GLOSEG%MAXDIM1,
528  & mesh%ELTSEG%I,mesh%ORISEG%I,
529  & mesh2d%NELBOR%I,mesh2d%NULONE%I,
530  & nelmax2,nelem2,nptfr2,npoin2,nplan,mesh%KNOLG%I,
531  & mesh2d%NSEG,mesh2d%IKLBOR%I,mesh2d%NELEB,
532  & mesh2d%NELEBX)
533  ELSE
534  WRITE(lu,*) 'ARGUMENT MESH2D SHOULD BE ADDED TO INBIEF'
535  WRITE(lu,*) 'FOR A CALL WITH IELM=51'
536  CALL plante(1)
537  stop
538  ENDIF
539 !
540  ELSE
541 !
542  WRITE(lu,*) 'ELEMENT ',ielm,' NOT IMPLEMENTED FOR SEGMENTS'
543  CALL plante(1)
544  stop
545 !
546  ENDIF
547 !
548 ! NOW THE 3D VALUE OF IFABOR IS BUILT FOR PRISMS CUT INTO
549 ! TETRAHEDRA (UP TO STOSEG51 A 2D VALUE WAS USED)
550 !
551  IF(ielm.EQ.51) THEN
552  CALL voisin31(mesh%IFABOR%I,nelem,nelmax,ielm,mesh%IKLE%I,
553  & mesh%IKLE%MAXDIM1,npoin,mesh%NBOR%I,nptfr,
554  & lihbor,klog,mesh%INDPU%I,iklestr,1)
555  ENDIF
556 !
557 !-----------------------------------------------------------------------
558 !
559  IF(ncsize.GT.1.AND.ielm.EQ.11) THEN
560 !
561 ! COMPLETES NH_COM_SEG WITH SEGMENT NUMBERS ONCE ELTSEG IS KNOWN
562 !
563  CALL comp_nh_com_seg(mesh%ELTSEG%I,mesh%ELTSEG%DIM1,
564  & mesh%NH_COM_SEG%I,
565  & mesh%NH_COM_SEG%DIM1,mesh%NB_NEIGHB_SEG,
566  & mesh%NB_NEIGHB_PT_SEG%I,
567  & mesh%GLOSEG%I,mesh%GLOSEG%DIM1,
568  & mesh%KNOLG%I,npoin)
569 !
570 ! COMPLETES FAC ONCE IFABOR AND ELTSEG ARE KNOWN
571 !
572  IF(ielm.EQ.11.AND.ielmx.EQ.13) THEN
573  CALL comp_fac(mesh%ELTSEG%I,mesh%ORISEG%I,mesh%IFABOR%I,nelem,
574  & npoin,mesh%IFAC)
575  ENDIF
576 !
577  ENDIF
578 !
579 !-----------------------------------------------------------------------
580 !
581 ! DATA STRUCTURE FOR EDGE-BASED STORAGE
582 !
583  IF(ielm.EQ.11.AND.produc.EQ.2) THEN
584 !
585  CALL fropro(mesh%NBOR%I,mesh%IKLE%I,
586  & nelem,nelmax,npoin,mesh%NPMAX,nptfr,ielm,
587  & mesh%IKLEM1%I,mesh%LIMVOI%I,optass,produc,mxptvs,
588  & it1%I,mesh%GLOSEG%I,mesh%GLOSEG%DIM1,mesh%NSEG)
589 !
590  ENDIF
591 !
592 !-----------------------------------------------------------------------
593 !
594 ! COMPLEMENTS IKLE AND NBOR BEYOND LINEAR ELEMENTS
595 !
596  IF(ielm.EQ.11.AND.ielm.NE.ielmx) THEN
597  IF(mesh%IKLE%DIM2.NE.bief_nbpel(ielmx,mesh)) THEN
598  WRITE(lu,101) ielmx
599 101 FORMAT(1x,'INBIEF (BIEF): WRONG DIMENSION OF IKLE',/,1x,
600  & 'FOR AN ELEMENT WITH TYPE :',1i6)
601  CALL plante(1)
602  stop
603  ENDIF
604  CALL comp_ikle(mesh%IKLE%I,mesh%IKLBOR%I,
605  & mesh%ELTSEG%I,mesh%NBOR%I,mesh%NELBOR%I,
606  & mesh%NULONE%I,ielmx,nelem,nelmax,npoin,nptfr,
607  & mesh%NELEB,mesh%NELEBX)
608  ENDIF
609 !
610 !-----------------------------------------------------------------------
611 !
612 ! COMPLEMENTS THE SEGMENT STRUCTURE BEYOND THE LINEAR ELEMENTS
613 !
614  IF(ielm.NE.ielmx) THEN
615  CALL comp_seg(nelem,nelmax,ielmx,mesh%IKLE%I,mesh%GLOSEG%I,
616  & mesh%GLOSEG%MAXDIM1,mesh%ELTSEG%I,mesh%ORISEG%I,
617  & mesh%NSEG)
618  ENDIF
619 !
620 !-----------------------------------------------------------------------
621 !
622 ! V6P3 FOR NEW DATA STRUCTURE OF FINITE VOLUMES
623 ! COMPUTE THE COORDINATES OF CENTRE OF GRAVITY FOR ELEMENTS RIGHT AND
624 ! LEFT OF EDGES
625 !
626  IF(equa(1:15).EQ.'SAINT-VENANT VF') THEN
627 !
628  CALL centre_mass_seg(mesh%X%R,mesh%Y%R,mesh%COORDG%R,
629  & mesh%IKLE%I,npoin,mesh%ELTSEG%I,
630  & mesh%ORISEG%I,nelem,mesh%NSEG,
631  & mesh%JMI%I,mesh%CMI%R,mesh%GLOSEG%I,
632  & mesh%IFABOR%I,mesh)
633 !
634  ENDIF
635 !
636 !-----------------------------------------------------------------------
637 !
638 ! COMPLEMENTS THE DATA STRUCTURE FOR FINITE VOLUMES
639 !
640  IF(equa(1:15).EQ.'SAINT-VENANT VF') THEN
641 !
642  CALL infcel(mesh%X%R,mesh%Y%R,
643  & mesh%NUBO%I,mesh%VNOIN%R,npoin,
644  & nelem,mesh%NSEG,mesh%CMI%R,
645  & mesh%AIRST%R,mesh%GLOSEG%I,
646  & mesh%COORDG%R,mesh%ELTSEG%I,
647  & mesh%ORISEG%I,mesh%IFABOR%I)
648 !
649 ! COMPUTES THE SURFACE OF THE CELLS
650 !
651  CALL vector(t1,'=','MASBAS ',11,
652  & 1.d0,t2,t2,t2,t2,t2,t2,mesh,.false.,t2)
653  IF(ncsize.GT.1) CALL parcom(t1,2,mesh)
654 !
655 ! COMPUTES THE LOCAL SPACE STEP PER CELL
656 !
657  CALL hloc(npoin,mesh%NSEG,nelem,mesh%NUBO%I,mesh%VNOIN%R,t1%R,
658  & mesh%DTHAUT%R,mesh,mesh%ELTSEG%I,mesh%IFABOR%I)
659 !
660 ! COMPUTES THE GRADIENTS OF THE BASE FUNCTIONS
661 !
662  CALL gradp(npoin,mesh%NELMAX,mesh%IKLE%I,mesh%SURFAC%R,
663  & mesh%X%R,mesh%Y%R,mesh%DPX%R,mesh%DPY%R)
664 !
665  ENDIF
666 !
667 !-----------------------------------------------------------------------
668 !
669 ! COMPUTES THE STARTING ELEMENT FOR THE METHOD OF CHARACTERISTICS
670 !
671  CALL make_eltcar(mesh%ELTCAR%I,mesh%IFAC%I,
672  & mesh%IKLE%I,npoin2,nelem2,
673  & nelmax,mesh%KNOLG%I,it1%I,mesh,nplan,ielmx)
674 !
675 !-----------------------------------------------------------------------
676 !
677 ! CHECKING THE MESH
678 !
679  IF(check_mesh) THEN
680  CALL checkmesh(mesh,npoin)
681  ENDIF
682 !
683 !-----------------------------------------------------------------------
684 !
685  RETURN
686  END
687 
subroutine geoelt(SURDET, SURFAC, XEL, YEL, NELEM, NELMAX, IELM)
Definition: geoelt.f:7
subroutine comp_ikle(IKLE, IKLBOR, ELTSEG, NBOR, NELBOR, NULONE, IELM, NELEM, NELMAX, NPOIN, NPTFR, NELEB, NELEBX)
Definition: comp_ikle.f:8
subroutine ov(OP, X, Y, Z, C, DIM1)
Definition: ov.f:7
subroutine longitu(XEL, COSLAT, IKLE, NELMAX, NELEM)
Definition: longitu.f:7
integer function bief_nbpts(IELM, MESH)
Definition: bief_nbpts.f:7
subroutine hloc(NPOIN, NSEG, NELEM, NUBO, VNOCL, AIRS, DTHAUT, MESH, ELTSEG, IFABOR)
Definition: hloc.f:7
subroutine parini(NHP, NHM, INDPU, NPOIN2, NACHB, NPLAN, MESH, NB_NEIGHB, NB_NEIGHB_SEG, NELEM2, IFAPAR, MODASS)
Definition: parini.f:8
integer function bief_nbpel(IELM, MESH)
Definition: bief_nbpel.f:7
subroutine voisin31(IFABOR, NELEM, NELMAX, IELM, IKLE, SIZIKL, NPOIN, NBOR, NPTFR, LIHBOR, KLOG, INDPU, IKLESTR, NELEB2)
Definition: voisin31.f:8
subroutine make_eltcar(ELTCAR, IFAC, IKLE, NPOIN2, NELEM2, NELMAX, KNOLG, ISCORE, MESH, NPLAN, IELM)
Definition: make_eltcar.f:8
subroutine corlat
Definition: corlat.f:4
subroutine bief_allvec(NAT, VEC, NOM, IELM, DIM2, STATUT, MESH)
Definition: bief_allvec.f:7
subroutine ov_2(OP, X, DIMX, Y, DIMY, Z, DIMZ, C, DIM1, NPOIN)
Definition: ov_2.f:7
subroutine comp_seg(NELEM, NELMAX, IELM, IKLE, GLOSEG, MAXSEG, ELTSEG, ORISEG, NSEG)
Definition: comp_seg.f:7
subroutine stoseg51(IFABOR, NELMAX, IELM, IKLE, NBOR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NELBOR, NULONE, NELMAX2, NELEM2, NPTFR2, NPOIN2, NPLAN, KNOLG, NSEG2D, IKLBOR, NELEB, NELEBX)
Definition: stoseg51.f:9
subroutine comp_nh_com_seg(ELTSEG, DIM1ELTSEG, NH_COM_SEG, DIM1NHCOM, NB_NEIGHB_SEG, NB_NEIGHB_PT_SEG, GLOSEG, DIMGLO, KNOLG, NPOIN)
subroutine fropro(NBOR, IKLE, NELEM, NELMAX, NPOIN, NPMAX, NPTFR, IELM, IKLEM1, LIMVOI, OPTASS, PRODUC, MXPTVS, T1, GLOSEG, SIZGLO, NSEG)
Definition: fropro.f:9
subroutine eleb3d(IKLE3, NBOR, NELBOR, IKLBOR, NELEB, NELEBX, NULONE, NELEM2, NPOIN2, NPLAN, NETAGE, NPTFR)
Definition: eleb3d.f:8
subroutine comp_fac(ELTSEG, ORISEG, IFABOR, NELEM, NPOIN, IFAC)
Definition: comp_fac.f:7
subroutine pttoel(XEL, X, MESH)
Definition: pttoel.f:7
subroutine checkmesh(MESH, NPOIN)
Definition: checkmesh.f:7
subroutine centre_mass_seg(X, Y, COORD_G, IKLE, NPOIN, ELTSEG, ORISEG, NELEM, NSEG, JMI, CMI, GLOSEG, IFABOR, MESH)
subroutine latitu(YDIST, COSLAT, SINLAT, LAMBD0, Y, NPOIN)
Definition: latitu.f:7
subroutine cpstvc(X, Y)
Definition: cpstvc.f:7
subroutine vector(VEC, OP, FORMUL, IELM1, XMUL, F, G, H, U, V, W, MESH, MSK, MASKEL, LEGO, ASSPAR)
Definition: vector.f:7
subroutine infcel(XX, YY, NUBO, VNOIN, NPOIN, NELEM, NSEG, CMI, AIRST, GLOSEG, COORD_G, ELTSEG, ORISEG, IFABOR)
Definition: infcel.f:8
subroutine elebd31(NELBOR, NULONE, IKLBOR, IFABOR, NBOR, IKLE, NELEM, NELEB, NELMAX, NPOIN, NPTFR, IELM)
Definition: elebd31.f:8
subroutine parcom(X, ICOM, MESH)
Definition: parcom.f:7
subroutine veclen(LV, NDP, IKLE, NELEM, NELMAX, NPOIN, V)
Definition: veclen.f:7
subroutine normab(XNEBOR, YNEBOR, XSGBOR, YSGBOR, DISBOR, SURFAC, NELMAX, NELBOR, NULONE, LGSEG, NPTFR, MESH, XEL, YEL, IKLBOR, NELEBX, NELEB)
Definition: normab.f:8
integer function bief_nbmpts(IELM, MESH)
Definition: bief_nbmpts.f:7
subroutine inbief(LIHBOR, KLOG, IT1, IT2, IT3, LVMAC, IELMX, LAMBD0, SPHERI, MESH, T1, T2, OPTASS, PRODUC, EQUA, MESH2D)
Definition: inbief.f:8
subroutine stoseg41(IFABOR, NELMAX, IELM, IKLE, NBOR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NELBOR, NULONE, NELMAX2, NELEM2, NPTFR2, NPOIN2, NPLAN, KNOLG, NSEG2D, IKLBOR, NELEBX, NELEB)
Definition: stoseg41.f:9
subroutine voisin(IFABOR, NELEM, NELMAX, IELM, IKLE, SIZIKL, NPOIN, NACHB, NBOR, NPTFR, IADR, NVOIS)
Definition: voisin.f:8
subroutine eleb3dt(IKLE3, NBOR, NELBOR, NELBOR2D, IKLBOR, NELEB, NELEBX, NULONE, NELEM2, NPOIN2, NPLAN, NETAGE, NPTFR, IKLBOR2D, NELEB2D, NELEBX2D)
Definition: eleb3dt.f:8
integer function bief_nbseg(IELM, MESH)
Definition: bief_nbseg.f:7
subroutine stoseg(IFABOR, NELEM, NELMAX, NELMAX2, IELM, IKLE, NBOR, NPTFR, GLOSEG, MAXSEG, ELTSEG, ORISEG, NSEG, NELBOR, NULONE, KNOLG, IKLBOR, NELEBX, NELEB)
Definition: stoseg.f:9
subroutine elebd(NELBOR, NULONE, KP1BOR, IFABOR, NBOR, IKLE, SIZIKL, IKLBOR, NELEM, NELMAX, NPOIN, NPTFR, IELM, LIHBOR, KLOG, ISEG, T1, T2, T3, NELEBX, NELEB)
Definition: elebd.f:9
subroutine gradp(NS, NT, IKLE, AIRT, X, Y, DPX, DPY)
Definition: gradp.f:7
Definition: bief.f:3