Skip to content
GitLab
Explore
Projects
Groups
Topics
Snippets
Projects
Groups
Topics
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Register
Sign in
Toggle navigation
Menu
Егор Сальков
Lab1_sem2
Commits
b40ce5c6
Commit
b40ce5c6
authored
4 years ago
by
Егор Сальков
Browse files
Options
Download
Patches
Plain Diff
Upload New File
parent
d961c461
master
No related merge requests found
Pipeline
#1377
canceled with stages
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
MeshLoader.cpp
+272
-0
MeshLoader.cpp
with
272 additions
and
0 deletions
+272
-0
MeshLoader.cpp
0 → 100644
+
272
−
0
View file @
b40ce5c6
#include
"MeshLoader.h"
void
MeshLoader
::
add_node
(
const
Node
&
a
)
{
node
.
push_back
(
a
);
}
void
MeshLoader
::
add_Finite_Element
(
const
Finite_element
&
a
)
{
FE
.
push_back
(
a
);
}
Node
UI_to_N
(
uint16_t
id
,
const
MeshLoader
&
b
)
{
Node
tmp
;
for
(
int
i
=
0
;
i
<
b
.
node
.
size
();
i
++
)
{
if
(
b
.
node
[
i
].
n_id
==
id
)
tmp
=
b
.
node
[
i
];
break
;
}
return
tmp
;
}
uint16_t
N_to_UI
(
const
Node
&
a
)
{
return
a
.
n_id
;
}
void
MeshLoader
::
add_BFE
(
const
Boundary_Finite_element
&
a
)
{
BFE
.
push_back
(
a
);
}
const
vector
<
Boundary_Finite_element
>&
MeshLoader
::
getBoundary_Finite_Element
()
{
return
BFE
;
}
const
vector
<
Finite_element
>&
MeshLoader
::
getFinite_Element
()
{
return
FE
;
}
const
vector
<
Node
>&
MeshLoader
::
get_nodes
()
{
return
node
;
}
vector
<
Finite_element
>
MeshLoader
::
findFinite_Element
(
const
uint16_t
&
a
,
const
uint16_t
&
b
,
const
uint16_t
&
c
)
{
vector
<
Finite_element
>
buf
;
vector
<
Finite_element
>::
iterator
x
=
FE
.
begin
();
while
(
x
!=
FE
.
end
())
{
auto
found
=
std
::
find_if
(
x
,
FE
.
end
(),
[
a
,
b
,
c
](
const
Finite_element
&
t
)
{
int
d
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
if
((
t
.
nodes
[
i
]
==
a
)
||
(
t
.
nodes
[
i
]
==
b
)
||
(
t
.
nodes
[
i
]
==
c
))
d
++
;
}
return
d
==
3
;
});
if
(
x
!=
buf
.
end
())
{
buf
.
push_back
(
*
x
);
x
++
;
}
}
return
buf
;
}
vector
<
Finite_element
>
MeshLoader
::
findFinite_Element
(
const
uint16_t
&
a
,
const
uint16_t
&
b
)
{
vector
<
Finite_element
>
buf
;
vector
<
Finite_element
>::
iterator
x
=
FE
.
begin
();
while
(
x
!=
FE
.
end
())
{
auto
found
{
std
::
find_if
(
x
,
FE
.
end
(),[
a
,
b
](
const
Finite_element
&
t
)
{
int
d
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
if
((
t
.
nodes
[
i
]
==
a
)
||
(
t
.
nodes
[
i
]
==
b
))
d
++
;
}
return
d
==
2
;
})
};
if
(
found
!=
FE
.
end
())
{
buf
.
push_back
(
*
found
);
x
++
;
}
}
return
buf
;
}
set
<
Node
>
MeshLoader
::
find_nodes
(
const
uint16_t
&
gg_id
)
{
set
<
Node
>
buf
;
for
(
int
i
=
0
;
i
<
BFE
.
size
();
i
++
)
{
if
(
BFE
[
i
].
g_id
==
gg_id
)
for
(
int
j
=
0
;
j
<
BFE
[
i
].
nodes
.
size
();
j
++
)
{
buf
.
insert
(
UI_to_N
(
BFE
[
j
].
nodes
[
i
],
*
this
));
}
}
return
buf
;
}
vector
<
Finite_element
>
MeshLoader
::
findFinite_Element
(
const
uint16_t
&
id_materiala
)
{
vector
<
Finite_element
>
buf
;
for
(
int
i
=
0
;
i
<
FE
.
size
();
i
++
)
{
if
(
FE
[
i
].
m_id
==
id_materiala
)
buf
.
push_back
(
FE
[
i
]);
}
return
buf
;
}
vector
<
Boundary_Finite_element
>
MeshLoader
::
findBoundary_Finite_Element
(
const
uint16_t
&
id_granitsi
)
{
vector
<
Boundary_Finite_element
>
buf
;
for
(
int
i
=
0
;
i
<
BFE
.
size
();
i
++
)
{
if
(
BFE
[
i
].
g_id
==
id_granitsi
)
buf
.
push_back
(
BFE
[
i
]);
}
return
buf
;
}
map
<
uint16_t
,
set
<
uint16_t
>>
MeshLoader
::
find_neighbors
()
{
map
<
uint16_t
,
set
<
uint16_t
>>
buf
;
for
(
int
i
=
0
;
i
<
FE
.
size
();
i
++
)
{
for
(
int
j
=
0
;
j
<
4
;
i
++
)
{
for
(
int
k
=
0
;
k
<
4
;
k
++
)
{
if
(
k
!=
j
)
buf
[
FE
[
i
].
nodes
[
j
]].
insert
(
FE
[
i
].
nodes
[
k
]);
}
//!!! Короче и быстрее buf[узел i].insert(все соседи i-го узла)
/*if (buf.count(FE[i].nodes[j]) == 0)
{
for (int k = 0; k < 4; k++)
{
if(j!=k)
}
}
else
{
for (int k = 0; k < 4; k++)
{
if(k!=j)
buf[FE[i].nodes[j]].insert(FE[i].nodes[k]);
}
}*/
}
}
return
buf
;
}
void
MeshLoader
::
insertt
()
{
unordered_set
<
Edge
,
EdgeHash
>
hash
;
for
(
int
i
=
0
;
i
<
FE
.
size
();
i
++
)
{
for
(
int
j
=
0
;
j
<
4
;
j
++
)
{
for
(
int
k
=
0
;
k
<
4
;
k
++
)
{
if
(
j
!=
k
)
{
Edge
buf
(
FE
[
i
].
nodes
[
j
],
FE
[
i
].
nodes
[
k
]);
if
(
hash
.
find
(
buf
)
!=
hash
.
end
())
{
Node
ins
=
mid_elem
(
FE
[
i
].
nodes
[
0
],
FE
[
i
].
nodes
[
j
]);
node
.
push_back
(
ins
);
FE
[
i
].
nodes
.
push_back
(
ins
.
n_id
);
uint16_t
o
=
FE
[
i
].
nodes
[
j
];
uint16_t
t
=
FE
[
i
].
nodes
[
k
];
buf
.
nodes
[
2
]
=
ins
.
n_id
;
}
//!!! А если ребро захешировано в данный КЭ узел с существующем ID добавлять не надо?
//!!! Тип Ребро должен хранить ID ребра в середине, чтобы быстро к нему обратиться.
}
}
}
}
for
(
auto
&
it
:
BFE
)
{
Edge
buff
((
it
).
nodes
[
0
],
it
.
nodes
[
1
]);
buff
=
*
(
hash
.
find
(
buff
));;
//!!! Потеря производительности
it
.
nodes
.
push_back
(
buff
.
nodes
[
2
]);
}
}
Node
MeshLoader
::
mid_elem
(
uint16_t
c
,
uint16_t
d
)
{
Node
a
=
UI_to_N
(
c
,
*
this
);
Node
b
=
UI_to_N
(
d
,
*
this
);
Node
buf
;
buf
.
x
=
(
a
.
x
+
b
.
x
)
/
2
;
buf
.
y
=
(
a
.
y
+
b
.
y
)
/
2
;
buf
.
z
=
(
a
.
z
+
b
.
z
)
/
2
;
buf
.
gr
=
true
;
return
buf
;
}
bool
srav_node
(
const
Node
&
a
,
const
Node
&
b
)
{
return
(
a
.
n_id
==
b
.
n_id
);
}
bool
operator
==
(
const
Edge
&
a
,
const
Edge
&
b
)
{
return
(((
a
.
nodes
[
0
]
==
b
.
nodes
[
0
])
&&
(
a
.
nodes
[
1
]
==
b
.
nodes
[
1
])
||
((
a
.
nodes
[
0
]
==
b
.
nodes
[
1
])
&&
(
a
.
nodes
[
1
]
==
b
.
nodes
[
0
]))));
}
/*Edge findEdge(uint16_t id1, uint16_t id2,const unordered_set<Edge, EdgeHash>& sett)
{
Edge buf(id1, id2);
//!!! Не понял, а зачем мы тогда unordered_set используем? Чтобы все ребра перебирать?
//!!! Потеряны все преимущества контейнера.
unordered_set<Edge, EdgeHash>::iterator x = sett.begin();
auto found = std::find_if(x, sett.end(), [id1, id2](const Edge& t) {
int d = 0;
for (int i = 0; i < 3; i++)
{
if ((t.nodes[i] == id1) || (t.nodes[i] == id2))
d++;
}
return d == 2;
});
return *found;
}*/
vector
<
Boundary_Finite_element
>
MeshLoader
::
findBoundary_Finite_Element
(
uint16_t
id1
,
uint16_t
id2
)
{
vector
<
Boundary_Finite_element
>
buf
;
vector
<
Boundary_Finite_element
>::
iterator
it
=
BFE
.
begin
();
while
(
it
!=
BFE
.
end
())
{
auto
found
=
std
::
find_if
(
it
,
BFE
.
end
(),
[
id1
,
id2
](
const
Boundary_Finite_element
&
a
)
{
int
d
=
0
;
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
if
((
a
.
nodes
[
i
]
==
id1
)
||
(
a
.
nodes
[
i
]
==
id2
))
d
++
;
}
return
d
==
2
;
});
if
(
it
!=
BFE
.
end
())
{
buf
.
push_back
(
*
it
);
it
++
;
}
}
return
buf
;
}
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
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
Menu
Explore
Projects
Groups
Topics
Snippets