testSparse.f90 Source File

This File Depends On

sourcefile~~testsparse.f90~~EfferentGraph sourcefile~testsparse.f90 testSparse.f90 sourcefile~basicsolvers.f90 basicSolvers.f90 sourcefile~basicsolvers.f90->sourcefile~testsparse.f90 sourcefile~sparse.f90 sparse.f90 sourcefile~sparse.f90->sourcefile~testsparse.f90 sourcefile~sparse.f90->sourcefile~basicsolvers.f90 sourcefile~solvers.f90 solvers.f90 sourcefile~sparse.f90->sourcefile~solvers.f90 sourcefile~solvers.f90->sourcefile~testsparse.f90 sourcefile~kinds.f90 kinds.f90 sourcefile~kinds.f90->sourcefile~testsparse.f90 sourcefile~kinds.f90->sourcefile~basicsolvers.f90 sourcefile~kinds.f90->sourcefile~sparse.f90 sourcefile~kinds.f90->sourcefile~solvers.f90 sourcefile~array.f90 array.f90 sourcefile~kinds.f90->sourcefile~array.f90 sourcefile~plplotlib.f90 plplotlib.f90 sourcefile~kinds.f90->sourcefile~plplotlib.f90 sourcefile~text.f90 text.f90 sourcefile~kinds.f90->sourcefile~text.f90 sourcefile~time.f90 time.f90 sourcefile~kinds.f90->sourcefile~time.f90 sourcefile~array.f90->sourcefile~testsparse.f90 sourcefile~array.f90->sourcefile~sparse.f90 sourcefile~array.f90->sourcefile~plplotlib.f90 sourcefile~plplotlib.f90->sourcefile~testsparse.f90 sourcefile~text.f90->sourcefile~basicsolvers.f90 sourcefile~text.f90->sourcefile~solvers.f90 sourcefile~text.f90->sourcefile~plplotlib.f90 sourcefile~time.f90->sourcefile~solvers.f90 sourcefile~time.f90->sourcefile~text.f90
Help

Source Code


Source Code

program testSparse_prg
	use kinds_mod
	use sparse_mod
	use basicSolvers_mod
	use solvers_mod
	use array_mod
	use plplotlib_mod
	implicit none
	
	call setup(fileName='testsSparse-%n.svg',figSize=[400,300])
	call testNewSparse
	call testSpvec
	call testBasicSolvers
	call testSolvers
	call show()
	
