Skip to content

Commit

Permalink
Merging pull request OpenCMISS#183 plus fixes for the comments in the…
Browse files Browse the repository at this point in the history
… pull request
  • Loading branch information
chrispbradley committed Mar 11, 2014
1 parent e5c9778 commit 4c39b15
Show file tree
Hide file tree
Showing 3 changed files with 111 additions and 95 deletions.
66 changes: 37 additions & 29 deletions src/mesh_routines.f90
Expand Up @@ -161,7 +161,7 @@ MODULE MESH_ROUTINES

PUBLIC MESH_TOPOLOGY_ELEMENTS_ELEMENT_USER_NUMBER_GET,MESH_TOPOLOGY_ELEMENTS_ELEMENT_USER_NUMBER_SET

PUBLIC Mesh_TopologyElementsAllUserNumbersSet
PUBLIC Mesh_TopologyElementsUserNumbersAllSet

PUBLIC Mesh_TopologyDataPointsCalculateProjection

Expand Down Expand Up @@ -8336,59 +8336,67 @@ END SUBROUTINE MESH_TOPOLOGY_ELEMENTS_ELEMENT_USER_NUMBER_SET
!

!>Changes/sets the user numbers for all elements.
SUBROUTINE Mesh_TopologyElementsAllUserNumbersSet(elements,userNumbers,err,error,*)
SUBROUTINE Mesh_TopologyElementsUserNumbersAllSet(elements,userNumbers,err,error,*)

!Argument variables
TYPE(MeshComponentElementsType), POINTER :: elements !<A pointer to the elements to set the user number for \todo This should be the first parameter.
TYPE(MeshComponentElementsType), POINTER :: elements !<A pointer to the elements to set all the user numbers for
INTEGER(INTG), INTENT(IN) :: userNumbers(:) !<The user numbers to set
INTEGER(INTG), INTENT(OUT) :: err !<The error code
TYPE(VARYING_STRING), INTENT(OUT) :: error !<The error string
!Local Variables
INTEGER(INTG) :: elementIdx,insertStatus
! TYPE(VARYING_STRING) :: localError
TYPE(TREE_TYPE), POINTER :: newElementsTree
TYPE(VARYING_STRING) :: localError

NULLIFY(newElementsTree)

CALL ENTERS("Mesh_TopologyElementsAllUserNumbersSet",err,error,*999)
CALL Enters("Mesh_TopologyElementsUserNumbersAllSet",err,error,*999)

IF(ASSOCIATED(elements)) THEN
IF(elements%ELEMENTS_FINISHED) THEN
CALL FLAG_ERROR("Elements have been finished.",err,error,*999)
CALL FlagError("Elements have been finished.",err,error,*999)
ELSE
IF(elements%NUMBER_OF_ELEMENTS==SIZE(userNumbers,1)) THEN
CALL TREE_DESTROY(elements%ELEMENTS_TREE,err,error,*999)
CALL TREE_CREATE_START(elements%ELEMENTS_TREE,err,error,*999)
CALL TREE_INSERT_TYPE_SET(elements%ELEMENTS_TREE,TREE_NO_DUPLICATES_ALLOWED,err,error,*999)
CALL TREE_CREATE_FINISH(elements%ELEMENTS_TREE,err,error,*999)
!Check the users numbers to ensure that there are no duplicates
CALL TREE_CREATE_START(newElementsTree,err,error,*999)
CALL TREE_INSERT_TYPE_SET(newElementsTree,TREE_NO_DUPLICATES_ALLOWED,err,error,*999)
CALL TREE_CREATE_FINISH(newElementsTree,err,error,*999)
DO elementIdx=1,elements%NUMBER_OF_ELEMENTS
IF(userNumbers(elementIdx)>0) THEN
elements%ELEMENTS(elementIdx)%GLOBAL_NUMBER=elementIdx
elements%ELEMENTS(elementIdx)%USER_NUMBER=userNumbers(elementIdx)
CALL TREE_ITEM_INSERT(elements%ELEMENTS_TREE,userNumbers(elementIdx),elementIdx,insertStatus,err,error,*999)
!\todo: constant for successful/unsuccessful tree insert status
! IF(insertStatus/=TREE_ELEMENT_INSERT_SUCESSFUL) THEN
! localError="The user number for global element of "//TRIM(NUMBER_TO_VSTRING(elementIdx,"*",err,error))// &
! & " is duplicated. The user element numbers must be unique."
! CALL FLAG_ERROR(localError,err,error,*999)
! ENDIF
elements%ELEMENTS(elementIdx)%USER_NUMBER=userNumbers(elementIdx)
ELSE
CALL FLAG_ERROR("User element numbers cannot be negative.",err,error,*999)
CALL TREE_ITEM_INSERT(newElementsTree,userNumbers(elementIdx),elementIdx,insertStatus,err,error,*999)
IF(insertStatus/=TREE_NODE_INSERT_SUCESSFUL) THEN
localError="The specified user number of "//TRIM(NumberToVstring(userNumbers(elementIdx),"*",err,error))// &
& " for global element number "//TRIM(NUMBER_TO_VSTRING(elementIdx,"*",err,error))// &
& " is a duplicate. The user element numbers must be unique."
CALL FlagError(localError,err,error,*999)
ENDIF
ENDDO !elementIdx
CALL TREE_DESTROY(elements%ELEMENTS_TREE,err,error,*999)
elements%ELEMENTS_TREE=newElementsTree
NULLIFY(newElementsTree)
DO elementIdx=1,elements%NUMBER_OF_ELEMENTS
elements%ELEMENTS(elementIdx)%GLOBAL_NUMBER=elementIdx
elements%ELEMENTS(elementIdx)%USER_NUMBER=userNumbers(elementIdx)
ENDDO !elementIdx
ELSE
CALL FLAG_ERROR("Number of element user numbers input does not match number of elements.",err,error,*999)
localError="The number of specified element user numbers ("// &
TRIM(NumberToVstring(SIZE(userNumbers,1),"*",err,error))// &
") does not match number of elements ("// &
TRIM(NumberToVstring(elements%NUMBER_OF_ELEMENTS,"*",err,error))//")."
CALL FlagError(localError,err,error,*999)
ENDIF
ENDIF
ELSE
CALL FLAG_ERROR("Elements is not associated.",err,error,*999)
CALL FlagError("Elements is not associated.",err,error,*999)
ENDIF

