Skip to content

Commit 27841d7

Browse files
committed
Make minor improvements and fix bugs
- module -M: fixed -part for periodic meshes, fixed compatibility with Gmsh 4.13.1.
1 parent 639746f commit 27841d7

File tree

13 files changed

+783
-669
lines changed

13 files changed

+783
-669
lines changed

VERSIONS

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
New in 4.10.1-2 (09 Oct 2024):
2-
- module -M: Fixed compatibility with Gmsh 4.13.1.
1+
New in 4.10.1 (09 Oct 2024):
2+
- module -M: fixed -part for periodic meshes, fixed compatibility with Gmsh
3+
4.13.1.
34

45
New in 4.10.0 (01 Oct 2024):
56
- general: switched "active" and "passive" for orientation convention (see

doc/conf.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
import sphinx_rtd_theme
1212

1313
project = u'Neper'
14-
version = u'4.10.1-2'
15-
release = u'4.10.1-2'
14+
version = u'4.10.1'
15+
release = u'4.10.1'
1616
author = u'Romain Quey'
1717
copyright = u'Romain Quey'
1818
language = 'en'

src/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ if(POLICY CMP0077)
77
cmake_policy(SET CMP0077 NEW)
88
endif()
99

10-
set(NEPER_VERSION \"4.10.1-2\")
10+
set(NEPER_VERSION \"4.10.1\")
1111
project(neper)
1212

1313
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8.1)

src/neper_m/nem_order/nem_order2.c

+2
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ nem_order_periodic (struct TESS Tess, struct NODES *pNodes, struct MESH *Mesh)
8282
if (Tess.Dim == 3)
8383
nem_order_periodic_faces (Tess, pNodes, Mesh);
8484

85+
neut_nodes_init_nodeslave (pNodes);
86+
8587
return;
8688
}
8789

src/neper_m/nem_order/nem_order3.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ nem_order_periodic_edges (struct TESS Tess, struct NODES *pNodes,
4040
int i, j, k, l, nodeqty_tot, nodeqty_o1, nodes[2], nodemasters[2], node,
4141
nodemaster;
4242
int **fir = NULL;
43-
int *node_slave = ut_alloc_1d_int ((*pNodes).NodeQty);
43+
int *node_slave = ut_alloc_1d_int ((*pNodes).NodeQty + 1);
4444
int *shift = ut_alloc_1d_int (3);
4545

4646
neut_elt_orderarrays (Mesh[1].EltType, Mesh[1].Dimension, &fir,

src/neper_m/nem_partition/nem_partition2.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ nem_partition_prep (struct NODES *pNodes, struct MESH *Mesh,
102102
neut_mesh_init_nodeelts (Mesh + dim, (*pNodes).NodeQty);
103103

104104
SCOTCH_meshInit (pSCMesh);
105-
neut_mesh_scotchmesh (Mesh[dim], (*pNodes).NodeQty, pSCMesh);
105+
neut_mesh_scotchmesh (*pNodes, Mesh[dim], pSCMesh);
106106

107107
return;
108108
}

src/neut/neut_mesh/neut_mesh_fprintf/neut_mesh_fprintf_scotch/neut_mesh_fprintf_scotch1.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ neut_mesh_fprintf_scotch (char *body, struct NODES Nodes, struct MESH Mesh)
1717

1818
SCOTCH_meshInit (&SCMesh);
1919

20-
neut_mesh_scotchmesh (Mesh, Nodes.NodeQty, &SCMesh);
20+
neut_mesh_scotchmesh (Nodes, Mesh, &SCMesh);
2121

2222
file = ut_file_open (scm, "w");
2323
SCOTCH_meshSave (&SCMesh, file);

src/neut/neut_mesh/neut_mesh_op/neut_mesh_op.c

+25-29
Original file line numberDiff line numberDiff line change
@@ -294,47 +294,43 @@ neut_mesh_memcpy (struct MESH Old, struct MESH *pNew)
294294

295295
#ifdef HAVE_LIBSCOTCH
296296
void
297-
neut_mesh_scotchmesh (struct MESH Mesh, int vnodnbr, SCOTCH_Mesh * pSCMesh)
297+
neut_mesh_scotchmesh (struct NODES Nodes, struct MESH Mesh, SCOTCH_Mesh * pSCMesh)
298298
{
299-
int i, id, status;
300-
int velmbas, vnodbas, velmnbr, vertnbr, edgenbr;
301-
int *verttab, *edgetab;
302-
int eltnodeqty =
303-
neut_elt_nodeqty (Mesh.EltType, Mesh.Dimension, Mesh.EltOrder);
299+
int i, j, status;
300+
int verqty, edgeqty, nodeqty, eltqty;
301+
int *vers = NULL, *edges = NULL, *nodes = NULL, *elts = NULL;
302+
int eltnodeqty = neut_elt_nodeqty (Mesh.EltType, Mesh.Dimension, Mesh.EltOrder);
304303

305-
velmbas = 1; /* element base number */
306-
vnodbas = 1 + Mesh.EltQty; /* node base number */
307-
velmnbr = Mesh.EltQty;
304+
verqty = Mesh.EltQty + Nodes.NodeQty;
305+
edgeqty = 2 * Mesh.EltQty * eltnodeqty;
308306

309-
vertnbr = velmnbr + vnodnbr;
310-
edgenbr = 2 * velmnbr * eltnodeqty;
311-
312-
verttab = ut_alloc_1d_int (vertnbr + 1);
313-
edgetab = ut_alloc_1d_int (edgenbr + 1);
307+
vers = ut_alloc_1d_int (verqty + 1);
314308

315309
/* recording elements */
316-
id = 0;
317-
for (i = 1; i <= velmnbr; i++)
310+
edgeqty = 0;
311+
for (i = 1; i <= Mesh.EltQty; i++)
318312
{
319-
verttab[i - 1] = id + 1;
320-
ut_array_1d_int_memcpy (Mesh.EltNodes[i], eltnodeqty, edgetab + id);
321-
ut_array_1d_int_addval (edgetab + id, eltnodeqty, vnodbas - 1,
322-
edgetab + id);
323-
id += eltnodeqty;
313+
vers[i - 1] = edgeqty + 1;
314+
315+
neut_mesh_elt_nodes_per (Nodes, Mesh, i, &nodes, &nodeqty);
316+
for (j = 0; j < nodeqty; j++)
317+
ut_array_1d_int_list_addval_nocheck (&edges, &edgeqty, nodes[j]);
324318
}
319+
ut_array_1d_int_addval (edges, edgeqty, Mesh.EltQty, edges);
325320

326321
/* recording nodes */
327-
for (i = 1; i <= vnodnbr; i++)
322+
for (i = 1; i <= Nodes.NodeQty; i++)
328323
{
329-
verttab[i + Mesh.EltQty - 1] = id + 1;
330-
ut_array_1d_int_memcpy (Mesh.NodeElts[i] + 1, Mesh.NodeElts[i][0],
331-
edgetab + id);
332-
id += Mesh.NodeElts[i][0];
324+
vers[i + Mesh.EltQty - 1] = edgeqty + 1;
325+
326+
neut_mesh_node_elts_per (Nodes, Mesh, i, &elts, &eltqty);
327+
for (j = 0; j < eltqty; j++)
328+
ut_array_1d_int_list_addval_nocheck (&edges, &edgeqty, elts[j]);
333329
}
334-
verttab[vertnbr] = edgenbr + 1;
330+
vers[verqty] = edgeqty + 1;
335331

336-
SCOTCH_meshBuild (pSCMesh, velmbas, vnodbas, velmnbr, vnodnbr, verttab,
337-
NULL, NULL, NULL, NULL, edgenbr, edgetab);
332+
SCOTCH_meshBuild (pSCMesh, 1, Mesh.EltQty + 1, Mesh.EltQty, Nodes.NodeQty, vers,
333+
NULL, NULL, NULL, NULL, edgeqty, edges);
338334
/*
339335
file = ut_file_open ("dd", "w");
340336
SCOTCH_meshSave (pSCMesh, file);

src/neut/neut_mesh/neut_mesh_op/neut_mesh_op.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ extern "C"
7171
///
7272
///
7373
#ifdef HAVE_LIBSCOTCH
74-
extern void neut_mesh_scotchmesh (struct MESH, int, SCOTCH_Mesh *);
74+
extern void neut_mesh_scotchmesh (struct NODES Nodes, struct MESH Mesh, SCOTCH_Mesh *);
7575
#endif /* HAVE_LIBSCOTCH */
7676

7777
/// \brief Initialize NodeElts of a MESH structure.

src/neut/neut_mesh/neut_mesh_topo/neut_mesh_topo.c

+60
Original file line numberDiff line numberDiff line change
@@ -2504,3 +2504,63 @@ neut_mesh_order1nodes_order2node (struct MESH Mesh, int node1, int node2,
25042504

25052505
return;
25062506
}
2507+
2508+
void
2509+
neut_mesh_elt_nodes_per (struct NODES Nodes, struct MESH Mesh, int elt, int **pnodes, int *pnodeqty)
2510+
{
2511+
int i, j, node, eltnodeqty = neut_elt_nodeqty (Mesh.EltType, Mesh.Dimension, Mesh.EltOrder);
2512+
2513+
(*pnodeqty) = eltnodeqty;
2514+
(*pnodes) = ut_alloc_1d_int (*pnodeqty);
2515+
2516+
ut_array_1d_int_memcpy (Mesh.EltNodes[elt], eltnodeqty, *pnodes);
2517+
2518+
// periodic
2519+
if (Nodes.PerNodeQty > 0)
2520+
{
2521+
for (i = 0; i < eltnodeqty; i++)
2522+
{
2523+
node = Mesh.EltNodes[elt][i];
2524+
2525+
// is slave
2526+
if (Nodes.PerNodeMaster[node] > 0)
2527+
ut_array_1d_int_list_addval_nocheck (pnodes, pnodeqty, Nodes.PerNodeMaster[node]);
2528+
2529+
// is master
2530+
else if (Nodes.PerNodeSlaveQty[node] > 0)
2531+
for (j = 1; j <= Nodes.PerNodeSlaveQty[node]; j++)
2532+
ut_array_1d_int_list_addval_nocheck (pnodes, pnodeqty, Nodes.PerNodeSlaveNb[node][j]);
2533+
}
2534+
}
2535+
2536+
return;
2537+
}
2538+
2539+
void
2540+
neut_mesh_node_elts_per (struct NODES Nodes, struct MESH Mesh, int node, int **pelts, int *peltqty)
2541+
{
2542+
int nodeeltqty, *nodeelts = NULL;
2543+
2544+
(*peltqty) = Mesh.NodeElts[node][0];
2545+
(*pelts) = ut_alloc_1d_int (*peltqty);
2546+
2547+
ut_array_1d_int_memcpy (Mesh.NodeElts[node] + 1, Mesh.NodeElts[node][0], *pelts);
2548+
2549+
// periodic
2550+
if (Nodes.PerNodeQty > 0)
2551+
{
2552+
// is slave
2553+
if (Nodes.PerNodeMaster[node] > 0)
2554+
ut_array_1d_int_listpair_merge (*pelts, *peltqty, Mesh.NodeElts[Nodes.PerNodeMaster[node]] + 1,
2555+
Mesh.NodeElts[Nodes.PerNodeMaster[node]][0], pelts, peltqty);
2556+
2557+
// is master
2558+
else if (Nodes.PerNodeSlaveQty[node] > 0)
2559+
{
2560+
neut_mesh_nodes_allelts (Mesh, Nodes.PerNodeSlaveNb[node] + 1, Nodes.PerNodeSlaveQty[node], &nodeelts, &nodeeltqty);
2561+
ut_array_1d_int_listpair_merge (*pelts, *peltqty, nodeelts, nodeeltqty, pelts, peltqty);
2562+
}
2563+
}
2564+
2565+
return;
2566+
}

src/neut/neut_mesh/neut_mesh_topo/neut_mesh_topo.h

+3
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,9 @@ extern void neut_mesh_elt_domface (struct TESS Tess, struct MESH Mesh2D, int elt
395395

396396
extern void neut_mesh_order1nodes_order2node (struct MESH Mesh, int node1, int node2, int *pnode);
397397

398+
extern void neut_mesh_elt_nodes_per (struct NODES Nodes, struct MESH Mesh, int elt, int **pnodes, int *pnodeqty);
399+
extern void neut_mesh_node_elts_per (struct NODES Nodes, struct MESH Mesh, int node, int **pelts, int *peltqty);
400+
398401
#endif /* NEUT_MESH_TOPO_H */
399402

400403
#ifdef __cplusplus

src/neut/neut_nodes/neut_nodes.c

+70-18
Original file line numberDiff line numberDiff line change
@@ -316,16 +316,15 @@ neut_nodes_memcpy (struct NODES Nodes, struct NODES *pNodes2)
316316
if (Nodes.PerNodeSlaveNb)
317317
{
318318
(*pNodes2).PerNodeSlaveNb = ut_alloc_1d_pint ((*pNodes2).NodeQty + 1);
319-
for (i = 1; i <= (*pNodes2).PerNodeQty; i++)
320-
{
321-
id = (*pNodes2).PerNodeNb[i];
322-
(*pNodes2).PerNodeSlaveNb[id] =
323-
ut_alloc_1d_int ((*pNodes2).PerNodeSlaveQty[id] + 1);
324-
325-
ut_array_1d_int_memcpy (Nodes.PerNodeSlaveNb[id] + 1,
326-
(*pNodes2).PerNodeSlaveQty[id],
327-
(*pNodes2).PerNodeSlaveNb[id] + 1);
328-
}
319+
for (i = 1; i <= (*pNodes2).NodeQty; i++)
320+
if ((*pNodes2).PerNodeSlaveQty[i])
321+
{
322+
(*pNodes2).PerNodeSlaveNb[i] = ut_alloc_1d_int ((*pNodes2).PerNodeSlaveQty[i] + 1);
323+
324+
ut_array_1d_int_memcpy (Nodes.PerNodeSlaveNb[i] + 1,
325+
(*pNodes2).PerNodeSlaveQty[i],
326+
(*pNodes2).PerNodeSlaveNb[i] + 1);
327+
}
329328
}
330329
}
331330

@@ -629,21 +628,69 @@ neut_nodes_wbary (struct NODES Nodes, int *nodes, double *nodeweights,
629628
}
630629

631630
/* node_nbs[...] = new pos */
632-
/* RAM could be improved by more elegant exchange of lines (not through
633-
* a big copy coo array */
634631
void
635632
neut_nodes_renumber_switch (struct NODES *pNodes, int *node_nbs)
636633
{
637-
int i;
638-
double **coo = ut_alloc_2d ((*pNodes).NodeQty + 1, 3);
634+
int i, j;
635+
struct NODES Nodes2;
639636

640-
for (i = 1; i <= (*pNodes).NodeQty; i++)
641-
ut_array_1d_memcpy ((*pNodes).NodeCoo[i], 3, coo[i]);
637+
neut_nodes_set_zero (&Nodes2);
638+
neut_nodes_memcpy (*pNodes, &Nodes2);
642639

643640
for (i = 1; i <= (*pNodes).NodeQty; i++)
644-
ut_array_1d_memcpy (coo[i], 3, (*pNodes).NodeCoo[node_nbs[i]]);
641+
{
642+
ut_array_1d_memcpy (Nodes2.NodeCoo[i], 3, (*pNodes).NodeCoo[node_nbs[i]]);
643+
if ((*pNodes).NodeCl)
644+
(*pNodes).NodeCl[node_nbs[i]] = Nodes2.NodeCl[i];
645+
}
645646

646-
ut_free_2d (&coo, (*pNodes).NodeQty);
647+
if ((*pNodes).PerNodeQty > 0)
648+
{
649+
for (i = 1; i <= (*pNodes).PerNodeQty; i++)
650+
(*pNodes).PerNodeNb[i] = node_nbs[Nodes2.PerNodeNb[i]];
651+
652+
ut_array_1d_int_zero ((*pNodes).PerNodeMaster + 1, (*pNodes).NodeQty);
653+
ut_array_2d_int_zero ((*pNodes).PerNodeShift + 1, (*pNodes).NodeQty, 3);
654+
ut_array_1d_int_zero ((*pNodes).PerNodeSlaveQty + 1, (*pNodes).NodeQty);
655+
for (i = 1; i <= (*pNodes).NodeQty; i++)
656+
ut_free_1d_int ((*pNodes).PerNodeSlaveNb + i);
657+
658+
for (i = 1; i <= (*pNodes).NodeQty; i++)
659+
{
660+
(*pNodes).PerNodeMaster[node_nbs[i]] = node_nbs[Nodes2.PerNodeMaster[i]];
661+
ut_array_1d_int_memcpy (Nodes2.PerNodeShift[i], 3, (*pNodes).PerNodeShift[node_nbs[i]]);
662+
(*pNodes).PerNodeSlaveQty[node_nbs[i]] = Nodes2.PerNodeSlaveQty[i];
663+
if ((*pNodes).PerNodeSlaveQty[node_nbs[i]])
664+
{
665+
(*pNodes).PerNodeSlaveNb[node_nbs[i]] = ut_realloc_1d_int ((*pNodes).PerNodeSlaveNb[node_nbs[i]],
666+
(*pNodes).PerNodeSlaveQty[node_nbs[i]] + 1);
667+
for (j = 1; j <= Nodes2.PerNodeSlaveQty[i]; j++)
668+
(*pNodes).PerNodeSlaveNb[node_nbs[i]][j] = node_nbs[Nodes2.PerNodeSlaveNb[i][j]];
669+
}
670+
}
671+
}
672+
673+
if ((*pNodes).DupNodeQty > 0)
674+
{
675+
for (i = 1; i <= (*pNodes).DupNodeQty; i++)
676+
(*pNodes).DupNodeNb[i] = node_nbs[i];
677+
678+
for (i = 1; i <= (*pNodes).NodeQty; i++)
679+
{
680+
(*pNodes).DupNodeMaster[node_nbs[i]] = node_nbs[Nodes2.DupNodeMaster[i]];
681+
(*pNodes).DupNodeSeed[node_nbs[i]] = Nodes2.DupNodeSeed[i];
682+
(*pNodes).DupNodeSlaveQty[node_nbs[i]] = Nodes2.DupNodeSlaveQty[i];
683+
if ((*pNodes).DupNodeSlaveQty[node_nbs[i]])
684+
{
685+
(*pNodes).DupNodeSlaveNb[node_nbs[i]] = ut_realloc_1d_int ((*pNodes).DupNodeSlaveNb[node_nbs[i]],
686+
(*pNodes).DupNodeSlaveQty[node_nbs[i]] + 1);
687+
for (j = 1; j <= Nodes2.DupNodeSlaveQty[i]; j++)
688+
(*pNodes).DupNodeSlaveNb[node_nbs[i]][j] = node_nbs[Nodes2.DupNodeSlaveNb[i][j]];
689+
}
690+
}
691+
}
692+
693+
neut_nodes_free (&Nodes2);
647694

648695
return;
649696
}
@@ -716,6 +763,11 @@ neut_nodes_init_nodeslave (struct NODES *pNodes)
716763
{
717764
int i, master, slave;
718765

766+
if ((*pNodes).PerNodeSlaveQty)
767+
ut_free_1d_int (&(*pNodes).PerNodeSlaveQty);
768+
if ((*pNodes).PerNodeSlaveNb)
769+
ut_free_2d_int (&(*pNodes).PerNodeSlaveNb, (*pNodes).PerNodeQty);
770+
719771
(*pNodes).PerNodeSlaveQty = ut_alloc_1d_int ((*pNodes).NodeQty + 1);
720772
(*pNodes).PerNodeSlaveNb = ut_alloc_1d_pint ((*pNodes).NodeQty + 1);
721773

0 commit comments

Comments
 (0)