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
3fe26487
Commit
3fe26487
authored
9 years ago
by
Christophe Geuzaine
Browse files
Options
Downloads
Patches
Plain Diff
merged $Brep and $Entities sections + fix saving of edges with no (or just one) end point
parent
0ea1d6a2
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
Geo/GModelIO_MSH.cpp
+139
-162
139 additions, 162 deletions
Geo/GModelIO_MSH.cpp
with
139 additions
and
162 deletions
Geo/GModelIO_MSH.cpp
+
139
−
162
View file @
3fe26487
...
...
@@ -23,131 +23,89 @@
#include
"discreteFace.h"
#include
"discreteRegion.h"
// writes the topology associated to the mesh
void
writeMSHBrep
(
FILE
*
fp
,
GModel
*
gm
)
{
fprintf
(
fp
,
"$Brep
\n
"
);
fprintf
(
fp
,
"%d %d %d %d
\n
"
,
gm
->
getNumVertices
(),
gm
->
getNumEdges
(),
gm
->
getNumFaces
(),
gm
->
getNumRegions
());
for
(
GModel
::
viter
it
=
gm
->
firstVertex
();
it
!=
gm
->
lastVertex
();
++
it
)
{
fprintf
(
fp
,
"%d
\n
"
,(
*
it
)
->
tag
());
}
for
(
GModel
::
eiter
it
=
gm
->
firstEdge
();
it
!=
gm
->
lastEdge
();
++
it
)
{
fprintf
(
fp
,
"%d %d %d
\n
"
,(
*
it
)
->
tag
(),(
*
it
)
->
getBeginVertex
()
->
tag
(),(
*
it
)
->
getEndVertex
()
->
tag
());
}
for
(
GModel
::
fiter
it
=
gm
->
firstFace
();
it
!=
gm
->
lastFace
();
++
it
)
{
std
::
list
<
GEdge
*>
edges
=
(
*
it
)
->
edges
();
fprintf
(
fp
,
"%d %lu "
,(
*
it
)
->
tag
(),
edges
.
size
());
for
(
std
::
list
<
GEdge
*>::
iterator
ite
=
edges
.
begin
();
ite
!=
edges
.
end
();
ite
++
){
fprintf
(
fp
,
"%d "
,(
*
ite
)
->
tag
());
}
fprintf
(
fp
,
"
\n
"
);
}
for
(
GModel
::
riter
it
=
gm
->
firstRegion
();
it
!=
gm
->
lastRegion
();
++
it
)
{
std
::
list
<
GFace
*>
faces
=
(
*
it
)
->
faces
();
fprintf
(
fp
,
"%d %lu "
,(
*
it
)
->
tag
(),
faces
.
size
());
for
(
std
::
list
<
GFace
*>::
iterator
itf
=
faces
.
begin
();
itf
!=
faces
.
end
();
itf
++
){
fprintf
(
fp
,
"%d "
,(
*
itf
)
->
tag
());
}
fprintf
(
fp
,
"
\n
"
);
static
int
readMSHPhysicals
(
FILE
*
fp
,
GEntity
*
ge
)
{
int
nump
;
if
(
fscanf
(
fp
,
"%d"
,
&
nump
)
!=
1
)
return
0
;
for
(
int
i
=
0
;
i
<
nump
;
i
++
){
int
tag
;
if
(
fscanf
(
fp
,
"%d"
,
&
tag
)
!=
1
)
return
0
;
ge
->
physicals
.
push_back
(
tag
);
}
fprintf
(
fp
,
"$EndBrep
\n
"
)
;
return
1
;
}
// writes the topology associated to the mesh
void
readMSHBrep
(
FILE
*
fp
,
GModel
*
gm
)
{
static
void
readMSHEntities
(
FILE
*
fp
,
GModel
*
gm
)
{
int
nv
,
ne
,
nf
,
nr
;
int
tag
;
if
(
fscanf
(
fp
,
"%d %d %d %d"
,
&
nv
,
&
ne
,
&
nf
,
&
nr
)
!=
4
)
return
;
// printf("%d\n",nv);
for
(
int
i
=
0
;
i
<
nv
;
i
++
){
fscanf
(
fp
,
"%d"
,
&
tag
);
for
(
int
i
=
0
;
i
<
nv
;
i
++
){
if
(
fscanf
(
fp
,
"%d"
,
&
tag
)
!=
1
)
return
;
GVertex
*
gv
=
gm
->
getVertexByTag
(
tag
);
if
(
!
gv
)
gm
->
add
(
new
discreteVertex
(
gm
,
tag
));
if
(
!
gv
){
gv
=
new
discreteVertex
(
gm
,
tag
);
gm
->
add
(
gv
);
}
if
(
!
readMSHPhysicals
(
fp
,
gv
))
return
;
}
// printf("%d\n",ne);
for
(
int
i
=
0
;
i
<
ne
;
i
++
){
fscanf
(
fp
,
"%d"
,
&
tag
)
;
for
(
int
i
=
0
;
i
<
ne
;
i
++
){
int
n
;
if
(
fscanf
(
fp
,
"%d
%d
"
,
&
tag
,
&
n
)
!=
2
)
return
;
GEdge
*
ge
=
gm
->
getEdgeByTag
(
tag
);
if
(
!
ge
){
int
tagv
;
fscanf
(
fp
,
"%d"
,
&
tagv
);
GVertex
*
v1
=
gm
->
getVertexByTag
(
tagv
);
if
(
!
v1
)
Msg
::
Error
(
"Unknown GVertex %d"
,
tagv
);
fscanf
(
fp
,
"%d"
,
&
tagv
);
GVertex
*
v2
=
gm
->
getVertexByTag
(
tagv
);
if
(
!
v2
)
Msg
::
Error
(
"Unknown GVertex %d"
,
tagv
);
gm
->
add
(
new
discreteEdge
(
gm
,
tag
,
v1
,
v2
));
GVertex
*
v1
=
0
,
*
v2
=
0
;
for
(
int
j
=
0
;
j
<
n
;
j
++
){
int
tagv
;
if
(
fscanf
(
fp
,
"%d"
,
&
tagv
)
!=
1
)
return
;
GVertex
*
v
=
gm
->
getVertexByTag
(
tagv
);
if
(
!
v
)
Msg
::
Error
(
"Unknown GVertex %d"
,
tagv
);
if
(
j
==
0
)
v1
=
v
;
if
(
j
==
1
)
v2
=
v
;
}
ge
=
new
discreteEdge
(
gm
,
tag
,
v1
,
v2
);
gm
->
add
(
ge
);
}
if
(
!
readMSHPhysicals
(
fp
,
ge
))
return
;
}
// printf("%d\n",nf);
for
(
int
i
=
0
;
i
<
nf
;
i
++
){
for
(
int
i
=
0
;
i
<
nf
;
i
++
){
int
n
;
fscanf
(
fp
,
"%d %d"
,
&
tag
,
&
n
);
// printf("%d %d\n",tag,n);
if
(
fscanf
(
fp
,
"%d %d"
,
&
tag
,
&
n
)
!=
2
)
return
;
GFace
*
gf
=
gm
->
getFaceByTag
(
tag
);
if
(
!
gf
){
discreteFace
*
df
=
new
discreteFace
(
gm
,
tag
);
discreteFace
*
df
=
new
discreteFace
(
gm
,
tag
);
std
::
vector
<
int
>
edges
;
for
(
int
j
=
0
;
j
<
n
;
j
++
){
for
(
int
j
=
0
;
j
<
n
;
j
++
){
int
tage
;
fscanf
(
fp
,
"%d"
,
&
tage
);
if
(
fscanf
(
fp
,
"%d"
,
&
tage
)
!=
1
)
return
;
edges
.
push_back
(
tage
);
}
df
->
setBoundEdges
(
gm
,
edges
);
df
->
setBoundEdges
(
gm
,
edges
);
gm
->
add
(
df
);
gf
=
df
;
}
if
(
!
readMSHPhysicals
(
fp
,
gf
))
return
;
}
// printf("%d\n",nr);
for
(
int
i
=
0
;
i
<
nr
;
i
++
){
for
(
int
i
=
0
;
i
<
nr
;
i
++
){
int
n
;
fscanf
(
fp
,
"%d %d"
,
&
tag
,
&
n
);
if
(
fscanf
(
fp
,
"%d %d"
,
&
tag
,
&
n
)
!=
2
)
return
;
GRegion
*
gr
=
gm
->
getRegionByTag
(
tag
);
if
(
!
gr
){
discreteRegion
*
dr
=
new
discreteRegion
(
gm
,
tag
);
discreteRegion
*
dr
=
new
discreteRegion
(
gm
,
tag
);
std
::
set
<
int
>
faces
;
for
(
int
j
=
0
;
j
<
n
;
j
++
){
for
(
int
j
=
0
;
j
<
n
;
j
++
){
int
tagf
;
fscanf
(
fp
,
"%d"
,
&
tagf
);
if
(
fscanf
(
fp
,
"%d"
,
&
tagf
)
!=
1
)
return
;
faces
.
insert
(
tagf
);
}
dr
->
setBoundFaces
(
faces
);
dr
->
setBoundFaces
(
faces
);
gm
->
add
(
dr
);
gr
=
dr
;
}
if
(
!
readMSHPhysicals
(
fp
,
gr
))
return
;
}
}
void
writeMSHPeriodicNodes
(
FILE
*
fp
,
std
::
vector
<
GEntity
*>
&
entities
)
{
int
count
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
)
if
(
entities
[
i
]
->
meshMaster
()
!=
entities
[
i
])
count
++
;
if
(
!
count
)
return
;
fprintf
(
fp
,
"$Periodic
\n
"
);
fprintf
(
fp
,
"%d
\n
"
,
count
);
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
){
GEntity
*
g_slave
=
entities
[
i
];
GEntity
*
g_master
=
g_slave
->
meshMaster
();
if
(
g_slave
!=
g_master
){
fprintf
(
fp
,
"%d %d %d
\n
"
,
g_slave
->
dim
(),
g_slave
->
tag
(),
g_master
->
tag
());
if
(
g_slave
->
affineTransform
.
size
()
==
16
)
{
fprintf
(
fp
,
"Affine"
);
for
(
int
i
=
0
;
i
<
16
;
i
++
)
fprintf
(
fp
,
" %.16g"
,
g_slave
->
affineTransform
[
i
]);
fprintf
(
fp
,
"
\n
"
);
}
fprintf
(
fp
,
"%d
\n
"
,
(
int
)
g_slave
->
correspondingVertices
.
size
());
for
(
std
::
map
<
MVertex
*
,
MVertex
*>::
iterator
it
=
g_slave
->
correspondingVertices
.
begin
();
it
!=
g_slave
->
correspondingVertices
.
end
();
it
++
){
MVertex
*
v1
=
it
->
first
;
MVertex
*
v2
=
it
->
second
;
fprintf
(
fp
,
"%d %d
\n
"
,
v1
->
getIndex
(),
v2
->
getIndex
());
}
}
}
fprintf
(
fp
,
"$EndPeriodic
\n
"
);
}
void
readMSHPeriodicNodes
(
FILE
*
fp
,
GModel
*
gm
)
{
int
count
;
...
...
@@ -181,7 +139,7 @@ void readMSHPeriodicNodes(FILE *fp, GModel *gm)
if
(
fscanf
(
fp
,
"%d"
,
&
numv
)
!=
1
)
numv
=
0
;
for
(
int
j
=
0
;
j
<
numv
;
j
++
){
int
v1
,
v2
;
if
(
fscanf
(
fp
,
"%d %d"
,
&
v1
,
&
v2
)
!=
2
)
continue
;
if
(
fscanf
(
fp
,
"%d %d"
,
&
v1
,
&
v2
)
!=
2
)
continue
;
MVertex
*
mv1
=
gm
->
getMeshVertexByTag
(
v1
);
MVertex
*
mv2
=
gm
->
getMeshVertexByTag
(
v2
);
s
->
correspondingVertices
[
mv1
]
=
mv2
;
...
...
@@ -212,7 +170,6 @@ int GModel::readMSH(const std::string &name)
double
version
=
0.
;
bool
binary
=
false
,
swap
=
false
,
postpro
=
false
;
int
minVertex
=
0
;
std
::
map
<
int
,
std
::
vector
<
int
>
>
entities
[
4
];
std
::
map
<
int
,
std
::
vector
<
MElement
*>
>
elements
[
10
];
while
(
1
)
{
...
...
@@ -249,12 +206,6 @@ int GModel::readMSH(const std::string &name)
}
}
// FIXME:
// change this into "$PhysicalAttributes"
// #attribs
// dim num #nums num1 num2... #str str1 str2...
// dum num ...
// $PhysicalNames section
else
if
(
!
strncmp
(
&
str
[
1
],
"PhysicalNames"
,
13
))
{
if
(
!
fgets
(
str
,
sizeof
(
str
),
fp
)){
fclose
(
fp
);
return
0
;
}
...
...
@@ -272,23 +223,7 @@ int GModel::readMSH(const std::string &name)
// $Entities section
else
if
(
!
strncmp
(
&
str
[
1
],
"Entities"
,
8
))
{
if
(
!
fgets
(
str
,
sizeof
(
str
),
fp
)){
fclose
(
fp
);
return
0
;
}
int
numEntities
;
if
(
sscanf
(
str
,
"%d"
,
&
numEntities
)
!=
1
){
fclose
(
fp
);
return
0
;
}
for
(
int
i
=
0
;
i
<
numEntities
;
i
++
)
{
int
num
,
dim
,
numPhysicals
;
if
(
fscanf
(
fp
,
"%d %d %d"
,
&
num
,
&
dim
,
&
numPhysicals
)
!=
3
){
fclose
(
fp
);
return
0
;
}
if
(
numPhysicals
>
0
){
std
::
vector
<
int
>
physicals
(
numPhysicals
);
for
(
int
j
=
0
;
j
<
numPhysicals
;
j
++
){
if
(
fscanf
(
fp
,
"%d"
,
&
physicals
[
j
])
!=
1
){
fclose
(
fp
);
return
0
;
}
}
entities
[
dim
][
num
]
=
physicals
;
}
}
readMSHEntities
(
fp
,
this
);
}
// $Nodes section
...
...
@@ -479,6 +414,11 @@ int GModel::readMSH(const std::string &name)
}
}
// $Periodical section
else
if
(
!
strncmp
(
&
str
[
1
],
"Periodical"
,
10
))
{
readMSHPeriodicNodes
(
fp
,
this
);
}
// Post-processing sections
else
if
(
!
strncmp
(
&
str
[
1
],
"NodeData"
,
8
)
||
!
strncmp
(
&
str
[
1
],
"ElementData"
,
11
)
||
...
...
@@ -486,12 +426,6 @@ int GModel::readMSH(const std::string &name)
postpro
=
true
;
break
;
}
else
if
(
!
strncmp
(
&
str
[
1
],
"Periodical"
,
10
))
{
readMSHPeriodicNodes
(
fp
,
this
);
}
else
if
(
!
strncmp
(
&
str
[
1
],
"Brep"
,
4
))
{
readMSHBrep
(
fp
,
this
);
}
do
{
if
(
!
fgets
(
str
,
sizeof
(
str
),
fp
)
||
feof
(
fp
))
...
...
@@ -513,27 +447,61 @@ int GModel::readMSH(const std::string &name)
else
_storeVerticesInEntities
(
_vertexMapCache
);
// store physicals in entities
for
(
int
dim
=
0
;
dim
<
4
;
dim
++
){
for
(
std
::
map
<
int
,
std
::
vector
<
int
>
>::
iterator
it
=
entities
[
dim
].
begin
();
it
!=
entities
[
dim
].
end
();
it
++
){
GEntity
*
ge
=
0
;
switch
(
dim
){
case
0
:
ge
=
getVertexByTag
(
it
->
first
);
break
;
case
1
:
ge
=
getEdgeByTag
(
it
->
first
);
break
;
case
2
:
ge
=
getFaceByTag
(
it
->
first
);
break
;
case
3
:
ge
=
getRegionByTag
(
it
->
first
);
break
;
}
if
(
ge
)
ge
->
physicals
=
it
->
second
;
}
}
fclose
(
fp
);
return
postpro
?
2
:
1
;
}
static
void
writeMSHPhysicals
(
FILE
*
fp
,
GEntity
*
ge
)
{
std
::
vector
<
int
>
phys
=
ge
->
getPhysicalEntities
();
fprintf
(
fp
,
"%d "
,
(
int
)
phys
.
size
());
for
(
std
::
vector
<
int
>::
iterator
itp
=
phys
.
begin
();
itp
!=
phys
.
end
();
itp
++
)
fprintf
(
fp
,
"%d "
,
*
itp
);
}
static
void
writeMSHEntities
(
FILE
*
fp
,
GModel
*
gm
)
{
fprintf
(
fp
,
"$Entities
\n
"
);
fprintf
(
fp
,
"%d %d %d %d
\n
"
,
gm
->
getNumVertices
(),
gm
->
getNumEdges
(),
gm
->
getNumFaces
(),
gm
->
getNumRegions
());
for
(
GModel
::
viter
it
=
gm
->
firstVertex
();
it
!=
gm
->
lastVertex
();
++
it
)
{
fprintf
(
fp
,
"%d "
,
(
*
it
)
->
tag
());
writeMSHPhysicals
(
fp
,
*
it
);
fprintf
(
fp
,
"
\n
"
);
}
for
(
GModel
::
eiter
it
=
gm
->
firstEdge
();
it
!=
gm
->
lastEdge
();
++
it
)
{
std
::
list
<
GVertex
*>
vertices
;
if
((
*
it
)
->
getBeginVertex
())
vertices
.
push_back
((
*
it
)
->
getBeginVertex
());
if
((
*
it
)
->
getEndVertex
())
vertices
.
push_back
((
*
it
)
->
getEndVertex
());
fprintf
(
fp
,
"%d %d "
,
(
*
it
)
->
tag
(),
(
int
)
vertices
.
size
());
for
(
std
::
list
<
GVertex
*>::
iterator
itv
=
vertices
.
begin
();
itv
!=
vertices
.
end
();
itv
++
){
fprintf
(
fp
,
"%d "
,
(
*
itv
)
->
tag
());
}
writeMSHPhysicals
(
fp
,
*
it
);
fprintf
(
fp
,
"
\n
"
);
}
for
(
GModel
::
fiter
it
=
gm
->
firstFace
();
it
!=
gm
->
lastFace
();
++
it
)
{
std
::
list
<
GEdge
*>
edges
=
(
*
it
)
->
edges
();
fprintf
(
fp
,
"%d %d "
,
(
*
it
)
->
tag
(),
(
int
)
edges
.
size
());
for
(
std
::
list
<
GEdge
*>::
iterator
ite
=
edges
.
begin
();
ite
!=
edges
.
end
();
ite
++
){
fprintf
(
fp
,
"%d "
,
(
*
ite
)
->
tag
());
}
writeMSHPhysicals
(
fp
,
*
it
);
fprintf
(
fp
,
"
\n
"
);
}
for
(
GModel
::
riter
it
=
gm
->
firstRegion
();
it
!=
gm
->
lastRegion
();
++
it
)
{
std
::
list
<
GFace
*>
faces
=
(
*
it
)
->
faces
();
fprintf
(
fp
,
"%d %d "
,
(
*
it
)
->
tag
(),
(
int
)
faces
.
size
());
for
(
std
::
list
<
GFace
*>::
iterator
itf
=
faces
.
begin
();
itf
!=
faces
.
end
();
itf
++
){
fprintf
(
fp
,
"%d "
,
(
*
itf
)
->
tag
());
}
writeMSHPhysicals
(
fp
,
*
it
);
fprintf
(
fp
,
"
\n
"
);
}
fprintf
(
fp
,
"$EndEntities
\n
"
);
}
static
int
getNumElementsMSH
(
GEntity
*
ge
,
bool
saveAll
,
int
saveSinglePartition
)
{
if
(
!
saveAll
&&
ge
->
physicals
.
empty
())
return
0
;
...
...
@@ -578,6 +546,38 @@ static void writeElementsMSH(FILE *fp, GModel *model, GEntity *ge, std::vector<T
}
}
void
writeMSHPeriodicNodes
(
FILE
*
fp
,
std
::
vector
<
GEntity
*>
&
entities
)
{
int
count
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
)
if
(
entities
[
i
]
->
meshMaster
()
!=
entities
[
i
])
count
++
;
if
(
!
count
)
return
;
fprintf
(
fp
,
"$Periodic
\n
"
);
fprintf
(
fp
,
"%d
\n
"
,
count
);
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
){
GEntity
*
g_slave
=
entities
[
i
];
GEntity
*
g_master
=
g_slave
->
meshMaster
();
if
(
g_slave
!=
g_master
){
fprintf
(
fp
,
"%d %d %d
\n
"
,
g_slave
->
dim
(),
g_slave
->
tag
(),
g_master
->
tag
());
if
(
g_slave
->
affineTransform
.
size
()
==
16
)
{
fprintf
(
fp
,
"Affine"
);
for
(
int
i
=
0
;
i
<
16
;
i
++
)
fprintf
(
fp
,
" %.16g"
,
g_slave
->
affineTransform
[
i
]);
fprintf
(
fp
,
"
\n
"
);
}
fprintf
(
fp
,
"%d
\n
"
,
(
int
)
g_slave
->
correspondingVertices
.
size
());
for
(
std
::
map
<
MVertex
*
,
MVertex
*>::
iterator
it
=
g_slave
->
correspondingVertices
.
begin
();
it
!=
g_slave
->
correspondingVertices
.
end
();
it
++
){
MVertex
*
v1
=
it
->
first
;
MVertex
*
v2
=
it
->
second
;
fprintf
(
fp
,
"%d %d
\n
"
,
v1
->
getIndex
(),
v2
->
getIndex
());
}
}
}
fprintf
(
fp
,
"$EndPeriodic
\n
"
);
}
int
GModel
::
writeMSH
(
const
std
::
string
&
name
,
double
version
,
bool
binary
,
bool
saveAll
,
bool
saveParametric
,
double
scalingFactor
,
int
elementStartNum
,
...
...
@@ -637,30 +637,7 @@ int GModel::writeMSH(const std::string &name, double version, bool binary,
fprintf
(
fp
,
"$EndPhysicalNames
\n
"
);
}
// write the topology of the model
writeMSHBrep
(
fp
,
this
);
fprintf
(
fp
,
"$Entities
\n
"
);
std
::
vector
<
GEntity
*>
entitiesWithPhysical
;
if
(
saveAll
)
entitiesWithPhysical
=
entities
;
else
{
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
){
GEntity
*
ge
=
entities
[
i
];
std
::
vector
<
int
>
physicallist
=
ge
->
getPhysicalEntities
();
if
(
physicallist
.
size
())
entitiesWithPhysical
.
push_back
(
ge
);
}
}
fprintf
(
fp
,
"%d
\n
"
,
(
int
)
entitiesWithPhysical
.
size
());
for
(
unsigned
int
i
=
0
;
i
<
entitiesWithPhysical
.
size
();
i
++
){
GEntity
*
ge
=
entitiesWithPhysical
[
i
];
std
::
vector
<
int
>
physicallist
=
ge
->
getPhysicalEntities
();
fprintf
(
fp
,
"%d %d %d"
,
ge
->
tag
(),
ge
->
dim
(),
(
int
)
physicallist
.
size
());
for
(
unsigned
int
j
=
0
;
j
<
physicallist
.
size
();
j
++
)
fprintf
(
fp
,
" %d"
,
physicallist
[
j
]);
fprintf
(
fp
,
"
\n
"
);
}
fprintf
(
fp
,
"$EndEntities
\n
"
);
writeMSHEntities
(
fp
,
this
);
fprintf
(
fp
,
"$Nodes
\n
"
);
fprintf
(
fp
,
"%d
\n
"
,
numVertices
);
...
...
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