Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
222 commits
Select commit Hold shift + click to select a range
8436909
Merging develop into master
Mar 10, 2023
97523f8
Merging develop into master
Jul 1, 2023
b2ec4a5
Merging develop into master
Aug 11, 2023
b9af579
Merging develop into master
Sep 21, 2023
909a234
Merging develop into master
Nov 12, 2023
8e7ea44
Merging develop into master
Dec 1, 2023
51541e8
Merging develop into master
Dec 16, 2023
73e848d
Merging develop into master
Dec 19, 2023
4cc2da9
Merging develop into master
Dec 31, 2023
d7cc6c8
Merging develop into master
Jan 6, 2024
c6fb1d0
Merging develop into master
Jan 25, 2024
ea85d83
Merging develop into master
Feb 7, 2024
c0c30f4
Merging develop into master
Feb 16, 2024
6769092
Merging develop into master
Feb 24, 2024
49f143f
Merging develop into master
Mar 6, 2024
68861da
Merging develop into master
Mar 7, 2024
73d55d1
Merge branch 'develop'
cwsmith Mar 7, 2024
88892c5
Merging develop into master
Mar 16, 2024
1ab42dd
Merging develop into master
May 11, 2024
3d621c8
Merging develop into master
May 22, 2024
df37b8d
Merging develop into master
Jun 4, 2024
cf0a06f
Merging develop into master
Jun 23, 2024
274835f
Merging develop into master
Jul 10, 2024
8959c59
Merging develop into master
Jul 19, 2024
8449430
Merging develop into master
Aug 25, 2024
324e9e7
Merging develop into master
Aug 28, 2024
61ffc9b
Merge branch 'develop'
cwsmith Aug 28, 2024
c861f9a
Merge branch 'develop'
cwsmith Aug 28, 2024
d79c52c
Merge branch 'develop'
cwsmith Aug 28, 2024
c6254bf
Merge branch 'develop'
cwsmith Aug 28, 2024
24dd23e
Merge branch 'develop'
cwsmith Aug 30, 2024
4484480
Merging develop into master
Oct 29, 2024
54b2a9a
Merging develop into master
Oct 30, 2024
c9af45c
Merging develop into master
Dec 9, 2024
7a095b2
Merging develop into master
Dec 10, 2024
17ad033
Merging develop into master
Feb 1, 2025
aac5620
add aniso_ma_test2
bobpaw Feb 4, 2025
3eebeb4
aniso ma test 2 changes
Angelyr Mar 13, 2025
e9ca0db
coarsen test
Angelyr Mar 20, 2025
3c2faa9
simple snap
Angelyr Mar 27, 2025
604c6a5
check snap
Angelyr Mar 28, 2025
9801f04
refineSnap test
Angelyr Apr 9, 2025
3f58994
revert cap2vtk changes
Angelyr Apr 9, 2025
03c2869
remove white space
Angelyr Apr 9, 2025
fe63fd1
added .smb option
Angelyr Apr 9, 2025
5624760
fixed test
Angelyr Apr 9, 2025
e27bc63
rename file
Angelyr Apr 9, 2025
493a2bf
aniso adapt test
Angelyr Apr 10, 2025
5fdc1b6
rename cap and sim test
Angelyr Apr 10, 2025
b2bdb77
fixed sim test
Angelyr Apr 10, 2025
7d1394c
simplify sim test
Angelyr Apr 10, 2025
ecf7b68
rename vtk file
Angelyr Apr 10, 2025
4e70f29
wrong copy
Angelyr Apr 11, 2025
e01cd2e
get fpp
Angelyr Apr 11, 2025
3ad34c0
refactor invalid
Angelyr Apr 11, 2025
4dfe5ac
fixed tabs
Angelyr Apr 11, 2025
9437c74
assert cap not discontinuous and periodic
Angelyr Apr 11, 2025
5a95b70
update aniso adapt cap
Angelyr Apr 11, 2025
a06d243
moved tag vtx
Angelyr Apr 13, 2025
d486034
moved try reposition
Angelyr Apr 13, 2025
ec767eb
collapse to vtx done
Angelyr Apr 13, 2025
8f6578d
using ma_dbg
Angelyr Apr 17, 2025
89175a4
collapse tet edges
Angelyr Apr 17, 2025
24f8d4d
simplify try collpase
Angelyr Apr 17, 2025
9da2596
rename
Angelyr Apr 17, 2025
9e812e3
using FPP
Angelyr Apr 17, 2025
5237926
trying to collapse tet edges
Angelyr Apr 18, 2025
81eb05c
print cavity
Angelyr Apr 21, 2025
0375093
more FPP info
Angelyr Apr 24, 2025
0bfa0eb
fixed FPP
Angelyr Apr 24, 2025
7747e2a
add classification
Angelyr Apr 25, 2025
5fc7efa
fixed writing FPP face
Angelyr Apr 26, 2025
6a460aa
collapse best quality
Angelyr Apr 27, 2025
766549a
collapsing all edges step one
Angelyr Apr 27, 2025
2824a71
seperated reduce common edges
Angelyr Apr 27, 2025
974584a
get best quality collapse
Angelyr Apr 30, 2025
ddd67b3
reduce common edges
Angelyr Apr 30, 2025
2283473
print first failed fpp
Angelyr May 1, 2025
e6475c3
make sure snap flag isn't lost
Angelyr May 1, 2025
31737b4
try collapse multiple times
Angelyr May 1, 2025
7cbd69e
same side
Angelyr May 3, 2025
f3393b4
added size check
Angelyr May 8, 2025
f154238
collapse one direction
Angelyr May 9, 2025
e4dbbef
quality greater than zero
Angelyr May 10, 2025
776b8ff
moved snap code
Angelyr May 10, 2025
1ba989d
using size check
Angelyr May 10, 2025
05cb90f
remove unused
Angelyr May 10, 2025
c102b32
good results from collapse
Angelyr May 12, 2025
79538f7
split in progress
Angelyr May 16, 2025
875da60
fixed compile error
Angelyr May 16, 2025
0e3073f
split collapse skeleton
Angelyr May 16, 2025
101e495
split collapse working
Angelyr May 21, 2025
289170c
clean up code
Angelyr May 23, 2025
5f2bce8
simplify trySwapOrSplt
Angelyr May 23, 2025
0d588df
moved snap operations to snap class
Angelyr May 23, 2025
0843609
remove unused
Angelyr May 24, 2025
be2c1e6
print values
Angelyr May 24, 2025
fd8ba38
fixed collapse bug
Angelyr May 25, 2025
c2b3a30
max length
Angelyr May 25, 2025
c283fe4
simplify code
Angelyr May 25, 2025
5c58964
Merge branch 'develop' into ac/adapt-changes
Angelyr May 28, 2025
296e101
Merge remote-tracking branch 'origin/apw/capAdapt' into ac/adapt-changes
Angelyr May 29, 2025
4cd2945
fixed split collapse bug
Angelyr May 30, 2025
c524541
fixed split collapse bug
Angelyr May 30, 2025
c472fcc
refactor aniso ma test
Angelyr May 30, 2025
1e72aa9
prepare to test coarsen
Angelyr May 30, 2025
1b8991c
extract adjacent edges
Angelyr May 30, 2025
ad8615a
new coarsen passing
Angelyr May 30, 2025
f300a53
coarsen running
Angelyr May 31, 2025
47b3c97
print time
Angelyr May 31, 2025
9bf9bcc
small coarsen speedup
Angelyr May 31, 2025
c9e1497
get short edge verts
Angelyr Jun 4, 2025
0b1a035
new coarsen algo
Angelyr Jun 5, 2025
0443dcc
clear flags once done
Angelyr Jun 5, 2025
7c2abc6
max length check
Angelyr Jun 5, 2025
89f6c03
rename adjacent edges
Angelyr Jun 5, 2025
0c5d2a1
simplify code
Angelyr Jun 5, 2025
e690455
rename flag independent set
Angelyr Jun 5, 2025
42d2ed1
independent set goes through full list
Angelyr Jun 5, 2025
965629a
new min length
Angelyr Jun 6, 2025
846f727
rename get touching independent set
Angelyr Jun 6, 2025
bdef238
combined touching independent set
Angelyr Jun 6, 2025
9f0be1e
fixed get length
Angelyr Jun 6, 2025
dc62761
fixed typo
Angelyr Jun 7, 2025
e21ead2
simplify touching independent set
Angelyr Jun 7, 2025
02158f9
rename variable and comment
Angelyr Jun 7, 2025
35a0b0e
calculate edge length
Angelyr Jun 7, 2025
001decc
check shortest collapsable edge
Angelyr Jun 7, 2025
f65350a
smaller factor
Angelyr Jun 7, 2025
2a5f0f9
collapse only shortest edges
Angelyr Jun 11, 2025
ea5fcb8
only collapse once
Angelyr Jun 11, 2025
b7ac7a4
don't try to collapse long edges
Angelyr Jun 11, 2025
931ab03
iterate from current position
Angelyr Jun 11, 2025
98b6f45
small base area case
Angelyr Jun 12, 2025
136b423
enable split collapse
Angelyr Jun 13, 2025
49cef8a
aggressive coarsen
Angelyr Jun 13, 2025
9aa4b87
fixed base condition
Angelyr Jun 14, 2025
9a8d56e
fix snap bug
Angelyr Jun 14, 2025
9f33614
moved snap queue to adapt
Angelyr Jun 14, 2025
50df026
fixed splt-collapse snap bug
Angelyr Jun 14, 2025
4e8b0f8
better snap warnings
Angelyr Jun 16, 2025
995290a
using old coarsen
Angelyr Jun 18, 2025
ba9dba1
fixed coarsen bug
Angelyr Jun 19, 2025
45672e3
combined collapse shortest
Angelyr Jun 19, 2025
bf420a9
small performance fix
Angelyr Jun 19, 2025
5132e34
run multiple coarsen once
Angelyr Jun 25, 2025
ef38ec5
reduced min size
Angelyr Jun 26, 2025
08c63d4
single step coarsen
Angelyr Jun 27, 2025
7d9b960
multiple step coarsen
Angelyr Jun 27, 2025
ff096dc
coarsen multiple
Angelyr Jun 27, 2025
25aa8b2
single step coarsen
Angelyr Jun 27, 2025
541e880
cache length
Angelyr Jun 27, 2025
a4efa3a
check collapse size check
Angelyr Jul 1, 2025
13b8cc0
remove cap adapt
Angelyr Jul 2, 2025
c753ca4
Merge branch 'develop' into ac/adapt-changes
Angelyr Jul 2, 2025
9b82444
fix compile error
Angelyr Jul 2, 2025
19aee8e
single coarsen
Angelyr Jul 2, 2025
827e7bd
fixed snap bug
Angelyr Jul 3, 2025
d27737f
add up snap values
Angelyr Jul 3, 2025
b15f7e2
fixed bug caused by shared edge verts
Angelyr Jul 3, 2025
4a2c1ca
prevent infinite loop
Angelyr Jul 16, 2025
0e90bfe
Merge branch 'master' into ac/adapt-changes
Angelyr Jul 16, 2025
235ddfa
bring back eswap spltclps
Angelyr Jul 17, 2025
6cf0455
generalize getTetStats
Angelyr Jul 17, 2025
9104ce1
new fixed shape
Angelyr Jul 18, 2025
af7f1a7
better printFPP
Angelyr Jul 19, 2025
9c20565
fixed bug with partial periodic
Angelyr Jul 23, 2025
c3a1db1
removed capdefined
Angelyr Jul 24, 2025
82c5636
fix shape once
Angelyr Jul 24, 2025
b1aa88a
optional capstone check
Angelyr Jul 26, 2025
d7efb63
remove aggressive coarsen
Angelyr Jul 26, 2025
51db699
revert maShape
Angelyr Jul 30, 2025
cc0d274
remove unused
Angelyr Jul 30, 2025
a9c52a8
fixed snap bug
Angelyr Jul 30, 2025
fcb8e0d
removed unused test
Angelyr Jul 30, 2025
1c1a0f9
end iterator
Angelyr Jul 30, 2025
17628e8
split clps valid quality
Angelyr Jul 30, 2025
e257e35
removed meshes
Angelyr Jul 30, 2025
a7f40eb
remove double cone
Angelyr Jul 30, 2025
44a7fe7
revert aniso_ma_test
Angelyr Jul 30, 2025
b0d8a7f
cube test
Angelyr Jul 31, 2025
2440d94
force coarsen test
Angelyr Aug 1, 2025
ae33ba5
snap test
Angelyr Aug 1, 2025
daae4be
fixed layer snapping error
Angelyr Aug 1, 2025
f127dad
adapt_cap
Angelyr Aug 1, 2025
e04178f
sim_test
Angelyr Aug 2, 2025
7b6a33f
refine into coarsen
Angelyr Aug 2, 2025
02edf07
aniso adapt cap tests
Angelyr Aug 2, 2025
a672a3c
smaller cube test
Angelyr Aug 2, 2025
c3c41af
capstone mesh
Angelyr Aug 6, 2025
762e86d
curved cube mesh
Angelyr Aug 6, 2025
1d006c0
update mesh dir
Angelyr Aug 7, 2025
b239075
Merge branch 'develop' into ac/adapt-changes
Angelyr Aug 7, 2025
3ffc85f
added meshes back in
Angelyr Aug 7, 2025
b27f8b5
updated capstone test
Angelyr Aug 7, 2025
18017d8
fixed warnings
Angelyr Aug 7, 2025
48eb9e6
checked size_t
Angelyr Aug 7, 2025
04f5fbc
void m
Angelyr Aug 7, 2025
9f2005d
fixed snapper warnings
Angelyr Aug 7, 2025
24561ab
remove unsused from adapt test
Angelyr Aug 7, 2025
6fd71ed
added comments
Angelyr Aug 8, 2025
9395079
fixed unused warning
Angelyr Aug 8, 2025
f6832ba
collapse comments
Angelyr Aug 8, 2025
1c829f6
update simmetrix version
Angelyr Aug 8, 2025
4163701
2d get invalid
Angelyr Aug 13, 2025
41e827e
apply coarsening first, revert changes
joshia5 Aug 28, 2025
d465479
moved comments from github
Angelyr Aug 29, 2025
38dcf6e
fix tolerance bug
Angelyr Sep 3, 2025
7988f5f
remove unused
Angelyr Sep 3, 2025
9f9d333
fixed snapper issue
Angelyr Sep 26, 2025
63c223d
fixed cap test
Angelyr Sep 26, 2025
eddc013
removed unused adapt tests
Angelyr Sep 26, 2025
1a72cf8
moved code maCoarsen
Angelyr Sep 26, 2025
03119fe
reformating
Angelyr Sep 26, 2025
1d928d9
removed unecessary apf::up
Angelyr Sep 26, 2025
905f74b
using size_t
Angelyr Sep 26, 2025
9c0fba7
int to size_t
Angelyr Sep 26, 2025
41ec122
simplify code
Angelyr Sep 26, 2025
6894ffc
fixed error with isCapstone
Angelyr Sep 27, 2025
47ed51a
reuse and recycle adapt_sim
Angelyr Sep 27, 2025
24dccb2
simplify aniso_adapt
Angelyr Sep 27, 2025
ab8c580
improved comments
Angelyr Oct 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ jobs:
module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/
module load gcc/12.3.0-iil3lno
module load mpich/4.1.1-xpoyz4t
module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4
module load simmetrix-simmodsuite/2025.0-250108dev-llxq6sk
module load zoltan/3.83-hap4ggo
module load cmake/3.26.3-2duxfcd
set -e
Expand Down Expand Up @@ -70,7 +70,7 @@ jobs:
module use /opt/scorec/spack/rhel9/v0201_4/lmod/linux-rhel9-x86_64/Core/
module load gcc/12.3.0-iil3lno
module load mpich/4.1.1-xpoyz4t
module load simmetrix-simmodsuite/2024.0-240119dev-7abimo4
module load simmetrix-simmodsuite/2025.0-250108dev-llxq6sk
module load zoltan/3.83-hap4ggo
module load cmake/3.26.3-2duxfcd
module load cgns/develop-cc4dfwp
Expand Down
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ endif()
# This is the top level CMake file for the SCOREC build
cmake_minimum_required(VERSION 3.12)

