Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
adafaf5a
Commit
adafaf5a
authored
15 years ago
by
Matti Pellika
Browse files
Options
Downloads
Patches
Plain Diff
Bugfixes. Changed the notation of generator chains.
parent
97fc3175
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
Geo/CellComplex.cpp
+10
-5
10 additions, 5 deletions
Geo/CellComplex.cpp
Geo/Homology.cpp
+21
-18
21 additions, 18 deletions
Geo/Homology.cpp
Geo/Homology.h
+37
-1
37 additions, 1 deletion
Geo/Homology.h
with
68 additions
and
24 deletions
Geo/CellComplex.cpp
+
10
−
5
View file @
adafaf5a
...
@@ -516,8 +516,7 @@ int CellComplex::reduceComplex(int omit){
...
@@ -516,8 +516,7 @@ int CellComplex::reduceComplex(int omit){
_store
.
clear
();
_store
.
clear
();
if
(
omit
>
getDim
())
omit
=
getDim
();
if
(
omit
>
getDim
())
omit
=
getDim
();
CellComplex
::
removeSubdomain
();
CellComplex
::
removeSubdomain
();
//std::set<Cell*, Less_Cell> generatorCells;
//std::set<Cell*, Less_Cell> generatorCells;
...
@@ -577,7 +576,13 @@ void CellComplex::removeSubdomain(){
...
@@ -577,7 +576,13 @@ void CellComplex::removeSubdomain(){
//cit = firstCell(i);
//cit = firstCell(i);
}
}
}
}
for
(
citer
cit
=
firstCell
(
i
);
cit
!=
lastCell
(
i
);
cit
++
){
Cell
*
cell
=
*
cit
;
if
(
cell
->
inSubdomain
())
{
removeCell
(
cell
);
cit
=
firstCell
(
i
);
}
}
}
}
return
;
return
;
}
}
...
@@ -651,7 +656,7 @@ void CellComplex::computeBettiNumbers(){
...
@@ -651,7 +656,7 @@ void CellComplex::computeBettiNumbers(){
coreduction
(
cell
);
coreduction
(
cell
);
}
}
}
}
printf
(
"Cell complex Betti numbers:
\n
b
0 = %d
\n
b
1 = %d
\n
b
2 = %d
\n
b
3 = %d
\n
"
,
printf
(
"Cell complex Betti numbers:
\n
H
0 = %d
\n
H
1 = %d
\n
H
2 = %d
\n
H
3 = %d
\n
"
,
getBettiNumber
(
0
),
getBettiNumber
(
1
),
getBettiNumber
(
2
),
getBettiNumber
(
3
));
getBettiNumber
(
0
),
getBettiNumber
(
1
),
getBettiNumber
(
2
),
getBettiNumber
(
3
));
return
;
return
;
...
@@ -875,7 +880,7 @@ int CellComplex::writeComplexMSH(const std::string &name){
...
@@ -875,7 +880,7 @@ int CellComplex::writeComplexMSH(const std::string &name){
fprintf
(
fp
,
"$MeshFormat
\n
2.
0
0 8
\n
$EndMeshFormat
\n
"
);
fprintf
(
fp
,
"$MeshFormat
\n
2.
1
0 8
\n
$EndMeshFormat
\n
"
);
fprintf
(
fp
,
"$Nodes
\n
"
);
fprintf
(
fp
,
"$Nodes
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
Geo/Homology.cpp
+
21
−
18
View file @
adafaf5a
...
@@ -17,6 +17,9 @@ Homology::Homology(GModel* model, std::vector<int> physicalDomain, std::vector<i
...
@@ -17,6 +17,9 @@ Homology::Homology(GModel* model, std::vector<int> physicalDomain, std::vector<i
_combine
=
true
;
_combine
=
true
;
_omit
=
1
;
_omit
=
1
;
_domain
=
physicalDomain
;
_subdomain
=
physicalSubdomain
;
Msg
::
Info
(
"Creating a Cell Complex..."
);
Msg
::
Info
(
"Creating a Cell Complex..."
);
double
t1
=
Cpu
();
double
t1
=
Cpu
();
...
@@ -121,12 +124,12 @@ void Homology::findGenerators(std::string fileName){
...
@@ -121,12 +124,12 @@ void Homology::findGenerators(std::string fileName){
std
::
string
generator
;
std
::
string
generator
;
convert
(
i
,
generator
);
convert
(
i
,
generator
);
std
::
string
name
=
dimension
+
"D Generator "
+
generator
;
std
::
string
name
=
"H"
+
dimension
+
getDomainString
()
+
generator
;
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getCells
(
j
),
chains
->
getCoeffVector
(
j
,
i
),
_cellComplex
,
name
,
chains
->
getTorsion
(
j
,
i
));
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getCells
(
j
),
chains
->
getCoeffVector
(
j
,
i
),
_cellComplex
,
name
,
chains
->
getTorsion
(
j
,
i
));
chain
->
writeChainMSH
(
fileName
);
chain
->
writeChainMSH
(
fileName
);
if
(
chain
->
getSize
()
!=
0
)
{
if
(
chain
->
getSize
()
!=
0
)
{
HRank
[
j
]
=
HRank
[
j
]
+
1
;
HRank
[
j
]
=
HRank
[
j
]
+
1
;
if
(
chain
->
getTorsion
()
!=
1
)
Msg
::
Warning
(
"%d
D Generator
%d has torsion coefficient %d!"
,
j
,
i
,
chain
->
getTorsion
());
if
(
chain
->
getTorsion
()
!=
1
)
Msg
::
Warning
(
"
H
%d %d has torsion coefficient %d!"
,
j
,
i
,
chain
->
getTorsion
());
}
}
delete
chain
;
delete
chain
;
}
}
...
@@ -134,7 +137,7 @@ void Homology::findGenerators(std::string fileName){
...
@@ -134,7 +137,7 @@ void Homology::findGenerators(std::string fileName){
for
(
int
i
=
0
;
i
<
_cellComplex
->
getNumOmitted
();
i
++
){
for
(
int
i
=
0
;
i
<
_cellComplex
->
getNumOmitted
();
i
++
){
std
::
string
generator
;
std
::
string
generator
;
convert
(
i
+
1
,
generator
);
convert
(
i
+
1
,
generator
);
std
::
string
name
=
dimension
+
"D Generator "
+
generator
;
std
::
string
name
=
"H"
+
dimension
+
getDomainString
()
+
generator
;
std
::
vector
<
int
>
coeffs
(
_cellComplex
->
getOmitted
(
i
).
size
(),
1
);
std
::
vector
<
int
>
coeffs
(
_cellComplex
->
getOmitted
(
i
).
size
(),
1
);
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getOmitted
(
i
),
coeffs
,
_cellComplex
,
name
,
1
);
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getOmitted
(
i
),
coeffs
,
_cellComplex
,
name
,
1
);
chain
->
writeChainMSH
(
fileName
);
chain
->
writeChainMSH
(
fileName
);
...
@@ -228,12 +231,12 @@ void Homology::findDualGenerators(std::string fileName){
...
@@ -228,12 +231,12 @@ void Homology::findDualGenerators(std::string fileName){
std
::
string
generator
;
std
::
string
generator
;
convert
(
i
,
generator
);
convert
(
i
,
generator
);
std
::
string
name
=
dimension
+
"
D Dual generator "
+
generator
;
std
::
string
name
=
"H"
+
dimension
+
"
*"
+
getDomainString
()
+
generator
;
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getCells
(
j
),
chains
->
getCoeffVector
(
j
,
i
),
_cellComplex
,
name
,
chains
->
getTorsion
(
j
,
i
));
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getCells
(
j
),
chains
->
getCoeffVector
(
j
,
i
),
_cellComplex
,
name
,
chains
->
getTorsion
(
j
,
i
));
chain
->
writeChainMSH
(
fileName
);
chain
->
writeChainMSH
(
fileName
);
if
(
chain
->
getSize
()
!=
0
){
if
(
chain
->
getSize
()
!=
0
){
HRank
[
dim
-
j
]
=
HRank
[
dim
-
j
]
+
1
;
HRank
[
dim
-
j
]
=
HRank
[
dim
-
j
]
+
1
;
if
(
chain
->
getTorsion
()
!=
1
)
Msg
::
Warning
(
"%d
D Dual generator
%d has torsion coefficient %d!"
,
j
,
i
,
chain
->
getTorsion
());
if
(
chain
->
getTorsion
()
!=
1
)
Msg
::
Warning
(
"
H
%d
*
%d has torsion coefficient %d!"
,
dim
-
j
,
i
,
chain
->
getTorsion
());
}
}
delete
chain
;
delete
chain
;
...
@@ -244,7 +247,7 @@ void Homology::findDualGenerators(std::string fileName){
...
@@ -244,7 +247,7 @@ void Homology::findDualGenerators(std::string fileName){
for
(
int
i
=
0
;
i
<
_cellComplex
->
getNumOmitted
();
i
++
){
for
(
int
i
=
0
;
i
<
_cellComplex
->
getNumOmitted
();
i
++
){
std
::
string
generator
;
std
::
string
generator
;
convert
(
i
+
1
,
generator
);
convert
(
i
+
1
,
generator
);
std
::
string
name
=
dimension
+
"
D Dual generator "
+
generator
;
std
::
string
name
=
"H"
+
dimension
+
"
*"
+
getDomainString
()
+
generator
;
std
::
vector
<
int
>
coeffs
(
_cellComplex
->
getOmitted
(
i
).
size
(),
1
);
std
::
vector
<
int
>
coeffs
(
_cellComplex
->
getOmitted
(
i
).
size
(),
1
);
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getOmitted
(
i
),
coeffs
,
_cellComplex
,
name
,
1
);
Chain
*
chain
=
new
Chain
(
_cellComplex
->
getOmitted
(
i
),
coeffs
,
_cellComplex
,
name
,
1
);
chain
->
writeChainMSH
(
fileName
);
chain
->
writeChainMSH
(
fileName
);
...
@@ -258,10 +261,10 @@ void Homology::findDualGenerators(std::string fileName){
...
@@ -258,10 +261,10 @@ void Homology::findDualGenerators(std::string fileName){
}
}
Msg
::
Info
(
"Ranks of homology groups for dual cell complex:"
);
Msg
::
Info
(
"Ranks of homology groups for dual cell complex:"
);
Msg
::
Info
(
"H0 = %d"
,
HRank
[
0
]);
Msg
::
Info
(
"H0
*
= %d"
,
HRank
[
0
]);
Msg
::
Info
(
"H1 = %d"
,
HRank
[
1
]);
Msg
::
Info
(
"H1
*
= %d"
,
HRank
[
1
]);
Msg
::
Info
(
"H2 = %d"
,
HRank
[
2
]);
Msg
::
Info
(
"H2
*
= %d"
,
HRank
[
2
]);
Msg
::
Info
(
"H3 = %d"
,
HRank
[
3
]);
Msg
::
Info
(
"H3
*
= %d"
,
HRank
[
3
]);
if
(
omitted
!=
0
)
Msg
::
Info
(
"The computation of %d highest dimension dual generators was omitted."
,
_omit
);
if
(
omitted
!=
0
)
Msg
::
Info
(
"The computation of %d highest dimension dual generators was omitted."
,
_omit
);
Msg
::
Info
(
"Wrote results to %s."
,
fileName
.
c_str
());
Msg
::
Info
(
"Wrote results to %s."
,
fileName
.
c_str
());
...
@@ -269,10 +272,10 @@ void Homology::findDualGenerators(std::string fileName){
...
@@ -269,10 +272,10 @@ void Homology::findDualGenerators(std::string fileName){
delete
chains
;
delete
chains
;
printf
(
"H0 = %d
\n
"
,
HRank
[
0
]);
printf
(
"H0
*
= %d
\n
"
,
HRank
[
0
]);
printf
(
"H1 = %d
\n
"
,
HRank
[
1
]);
printf
(
"H1
*
= %d
\n
"
,
HRank
[
1
]);
printf
(
"H2 = %d
\n
"
,
HRank
[
2
]);
printf
(
"H2
*
= %d
\n
"
,
HRank
[
2
]);
printf
(
"H3 = %d
\n
"
,
HRank
[
3
]);
printf
(
"H3
*
= %d
\n
"
,
HRank
[
3
]);
return
;
return
;
}
}
...
@@ -285,10 +288,10 @@ void Homology::computeBettiNumbers(){
...
@@ -285,10 +288,10 @@ void Homology::computeBettiNumbers(){
double
t2
=
Cpu
();
double
t2
=
Cpu
();
Msg
::
Info
(
"Betti number computation complete (%g s)."
,
t2
-
t1
);
Msg
::
Info
(
"Betti number computation complete (%g s)."
,
t2
-
t1
);
Msg
::
Info
(
"
b
0 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
0
));
Msg
::
Info
(
"
H
0 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
0
));
Msg
::
Info
(
"
b
1 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
1
));
Msg
::
Info
(
"
H
1 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
1
));
Msg
::
Info
(
"
b
2 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
2
));
Msg
::
Info
(
"
H
2 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
2
));
Msg
::
Info
(
"
b
3 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
3
));
Msg
::
Info
(
"
H
3 = %d
\n
"
,
_cellComplex
->
getBettiNumber
(
3
));
return
;
return
;
}
}
...
...
This diff is collapsed.
Click to expand it.
Geo/Homology.h
+
37
−
1
View file @
adafaf5a
...
@@ -31,6 +31,9 @@ class Homology
...
@@ -31,6 +31,9 @@ class Homology
bool
_combine
;
bool
_combine
;
int
_omit
;
int
_omit
;
std
::
vector
<
int
>
_domain
;
std
::
vector
<
int
>
_subdomain
;
public:
public:
Homology
(
GModel
*
model
,
std
::
vector
<
int
>
physicalDomain
,
std
::
vector
<
int
>
physicalSubdomain
);
Homology
(
GModel
*
model
,
std
::
vector
<
int
>
physicalDomain
,
std
::
vector
<
int
>
physicalSubdomain
);
...
@@ -41,6 +44,7 @@ class Homology
...
@@ -41,6 +44,7 @@ class Homology
void
findGenerators
(
std
::
string
fileName
);
void
findGenerators
(
std
::
string
fileName
);
void
findDualGenerators
(
std
::
string
fileName
);
void
findDualGenerators
(
std
::
string
fileName
);
void
computeBettiNumbers
();
void
computeBettiNumbers
();
void
swapSubdomain
()
{
_cellComplex
->
swapSubdomain
();
}
void
swapSubdomain
()
{
_cellComplex
->
swapSubdomain
();
}
...
@@ -49,7 +53,7 @@ class Homology
...
@@ -49,7 +53,7 @@ class Homology
void
setOmit
(
int
omit
)
{
void
setOmit
(
int
omit
)
{
if
(
omit
==
0
)
_omit
=
0
;
if
(
omit
==
0
)
_omit
=
0
;
else
_omit
=
1
;
else
_omit
=
1
;
/*
/*
if(omit > _cellComplex->getDim() || omit < 0) {
if(omit > _cellComplex->getDim() || omit < 0) {
Msg::Error("Invalid number of dimensions to omit. Must be between 0 - %d.", _cellComplex->getDim());
Msg::Error("Invalid number of dimensions to omit. Must be between 0 - %d.", _cellComplex->getDim());
...
@@ -60,6 +64,38 @@ class Homology
...
@@ -60,6 +64,38 @@ class Homology
*/
*/
}
}
std
::
string
getDomainString
()
{
std
::
string
domainString
=
"({"
;
for
(
unsigned
int
i
=
0
;
i
<
_domain
.
size
();
i
++
){
std
::
string
temp
=
""
;
convert
(
_domain
.
at
(
i
),
temp
);
domainString
+=
temp
;
if
(
_domain
.
size
()
-
1
>
i
){
domainString
+=
", "
;
}
}
domainString
+=
"}"
;
if
(
!
_subdomain
.
empty
()){
domainString
+=
", {"
;
for
(
unsigned
int
i
=
0
;
i
<
_subdomain
.
size
();
i
++
){
std
::
string
temp
=
""
;
convert
(
_subdomain
.
at
(
i
),
temp
);
domainString
+=
temp
;
if
(
_subdomain
.
size
()
-
1
>
i
){
domainString
+=
", "
;
}
}
domainString
+=
"}"
;
}
domainString
+=
") "
;
return
domainString
;
}
};
};
#endif
#endif
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment