mirror of
https://github.com/NGSolve/netgen.git
synced 2024-11-11 16:49:16 +05:00
separat metis-partitioning call, pickling partition number of mesh elements
This commit is contained in:
parent
ca6d6e8ca7
commit
aa3f778d06
@ -1528,6 +1528,16 @@ namespace netgen
|
||||
|
||||
archive & *ident;
|
||||
|
||||
// cout << "archive, ngsversion = " << archive.GetVersion("netgen") << endl;
|
||||
if(archive.GetVersion("netgen") >= "v6.2.2103-1")
|
||||
{
|
||||
// cout << "do the partition" << endl;
|
||||
archive.NeedsVersion("netgen", "v6.2.2103-1");
|
||||
archive & vol_partition & surf_partition & seg_partition;
|
||||
}
|
||||
// else
|
||||
// cout << "no partition" << endl;
|
||||
|
||||
archive.Shallow(geometry);
|
||||
archive & *curvedelems;
|
||||
|
||||
|
@ -900,7 +900,7 @@ namespace netgen
|
||||
// void FindExchangeFaces ();
|
||||
|
||||
/// use metis to decompose master mesh
|
||||
void ParallelMetis (); // NgArray<int> & neloc );
|
||||
void ParallelMetis (int nproc); // NgArray<int> & neloc );
|
||||
void ParallelMetis (NgArray<int> & volume_weights, NgArray<int> & surface_weights,
|
||||
NgArray<int> & segment_weights);
|
||||
|
||||
|
@ -1250,7 +1250,9 @@ namespace netgen
|
||||
if (id != 0 || ntasks == 1 ) return;
|
||||
|
||||
#ifdef METIS
|
||||
ParallelMetis ();
|
||||
if (vol_partition.Size() < GetNE() || surf_partition.Size() < GetNSE() ||
|
||||
seg_partition.Size() < GetNSeg())
|
||||
ParallelMetis (comm.Size());
|
||||
#else
|
||||
for (ElementIndex ei = 0; ei < GetNE(); ei++)
|
||||
(*this)[ei].SetPartition(ntasks * ei/GetNE() + 1);
|
||||
@ -1269,7 +1271,7 @@ namespace netgen
|
||||
|
||||
|
||||
#ifdef METIS5
|
||||
void Mesh :: ParallelMetis ( )
|
||||
void Mesh :: ParallelMetis (int nproc)
|
||||
{
|
||||
PrintMessage (3, "call metis 5 ...");
|
||||
|
||||
@ -1304,7 +1306,7 @@ namespace netgen
|
||||
eptr.Append (eind.Size());
|
||||
NgArray<idx_t> epart(ne), npart(nn);
|
||||
|
||||
idxtype nparts = GetCommunicator().Size()-1;
|
||||
idxtype nparts = nproc-1; // GetCommunicator().Size()-1;
|
||||
|
||||
vol_partition.SetSize(GetNE());
|
||||
surf_partition.SetSize(GetNSE());
|
||||
@ -1329,9 +1331,14 @@ namespace netgen
|
||||
idxtype edgecut;
|
||||
|
||||
idxtype ncommon = 3;
|
||||
PrintMessage (3, "metis start");
|
||||
|
||||
static Timer tm("metis library");
|
||||
tm.Start();
|
||||
METIS_PartMeshDual (&ne, &nn, &eptr[0], &eind[0], NULL, NULL, &ncommon, &nparts,
|
||||
NULL, NULL,
|
||||
&edgecut, &epart[0], &npart[0]);
|
||||
tm.Stop();
|
||||
|
||||
/*
|
||||
METIS_PartMeshNodal (&ne, &nn, &eptr[0], &eind[0], NULL, NULL, &nparts,
|
||||
|
@ -644,6 +644,10 @@ DLL_HEADER void ExportNetgenMeshing(py::module &m)
|
||||
|
||||
.def_property_readonly("_timestamp", &Mesh::GetTimeStamp)
|
||||
.def_property_readonly("ne", [](Mesh& m) { return m.GetNE(); })
|
||||
.def("Partition", [](shared_ptr<Mesh> self, int numproc) {
|
||||
self->ParallelMetis(numproc);
|
||||
}, py::arg("numproc"))
|
||||
|
||||
.def("Distribute", [](shared_ptr<Mesh> self, NgMPI_Comm comm) {
|
||||
self->SetCommunicator(comm);
|
||||
if(comm.Size()==1) return self;
|
||||
|
@ -2383,7 +2383,7 @@ namespace netgen
|
||||
int nparts = atoi (argv[1]);
|
||||
ntasks = nparts+1;
|
||||
cout << "calling metis ... " << flush;
|
||||
mesh->ParallelMetis();
|
||||
mesh->ParallelMetis(ntasks);
|
||||
cout << "done" << endl;
|
||||
ntasks = 1;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user