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 CASE(self%dimen)
CASE(3)
!Edges are triangles, type 5 in VTK
numEdges = COUNT(types==5)
CASE(2)
!Edges are segments, type 3 in VTK
numEdges = COUNT(types==3)
CASE(1)
!Edges are nodes, type 1 in VTK
numEdges = COUNT(types==1)
END SELECT
self%numCells = numElements - numEdges
SELECT TYPE(self) SELECT TYPE(self)
TYPE IS(meshParticles) TYPE IS(meshParticles)
SELECT CASE(self%dimen)
CASE(3)
!Edges are triangles, type 5 in VTK
self%numEdges = COUNT(types==5)
CASE(2) self%numEdges = numEdges
!Edges are segments, type 3 in VTK
self%numEdges = COUNT(types==3)
CASE(1)
!Edges are nodes, type 1 in VTK
self%numEdges = COUNT(types==1)
END SELECT
self%numCells = numElements - self%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,112 +398,98 @@ 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(self%geometry) SELECT CASE(types(n))
CASE("Cyl") CASE(5)
SELECT CASE(types(n)) !Triangular element
CASE(5) c = c + 1
!Triangular element
c = c + 1 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))
!Allocate cell
SELECT CASE(self%geometry)
CASE("Cyl")
ALLOCATE(meshCell2DCylTria:: self%cells(c)%obj) ALLOCATE(meshCell2DCylTria:: self%cells(c)%obj)
CALL self%cells(c)%obj%init(c, p, self%nodes) CASE("Cart")
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")
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)
CALL self%cells(c)%obj%init(c, p, self%nodes) END SELECT
DEALLOCATE(p)
CASE(9) !Init cell
!Quadrilateral element CALL self%cells(c)%obj%init(c, p, self%nodes)
c = c + 1 DEALLOCATE(p)
ALLOCATE(p(1:4))
p(1) = connectivity(offsets(n) - 3) CASE(9)
p(2) = connectivity(offsets(n) - 2) !Quadrilateral element
p(3) = connectivity(offsets(n) - 1) c = c + 1
p(4) = connectivity(offsets(n))
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 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)
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT END SELECT
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT END SELECT
CASE(1) CASE(1)
SELECT CASE(self%geometry) SELECT CASE(types(n))
CASE("Rad") CASE(3)
SELECT CASE(types(n)) !Segment element
CASE(3) c = c + 1
!Segment element
c = c + 1 ALLOCATE(p(1:2))
ALLOCATE(p(1:2)) p(1) = connectivity(offsets(n) - 1)
p(1) = connectivity(offsets(n) - 1) p(2) = connectivity(offsets(n))
p(2) = connectivity(offsets(n))
!Allocate cell
SELECT CASE(self%geometry)
CASE("Rad")
ALLOCATE(meshCell1DRadSegm:: self%cells(c)%obj) ALLOCATE(meshCell1DRadSegm:: self%cells(c)%obj)
CALL self%cells(c)%obj%init(c, p, self%nodes) CASE("Cart")
DEALLOCATE(p)
END SELECT
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)
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT END SELECT
!Init cell
CALL self%cells(c)%obj%init(c, p, self%nodes)
DEALLOCATE(p)
END SELECT END SELECT
END SELECT END SELECT