34 type(
mesh),
intent(in) :: m
37 integer,
dimension(:),
allocatable :: row
38 real(RP),
dimension(3) :: x
39 integer :: ii, sz, wdt
48 call getrow(sz, row, wdt, m%clToNd, ii)
50 select case(m%clType(ii))
55 x = m%nd(:,row(1)) - m%nd(:,row(2))
61 x = m%nd(:,row(1)) - m%nd(:,row(2))
65 x = m%nd(:,row(2)) - m%nd(:,row(3))
69 x = m%nd(:,row(3)) - m%nd(:,row(1))
74 x = m%nd(:,row(1)) - m%nd(:,row(2))
78 x = m%nd(:,row(1)) - m%nd(:,row(3))
82 x = m%nd(:,row(1)) - m%nd(:,row(4))
86 x = m%nd(:,row(2)) - m%nd(:,row(3))
90 x = m%nd(:,row(2)) - m%nd(:,row(4))
94 x = m%nd(:,row(3)) - m%nd(:,row(4))
99 call quit (
"mesh_tools: maxEdgeLength:& 100 & cell type not supported")
113 integer,
dimension(:),
allocatable :: row
114 real(RP),
dimension(3) :: x
115 integer :: ii, sz, wdt
124 call getrow(sz, row, wdt, m%clToNd, ii)
126 select case(m%clType(ii))
131 x = m%nd(:,row(1)) - m%nd(:,row(2))
136 x = m%nd(:,row(1)) - m%nd(:,row(2))
140 x = m%nd(:,row(2)) - m%nd(:,row(3))
144 x = m%nd(:,row(3)) - m%nd(:,row(1))
149 x = m%nd(:,row(1)) - m%nd(:,row(2))
153 x = m%nd(:,row(1)) - m%nd(:,row(3))
157 x = m%nd(:,row(1)) - m%nd(:,row(4))
161 x = m%nd(:,row(2)) - m%nd(:,row(3))
165 x = m%nd(:,row(2)) - m%nd(:,row(4))
169 x = m%nd(:,row(3)) - m%nd(:,row(4))
174 call quit (
"mesh_tools: minEdgeLength:& 175 & cell type not supported")
200 integer ,
dimension(4,6) :: mesh_desc
201 type(
mesh),
intent(in) :: m
202 integer ,
intent(in) :: verb
204 integer :: ii, cl_t, dim, nbVtx, nbNodes
205 integer,
dimension(CELL_MAX_NBNODES) :: row
206 integer,
dimension(4, m%nbNd) :: p, q
208 if (
choral_verb>0)
write(*,*)
"mesh_tools : mesh_analyse" 212 if(.NOT.
valid(m))
then 213 call quit(
"mesh_tools: mesh_analyse: mesh 'm' not valid" )
223 mesh_desc( dim + 1, 1) = mesh_desc( dim + 1, 1) + 1
226 p(dim + 1, row(1:nbvtx )) = 1
227 q(dim + 1, row(1:nbnodes )) = 1
232 mesh_desc(ii,2) = sum( p(ii,:) )
233 mesh_desc(ii,3) = sum( q(ii,:) )
236 mesh_desc(2,6) = mesh_desc(2,1) - mesh_desc(2,2)
237 if (m%dim==1)
goto 10
240 mesh_desc(3,6) = mesh_desc(3,1) - mesh_desc(3,4) + mesh_desc(3,2)
241 if (m%dim==2)
goto 10
245 mesh_desc(4,6) = mesh_desc(4,1) - mesh_desc(4,5) &
246 & + mesh_desc(4,4) - mesh_desc(4,2)
252 if (mesh_desc(1,1)/=mesh_desc(1,2))
call quit( &
253 &
"mesh_tools: mesh_analyse: 2" )
255 if (mesh_desc(1,1)/=mesh_desc(1,3))
call quit( &
256 &
"mesh_tools: mesh_analyse: 3" )
263 write(*,*)
" 0D cells" 264 write(*,*)
" nb cells =", mesh_desc(1,1)
265 write(*,*)
" nb vertexes =", mesh_desc(1,2)
266 write(*,*)
" nb nodes =", mesh_desc(1,3)
268 write(*,*)
" 1D cells" 269 write(*,*)
" nb cells =", mesh_desc(2,1)
270 write(*,*)
" nb vertexes =", mesh_desc(2,2)
271 write(*,*)
" Euler charac =", mesh_desc(2,6)
272 write(*,*)
" nb nodes =", mesh_desc(2,3)
275 write(*,*)
" 2D cells" 276 write(*,*)
" nb cells =", mesh_desc(3,1)
277 write(*,*)
" nb edges =", mesh_desc(3,4)
278 write(*,*)
" nb vertexes =", mesh_desc(3,2)
279 write(*,*)
" Euler charac =", mesh_desc(3,6)
280 write(*,*)
" nb nodes =", mesh_desc(3,3)
283 write(*,*)
" 3D cells" 284 write(*,*)
" nb cells =", mesh_desc(4,1)
285 write(*,*)
" nb faces =", mesh_desc(4,5)
286 write(*,*)
" nb edges =", mesh_desc(4,4)
287 write(*,*)
" nb vertexes =", mesh_desc(4,2)
288 write(*,*)
" Euler charac =", mesh_desc(4,6)
289 write(*,*)
" nb nodes =", mesh_desc(4,2)
318 integer,
dimension(wdt, CELL_MAX_NBVTX):: vtx_toCl
319 integer,
dimension(CELL_MAX_NBVTX) :: vtx_nbCl
320 integer,
dimension(CELL_MAX_NBNODES) :: cl_vtx
321 integer,
dimension(wdt) :: ed_toCl
323 integer :: ii, jj, ll, v1, v2
324 integer :: cl, cl_nbVtx, cl_t
325 integer :: ed_nbCl, cl2, cl2_t
344 call getrow(vtx_nbcl(ii), vtx_tocl(:,ii), wdt, &
345 & m%ndToCl, cl_vtx(ii))
362 & vtx_tocl( 1: jj, v1), jj, &
363 & vtx_tocl( 1: ll, v2), ll )
367 loop:
do jj=1, ed_nbcl
369 cl2_t = m%clType(cl2)
372 if (cl2==cl) ned = ned + 1
386 type(
mesh),
intent(in) :: m
388 integer,
dimension(:),
allocatable :: nnz
389 type(
graph) :: clToEd
392 integer :: cl_t, nb_vtx, nb_ed, width
395 &
"mesh_tools : count_2DCell_edges" 408 if (sum(nnz)==0)
then 412 cltoed =
graph(nnz, m%nbCl, 0)
418 width = m%ndToCl%width
421 if ( m%cell_count(cl_t) == 0 ) cycle
435 integer,
dimension(nb_vtx) :: vtx_nbCl
436 integer,
dimension(width, nb_vtx) :: vtx_cl
437 integer,
dimension(CELL_MAX_NBVTX) :: cl_vtx
438 integer,
dimension(width) :: coBord
439 integer :: ed, v1, v2
440 integer :: j1, j2, l1, l2
444 if (l1 /= cl_t ) cycle
448 j1 = m%clToNd%row(cl)
450 cl_vtx(1:nb_vtx) = m%clToNd%col( j1:j2 )
457 j1 = m%ndToCl%row(l1)
458 j2 = m%ndToCl%row(l1+1)
464 vtx_cl(1:l1, v1) = m%ndToCl%col(j1:j2-1)
484 & vtx_cl(1:l1, v1), l1, vtx_cl(1:l2, v2), l2)
489 if ( nnz( cobord(l1) ) == 0 ) cycle
492 if (cobord(l1)==cl) n = n + 1
508 type(
mesh),
intent(in) :: m
510 integer,
dimension(:),
allocatable :: nnz
511 type(
graph) :: clToFc
514 integer :: cl_t, nb_vtx, nb_fc, width
517 &
"mesh_tools : count_3DCell_faces" 530 cltofc =
graph(nnz, m%nbCl, 0)
536 width = m%ndToCl%width
539 if ( m%cell_count(cl_t) == 0 ) cycle
553 integer,
dimension(nb_vtx) :: vtx_nbCl
554 integer,
dimension(width, nb_vtx) :: vtx_cl
555 integer,
dimension(CELL_MAX_NBVTX) :: cl_vtx
556 integer,
dimension(width) :: coBord, aux
557 integer :: fc, v1, v2
558 integer :: j1, j2, l1, l2, ii
562 if (l1 /= cl_t ) cycle
566 j1 = m%clToNd%row(cl)
568 cl_vtx(1:nb_vtx) = m%clToNd%col( j1:j2 )
575 j1 = m%ndToCl%row(l1)
576 j2 = m%ndToCl%row(l1+1)
582 vtx_cl(1:l1, v1) = m%ndToCl%col(j1:j2-1)
602 & vtx_cl(1:l1, v1), l1, vtx_cl(1:l2, v2), l2)
609 aux(1:l1) = cobord(1:l1)
612 & aux(1:l1), l1, vtx_cl(1:l2, v2), l2)
619 if ( nnz( cobord(l1) ) == 0 ) cycle
622 if (cobord(l1)==cl) n = n + 1
is the csr matrix well defined ?
DERIVED TYPE graph: sparse matrices of boolean in CSR format
integer, parameter cell_edg_2
Quadratic edge.
integer, parameter cell_tot_nb
Number of CELL types.
integer, parameter cell_tet
Tetrahedron.
integer, dimension(cell_tot_nb), public cell_nbvtx
Number of vertexes for each cell type.
integer, dimension(cell_tot_nb), public cell_nbfc
Number of faces for each cell type.
integer, parameter cell_edg
Edge (line segment)
integer, dimension(cell_tot_nb), public cell_dim
Dimension for each cell type.
integer, dimension(cell_max_nbvtx, cell_max_nbfc, cell_tot_nb), public cell_fc_vtx
CELL_FC_VTX(1:n, fc, cl) = vertexes for the face fc of the cell cl, with n = CELL_FC_NBVTX(fc, cl)
REAL NUMBERS PRECISION IN CHORAL: selects simple/double/quad
integer, dimension(cell_max_nbfc, cell_tot_nb), public cell_fc_nbvtx
CELL_FC_NBVTX(fc, cl) = number of vertexes for the face fc of the cell cl.
integer, parameter cell_trg
Triangle.
integer, parameter cell_tet_2
Quadratic tetrahedron.
integer, parameter cell_trg_2
Quadratic triangle.
ALGEBRAIC OPERATIONS ON SETS
integer, dimension(cell_tot_nb), public cell_nbed
Number of edges for each cell type.
allocate memory for real(RP) arrays
integer choral_verb
Verbosity level.
DEFINITION OF GLOBAL VARIABLES FOR THE LIBRARY CHORAL
short description for real arrays
integer, parameter cell_vtx
Vertex.
subroutine, public cap_sorted_set(cpt, t, n, t1, n1, t2, n2)
t(1:cpt) = t1(1:n1) \cap t2(1:n2)
integer, dimension(2, cell_max_nbed, cell_tot_nb), public cell_ed_vtx
CELL_ED_VTX(1:2, ed, cl) = vertexes for the edge ed of the cell cl.
The type graph stores sparse matrices of boolean in CSR format.
DEFINITION OF GEOMETRICAL CELLS (for meshes)
integer, parameter, public cell_max_nbnodes
Cell maximal number of nodes.