166#include "implicit_f.inc"
170#include "param_c.inc"
171#include "com04_c.inc"
175 INTEGER,
INTENT(IN) :: SMONVOL, LICBAG
176 INTEGER,
DIMENSION(LICBAG),
INTENT(IN) :: ICBAG
177 INTEGER,
DIMENSION(SMONVOL),
INTENT(INOUT) :: MONVOL
182 INTEGER :: II, JJ, KK, I, ICOPY, N
189 shift = shift + nibjet * t_monvol(n)%NJET
190 shift = shift + nibhol * t_monvol(n)%NVENT
196 monvol(i) = t_monvol(ii)%IVOLU(jj)
200 monvol(i:i + licbag - 1) = icbag(1:licbag)
203 DO jj = 1, t_monvol(ii)%NJET
205 monvol(i) = t_monvol(ii)%IBAGJET(kk, jj)
211 nvent = t_monvol(ii)%NVENT
214 monvol(i) = t_monvol(ii)%IBAGHOL(kk, jj)
221 IF (t_monvol(n)%TYPE == 6 .OR. t_monvol(n)%TYPE == 8)
THEN
222 icopy = shift + t_monvol(n)%IADALE
224 DO i = 1, t_monvol(n)%NNS + t_monvol(n)%NNI
225 monvol(icopy) = t_monvol(n)%NODES(i)
228 DO i = 1, t_monvol(n)%NTG + t_monvol(n)%NTGI
229 monvol(icopy) = t_monvol(n)%ELEM(1, i)
231 monvol(icopy) = t_monvol(n)%ELEM(2, i)
233 monvol(icopy) = t_monvol(n)%ELEM(3, i)
236 DO i = 1, t_monvol(n)%NTG + t_monvol(n)%NTGI
237 monvol(icopy) = t_monvol(n)%ITAGEL(i)
240 DO i = 1, t_monvol(n)%NTG + t_monvol(n)%NTGI
241 monvol(icopy) = t_monvol(n)%ELTG(i)
244 DO i = 1, t_monvol(n)%NTG + t_monvol(n)%NTGI
245 monvol(icopy) = t_monvol(n)%MATTG(i)
248 DO i = 1, t_monvol(n)%NBRIC
250 monvol(icopy) = t_monvol(n)%TBRIC(ii, i)
254 DO i = 1, t_monvol(n)%NBRIC
256 monvol(icopy) = t_monvol(n)%TFAC(ii, i)
260 DO i = 1, t_monvol(n)%NTG + 2 * t_monvol(n)%NTGI
261 monvol(icopy) = t_monvol(n)%TAGELS(i)
264 icopy = t_monvol(n)%IADALE8 + shift
265 IF (t_monvol(n)%IADALE8 == 0) icopy = icopy + 1
266 DO i = 1, t_monvol(n)%NNA
267 monvol(icopy) = t_monvol(n)%IBUFA(i)
270 IF (t_monvol(n)%NBRIC == 0)
THEN
271 icopy = t_monvol(n)%IADALE9 + shift
272 IF (t_monvol(n)%IADALE9 == 0) icopy = icopy + 1
274 DO i = 1, t_monvol(n)%NTGA
276 monvol(icopy) = t_monvol(n)%ELEMA(ii, i)
280 DO i = 1, t_monvol(n)%NTGA
281 monvol(icopy) = t_monvol(n)%TAGELA(i)
284 DO i = 1, t_monvol(n)%NBRIC
286 monvol(icopy) = t_monvol(n)%BRNA(ii, i)
290 DO i = 1, t_monvol(n)%NNA
292 monvol(icopy) = t_monvol(n)%NCONA(ii, i)
296 IF (t_monvol(n)%NTGI > 0)
THEN
298 DO i = 1, t_monvol(n)%NTGI + 1
299 monvol(icopy) = t_monvol(n)%THSURF_TAG(jj, i)
429#include "implicit_f.inc"
434#include "com04_c.inc"
436#include "param_c.inc"
438#include "scr17_c.inc"
440#include "units_c.inc"
444 INTEGER,
INTENT(IN) :: ITAB(*)
445 TYPE(
surf_),
INTENT(IN) :: SURF
451 INTEGER :: JJ, NEDGE, NELEM, IEDGE, NODE1, NODE2, INODE
452 INTEGER :: NB_FREE_EDGE
453 INTEGER(8) :: graph_ptr, tri_ptr, tri_ptr_global
454 INTEGER,
DIMENSION(:),
ALLOCATABLE :: FREE_EDGES_ID, FREE_EDGES, LOCAL_NODE_ID, GLOBAL_NODE_ID
455 INTEGER :: NB_CONNECTED_COMPS, TOTAL_SIZE, II
456 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PATHS, SIZES, CYCLES, SHIFT
458 my_real,
DIMENSION(:),
ALLOCATABLE :: node_coord
459 INTEGER,
DIMENSION(:),
ALLOCATABLE :: TRI_LIST
480 nedge = t_monvoln%NEDGE
483 nelem = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
485 nb_free_edge = nb_free_edge + 1
492 IF (nb_free_edge > 0)
THEN
493 ALLOCATE(free_edges_id(nb_free_edge))
494 ALLOCATE(free_edges(2 * nb_free_edge))
495 ALLOCATE(local_node_id(numnod))
496 local_node_id(1:numnod) = 0
500 nelem = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
503 node1 = t_monvoln%EDGE_NODE1(jj)
504 node2 = t_monvoln%EDGE_NODE2(jj)
505 free_edges(2 * (iedge - 1) + 1) = node1
506 free_edges(2 * (iedge - 1) + 2) = node2
507 IF (local_node_id(node1) == 0)
THEN
509 local_node_id(node1) = inode
511 IF (local_node_id(node2) == 0)
THEN
513 local_node_id(node2) = inode
517 ALLOCATE(global_node_id(inode))
519 IF(local_node_id(ii) > 0)
THEN
520 global_node_id(local_node_id(ii)) = ii
524 DO iedge = 1, nb_free_edge
525 free_edges(2 * (iedge - 1) + 1) = local_node_id(free_edges(2 * (iedge - 1) + 1)) - 1
526 free_edges(2 * (iedge - 1) + 2) = local_node_id(free_edges(2 * (iedge - 1) + 2)) - 1
528 CALL graph_build_path(inode, nb_free_edge, free_edges,
529 . nb_connected_comps, graph_ptr)
531 ALLOCATE(sizes(nb_connected_comps), cycles(nb_connected_comps))
532 CALL graph_build_cycles(graph_ptr, cycles)
533 CALL graph_get_sizes(graph_ptr, sizes)
535 ALLOCATE(shift(nb_connected_comps + 1))
537 DO ii = 1, nb_connected_comps
538 shift(ii + 1) = shift(ii) + sizes(ii)
539 total_size = total_size + sizes(ii)
541 ALLOCATE(paths(total_size))
542 CALL graph_get_path(graph_ptr, paths)
543 CALL graph_free_memory(graph_ptr)
545 CALL tab1_init(tri_ptr_global)
547 DO ii = 1, nb_connected_comps
548 IF (cycles(ii) == 0)
THEN
553 ALLOCATE(node_coord(3 * npt))
555 node_coord(3 * (jj - 1) + 1) = x(1, global_node_id(1+paths(jj + shift(ii))))
556 node_coord(3 * (jj - 1) + 2) = x(2, global_node_id(1+paths(jj + shift(ii))))
557 node_coord(3 * (jj - 1) + 3) = x(3, global_node_id(1+paths(jj + shift(ii))))
559 CALL hm_fill_loop(npt, node_coord, ntri, tri_ptr)
560 ALLOCATE(tri_list(3 * ntri))
561 CALL hm_fill_loop_get_tri(tri_list, tri_ptr)
563 tri_list(jj) = global_node_id(1+paths(shift(ii) + tri_list(jj) + 1))
565 CALL tri_free_memory(tri_ptr)
566 CALL tab1_append_tab(tri_ptr_global, 3 * ntri, tri_list)
568 DEALLOCATE(node_coord)
572 CALL tab1_get_size(tri_ptr_global, ntri)
574 t_monvoln%NB_FILL_TRI = ntri / 3
575 ALLOCATE(t_monvoln%FILL_TRI(ntri))
576 WRITE(iout, 1000) nb_free_edge, nb_connected_comps
577 WRITE(iout, 1001) t_monvoln%NB_FILL_TRI
578 CALL tab1_get(tri_ptr_global, t_monvoln%FILL_TRI)
579 CALL tab1_free_memory(tri_ptr_global)
589 nedge = t_monvoln%NEDGE
592 nelem = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
594 nb_free_edge = nb_free_edge + 1
598 IF (nb_free_edge > 0)
THEN
599 CALL ancmsg(msgid = 1875, anmode = aninfo, msgtype = msgwarning,
600 . i1 = t_monvoln%ID, c1 = t_monvoln%TITLE)
601 WRITE(iout, 1002) nb_free_edge
604 IF (nb_free_edge > 0)
THEN
605 CALL ancmsg(msgid = 1875, anmode = aninfo, msgtype = msgwarning,
606 . i1 = t_monvoln%ID, c1 = t_monvoln%TITLE)
607 WRITE(iout, 1002) nb_free_edge
614 IF (
ALLOCATED(free_edges_id))
DEALLOCATE(free_edges_id)
615 IF (
ALLOCATED(free_edges))
DEALLOCATE(free_edges)
616 IF (
ALLOCATED(local_node_id))
DEALLOCATE(local_node_id)
617 IF (
ALLOCATED(global_node_id))
DEALLOCATE(global_node_id)
618 IF (
ALLOCATED(sizes))
DEALLOCATE(sizes)
619 IF (
ALLOCATED(shift))
DEALLOCATE(shift)
620 IF (
ALLOCATED(paths))
DEALLOCATE(paths)
621 IF (
ALLOCATED(cycles))
DEALLOCATE(cycles)
626 . /5x,
'EXTERNAL SURFACE OF THE MONITORED VOLUME IS NOT A CLOSED SURFACE',
627 . /5x,
' NUMBER OF FREE EDGES: ',i10,
628 . /5x,
' NUMBER OF HOLES: ', i10)
630 . 5x,
' ----> AUTOMATIC CLOSURE ACTIVATED'
631 . /5x,
' ----> SURFACE CLOSE WITH: ',i10,
' TRIANGLES')
633 . /5x,
' NUMBER OF REMAINING FREE EDGES: ',i10)
654 . ITAB, NODE_COORD, PM, GEO, IXC, IXTG,
655 . SA, ROT, VOL, VMIN, VEPS, SV)
662 use element_mod ,
only : nixc,nixtg
666#include "implicit_f.inc"
671#include "com04_c.inc"
673#include "param_c.inc"
675#include "scr17_c.inc"
677#include "units_c.inc"
682 CHARACTER(LEN = nchartitle),
INTENT(IN) :: TITLE
683 INTEGER,
INTENT(IN) :: IVOLU(NIMV), ITAB(*), IXC(NIXC, *), IXTG(NIXTG, *)
684 TYPE(
surf_),
INTENT(IN) :: SURF
685 my_real,
INTENT(IN) :: node_coord(3, *), geo(npropg, *), pm(npropm, *)
686 my_real,
INTENT(INOUT) :: sa, rot, vol, vmin, veps, sv
691 INTEGER :: IJET, NN, I1, I2, I3, I4, ISH34
693 my_real :: xx, yy, zz, x13, y13, z13, x24, y24, z24, nx, ny, nz, ds
713 ish34 = surf%ELTYP(j)
716 xx =half*(node_coord(1,i1)+node_coord(1,i2))
717 yy =half*(node_coord(2,i1)+node_coord(2,i2))
718 zz =half*(node_coord(3,i1)+node_coord(3,i2))
720 x13=node_coord(1,i3)-node_coord(1,i1)
721 y13=node_coord(2,i3)-node_coord(2,i1)
722 z13=node_coord(3,i3)-node_coord(3,i1)
723 x24=node_coord(1,i4)-node_coord(1,i2)
724 y24=node_coord(2,i4)-node_coord(2,i2)
725 z24=node_coord(3,i4)-node_coord(3,i2)
726 nx=dir*(y13*z24-y24*z13)
727 ny=dir*(z13*x24-z24*x13)
728 nz=dir*(x13*y24-x24*y13)
729 vol = vol+third*( nx*xx+ny*yy+nz*zz )
733 ds = sqrt(nx*nx+ny*ny+nz*nz)
736 rot = rot + pm(1,ixc(1,i))*geo(1,ixc(6,i))*ds
738 rot = rot + pm(1,ixtg(1,i))*geo(1,ixtg(5,i))*ds
742 DO j = 1, t_monvoln%NB_FILL_TRI
744 i1 = t_monvoln%FILL_TRI(3 * (j - 1) + 1)
745 i2 = t_monvoln%FILL_TRI(3 * (j - 1) + 2)
746 i3 = t_monvoln%FILL_TRI(3 * (j - 1) + 3)
749 xx =half*(node_coord(1,i1)+node_coord(1,i2))
750 yy =half*(node_coord(2,i1)+node_coord(2,i2))
751 zz =half*(node_coord(3,i1)+node_coord(3,i2))
753 x13=node_coord(1,i3)-node_coord(1,i1)
754 y13=node_coord(2,i3)-node_coord(2,i1)
755 z13=node_coord(3,i3)-node_coord(3,i1)
756 x24=node_coord(1,i4)-node_coord(1,i2)
757 y24=node_coord(2,i4)-node_coord(2,i2)
758 z24=node_coord(3,i4)-node_coord(3,i2)
759 nx=dir*(y13*z24-y24*z13)
760 ny=dir*(z13*x24-z24*x13)
761 nz=dir*(x13*y24-x24*y13)
762 vol = vol+third*( nx*xx+ny*yy+nz*zz )
766 ds = sqrt(nx*nx+ny*ny+nz*nz)
772 sv = sqrt(sx*sx+sy*sy+sz*sz)
773 vmin = em4*sa**three_half
774 veps =
max(zero,vmin-abs(vol))
799 use element_mod ,
only : nixc,nixtg
803#include "implicit_f.inc"
804#include "units_c.inc"
805#include "param_c.inc"
806#include "com04_c.inc"
811 INTEGER,
INTENT(IN) :: IHOL, IPRI
812 INTEGER,
INTENT(IN) :: IXC(NIXC, *), IXTG(NIXTG, *)
815 TYPE (SURF_),
DIMENSION(NSURF),
INTENT(IN) :: IGRSURF
819 INTEGER :: ISUR, IPVENT, NN, J
820 my_real :: DIR, XX, YY, ZZ, X13, Y13, Z13, X24, Y24, Z24,
822 INTEGER :: I1, I2, I3, I4, ISH34, CHKSURF, J1, ITY
824 INTEGER :: EXT_SURFID, INT_SURFID, JI, NN1, JI1, ITY1, IVENTYP, ITYPE, NEL
825 CHARACTER (LEN = nchartitle) :: TITR1, TITR2, TITR3
827 itype = t_monvoln%TYPE
828 isur = t_monvoln%IBAGHOL(2, ihol)
829 iventyp = t_monvoln%IBAGHOL(13, ihol)
830 ipvent = igrsurf(isur)%ID
831 IF(iventyp == 0)
THEN
832 titr1=
'VENT HOLE SURFACE'
834 titr1=
'POROUS SURFACE'
837 nn = igrsurf(isur)%NSEG
840 i1 = igrsurf(isur)%NODES(j,1)
841 i2 = igrsurf(isur)%NODES(j,2)
842 i3 = igrsurf(isur)%NODES(j,3)
843 i4 = igrsurf(isur)%NODES(j,4)
844 ish34 = igrsurf(isur)%ELTYP(j)
846 IF(ish34/=3.AND.ish34/=7)
847 .
CALL ancmsg(msgid=18,anmode=aninfo,msgtype=msgerror,i2=igrsurf(isur)%ID,i1=t_monvoln%ID,c1=t_monvoln%TITLE)
848 xx=half*(x(1,i1)+x(1,i2))
849 yy=half*(x(2,i1)+x(2,i2))
850 zz=half*(x(3,i1)+x(3,i2))
857 nx=dir*(y13*z24-y24*z13)
858 ny=dir*(z13*x24-z24*x13)
859 nz=dir*(x13*y24-x24*y13)
860 ds = sqrt(nx*nx+ny*ny+nz*nz)
867 nn =igrsurf(isur)%NSEG
868 ext_surfid = t_monvoln%EXT_SURFID
870 ji =igrsurf(isur)%ELEM(j)
871 ity=igrsurf(isur)%ELTYP(j)
872 IF(ity == 7) ji=ji+numelc
873 nn1 =igrsurf(ext_surfid)%NSEG
877 ji1 =igrsurf(ext_surfid)%ELEM(j1)
878 ity1=igrsurf(ext_surfid)%ELTYP(j1)
879 IF(ity1 == 7) ji1=ji1+numelc
885 IF (.NOT. found)
THEN
886 int_surfid = t_monvoln%IVOLU(67)
887 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
888 nn1 =igrsurf(int_surfid)%NSEG
891 ji1 =igrsurf(int_surfid)%ELEM(j1)
892 ity1=igrsurf(int_surfid)%ELTYP(j1)
893 IF(ity1 == 7) ji1=ji1+numelc
901 IF(.NOT. found) chksurf = chksurf+1
902 IF (ipri >= 5.AND..NOT. found)
THEN
903 IF(chksurf == 1)
THEN
904 titr2 = igrsurf(isur)%TITLE
905 titr3 = igrsurf(ext_surfid)%TITLE
906 CALL ancmsg(msgid=41,anmode=aninfo,msgtype=msgerror,
908 . c1=t_monvoln%TITLE,
913 . i3=igrsurf(ext_surfid)%ID,
915 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
916 titr3 = igrsurf(int_surfid)%TITLE
917 CALL ancmsg(msgid=41,anmode=aninfo,msgtype=msgerror,
919 . c1=t_monvoln%TITLE,
921 . i2=igrsurf(isur)%ID,
924 . i3=igrsurf(int_surfid)%ID,
930 WRITE(iout,1486) nel,trim(titr1),ipvent
932 nel=ixtg(nixtg,ji-numelc)
933 WRITE(iout,1487) nel,trim(titr1),ipvent
938 IF (chksurf > 0)
THEN
939 CALL ancmsg(msgid=903,anmode=aninfo,msgtype=msgerror,
940 . i2=igrsurf(isur)%ID,i3=igrsurf(ext_surfid)%ID,
941 . i1=t_monvoln%ID,c1=t_monvoln%TITLE,c2=titr1)
942 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
943 CALL ancmsg(msgid=903,anmode=aninfo,msgtype=msgerror,
944 . i2=igrsurf(isur)%ID,i3=igrsurf(int_surfid)%ID,
945 . i1=t_monvoln%ID,c1=t_monvoln%TITLE,c2=titr1)
949 1486
FORMAT(6x,
'SHELL ELEMENT ID=',i10,
' OF ',a17,1x,i10,
' DOES NOT BELONG TO THE AIRBAG SURFACE')
950 1487
FORMAT(6x,
'SH3N ELEMENT ID=',i10,
' OF ',a17,1x,i10,
' DOES NOT BELONG TO THE AIRBAG SURFACE')
962#include "implicit_f.inc"
963#include "param_c.inc"
967 INTEGER,
INTENT(IN) :: NVOLU
968 TYPE(MONVOL_STRUCT_),
DIMENSION(NVOLU),
INTENT(INOUT) :: T_MONVOL
977 t_monvol(1:nvolu)%TYPE = 0
978 t_monvol(1:nvolu)%ID = 0
979 t_monvol(1:nvolu)%NCA = 0
980 t_monvol(1:nvolu)%EXT_SURFID = 0
981 t_monvol(1:nvolu)%INT_SURFID = 0
982 t_monvol(1:nvolu)%NJET = 0
983 t_monvol(1:nvolu)%NVENT = 0
984 t_monvol(1:nvolu)%NPORSURF = 0
985 t_monvol(1:nvolu)%NNS = 0
986 t_monvol(1:nvolu)%NNI = 0
987 t_monvol(1:nvolu)%NTG = 0
988 t_monvol(1:nvolu)%NTGI = 0
989 t_monvol(1:nvolu)%NBRIC = 0
990 t_monvol(1:nvolu)%NNA = 0
991 t_monvol(1:nvolu)%NTGA = 0
992 t_monvol(1:nvolu)%IMESH_ALL = 0
993 t_monvol(1:nvolu)%KMESH = 0
994 t_monvol(1:nvolu)%NB_FILL_TRI = 0
995 t_monvol(1:nvolu)%NEDGE = 0
996 t_monvol(1:nvolu)%IADALE = 0
997 t_monvol(1:nvolu)%IADALE2 = 0
998 t_monvol(1:nvolu)%IADALE3 = 0
999 t_monvol(1:nvolu)%IADALE4 = 0
1000 t_monvol(1:nvolu)%IADALE5 = 0
1001 t_monvol(1:nvolu)%IADALE6 = 0
1002 t_monvol(1:nvolu)%IADALE7 = 0
1003 t_monvol(1:nvolu)%IADALE8 = 0
1004 t_monvol(1:nvolu)%IADALE9 = 0
1005 t_monvol(1:nvolu)%IADALE10 = 0
1006 t_monvol(1:nvolu)%IADALE11 = 0
1007 t_monvol(1:nvolu)%IADALE12 = 0
1008 t_monvol(1:nvolu)%IADALE13 = 0
1009 t_monvol(1:nvolu)%KRA5 = 0
1010 t_monvol(1:nvolu)%KRA6 = 0
1011 t_monvol(1:nvolu)%KR5 = 0
1014 t_monvol_metadata%NVOLU = nvolu
1015 ALLOCATE(t_monvol_metadata%ICBAG(nicbag, nvolu * nvolu))
1016 ALLOCATE(t_monvol_metadata%RCBAG(nrcbag, nvolu * nvolu))
1017 t_monvol_metadata%RCBAG(:, :) = zero
1018 t_monvol_metadata%ICBAG(:, :) = 0
1020 ALLOCATE(t_monvol(ii)%IVOLU(nimv))
1021 t_monvol(ii)%IVOLU(1:nimv) = 0
1022 ALLOCATE(t_monvol(ii)%RVOLU(nrvolu))
1023 t_monvol(ii)%RVOLU(1:nrvolu) = zero
1024 t_monvol(ii)%NVENT = 0
1025 t_monvol(ii)%NPORSURF = 0
1026 t_monvol(ii)%EXT_SURFID = 0
1027 t_monvol(ii)%INT_SURFID = 0
1028 t_monvol(ii)%NCA = 0
1029 t_monvol(ii)%KR5 = 0
1030 t_monvol(ii)%KRA5 = 0
1031 t_monvol(ii)%EDGES_BUILT = .false.
1032 t_monvol(ii)%NB_FILL_TRI = 0
1033 t_monvol(ii)%OK_REORIENT = .true.
1112 use element_mod ,
only : nixc,nixtg
1173#include "implicit_f.inc"
1177#include "param_c.inc"
1178#include "com04_c.inc"
1182 CHARACTER(LEN = nchartitle)INTENT(IN) ::
1183 INTEGER,
INTENT(IN)), ITAB(*),ITYPE, IXC(NIXC, NUMELC), IXTG(NIXTG, NUMELTG)
1185 TYPE(
surf_),
INTENT(INOUT) ::
1190 INTEGER NSEG,ISH34,JJ,II(4),KK, IELEM_ADJ,IDX,IDX_A,IDX_B,IPAIR,NPAIR,LL
1192 INTEGER NEDG, SUM_ADJ
1194 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: PATHS, SIZES, CHECK_FLAG_ELEM,
1195 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: db_reversed, db_path
1196 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PAIR_LIST, NB_PAIR_BY_EDGE
1197 INTEGER :: NB_NOEUD, NB_ARC, NB_COMP_CONNEXE,
1198 INTEGER(8) :: graph_ptr
1199 INTEGER :: IELEM,ICOMP, EDGES_A(5),EDGES_B(5), NB_REVERSED
1200 INTEGER :: NPT_A, NPT_B, IELEM1, IELEM2, ELTYP1, ELTYP2, NB_COMMON_NODE,
1201 . nodelist1(4), nodelist2(4), elem1id, elem2id, elemtg, elemc, ielemtg, ielemc
1202 LOGICAL :: lFOUND, lFOUND_ADJ
1203 INTEGER :: NB_DUPLICATED_ELTS
1204 INTEGER,
DIMENSION(:),
ALLOCATABLE :: DUPLICATED_ELTS
1205 CHARACTER(LEN=1024) ::
1206 INTEGER(8) :: duplicate_ptr
1208 INTEGER :: NTRI, NB_CON
1209 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IAD_COMP_CONNEX
1224 ntri = t_monvoln%NB_FILL_TRI
1225 t_monvoln%OK_REORIENT = .true.
1231 IF (.NOT. t_monvoln%EDGES_BUILT)
THEN
1234 nedg = t_monvoln%NEDGE
1240 nb_duplicated_elts = 0
1242 CALL tab1_init(duplicate_ptr)
1244 nb_con = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
1245 IF (nb_con > 2)
THEN
1247 DO ielem1 = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM(jj + 1) - 1
1248 IF (t_monvoln%EDGE_ELEM(ielem1) /= 0)
THEN
1249 DO ielem2 = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM
1250 IF (ielem1 /= ielem2)
THEN
1251 elem1id = t_monvoln%EDGE_ELEM(ielem1)
1252 elem2id = t_monvoln%EDGE_ELEM(ielem2)
1253 IF (elem1id * elem2id == 0)
THEN
1258 eltyp1 = surf%ELTYP(elem1id)
1259 eltyp2 = surf%ELTYP(elem2id)
1260 IF (eltyp1 == eltyp2)
THEN
1261 IF (eltyp1 == 7)
THEN
1264 nodelist1(1:4) = (/0, ixtg(2:4,surf%ELEM(elem1id))/)
1265 nodelist2(1:4) = (/0, ixtg(2:4,surf%ELEM(elem2id))/)
1268 IF (nodelist1(kk) == nodelist2(ll))
THEN
1269 nb_common_node = nb_common_node + 1
1274 IF (nb_common_node == 3)
THEN
1276 t_monvoln%EDGE_ELEM(ielem2) = 0
1277 nb_duplicated_elts = nb_duplicated_elts + 1
1278 CALL tab1_append(duplicate_ptr, elem1id)
1279 CALL tab1_append(duplicate_ptr, elem2id)
1282 ELSEIF (eltyp1 == 3)
THEN
1285 nodelist1(1:4) = (/ixc(2:5,surf%ELEM(elem1id))/)
1286 nodelist2(1:4) = (/ixc(2:5,surf%ELEM(elem2id))/)
1289 IF (nodelist1(kk) == nodelist2(ll))
THEN
1290 nb_common_node = nb_common_node + 1
1295 IF (nb_common_node == 4)
THEN
1297 t_monvoln%EDGE_ELEM(ielem2) = 0
1298 nb_duplicated_elts = nb_duplicated_elts + 1
1299 CALL tab1_append(duplicate_ptr, elem1id)
1300 CALL tab1_append(duplicate_ptr, elem2id)
1308 IF (eltyp1 == 7)
THEN
1315 nodelist1(1:4) = (/0, ixtg(2:4,surf%ELEM(elemtg))/)
1316 nodelist2(1:4) = (/ixc(2:5,surf%ELEM(elemc))/)
1319 IF (nodelist1(kk) == nodelist2(ll))
THEN
1320 nb_common_node = nb_common_node + 1
1325 IF (nb_common_node == 3)
THEN
1327 t_monvoln%EDGE_ELEM(ielemtg) = 0
1328 nb_duplicated_elts = nb_duplicated_elts + 1
1329 CALL tab1_append(duplicate_ptr, elemc)
1330 CALL tab1_append(duplicate_ptr, ielemtg)
1344 ALLOCATE(nb_pair_by_edge(nedg))
1346 nb_pair_by_edge(jj) = 0
1347 DO kk = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM(jj + 1) - 1
1348 IF (t_monvoln%EDGE_ELEM(kk) /= 0)
THEN
1349 nb_pair_by_edge(jj) = nb_pair_by_edge(jj) + 1
1352 nb_pair_by_edge(jj) = (nb_pair_by_edge(jj) - 1) * nb_pair_by_edge(jj) / 2
1353 IF (nb_pair_by_edge(jj) > 1)
THEN
1354 t_monvoln%OK_REORIENT = .false.
1357 npair = sum(nb_pair_by_edge)
1358 ALLOCATE(pair_list(2 * npair))
1361 nb_con = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
1363 DO ll = kk + 1, nb_con
1364 elem1id = t_monvoln%EDGE_ELEM(t_monvoln%IAD_EDGE_ELEM(jj) + kk - 1)
1365 elem2id = t_monvoln%EDGE_ELEM(t_monvoln%IAD_EDGE_ELEM(jj) + ll - 1)
1366 IF (elem1id .NE.0 .AND. elem2id .NE. 0)
THEN
1367 pair_list(ipair + 1) = elem1id - 1
1368 pair_list(ipair + 2) = elem2id - 1
1383 CALL graph_build_path(nb_noeud, nb_arc, pair_list, nb_comp_connexe, graph_ptr)
1390 IF(.NOT.
ALLOCATED(sizes))
ALLOCATE(sizes(0:nb_comp_connexe))
1391 ALLOCATE(iad_comp_connex(nb_comp_connexe+1))
1392 CALL graph_get_sizes(graph_ptr, sizes(1))
1393 sum_sizes=sum(sizes(1:nb_comp_connexe),1)
1395 iad_comp_connex(1) = 1
1396 DO jj = 2, nb_comp_connexe + 1
1397 iad_comp_connex(jj) = iad_comp_connex(jj - 1) + sizes(jj - 1)
1399 IF(.NOT.
ALLOCATED(paths))
ALLOCATE(paths(sum_sizes))
1400 CALL graph_get_path(graph_ptr, paths)
1405 debug_output=.false.
1467 IF(.NOT.
ALLOCATED(nb_adj))
ALLOCATE(nb_adj(nseg+ntri))
1468 IF(.NOT.
ALLOCATED(iad_adj))
ALLOCATE(iad_adj(nseg+ntri+1))
1469 CALL graph_get_nb_adj(graph_ptr, nb_adj)
1473 iad_adj(kk)=iad_adj(kk-1)+nb_adj(kk-1)
1475 IF(.NOT.
ALLOCATED(list_adj_tab))
ALLOCATE(list_adj_tab(sum_adj))
1476 CALL graph_get_adj(graph_ptr, list_adj_tab)
1478 list_adj_tab(kk)=list_adj_tab(kk)+1
1484 debug_output=.false.
1485 if(debug_output)
then
1487 WRITE(filename,
"(A,I0,A)")
"surfmesh_before_",t_monvoln%ID,
"_0000.rad"
1488 OPEN(unit = 210486, file = trim(filename), form =
'formatted')
1489 WRITE(210486,
'(A)')
"#RADIOSS STARTER"
1490 WRITE(210486,
'(A)')
"/BEGIN"
1491 WRITE(210486,
'(A)')
"ORIENTED_SURFACE "
1492 WRITE(210486,
'(A)')
" 100 0"
1493 WRITE(210486,
'(A)')
" g mm ms"
1494 WRITE(210486,
'(A)')
" g mm ms"
1495 WRITE(210486,
"(A5)")
"/NODE"
1497 WRITE(210486,
"(I10, 1PG20.13, 1PG20.13, 1PG20.13)") itab(kk),x(1, kk), x(2, kk), x(3, kk)
1500 ii(1:4) = surf%NODES(kk,1:4)
1501 ish34 = surf%ELTYP(kk)
1502 IF (ish34 == 3)
THEN
1503 WRITE(210486,
"(A6)")
"/SHELL"
1504 WRITE(210486,
'(I10,I10,I10,I10,I10)') ixc(7,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3)), itab(ii(4))
1508 ii(1:4) = surf%NODES(kk,1:4)
1509 ish34 = surf%ELTYP(kk)
1510 IF (ish34 == 7)
THEN
1511 WRITE(210486,
"(A5)")
"/SH3N"
1512 WRITE(210486,
'(I10,I10,I10,I10)') ixtg(6,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3))
1515 IF (t_monvoln%NB_FILL_TRI > 0)
THEN
1516 WRITE(210486,
"(A5)")
"/SH3N"
1518 DO kk = 1, t_monvoln%NB_FILL_TRI
1519 WRITE(210486,
'(I10,I10,I10,I10)') kk + nseg, itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 1)),
1520 . itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 2)), itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 3))
1529 IF(.NOT.
ALLOCATED(check_flag_elem))
ALLOCATE(check_flag_elem(nseg+ntri))
1530 check_flag_elem(:)=0
1532 IF (t_monvoln%OK_REORIENT)
THEN
1533 DO icomp=1,nb_comp_connexe
1536 jj = 1 + paths(iad_comp_connex(icomp))
1538 check_flag_elem(jj)=1
1541 DO ielem=iad_comp_connex(icomp) + 1, iad_comp_connex(icomp + 1) - 1
1546 IF (jj <= nseg)
THEN
1547 ii(1:4) = surf%NODES(jj,1:4)
1548 ish34 = surf%ELTYP(jj)
1549 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1550 edges_a(1:5)=(/ ii(1:4), ii(1) /)
1553 edges_a(1:5)=(/ ii(1:3), ii(1), 0 /)
1557 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) + 3)
1559 edges_a(1:5) = (/ ii(1:3), ii(1), 0 /)
1566 idx2 = iad_adj(jj+1)-1
1567 lfound_adj = .false.
1569 ielem_adj = list_adj_tab(kk)
1570 IF(check_flag_elem(ielem_adj) /= 0 )
THEN
1575 IF(.NOT. lfound_adj)
THEN
1576 print *,
"**error when forcing monvol surface orientation"
1584 IF (kk <= nseg)
THEN
1585 ii(1:4) = surf%NODES(kk,1:4)
1586 ish34 = surf%ELTYP(kk)
1587 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1588 edges_b(1:5)=(/ ii(1:4), ii(1) /)
1591 edges_b(1:5)=(/ ii(1:3), ii(1), 0 /)
1595 ii(1:3) = t_monvoln%FILL_TRI(3 * (kk - nseg - 1) + 1 : 3 * (kk - nseg - 1) + 3)
1597 edges_b(1:5) = (/ ii(1:3), ii(1), 0 /)
1605 IF(edges_b(idx_b)==edges_a(idx_a))
THEN
1606 IF(edges_b(idx_b+1)==edges_a(idx_a+1))
THEN
1617 IF (jj <= nseg)
THEN
1618 ii(1:4) = surf%NODES(jj,1:4)
1620 surf%NODES(jj,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1622 surf%NODES(jj,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1625 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) + 3)
1627 t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) + 3) = (/ ii(2), ii(1), ii(3) /)
1630 nb_reversed = nb_reversed + 1
1631 check_flag_elem(jj)=-1
1635 check_flag_elem(jj)=1
1636 IF(lfound)check_flag_elem(jj)=-1
1641 CALL ancmsg(msgid = 1882, anmode = aninfo, msgtype = msgwarning,
1642 . i1 = t_monvoln%ID, c1 = t_monvoln%TITLE)
1648 ALLOCATE(duplicated_elts(nb_duplicated_elts * 2))
1649 CALL tab1_get(duplicate_ptr, duplicated_elts)
1650 DO jj = 1, nb_duplicated_elts
1651 elem1id = surf%ELEM(duplicated_elts(2 * (jj - 1) + 1))
1652 elem2id = surf%ELEM(duplicated_elts(2 * (jj - 1) + 2))
1654 eltyp1 = surf%ELTYP(duplicated_elts(2 * (jj - 1) + 1))
1655 eltyp2 = surf%ELTYP(duplicated_elts(2 * (jj - 1) + 2))
1656 IF (eltyp1 == eltyp2)
THEN
1657 ii(1:4) = surf%NODES(elem1id, 1:4)
1658 IF (eltyp1 == 7)
THEN
1660 surf%NODES(elem2id, 1:4) = (/ ii(2), ii(1), ii(3), ii(4) /)
1663 surf%NODES(elem2id, 1:4) = (/ ii(1), ii(4), ii(3), ii(2) /)
1667 ii(1:4) = surf%NODES(elem2id,1:4)
1668 edges_a(1:5) = (/ ii(1:3), ii(1), 0 /)
1670 ii(1:4) = surf%NODES(elem1id,1:4)
1671 edges_b(1:5) = (/ ii(1:4), ii(1) /)
1677 IF(edges_b(idx_b)==edges_a(idx_a))
THEN
1678 IF(edges_b(idx_b+1)==edges_a(idx_a+1))
THEN
1687 ii(1:4) = surf%NODES(elem2id, 1:4)
1689 surf%NODES(elem2id,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1691 surf%NODES(elem2id,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1696 CALL tab1_free_memory(duplicate_ptr)
1702 debug_output=.false.
1703 if(debug_output)
then
1705 ALLOCATE(db_path(sizes(icomp)))
1706 do ielem=1,sizes(icomp)
1708 ii(1:4) = surf%NODES(jj,1:4)
1709 ish34 = surf%ELTYP(jj)
1710 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1711 db_path(jj) = ixc(7,surf%ELEM((jj)))
1713 db_path(jj) = ixtg(6,surf%ELEM((jj)))
1716 print *,
"____________________________________________________"
1717 print *,
"there are ",sizes(icomp),
" elements along the path"
1718 print *, db_path(1:sizes(icomp))
1719 print *,
"____________________________________________________"
1723 debug_output=.false.
1724 if(debug_output)
then
1727 ALLOCATE(db_reversed(sizes(icomp)))
1728 do ielem=1,sizes(icomp)
1730 ii(1:4) = surf%NODES(jj,1:4)
1731 ish34 = surf%ELTYP(jj)
1732 IF(check_flag_elem(jj)==-1)
THEN
1734 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1735 db_reversed(idx) = ixc(7,surf%ELEM((jj)))
1737 db_reversed(idx) = ixtg(6,surf%ELEM((jj)))
1741 print *,
"there were ",nb_reversed,
" element(s) reversed along the path"
1742 print *, db_reversed(1:nb_reversed)
1743 print *,
"____________________________________________________"
1744 DEALLOCATE(db_reversed)
1750 IF(
ALLOCATED(nb_adj))
DEALLOCATE(nb_adj)
1751 IF(
ALLOCATED(iad_adj))
DEALLOCATE(iad_adj)
1752 IF(
ALLOCATED(check_flag_elem))
DEALLOCATE(check_flag_elem)
1753 IF(
ALLOCATED(list_adj_tab))
DEALLOCATE(list_adj_tab)
1754 IF(
ALLOCATED(paths))
DEALLOCATE(paths)
1755 IF(
ALLOCATED(sizes))
DEALLOCATE(sizes)
1756 IF(
ALLOCATED(duplicated_elts))
DEALLOCATE(duplicated_elts)
1757 IF(
ALLOCATED(pair_list))
DEALLOCATE(pair_list)
1758 IF(
ALLOCATED(nb_pair_by_edge))
DEALLOCATE(nb_pair_by_edge)
1759 IF (
ALLOCATED(iad_comp_connex))
DEALLOCATE(iad_comp_connex)
1760 CALL graph_free_memory(graph_ptr)
1795 use element_mod ,
only : nixc,nixtg
1799#include "implicit_f.inc"
1803#include "param_c.inc"
1804#include "com04_c.inc"
1808 CHARACTER(LEN = nchartitle),
INTENT(IN) :: TITLE
1809 INTEGER,
INTENT(IN) :: IVOLU(NIMV), ITAB(*), ITYPE
1810 TYPE(
surf_),
INTENT(INOUT) :: SURF
1812 my_real,
INTENT(IN) :: x(3,numnod)
1813 INTEGER,
INTENT(IN) :: IXC(NIXC, NUMELC), IXTG(NIXTG, NUMELTG)
1818 INTEGER JJ,ISH34,II(4),KK,NSEG
1819 CHARACTER(LEN=1024) :: FILENAME
1820 LOGICAL debug_output
1830 IF (.NOT. t_monvoln%OK_REORIENT)
RETURN
1836 ish34 = surf%ELTYP(jj)
1837 ii(1:4) = surf%NODES(jj,1:4)
1840 surf%NODES(jj,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1841 ELSEIF(ish34 == 7)
THEN
1843 surf%NODES(jj,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1846 DO jj = 1, t_monvoln%NB_FILL_TRI
1847 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - 1) + 1 : 3 * (jj - 1) + 3)
1849 t_monvoln%FILL_TRI(3 * (jj - 1) + 1 : 3 * (jj - 1) + 3) = (/ ii(2), ii(1), ii(3) /)
1857 debug_output=.false.
1858 if(debug_output)
then
1860 WRITE(filename,
"(A,I0,A)")
"surfmesh_after_",t_monvoln%ID,
"_0000.rad"
1861 OPEN(unit = 210486, file = trim(filename), form =
'formatted')
1862 WRITE(210486,
'(A)')
"#RADIOSS STARTER"
1863 WRITE(210486,
'(A)')
"/BEGIN"
1864 WRITE(210486,
'(A)')
"ORIENTED_SURFACE "
1865 WRITE(210486,
'(A)')
" 100 0"
1866 WRITE(210486,
'(A)')
" g mm ms"
1867 WRITE(210486,
'(A)')
" g mm ms"
1868 WRITE(210486,
"(A5)")
"/NODE"
1870 WRITE(210486,
"(I10, 1PG20.13, 1PG20.13, 1PG20.13)") itab(kk),x(1, kk), x(2, kk), x(3, kk)
1873 ii(1:4) = surf%NODES(kk,1:4)
1874 ish34 = surf%ELTYP(kk)
1875 IF (ish34 == 3)
THEN
1876 WRITE(210486,
"(A6)")
"/SHELL"
1877 WRITE(210486,
'(I10,I10,I10,I10,I10)') ixc(7,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3)), itab(ii(4))
1881 ii(1:4) = surf%NODES(kk,1:4)
1882 ish34 = surf%ELTYP(kk)
1883 IF (ish34 == 7)
THEN
1884 WRITE(210486,
"(A5)")
"/SH3N"
1885 WRITE(210486,
'(I10,I10,I10,I10)') ixtg(6,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3))
1888 IF (t_monvoln%NB_FILL_TRI > 0)
THEN
1889 WRITE(210486,
"(A5)")
"/SH3N"
1891 DO kk = 1, t_monvoln%NB_FILL_TRI
1892 WRITE(210486,
'(I10,I10,I10,I10)') kk + nseg, itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 1)),
1893 . itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 2)), itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 3))