This subroutine updates the surface points and the parentIDs array as well as sets the correct property bits.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(tem_surfData_type), | intent(inout) | :: | me |
datatype to store the surface information |
||
type(tem_levelDesc_type), | intent(inout) | :: | levelDesc |
the level descriptor incl. ghost and halo elements as well as the communicator information on the level iLevel |
||
type(treelmesh_type), | intent(inout) | :: | globTree |
global Tree information |
||
type(tem_spacetime_fun_type) | :: | movement |
spacetime function to define the motion of the surface points |
|||
type(tem_time_type) | :: | time |
timing information |
|||
integer, | intent(inout) | :: | iLevel |
the current level |
||
integer, | intent(in), | optional | :: | IBMUnit(0:tem_last_lu) |
optional output log unit other than the global logUnit |
|
logical, | intent(in), | optional | :: | useInitPos |
shall the initial points be stored and used for updating the points later on ??? |
|
logical, | intent(in) | :: | movPredef |
logical to define wether the motion is predefined or not if not: initialize the values differently |
subroutine tem_update_surfPos( me, levelDesc, globTree, movement, time, & & iLevel, IBMUnit, useInitPos, movPredef ) ! --------------------------------------------------------------------------- !> datatype to store the surface information type( tem_surfData_type ), intent(inout) :: me !> the level descriptor incl. ghost and halo elements as well as the !! communicator information on the level iLevel type( tem_levelDesc_type ), intent(inout) :: levelDesc !> global Tree information type( treelmesh_type ), intent(inout) :: globTree !> spacetime function to define the motion of the surface points type( tem_spacetime_fun_type ) :: movement !> timing information type(tem_time_type) :: time !> the current level integer, intent(inout) :: iLevel !> optional output log unit other than the global logUnit integer, optional, intent(in) :: IBMUnit(0:tem_last_lu) !> shall the initial points be stored and used for updating the points !! later on ??? logical, optional, intent(in) :: useInitPos !> logical to define wether the motion is predefined or not !! if not: initialize the values differently logical, intent(in) :: movPredef ! --------------------------------------------------------------------------- ! counters integer :: iPoint real(kind=rk) :: pos(1,3) real(kind=rk) :: huge_real integer :: IBMUnit_loc(0:tem_last_lu) logical :: tmp_useInitPos ! --------------------------------------------------------------------------- if( present( useInitPos ))then tmp_useInitPos = useInitPos else tmp_useInitPos = .false. end if if( present( IBMUnit ))then IBMUnit_loc = IBMUnit else IBMUnit_loc = logUnit end if huge_real = huge( huge_real ) ! loop over the surface points and ... do iPoint = 1, me%nUniquePoints_total if( movPredef )then ! only update points which have fluid elements as parents if( me%ParentIDs(iLevel)%ptrs( iPoint ) > 0 )then ! ... clean the IBM property bits from the element levelDesc%property( me%ParentIDs(iLevel)%ptrs( iPoint)) = & & ibclr( levelDesc%property( me%ParentIDs(iLevel)%ptrs( iPoint)),& & prp_hasIBM ) end if ! check wether the initial point coordinates shall be used ... if( tmp_useInitPos )then ! ... yes: use array backPointCoords and ... ! ... store the coordinates in a temporary variable pos(1,1:3) = me%backPointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) else ! ... yes: use array pointCoords and ... ! ... store the coordinates in a temporary variable pos(1,1:3) = me%pointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) end if ! ... apply the movement and store the new positions pos = tem_spacetime_for( me = movement, & & coord = pos, & & time = time, & & n = 1, & & nComp = 3 ) ! ... copy back the new positions me%pointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) = pos(1,1:3) else ! .not. movPredef -> initialize Xk with non local fluid parents with ! huge ! only update points which have fluid elements as parents if( me%ParentIDs(iLevel)%ptrs( iPoint ) > 0 .and. & & me%ParentIDs(iLevel)%ptrs( iPoint ) <= levelDesc%elem%nElems( eT_fluid ) )then ! ... clean the IBM property bits from the element levelDesc%property( me%ParentIDs(iLevel)%ptrs( iPoint)) = & & ibclr( levelDesc%property( me%ParentIDs(iLevel)%ptrs( iPoint)),& & prp_hasIBM ) ! check wether the initial point coordinates shall be used ... if( tmp_useInitPos )then ! ... yes: use array backPointCoords and ... ! ... store the coordinates in a temporary variable pos(1,1:3) = me%backPointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) else ! ... yes: use array pointCoords and ... ! ... store the coordinates in a temporary variable pos(1,1:3) = me%pointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) end if ! ... apply the movement and store the new positions pos = tem_spacetime_for( me = movement, & & coord = pos, & & time = time, & & n = 1, & & nComp = 3 ) ! ... copy back the new positions me%pointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) = pos(1,1:3) else ! set the coordinates to be infinity such that they are not recognized ! by this proc any more me%pointCoords( (iPoint-1)*3+1:(iPoint-1)*3+3 ) = (/huge_real, & & huge_real, & & huge_real/) end if end if end do ! iPoint ! update the parentIDs array and set the correct property bits call tem_init_surfData( me = me, & & levelDesc = levelDesc, & & globTree = globTree, & & iLevel = iLevel ) end subroutine tem_update_surfPos