Create newtree out of intree by restricting to the elements of subtree.
The new mesh will have no properties
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(treelmesh_type), | intent(in) | :: | intree |
The tree on which the subtree is defined. |
||
type(tem_subTree_type), | intent(in) | :: | subtree |
Subtree describing the part of the mesh to create a new mesh from. |
||
type(treelmesh_type), | intent(out) | :: | newtree |
Resulting new tree with the elements selected by subtree from newtree. |
||
logical, | intent(in), | optional | :: | keep_props |
Flag to indicate whether to keep properties from intree also in newtree. If this is true, the properties will be copied from the intree to the
newtree. An actual copy is done, as we can not rely on the pointer
targets in intree to exist further on.
Default is |
subroutine tem_create_tree_from_sub(intree, subtree, newtree, keep_props) !> The tree on which the subtree is defined. type(treelmesh_type), intent(in) :: intree !> Subtree describing the part of the mesh to create a new mesh from. type(tem_subtree_type), intent(in) :: subtree !> Resulting new tree with the elements selected by subtree from newtree. type(treelmesh_type), intent(out) :: newtree !> Flag to indicate whether to keep properties from intree also in newtree. !! !! If this is true, the properties will be copied from the intree to the !! newtree. An actual copy is done, as we can not rely on the pointer !! targets in intree to exist further on. !! Default is `.false.`, which means all properties will be dropped and !! newtree will have no properties at all. logical, optional, intent(in) :: keep_props logical :: withprop integer(kind=long_k) :: nNewElems integer :: iProp integer :: iError withprop = .false. if (present(keep_props)) withprop = keep_props newtree%global%maxlevel = intree%global%maxlevel newtree%global%minlevel = intree%global%minlevel newtree%global%origin = intree%global%origin newtree%global%BoundingCubeLength = intree%global%BoundingCubeLength if (subtree%useGlobalMesh) then ! Copy complete tree, but ignore properties. newtree = intree nullify(newtree%global%property) nullify(newtree%property) else newtree%nelems = subtree%nElems nullify(newtree%global%property) nullify(newtree%property) newtree%global%comm = subtree%global%comm newtree%global%nparts = subtree%global%nparts newtree%global%myPart = subtree%global%myPart allocate(newtree%treeID(newtree%nelems)) allocate(newtree%ElemPropertyBits(newtree%nelems)) allocate(newtree%Part_First(newtree%global%nparts)) allocate(newtree%Part_Last(newtree%global%nparts)) newtree%treeID = intree%treeID(subtree%map2global) if (withprop) then newtree%ElemPropertyBits = intree%ElemPropertyBits(subtree%map2global) else newtree%ElemPropertyBits = 0_long_k end if nNewElems = int(newtree%nElems, kind=long_k) ! Overall number of elements in the new mesh and offsets. call MPI_Exscan(nNewelems, newtree%ElemOffset, 1, long_k_mpi, & & MPI_SUM, newtree%global%comm, iError ) newtree%global%nElems = newtree%ElemOffset+nNewElems call MPI_Bcast( newtree%global%nElems, 1, long_k_mpi, & & newtree%global%nParts-1, & & newtree%global%comm, iError ) call MPI_Allgather( newtree%treeID(1), 1, long_k_mpi, & & newtree%Part_First, 1, long_k_mpi, & & newtree%global%comm, iError ) call MPI_Allgather( newtree%treeID(newtree%nElems), 1, long_k_mpi, & & newtree%Part_Last, 1, long_k_mpi, & & newtree%global%comm, iError ) end if if (withprop) then newtree%global%nProperties = intree%global%nProperties allocate(newtree%global%property(newtree%global%nProperties)) allocate(newtree%property(newtree%global%nProperties)) newtree%global%property = intree%global%property do iProp=1,newtree%global%nProperties ! In the new mesh there may be a different number of elements with ! this property, recount them and update the header information ! accordingly. call tem_prop_countelems( me = newtree%global & & %Property(iProp), & & elempropertybits = newtree%Elempropertybits, & & comm = newtree%global%comm ) ! Now create the process local information on the property. call gather_Property( Property = newtree%Property(iProp), & & Header = newtree%global%Property(iProp), & & BitField = newtree%ElemPropertyBits, & & comm = newtree%global%comm ) end do else newtree%global%nProperties = 0 allocate(newtree%global%property(0)) allocate(newtree%property(0)) end if end subroutine tem_create_tree_from_sub