CALL EXITS("Mesh_TopologyElementsAllUserNumbersSet")
CALL Exits("Mesh_TopologyElementsUserNumbersAllSet")
RETURN
999 CALL ERRORS("Mesh_TopologyElementsAllUserNumbersSet",err,error)
CALL EXITS("Mesh_TopologyElementsAllUserNumbersSet")
999 IF(ASSOCIATED(newElementsTree)) CALL TREE_DESTROY(newElementsTree,err,error,*998)
998 CALL Errors("Mesh_TopologyElementsUserNumbersAllSet",err,error)
CALL Exits("Mesh_TopologyElementsUserNumbersAllSet")
RETURN 1

END SUBROUTINE Mesh_TopologyElementsAllUserNumbersSet
END SUBROUTINE Mesh_TopologyElementsUserNumbersAllSet

!
!================================================================================================================================
Expand Down
66 changes: 37 additions & 29 deletions src/node_routines.f90
Expand Up @@ -98,7 +98,7 @@ MODULE NODE_ROUTINES

PUBLIC NODES_USER_NUMBER_GET,NODES_USER_NUMBER_SET

PUBLIC Nodes_AllUserNumbersSet
PUBLIC Nodes_UserNumbersAllSet

!PUBLIC NODES_NUMBER_OF_VERSIONS_SET

Expand Down Expand Up @@ -857,8 +857,8 @@ END SUBROUTINE NODES_USER_NUMBER_SET
!================================================================================================================================
!

!>Changes/sets the user numbers for all nodes. \see OPENCMISS::CMISSNodes_AllUserNumbersSet
SUBROUTINE Nodes_AllUserNumbersSet(nodes,userNumbers,err,error,*)
!>Changes/sets the user numbers for all nodes. \see OPENCMISS::CMISSNodes_UserNumbersAllSet
SUBROUTINE Nodes_UserNumbersAllSet(nodes,userNumbers,err,error,*)

!Argument variables
TYPE(NODES_TYPE), POINTER :: nodes !<A pointer to the nodes to set the numbers for
Expand All @@ -867,51 +867,59 @@ SUBROUTINE Nodes_AllUserNumbersSet(nodes,userNumbers,err,error,*)
TYPE(VARYING_STRING), INTENT(OUT) :: error !<The error string
!Local Variables
INTEGER(INTG) :: nodeIdx,insertStatus
TYPE(TREE_TYPE), POINTER :: newNodesTree
TYPE(VARYING_STRING) :: localError

NULLIFY(newNodesTree)

CALL ENTERS("Nodes_AllUserNumbersSet",err,error,*999)
CALL ENTERS("Nodes_UserNumbersAllSet",err,error,*999)