contains

	subroutine testNewSparse
		type(sparse_t)::A
		integer::N,M
		
		N = 3
		M = 5
		
		A = newSparse(N,M)
	end subroutine testNewSparse

	subroutine testSpvec
		type(spvec_t)::u,v,r
		
		u%i = [1,2,3]
		u%v = [1.0_wp,2.0_wp,3.0_wp]
		
		v%i = [2,3,4]
		v%v = [2.0_wp,3.0_wp,4.0_wp]
		
		write(*,*) u.o.v
		
		r = u+v
		write(*,*) r%i
		write(*,*) r%v
		
		r = 2.0_wp*u*2.0_wp
		write(*,*) r%i
		write(*,*) r%v
	end subroutine testSpvec

	subroutine testBasicSolvers
		real(wp),parameter::Tl  = 0.0_wp
		real(wp),parameter::Tr  = 1.0_wp
		real(wp),parameter::k   = 1.0_wp
		real(wp),parameter::q0  = 10.0_wp
		real(wp),parameter::tol = 1.0E-8_wp
		
		real(wp)::Ap,Ae,Aw,dx
		type(sparse_t)::A
		real(wp),dimension(:),allocatable::x,q
		real(wp),dimension(:),allocatable::T1,T2,T3
		integer::N,i,s
		
		N  = 1000
		s  = N/30
		allocate(x(0:N+1))
		x  = linspace(0.0_wp,1.0_wp,N+2)
		q  = [( q0     , i=1,N )]
		A  = newSparse(N,N)
		
		allocate(T1(0:N+1))
		allocate(T2(0:N+1))
		allocate(T3(0:N+1))
		
		T1(0)   = Tl
		T1(N+1) = Tr
		
		T2(0)   = Tl
		T2(N+1) = Tr
		
		T3(0)   = Tl
		T3(N+1) = Tr
		
		dx = x(2)-x(1)
		
		i = 1
		Ae = k/dx**2
		Aw = k/dx**2
		Ap = Ae+Aw
		call A%set(i,i  , Ap)
		call A%set(i,i+1,-Ae)
		q(i) = q(i)+Aw*Tl
		do i=2,N-1
			Ae = k/dx**2
			Aw = k/dx**2
			Ap = Ae+Aw
			call A%set(i,i-1,-Aw)
			call A%set(i,i  , Ap)
			call A%set(i,i+1,-Ae)
		end do
		i = N
		Ae = k/dx**2
		Aw = k/dx**2
		Ap = Ae+Aw
		call A%set(i,i-1,-Aw)
		call A%set(i,i  , Ap)
		q(i) = q(i)+Ae*Tr
		
		T1(1:N) = biConjugateGradientStabilized(A,q)
		T2(1:N) = conjugateGradient(A,q)
		T3(1:N) = successiveOverRelaxation(A,q,1.995_wp)
		
		
		call figure()
		call subplot(1,1,1)
		call xylim(mixval(x),mixval(T1)+[0.0_wp,0.05_wp]*span(T1))
		call plot(x(::s),T1(::s),lineStyle='-',lineColor='r',markStyle='x',markColor='r')
		call plot(x(::s),T2(::s),lineStyle='-',lineColor='b',markStyle='o',markColor='b')
		call plot(x(::s),T3(::s),lineStyle='-',lineColor='c',markStyle='s',markColor='c')
		call ticks()
		call labels('Position #fix#fn','Temperature #fiT#fn','1D Heat Conduction with Generation')
		
	end subroutine testBasicSolvers

	subroutine testSolvers
		real(wp),parameter::Tl  = 0.0_wp
		real(wp),parameter::Tr  = 1.0_wp
		real(wp),parameter::k   = 1.0_wp
		real(wp),parameter::q0  = 10.0_wp
		real(wp),parameter::tol = 1.0E-8_wp
		
		real(wp)::Ap,Ae,Aw,dx
		type(sparse_t)::A
		class(solver_t),allocatable::solver
		real(wp),dimension(:),allocatable::x,q
		real(wp),dimension(:),allocatable::T1
		integer::N,i,s
		
		N  = 100
		s  = N/30
		allocate(x(0:N+1))
		x  = linspace(0.0_wp,1.0_wp,N+2)
		q  = [( q0     , i=1,N )]
		A  = newSparse(N,N)
		
		allocate(T1(0:N+1))
		
		T1(0)   = Tl
		T1(N+1) = Tr
		
		dx = x(2)-x(1)
		
		i = 1
		Ae = k/dx**2
		Aw = k/dx**2
		Ap = Ae+Aw
		call A%set(i,i  , Ap)
		call A%set(i,i+1,-Ae)
		q(i) = q(i)+Aw*Tl
		do i=2,N-1
			Ae = k/dx**2
			Aw = k/dx**2
			Ap = Ae+Aw
			call A%set(i,i-1,-Aw)
			call A%set(i,i  , Ap)
			call A%set(i,i+1,-Ae)
		end do
		i = N
		Ae = k/dx**2
		Aw = k/dx**2
		Ap = Ae+Aw
		call A%set(i,i-1,-Aw)
		call A%set(i,i  , Ap)
		q(i) = q(i)+Ae*Tr
		
		allocate(solver,source=jacobi_t())
		call solver%setup(A)
		T1(1:N) = solver%solve(A,q)
		deallocate(solver)
		
		allocate(solver,source=gaussSeidel_t())
		call solver%setup(A)
		T1(1:N) = solver%solve(A,q)
		deallocate(solver)
		
		allocate(solver,source=SOR_t(1.99_wp))
		call solver%setup(A)
		T1(1:N) = solver%solve(A,q)
		deallocate(solver)
		
		allocate(solver,source=conjugateGradient_t())
		call solver%setup(A)
		T1(1:N) = solver%solve(A,q)
		deallocate(solver)
		
		allocate(solver,source=biCGSTAB_t())
		call solver%setup(A)
		T1(1:N) = solver%solve(A,q)
		deallocate(solver)
		
		call figure()
		call subplot(1,1,1)
		call xylim(mixval(x),mixval(T1)+[0.0_wp,0.05_wp]*span(T1))
		call plot(x(::s),T1(::s),lineStyle='-',lineColor='k',markStyle='x',markColor='r')
		call ticks()
		call labels('Position #fix#fn','Temperature #fiT#fn','1D Heat Conduction with Generation')
		
	end subroutine testSolvers

end program testSparse_prg