This lightly commented program performs a unit test on the Monomial Class.
program Unit_Test
use Caesar_Linear_Algebra_Module
use Caesar_Multi_Mesh_Class
use Caesar_Monomial_Class
use Caesar_Numbers_Module, only: zero, one, two, three
implicit none
type(Communication_type) :: Comm
type(Base_Structure_type), pointer :: Row_Structure, Column_Structure
type(Status_type) :: status
type(real,1) :: Coefficient
type(real) :: Exponent
type(integer) :: i, NDimensions, NRows, MaxNonzeros, &
NCells_X, NCells_Y, NCells_Z
type(real,1) :: Lengths
type(ELL_Matrix_type) :: A_ELLM
type(Mathematic_Vector_type) :: X_MV, B_MV, Phi_MV
type(Multi_Mesh_type) :: Mesh
type(Monomial_type) :: Constant_Term, Linear_Term, Quadratic_Term
! Initializations.
call Initialize (Comm)
call Output (Comm)
call Initialize (status)
MaxNonzeros = 3 ! Only need one, but why not test 3?
! Create a mesh.
NCells_X = 14
NCells_Y = 13
NCells_Z = 12
NDimensions = 3
call Initialize (Lengths, NDimensions)
Lengths = (/ 10.d0, 20.d0, 40.d0 /)
call Initialize (Mesh, NDimensions, Lengths, NCells_X, NCells_Y, NCells_Z, &
'Uniform Mesh', status)
! Initialize ELL Matrix and Mathematic Vectors.
Row_Structure => Cell_Structure(Mesh)
Column_Structure => Cell_Structure(Mesh)
call Initialize (A_ELLM, MaxNonzeros, Row_Structure, Column_Structure, &
'Coefficients', status)
call Initialize (X_MV, Column_Structure, 'Variables', status)
call Initialize (B_MV, Row_Structure, 'Equations', status)
NRows = Length_Total(Row_Structure)
! Initialize coefficent array and MV for past time step values (Phi).
call Initialize (Coefficient, Length_PE(Row_Structure))
call Initialize (Phi_MV, Row_Structure, 'Phi')
! Set Phi_MV to two, using Coefficient as a temporary.
Coefficient = two
Phi_MV = Coefficient
! Initialize Constant Term.
Exponent = zero
Coefficient = (/ (three*i, i = First_Cell_PE(Mesh), &
Last_Cell_PE(Mesh)) /)
call Initialize (Constant_Term, Coefficient, Exponent, Phi_MV, &
'Cells', Mesh, 'Source Term', status)
! Initialize Linear Term.
Exponent = one
call Initialize (Linear_Term, Coefficient, Exponent, Phi_MV, &
'Cells', Mesh, 'Removal Term', status)
! Initialize Quadratic Term.
Exponent = two
call Initialize (Quadratic_Term, Coefficient, Exponent, Phi_MV, &
'Cells', Mesh, 'Quadratic Term', status)
! Output Terms.
call Output ( Constant_Term, MAX(1, NRows/10), MIN(NRows, NRows/10+50))
call Output ( Linear_Term, MAX(1, NRows/10), MIN(NRows, NRows/10+50))
call Output (Quadratic_Term, MAX(1, NRows/10), MIN(NRows, NRows/10+50))
! Check state of Monomials.
VERIFY(Valid_State( Constant_Term),0)
VERIFY(Valid_State( Linear_Term),0)
VERIFY(Valid_State(Quadratic_Term),0)
! Add terms to the Matrix Equation and output.
!
! Given that Phi=2 and Coefficient=3*i (see above), then...
!
! A(i,i) B
!
! General Monomial C*E*Phi**(E-1)*Vol C*(E-1)*Phi**E*Vol
!
! Constant Term -3*i*Vol
! Linear Term 3*i*Vol
! Quadratic Term 12*i*Vol 12*i*Vol
! ------------------------------------------------------------
! Sum of Terms 15*i*Vol 9*i*Vol
call Add_to_Matrix_Equation ( Constant_Term, A_ELLM, B_MV)
call Add_to_Matrix_Equation ( Linear_Term, A_ELLM, B_MV)
call Add_to_Matrix_Equation (Quadratic_Term, A_ELLM, B_MV)
call Output (A_ELLM, MAX(1, NRows/10), MIN(NRows, NRows/10+50))
call Output (B_MV, MAX(1, NRows/10), MIN(NRows, NRows/10+50))
! Finalize Monomials, other objects and communications.
call Finalize (Constant_Term)
call Finalize (Linear_Term)
call Finalize (Quadratic_Term)
call Finalize (Phi_MV)
call Finalize (Coefficient)
call Finalize (B_MV)
call Finalize (X_MV)
call Finalize (A_ELLM)
call Finalize (Mesh)
call Finalize (Comm)
end