project(SCOREC VERSION 4.0.0 LANGUAGES CXX C)
project(SCOREC VERSION 4.1.0 LANGUAGES CXX C)

include(cmake/bob.cmake)
include(cmake/xsdk.cmake)
Expand Down
4 changes: 4 additions & 0 deletions gmi_cap/gmi_cap.cc
Original file line number Diff line number Diff line change
Expand Up @@ -541,3 +541,7 @@ GDBI* gmi_export_cap(gmi_model* m)
cap_model* cm = (cap_model*)m;
return cm->geomInterface;
}

int gmi_cap_test(struct gmi_model* model) {
return model->ops == &ops ? 1 : 0;
}
10 changes: 10 additions & 0 deletions gmi_cap/gmi_cap.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ struct gmi_ent;
* \note This call is required before calling any other gmi_cap functions.
*/
void gmi_cap_start(void);

/**
* \brief Finalize gmi_cap library.
*
Expand Down Expand Up @@ -94,6 +95,15 @@ struct gmi_model* gmi_cap_load(const char* creFileName);
*/
void gmi_cap_write(struct gmi_model* model, const char* creFileName);

/**
* \brief Test if model is a Capstone gmi_model.
*
* \param model An abstract gmi_model which may have an underlying Capstone
* database.
* \return 1 if model is a Capstone gmi_model and 0 otherwise.
*/
int gmi_cap_test(struct gmi_model* model);