IF(ASSOCIATED(nodes)) THEN
IF(nodes%NODES_FINISHED) THEN
CALL FLAG_ERROR("Nodes have been finished.",err,error,*999)
CALL FlagError("Nodes have been finished.",err,error,*999)
ELSE
IF(nodes%NUMBER_OF_NODES==SIZE(userNumbers,1)) THEN
CALL TREE_DESTROY(nodes%NODES_TREE,err,error,*999)
CALL TREE_CREATE_START(nodes%NODES_TREE,err,error,*999)
CALL TREE_INSERT_TYPE_SET(nodes%NODES_TREE,TREE_NO_DUPLICATES_ALLOWED,err,error,*999)
CALL TREE_CREATE_FINISH(nodes%NODES_TREE,err,error,*999)
!Check the users numbers to ensure that there are no duplicates
CALL TREE_CREATE_START(newNodesTree,err,error,*999)
CALL TREE_INSERT_TYPE_SET(newNodesTree,TREE_NO_DUPLICATES_ALLOWED,err,error,*999)
CALL TREE_CREATE_FINISH(newNodesTree,err,error,*999)
DO nodeIdx=1,nodes%NUMBER_OF_NODES
IF(userNumbers(nodeIdx)>0) THEN
nodes%NODES(nodeIdx)%GLOBAL_NUMBER=nodeIdx
nodes%NODES(nodeIdx)%USER_NUMBER=userNumbers(nodeIdx)
nodes%NODES(nodeIdx)%LABEL=""
CALL TREE_ITEM_INSERT(nodes%NODES_TREE,userNumbers(nodeIdx),nodeIdx,insertStatus,err,error,*999)
IF(insertStatus/=TREE_NODE_INSERT_SUCESSFUL) THEN
localError="The user number for global node of "//TRIM(NUMBER_TO_VSTRING(nodeIdx,"*",err,error))// &
& " is duplicated. The user node numbers must be unique."
CALL FLAG_ERROR(localError,err,error,*999)
ENDIF
nodes%NODES(nodeIdx)%USER_NUMBER=userNumbers(nodeIdx)
ELSE
CALL FLAG_ERROR("User node numbers cannot be negative.",err,error,*999)
CALL TREE_ITEM_INSERT(newNodesTree,userNumbers(nodeIdx),nodeIdx,insertStatus,err,error,*999)
IF(insertStatus/=TREE_NODE_INSERT_SUCESSFUL) THEN
localError="The specified user number of "//TRIM(NumberToVstring(userNumbers(nodeIdx),"*",err,error))// &
& " for global node number "//TRIM(NumberToVstring(nodeIdx,"*",err,error))// &
& " is a duplicate. The user node numbers must be unique."
CALL FlagError(localError,err,error,*999)
ENDIF
ENDDO !nodeIdx
CALL TREE_DESTROY(nodes%NODES_TREE,err,error,*999)
nodes%NODES_TREE=newNodesTree
NULLIFY(newNodesTree)
DO nodeIdx=1,nodes%NUMBER_OF_NODES
nodes%NODES(nodeIdx)%GLOBAL_NUMBER=nodeIdx
nodes%NODES(nodeIdx)%USER_NUMBER=userNumbers(nodeIdx)
ENDDO !nodesIdx
ELSE
CALL FLAG_ERROR("Number of node user numbers input does not match number of nodes.",err,error,*999)
localError="The number of specified node user numbers ("// &
TRIM(NumberToVstring(SIZE(userNumbers,1),"*",err,error))// &
") does not match number of nodes ("// &
TRIM(NumberToVstring(nodes%NUMBER_OF_NODES,"*",err,error))//")."
CALL FlagError(localError,err,error,*999)
ENDIF
ENDIF
ELSE
CALL FLAG_ERROR("Nodes is not associated.",err,error,*999)
CALL FlagError("Nodes is not associated.",err,error,*999)
ENDIF

CALL EXITS("Nodes_AllUserNumbersSet")
CALL EXITS("Nodes_UserNumbersAllSet")
RETURN
999 CALL ERRORS("Nodes_AllUserNumbersSet",err,error)
CALL EXITS("Nodes_AllUserNumbersSet")
999 IF(ASSOCIATED(newNodesTree)) CALL TREE_DESTROY(newNodesTree,err,error,*998)
998 CALL ERRORS("Nodes_UserNumbersAllSet",err,error)
CALL EXITS("Nodes_UserNumbersAllSet")
RETURN 1

END SUBROUTINE Nodes_AllUserNumbersSet

END SUBROUTINE Nodes_UserNumbersAllSet
!
!================================================================================================================================
!
Expand Down

0 comments on commit 4c39b15

Please sign in to comment.