interpolate_at_nodes Subroutine

private pure subroutine interpolate_at_nodes(self, var_cell, var_node)

Interpolate cell-centered variable at nodes.

Arguments

Type IntentOptional AttributesName
class(block_object), intent(in) :: self

Block.

real(kind=R8P), intent(in) :: var_cell(1-self%signature%gc(1):,1-self%signature%gc(3):,1-self%signature%gc(5):)

Cell-centered variable.

real(kind=R8P), intent(out) :: var_node(0-self%signature%gc(1):,0-self%signature%gc(3):,0-self%signature%gc(5):)

Node-centered variable.

Calls

proc~~interpolate_at_nodes~~CallsGraph proc~interpolate_at_nodes interpolate_at_nodes gc gc proc~interpolate_at_nodes->gc
Help

Source Code


Source Code

   pure subroutine interpolate_at_nodes(self, var_cell, var_node)
   !< Interpolate cell-centered variable at nodes.
   !<
   !< @note The interpolation is linear and based on the volume-weights.
   !<
   !< @note Only internal cells are considered, ghost ones are trimmed.
   class(block_object), intent(in)  :: self                                !< Block.
   real(R8P),           intent(in)  :: var_cell(1-self%signature%gc(1):, &
                                                1-self%signature%gc(3):, &
                                                1-self%signature%gc(5):)   !< Cell-centered variable.
   real(R8P),           intent(out) :: var_node(0-self%signature%gc(1):, &
                                                0-self%signature%gc(3):, &
                                                0-self%signature%gc(5):)   !< Node-centered variable.
   real(R8P), allocatable           :: var_cell_framed(:,:,:)              !< Cell-centered var framed.
   real(R8P), allocatable           :: volume_framed(:,:,:)                !< Volume framed.
   integer(I4P)                     :: i                                   !< Counter.
   integer(I4P)                     :: j                                   !< Counter.
   integer(I4P)                     :: k                                   !< Counter.

   associate(gc=>self%signature%gc, ni=>self%signature%ni, nj=>self%signature%nj, nk=>self%signature%nk)
      ! building framed variable and volume
      allocate(var_cell_framed(0:ni+1, 0:nj+1, 0:nk+1)) ; var_cell_framed = 0._R8P
      var_cell_framed(1:ni, 1:nj, 1:nk) = var_cell(1:ni, 1:nj, 1:nk)
      allocate(volume_framed(0:ni+1, 0:nj+1, 0:nk+1)) ; volume_framed = 0._R8P
      volume_framed(1:ni, 1:nj, 1:nk) = self%cell(1:ni, 1:nj, 1:nk)%volume
      ! check frames
      if (gc(1)>0) then
         var_cell_framed(0, 1:nj, 1:nk) = var_cell( 0, 1:nj, 1:nk)
         volume_framed(  0, 1:nj, 1:nk) = self%cell(0, 1:nj, 1:nk)%volume
      endif
      if (gc(2)>0) then
         var_cell_framed(ni+1, 1:nj, 1:nk) = var_cell( ni+1, 1:nj, 1:nk)
         volume_framed(  ni+1, 1:nj, 1:nk) = self%cell(ni+1, 1:nj, 1:nk)%volume
      endif
      if (gc(3)>0) then
         var_cell_framed(1:ni, 0, 1:nk) = var_cell( 1:ni, 0, 1:nk)
         volume_framed(  1:ni, 0, 1:nk) = self%cell(1:ni, 0, 1:nk)%volume
      endif
      if (gc(4)>0) then
         var_cell_framed(ni, 1:nj+1, 1:nk) = var_cell( ni, 1:nj+1, 1:nk)
         volume_framed(  ni, 1:nj+1, 1:nk) = self%cell(ni, 1:nj+1, 1:nk)%volume
      endif
      if (gc(5)>0) then
         var_cell_framed(1:ni, 1:nj, 0) = var_cell( 1:ni, 1:nj, 0)
         volume_framed(  1:ni, 1:nj, 0) = self%cell(1:ni, 1:nj, 0)%volume
      endif
      if (gc(6)>0) then
         var_cell_framed(ni, 1:nj, 1:nk+1) = var_cell( ni, 1:nj, 1:nk+1)
         volume_framed(  ni, 1:nj, 1:nk+1) = self%cell(ni, 1:nj, 1:nk+1)%volume
      endif
      ! interpolate on nodes
      do k=0, nk
         do j=0, nj
            do i=0, ni
               var_node(i, j, k) = (var_cell_framed(i+1, j+1, k+1) * volume_framed(i+1, j+1, k+1) &
                                 +  var_cell_framed(i  , j+1, k+1) * volume_framed(i  , j+1, k+1) &
                                 +  var_cell_framed(i+1, j  , k+1) * volume_framed(i+1, j  , k+1) &
                                 +  var_cell_framed(i  , j  , k+1) * volume_framed(i  , j  , k+1) &
                                 +  var_cell_framed(i+1, j+1, k  ) * volume_framed(i+1, j+1, k  ) &
                                 +  var_cell_framed(i  , j+1, k  ) * volume_framed(i  , j+1, k  ) &
                                 +  var_cell_framed(i+1, j  , k  ) * volume_framed(i+1, j  , k  ) &
                                 +  var_cell_framed(i  , j  , k  ) * volume_framed(i  , j  , k  ))&
                                 / sum(volume_framed(i:i+1, j:j+1, k:k+1))
            enddo
         enddo
      enddo
   endassociate
   endsubroutine interpolate_at_nodes


adim_assign_adim allocate_blocks block_assign_block block_d_assign_block_d cell_assign_cell cells_number cells_number check cli_parse cli_parse cli_parse close compute_extents compute_faces_metrics compute_metrics compute_metrics compute_reference_values compute_space_operator compute_volumes correct_metrics cp create_linspace description description description description description description description description description destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy destroy err_assign_err face_assign_face file_assign_file free_assign_free grid_d_assign_grid_d initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize initialize_unix initialize_windows integrate interpolate_at_nodes iolength iolength iopos_block_nodes is_the_end load_file_grid load_file_name_from_file load_file_parameters load_from_file load_from_file load_from_file load_from_file load_from_file load_from_file load_from_file load_grid_dimensions_from_file load_input_files load_nodes_from_file load_nodes_from_file mkdir node_assign_node node_to_center nodes_number nodes_number nullify_normals open os_assign_os parse_command_line_interface progress rm save_file_grid save_file_grid save_file_grid_tec save_file_grid_vtk save_file_name_into_file save_file_parameters save_grid_dimensions_into_file save_into_file save_into_file save_into_file save_into_file save_into_file save_into_file save_into_file save_nodes_into_file save_nodes_into_file set_command_line_interface set_stop solver_assign_solver time_assign_time update