The Elk Code
testcheck.f90
Go to the documentation of this file.
1 
2 ! Copyright (C) 2009 J. K. Dewhurst, S. Sharma and E. K. U. Gross
3 ! This file is distributed under the terms of the GNU Lesser General Public
4 ! License. See the file COPYING for license details.
5 
6 subroutine testcheck
7 implicit none
8 ! local variables
9 logical exist
10 integer i,j,k,n
11 integer nv_,nv,vt_,vt,iv_,iv
12 real(8) rv_,rv,a,b
13 real(8) tol,t1,t2
14 complex(8) zv_,zv
15 character(256) fname_,fname,descr
16 n=0
17 do i=0,999
18  write(fname_,'("TEST_",I3.3,".OUT_")') i
19  inquire(file=trim(fname_),exist=exist)
20  if (exist) then
21  write(fname,'("TEST_",I3.3,".OUT")') i
22  inquire(file=trim(fname),exist=exist)
23  if (.not.exist) then
24  write(*,*)
25  write(*,'("Error(testcheck): file ",A," does not exist")') trim(fname)
26  write(*,*)
27  error stop
28  end if
29  open(91,file=trim(fname_),form='FORMATTED')
30  open(92,file=trim(fname),form='FORMATTED')
31  read(91,*,err=10) descr
32  read(92,*,err=20) descr
33  read(91,*,err=10) vt_,nv_
34  read(92,*,err=20) vt,nv
35  if (vt_ /= vt) then
36  write(*,*)
37  write(*,'("Error(testcheck): differing variable type")')
38  write(*,'(" for quantity ''",A,"''")') trim(descr)
39  write(*,'(" ",A," : ",I8)') trim(fname_),vt_
40  write(*,'(" ",A," : ",I8)') trim(fname),vt
41  write(*,*)
42  error stop
43  end if
44  if (nv_ /= nv) then
45  write(*,*)
46  write(*,'("Error(testcheck): differing number of variables")')
47  write(*,'(" for quantity ''",A,"''")') trim(descr)
48  write(*,'(" ",A," : ",I8)') trim(fname_),nv_
49  write(*,'(" ",A," : ",I8)') trim(fname),nv
50  write(*,*)
51  error stop
52  end if
53  if (nv < 1) then
54  write(*,*)
55  write(*,'("Error(testcheck): nv < 1 : ",I8)') nv
56  write(*,*)
57  error stop
58  end if
59  if (vt == 1) then
60 ! integer variables
61  do j=1,nv
62  read(91,*,err=10) k,iv_
63  if (j /= k) goto 10
64  read(92,*,err=20) k,iv
65  if (j /= k) goto 20
66  if (iv /= iv_) then
67  write(*,*)
68  write(*,'("Error(testcheck): variable ",I8," is different")') j
69  write(*,'(" for quantity ''",A,"''")') trim(descr)
70  write(*,'(" ",A," : ",I8)') trim(fname_),iv_
71  write(*,'(" ",A," : ",I8)') trim(fname),iv
72  write(*,*)
73  error stop
74  end if
75  end do
76  else if (vt == 2) then
77 ! real variables
78  read(91,*,err=10) tol
79  read(92,*,err=20) tol
80  do j=1,nv
81  read(91,*,err=10) k,rv_
82  if (j /= k) goto 10
83  read(92,*,err=20) k,rv
84  if (j /= k) goto 20
85  t1=abs(rv_-rv)
86  t2=abs(rv_)*tol
87  if ((t1 > t2).and.(abs(rv_) > 1.d-4)) then
88  write(*,*)
89  write(*,'("Error(testcheck): variable ",I8," outside tolerance")') j
90  write(*,'(" for quantity ''",A,"''")') trim(descr)
91  write(*,'(" ",A," (correct value)",T40," : ",G24.14)') trim(fname_), &
92  rv_
93  write(*,'(" ",A,T40," : ",G24.14)') trim(fname),rv
94  write(*,'(" absolute difference",T40," : ",G24.14)') t1
95  write(*,'(" required relative tolerance",T40," : ",G24.14)') tol
96  write(*,'(" required absolute tolerance",T40," : ",G24.14)') t2
97  write(*,*)
98  error stop
99  end if
100  end do
101  else if (vt == 3) then
102 ! complex variables
103  read(91,*,err=10) tol
104  read(92,*,err=20) tol
105  do j=1,nv
106  read(91,*,err=10) k,a,b
107  zv_=cmplx(a,b,8)
108  if (j /= k) goto 10
109  read(92,*,err=20) k,a,b
110  zv=cmplx(a,b,8)
111  if (j /= k) goto 20
112  t1=abs(zv_-zv)
113  t2=abs(zv_)*tol
114  if ((t1 > t2).and.(abs(zv_) > 1.d-4)) then
115  write(*,*)
116  write(*,'("Error(testcheck): variable ",I8," outside tolerance")') j
117  write(*,'(" for quantity ''",A,"''")') trim(descr)
118  write(*,'(" ",A," (correct value)",T40," : ",2G24.14)') &
119  trim(fname_),zv_
120  write(*,'(" ",A,T40," : ",2G24.14)') trim(fname),zv
121  write(*,'(" difference",T40," : ",G24.14)') t1
122  write(*,'(" required relative tolerance",T40," : ",G24.14)') tol
123  write(*,'(" required absolute tolerance",T40," : ",G24.14)') t2
124  write(*,*)
125  error stop
126  end if
127  end do
128  else
129  write(*,*)
130  write(*,'("Error(testcheck): variable type not defined : ",I8)') vt
131  write(*,*)
132  error stop
133  end if
134  close(91)
135  close(92)
136  n=n+1
137  end if
138 end do
139 if (n == 0) then
140  write(*,*)
141  write(*,'("Warning(testcheck): no tests found")')
142 else
143  write(*,*)
144  write(*,'("Info(testcheck): passed all tests")')
145 end if
146 return
147 10 continue
148 write(*,*)
149 write(*,'("Error(testcheck): error reading from ",A)') trim(fname_)
150 write(*,*)
151 error stop
152 20 continue
153 write(*,*)
154 write(*,'("Error(testcheck): error reading from ",A)') trim(fname)
155 write(*,*)
156 error stop
157 end subroutine
158 
subroutine testcheck
Definition: testcheck.f90:7