Improvement to vtu read subroutine

Some improvements to reduce code repetition when reading vtu mesh.
This commit is contained in:
Jorge Gonzalez 2023-02-06 19:18:04 +01:00
commit a22099ee87

View file

@ -169,7 +169,7 @@ MODULE moduleMeshInputVTU
REAL(8):: r(1:3) !3 generic coordinates REAL(8):: r(1:3) !3 generic coordinates
INTEGER:: fileID, error, found INTEGER:: fileID, error, found
CHARACTER(LEN=256):: line CHARACTER(LEN=256):: line
INTEGER:: numNodes, numElements INTEGER:: numNodes, numElements, numEdges
INTEGER, ALLOCATABLE, DIMENSION(:):: entitiesID, offsets, connectivity, types INTEGER, ALLOCATABLE, DIMENSION(:):: entitiesID, offsets, connectivity, types
REAL(8), ALLOCATABLE, DIMENSION(:):: coordinates REAL(8), ALLOCATABLE, DIMENSION(:):: coordinates
INTEGER:: n, e, c INTEGER:: n, e, c
@ -223,6 +223,7 @@ MODULE moduleMeshInputVTU
!All relevant information from the .vtu file has been read. Time to build the mesh. !All relevant information from the .vtu file has been read. Time to build the mesh.
self%numNodes = numNodes self%numNodes = numNodes
ALLOCATE(self%nodes(1:self%numNodes)) ALLOCATE(self%nodes(1:self%numNodes))
SELECT TYPE(self) SELECT TYPE(self)
TYPE IS(meshParticles) TYPE IS(meshParticles)
ALLOCATE(self%K(1:self%numNodes, 1:self%numNodes)) ALLOCATE(self%K(1:self%numNodes, 1:self%numNodes))
@ -238,6 +239,7 @@ MODULE moduleMeshInputVTU
r(2) = coordinates(3*(n-1)+2) r(2) = coordinates(3*(n-1)+2)
r(3) = coordinates(3*(n-1)+3) r(3) = coordinates(3*(n-1)+3)
!Allocate node
SELECT CASE(self%dimen) SELECT CASE(self%dimen)
CASE(3) CASE(3)
ALLOCATE(meshNode3Dcart::self%nodes(n)%obj) ALLOCATE(meshNode3Dcart::self%nodes(n)%obj)
@ -266,41 +268,44 @@ MODULE moduleMeshInputVTU
r(2:3) = 0.D0 r(2:3) = 0.D0
END SELECT END SELECT
!Init node
CALL self%nodes(n)%obj%init(n, r) CALL self%nodes(n)%obj%init(n, r)
END DO END DO
!Count the number of edges !Count the number of edges
SELECT TYPE(self)
TYPE IS(meshParticles)
SELECT CASE(self%dimen) SELECT CASE(self%dimen)
CASE(3) CASE(3)
!Edges are triangles, type 5 in VTK !Edges are triangles, type 5 in VTK
self%numEdges = COUNT(types==5) numEdges = COUNT(types==5)
CASE(2) CASE(2)
!Edges are segments, type 3 in VTK !Edges are segments, type 3 in VTK
self%numEdges = COUNT(types==3) numEdges = COUNT(types==3)
CASE(1) CASE(1)
!Edges are nodes, type 1 in VTK !Edges are nodes, type 1 in VTK
self%numEdges = COUNT(types==1) numEdges = COUNT(types==1)
END SELECT END SELECT
self%numCells = numElements - self%numEdges self%numCells = numElements - numEdges
SELECT TYPE(self)
TYPE IS(meshParticles)
self%numEdges = numEdges
!Allocate array of edges !Allocate array of edges
ALLOCATE(self%edges(1:self%numEdges)) ALLOCATE(self%edges(1:self%numEdges))
TYPE IS(meshCollisions)
self%numCells = numElements
END SELECT END SELECT
!Allocates array of cells !Allocates array of cells
ALLOCATE(self%cells(1:self%numCells)) ALLOCATE(self%cells(1:self%numCells))
!Read edges !Read edges only if mesh is for tracking particles, not for collisions
e = 0 e = 0
SELECT TYPE(self) SELECT TYPE(self)
TYPE IS(meshParticles) TYPE IS(meshParticles)
@ -309,9 +314,8 @@ MODULE moduleMeshInputVTU
CASE(3) CASE(3)
IF (types(n) == 5) THEN IF (types(n) == 5) THEN
e = e + 1 e = e + 1
ALLOCATE(meshEdge3DCartTria:: self%edges(e)%obj)
ALLOCATE(p(1:3))
ALLOCATE(p(1:3))
p(1) = connectivity(offsets(n) - 2) p(1) = connectivity(offsets(n) - 2)
p(2) = connectivity(offsets(n) - 1) p(2) = connectivity(offsets(n) - 1)
p(3) = connectivity(offsets(n)) p(3) = connectivity(offsets(n))
@ -320,6 +324,9 @@ MODULE moduleMeshInputVTU
bt = getBoundaryId(entitiesID(n)) bt = getBoundaryId(entitiesID(n))
!Allocate edge !Allocate edge
ALLOCATE(meshEdge3DCartTria:: self%edges(e)%obj)
!Init edge
CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n)) CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n))
DEALLOCATE(p) DEALLOCATE(p)
@ -335,6 +342,7 @@ MODULE moduleMeshInputVTU
!Associate boundary condition procedure. !Associate boundary condition procedure.
bt = getBoundaryId(entitiesID(n)) bt = getBoundaryId(entitiesID(n))
!Allocate edge
SELECT CASE(self%geometry) SELECT CASE(self%geometry)
CASE("Cyl") CASE("Cyl")
ALLOCATE(meshEdge2DCyl:: self%edges(e)%obj) ALLOCATE(meshEdge2DCyl:: self%edges(e)%obj)
@ -344,7 +352,7 @@ MODULE moduleMeshInputVTU
END SELECT END SELECT
!Allocate edge !Init edge
CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n)) CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n))
DEALLOCATE(p) DEALLOCATE(p)
@ -358,6 +366,8 @@ MODULE moduleMeshInputVTU
!Associate boundary condition procedure. !Associate boundary condition procedure.
bt = getBoundaryId(entitiesID(n)) bt = getBoundaryId(entitiesID(n))
!Allocate edge
SELECT CASE(self%geometry) SELECT CASE(self%geometry)
CASE("Rad") CASE("Rad")
ALLOCATE(meshEdge1DRad:: self%edges(e)%obj) ALLOCATE(meshEdge1DRad:: self%edges(e)%obj)
@ -367,6 +377,7 @@ MODULE moduleMeshInputVTU
END SELECT END SELECT
!Init edge
CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n)) CALL self%edges(e)%obj%init(n, p, bt, entitiesID(n))
DEALLOCATE(p) DEALLOCATE(p)
@ -387,107 +398,95 @@ MODULE moduleMeshInputVTU
CASE(10) CASE(10)
!Thetraedron !Thetraedron
c = c + 1 c = c + 1
ALLOCATE(p(1:4)) ALLOCATE(p(1:4))
p(1) = connectivity(offsets(n) - 3) p(1) = connectivity(offsets(n) - 3)
p(2) = connectivity(offsets(n) - 2) p(2) = connectivity(offsets(n) - 2)
p(3) = connectivity(offsets(n) - 1) p(3) = connectivity(offsets(n) - 1)
p(4) = connectivity(offsets(n)) p(4) = connectivity(offsets(n))
!Allocate cell
ALLOCATE(meshCell3DCartTetra:: self%cells(c)%obj) ALLOCATE(meshCell3DCartTetra:: self%cells(c)%obj)
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes) CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p) DEALLOCATE(p)
END SELECT END SELECT
CASE(2) CASE(2)
SELECT CASE(types(n))
CASE(5)
!Triangular element
c = c + 1
ALLOCATE(p(1:3))
p(1) = connectivity(offsets(n) - 2)
p(2) = connectivity(offsets(n) - 1)
p(3) = connectivity(offsets(n))
!Allocate cell
SELECT CASE(self%geometry) SELECT CASE(self%geometry)
CASE("Cyl") CASE("Cyl")
SELECT CASE(types(n))
CASE(5)
!Triangular element
c = c + 1
ALLOCATE(p(1:3))
p(1) = connectivity(offsets(n) - 2)
p(2) = connectivity(offsets(n) - 1)
p(3) = connectivity(offsets(n))
ALLOCATE(meshCell2DCylTria:: self%cells(c)%obj) ALLOCATE(meshCell2DCylTria:: self%cells(c)%obj)
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
CASE(9)
!Quadrilateral element
c = c + 1
ALLOCATE(p(1:4))
p(1) = connectivity(offsets(n) - 3)
p(2) = connectivity(offsets(n) - 2)
p(3) = connectivity(offsets(n) - 1)
p(4) = connectivity(offsets(n))
ALLOCATE(meshCell2DCylQuad:: self%cells(c)%obj)
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT
CASE("Cart") CASE("Cart")
SELECT CASE(types(n))
CASE(5)
!Triangular element
c = c + 1
ALLOCATE(p(1:3))
p(1) = connectivity(offsets(n) - 2)
p(2) = connectivity(offsets(n) - 1)
p(3) = connectivity(offsets(n))
ALLOCATE(meshCell2DCartTria:: self%cells(c)%obj) ALLOCATE(meshCell2DCartTria:: self%cells(c)%obj)
END SELECT
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes) CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p) DEALLOCATE(p)
CASE(9) CASE(9)
!Quadrilateral element !Quadrilateral element
c = c + 1 c = c + 1
ALLOCATE(p(1:4)) ALLOCATE(p(1:4))
p(1) = connectivity(offsets(n) - 3) p(1) = connectivity(offsets(n) - 3)
p(2) = connectivity(offsets(n) - 2) p(2) = connectivity(offsets(n) - 2)
p(3) = connectivity(offsets(n) - 1) p(3) = connectivity(offsets(n) - 1)
p(4) = connectivity(offsets(n)) p(4) = connectivity(offsets(n))
!Allocate cell
SELECT CASE(self%geometry)
CASE("Cyl")
ALLOCATE(meshCell2DCylQuad:: self%cells(c)%obj)
CASE("Cart")
ALLOCATE(meshCell2DCartQuad:: self%cells(c)%obj) ALLOCATE(meshCell2DCartQuad:: self%cells(c)%obj)
END SELECT
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes) CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p) DEALLOCATE(p)
END SELECT
END SELECT END SELECT
CASE(1) CASE(1)
SELECT CASE(types(n))
CASE(3)
!Segment element
c = c + 1
ALLOCATE(p(1:2))
p(1) = connectivity(offsets(n) - 1)
p(2) = connectivity(offsets(n))
!Allocate cell
SELECT CASE(self%geometry) SELECT CASE(self%geometry)
CASE("Rad") CASE("Rad")
SELECT CASE(types(n))
CASE(3)
!Segment element
c = c + 1
ALLOCATE(p(1:2))
p(1) = connectivity(offsets(n) - 1)
p(2) = connectivity(offsets(n))
ALLOCATE(meshCell1DRadSegm:: self%cells(c)%obj) ALLOCATE(meshCell1DRadSegm:: self%cells(c)%obj)
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT
CASE("Cart") CASE("Cart")
SELECT CASE(types(n))
CASE(3)
!Segment element
c = c + 1
ALLOCATE(p(1:2))
p(1) = connectivity(offsets(n) - 1)
p(2) = connectivity(offsets(n))
ALLOCATE(meshCell1DCartSegm:: self%cells(c)%obj) ALLOCATE(meshCell1DCartSegm:: self%cells(c)%obj)
END SELECT
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes) CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p) DEALLOCATE(p)
@ -495,8 +494,6 @@ MODULE moduleMeshInputVTU
END SELECT END SELECT
END SELECT
END DO END DO
!Call mesh connectivity !Call mesh connectivity