mirror of
https://github.com/NGSolve/netgen.git
synced 2024-12-26 05:50:32 +05:00
linked listes for building anisotropic clusters
This commit is contained in:
parent
da9df250d5
commit
a08283bbbc
@ -18,8 +18,6 @@ namespace netgen
|
|||||||
|
|
||||||
void AnisotropicClusters :: Update()
|
void AnisotropicClusters :: Update()
|
||||||
{
|
{
|
||||||
int i, j, k;
|
|
||||||
|
|
||||||
const MeshTopology & top = mesh.GetTopology();
|
const MeshTopology & top = mesh.GetTopology();
|
||||||
|
|
||||||
bool hasedges = top.HasEdges();
|
bool hasedges = top.HasEdges();
|
||||||
@ -37,15 +35,17 @@ namespace netgen
|
|||||||
int nse = mesh.GetNSE();
|
int nse = mesh.GetNSE();
|
||||||
|
|
||||||
cluster_reps.SetSize (nv+ned+nfa+ne);
|
cluster_reps.SetSize (nv+ned+nfa+ne);
|
||||||
|
cluster_reps = -1;
|
||||||
|
|
||||||
|
Array<int> llist (nv+ned+nfa+ne);
|
||||||
|
llist = 0;
|
||||||
|
|
||||||
Array<int> nnums, ednums, fanums;
|
Array<int> nnums, ednums, fanums;
|
||||||
int changed;
|
int changed;
|
||||||
|
|
||||||
for (i = 1; i <= cluster_reps.Size(); i++)
|
|
||||||
cluster_reps.Elem(i) = -1;
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 1; i <= ne; i++)
|
for (int i = 1; i <= ne; i++)
|
||||||
{
|
{
|
||||||
const Element & el = mesh.VolumeElement(i);
|
const Element & el = mesh.VolumeElement(i);
|
||||||
ELEMENT_TYPE typ = el.GetType();
|
ELEMENT_TYPE typ = el.GetType();
|
||||||
@ -58,21 +58,21 @@ namespace netgen
|
|||||||
int elnfa = fanums.Size();
|
int elnfa = fanums.Size();
|
||||||
|
|
||||||
nnums.SetSize(elnv+elned+elnfa+1);
|
nnums.SetSize(elnv+elned+elnfa+1);
|
||||||
for (j = 1; j <= elnv; j++)
|
for (int j = 1; j <= elnv; j++)
|
||||||
nnums.Elem(j) = el.PNum(j);
|
nnums.Elem(j) = el.PNum(j);
|
||||||
for (j = 1; j <= elned; j++)
|
for (int j = 1; j <= elned; j++)
|
||||||
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
||||||
for (j = 1; j <= elnfa; j++)
|
for (int j = 1; j <= elnfa; j++)
|
||||||
nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
|
nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
|
||||||
nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
|
nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
|
||||||
|
|
||||||
for (j = 0; j < nnums.Size(); j++)
|
for (int j = 0; j < nnums.Size(); j++)
|
||||||
cluster_reps.Elem(nnums[j]) = nnums[j];
|
cluster_reps.Elem(nnums[j]) = nnums[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 1; i <= nse; i++)
|
for (int i = 1; i <= nse; i++)
|
||||||
{
|
{
|
||||||
const Element2d & el = mesh.SurfaceElement(i);
|
const Element2d & el = mesh.SurfaceElement(i);
|
||||||
ELEMENT_TYPE typ = el.GetType();
|
ELEMENT_TYPE typ = el.GetType();
|
||||||
@ -84,13 +84,13 @@ namespace netgen
|
|||||||
int elned = ednums.Size();
|
int elned = ednums.Size();
|
||||||
|
|
||||||
nnums.SetSize(elnv+elned+1);
|
nnums.SetSize(elnv+elned+1);
|
||||||
for (j = 1; j <= elnv; j++)
|
for (int j = 1; j <= elnv; j++)
|
||||||
nnums.Elem(j) = el.PNum(j);
|
nnums.Elem(j) = el.PNum(j);
|
||||||
for (j = 1; j <= elned; j++)
|
for (int j = 1; j <= elned; j++)
|
||||||
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
||||||
nnums.Elem(elnv+elned+1) = fanum;
|
nnums.Elem(elnv+elned+1) = fanum;
|
||||||
|
|
||||||
for (j = 0; j < nnums.Size(); j++)
|
for (int j = 0; j < nnums.Size(); j++)
|
||||||
cluster_reps.Elem(nnums[j]) = nnums[j];
|
cluster_reps.Elem(nnums[j]) = nnums[j];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ namespace netgen
|
|||||||
cnt++;
|
cnt++;
|
||||||
changed = 0;
|
changed = 0;
|
||||||
|
|
||||||
for (i = 1; i <= ne; i++)
|
for (int i = 1; i <= ne; i++)
|
||||||
{
|
{
|
||||||
const Element & el = mesh.VolumeElement(i);
|
const Element & el = mesh.VolumeElement(i);
|
||||||
ELEMENT_TYPE typ = el.GetType();
|
ELEMENT_TYPE typ = el.GetType();
|
||||||
@ -156,11 +156,11 @@ namespace netgen
|
|||||||
int elnfa = fanums.Size();
|
int elnfa = fanums.Size();
|
||||||
|
|
||||||
nnums.SetSize(elnv+elned+elnfa+1);
|
nnums.SetSize(elnv+elned+elnfa+1);
|
||||||
for (j = 1; j <= elnv; j++)
|
for (int j = 1; j <= elnv; j++)
|
||||||
nnums.Elem(j) = el.PNum(j);
|
nnums.Elem(j) = el.PNum(j);
|
||||||
for (j = 1; j <= elned; j++)
|
for (int j = 1; j <= elned; j++)
|
||||||
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
nnums.Elem(elnv+j) = nv+ednums.Elem(j);
|
||||||
for (j = 1; j <= elnfa; j++)
|
for (int j = 1; j <= elnfa; j++)
|
||||||
nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
|
nnums.Elem(elnv+elned+j) = nv+ned+fanums.Elem(j);
|
||||||
nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
|
nnums.Elem(elnv+elned+elnfa+1) = nv+ned+nfa+i;
|
||||||
|
|
||||||
@ -207,20 +207,34 @@ namespace netgen
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (clustertab)
|
if (clustertab)
|
||||||
for (j = 0; j < nnums.Size(); j++)
|
for (int j = 0; j < nnums.Size(); j++)
|
||||||
for (k = 0; k < j; k++)
|
for (int k = 0; k < j; k++)
|
||||||
if (clustertab[j] == clustertab[k])
|
if (clustertab[j] == clustertab[k])
|
||||||
{
|
{
|
||||||
int jj = nnums[j];
|
int jj = nnums[j];
|
||||||
int kk = nnums[k];
|
int kk = nnums[k];
|
||||||
|
|
||||||
|
if (cluster_reps.Get(kk) < cluster_reps.Get(jj))
|
||||||
|
swap (jj,kk);
|
||||||
|
|
||||||
if (cluster_reps.Get(jj) < cluster_reps.Get(kk))
|
if (cluster_reps.Get(jj) < cluster_reps.Get(kk))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
cluster_reps.Elem(kk) = cluster_reps.Get(jj);
|
cluster_reps.Elem(kk) = cluster_reps.Get(jj);
|
||||||
changed = 1;
|
changed = 1;
|
||||||
}
|
*/
|
||||||
else if (cluster_reps.Get(kk) < cluster_reps.Get(jj))
|
int rep = cluster_reps.Get(jj);
|
||||||
{
|
int next = kk;
|
||||||
cluster_reps.Elem(jj) = cluster_reps.Get(kk);
|
do
|
||||||
|
{
|
||||||
|
int cur = next;
|
||||||
|
next = llist.Elem(next);
|
||||||
|
|
||||||
|
cluster_reps.Elem(cur) = rep;
|
||||||
|
llist.Elem(cur) = llist.Elem(rep);
|
||||||
|
llist.Elem(rep) = cur;
|
||||||
|
}
|
||||||
|
while (next);
|
||||||
changed = 1;
|
changed = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user