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
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
35a5fbed
Commit
35a5fbed
authored
11 years ago
by
Matti Pellika
Browse files
Options
Downloads
Patches
Plain Diff
Fix coverity issues
parent
4ec4d15c
No related branches found
No related tags found
No related merge requests found
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
Geo/Cell.cpp
+8
-2
8 additions, 2 deletions
Geo/Cell.cpp
Geo/CellComplex.cpp
+5
-2
5 additions, 2 deletions
Geo/CellComplex.cpp
Geo/ChainComplex.cpp
+18
-361
18 additions, 361 deletions
Geo/ChainComplex.cpp
Geo/ChainComplex.h
+0
-56
0 additions, 56 deletions
Geo/ChainComplex.h
with
31 additions
and
421 deletions
Geo/Cell.cpp
+
8
−
2
View file @
35a5fbed
...
@@ -230,6 +230,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -230,6 +230,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
if
(
_v
[
MTriangle
::
edges_tri
(
i
,
1
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
if
(
_v
[
MTriangle
::
edges_tri
(
i
,
1
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
_v
[
MTriangle
::
edges_tri
(
i
,
0
)]
->
getNum
()
==
v
[
1
]
->
getNum
())
_v
[
MTriangle
::
edges_tri
(
i
,
0
)]
->
getNum
()
==
v
[
1
]
->
getNum
())
return
-
1
;
return
-
1
;
break
;
case
4
:
case
4
:
if
(
_v
[
MQuadrangle
::
edges_quad
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
if
(
_v
[
MQuadrangle
::
edges_quad
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
_v
[
MQuadrangle
::
edges_quad
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
())
_v
[
MQuadrangle
::
edges_quad
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
())
...
@@ -237,6 +238,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -237,6 +238,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
if
(
_v
[
MQuadrangle
::
edges_quad
(
i
,
0
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
if
(
_v
[
MQuadrangle
::
edges_quad
(
i
,
0
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
_v
[
MQuadrangle
::
edges_quad
(
i
,
1
)]
->
getNum
()
==
v
[
0
]
->
getNum
())
_v
[
MQuadrangle
::
edges_quad
(
i
,
1
)]
->
getNum
()
==
v
[
0
]
->
getNum
())
return
-
1
;
return
-
1
;
break
;
default:
return
0
;
default:
return
0
;
}
}
case
3
:
case
3
:
...
@@ -266,6 +268,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -266,6 +268,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
_v
[
MTetrahedron
::
faces_tetra
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
_v
[
MTetrahedron
::
faces_tetra
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
_v
[
MTetrahedron
::
faces_tetra
(
i
,
2
)]
->
getNum
()
==
v
[
0
]
->
getNum
())
_v
[
MTetrahedron
::
faces_tetra
(
i
,
2
)]
->
getNum
()
==
v
[
0
]
->
getNum
())
return
-
1
;
return
-
1
;
break
;
case
5
:
case
5
:
if
(
i
<
4
)
{
if
(
i
<
4
)
{
if
(
_v
[
MPyramid
::
faces_pyramid
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
if
(
_v
[
MPyramid
::
faces_pyramid
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
...
@@ -336,6 +339,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -336,6 +339,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
return
-
1
;
return
-
1
;
}
}
return
0
;
return
0
;
break
;
case
6
:
case
6
:
if
(
i
<
2
)
{
if
(
i
<
2
)
{
if
(
_v
[
MPrism
::
faces_prism
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
if
(
_v
[
MPrism
::
faces_prism
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
...
@@ -405,6 +409,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -405,6 +409,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
_v
[
MPrism
::
faces_prism
(
i
,
3
)]
->
getNum
()
==
v
[
2
]
->
getNum
())
_v
[
MPrism
::
faces_prism
(
i
,
3
)]
->
getNum
()
==
v
[
2
]
->
getNum
())
return
-
1
;
return
-
1
;
}
}
break
;
case
8
:
case
8
:
if
(
_v
[
MHexahedron
::
faces_hexa
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
if
(
_v
[
MHexahedron
::
faces_hexa
(
i
,
0
)]
->
getNum
()
==
v
[
0
]
->
getNum
()
&&
_v
[
MHexahedron
::
faces_hexa
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
_v
[
MHexahedron
::
faces_hexa
(
i
,
1
)]
->
getNum
()
==
v
[
1
]
->
getNum
()
&&
...
@@ -446,6 +451,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
...
@@ -446,6 +451,7 @@ int Cell::findBdCellOrientation(Cell* cell, int i) const
_v
[
MHexahedron
::
faces_hexa
(
i
,
2
)]
->
getNum
()
==
v
[
3
]
->
getNum
()
&&
_v
[
MHexahedron
::
faces_hexa
(
i
,
2
)]
->
getNum
()
==
v
[
3
]
->
getNum
()
&&
_v
[
MHexahedron
::
faces_hexa
(
i
,
3
)]
->
getNum
()
==
v
[
2
]
->
getNum
())
_v
[
MHexahedron
::
faces_hexa
(
i
,
3
)]
->
getNum
()
==
v
[
2
]
->
getNum
())
return
-
1
;
return
-
1
;
break
;
default
:
return
0
;
default
:
return
0
;
}
}
default
:
return
0
;
default
:
return
0
;
...
@@ -574,8 +580,8 @@ void Cell::removeBoundaryCell(Cell* cell, bool other)
...
@@ -574,8 +580,8 @@ void Cell::removeBoundaryCell(Cell* cell, bool other)
biter
it
=
_bd
.
find
(
cell
);
biter
it
=
_bd
.
find
(
cell
);
if
(
it
!=
_bd
.
end
()){
if
(
it
!=
_bd
.
end
()){
it
->
second
.
set
(
0
);
it
->
second
.
set
(
0
);
if
(
it
->
second
.
geto
()
==
0
)
_bd
.
erase
(
it
);
if
(
other
)
it
->
first
->
removeCoboundaryCell
(
this
,
false
);
if
(
other
)
it
->
first
->
removeCoboundaryCell
(
this
,
false
);
if
(
it
->
second
.
geto
()
==
0
)
_bd
.
erase
(
it
);
}
}
}
}
...
@@ -584,8 +590,8 @@ void Cell::removeCoboundaryCell(Cell* cell, bool other)
...
@@ -584,8 +590,8 @@ void Cell::removeCoboundaryCell(Cell* cell, bool other)
biter
it
=
_cbd
.
find
(
cell
);
biter
it
=
_cbd
.
find
(
cell
);
if
(
it
!=
_cbd
.
end
()){
if
(
it
!=
_cbd
.
end
()){
it
->
second
.
set
(
0
);
it
->
second
.
set
(
0
);
if
(
it
->
second
.
geto
()
==
0
)
_cbd
.
erase
(
it
);
if
(
other
)
it
->
first
->
removeBoundaryCell
(
this
,
false
);
if
(
other
)
it
->
first
->
removeBoundaryCell
(
this
,
false
);
if
(
it
->
second
.
geto
()
==
0
)
_cbd
.
erase
(
it
);
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Geo/CellComplex.cpp
+
5
−
2
View file @
35a5fbed
...
@@ -317,6 +317,7 @@ int CellComplex::coreduction(Cell* startCell, int omit,
...
@@ -317,6 +317,7 @@ int CellComplex::coreduction(Cell* startCell, int omit,
Qset
.
erase
(
s
);
Qset
.
erase
(
s
);
if
(
s
->
getBoundarySize
()
==
1
&&
if
(
s
->
getBoundarySize
()
==
1
&&
inSameDomain
(
s
,
s
->
firstBoundary
()
->
first
)
&&
inSameDomain
(
s
,
s
->
firstBoundary
()
->
first
)
&&
!
s
->
getImmune
()
&&
!
s
->
firstBoundary
()
->
first
->
getImmune
()
&&
abs
(
s
->
firstBoundary
()
->
second
.
get
())
<
2
){
abs
(
s
->
firstBoundary
()
->
second
.
get
())
<
2
){
s
->
getBoundary
(
bd_s
);
s
->
getBoundary
(
bd_s
);
removeCell
(
s
);
removeCell
(
s
);
...
@@ -356,7 +357,7 @@ int CellComplex::reduction(int dim, int omit,
...
@@ -356,7 +357,7 @@ int CellComplex::reduction(int dim, int omit,
Cell
*
cell
=
*
cit
;
Cell
*
cell
=
*
cit
;
if
(
cell
->
getCoboundarySize
()
==
1
&&
if
(
cell
->
getCoboundarySize
()
==
1
&&
inSameDomain
(
cell
,
cell
->
firstCoboundary
()
->
first
)
&&
inSameDomain
(
cell
,
cell
->
firstCoboundary
()
->
first
)
&&
!
cell
->
getImmune
()
&&
!
cell
->
getImmune
()
&&
!
cell
->
firstCoboundary
()
->
first
->
getImmune
()
&&
!
cell
->
firstCoboundary
()
->
first
->
getImmune
()
&&
!
cell
->
firstCoboundary
()
->
first
->
getImmune
()
&&
abs
(
cell
->
firstCoboundary
()
->
second
.
get
())
<
2
){
abs
(
cell
->
firstCoboundary
()
->
second
.
get
())
<
2
){
cit
++
;
cit
++
;
...
@@ -399,6 +400,7 @@ int CellComplex::coreduction(int dim, int omit,
...
@@ -399,6 +400,7 @@ int CellComplex::coreduction(int dim, int omit,
Cell
*
cell
=
*
cit
;
Cell
*
cell
=
*
cit
;
if
(
cell
->
getBoundarySize
()
==
1
&&
if
(
cell
->
getBoundarySize
()
==
1
&&
inSameDomain
(
cell
,
cell
->
firstBoundary
()
->
first
)
&&
inSameDomain
(
cell
,
cell
->
firstBoundary
()
->
first
)
&&
!
cell
->
getImmune
()
&&
!
cell
->
firstBoundary
()
->
first
->
getImmune
()
&&
abs
(
cell
->
firstBoundary
()
->
second
.
get
())
<
2
)
{
abs
(
cell
->
firstBoundary
()
->
second
.
get
())
<
2
)
{
++
cit
;
++
cit
;
if
(
dim
-
1
==
omit
){
if
(
dim
-
1
==
omit
){
...
@@ -775,7 +777,8 @@ int CellComplex::cocombine(int dim)
...
@@ -775,7 +777,8 @@ int CellComplex::cocombine(int dim)
Cell
*
c2
=
it
->
first
;
Cell
*
c2
=
it
->
first
;
if
(
!
(
*
c1
==
*
c2
)
&&
abs
(
or1
)
==
abs
(
or2
)
if
(
!
(
*
c1
==
*
c2
)
&&
abs
(
or1
)
==
abs
(
or2
)
&&
inSameDomain
(
s
,
c1
)
&&
inSameDomain
(
s
,
c2
)){
&&
inSameDomain
(
s
,
c1
)
&&
inSameDomain
(
s
,
c2
)
&&
c1
->
getImmune
()
==
c2
->
getImmune
()){
removeCell
(
s
,
true
,
false
);
removeCell
(
s
,
true
,
false
);
...
...
This diff is collapsed.
Click to expand it.
Geo/ChainComplex.cpp
+
18
−
361
View file @
35a5fbed
...
@@ -193,11 +193,19 @@ void ChainComplex::Inclusion(int lowDim, int highDim)
...
@@ -193,11 +193,19 @@ void ChainComplex::Inclusion(int lowDim, int highDim)
int
rows
=
gmp_matrix_rows
(
Bbasis
);
int
rows
=
gmp_matrix_rows
(
Bbasis
);
int
cols
=
gmp_matrix_cols
(
Bbasis
);
int
cols
=
gmp_matrix_cols
(
Bbasis
);
if
(
rows
<
cols
)
return
;
if
(
rows
<
cols
)
{
destroy_gmp_matrix
(
Zbasis
);
destroy_gmp_matrix
(
Bbasis
);
return
;
}
rows
=
gmp_matrix_rows
(
Zbasis
);
rows
=
gmp_matrix_rows
(
Zbasis
);
cols
=
gmp_matrix_cols
(
Zbasis
);
cols
=
gmp_matrix_cols
(
Zbasis
);
if
(
rows
<
cols
)
return
;
if
(
rows
<
cols
)
{
destroy_gmp_matrix
(
Zbasis
);
destroy_gmp_matrix
(
Bbasis
);
return
;
}
// inv(U)*A*inv(V) = S
// inv(U)*A*inv(V) = S
gmp_normal_form
*
normalForm
gmp_normal_form
*
normalForm
...
@@ -240,7 +248,11 @@ void ChainComplex::Inclusion(int lowDim, int highDim)
...
@@ -240,7 +248,11 @@ void ChainComplex::Inclusion(int lowDim, int highDim)
if
(
mpz_cmp_si
(
remainder
,
0
)
==
0
){
if
(
mpz_cmp_si
(
remainder
,
0
)
==
0
){
gmp_matrix_set_elem
(
result
,
i
,
j
,
LB
);
gmp_matrix_set_elem
(
result
,
i
,
j
,
LB
);
}
}
else
return
;
else
{
destroy_gmp_matrix
(
Zbasis
);
destroy_gmp_matrix
(
LB
);
return
;
}
}
}
}
}
...
@@ -436,9 +448,8 @@ std::vector<int> ChainComplex::getCoeffVector(int dim, int chainNumber)
...
@@ -436,9 +448,8 @@ std::vector<int> ChainComplex::getCoeffVector(int dim, int chainNumber)
gmp_matrix
*
ChainComplex
::
getBasis
(
int
dim
,
int
basis
)
gmp_matrix
*
ChainComplex
::
getBasis
(
int
dim
,
int
basis
)
{
{
if
(
dim
>
-
2
&&
dim
<
5
&&
basis
==
2
)
return
_codH
[
dim
+
1
];
if
(
dim
>
-
2
&&
dim
<
4
&&
basis
==
2
)
return
_codH
[
dim
+
1
];
if
(
dim
<
0
||
dim
>
4
)
return
NULL
;
if
(
dim
<
0
||
dim
>
4
)
return
NULL
;
if
(
basis
==
0
)
return
create_gmp_matrix_identity
(
getBasisSize
(
dim
,
0
));
else
if
(
basis
==
1
)
return
_kerH
[
dim
];
else
if
(
basis
==
1
)
return
_kerH
[
dim
];
else
if
(
basis
==
3
)
return
_Hbasis
[
dim
];
else
if
(
basis
==
3
)
return
_Hbasis
[
dim
];
else
return
NULL
;
else
return
NULL
;
...
@@ -451,7 +462,7 @@ void ChainComplex::getBasisChain(std::map<Cell*, int, Less_Cell>& chain,
...
@@ -451,7 +462,7 @@ void ChainComplex::getBasisChain(std::map<Cell*, int, Less_Cell>& chain,
gmp_matrix
*
basisMatrix
=
getBasis
(
dim
,
basis
);
gmp_matrix
*
basisMatrix
=
getBasis
(
dim
,
basis
);
chain
.
clear
();
chain
.
clear
();
if
(
dim
<
0
||
dim
>
4
)
return
;
if
(
dim
<
0
||
dim
>
3
)
return
;
if
(
basisMatrix
==
NULL
||
(
int
)
gmp_matrix_cols
(
basisMatrix
)
<
num
){
if
(
basisMatrix
==
NULL
||
(
int
)
gmp_matrix_cols
(
basisMatrix
)
<
num
){
return
;
return
;
}
}
...
@@ -464,7 +475,7 @@ void ChainComplex::getBasisChain(std::map<Cell*, int, Less_Cell>& chain,
...
@@ -464,7 +475,7 @@ void ChainComplex::getBasisChain(std::map<Cell*, int, Less_Cell>& chain,
int
torsion
=
1
;
int
torsion
=
1
;
if
(
basis
==
3
)
torsion
=
getTorsion
(
dim
,
num
);
if
(
basis
==
3
)
torsion
=
getTorsion
(
dim
,
num
);
for
(
citer
cit
=
firstCell
(
dim
);
cit
!=
lastCell
(
dim
);
cit
++
){
for
(
citer
cit
=
this
->
firstCell
(
dim
);
cit
!=
this
->
lastCell
(
dim
);
cit
++
){
Cell
*
cell
=
cit
->
first
;
Cell
*
cell
=
cit
->
first
;
int
index
=
cit
->
second
;
int
index
=
cit
->
second
;
gmp_matrix_get_elem
(
elem
,
index
,
num
,
basisMatrix
);
gmp_matrix_get_elem
(
elem
,
index
,
num
,
basisMatrix
);
...
@@ -682,358 +693,4 @@ void ChainComplex::deImmuneCells(std::map<Cell*, int, Less_Cell>& cells)
...
@@ -682,358 +693,4 @@ void ChainComplex::deImmuneCells(std::map<Cell*, int, Less_Cell>& cells)
}
}
}
}
HomologySequence
::
HomologySequence
(
ChainComplex
*
subcomplex
,
ChainComplex
*
complex
,
ChainComplex
*
relcomplex
)
{
_subcomplex
=
subcomplex
;
_complex
=
complex
;
_relcomplex
=
relcomplex
;
mpz_t
elem
;
mpz_init_set_si
(
elem
,
-
1
);
for
(
int
i
=
0
;
i
<
4
;
i
++
){
_Ic_sub
[
i
]
=
NULL
;
_Ic_rel
[
i
]
=
NULL
;
_Dh
[
i
]
=
NULL
;
_invDh
[
i
]
=
NULL
;
_Jh
[
i
]
=
NULL
;
_Ih
[
i
]
=
NULL
;
_invJh
[
i
]
=
NULL
;
_invIh
[
i
]
=
NULL
;
}
findIcMaps
();
/*findDhMap(1);
findInvIhMap(0);
blockHBasis(_Dh[1], _invIh[0], _subcomplex, 0);*/
/*findJhMap(1);
findInvDhMap(1);
blockHBasis(_Jh[1], _invDh[1], _relcomplex, 1);*/
}
HomologySequence
::~
HomologySequence
()
{
for
(
int
i
=
0
;
i
<
4
;
i
++
){
destroy_gmp_matrix
(
_Ic_sub
[
i
]);
destroy_gmp_matrix
(
_Ic_rel
[
i
]);
destroy_gmp_matrix
(
_Ih
[
i
]);
destroy_gmp_matrix
(
_Jh
[
i
]);
destroy_gmp_matrix
(
_invIh
[
i
]);
destroy_gmp_matrix
(
_invJh
[
i
]);
destroy_gmp_matrix
(
_Dh
[
i
]);
destroy_gmp_matrix
(
_invDh
[
i
]);
}
}
void
HomologySequence
::
findIcMaps
()
{
for
(
int
i
=
0
;
i
<
4
;
i
++
){
mpz_t
one
;
mpz_init_set_si
(
one
,
1
);
if
(
_complex
->
getBasisSize
(
i
,
0
)
>
0
&&
_subcomplex
->
getBasisSize
(
i
,
0
)
>
0
){
_Ic_sub
[
i
]
=
create_gmp_matrix_zero
(
_complex
->
getBasisSize
(
i
,
0
),
_subcomplex
->
getBasisSize
(
i
,
0
));
//printf("rows %d, cols %d. \n", _complex->getBasisSize(i, 0),
// _subcomplex->getBasisSize(i, 0));
for
(
ChainComplex
::
citer
cit
=
_complex
->
firstCell
(
i
);
cit
!=
_complex
->
lastCell
(
i
);
cit
++
){
Cell
*
cell
=
cit
->
first
;
int
row
=
cit
->
second
;
int
col
=
_subcomplex
->
getCellIndex
(
cell
);
//printf("row %d, col %d. \n", row, col);
if
(
col
!=
0
)
gmp_matrix_set_elem
(
one
,
row
,
col
,
_Ic_sub
[
i
]);
}
}
if
(
_complex
->
getBasisSize
(
i
,
0
)
>
0
&&
_relcomplex
->
getBasisSize
(
i
,
0
)
>
0
){
_Ic_rel
[
i
]
=
create_gmp_matrix_zero
(
_complex
->
getBasisSize
(
i
,
0
),
_relcomplex
->
getBasisSize
(
i
,
0
));
//printf("rows %d, cols %d. \n", _complex->getBasisSize(i, 0),
for
(
ChainComplex
::
citer
cit
=
_complex
->
firstCell
(
i
);
cit
!=
_complex
->
lastCell
(
i
);
cit
++
){
Cell
*
cell
=
cit
->
first
;
int
row
=
cit
->
second
;
int
col
=
_relcomplex
->
getCellIndex
(
cell
);
//printf("row %d, col %d. \n", row, col);
if
(
col
!=
0
)
gmp_matrix_set_elem
(
one
,
row
,
col
,
_Ic_rel
[
i
]);
}
}
mpz_clear
(
one
);
}
}
void
HomologySequence
::
findIhMap
(
int
i
)
{
if
(
_Ic_sub
[
i
]
!=
NULL
&&
_complex
->
getBasisSize
(
i
,
3
)
>
0
&&
_subcomplex
->
getBasisSize
(
i
,
3
)
>
0
){
gmp_matrix
*
IH
=
copy_gmp_matrix
(
_Ic_sub
[
i
],
1
,
1
,
gmp_matrix_rows
(
_Ic_sub
[
i
]),
gmp_matrix_cols
(
_Ic_sub
[
i
]));
gmp_matrix_right_mult
(
IH
,
_subcomplex
->
getBasis
(
i
,
3
));
_Ih
[
i
]
=
createIncMap
(
IH
,
_complex
->
getBasis
(
i
,
3
));
}
}
void
HomologySequence
::
findInvIhMap
(
int
i
)
{
if
(
_Ic_sub
[
i
]
!=
NULL
&&
_complex
->
getBasisSize
(
i
,
3
)
>
0
&&
_subcomplex
->
getBasisSize
(
i
,
3
)
>
0
){
gmp_matrix
*
IH
=
copy_gmp_matrix
(
_Ic_sub
[
i
],
1
,
1
,
gmp_matrix_rows
(
_Ic_sub
[
i
]),
gmp_matrix_cols
(
_Ic_sub
[
i
]));
gmp_matrix_transp
(
IH
);
gmp_matrix_right_mult
(
IH
,
_complex
->
getBasis
(
i
,
3
));
_invIh
[
i
]
=
createIncMap
(
IH
,
_subcomplex
->
getBasis
(
i
,
3
));
}
}
void
HomologySequence
::
findJhMap
(
int
i
)
{
if
(
_Ic_rel
[
i
]
!=
NULL
&&
_complex
->
getBasisSize
(
i
,
3
)
>
0
&&
_relcomplex
->
getBasisSize
(
i
,
3
)
>
0
){
gmp_matrix
*
JH
=
copy_gmp_matrix
(
_Ic_rel
[
i
],
1
,
1
,
gmp_matrix_rows
(
_Ic_rel
[
i
]),
gmp_matrix_cols
(
_Ic_rel
[
i
]));
gmp_matrix_transp
(
JH
);
gmp_matrix_right_mult
(
JH
,
_complex
->
getBasis
(
i
,
3
));
_Jh
[
i
]
=
createIncMap
(
JH
,
_relcomplex
->
getBasis
(
i
,
3
));
}
}
void
HomologySequence
::
findInvJhMap
(
int
i
)
{
if
(
_Ic_rel
[
i
]
!=
NULL
&&
_complex
->
getBasisSize
(
i
,
3
)
>
0
&&
_relcomplex
->
getBasisSize
(
i
,
3
)
>
0
){
gmp_matrix
*
JH
=
copy_gmp_matrix
(
_Ic_rel
[
i
],
1
,
1
,
gmp_matrix_rows
(
_Ic_rel
[
i
]),
gmp_matrix_cols
(
_Ic_rel
[
i
]));
gmp_matrix_right_mult
(
JH
,
_relcomplex
->
getBasis
(
i
,
3
));
_invJh
[
i
]
=
createIncMap
(
JH
,
_complex
->
getBasis
(
i
,
3
));
}
}
void
HomologySequence
::
findDhMap
(
int
i
)
{
if
(
i
>
0
&&
_relcomplex
->
getBasisSize
(
i
,
3
)
>
0
&&
_subcomplex
->
getBasisSize
(
i
-
1
,
3
)
>
0
&&
_complex
->
getBoundaryOp
(
i
)
!=
NULL
){
gmp_matrix
*
JDIH
=
copy_gmp_matrix
(
_Ic_sub
[
i
-
1
],
1
,
1
,
gmp_matrix_rows
(
_Ic_sub
[
i
-
1
]),
gmp_matrix_cols
(
_Ic_sub
[
i
-
1
]));
gmp_matrix_transp
(
JDIH
);
gmp_matrix_right_mult
(
JDIH
,
_complex
->
getBoundaryOp
(
i
));
gmp_matrix_right_mult
(
JDIH
,
_Ic_rel
[
i
]);
gmp_matrix_right_mult
(
JDIH
,
_relcomplex
->
getBasis
(
i
,
3
));
_Dh
[
i
]
=
createIncMap
(
JDIH
,
_subcomplex
->
getBasis
(
i
-
1
,
3
));
}
}
void
HomologySequence
::
findInvDhMap
(
int
i
)
{
if
(
i
>
0
&&
_relcomplex
->
getBasisSize
(
i
,
3
)
>
0
&&
_subcomplex
->
getBasisSize
(
i
-
1
,
3
)
>
0
&&
_complex
->
getBoundaryOp
(
i
)
!=
NULL
){
gmp_matrix
*
JDIH
=
copy_gmp_matrix
(
_Ic_rel
[
i
],
1
,
1
,
gmp_matrix_rows
(
_Ic_rel
[
i
]),
gmp_matrix_cols
(
_Ic_rel
[
i
]));
gmp_matrix_transp
(
JDIH
);
gmp_matrix
*
bd
=
_complex
->
getBoundaryOp
(
i
);
gmp_matrix_transp
(
bd
);
gmp_matrix_right_mult
(
JDIH
,
bd
);
gmp_matrix_transp
(
bd
);
gmp_matrix_right_mult
(
JDIH
,
_Ic_sub
[
i
-
1
]);
gmp_matrix_right_mult
(
JDIH
,
_subcomplex
->
getBasis
(
i
-
1
,
3
));
_invDh
[
i
]
=
createIncMap
(
JDIH
,
_relcomplex
->
getBasis
(
i
,
3
));
}
}
//i: a->b : aBasis = bBasis*incMap
gmp_matrix
*
HomologySequence
::
createIncMap
(
gmp_matrix
*
domBasis
,
gmp_matrix
*
codBasis
)
{
if
(
domBasis
==
NULL
||
codBasis
==
NULL
){
printf
(
"ERROR: null matrix given.
\n
"
);
return
NULL
;
}
int
rows
=
gmp_matrix_rows
(
domBasis
);
int
cols
=
gmp_matrix_cols
(
domBasis
);
if
(
rows
<
cols
||
rows
==
0
||
cols
==
0
)
return
NULL
;
rows
=
gmp_matrix_rows
(
codBasis
);
cols
=
gmp_matrix_cols
(
codBasis
);
if
(
rows
<
cols
||
rows
==
0
||
cols
==
0
)
return
NULL
;
gmp_matrix
*
temp
=
codBasis
;
codBasis
=
copy_gmp_matrix
(
temp
,
1
,
1
,
gmp_matrix_rows
(
temp
),
gmp_matrix_cols
(
temp
));
// inv(U)*A*inv(V) = S
gmp_normal_form
*
normalForm
=
create_gmp_Smith_normal_form
(
codBasis
,
INVERTED
,
INVERTED
);
mpz_t
elem
;
mpz_init
(
elem
);
for
(
int
i
=
1
;
i
<=
cols
;
i
++
){
gmp_matrix_get_elem
(
elem
,
i
,
i
,
normalForm
->
canonical
);
if
(
mpz_cmp_si
(
elem
,
0
)
==
0
){
destroy_gmp_normal_form
(
normalForm
);
return
NULL
;
}
}
gmp_matrix_left_mult
(
normalForm
->
left
,
domBasis
);
gmp_matrix
*
LB
=
copy_gmp_matrix
(
domBasis
,
1
,
1
,
gmp_matrix_cols
(
codBasis
),
gmp_matrix_cols
(
domBasis
));
destroy_gmp_matrix
(
domBasis
);
rows
=
gmp_matrix_rows
(
LB
);
cols
=
gmp_matrix_cols
(
LB
);
mpz_t
divisor
;
mpz_init
(
divisor
);
mpz_t
remainder
;
mpz_init
(
remainder
);
mpz_t
result
;
mpz_init
(
result
);
for
(
int
i
=
1
;
i
<=
rows
;
i
++
){
gmp_matrix_get_elem
(
divisor
,
i
,
i
,
normalForm
->
canonical
);
for
(
int
j
=
1
;
j
<=
cols
;
j
++
){
gmp_matrix_get_elem
(
elem
,
i
,
j
,
LB
);
mpz_cdiv_qr
(
result
,
remainder
,
elem
,
divisor
);
if
(
mpz_cmp_si
(
remainder
,
0
)
==
0
){
gmp_matrix_set_elem
(
result
,
i
,
j
,
LB
);
}
else
{
destroy_gmp_normal_form
(
normalForm
);
destroy_gmp_matrix
(
LB
);
return
NULL
;
}
}
}
gmp_matrix_left_mult
(
normalForm
->
right
,
LB
);
mpz_clear
(
elem
);
mpz_clear
(
divisor
);
mpz_clear
(
result
);
destroy_gmp_normal_form
(
normalForm
);
return
LB
;
}
gmp_matrix
*
HomologySequence
::
removeZeroCols
(
gmp_matrix
*
matrix
)
{
mpz_t
elem
;
mpz_init
(
elem
);
int
rows
=
gmp_matrix_rows
(
matrix
);
int
cols
=
gmp_matrix_cols
(
matrix
);
//printMatrix(matrix);
std
::
vector
<
int
>
zcols
;
for
(
int
j
=
1
;
j
<=
cols
;
j
++
){
bool
zcol
=
true
;
for
(
int
i
=
1
;
i
<=
rows
;
i
++
){
gmp_matrix_get_elem
(
elem
,
i
,
j
,
matrix
);
if
(
mpz_cmp_si
(
elem
,
0
)
!=
0
){
zcol
=
false
;
break
;
}
}
if
(
zcol
)
zcols
.
push_back
(
j
);
}
if
(
zcols
.
empty
())
return
matrix
;
gmp_matrix
*
newMatrix
=
create_gmp_matrix_zero
(
rows
,
cols
-
zcols
.
size
());
if
(
cols
-
zcols
.
size
()
==
0
)
return
newMatrix
;
int
k
=
0
;
for
(
int
j
=
1
;
j
<=
cols
;
j
++
){
if
((
int
)
zcols
.
size
()
-
1
<
k
)
break
;
if
(
zcols
.
at
(
k
)
==
j
)
{
k
++
;
continue
;
}
for
(
int
i
=
1
;
i
<=
rows
;
i
++
){
gmp_matrix_get_elem
(
elem
,
i
,
j
,
matrix
);
gmp_matrix_set_elem
(
elem
,
i
,
j
-
k
,
newMatrix
);
}
}
//printMatrix(newMatrix);
destroy_gmp_matrix
(
matrix
);
mpz_clear
(
elem
);
return
newMatrix
;
}
void
HomologySequence
::
blockHBasis
(
gmp_matrix
*
block1T
,
gmp_matrix
*
block2T
,
ChainComplex
*
complex
,
int
dim
)
{
printMatrix
(
block1T
);
printMatrix
(
block2T
);
if
(
block1T
==
NULL
&&
block2T
==
NULL
)
return
;
gmp_matrix
*
Hbasis
=
complex
->
getBasis
(
dim
,
3
);
if
(
block1T
==
NULL
&&
block2T
!=
NULL
){
gmp_matrix_right_mult
(
Hbasis
,
block2T
);
printMatrix
(
Hbasis
);
return
;
}
if
(
block1T
!=
NULL
&&
block2T
==
NULL
){
gmp_matrix_right_mult
(
Hbasis
,
block1T
);
printMatrix
(
Hbasis
);
return
;
}
int
rows
=
gmp_matrix_rows
(
Hbasis
);
int
cols
=
gmp_matrix_cols
(
Hbasis
);
gmp_matrix
*
temp1
=
copy_gmp_matrix
(
Hbasis
,
1
,
1
,
rows
,
cols
);
gmp_matrix
*
temp2
=
copy_gmp_matrix
(
Hbasis
,
1
,
1
,
rows
,
cols
);
printMatrix
(
temp1
);
printMatrix
(
temp2
);
gmp_matrix_right_mult
(
temp1
,
block1T
);
gmp_matrix_right_mult
(
temp2
,
block2T
);
printMatrix
(
temp1
);
printMatrix
(
temp2
);
temp1
=
removeZeroCols
(
temp1
);
temp2
=
removeZeroCols
(
temp2
);
printMatrix
(
temp1
);
printMatrix
(
temp2
);
int
bcol
=
gmp_matrix_cols
(
temp1
);
mpz_t
elem
;
mpz_init
(
elem
);
for
(
int
i
=
1
;
i
<=
rows
;
i
++
){
for
(
int
j
=
1
;
j
<=
cols
;
j
++
){
if
(
j
<=
bcol
)
gmp_matrix_get_elem
(
elem
,
i
,
j
,
temp1
);
else
gmp_matrix_get_elem
(
elem
,
i
,
j
-
bcol
,
temp2
);
gmp_matrix_set_elem
(
elem
,
i
,
j
,
Hbasis
);
}
}
printMatrix
(
Hbasis
);
mpz_clear
(
elem
);
destroy_gmp_matrix
(
temp1
);
destroy_gmp_matrix
(
temp2
);
}
#endif
#endif
This diff is collapsed.
Click to expand it.
Geo/ChainComplex.h
+
0
−
56
View file @
35a5fbed
...
@@ -110,7 +110,6 @@ class ChainComplex
...
@@ -110,7 +110,6 @@ class ChainComplex
int
getDim
()
const
{
return
_dim
;
}
int
getDim
()
const
{
return
_dim
;
}
// 0 : C basis (chains)
// 1 : Z basis (cycles)
// 1 : Z basis (cycles)
// 2 : B basis (boundaries)
// 2 : B basis (boundaries)
// 3 : H basis (homology)
// 3 : H basis (homology)
...
@@ -179,61 +178,6 @@ class ChainComplex
...
@@ -179,61 +178,6 @@ class ChainComplex
void
matrixTest
();
void
matrixTest
();
};
};
// An experimental class to modify computed bases for homology spaces
// so that the basis chains are decomposed according to the long
// exact homology sequence.
class
HomologySequence
{
private:
ChainComplex
*
_subcomplex
;
ChainComplex
*
_complex
;
ChainComplex
*
_relcomplex
;
gmp_matrix
*
_Ic_sub
[
4
];
gmp_matrix
*
_Ic_rel
[
4
];
gmp_matrix
*
_Ih
[
4
];
gmp_matrix
*
_Jh
[
4
];
gmp_matrix
*
_invIh
[
4
];
gmp_matrix
*
_invJh
[
4
];
gmp_matrix
*
_Dh
[
4
];
gmp_matrix
*
_invDh
[
4
];
void
findIcMaps
();
void
findIhMap
(
int
i
);
void
findInvIhMap
(
int
i
);
void
findJhMap
(
int
i
);
void
findInvJhMap
(
int
i
);
void
findDhMap
(
int
i
);
void
findInvDhMap
(
int
i
);
public:
HomologySequence
(
ChainComplex
*
subcomplex
,
ChainComplex
*
complex
,
ChainComplex
*
relcomplex
);
~
HomologySequence
();
// create an inclusion map from domBasis to codBasis
// (deletes domBasis, leaves codBasis unaffected)
gmp_matrix
*
createIncMap
(
gmp_matrix
*
domBasis
,
gmp_matrix
*
codBasis
);
gmp_matrix
*
removeZeroCols
(
gmp_matrix
*
matrix
);
void
blockHBasis
(
gmp_matrix
*
block1T
,
gmp_matrix
*
block2T
,
ChainComplex
*
complex
,
int
dim
);
int
printMatrix
(
gmp_matrix
*
matrix
){
if
(
matrix
==
NULL
){
printf
(
"NULL matrix.
\n
"
);
return
0
;
}
printf
(
"%d rows and %d columns
\n
"
,
(
int
)
gmp_matrix_rows
(
matrix
),
(
int
)
gmp_matrix_cols
(
matrix
));
return
gmp_matrix_printf
(
matrix
);
}
};
#endif
#endif
#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