#ifdef __cplusplus

/**
Expand Down
4 changes: 4 additions & 0 deletions ma/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ target_link_libraries(ma
pcu
)

if (ENABLE_CAPSTONE)
target_link_libraries(ma PRIVATE apf_cap)
endif()

scorec_export_library(ma)

bob_end_subdir()
2 changes: 1 addition & 1 deletion ma/ma.cc
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ void adaptVerbose(Input* in, bool verbose)
int count = 0;
double lMax = ma::getMaximumEdgeLength(a->mesh, a->sizeField);
print(a->mesh->getPCU(), "Maximum (metric) edge length in the mesh is %f", lMax);
while (lMax > 1.5) {
while (lMax > MAXLENGTH) {
print(a->mesh->getPCU(), "%dth additional refine-snap call", count);
refine(a);
snap(a);
Expand Down
215 changes: 215 additions & 0 deletions ma/maCoarsen.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,81 @@
of the SCOREC Non-Commercial License this program is distributed under.

*******************************************************************************/
/*
This file contains two coarsening alogrithms.
1. coarsenMultiple: will repeatedly create independent sets and collapse the mesh
until there are no more short edges left. This code is currently only used for testing
since more work needs to be done to achieve better performance and have the code work in
parallel, at which point the other coarsen algorithm can be deleted.
2. coarsen: The first will create one independent set and then collapse all of the edges
in that independent set.
*/
#include "maCoarsen.h"
#include "maAdapt.h"
#include "maCollapse.h"
#include "maMatchedCollapse.h"
#include "maOperator.h"
#include "maDBG.h"
#include <pcu_util.h>
#include "apfShape.h"
#include <vector>
#include <list>
#include <algorithm>

