mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-25 05:20:34 +05:00
parallel programming
This commit is contained in:
parent
789b56179e
commit
846542c45c
@ -2,8 +2,8 @@ ACLOCAL_AMFLAGS = -I m4
|
|||||||
|
|
||||||
METASOURCES = AUTO
|
METASOURCES = AUTO
|
||||||
|
|
||||||
SUBDIRS = libsrc ng nglib tutorials doc windows
|
SUBDIRS = libsrc ng tutorials doc windows
|
||||||
|
# nglib
|
||||||
# TESTS = ng/netgen -batchmode
|
# TESTS = ng/netgen -batchmode
|
||||||
|
|
||||||
|
|
||||||
|
12
configure.ac
12
configure.ac
@ -7,7 +7,7 @@ AC_PREFIX_DEFAULT(["/opt/netgen"])
|
|||||||
|
|
||||||
|
|
||||||
# Tcl/Tk configuration:
|
# Tcl/Tk configuration:
|
||||||
TEA_INIT([3.6])
|
TEA_INIT([3.9])
|
||||||
TEA_PATH_TCLCONFIG
|
TEA_PATH_TCLCONFIG
|
||||||
TEA_LOAD_TCLCONFIG
|
TEA_LOAD_TCLCONFIG
|
||||||
TEA_PATH_TKCONFIG
|
TEA_PATH_TKCONFIG
|
||||||
@ -89,11 +89,15 @@ AC_ARG_ENABLE([nglib],
|
|||||||
|
|
||||||
AC_ARG_ENABLE([parallel],
|
AC_ARG_ENABLE([parallel],
|
||||||
[AC_HELP_STRING([--enable-parallel],[enable mpi parallelization])],
|
[AC_HELP_STRING([--enable-parallel],[enable mpi parallelization])],
|
||||||
[AC_SUBST([MPI_INCLUDES], "-I/opt/mpich/include -DPARALLEL -I/usr/share/metis/Lib -DMETIS")
|
[AC_SUBST([MPI_INCLUDES], "-I/usr/lib64/mpi/gcc/openmpi/include -DPARALLEL -I/usr/include/metis -DMETIS")
|
||||||
AC_SUBST([MPI_LIBS], "-lmetis -L/opt/mpich/ch-p4/lib -lmpich")
|
AC_SUBST([MPI_LIBS], "-L/usr/lib64/mpi/gcc/openmpi/lib64 -lmpi_cxx -lmetis")
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
# [AC_SUBST([MPI_INCLUDES], "-I/opt/mpich/include -DPARALLEL -I/usr/include/metis -DMETIS")
|
||||||
|
# AC_SUBST([MPI_LIBS], " -L/opt/mpich/ch-p4/lib64 -lmpich -lmetis")
|
||||||
|
# [AC_SUBST([MPI_INCLUDES], "-DPARALLEL -DNO_PARALLEL_THREADS -I/opt/mpich/include")
|
||||||
|
# AC_SUBST([MPI_LIBS], "")
|
||||||
|
# -lmetis
|
||||||
# [AC_SUBST([MPI_INCLUDES], "-I/opt/mpich/include -DPARALLEL -I/home/joachim/download/metis-4.0/Lib -DMETIS")
|
# [AC_SUBST([MPI_INCLUDES], "-I/opt/mpich/include -DPARALLEL -I/home/joachim/download/metis-4.0/Lib -DMETIS")
|
||||||
# AC_SUBST([MPI_LIBS], "-L/home/joachim/download/metis-4.0 -lmetis -L/opt/mpich/ch-p4/lib64 -lmpich")
|
# AC_SUBST([MPI_LIBS], "-L/home/joachim/download/metis-4.0 -lmetis -L/opt/mpich/ch-p4/lib64 -lmpich")
|
||||||
|
|
||||||
|
@ -41,7 +41,6 @@ namespace netgen
|
|||||||
// which leads to an "order of destruction"-problem,
|
// which leads to an "order of destruction"-problem,
|
||||||
// thus we use the C-variant:
|
// thus we use the C-variant:
|
||||||
|
|
||||||
|
|
||||||
if (getenv ("NGPROFILE"))
|
if (getenv ("NGPROFILE"))
|
||||||
{
|
{
|
||||||
char filename[100];
|
char filename[100];
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
noinst_HEADERS = geom2dmesh.hpp spline2d.hpp splinegeometry.hpp spline.hpp geometry2d.hpp vsgeom2d.hpp
|
noinst_HEADERS = geom2dmesh.hpp splinegeometry.hpp spline.hpp geometry2d.hpp vsgeom2d.hpp
|
||||||
|
|
||||||
AM_CPPFLAGS = -I$(top_srcdir)/libsrc/include $(TCL_INCLUDES)
|
AM_CPPFLAGS = -I$(top_srcdir)/libsrc/include $(TCL_INCLUDES)
|
||||||
|
|
||||||
|
@ -976,9 +976,9 @@ void SplineGeometry<D> :: LoadData ( ifstream & infile )
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
template<int D>
|
void SplineGeometry2d :: PartitionBoundary (double h, Mesh & mesh2d)
|
||||||
void SplineGeometry<D> :: PartitionBoundary (double h, Mesh & mesh2d)
|
|
||||||
{
|
{
|
||||||
|
enum { D = 2 };
|
||||||
Box<D> bbox;
|
Box<D> bbox;
|
||||||
GetBoundingBox (bbox);
|
GetBoundingBox (bbox);
|
||||||
double dist = Dist (bbox.PMin(), bbox.PMax());
|
double dist = Dist (bbox.PMin(), bbox.PMax());
|
||||||
|
@ -38,6 +38,7 @@ namespace netgen
|
|||||||
template < int D >
|
template < int D >
|
||||||
class SplineGeometry
|
class SplineGeometry
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
Array < GeomPoint<D> > geompoints;
|
Array < GeomPoint<D> > geompoints;
|
||||||
Array < SplineSeg<D>* > splines;
|
Array < SplineSeg<D>* > splines;
|
||||||
double elto0;
|
double elto0;
|
||||||
@ -48,7 +49,6 @@ namespace netgen
|
|||||||
Array<bool> tensormeshing;
|
Array<bool> tensormeshing;
|
||||||
Array<int> layer;
|
Array<int> layer;
|
||||||
|
|
||||||
private:
|
|
||||||
void AppendSegment(SplineSeg<D> * spline, const int leftdomain, const int rightdomain,
|
void AppendSegment(SplineSeg<D> * spline, const int leftdomain, const int rightdomain,
|
||||||
const int bc,
|
const int bc,
|
||||||
const double reffac, const bool hprefleft, const bool hprefright,
|
const double reffac, const bool hprefleft, const bool hprefright,
|
||||||
@ -65,7 +65,6 @@ namespace netgen
|
|||||||
void LoadDataNew ( ifstream & infile );
|
void LoadDataNew ( ifstream & infile );
|
||||||
void LoadDataV2 ( ifstream & infile );
|
void LoadDataV2 ( ifstream & infile );
|
||||||
|
|
||||||
void PartitionBoundary (double h, Mesh & mesh2d);
|
|
||||||
|
|
||||||
void GetRawData (Array<double> & raw_data) const;
|
void GetRawData (Array<double> & raw_data) const;
|
||||||
|
|
||||||
@ -152,6 +151,8 @@ namespace netgen
|
|||||||
virtual int GenerateMesh (Mesh*& mesh, MeshingParameters & mparam,
|
virtual int GenerateMesh (Mesh*& mesh, MeshingParameters & mparam,
|
||||||
int perfstepsstart, int perfstepsend);
|
int perfstepsstart, int perfstepsend);
|
||||||
|
|
||||||
|
void PartitionBoundary (double h, Mesh & mesh2d);
|
||||||
|
|
||||||
virtual Refinement & GetRefinement () const;
|
virtual Refinement & GetRefinement () const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -27,9 +27,9 @@
|
|||||||
#include <typeinfo>
|
#include <typeinfo>
|
||||||
|
|
||||||
#ifdef PARALLEL
|
#ifdef PARALLEL
|
||||||
#undef SEEK_SET
|
// #undef SEEK_SET
|
||||||
#undef SEEK_CUR
|
// #undef SEEK_CUR
|
||||||
#undef SEEK_END
|
// #undef SEEK_END
|
||||||
#include <mpi.h>
|
#include <mpi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ namespace netgen
|
|||||||
for(int elind = 1; elind <= ne; elind++)
|
for(int elind = 1; elind <= ne; elind++)
|
||||||
{
|
{
|
||||||
// Extract the current volume element
|
// Extract the current volume element
|
||||||
const Element & el = mesh.VolumeElement(elind);
|
// const Element & el = mesh.VolumeElement(elind);
|
||||||
|
|
||||||
// Get the face numbers of the faces of the current volume element
|
// Get the face numbers of the faces of the current volume element
|
||||||
// The values returned are given a sign depending on the orientation
|
// The values returned are given a sign depending on the orientation
|
||||||
@ -596,7 +596,6 @@ namespace netgen
|
|||||||
|
|
||||||
void WriteOpenFOAM15xFormat (const Mesh & mesh, const string & casename)
|
void WriteOpenFOAM15xFormat (const Mesh & mesh, const string & casename)
|
||||||
{
|
{
|
||||||
int i,j;
|
|
||||||
bool error = false;
|
bool error = false;
|
||||||
char casefiles[256];
|
char casefiles[256];
|
||||||
|
|
||||||
@ -627,8 +626,8 @@ namespace netgen
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if((mesh.SurfaceElement(nse/2).GetType() != TRIG)
|
if(( (mesh.SurfaceElement(nse/2).GetType() != TRIG)
|
||||||
&& (mesh.SurfaceElement(nse/2).GetType() != QUAD)
|
&& (mesh.SurfaceElement(nse/2).GetType() != QUAD) )
|
||||||
|| (mesh.VolumeElement(ne/2).GetType() == TET10)
|
|| (mesh.VolumeElement(ne/2).GetType() == TET10)
|
||||||
|| (mesh.VolumeElement(ne/2).GetType() == PRISM12))
|
|| (mesh.VolumeElement(ne/2).GetType() == PRISM12))
|
||||||
{
|
{
|
||||||
|
@ -14,7 +14,9 @@ clusters.hpp hprefinement.hpp improve3.hpp meshtype.hpp \
|
|||||||
|
|
||||||
|
|
||||||
METASOURCES = AUTO
|
METASOURCES = AUTO
|
||||||
noinst_LTLIBRARIES = libmesh.la
|
|
||||||
|
lib_LTLIBRARIES = libmesh.la
|
||||||
|
|
||||||
libmesh_la_SOURCES = adfront2.cpp adfront3.cpp bisect.cpp boundarylayer.cpp \
|
libmesh_la_SOURCES = adfront2.cpp adfront3.cpp bisect.cpp boundarylayer.cpp \
|
||||||
clusters.cpp curvedelems.cpp delaunay.cpp delaunay2d.cpp \
|
clusters.cpp curvedelems.cpp delaunay.cpp delaunay2d.cpp \
|
||||||
geomsearch.cpp global.cpp hprefinement.cpp improve2.cpp \
|
geomsearch.cpp global.cpp hprefinement.cpp improve2.cpp \
|
||||||
|
@ -5,14 +5,17 @@
|
|||||||
|
|
||||||
|
|
||||||
#ifdef METIS
|
#ifdef METIS
|
||||||
namespace metis { extern "C" {
|
namespace metis
|
||||||
|
{
|
||||||
|
extern "C" {
|
||||||
#include <metis.h>
|
#include <metis.h>
|
||||||
} }
|
}
|
||||||
|
}
|
||||||
|
using namespace metis;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
using namespace metis;
|
|
||||||
|
|
||||||
namespace netgen
|
namespace netgen
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -311,8 +314,6 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// distribute the mesh to the slave processors
|
// distribute the mesh to the slave processors
|
||||||
// call it only for the master !
|
// call it only for the master !
|
||||||
void Mesh :: Distribute ()
|
void Mesh :: Distribute ()
|
||||||
@ -326,7 +327,12 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
// partition mesh
|
// partition mesh
|
||||||
|
#ifdef METIS
|
||||||
ParallelMetis ();
|
ParallelMetis ();
|
||||||
|
#else
|
||||||
|
for (ElementIndex ei = 0; ei < GetNE(); ei++)
|
||||||
|
(*this)[ei].SetPartition(ntasks * ei/GetNE() + 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SCALASCA
|
#ifdef SCALASCA
|
||||||
#pragma pomp inst end(metis)
|
#pragma pomp inst end(metis)
|
||||||
@ -349,7 +355,7 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef METIS
|
||||||
void Mesh :: ParallelMetis ( )
|
void Mesh :: ParallelMetis ( )
|
||||||
{
|
{
|
||||||
int timer = NgProfiler::CreateTimer ("Mesh::Partition");
|
int timer = NgProfiler::CreateTimer ("Mesh::Partition");
|
||||||
@ -475,12 +481,12 @@ namespace netgen
|
|||||||
delete [] epart;
|
delete [] epart;
|
||||||
delete [] npart;
|
delete [] npart;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void Mesh :: PartHybridMesh () // Array<int> & neloc )
|
void Mesh :: PartHybridMesh () // Array<int> & neloc )
|
||||||
{
|
{
|
||||||
|
#ifdef METIS
|
||||||
int ne = GetNE();
|
int ne = GetNE();
|
||||||
|
|
||||||
int nn = GetNP();
|
int nn = GetNP();
|
||||||
@ -571,11 +577,15 @@ namespace netgen
|
|||||||
delete [] xadj;
|
delete [] xadj;
|
||||||
delete [] part;
|
delete [] part;
|
||||||
delete [] adjacency;
|
delete [] adjacency;
|
||||||
|
#else
|
||||||
|
cout << "parthybridmesh not available" << endl;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void Mesh :: PartDualHybridMesh ( ) // Array<int> & neloc )
|
void Mesh :: PartDualHybridMesh ( ) // Array<int> & neloc )
|
||||||
{
|
{
|
||||||
|
#ifdef METIS
|
||||||
int ne = GetNE();
|
int ne = GetNE();
|
||||||
|
|
||||||
// int nn = GetNP();
|
// int nn = GetNP();
|
||||||
@ -677,6 +687,10 @@ namespace netgen
|
|||||||
delete [] xadj;
|
delete [] xadj;
|
||||||
delete [] part;
|
delete [] part;
|
||||||
delete [] adjacency;
|
delete [] adjacency;
|
||||||
|
#else
|
||||||
|
cout << "partdualmesh not available" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -685,6 +699,7 @@ namespace netgen
|
|||||||
|
|
||||||
void Mesh :: PartDualHybridMesh2D ( )
|
void Mesh :: PartDualHybridMesh2D ( )
|
||||||
{
|
{
|
||||||
|
#ifdef METIS
|
||||||
int ne = GetNSE();
|
int ne = GetNSE();
|
||||||
int nv = GetNV();
|
int nv = GetNV();
|
||||||
|
|
||||||
@ -758,6 +773,10 @@ namespace netgen
|
|||||||
|
|
||||||
for (SurfaceElementIndex sei = 0; sei < ne; sei++)
|
for (SurfaceElementIndex sei = 0; sei < ne; sei++)
|
||||||
(*this) [sei].SetPartition (part[sei]+1);
|
(*this) [sei].SetPartition (part[sei]+1);
|
||||||
|
#else
|
||||||
|
cout << "partdualmesh not available" << endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,6 +7,44 @@
|
|||||||
namespace netgen
|
namespace netgen
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void QuickSortRec (FlatArray<T> & data,
|
||||||
|
int left, int right)
|
||||||
|
{
|
||||||
|
int i = left;
|
||||||
|
int j = right;
|
||||||
|
T midval = data[(left+right)/2];
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
while (data[i] < midval) i++;
|
||||||
|
while (midval < data[j]) j--;
|
||||||
|
|
||||||
|
if (i <= j)
|
||||||
|
{
|
||||||
|
Swap (data[i], data[j]);
|
||||||
|
i++; j--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (i <= j);
|
||||||
|
if (left < j) QuickSortRec (data, left, j);
|
||||||
|
if (i < right) QuickSortRec (data, i, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void QuickSort (FlatArray<T> & data)
|
||||||
|
{
|
||||||
|
if (data.Size() > 1)
|
||||||
|
QuickSortRec (data, 0, data.Size()-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
MeshTopology :: MeshTopology (const Mesh & amesh)
|
MeshTopology :: MeshTopology (const Mesh & amesh)
|
||||||
: mesh(amesh)
|
: mesh(amesh)
|
||||||
{
|
{
|
||||||
@ -85,8 +123,7 @@ namespace netgen
|
|||||||
for (ElementIndex ei = 0; ei < ne; ei++)
|
for (ElementIndex ei = 0; ei < ne; ei++)
|
||||||
{
|
{
|
||||||
const Element & el = mesh[ei];
|
const Element & el = mesh[ei];
|
||||||
int nelv = el.GetNV();
|
for (int j = 0; j < el.GetNV(); j++)
|
||||||
for (int j = 0; j < nelv; j++)
|
|
||||||
cnt[el[j]]++;
|
cnt[el[j]]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,8 +131,7 @@ namespace netgen
|
|||||||
for (ElementIndex ei = 0; ei < ne; ei++)
|
for (ElementIndex ei = 0; ei < ne; ei++)
|
||||||
{
|
{
|
||||||
const Element & el = mesh[ei];
|
const Element & el = mesh[ei];
|
||||||
int nelv = el.GetNV();
|
for (int j = 0; j < el.GetNV(); j++)
|
||||||
for (int j = 0; j < nelv; j++)
|
|
||||||
vert2element->AddSave (el[j], ei+1);
|
vert2element->AddSave (el[j], ei+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -103,8 +139,7 @@ namespace netgen
|
|||||||
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
||||||
{
|
{
|
||||||
const Element2d & el = mesh[sei];
|
const Element2d & el = mesh[sei];
|
||||||
int nelv = el.GetNV();
|
for (int j = 0; j < el.GetNV(); j++)
|
||||||
for (int j = 0; j < nelv; j++)
|
|
||||||
cnt[el[j]]++;
|
cnt[el[j]]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,8 +147,7 @@ namespace netgen
|
|||||||
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
for (SurfaceElementIndex sei = 0; sei < nse; sei++)
|
||||||
{
|
{
|
||||||
const Element2d & el = mesh[sei];
|
const Element2d & el = mesh[sei];
|
||||||
int nelv = el.GetNV();
|
for (int j = 0; j < el.GetNV(); j++)
|
||||||
for (int j = 0; j < nelv; j++)
|
|
||||||
vert2surfelement->AddSave (el[j], sei+1);
|
vert2surfelement->AddSave (el[j], sei+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +168,6 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (buildedges)
|
if (buildedges)
|
||||||
{
|
{
|
||||||
static int timer1 = NgProfiler::CreateTimer ("topology::buildedges");
|
static int timer1 = NgProfiler::CreateTimer ("topology::buildedges");
|
||||||
@ -197,6 +230,8 @@ namespace netgen
|
|||||||
|
|
||||||
Array<int,PointIndex::BASE> edgenr(nv);
|
Array<int,PointIndex::BASE> edgenr(nv);
|
||||||
Array<int,PointIndex::BASE> edgeflag(nv);
|
Array<int,PointIndex::BASE> edgeflag(nv);
|
||||||
|
Array<int> vertex2;
|
||||||
|
|
||||||
edgeflag = 0;
|
edgeflag = 0;
|
||||||
|
|
||||||
ned = edge2vert.Size();
|
ned = edge2vert.Size();
|
||||||
@ -204,6 +239,8 @@ namespace netgen
|
|||||||
|
|
||||||
for (int i = PointIndex::BASE; i < nv+PointIndex::BASE; i++)
|
for (int i = PointIndex::BASE; i < nv+PointIndex::BASE; i++)
|
||||||
{
|
{
|
||||||
|
vertex2.SetSize (0);
|
||||||
|
|
||||||
for (int j = 0; j < vert2edge[i].Size(); j++)
|
for (int j = 0; j < vert2edge[i].Size(); j++)
|
||||||
{
|
{
|
||||||
int ednr = vert2edge[i][j];
|
int ednr = vert2edge[i][j];
|
||||||
@ -211,15 +248,95 @@ namespace netgen
|
|||||||
edgeflag[i2] = i;
|
edgeflag[i2] = i;
|
||||||
edgenr[i2] = ednr;
|
edgenr[i2] = ednr;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int j = 0; j < vert2vertcoarse[i].Size(); j++) // fix by Markus
|
for (int j = 0; j < vert2vertcoarse[i].Size(); j++) // fix by Markus
|
||||||
{
|
{
|
||||||
int v2 = vert2vertcoarse[i][j];
|
int v2 = vert2vertcoarse[i][j];
|
||||||
if (edgeflag[v2] < i)
|
if (edgeflag[v2] < i)
|
||||||
{
|
{
|
||||||
ned++;
|
*testout << "do we really need that ??????????????" << endl;
|
||||||
edgenr[v2] = ned;
|
// ned++;
|
||||||
|
// edgenr[v2] = ned;
|
||||||
edgeflag[v2] = i;
|
edgeflag[v2] = i;
|
||||||
missing.Append (INDEX_3(i,v2,ned));
|
vertex2.Append (v2);
|
||||||
|
// missing.Append (INDEX_3(i,v2,ned));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < (*vert2element)[i].Size(); j++)
|
||||||
|
{
|
||||||
|
int elnr = (*vert2element)[i][j];
|
||||||
|
const Element & el = mesh.VolumeElement (elnr);
|
||||||
|
|
||||||
|
int neledges = GetNEdges (el.GetType());
|
||||||
|
const ELEMENT_EDGE * eledges = GetEdges0 (el.GetType());
|
||||||
|
|
||||||
|
for (int k = 0; k < neledges; k++)
|
||||||
|
{
|
||||||
|
INDEX_2 edge(el[eledges[k][0]], el[eledges[k][1]]);
|
||||||
|
edge.Sort();
|
||||||
|
if (edge.I1() != i) continue;
|
||||||
|
|
||||||
|
if (edgeflag[edge.I2()] < i)
|
||||||
|
{
|
||||||
|
vertex2.Append (edge.I2());
|
||||||
|
edgeflag[edge.I2()] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < (*vert2surfelement)[i].Size(); j++)
|
||||||
|
{
|
||||||
|
int elnr = (*vert2surfelement)[i][j];
|
||||||
|
const Element2d & el = mesh.SurfaceElement (elnr);
|
||||||
|
|
||||||
|
int neledges = GetNEdges (el.GetType());
|
||||||
|
const ELEMENT_EDGE * eledges = GetEdges0 (el.GetType());
|
||||||
|
|
||||||
|
for (int k = 0; k < neledges; k++)
|
||||||
|
{
|
||||||
|
INDEX_2 edge(el[eledges[k][0]], el[eledges[k][1]]);
|
||||||
|
edge.Sort();
|
||||||
|
if (edge.I1() != i) continue;
|
||||||
|
|
||||||
|
if (edgeflag[edge.I2()] < i)
|
||||||
|
{
|
||||||
|
vertex2.Append (edge.I2());
|
||||||
|
edgeflag[edge.I2()] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < (*vert2segment)[i].Size(); j++)
|
||||||
|
{
|
||||||
|
int elnr = (*vert2segment)[i][j];
|
||||||
|
const Segment & el = mesh.LineSegment (elnr);
|
||||||
|
|
||||||
|
INDEX_2 edge(el[0], el[1]);
|
||||||
|
edge.Sort();
|
||||||
|
if (edge.I1() != i) continue;
|
||||||
|
|
||||||
|
if (edgeflag[edge.I2()] < i)
|
||||||
|
{
|
||||||
|
vertex2.Append (edge.I2());
|
||||||
|
edgeflag[edge.I2()] = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QuickSort (vertex2);
|
||||||
|
for (int j = 0; j < vertex2.Size(); j++)
|
||||||
|
edgenr[vertex2[j]] = ++ned;
|
||||||
|
|
||||||
|
for (int j = 0; j < vert2vertcoarse[i].Size(); j++) // fix by Markus
|
||||||
|
{
|
||||||
|
int v2 = vert2vertcoarse[i][j];
|
||||||
|
if (edgeflag[v2] < i)
|
||||||
|
{
|
||||||
|
// ned++;
|
||||||
|
// edgenr[v2] = ned;
|
||||||
|
// edgeflag[v2] = i;
|
||||||
|
missing.Append (INDEX_3(i,v2,edgenr[v2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,13 +358,6 @@ namespace netgen
|
|||||||
if (edge.I1() != i)
|
if (edge.I1() != i)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (edgeflag[edge.I2()] < i)
|
|
||||||
{
|
|
||||||
ned++;
|
|
||||||
edgenr[edge.I2()] = ned;
|
|
||||||
edgeflag[edge.I2()] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int edgenum = edgenr[edge.I2()];
|
int edgenum = edgenr[edge.I2()];
|
||||||
if (edgedir) edgenum *= -1;
|
if (edgedir) edgenum *= -1;
|
||||||
edges.Elem(elnr)[k] = edgenum;
|
edges.Elem(elnr)[k] = edgenum;
|
||||||
@ -269,15 +379,7 @@ namespace netgen
|
|||||||
int edgedir = (edge.I1() > edge.I2());
|
int edgedir = (edge.I1() > edge.I2());
|
||||||
if (edgedir) swap (edge.I1(), edge.I2());
|
if (edgedir) swap (edge.I1(), edge.I2());
|
||||||
|
|
||||||
if (edge.I1() != i)
|
if (edge.I1() != i) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if (edgeflag[edge.I2()] < i)
|
|
||||||
{
|
|
||||||
ned++;
|
|
||||||
edgenr[edge.I2()] = ned;
|
|
||||||
edgeflag[edge.I2()] = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int edgenum = edgenr[edge.I2()];
|
int edgenum = edgenr[edge.I2()];
|
||||||
if (edgedir) edgenum *= -1;
|
if (edgedir) edgenum *= -1;
|
||||||
@ -295,23 +397,16 @@ namespace netgen
|
|||||||
int edgedir = (edge.I1() > edge.I2());
|
int edgedir = (edge.I1() > edge.I2());
|
||||||
if (edgedir) swap (edge.I1(), edge.I2());
|
if (edgedir) swap (edge.I1(), edge.I2());
|
||||||
|
|
||||||
if (edge.I1() != i)
|
if (edge.I1() != i) continue;
|
||||||
continue;
|
|
||||||
|
|
||||||
if (edgeflag[edge.I2()] < i)
|
|
||||||
{
|
|
||||||
ned++;
|
|
||||||
edgenr[edge.I2()] = ned;
|
|
||||||
edgeflag[edge.I2()] = i;
|
|
||||||
}
|
|
||||||
int edgenum = edgenr[edge.I2()];
|
int edgenum = edgenr[edge.I2()];
|
||||||
|
|
||||||
if (edgedir) edgenum *= -1;
|
if (edgedir) edgenum *= -1;
|
||||||
segedges.Elem(elnr) = edgenum;
|
segedges.Elem(elnr) = edgenum;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
edge2vert.SetSize (ned);
|
edge2vert.SetSize (ned);
|
||||||
for (int i = 1; i <= ne; i++)
|
for (int i = 1; i <= ne; i++)
|
||||||
{
|
{
|
||||||
@ -333,6 +428,11 @@ namespace netgen
|
|||||||
edge2vert.Elem(edgenum)[1] = edge.I2();
|
edge2vert.Elem(edgenum)[1] = edge.I2();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*testout << "edge 2 vert:" << endl;
|
||||||
|
for (int i = 0; i < edge2vert.Size(); i++)
|
||||||
|
*testout << edge2vert[i][0] << " " << edge2vert[i][1] << endl;
|
||||||
|
|
||||||
for (int i = 1; i <= nse; i++)
|
for (int i = 1; i <= nse; i++)
|
||||||
{
|
{
|
||||||
const Element2d & el = mesh.SurfaceElement (i);
|
const Element2d & el = mesh.SurfaceElement (i);
|
||||||
|
@ -752,7 +752,7 @@ namespace netgen
|
|||||||
GLXContextID xid = glXGetContextIDEXT (ctx);
|
GLXContextID xid = glXGetContextIDEXT (ctx);
|
||||||
|
|
||||||
displname = XDisplayName (0);
|
displname = XDisplayName (0);
|
||||||
|
/*
|
||||||
cout << "Init Parallel GL" << endl;
|
cout << "Init Parallel GL" << endl;
|
||||||
cout << "DisplayName = " << displname << endl;
|
cout << "DisplayName = " << displname << endl;
|
||||||
cout << "current display = " << dpy << endl;
|
cout << "current display = " << dpy << endl;
|
||||||
@ -762,6 +762,7 @@ namespace netgen
|
|||||||
cout << "contextid = " << xid << endl;
|
cout << "contextid = " << xid << endl;
|
||||||
cout << "isdirect = " << glXIsDirect ( dpy, ctx ) << endl;
|
cout << "isdirect = " << glXIsDirect ( dpy, ctx ) << endl;
|
||||||
cout << "extensionstring = " << glXQueryExtensionsString( dpy, 0 ) << endl;
|
cout << "extensionstring = " << glXQueryExtensionsString( dpy, 0 ) << endl;
|
||||||
|
*/
|
||||||
|
|
||||||
Array<MPI_Request> request(ntasks);
|
Array<MPI_Request> request(ntasks);
|
||||||
MPI_Status status;
|
MPI_Status status;
|
||||||
|
@ -1020,6 +1020,7 @@ namespace netgen
|
|||||||
|
|
||||||
|
|
||||||
#ifdef PARALLEL
|
#ifdef PARALLEL
|
||||||
|
/*
|
||||||
if ( el.IsGhost() )
|
if ( el.IsGhost() )
|
||||||
{
|
{
|
||||||
if ( faceindex == selface )
|
if ( faceindex == selface )
|
||||||
@ -1028,6 +1029,7 @@ namespace netgen
|
|||||||
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_coll_transp);
|
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_coll_transp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
*/
|
||||||
{
|
{
|
||||||
if ( faceindex == selface )
|
if ( faceindex == selface )
|
||||||
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcolsel);
|
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, matcolsel);
|
||||||
@ -1894,9 +1896,20 @@ namespace netgen
|
|||||||
|
|
||||||
for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
|
for (ElementIndex ei = 0; ei < mesh->GetNE(); ei++)
|
||||||
{
|
{
|
||||||
if (vispar.drawtetsdomain > 0 &&
|
if (vispar.drawtetsdomain > 0)
|
||||||
vispar.drawtetsdomain != (*mesh)[ei].GetIndex())
|
{
|
||||||
continue;
|
int tetid =
|
||||||
|
#ifdef PARALLEL
|
||||||
|
vispar.drawmetispartition ?
|
||||||
|
(*mesh)[ei].GetPartition()
|
||||||
|
:
|
||||||
|
#endif
|
||||||
|
(*mesh)[ei].GetIndex();
|
||||||
|
|
||||||
|
if (vispar.drawtetsdomain != tetid)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
const Element & el = (*mesh)[ei];
|
const Element & el = (*mesh)[ei];
|
||||||
|
|
||||||
|
@ -12,8 +12,6 @@ netgen_LDADD = $(top_builddir)/libsrc/visualization/libvisual.a \
|
|||||||
$(top_builddir)/libsrc/geom2d/libgeom2dvis.la \
|
$(top_builddir)/libsrc/geom2d/libgeom2dvis.la \
|
||||||
$(top_builddir)/libsrc/geom2d/libgeom2d.la \
|
$(top_builddir)/libsrc/geom2d/libgeom2d.la \
|
||||||
$(top_builddir)/libsrc/interface/libinterface.la \
|
$(top_builddir)/libsrc/interface/libinterface.la \
|
||||||
$(top_builddir)/libsrc/occ/liboccvis.la \
|
|
||||||
$(top_builddir)/libsrc/occ/libocc.la \
|
|
||||||
$(top_builddir)/libsrc/stlgeom/libstlvis.la \
|
$(top_builddir)/libsrc/stlgeom/libstlvis.la \
|
||||||
$(top_builddir)/libsrc/stlgeom/libstl.la \
|
$(top_builddir)/libsrc/stlgeom/libstl.la \
|
||||||
$(top_builddir)/libsrc/meshing/libmesh.la \
|
$(top_builddir)/libsrc/meshing/libmesh.la \
|
||||||
@ -22,6 +20,10 @@ netgen_LDADD = $(top_builddir)/libsrc/visualization/libvisual.a \
|
|||||||
$(top_builddir)/libsrc/general/libgen.la \
|
$(top_builddir)/libsrc/general/libgen.la \
|
||||||
$(OCCLIBS) -L$(TK_BIN_DIR)/Togl1.7 $(TOGLLIBDIR) -lTogl1.7 $(LIBGLU) $(TK_LIB_SPEC) $(TCL_LIB_SPEC) $(MPI_LIBS) $(FFMPEG_LIBS) $(JPEGLIB_LIBS) $(PKG_LIBS)
|
$(OCCLIBS) -L$(TK_BIN_DIR)/Togl1.7 $(TOGLLIBDIR) -lTogl1.7 $(LIBGLU) $(TK_LIB_SPEC) $(TCL_LIB_SPEC) $(MPI_LIBS) $(FFMPEG_LIBS) $(JPEGLIB_LIBS) $(PKG_LIBS)
|
||||||
|
|
||||||
|
# $(top_builddir)/libsrc/occ/liboccvis.la
|
||||||
|
# $(top_builddir)/libsrc/occ/libocc.la
|
||||||
|
|
||||||
|
|
||||||
# add for static linkage of ngsolve:
|
# add for static linkage of ngsolve:
|
||||||
# /opt/netgen/lib/libngsolve.a /opt/netgen/lib/libngcomp.a /opt/netgen/lib/libngcomp.a /opt/netgen/lib/libngfemng.a /opt/netgen/lib/libngmg.a /opt/netgen/lib/libngla.a /opt/netgen/lib/libngbla.a /opt/netgen/lib/libngstd.a -L/opt/intel/mkl/10.2.1.017/lib/em64t /opt/intel/mkl/10.2.1.017/lib/em64t/libmkl_solver_lp64.a -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core
|
# /opt/netgen/lib/libngsolve.a /opt/netgen/lib/libngcomp.a /opt/netgen/lib/libngcomp.a /opt/netgen/lib/libngfemng.a /opt/netgen/lib/libngmg.a /opt/netgen/lib/libngla.a /opt/netgen/lib/libngbla.a /opt/netgen/lib/libngstd.a -L/opt/intel/mkl/10.2.1.017/lib/em64t /opt/intel/mkl/10.2.1.017/lib/em64t/libmkl_solver_lp64.a -lmkl_intel_lp64 -lmkl_gnu_thread -lmkl_core
|
||||||
#
|
#
|
||||||
|
@ -129,8 +129,8 @@ int main(int argc, char ** argv)
|
|||||||
|
|
||||||
|
|
||||||
#ifdef PARALLEL
|
#ifdef PARALLEL
|
||||||
cout << "Including MPI " << endl;
|
cout << "Running MPI - parallel using "
|
||||||
cout << "Using " << netgen::ntasks << " processor"
|
<< netgen::ntasks << " processor"
|
||||||
<< ((netgen::ntasks > 1) ? "s " : " ") << endl;
|
<< ((netgen::ntasks > 1) ? "s " : " ") << endl;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
#ifdef PARALLEL
|
#ifdef PARALLEL
|
||||||
|
|
||||||
|
#include "dlfcn.h"
|
||||||
|
|
||||||
#ifdef OCCGEOMETRY
|
#ifdef OCCGEOMETRY
|
||||||
#include <occgeom.hpp>
|
#include <occgeom.hpp>
|
||||||
#endif
|
#endif
|
||||||
@ -29,7 +31,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <geometry2d.hpp>
|
#include <geometry2d.hpp>
|
||||||
#include <stlgeom.hpp>
|
#include <stlgeom.hpp>
|
||||||
|
|
||||||
@ -48,11 +49,8 @@
|
|||||||
#include "parallelfunc.hpp"
|
#include "parallelfunc.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
// extern "C" void NGS_ParallelRun (const string & message);
|
||||||
|
void (*NGS_ParallelRun) (const string & message) = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -71,49 +69,17 @@ void Parallel_Exit();
|
|||||||
|
|
||||||
namespace netgen {
|
namespace netgen {
|
||||||
extern AutoPtr<Mesh> mesh;
|
extern AutoPtr<Mesh> mesh;
|
||||||
|
|
||||||
// geometry: either CSG, or, if an other is non-null,
|
|
||||||
// then the other
|
|
||||||
extern AutoPtr<CSGeometry> geometry ;
|
|
||||||
|
|
||||||
extern STLGeometry * stlgeometry;
|
|
||||||
extern AutoPtr<SplineGeometry2d> geometry2d ;
|
|
||||||
|
|
||||||
#ifdef OCCGEOMETRY
|
|
||||||
extern OCCGeometry * occgeometry;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef ACIS
|
|
||||||
extern ACISGeometry * acisgeometry;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using namespace netgen;
|
using namespace netgen;
|
||||||
using netgen::RegisterUserFormats;
|
using netgen::RegisterUserFormats;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef PARALLEL
|
#ifdef PARALLEL
|
||||||
void Ng_Exit ()
|
void Ng_Exit ()
|
||||||
{
|
{
|
||||||
#ifdef NGSOLVE
|
// Parallel_Exit();
|
||||||
Parallel_Exit();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
delete stlgeometry;
|
|
||||||
stlgeometry = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef OCCGEOMETRY
|
|
||||||
delete occgeometry;
|
|
||||||
occgeometry = 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
geometry.Reset (NULL);
|
|
||||||
geometry2d.Reset (NULL);
|
|
||||||
|
|
||||||
// delete testout;
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -152,15 +118,31 @@ void ParallelRun()
|
|||||||
#pragma pomp inst end (message)
|
#pragma pomp inst end (message)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef NGSOLVE
|
|
||||||
|
|
||||||
if ( message.compare(0, 3, "ngs") == 0 )
|
if ( message.compare(0, 3, "ngs") == 0 )
|
||||||
{
|
{
|
||||||
PrintMessage ( 2, "Starting NgSolve routine ", message ) ;
|
PrintMessage ( 1, "Starting NgSolve routine ", message ) ;
|
||||||
NGS_ParallelRun (message);
|
|
||||||
|
if (NGS_ParallelRun == NULL)
|
||||||
|
{
|
||||||
|
void * handle = dlopen ("libngsolve.so", RTLD_NOW | RTLD_GLOBAL);
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
cerr << "cannot load shared library libngsolve.so" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
NGS_ParallelRun = (void (*) (const string & message)) dlsym (handle, "NGS_ParallelRun");
|
||||||
|
|
||||||
|
if (!NGS_ParallelRun)
|
||||||
|
{
|
||||||
|
cerr << "cannot bind function NGS_ParallelRun" << endl;
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(*NGS_ParallelRun) (message);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( message == "mesh" )
|
if ( message == "mesh" )
|
||||||
{
|
{
|
||||||
@ -274,14 +256,16 @@ void ParallelRun()
|
|||||||
Window win;
|
Window win;
|
||||||
int wx, wy;
|
int wx, wy;
|
||||||
unsigned int ww, wh, bw, depth;
|
unsigned int ww, wh, bw, depth;
|
||||||
cout << "got drawable: " << curDrawable << endl;
|
// cout << "got drawable: " << curDrawable << endl;
|
||||||
|
|
||||||
XGetGeometry(display, curDrawable, &win,
|
XGetGeometry(display, curDrawable, &win,
|
||||||
&wx, &wy, &ww, &wh,
|
&wx, &wy, &ww, &wh,
|
||||||
&bw, &depth);
|
&bw, &depth);
|
||||||
|
|
||||||
|
/*
|
||||||
cout << "P" << id << ": window-props: x = " << wx << ", y = " << wy
|
cout << "P" << id << ": window-props: x = " << wx << ", y = " << wy
|
||||||
<< ", w = " << ww << ", h = " << wh << ", depth = " << depth << endl;
|
<< ", w = " << ww << ", h = " << wh << ", depth = " << depth << endl;
|
||||||
|
*/
|
||||||
|
|
||||||
#define VISUAL
|
#define VISUAL
|
||||||
#ifdef VISUAL
|
#ifdef VISUAL
|
||||||
@ -348,7 +332,7 @@ void ParallelRun()
|
|||||||
|
|
||||||
// context = glXCreateContext( display, visinfo, 0, /* curContext, */ False );
|
// context = glXCreateContext( display, visinfo, 0, /* curContext, */ False );
|
||||||
context = glXCreateContext( display, visinfo, glXImportContextEXT ( display, contextid ), False );
|
context = glXCreateContext( display, visinfo, glXImportContextEXT ( display, contextid ), False );
|
||||||
cout << "context = " << context << endl;
|
// cout << "context = " << context << endl;
|
||||||
|
|
||||||
glXMakeCurrent (display, curDrawable, context);
|
glXMakeCurrent (display, curDrawable, context);
|
||||||
|
|
||||||
@ -387,7 +371,7 @@ void ParallelRun()
|
|||||||
if (redraw_cmd == "filledlist")
|
if (redraw_cmd == "filledlist")
|
||||||
{
|
{
|
||||||
glXMakeCurrent (display, curDrawable, context);
|
glXMakeCurrent (display, curDrawable, context);
|
||||||
vsmesh.BuildFilledList();
|
vsmesh.BuildFilledList (0);
|
||||||
glXMakeCurrent (display, None, NULL);
|
glXMakeCurrent (display, None, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@ namespace netgen
|
|||||||
extern AutoPtr<Mesh> mesh;
|
extern AutoPtr<Mesh> mesh;
|
||||||
|
|
||||||
|
|
||||||
using namespace netgen;
|
|
||||||
|
|
||||||
|
|
||||||
// int NgPar_Glob2Loc_SurfEl ( int globnum )
|
// int NgPar_Glob2Loc_SurfEl ( int globnum )
|
||||||
@ -32,7 +31,9 @@ namespace netgen
|
|||||||
// {
|
// {
|
||||||
// return mesh->GetParallelTopology().Glob2Loc_Vert(globnum+1) -1;
|
// return mesh->GetParallelTopology().Glob2Loc_Vert(globnum+1) -1;
|
||||||
// }
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
using namespace netgen;
|
||||||
|
|
||||||
int NgPar_GetLoc2Glob_VolEl ( int locnum )
|
int NgPar_GetLoc2Glob_VolEl ( int locnum )
|
||||||
{
|
{
|
||||||
@ -152,6 +153,6 @@ namespace netgen
|
|||||||
return mesh -> GetParallelTopology().IsGhostEdge ( edgenum+1);
|
return mesh -> GetParallelTopology().IsGhostEdge ( edgenum+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user