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)
665#include "implicit_f.inc"
670#include "com04_c.inc"
672#include "param_c.inc"
674#include "scr17_c.inc"
676#include "units_c.inc"
681 CHARACTER(LEN = nchartitle),
INTENT(IN) :: TITLE
682 INTEGER,
INTENT(IN) :: IVOLU(NIMV), ITAB(*), IXC(NIXC, *), IXTG(NIXTG, *)
683 TYPE(
surf_),
INTENT(IN) :: SURF
684 my_real,
INTENT(IN) :: node_coord(3, *), geo(npropg, *), pm(npropm, *)
685 my_real,
INTENT(INOUT) :: sa, rot, vol, vmin, veps, sv
690 INTEGER :: IJET, NN, I1, I2, I3, I4, ISH34
692 my_real :: xx, yy, zz, x13, y13, z13, x24, y24, z24, nx, ny, nz, ds
712 ish34 = surf%ELTYP(j)
715 xx =half*(node_coord(1,i1)+node_coord(1,i2))
716 yy =half*(node_coord(2,i1)+node_coord(2,i2))
717 zz =half*(node_coord(3,i1)+node_coord(3,i2))
719 x13=node_coord(1,i3)-node_coord(1,i1)
720 y13=node_coord(2,i3)-node_coord(2,i1)
721 z13=node_coord(3,i3)-node_coord(3,i1)
722 x24=node_coord(1,i4)-node_coord(1,i2)
723 y24=node_coord(2,i4)-node_coord(2,i2)
724 z24=node_coord(3,i4)-node_coord(3,i2)
725 nx=dir*(y13*z24-y24*z13)
726 ny=dir*(z13*x24-z24*x13)
727 nz=dir*(x13*y24-x24*y13)
728 vol = vol+third*( nx*xx+ny*yy+nz*zz )
732 ds = sqrt(nx*nx+ny*ny+nz*nz)
735 rot = rot + pm(1,ixc(1,i))*geo(1,ixc(6,i))*ds
737 rot = rot + pm(1,ixtg(1,i))*geo(1,ixtg(5,i))*ds
741 DO j = 1, t_monvoln%NB_FILL_TRI
743 i1 = t_monvoln%FILL_TRI(3 * (j - 1) + 1)
744 i2 = t_monvoln%FILL_TRI(3 * (j - 1) + 2)
745 i3 = t_monvoln%FILL_TRI(3 * (j - 1) + 3)
748 xx =half*(node_coord(1,i1)+node_coord(1,i2))
749 yy =half*(node_coord(2,i1)+node_coord(2,i2))
750 zz =half*(node_coord(3,i1)+node_coord(3,i2))
752 x13=node_coord(1,i3)-node_coord(1,i1)
753 y13=node_coord(2,i3)-node_coord(2,i1)
754 z13=node_coord(3,i3)-node_coord(3,i1)
755 x24=node_coord(1,i4)-node_coord(1,i2)
756 y24=node_coord(2,i4)-node_coord(2,i2)
757 z24=node_coord(3,i4)-node_coord(3,i2)
758 nx=dir*(y13*z24-y24*z13)
759 ny=dir*(z13*x24-z24*x13)
760 nz=dir*(x13*y24-x24*y13)
761 vol = vol+third*( nx*xx+ny*yy+nz*zz )
765 ds = sqrt(nx*nx+ny*ny+nz*nz)
771 sv = sqrt(sx*sx+sy*sy+sz*sz)
772 vmin = em4*sa**three_half
773 veps =
max(zero,vmin-abs(vol))
801#include "implicit_f.inc"
802#include "units_c.inc"
803#include "param_c.inc"
804#include "com04_c.inc"
809 INTEGER,
INTENT(IN) :: IHOL, IPRI
810 INTEGER,
INTENT(IN) :: IXC(NIXC, *), IXTG(NIXTG, *)
813 TYPE (SURF_),
DIMENSION(NSURF),
INTENT(IN) :: IGRSURF
817 INTEGER :: ISUR, IPVENT, NN, J
818 my_real :: DIR, XX, YY, ZZ, X13, Y13, Z13, X24, Y24, Z24,
820 INTEGER :: I1, I2, I3, I4, ISH34, CHKSURF, J1, ITY
822 INTEGER :: EXT_SURFID, INT_SURFID, JI, NN1, JI1, ITY1, IVENTYP, ITYPE, NEL
823 CHARACTER (LEN = nchartitle) :: TITR1, TITR2, TITR3
825 itype = t_monvoln%TYPE
826 isur = t_monvoln%IBAGHOL(2, ihol)
827 iventyp = t_monvoln%IBAGHOL(13, ihol)
828 ipvent = igrsurf(isur)%ID
829 IF(iventyp == 0)
THEN
830 titr1=
'VENT HOLE SURFACE'
832 titr1=
'POROUS SURFACE'
835 nn = igrsurf(isur)%NSEG
838 i1 = igrsurf(isur)%NODES(j,1)
839 i2 = igrsurf(isur)%NODES(j,2)
840 i3 = igrsurf(isur)%NODES(j,3)
841 i4 = igrsurf(isur)%NODES(j,4)
842 ish34 = igrsurf(isur)%ELTYP(j)
844 IF(ish34/=3.AND.ish34/=7)
845 .
CALL ancmsg(msgid=18,anmode=aninfo,msgtype=msgerror,i2=igrsurf(isur)%ID,i1=t_monvoln%ID,c1=t_monvoln%TITLE)
846 xx=half*(x(1,i1)+x(1,i2))
847 yy=half*(x(2,i1)+x(2,i2))
848 zz=half*(x(3,i1)+x(3,i2))
855 nx=dir*(y13*z24-y24*z13)
856 ny=dir*(z13*x24-z24*x13)
857 nz=dir*(x13*y24-x24*y13)
858 ds = sqrt(nx*nx+ny*ny+nz*nz)
865 nn =igrsurf(isur)%NSEG
866 ext_surfid = t_monvoln%EXT_SURFID
868 ji =igrsurf(isur)%ELEM(j)
869 ity=igrsurf(isur)%ELTYP(j)
870 IF(ity == 7) ji=ji+numelc
871 nn1 =igrsurf(ext_surfid)%NSEG
875 ji1 =igrsurf(ext_surfid)%ELEM(j1)
876 ity1=igrsurf(ext_surfid)%ELTYP(j1)
877 IF(ity1 == 7) ji1=ji1+numelc
883 IF (.NOT. found)
THEN
884 int_surfid = t_monvoln%IVOLU(67)
885 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
886 nn1 =igrsurf(int_surfid)%NSEG
889 ji1 =igrsurf(int_surfid)%ELEM(j1)
890 ity1=igrsurf(int_surfid)%ELTYP(j1)
891 IF(ity1 == 7) ji1=ji1+numelc
899 IF(.NOT. found) chksurf = chksurf+1
900 IF (ipri >= 5.AND..NOT. found)
THEN
901 IF(chksurf == 1)
THEN
902 titr2 = igrsurf(isur)%TITLE
903 titr3 = igrsurf(ext_surfid)%TITLE
904 CALL ancmsg(msgid=41,anmode=aninfo,msgtype=msgerror,
906 . c1=t_monvoln%TITLE,
908 . i2=igrsurf(isur)%ID,
911 . i3=igrsurf(ext_surfid)%ID,
913 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
914 titr3 = igrsurf(int_surfid)%TITLE
915 CALL ancmsg(msgid=41,anmode=aninfo,msgtype=msgerror,
917 . c1=t_monvoln%TITLE,
919 . i2=igrsurf(isur)%ID,
922 . i3=igrsurf(int_surfid)%ID,
928 WRITE(iout,1486) nel,trim(titr1),ipvent
930 nel=ixtg(nixtg,ji-numelc)
931 WRITE(iout,1487) nel,trim(titr1),ipvent
936 IF (chksurf > 0)
THEN
937 CALL ancmsg(msgid=903,anmode=aninfo,msgtype=msgerror,
938 . i2=igrsurf(isur)%ID,i3=igrsurf(ext_surfid)%ID,
939 . i1=t_monvoln%ID,c1=t_monvoln%TITLE,c2=titr1)
940 IF((itype == 8 .OR. itype == 11) .AND. int_surfid > 0 .AND. iventyp == 1)
THEN
941 CALL ancmsg(msgid=903,anmode=aninfo,msgtype=msgerror,
942 . i2=igrsurf(isur)%ID,i3=igrsurf(int_surfid)%ID,
943 . i1=t_monvoln%ID,c1=t_monvoln%TITLE,c2=titr1)
947 1486
FORMAT(6x,
'SHELL ELEMENT ID=',i10,
' OF ',a17,1x,i10,
' DOES NOT BELONG TO THE AIRBAG SURFACE')
948 1487
FORMAT(6x,
'SH3N ELEMENT ID=',i10,
' OF ',a17,1x,i10,
' DOES NOT BELONG TO THE AIRBAG SURFACE')
960#include "implicit_f.inc"
961#include "param_c.inc"
965 INTEGER,
INTENT(IN) :: NVOLU
966 TYPE(MONVOL_STRUCT_),
DIMENSION(NVOLU),
INTENT(INOUT) :: T_MONVOL
975 t_monvol(1:nvolu)%TYPE = 0
976 t_monvol(1:nvolu)%ID = 0
977 t_monvol(1:nvolu)%NCA = 0
978 t_monvol(1:nvolu)%EXT_SURFID = 0
979 t_monvol(1:nvolu)%INT_SURFID = 0
980 t_monvol(1:nvolu)%NJET = 0
981 t_monvol(1:nvolu)%NVENT = 0
982 t_monvol(1:nvolu)%NPORSURF = 0
983 t_monvol(1:nvolu)%NNS = 0
984 t_monvol(1:nvolu)%NNI = 0
985 t_monvol(1:nvolu)%NTG = 0
986 t_monvol(1:nvolu)%NTGI = 0
987 t_monvol(1:nvolu)%NBRIC = 0
988 t_monvol(1:nvolu)%NNA = 0
989 t_monvol(1:nvolu)%NTGA = 0
990 t_monvol(1:nvolu)%IMESH_ALL = 0
991 t_monvol(1:nvolu)%KMESH = 0
992 t_monvol(1:nvolu)%NB_FILL_TRI = 0
993 t_monvol(1:nvolu)%NEDGE = 0
994 t_monvol(1:nvolu)%IADALE = 0
995 t_monvol(1:nvolu)%IADALE2 = 0
996 t_monvol(1:nvolu)%IADALE3 = 0
997 t_monvol(1:nvolu)%IADALE4 = 0
998 t_monvol(1:nvolu)%IADALE5 = 0
999 t_monvol(1:nvolu)%IADALE6 = 0
1000 t_monvol(1:nvolu)%IADALE7 = 0
1001 t_monvol(1:nvolu)%IADALE8 = 0
1002 t_monvol(1:nvolu)%IADALE9 = 0
1003 t_monvol(1:nvolu)%IADALE10 = 0
1004 t_monvol(1:nvolu)%IADALE11 = 0
1005 t_monvol(1:nvolu)%IADALE12 = 0
1006 t_monvol(1:nvolu)%IADALE13 = 0
1007 t_monvol(1:nvolu)%KRA5 = 0
1008 t_monvol(1:nvolu)%KRA6 = 0
1009 t_monvol(1:nvolu)%KR5 = 0
1012 t_monvol_metadata%NVOLU = nvolu
1013 ALLOCATE(t_monvol_metadata%ICBAG(nicbag, nvolu * nvolu))
1014 ALLOCATE(t_monvol_metadata%RCBAG(nrcbag, nvolu * nvolu))
1015 t_monvol_metadata%RCBAG(:, :) = zero
1016 t_monvol_metadata%ICBAG(:, :) = 0
1018 ALLOCATE(t_monvol(ii)%IVOLU(nimv))
1019 t_monvol(ii)%IVOLU(1:nimv) = 0
1020 ALLOCATE(t_monvol(ii)%RVOLU(nrvolu))
1021 t_monvol(ii)%RVOLU(1:nrvolu) = zero
1022 t_monvol(ii)%NVENT = 0
1023 t_monvol(ii)%NPORSURF = 0
1024 t_monvol(ii)%EXT_SURFID = 0
1025 t_monvol(ii)%INT_SURFID = 0
1026 t_monvol(ii)%NCA = 0
1027 t_monvol(ii)%KR5 = 0
1028 t_monvol(ii)%KRA5 = 0
1029 t_monvol(ii)%EDGES_BUILT = .false.
1030 t_monvol(ii)%NB_FILL_TRI = 0
1031 t_monvol(ii)%OK_REORIENT = .true.
1170#include "implicit_f.inc"
1174#include "param_c.inc"
1175#include "com04_c.inc"
1179 CHARACTER(LEN = nchartitle),
INTENT(IN) :: TITLE
1180 INTEGER,
INTENT(IN) :: IVOLU(NIMV), ITAB(*),ITYPE, IXC(NIXC, NUMELC), IXTG(NIXTG, NUMELTG)
1182 TYPE(
surf_),
INTENT(INOUT) :: SURF
1187 INTEGER NSEG,ISH34,JJ,II(4),KK, IELEM_ADJ,IDX,IDX_A,IDX_B,IPAIR,NPAIR,LL
1189 INTEGER NEDG, SUM_ADJ
1191 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: PATHS, SIZES, CHECK_FLAG_ELEM, NB_ADJ,IAD_ADJ, LIST_ADJ_TAB
1192 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: db_reversed, db_path
1193 INTEGER,
DIMENSION(:),
ALLOCATABLE :: PAIR_LIST, NB_PAIR_BY_EDGE
1194 INTEGER :: NB_NOEUD, NB_ARC, NB_COMP_CONNEXE, SUM_SIZES
1195 INTEGER(8) :: graph_ptr
1196 INTEGER :: IELEM,ICOMP, EDGES_A(5),EDGES_B(5), NB_REVERSED
1197 INTEGER :: NPT_A, NPT_B, IELEM1, IELEM2, ELTYP1, ELTYP2, NB_COMMON_NODE,
1198 . nodelist1(4), nodelist2(4), elem1id, elem2id, elemtg, elemc, ielemtg, ielemc
1199 LOGICAL :: lFOUND, lFOUND_ADJ
1200 INTEGER :: NB_DUPLICATED_ELTS
1201 INTEGER,
DIMENSION(:),
ALLOCATABLE :: DUPLICATED_ELTS
1202 CHARACTER(LEN=1024) :: FILENAME
1203 INTEGER(8) :: duplicate_ptr
1204 LOGICAL debug_output
1205 INTEGER :: NTRI, NB_CON
1206 INTEGER,
DIMENSION(:),
ALLOCATABLE :: IAD_COMP_CONNEX
1221 ntri = t_monvoln%NB_FILL_TRI
1222 t_monvoln%OK_REORIENT = .true.
1228 IF (.NOT. t_monvoln%EDGES_BUILT)
THEN
1231 nedg = t_monvoln%NEDGE
1237 nb_duplicated_elts = 0
1239 CALL tab1_init(duplicate_ptr)
1241 nb_con = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
1242 IF (nb_con > 2)
THEN
1244 DO ielem1 = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM(jj + 1) - 1
1245 IF (t_monvoln%EDGE_ELEM(ielem1) /= 0)
THEN
1246 DO ielem2 = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM(jj + 1) -1
1247 IF (ielem1 /= ielem2)
THEN
1248 elem1id = t_monvoln%EDGE_ELEM(ielem1)
1249 elem2id = t_monvoln%EDGE_ELEM(ielem2)
1250 IF (elem1id * elem2id == 0)
THEN
1255 eltyp1 = surf%ELTYP(elem1id)
1256 eltyp2 = surf%ELTYP(elem2id)
1257 IF (eltyp1 == eltyp2)
THEN
1258 IF (eltyp1 == 7)
THEN
1261 nodelist1(1:4) = (/0, ixtg(2:4,surf%ELEM(elem1id))/)
1262 nodelist2(1:4) = (/0, ixtg(2:4,surf%ELEM(elem2id))/)
1265 IF (nodelist1(kk) == nodelist2(ll))
THEN
1266 nb_common_node = nb_common_node + 1
1271 IF (nb_common_node == 3)
THEN
1273 t_monvoln%EDGE_ELEM(ielem2) = 0
1274 nb_duplicated_elts = nb_duplicated_elts + 1
1275 CALL tab1_append(duplicate_ptr, elem1id)
1276 CALL tab1_append(duplicate_ptr, elem2id)
1279 ELSEIF (eltyp1 == 3)
THEN
1282 nodelist1(1:4) = (/ixc(2:5,surf%ELEM(elem1id))/)
1283 nodelist2(1:4) = (/ixc(2:5,surf%ELEM(elem2id))/)
1286 IF (nodelist1(kk) == nodelist2(ll))
THEN
1287 nb_common_node = nb_common_node + 1
1292 IF (nb_common_node == 4)
THEN
1294 t_monvoln%EDGE_ELEM(ielem2) = 0
1295 nb_duplicated_elts = nb_duplicated_elts + 1
1296 CALL tab1_append(duplicate_ptr, elem1id)
1297 CALL tab1_append(duplicate_ptr, elem2id)
1305 IF (eltyp1 == 7)
THEN
1312 nodelist1(1:4) = (/0, ixtg(2:4,surf%ELEM(elemtg))/)
1313 nodelist2(1:4) = (/ixc(2:5,surf%ELEM(elemc))/)
1316 IF (nodelist1(kk) == nodelist2(ll))
THEN
1317 nb_common_node = nb_common_node + 1
1322 IF (nb_common_node == 3)
THEN
1324 t_monvoln%EDGE_ELEM(ielemtg) = 0
1325 nb_duplicated_elts = nb_duplicated_elts + 1
1326 CALL tab1_append(duplicate_ptr, elemc)
1327 CALL tab1_append(duplicate_ptr, ielemtg)
1341 ALLOCATE(nb_pair_by_edge(nedg))
1343 nb_pair_by_edge(jj) = 0
1344 DO kk = t_monvoln%IAD_EDGE_ELEM(jj), t_monvoln%IAD_EDGE_ELEM(jj + 1) - 1
1345 IF (t_monvoln%EDGE_ELEM(kk) /= 0)
THEN
1346 nb_pair_by_edge(jj) = nb_pair_by_edge(jj) + 1
1349 nb_pair_by_edge(jj) = (nb_pair_by_edge(jj) - 1) * nb_pair_by_edge(jj) / 2
1350 IF (nb_pair_by_edge(jj) > 1)
THEN
1351 t_monvoln%OK_REORIENT = .false.
1354 npair = sum(nb_pair_by_edge)
1355 ALLOCATE(pair_list(2 * npair))
1358 nb_con = t_monvoln%IAD_EDGE_ELEM(jj + 1) - t_monvoln%IAD_EDGE_ELEM(jj)
1360 DO ll = kk + 1, nb_con
1361 elem1id = t_monvoln%EDGE_ELEM(t_monvoln%IAD_EDGE_ELEM(jj) + kk - 1)
1362 elem2id = t_monvoln%EDGE_ELEM(t_monvoln%IAD_EDGE_ELEM(jj) + ll - 1)
1363 IF (elem1id .NE.0 .AND. elem2id .NE. 0)
THEN
1364 pair_list(ipair + 1) = elem1id - 1
1365 pair_list(ipair + 2) = elem2id - 1
1380 CALL graph_build_path(nb_noeud, nb_arc, pair_list, nb_comp_connexe, graph_ptr)
1387 IF(.NOT.
ALLOCATED(sizes))
ALLOCATE(sizes(0:nb_comp_connexe))
1388 ALLOCATE(iad_comp_connex(nb_comp_connexe+1))
1389 CALL graph_get_sizes(graph_ptr, sizes(1))
1390 sum_sizes=sum(sizes(1:nb_comp_connexe),1)
1392 iad_comp_connex(1) = 1
1393 DO jj = 2, nb_comp_connexe + 1
1394 iad_comp_connex(jj) = iad_comp_connex(jj - 1) + sizes(jj - 1)
1396 IF(.NOT.
ALLOCATED(paths))
ALLOCATE(paths(sum_sizes))
1397 CALL graph_get_path(graph_ptr, paths)
1402 debug_output=.false.
1464 IF(.NOT.
ALLOCATED(nb_adj))
ALLOCATE(nb_adj(nseg+ntri))
1465 IF(.NOT.
ALLOCATED(iad_adj))
ALLOCATE(iad_adj(nseg+ntri+1))
1466 CALL graph_get_nb_adj(graph_ptr, nb_adj)
1470 iad_adj(kk)=iad_adj(kk-1)+nb_adj(kk-1)
1472 IF(.NOT.
ALLOCATED(list_adj_tab))
ALLOCATE(list_adj_tab(sum_adj))
1473 CALL graph_get_adj(graph_ptr, list_adj_tab)
1475 list_adj_tab(kk)=list_adj_tab(kk)+1
1481 debug_output=.false.
1482 if(debug_output)
then
1484 WRITE(filename,
"(A,I0,A)")
"surfmesh_before_",t_monvoln%ID,
"_0000.rad"
1485 OPEN(unit = 210486, file = trim(filename), form =
'formatted')
1486 WRITE(210486,
'(A)')
"#RADIOSS STARTER"
1487 WRITE(210486,
'(A)')
"/BEGIN"
1488 WRITE(210486,
'(A)')
"ORIENTED_SURFACE "
1489 WRITE(210486,
'(A)')
" 100 0"
1490 WRITE(210486,
'(A)')
" g mm ms"
1491 WRITE(210486,
'(A)')
" g mm ms"
1492 WRITE(210486,
"(A5)")
"/NODE"
1494 WRITE(210486,
"(I10, 1PG20.13, 1PG20.13, 1PG20.13)") itab(kk),x(1, kk), x(2, kk), x(3, kk)
1497 ii(1:4) = surf%NODES(kk,1:4)
1498 ish34 = surf%ELTYP(kk)
1499 IF (ish34 == 3)
THEN
1500 WRITE(210486,
"(A6)")
"/SHELL"
1501 WRITE(210486,
'(I10,I10,I10,I10,I10)') ixc(7,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3)), itab(ii(4))
1505 ii(1:4) = surf%NODES(kk,1:4)
1506 ish34 = surf%ELTYP(kk)
1507 IF (ish34 == 7)
THEN
1508 WRITE(210486,
"(A5)")
"/SH3N"
1509 WRITE(210486,
'(I10,I10,I10,I10)') ixtg(6,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3))
1512 IF (t_monvoln%NB_FILL_TRI > 0)
THEN
1513 WRITE(210486,
"(A5)")
"/SH3N"
1515 DO kk = 1, t_monvoln%NB_FILL_TRI
1516 WRITE(210486,
'(I10,I10,I10,I10)') kk + nseg, itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 1)),
1517 . itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 2)), itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 3))
1526 IF(.NOT.
ALLOCATED(check_flag_elem))
ALLOCATE(check_flag_elem(nseg+ntri))
1527 check_flag_elem(:)=0
1529 IF (t_monvoln%OK_REORIENT)
THEN
1530 DO icomp=1,nb_comp_connexe
1533 jj = 1 + paths(iad_comp_connex(icomp))
1535 check_flag_elem(jj)=1
1538 DO ielem=iad_comp_connex(icomp) + 1, iad_comp_connex(icomp + 1) - 1
1543 IF (jj <= nseg)
THEN
1544 ii(1:4) = surf%NODES(jj,1:4)
1545 ish34 = surf%ELTYP(jj)
1546 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1547 edges_a(1:5)=(/ ii(1:4), ii(1) /)
1550 edges_a(1:5)=(/ ii(1:3), ii(1), 0 /)
1554 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) + 3)
1556 edges_a(1:5) = (/ ii(1:3), ii(1), 0 /)
1563 idx2 = iad_adj(jj+1)-1
1564 lfound_adj = .false.
1566 ielem_adj = list_adj_tab(kk)
1567 IF(check_flag_elem(ielem_adj) /= 0 )
THEN
1572 IF(.NOT. lfound_adj)
THEN
1573 print *,
"**error when forcing monvol surface orientation"
1581 IF (kk <= nseg)
THEN
1582 ii(1:4) = surf%NODES(kk,1:4)
1583 ish34 = surf%ELTYP(kk)
1584 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1585 edges_b(1:5)=(/ ii(1:4), ii(1) /)
1588 edges_b(1:5)=(/ ii(1:3), ii(1), 0 /)
1592 ii(1:3) = t_monvoln%FILL_TRI(3 * (kk - nseg - 1) + 1 : 3 * (kk - nseg - 1) + 3)
1594 edges_b(1:5) = (/ ii(1:3), ii(1), 0 /)
1602 IF(edges_b(idx_b)==edges_a(idx_a))
THEN
1603 IF(edges_b(idx_b+1)==edges_a(idx_a+1))
THEN
1614 IF (jj <= nseg)
THEN
1615 ii(1:4) = surf%NODES(jj,1:4)
1617 surf%NODES(jj,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1619 surf%NODES(jj,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1622 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) + 3)
1624 t_monvoln%FILL_TRI(3 * (jj - nseg - 1) + 1 : 3 * (jj - nseg - 1) +
1627 nb_reversed = nb_reversed + 1
1628 check_flag_elem(jj)=-1
1632 check_flag_elem(jj)=1
1633 IF(lfound)check_flag_elem(jj)=-1
1638 CALL ancmsg(msgid = 1882, anmode = aninfo, msgtype = msgwarning,
1639 . i1 = t_monvoln%ID, c1 = t_monvoln%TITLE)
1645 ALLOCATE(duplicated_elts(nb_duplicated_elts * 2))
1646 CALL tab1_get(duplicate_ptr, duplicated_elts)
1647 DO jj = 1, nb_duplicated_elts
1648 elem1id = surf%ELEM(duplicated_elts(2 * (jj - 1) + 1))
1649 elem2id = surf%ELEM(duplicated_elts(2 * (jj - 1) + 2))
1651 eltyp1 = surf%ELTYP(duplicated_elts(2 * (jj - 1) + 1))
1652 eltyp2 = surf%ELTYP(duplicated_elts(2 * (jj - 1) + 2))
1653 IF (eltyp1 == eltyp2)
THEN
1654 ii(1:4) = surf%NODES(elem1id, 1:4)
1655 IF (eltyp1 == 7)
THEN
1657 surf%NODES(elem2id, 1:4) = (/ ii(2), ii(1), ii(3), ii(4) /)
1660 surf%NODES(elem2id, 1:4) = (/ ii(1), ii(4), ii(3), ii(2) /)
1664 ii(1:4) = surf%NODES(elem2id,1:4)
1665 edges_a(1:5) = (/ ii(1:3), ii(1), 0 /)
1667 ii(1:4) = surf%NODES(elem1id,1:4)
1668 edges_b(1:5) = (/ ii(1:4), ii(1) /)
1674 IF(edges_b(idx_b)==edges_a(idx_a))
THEN
1675 IF(edges_b(idx_b+1)==edges_a(idx_a+1))
THEN
1684 ii(1:4) = surf%NODES(elem2id, 1:4)
1686 surf%NODES(elem2id,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1688 surf%NODES(elem2id,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1693 CALL tab1_free_memory(duplicate_ptr)
1699 debug_output=.false.
1700 if(debug_output)
then
1702 ALLOCATE(db_path(sizes(icomp)))
1703 do ielem=1,sizes(icomp)
1705 ii(1:4) = surf%NODES(jj,1:4)
1706 ish34 = surf%ELTYP(jj)
1707 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1708 db_path(jj) = ixc(7,surf%ELEM((jj)))
1710 db_path(jj) = ixtg(6,surf%ELEM((jj)))
1713 print *,
"____________________________________________________"
1714 print *,
"there are ",sizes(icomp),
" elements along the path"
1715 print *, db_path(1:sizes(icomp))
1716 print *,
"____________________________________________________"
1720 debug_output=.false.
1721 if(debug_output)
then
1724 ALLOCATE(db_reversed(sizes(icomp)))
1725 do ielem=1,sizes(icomp)
1727 ii(1:4) = surf%NODES(jj,1:4)
1728 ish34 = surf%ELTYP(jj)
1729 IF(check_flag_elem(jj)==-1)
THEN
1731 IF(ish34==3.AND.ii(3)/=ii(4))
THEN
1732 db_reversed(idx) = ixc(7,surf%ELEM((jj)))
1734 db_reversed(idx) = ixtg(6,surf%ELEM((jj)))
1738 print *,
"there were ",nb_reversed,
" element(s) reversed along the path"
1739 print *, db_reversed(1:nb_reversed)
1740 print *,
"____________________________________________________"
1741 DEALLOCATE(db_reversed)
1747 IF(
ALLOCATED(nb_adj))
DEALLOCATE(nb_adj)
1748 IF(
ALLOCATED(iad_adj))
DEALLOCATE(iad_adj)
1749 IF(
ALLOCATED(check_flag_elem))
DEALLOCATE(check_flag_elem)
1750 IF(
ALLOCATED(list_adj_tab))
DEALLOCATE(list_adj_tab)
1751 IF(
ALLOCATED(paths))
DEALLOCATE(paths)
1752 IF(
ALLOCATED(sizes))
DEALLOCATE(sizes)
1753 IF(
ALLOCATED(duplicated_elts))
DEALLOCATE(duplicated_elts)
1754 IF(
ALLOCATED(pair_list))
DEALLOCATE(pair_list)
1755 IF(
ALLOCATED(nb_pair_by_edge))
DEALLOCATE(nb_pair_by_edge)
1756 IF (
ALLOCATED(iad_comp_connex))
DEALLOCATE(iad_comp_connex)
1757 CALL graph_free_memory(graph_ptr)
1795#include "implicit_f.inc"
1799#include "param_c.inc"
1800#include "com04_c.inc"
1804 CHARACTER(LEN = nchartitle),
INTENT(IN) :: TITLE
1805 INTEGER,
INTENT(IN) :: IVOLU(NIMV), ITAB(*), ITYPE
1806 TYPE(
surf_),
INTENT(INOUT) :: SURF
1808 my_real,
INTENT(IN) :: x(3,numnod)
1809 INTEGER,
INTENT(IN) :: IXC(, NUMELC), IXTG(NIXTG, NUMELTG)
1814 INTEGER JJ,ISH34,II(4),KK,NSEG
1815 CHARACTER(LEN=1024) :: FILENAME
1816 LOGICAL debug_output
1826 IF (.NOT. t_monvoln%OK_REORIENT)
RETURN
1832 ish34 = surf%ELTYP(jj)
1833 ii(1:4) = surf%NODES(jj,1:4)
1836 surf%NODES(jj,1:4)=(/ ii(1), ii(4), ii(3), ii(2) /)
1837 ELSEIF(ish34 == 7)
THEN
1839 surf%NODES(jj,1:4)=(/ ii(2), ii(1), ii(3), ii(4) /)
1842 DO jj = 1, t_monvoln%NB_FILL_TRI
1843 ii(1:3) = t_monvoln%FILL_TRI(3 * (jj - 1) + 1 : 3 * (jj - 1) + 3)
1845 t_monvoln%FILL_TRI(3 * (jj - 1) + 1 : 3 * (jj - 1) + 3) = (/ ii(2), ii(1)
1853 debug_output=.false.
1854 if(debug_output)
then
1856 WRITE(filename,
"(A,I0,A)")
"surfmesh_after_",t_monvoln%ID,
"_0000.rad"
1857 OPEN(unit = 210486, file = trim(filename), form =
'formatted')
1858 WRITE(210486,
'(A)')
"#RADIOSS STARTER"
1859 WRITE(210486,
'(A)')
"/BEGIN"
1860 WRITE(210486,
'(A)')
"ORIENTED_SURFACE "
1861 WRITE(210486,
'(A)')
" 100 0"
1862 WRITE(210486,
'(A)')
" g mm ms"
1863 WRITE(210486,
'(A)')
" g mm ms"
1864 WRITE(210486,
"(A5)")
"/NODE"
1866 WRITE(210486,
"(I10, 1PG20.13, 1PG20.13, 1PG20.13)") itab(kk),x(1, kk), x(2, kk), x(3, kk)
1869 ii(1:4) = surf%NODES(kk,1:4)
1870 ish34 = surf%ELTYP(kk)
1871 IF (ish34 == 3)
THEN
1872 WRITE(210486,
"(A6)")
"/SHELL"
1873 WRITE(210486,
'(I10,I10,I10,I10,I10)') ixc(7,surf%ELEM(kk)), itab(ii(1)), itab
1877 ii(1:4) = surf%NODES(kk,1:4)
1878 ish34 = surf%ELTYP(kk)
1879 IF (ish34 == 7)
THEN
1880 WRITE(210486,
"(A5)")
"/SH3N"
1881 WRITE(210486,
'(I10,I10,I10,I10)') ixtg(6,surf%ELEM(kk)), itab(ii(1)), itab(ii(2)),itab(ii(3))
1884 IF (t_monvoln%NB_FILL_TRI > 0)
THEN
1885 WRITE(210486,
"(A5)")
"/SH3N"
1887 DO kk = 1, t_monvoln%NB_FILL_TRI
1888 WRITE(210486,
'(I10,I10,I10,I10)') kk + nseg, itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 1)),
1889 . itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 2)), itab(t_monvoln%FILL_TRI(3 * (kk - 1) + 3))