namespace ma {

namespace {

//Measures edge length and stores the result so it doesn't have to be calculated again
double getLength(Adapt* a, Tag* lengthTag, Entity* edge)
{
double length = 0;
if (a->mesh->hasTag(edge, lengthTag))
a->mesh->getDoubleTag(edge, lengthTag, &length);
else {
length = a->sizeField->measure(edge);
a->mesh->setDoubleTag(edge, lengthTag, &length);
}
return length;
}

//Make sure that a collapse will not create an edge longer than the max
bool collapseSizeCheck(Adapt* a, Entity* vertex, Entity* edge, apf::Up& adjacent)
{
Entity* vCollapse = getEdgeVertOppositeVert(a->mesh, edge, vertex);
for (int i=0; i<adjacent.n; i++) {
Entity* newEdgeVerts[2]{vertex, getEdgeVertOppositeVert(a->mesh, adjacent.e[i], vCollapse)};
Entity* newEdge = a->mesh->createEntity(apf::Mesh::EDGE, 0, newEdgeVerts);
double length = a->sizeField->measure(newEdge);
destroyElement(a, newEdge);
if (length > MAXLENGTH) return false;
}
return true;
}

bool tryCollapseEdge(Adapt* a, Entity* edge, Entity* keep, Collapse& collapse, apf::Up& adjacent)
{
PCU_ALWAYS_ASSERT(a->mesh->getType(edge) == apf::Mesh::EDGE);
bool alreadyFlagged = true;
if (keep) alreadyFlagged = getFlag(a, keep, DONT_COLLAPSE);
if (!alreadyFlagged) setFlag(a, keep, DONT_COLLAPSE);

double quality = a->input->shouldForceAdaptation ? a->input->validQuality
: a->input->goodQuality;

bool result = false;
if (collapse.setEdge(edge) &&
collapse.checkClass() &&
collapse.checkTopo() &&
collapseSizeCheck(a, keep, edge, adjacent) &&
collapse.tryBothDirections(quality)) {
result = true;
}
if (!alreadyFlagged) clearFlag(a, keep, DONT_COLLAPSE);
return result;
}
}

class CollapseChecker : public apf::CavityOp
{
public:
Expand Down Expand Up @@ -253,4 +319,153 @@ bool coarsen(Adapt* a)
return true;
}

/*
To be used after collapsing a vertex to flag adjacent vertices as NEED_NOT_COLLAPSE. This will create a
set of collapses where no two adjacent are vertices collapsed. Will also clear adjacent vertices for
collapse in next independent set since they might succeed after a collapse.
*/
void flagIndependentSet(Adapt* a, apf::Up& adjacent, size_t& checked)
{
for (int adj=0; adj < adjacent.n; adj++) {
Entity* vertices[2];
a->mesh->getDownward(adjacent.e[adj],0, vertices);
for (int v = 0; v < 2; v++) {
setFlag(a, vertices[v], NEED_NOT_COLLAPSE);
if (getFlag(a, vertices[v], CHECKED)){
clearFlag(a, vertices[v], CHECKED); //needs to be checked again in next independent set
checked--;
}
}
}
}

struct EdgeLength
{
Entity* edge;
double length;
bool operator<(const EdgeLength& other) const {
return length < other.length;
}
};

/*
Given an iterator pointing to a vertex we will collapse the shortest adjacent edge and try the next
shorted until one succeeds and then it will expand independent set. In Li's thesis it only attempts
to collapse the shortest edge, but this gave us better results.
*/
bool collapseShortest(Adapt* a, Collapse& collapse, std::list<Entity*>& shortEdgeVerts, std::list<Entity*>::iterator& itr, size_t& checked, apf::Up& adjacent, Tag* lengthTag)
{
Entity* vertex = *itr;
std::vector<EdgeLength> sorted;
for (int i=0; i < adjacent.n; i++) {
double length = getLength(a, lengthTag, adjacent.e[i]);
EdgeLength measured{adjacent.e[i], length};
if (measured.length > MINLENGTH) continue;
sorted.push_back(measured);
}
if (sorted.size() == 0) { //performance optimization, will rarely result in a missed edge
itr = shortEdgeVerts.erase(itr);
return false;
}
std::sort(sorted.begin(), sorted.end());
for (size_t i=0; i < sorted.size(); i++) {
Entity* keepVertex = getEdgeVertOppositeVert(a->mesh, sorted[i].edge, vertex);
if (!tryCollapseEdge(a, sorted[i].edge, keepVertex, collapse, adjacent)) continue;
flagIndependentSet(a, adjacent, checked);
itr = shortEdgeVerts.erase(itr);
collapse.destroyOldElements();
return true;
}
setFlag(a, vertex, CHECKED);
checked++;
return false;
}

/*
Iterates through shortEdgeVerts until it finds a vertex that is adjacent to an
independent set. We want our collapses to touch the independent set in order to
reduce adjacent collapses, since collapsing adjacent vertices will result in a
lower quality mesh.
*/
bool getAdjIndependentSet(Adapt* a, std::list<Entity*>& shortEdgeVerts, std::list<Entity*>::iterator& itr, bool& independentSetStarted, apf::Up& adjacent)
{
size_t numItr=0;
do {
numItr++;
if (itr == shortEdgeVerts.end()) itr = shortEdgeVerts.begin();
Entity* vertex = *itr;
if (getFlag(a, vertex, CHECKED)) {itr++; continue;} //Already tried to collapse
a->mesh->getUp(vertex, adjacent);
if (!independentSetStarted) return true;
if (getFlag(a, vertex, NEED_NOT_COLLAPSE)) {itr++; continue;} //Too close to last collapse
for (int i=0; i < adjacent.n; i++)
{
Entity* opposite = getEdgeVertOppositeVert(a->mesh, adjacent.e[i], vertex);
if (getFlag(a, opposite, NEED_NOT_COLLAPSE)) return true; //Touching independent set
}
itr++;
} while (numItr < shortEdgeVerts.size());
for (auto v : shortEdgeVerts) clearFlag(a, v, NEED_NOT_COLLAPSE);
independentSetStarted = false;
return false;
}

//returns a list of vertices that bound a short edge and flags them
std::list<Entity*> getShortEdgeVerts(Adapt* a, Tag* lengthTag)
{
std::list<Entity*> shortEdgeVerts;
Iterator* it = a->mesh->begin(1);
Entity* edge;
while ((edge = a->mesh->iterate(it)))
{
double length = getLength(a, lengthTag, edge);
if (length > MINLENGTH) continue;
Entity* vertices[2];
a->mesh->getDownward(edge,0,vertices);
for (int i = 0; i < 2; i++) {
if (getFlag(a, vertices[i], CHECKED)) continue;
setFlag(a, vertices[i], CHECKED);
shortEdgeVerts.push_back(vertices[i]);
}
}
for (auto v : shortEdgeVerts) clearFlag(a, v, CHECKED);
a->mesh->end(it);
return shortEdgeVerts;
}

/*
Follows the alogritm in Li's thesis in order to coarsen all short edges
in a mesh while maintaining a decent quality mesh.
*/
bool coarsenMultiple(Adapt* a)
{
if (!a->input->shouldCoarsen)
return false;
double t0 = pcu::Time();
Tag* lengthTag = a->mesh->createDoubleTag("edge_length", 1);
std::list<Entity*> shortEdgeVerts = getShortEdgeVerts(a, lengthTag);

Collapse collapse;
collapse.Init(a);
int success = 0;
size_t checked = 0;
bool independentSetStarted = false;
std::list<Entity*>::iterator itr = shortEdgeVerts.begin();
while (checked < shortEdgeVerts.size())
{
apf::Up adjacent;
if (!getAdjIndependentSet(a, shortEdgeVerts, itr, independentSetStarted, adjacent)) continue;
if (collapseShortest(a, collapse, shortEdgeVerts, itr, checked, adjacent, lengthTag)) {
independentSetStarted=true;
success++;
}
}
ma::clearFlagFromDimension(a, NEED_NOT_COLLAPSE | CHECKED, 0);
a->mesh->destroyTag(lengthTag);
double t1 = pcu::Time();
print(a->mesh->getPCU(), "coarsened %d edges in %f seconds", success, t1-t0);
return true;
}


}
1 change: 1 addition & 0 deletions ma/maCoarsen.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace ma {

class Adapt;

bool coarsenMultiple(Adapt* a);
bool coarsen(Adapt* a);
bool coarsenLayer(Adapt* a);

Expand Down
Loading