testArray.f90 Source File

This File Depends On

sourcefile~~testarray.f90~~EfferentGraph sourcefile~testarray.f90 testArray.f90 sourcefile~array.f90 array.f90 sourcefile~array.f90->sourcefile~testarray.f90 sourcefile~kinds.f90 kinds.f90 sourcefile~kinds.f90->sourcefile~testarray.f90 sourcefile~kinds.f90->sourcefile~array.f90
Help

Source Code


Source Code

program testArray_prg
	!! Test program for array_mod
	use kinds_mod
	use array_mod
	implicit none
	
	call testMixval
	call testSpan
	call testFlatten
	
	call testDeDup
	
	call testLinspace
	call testMeshGrid
	
	call testLinearInterp
	
	call testTDMA
	call testLU
	
contains

	subroutine testMixval
		!! Test mixval to verify operation
		logical,dimension(1)::results
		
		integer,parameter::N = 10
		real(wp),dimension(N)::x
		real(wp),dimension(2)::test,true
		
		call random_number(x)
		
		test = mixval(x)
		true = [minval(x),maxval(x)]
		
		results(1) = all(test==true)
		
		if( .not.all(results) ) error stop "Failed mixval check"
	end subroutine testMixval

	subroutine testSpan
		!! Test mixval to verify operation
		logical,dimension(1)::results
		
		integer,parameter::N = 10
		real(wp),dimension(N)::x
		real(wp)::test,true
		
		call random_number(x)
		
		test = span(x)
		true = maxval(x)-minval(x)
		
		results(1) = test==true
		
		if( .not.all(results) ) error stop "Failed span check"
	end subroutine testSpan

	subroutine testFlatten
		!! Test mixval to verify operation
		logical,dimension(1)::results
		
		integer,parameter::N = 3
		integer,parameter::M = 4
		real(wp),dimension(N,M)::x
		real(wp),dimension(N*M)::y
		
		call random_number(x)
		y = flatten(x)
		
		results(1) = all( abs(y-reshape(x,[N*M]))<2.0_wp**4*epsilon(1.0_wp) )
		
		if( .not.all(results) ) error stop "Failed flatten check"
	end subroutine testFlatten

	subroutine testDeDup
		!! Test deDup to verify operation
		logical,dimension(1)::results
		
		results(1) = all( deDup([1,1,2,3,2,4])==[1,2,3,4] )
		
		if( .not.all(results) ) error stop "Failed deDup check"
	end subroutine testDeDup

	subroutine testLinspace
		!! Test linspace to verify operation
		logical,dimension(1)::results
		
		real(wp),dimension(:),allocatable::x,y
		integer::N,k
		
		N = 100
		x = linspace(0.0_wp,1.0_wp,N)
		y = [( real(k-1,wp)/real(N-1,wp) , k=1,N )]
		
		results(1) = norm2(x-y)<1.0E-10_wp
		
		if( .not.all(results) ) error stop "Failed linspace check"
	end subroutine testLinspace

	subroutine testMeshGrid
		!! Test meshGridX and meshGridY to verify operation
		logical,dimension(6)::results
		
		real(wp),dimension(:),allocatable::x,y
		real(wp),dimension(:,:),allocatable::XX,YY
		integer::N,M
		
		N = 5
		M = 6
		
		x = linspace(0.0_wp,1.0_wp,N)
		y = linspace(0.0_wp,1.0_wp,M)
		
		XX = meshGridX(x,y)
		YY = meshGridY(x,y)
		
		results(1) = all(XX(:,1)==x)
		results(2) = all(YY(1,:)==y)
		results(3) = all(XX(:,1)==XX(:,M))
		results(4) = all(YY(1,:)==YY(N,:))
		results(5) = all(shape(XX)==[N,M])
		results(6) = all(shape(YY)==[N,M])
		
		if( .not.all(results) ) error stop "Failed linspace check"
	end subroutine testMeshGrid

	subroutine testLinearInterp
		!! Test linearInterp to verify operation
		logical,dimension(1)::results
		
		real(wp),dimension(:),allocatable::x1,x2,y
		integer::N,k
		
		N = 100
		
		x1 = linspace(0.0_wp,5.0_wp,N)
		x2 = linspace(0.0_wp,5.0_wp,N/4)
		
		allocate(y(N))
		do k=1,N
			y(k) = linearInterp(x1(k),x2,2.0_wp*x2)
		end do
		
		results(1) = norm2(y-2.0_wp*x1)<1.0E-10_wp
		
		if( .not.all(results) ) error stop "Failed linearInterp check"
	end subroutine testLinearInterp

	subroutine testTDMA
		!! Test TDMA to verify operation
		
		real(wp),dimension(:,:),allocatable::A
		real(wp),dimension(:),allocatable::b,x,xt
		
		integer::N,k
		
		N = 10
		
		allocate( A(N,-1:+1) , x(N) , b(N) )
		xt = linspace(0.0_wp,1.0_wp,N)
		
		A(1,-1:+1) = [0.0_wp,1.0_wp,0.0_wp]
		b(   1   ) = 0.0_wp
		
		do k=2,N-1
			A(k,-1) =  1.0_wp
			A(k, 0) = -2.0_wp
			A(k,+1) =  1.0_wp
			b(  k ) =  0.0_wp
		end do
		
		A(N,-1:+1) = [0.0_wp,1.0_wp,0.0_wp]
		b(   N   ) = 1.0_wp
		
		x = TDMA(A,b)
		
		do k=1,N
			write(*,*) xt(k),x(k)
		end do
		
		write(*,*) norm2(xt-x)
	end subroutine testTDMA

	subroutine testLU
		!! Test solveLU to verify operation
		
		real(wp),dimension(:,:),allocatable::A
		real(wp),dimension(:),allocatable::x,b,bc
		integer::N
		
		do N=2,100
			if(allocated(A)) deallocate(A)
			if(allocated(b)) deallocate(b)
			
			allocate( A(N,N) , b(N) )
			
			call random_number(A)
			call random_number(b)
			
			x  = solveLU(A,b)
			bc = matmul(A,x)
			
			if( norm2(bc-b)>1.0E-10_wp ) stop 'solveLU Failed'
		end do
	end subroutine testLU

end program testArray_prg