Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,13 @@
& fieldname="physicalTag", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadVector(hdf5=hdf5, VALUE=obj%boundingEntity, group=dsetname, &
& fieldname="boundingEntity", myname=myname, modname=modname, check=.TRUE.)
& fieldname="boundingEntity", myname=myname, modname=modname, check=.FALSE.)

! If boundingEntity is not initiated then we initiate it with size=0
! Bounding entity will not be initiated for point type
IF (.NOT. ALLOCATED(obj%boundingEntity)) THEN
CALL Reallocate(obj%boundingEntity, 0)
END IF

IF (obj%showTime) THEN
CALL TypeCPUTime%SetEndTime()
Expand Down
174 changes: 78 additions & 96 deletions src/submodules/DynamicMesh/src/DynamicMesh_Class@IOMethods.F90
Original file line number Diff line number Diff line change
Expand Up @@ -43,125 +43,107 @@
& '[START] ')
#endif

CALL obj%DEALLOCATE()

dsetname = TRIM(group)
CALL AbstractMeshImport(obj=obj, hdf5=hdf5, group=group)
IF (obj%tElements .EQ. 0) RETURN
! obj%tElements is read in AbstractMeshImport

CALL HDF5ReadScalar(hdf5=hdf5, VALUE=xidim, group=dsetname, &
& fieldname="xidim", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadScalar(hdf5=hdf5, VALUE=elemType, group=dsetname, &
& fieldname="elemType", myname=myname, modname=modname, check=.TRUE.)

! INFO:
! obj%tElements is read in AbstractMeshImport
IF (obj%tElements .EQ. 0) RETURN

CALL HDF5ReadVector(hdf5=hdf5, VALUE=elemNumber, group=dsetname, &
& fieldname="elemNumber", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadMatrix(hdf5=hdf5, VALUE=connectivity, group=dsetname, &
& fieldname="connectivity", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadVector(hdf5=hdf5, VALUE=internalNptrs, group=dsetname, &
& fieldname="intNodeNumber", myname=myname, modname=modname, check=.TRUE.)

isok = (elemType .EQ. Point1) .OR. (elemType .EQ. 0)

IF (isok) RETURN

CALL obj%elementDataList%Initiate()
CALL obj%nodeDataBinaryTree%Initiate()
CALL obj%nodeDataList%Initiate()
CALL obj%elementDataBinaryTree%Initiate()

DO ii = 1, obj%tElements

elemdata_ptr => ElemData_Pointer()
CALL ElemDataSet(obj=elemdata_ptr, globalElemNum=elemNumber(ii), &
& localElemNum=ii, globalNodes=connectivity(:, ii))
CALL obj%elementDataList%Add(elemdata_ptr)
CALL obj%elementDataBinaryTree%Insert(elemdata_ptr)

DO jj = 1, SIZE(connectivity, 1)

nodedata_ptr => NodeData_Pointer()
CALL NodeDataSet(obj=nodedata_ptr, globalNodeNum=connectivity(jj, ii), &
& nodeType=TypeNode%boundary)
! TypeNode is defined in NodeData_Class
! The above step is unusual, but we know the position of
! internal nptrs, so later we will set the
! those nodes as INTERNAL_NODE, in this way we can
! identify the boundary nodes

tsize1 = obj%nodeDataBinaryTree%SIZE()
CALL obj%nodeDataBinaryTree%Insert(nodedata_ptr)
tsize2 = obj%nodeDataBinaryTree%SIZE()

IF (tsize1 .EQ. tsize2) THEN
CALL NodeData_Deallocate(nodedata_ptr)
! NOTE:
!! We have not added nodedata_ptr,
!! We know this because tsize1 == tsize2so
!! so we should remove this memory
!! this step is necessary for avoiding the memory leak
DEALLOCATE (nodedata_ptr)
ELSE
CALL obj%nodeDataList%Add(nodedata_ptr)
END IF

END DO
! DO ii = 1, obj%tElements

END DO
! elemdata_ptr => obj%elementData(ii)

CALL obj%nodeDataBinaryTree%SetID()
!! This method will set the local node number in the binarytree

CALL obj%elementDataBinaryTree%SetID()
!! This method will set the local element number in the binarytree

obj%tNodes = obj%nodeDataBinaryTree%SIZE()
!! This method returns the total number of nodes in mesh
! CALL ElemDataSet(obj=elemdata_ptr, globalElemNum=elemNumber(ii), &
! & localElemNum=ii, globalNodes=connectivity(:, ii))
!
! CALL obj%elementDataList%Add(elemdata_ptr)
! CALL obj%elementDataBinaryTree%Insert(elemdata_ptr)

nodedata_ptr => obj%nodeDataBinaryTree%GetMinPointer()
obj%minNptrs = nodedata_ptr%globalNodeNum
! DO jj = 1, SIZE(connectivity, 1)
!
! nodedata_ptr => NodeData_Pointer()
! CALL NodeDataSet(obj=nodedata_ptr, globalNodeNum=connectivity(jj, ii), &
! & nodeType=TypeNode%boundary)
! ! TypeNode is defined in NodeData_Class
! ! The above step is unusual, but we know the position of
! ! internal nptrs, so later we will set the
! ! those nodes as INTERNAL_NODE, in this way we can
! ! identify the boundary nodes
!
! tsize1 = obj%nodeDataBinaryTree%SIZE()
! CALL obj%nodeDataBinaryTree%Insert(nodedata_ptr)
! tsize2 = obj%nodeDataBinaryTree%SIZE()
!
! IF (tsize1 .EQ. tsize2) THEN
! CALL NodeData_Deallocate(nodedata_ptr)
! ! NOTE:
! !! We have not added nodedata_ptr,
! !! We know this because tsize1 == tsize2so
! !! so we should remove this memory
! !! this step is necessary for avoiding the memory leak
! DEALLOCATE (nodedata_ptr)
! ELSE
! CALL obj%nodeDataList%Add(nodedata_ptr)
! END IF
!
! END DO

nodedata_ptr => obj%nodeDataBinaryTree%GetMaxPointer()
obj%maxNptrs = nodedata_ptr%globalNodeNum
! END DO

nodedata_ptr => NULL()
CALL Reallocate(obj%local_Nptrs, obj%maxNptrs)

DO CONCURRENT(ii=1:obj%tElements)
obj%local_Nptrs(connectivity(:, ii)) = connectivity(:, ii)
END DO

! TODO: Parallel
DO ii = 1, obj%maxNptrs
IF (obj%local_Nptrs(ii) .NE. 0) THEN
nodedata%globalNodeNum = ii
nodedata_ptr => obj%nodeDataBinaryTree%GetValuePointer(VALUE=nodedata)
obj%local_Nptrs(ii) = nodedata_ptr%localNodeNum
END IF
END DO

! TODO: Parallel
DO ii = 1, SIZE(internalNptrs)
! jj = internalNptrs(ii)
! CALL NodeDataSet(obj=nodedata, globalNodeNum=jj)
nodedata%globalNodeNum = internalNptrs(ii)
nodedata_ptr => obj%nodeDataBinaryTree%GetValuePointer(VALUE=nodedata)
nodedata_ptr%nodeType = TypeNode%internal
! CALL NodeDataSet(obj=nodedata_ptr, nodeType=TypeNode%internal)
END DO
! CALL obj%nodeDataBinaryTree%SetID()
! !! This method will set the local node number in the binarytree
!
! CALL obj%elementDataBinaryTree%SetID()
! !! This method will set the local element number in the binarytree
!
! obj%tNodes = obj%nodeDataBinaryTree%SIZE()
! !! This method returns the total number of nodes in mesh
!
! nodedata_ptr => obj%nodeDataBinaryTree%GetMinPointer()
! obj%minNptrs = nodedata_ptr%globalNodeNum
!
! nodedata_ptr => obj%nodeDataBinaryTree%GetMaxPointer()
! obj%maxNptrs = nodedata_ptr%globalNodeNum
!
! nodedata_ptr => NULL()
! CALL Reallocate(obj%local_Nptrs, obj%maxNptrs)
!
! DO CONCURRENT(ii=1:obj%tElements)
! obj%local_Nptrs(connectivity(:, ii)) = connectivity(:, ii)
! END DO
!
! ! TODO: Parallel
! DO ii = 1, obj%maxNptrs
! IF (obj%local_Nptrs(ii) .NE. 0) THEN
! nodedata%globalNodeNum = ii
! nodedata_ptr => obj%nodeDataBinaryTree%GetValuePointer(VALUE=nodedata)
! obj%local_Nptrs(ii) = nodedata_ptr%localNodeNum
! END IF
! END DO
!
! ! TODO: Parallel
! DO ii = 1, SIZE(internalNptrs)
! ! jj = internalNptrs(ii)
! ! CALL NodeDataSet(obj=nodedata, globalNodeNum=jj)
! nodedata%globalNodeNum = internalNptrs(ii)
! nodedata_ptr => obj%nodeDataBinaryTree%GetValuePointer(VALUE=nodedata)
! nodedata_ptr%nodeType = TypeNode%internal
! ! CALL NodeDataSet(obj=nodedata_ptr, nodeType=TypeNode%internal)
! END DO

nodedata_ptr => NULL()

IF (ALLOCATED(elemNumber)) DEALLOCATE (elemNumber)
IF (ALLOCATED(connectivity)) DEALLOCATE (connectivity)
IF (ALLOCATED(internalNptrs)) DEALLOCATE (internalNptrs)

#ifdef DEBUG_VER
CALL e%RaiseInformation(modName//'::'//myName//' - '// &
& '[END] ')
Expand Down
91 changes: 5 additions & 86 deletions src/submodules/Mesh/src/Mesh_Class@IOMethods.F90
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,14 @@

MODULE PROCEDURE obj_Import
CHARACTER(*), PARAMETER :: myName = "obj_Import()"
INTEGER(I4B), ALLOCATABLE :: connectivity(:, :), elemNumber(:), &
& internalNptrs(:)
CHARACTER(:), ALLOCATABLE :: dsetname
INTEGER(I4B) :: ii, dummy, jj
LOGICAL(LGT) :: isok, abool
LOGICAL(LGT) :: isok

#ifdef DEBUG_VER
CALL e%RaiseInformation(modName//'::'//myName//' - '// &
& '[START] ')
#endif

CALL obj%DEALLOCATE()

dsetname = TRIM(group)
CALL AbstractMeshImport(obj=obj, hdf5=hdf5, group=group)

Expand All @@ -73,90 +68,14 @@
CALL HDF5ReadScalar(hdf5=hdf5, VALUE=obj%elemType, group=dsetname, &
& fieldname="elemType", myname=myname, modname=modname, check=.TRUE.)

IF (obj%tElements .NE. 0) THEN
ALLOCATE (obj%elementData(obj%tElements))
END IF

CALL HDF5ReadVector(hdf5=hdf5, VALUE=elemNumber, group=dsetname, &
& fieldname="elemNumber", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadMatrix(hdf5=hdf5, VALUE=connectivity, group=dsetname, &
& fieldname="connectivity", myname=myname, modname=modname, check=.TRUE.)

CALL HDF5ReadVector(hdf5=hdf5, VALUE=internalNptrs, group=dsetname, &
& fieldname="intNodeNumber", myname=myname, modname=modname, check=.TRUE.)

DO CONCURRENT(ii=1:obj%tElements)
obj%elementData(ii)%globalElemNum = elemNumber(ii)
obj%elementData(ii)%localElemNum = ii
END DO

isok = (obj%elemType .EQ. Point1) .OR. (obj%elemType .EQ. 0)

IF (isok) THEN
obj%tNodes = 1
ALLOCATE (obj%nodeData(obj%tNodes))
obj%nodeData(1)%localNodeNum = 1
obj%nodeData(1)%globalNodeNum = internalNptrs(1)
obj%nodeData(1)%nodeType = INTERNAL_NODE

IF (ALLOCATED(elemNumber)) DEALLOCATE (elemNumber)
IF (ALLOCATED(connectivity)) DEALLOCATE (connectivity)
IF (ALLOCATED(internalNptrs)) DEALLOCATE (internalNptrs)

#ifdef DEBUG_VER
CALL e%RaiseInformation(modName//'::'//myName//' - '// &
& '[END] ')
#endif

RETURN
END IF

obj%maxNptrs = MAXVAL(connectivity)
obj%minNptrs = MINVAL(connectivity)
CALL Reallocate(obj%local_Nptrs, obj%maxNptrs)
obj%refelem => ReferenceElement_Pointer(xidim=obj%xidim, &
& nsd=obj%nsd, elemType=obj%elemType, ipType=Equidistance)

DO CONCURRENT(ii=1:obj%tElements)
obj%elementData(ii)%globalNodes = connectivity(:, ii)
obj%local_Nptrs(connectivity(:, ii)) = connectivity(:, ii)
END DO

obj%tNodes = COUNT(obj%local_Nptrs .NE. 0)
ALLOCATE (obj%nodeData(obj%tNodes))
dummy = 0

DO ii = 1, obj%maxNptrs
IF (obj%local_Nptrs(ii) .NE. 0) THEN
dummy = dummy + 1
obj%nodeData(dummy)%globalNodeNum = obj%local_Nptrs(ii)
obj%nodeData(dummy)%localNodeNum = dummy
obj%nodeData(dummy)%nodeType = BOUNDARY_NODE
! The above step is unusual, but we know the position of
! internal nptrs, so later we will set the
! those nodes as INTERNAL_NODE, in this way we can
! identify the boundary nodes
obj%local_Nptrs(ii) = dummy
END IF
END DO

DO ii = 1, SIZE(internalNptrs)
jj = obj%GetLocalNodeNumber(internalNptrs(ii))
obj%nodeData(jj)%globalNodeNum = internalNptrs(ii)
obj%nodeData(jj)%nodeType = INTERNAL_NODE
END DO

isok = obj%tElements .GT. 0
abool = obj%xidim .GT. 0
isok = obj%xidim .GT. 0
IF (isok) THEN
obj%refelem => ReferenceElement_Pointer(xidim=obj%xidim, &
& nsd=obj%nsd, elemType=obj%elemType, ipType=Equidistance)
IF (abool) obj%facetElements = FacetElements(obj%refelem)
obj%facetElements = FacetElements(obj%refelem)
END IF

IF (ALLOCATED(elemNumber)) DEALLOCATE (elemNumber)
IF (ALLOCATED(connectivity)) DEALLOCATE (connectivity)
IF (ALLOCATED(internalNptrs)) DEALLOCATE (internalNptrs)

#ifdef DEBUG_VER
CALL e%RaiseInformation(modName//'::'//myName//' - '// &
& '[END] ')
Expand Down