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%nodeToNodewill be initiateddomain1main domaindomain2secondary domaindim1, entitynum1dimension and entity number of mesh indomain1dim2, entitynum2dimension 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