Compute block volumes.
The volume of each cell is computed using the formula: $$ v = [(\vec n_7 - \vec n_1) + (\vec n_6 - \vec n_0), (\vec n_7 - \vec n_2), (\vec n_3 - \vec n_0)] + [(\vec n_6 - \vec n_0), (\vec n_7 - \vec n_2) + (\vec n_5 - \vec n_0), (\vec n_7 - \vec n_4)] + [(\vec n_7 - \vec n_1), (\vec n_5 - \vec n_0), (\vec n_7 - \vec n_4) + (\vec n_3 - \vec n_0)] $$ where \([\vec A, \vec B, \vec C]=\vec A \cdot (\vec B \times \vec C)\) is the triple product.
[1] Efficient computation of volume of hexahedral cells, Grandy J., 1997.
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(block_object), | intent(inout) | :: | self | Block. |
elemental subroutine compute_volumes(self)
!< Compute block volumes.
!<
!< The volume of each cell is computed using the formula:
!< $$
!< v = [(\vec n_7 - \vec n_1) + (\vec n_6 - \vec n_0), (\vec n_7 - \vec n_2), (\vec n_3 - \vec n_0)] +
!< [(\vec n_6 - \vec n_0), (\vec n_7 - \vec n_2) + (\vec n_5 - \vec n_0), (\vec n_7 - \vec n_4)] +
!< [(\vec n_7 - \vec n_1), (\vec n_5 - \vec n_0), (\vec n_7 - \vec n_4) + (\vec n_3 - \vec n_0)]
!< $$
!< where \([\vec A, \vec B, \vec C]=\vec A \cdot (\vec B \times \vec C)\) is the triple product.
!<
!<### References
!<
!< [1] *Efficient computation of volume of hexahedral cells*, Grandy J., 1997.
class(block_object), intent(inout) :: self !< Block.
type(vector) :: triplet(1:9) !< Dummy vectors.
integer(I4P) :: i !< Counter.
integer(I4P) :: j !< Counter.
integer(I4P) :: k !< Counter.
associate(node=>self%node, ni=>self%signature%ni, nj=>self%signature%nj, nk=>self%signature%nk)
do k=1, nk
do j=1, nj
do i=1, ni
triplet(1) = node(i , j , k )%vertex - node(i , j-1, k-1)%vertex &
+ node(i-1, j , k )%vertex - node(i-1, j-1, k-1)%vertex
triplet(2) = node(i , j , k )%vertex - node(i-1, j , k-1)%vertex
triplet(3) = node(i , j , k-1)%vertex - node(i-1, j-1, k-1)%vertex
triplet(4) = node(i-1, j , k )%vertex - node(i-1, j-1, k-1)%vertex
triplet(5) = node(i , j , k )%vertex - node(i-1, j , k-1)%vertex &
+ node(i , j-1, k )%vertex - node(i-1, j-1, k-1)%vertex
triplet(6) = node(i , j , k )%vertex - node(i-1, j-1, k )%vertex
triplet(7) = node(i , j , k )%vertex - node(i , j-1, k-1)%vertex
triplet(8) = node(i , j-1, k )%vertex - node(i-1, j-1, k-1)%vertex
triplet(9) = node(i , j , k )%vertex - node(i-1, j-1, k )%vertex &
+ node(i , j , k-1)%vertex - node(i-1, j-1, k-1)%vertex
self%cell(i, j, k)%volume = ((triplet(1).dot.(triplet(2).cross.triplet(3))) + &
(triplet(4).dot.(triplet(5).cross.triplet(6))) + &
(triplet(7).dot.(triplet(8).cross.triplet(9)))) / 12.0_R8P
enddo
enddo
enddo
endassociate
endsubroutine compute_volumes