The main documentation of the Get_Harmonic_Diffusion_Coef_Ortho_Diffusion Procedure contains additional explanation of this code listing.
subroutine Get_Harmonic_Diffusion_Coef (Harmonic_Diffusion_Coef_F_of_C, &
Diff_Term)
! Input variable.
type(Ortho_Diffusion_type), intent(inout) :: Diff_Term ! Diffusion term.
! Output variable.
! Harmonic diffusion coefficient at each face of each cell.
type(real,2) :: Harmonic_Diffusion_Coef_F_of_C
! Internal variables.
type(integer) :: other_cell ! Loop parameters.
! Diffusion coefficient variables for cells and cells of cells.
type(Collected_Array_type) :: Coefficient_Cells_of_Cells_CA
type(Distributed_Vector_type) :: Coefficient_Cells_DV
type(real,2) :: Coefficient_Cells_of_Cells
! Absolute distances between the cell centers and the faces.
type(real,2) :: DeltaR21_Cells_of_Cells, DeltaR1f_Cells_of_Cells, &
DeltaR2f_Cells_of_Cells
! A toggle for different harmonic averages.
type(character,name_length) :: harmonic_diffusion_option
type(integer) :: Faces_per_Cell ! Number of faces per cell.
type(integer) :: NDimensions ! NUmber of dimensions.
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! Verify requirements.
VERIFY(Valid_State(Diff_Term),5) ! Diff_Term is valid.
! Harmonic_Diffusion_Coef_F_of_C is valid.
VERIFY(Valid_State(Harmonic_Diffusion_Coef_F_of_C),5)
! Harmonic_Diffusion_Coef_F_of_C is dimensioned correctly.
VERIFY(SIZE(Harmonic_Diffusion_Coef_F_of_C,1) == dnl
NCells_PE(Diff_Term%Mesh),5)
VERIFY(SIZE(Harmonic_Diffusion_Coef_F_of_C,2) == dnl
Get_Faces_per_Cell(Diff_Term%Mesh),5)
! Query the mesh.
Faces_per_Cell = Get_Faces_per_Cell (Diff_Term%Mesh)
NDimensions = Get_NDimensions (Diff_Term%Mesh)
! Future mods:
! 1. Access routine for Mesh%Cells_of_Cells_Index.
! 2. Other pseudo-ortho methods.
! Define Delta R's.
call Initialize (DeltaR21_Cells_of_Cells, NCells_PE(Diff_Term%Mesh), &
Faces_per_Cell)
call Initialize (DeltaR1f_Cells_of_Cells, NCells_PE(Diff_Term%Mesh), &
Faces_per_Cell)
call Initialize (DeltaR2f_Cells_of_Cells, NCells_PE(Diff_Term%Mesh), &
Faces_per_Cell)
call Get_DeltaR21_Cells_of_Cells (DeltaR21_Cells_of_Cells, Diff_Term%Mesh)
call Get_DeltaR1f_Cells_of_Cells (DeltaR1f_Cells_of_Cells, Diff_Term%Mesh)
call Get_DeltaR2f_Cells_of_Cells (DeltaR2f_Cells_of_Cells, Diff_Term%Mesh)
! Get the Diffusion Coefficient for the neighboring cells.
call Initialize (Coefficient_Cells_DV, Diff_Term%Structure, 1)
call Initialize (Coefficient_Cells_of_Cells_CA, &
Diff_Term%Mesh%Cells_of_Cells_Index, 1)
call Initialize (Coefficient_Cells_of_Cells, NCells_PE(Diff_Term%Mesh), &
Faces_per_Cell)
Coefficient_Cells_DV = Diff_Term%Coefficient
Coefficient_Cells_of_Cells_CA = Coefficient_Cells_DV
Coefficient_Cells_of_Cells = Coefficient_Cells_of_Cells_CA
call Finalize (Coefficient_Cells_of_Cells_CA)
call Finalize (Coefficient_Cells_DV)
! Define Harmonic Average Diffusion Coefficient. Four options:
!
! alpha - DeltaR21 (DeltaR1f/D1 + DeltaR2F/D2)^-1
! beta - (DeltaR1f + DeltaR2F) (DeltaR1f/D1 + DeltaR2F/D2)^-1
! gamma - (V1 + V2) (V2/D1 + V1/D2)^-1
! delta - (V1 + V2) (V1/D1 + V2/D2)^-1
!
! Options alpha, beta, and delta reduce to the orthogonal method on
! orthogonal meshes. Options beta, gamma, and delta reduce to the
! constant D value if D is constant, regardless of the geometry. Option
! gamma reproduces a bug in Telluride, and is here for comparison
! purposes only (don't use it).
harmonic_diffusion_option = 'beta' ! Hardwired to beta for now.
do other_cell = 1, Faces_per_Cell
if (harmonic_diffusion_option == 'alpha') then
where (Diff_Term%Coefficient(:) == zero .OR. &
Coefficient_Cells_of_Cells(:,other_cell) == zero)
Harmonic_Diffusion_Coef_F_of_C(:,other_cell) = zero
elsewhere
Harmonic_Diffusion_Coef_F_of_C(:,other_cell) = &
DeltaR21_Cells_of_Cells(:,other_cell) * &
(DeltaR1f_Cells_of_Cells(:,other_cell) / &
Diff_Term%Coefficient(:) + &
DeltaR2f_Cells_of_Cells(:,other_cell) / &
Coefficient_Cells_of_Cells(:,other_cell))**(-1)
end where
else if (harmonic_diffusion_option == 'beta') then
where (Diff_Term%Coefficient(:) == zero .OR. &
Coefficient_Cells_of_Cells(:,other_cell) == zero)
Harmonic_Diffusion_Coef_F_of_C(:,other_cell) = zero
elsewhere
Harmonic_Diffusion_Coef_F_of_C(:,other_cell) = &
(DeltaR1f_Cells_of_Cells(:,other_cell) + &
DeltaR2f_Cells_of_Cells(:,other_cell)) * &
(DeltaR1f_Cells_of_Cells(:,other_cell) / &
Diff_Term%Coefficient(:) + &
DeltaR2f_Cells_of_Cells(:,other_cell) / &
Coefficient_Cells_of_Cells(:,other_cell))**(-1)
end where
else
VERIFY(.false.,1) ! Not implemented yet.
end if
end do
! Finalize working structures.
call Finalize (DeltaR21_Cells_of_Cells)
call Finalize (DeltaR1f_Cells_of_Cells)
call Finalize (DeltaR2f_Cells_of_Cells)
call Finalize (Coefficient_Cells_of_Cells)
! Verify guarantees.
! Harmonic_Diffusion_Coef_F_of_C is valid.
VERIFY(Valid_State(Harmonic_Diffusion_Coef_F_of_C),5)
VERIFY(Valid_State(Diff_Term),5) ! Diff_Term is valid.
return
end subroutine Get_Harmonic_Diffusion_Coef