InitiateNodeToNodeData
This routine initiates nodeToNode data (mapping) between two domains or parts of domains.
Interface 1
- Interface
- example
- ↢ close
This subroutine generates the node to node connectivity between two meshes
obj%nodeToNode
will be initiateddomain1
main domaindomain2
secondary domaindim1, entitynum1
dimension and entity number of mesh indomain1
dim2, entitynum2
dimension and entity number of mesh indomain2
caution
In this case bounds of nodeToNode
will be from 1 to mesh1%maxNptrs
.
INTERFACE
MODULE SUBROUTINE dc_InitiateNodeToNodeData1(obj, domain1, domain2, &
& dim1, dim2, entityNum1, entityNum2)
CLASS(DomainConnectivity_), INTENT(INOUT) :: obj
!! Domain connectivity object,
!! [[DomainConnectivity:nodeToNode]] will be initiated
CLASS(Domain_), INTENT(IN) :: domain1
!! Primary domain, in nodeToNode(i), i denotes the
!! global node number in domain1 domain.
CLASS(Domain_), INTENT(IN) :: domain2
!! secondary domain, => nodeToNode(i) denotes the
!! global node number in `domain2` domain.
INTEGER(I4B), INTENT(IN) :: dim1
!! dimension of mesh in domain1
INTEGER(I4B), INTENT(IN) :: dim2
!! dimension of mesh in domain2
INTEGER(I4B), INTENT(IN) :: entityNum1
!! entity num of mesh in domain1
INTEGER(I4B), INTENT(IN) :: entityNum2
!! entity num of mesh in domain2
END SUBROUTINE dc_InitiateNodeToNodeData1
END INTERFACE
PROGRAM main
USE GlobalData
USE Test_Method
USE ApproxUtility
USE FEDomainConnectivity_Class
USE FEDomain_Class
USE HDF5File_Class
IMPLICIT NONE
CHARACTER(*), PARAMETER :: domain1_filename = &
"../../Mesh/examples/meshdata/small_tri3_mesh.h5"
CHARACTER(*), PARAMETER :: domain2_filename = &
"../../Mesh/examples/meshdata/small_tri3_mesh.h5"
CHARACTER(*), PARAMETER :: test_name = "InitiateNodeToNodeData test 1"
INTEGER(I4B), PARAMETER :: nsd = 2
TYPE(FEDomainConnectivity_) :: obj
TYPE(FEDomain_) :: domain1, domain2
TYPE(HDF5File_) :: domain1_meshfile, domain2_meshfile
INTEGER(I4B), POINTER :: nodeToNode(:)
REAL(DFP) :: x1(3), x2(3)
INTEGER(I4B) :: ii, tnodes, jj
LOGICAL(LGT) :: isok
CALL domain1_meshfile%Initiate(fileName=domain1_filename, MODE="READ")
CALL domain1_meshfile%OPEN()
CALL domain1%Initiate(domain1_meshfile, "")
CALL domain1_meshfile%DEALLOCATE()
CALL domain2_meshfile%Initiate(fileName=domain2_filename, MODE="READ")
CALL domain2_meshfile%OPEN()
CALL domain2%Initiate(domain2_meshfile, "")
CALL domain2_meshfile%DEALLOCATE()
! node to node mapping
! local node number of domain1 are mapped to global node number of domain2
CALL obj%InitiateNodeToNodeData(domain1=domain1, domain2=domain2)
nodeToNode => obj%GetNodeToNodePointer()
tnodes = domain1%GetTotalNodes()
DO ii = 1, tnodes
CALL domain1%GetNodeCoord(nodecoord=x1, globalNode=ii, islocal=.TRUE.)
jj = nodeToNode(ii)
if(jj .eq. 0) cycle
CALL domain2%GetNodeCoord(nodecoord=x2, globalNode=jj, islocal=.FALSE.)
isok = ALL(x1(1:nsd) .APPROXEQ.x2(1:nsd))
IF (.NOT. isok) THEN
EXIT
END IF
END DO
CALL OK(isok, test_name)
CALL domain1%DEALLOCATE()
CALL domain2%DEALLOCATE()
CALL obj%DEALLOCATE()
END PROGRAM main
Interface 2
- Interface
- example
- ↢ close
INTERFACE
MODULE SUBROUTINE dc_InitiateNodeToNodeData2(obj, domain1, domain2)
CLASS(DomainConnectivity_), INTENT(INOUT) :: obj
!! Domain connectivity object
CLASS(Domain_), INTENT(IN) :: domain1
!! Primary domain, in nodeToNode(i), i denotes the
!! global node number in domain1 domain.
CLASS(Domain_), INTENT(IN) :: domain2
!! Secondary domain => nodeToNode(i) denotes the
!! global node number in domain2 domain.
END SUBROUTINE dc_InitiateNodeToNodeData2
END INTERFACE
PROGRAM main
USE GlobalData
USE Test_Method
USE ApproxUtility
USE FEDomainConnectivity_Class
USE FEDomain_Class
USE HDF5File_Class
IMPLICIT NONE
CHARACTER(*), PARAMETER :: domain1_filename = &
"../../Mesh/examples/meshdata/small_tri3_mesh.h5"
CHARACTER(*), PARAMETER :: domain2_filename = &
"../../Mesh/examples/meshdata/small_tri6_mesh.h5"
CHARACTER(*), PARAMETER :: test_name = "InitiateNodeToNodeData test 2"
INTEGER(I4B), PARAMETER :: nsd = 2
TYPE(FEDomainConnectivity_) :: obj
TYPE(FEDomain_) :: domain1, domain2
TYPE(HDF5File_) :: domain1_meshfile, domain2_meshfile
INTEGER(I4B), POINTER :: nodeToNode(:)
REAL(DFP) :: x1(3), x2(3)
INTEGER(I4B) :: ii, tnodes, jj
LOGICAL(LGT) :: isok
CALL domain1_meshfile%Initiate(fileName=domain1_filename, MODE="READ")
CALL domain1_meshfile%OPEN()
CALL domain1%Initiate(domain1_meshfile, "")
CALL domain1_meshfile%DEALLOCATE()
CALL domain2_meshfile%Initiate(fileName=domain2_filename, MODE="READ")
CALL domain2_meshfile%OPEN()
CALL domain2%Initiate(domain2_meshfile, "")
CALL domain2_meshfile%DEALLOCATE()
! node to node mapping
! local node number of domain1 are mapped to global node number of domain2
CALL obj%InitiateNodeToNodeData(domain1=domain1, domain2=domain2)
nodeToNode => obj%GetNodeToNodePointer()
tnodes = domain1%GetTotalNodes()
DO ii = 1, tnodes
CALL domain1%GetNodeCoord(nodecoord=x1, globalNode=ii, islocal=.TRUE.)
jj = nodeToNode(ii)
IF (jj .EQ. 0) CYCLE
CALL domain2%GetNodeCoord(nodecoord=x2, globalNode=jj, islocal=.FALSE.)
isok = ALL(x1(1:nsd) .APPROXEQ.x2(1:nsd))
IF (.NOT. isok) THEN
EXIT
END IF
END DO
CALL OK(isok, test_name)
CALL domain1%DEALLOCATE()
CALL domain2%DEALLOCATE()
CALL obj%DEALLOCATE()
END PROGRAM main