Line data Source code
1 : !!****m* ABINIT/m_builtin_tests
2 : !! NAME
3 : !! m_builtin_tests
4 : !!
5 : !! FUNCTION
6 : !!
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 1998-2026 ABINIT group (DCA,XG,GMR)
10 : !! This file is distributed under the terms of the
11 : !! GNU General Public License, see ~abinit/COPYING
12 : !! or http://www.gnu.org/copyleft/gpl.txt .
13 : !!
14 : !! SOURCE
15 :
16 : #if defined HAVE_CONFIG_H
17 : #include "config.h"
18 : #endif
19 :
20 : #include "abi_common.h"
21 :
22 : module m_builtin_tests
23 :
24 : use defs_basis
25 : use m_errors
26 : use m_abicore
27 :
28 : use m_io_tools, only : open_file
29 :
30 : implicit none
31 :
32 : private
33 : !!***
34 :
35 : public :: testfi
36 : !!***
37 :
38 : contains
39 : !!***
40 :
41 : !!****f* ABINIT/testfi
42 : !!
43 : !! NAME
44 : !! testfi
45 : !!
46 : !! FUNCTION
47 : !! Routine "Final test" for generation of the test report in the status file:
48 : !! if it appears that the run was a "Built-in Test", then
49 : !! compare the final values of different quantities to the reference
50 : !! values, here hard-coded.
51 : !!
52 : !! INPUTS
53 : !! builtintest=number of the builtintest, from the input file.
54 : !! etotal=total energy (sum of 7 contributions) (hartree)
55 : !! filstat=name of the status file
56 : !! gred(3,natom)=symmetrized gradient of etotal with respect to tn
57 : !! natom=number of atoms in cell.
58 : !! strten(6)=components of the stress tensor (hartree/bohr^3)
59 : !! xred(3,natom)=reduced atomic coordinates
60 : !!
61 : !! OUTPUT
62 : !! (only writing)
63 : !!
64 : !! SOURCE
65 :
66 12 : subroutine testfi(builtintest,etotal,filstat,gred,natom,strten,xred)
67 :
68 : !Arguments ------------------------------------
69 : !scalars
70 : integer,intent(in) :: builtintest,natom
71 : real(dp),intent(in) :: etotal
72 : character(len=fnlen),intent(in) :: filstat
73 : !arrays
74 : real(dp),intent(in) :: gred(3,natom),strten(6),xred(3,natom)
75 :
76 : !Local variables-------------------------------
77 : character(len=fnlen) :: testname(7)=' '
78 : character(len=*), parameter :: format01000="(a,d22.14,a,d12.4)"
79 : character(len=500) :: msg
80 : !scalars
81 : integer,parameter :: mtest=7
82 : integer :: iatom,ii,problem,tok,temp_unit
83 : real(dp) :: etot_mxdev,etot_ref,gred_mxdev,strten_mxdev,xred_mxdev
84 : !arrays
85 : integer,parameter :: natom_test(mtest)=(/2,1,2,1,1,1,2/)
86 : real(dp) :: gred_ref(3,2),strten_ref(6),xred_ref(3,2)
87 :
88 : ! ***********************************************************************
89 :
90 12 : testname(1)='fast'
91 12 : testname(2)='v1'
92 12 : testname(3)='v5'
93 12 : testname(4)='bigdft'
94 12 : testname(5)='etsf_io'
95 12 : testname(6)='libxc'
96 12 : testname(7)='wannier90'
97 :
98 : !---------------------------------------------------------
99 :
100 : !Now, open the status file, and either delete it, or produce a report
101 12 : if (open_file(filstat,msg,newunit=temp_unit,form='formatted',status='unknown') /= 0) then
102 0 : ABI_ERROR(msg)
103 : end if
104 :
105 12 : if(builtintest==0)then
106 :
107 0 : close (temp_unit,status='delete')
108 :
109 : else
110 :
111 : ! Note: all processors have their own file, so no special attention must be paid to the parallel case.
112 12 : write(temp_unit,*)
113 12 : write(temp_unit,*)'Status file, reporting on built-in test ',trim(testname(builtintest))
114 12 : write(temp_unit,*)
115 :
116 : ! Define reference values, as well as maximum tolerable deviation
117 : if(builtintest==1)then
118 :
119 2 : etot_ref=-1.05814441948188d+00
120 2 : etot_mxdev=1.0d-9
121 8 : xred_ref(1:3,1)=(/ -0.65048430042634D-01 , 0.0_dp , 0.0_dp /)
122 8 : xred_ref(1:3,2)=(/ 0.65048430042634D-01 , 0.0_dp , 0.0_dp /)
123 : ! xred(*,*) are reduced coordinates
124 2 : xred_mxdev=1.0d-6
125 2 : gred_ref(1:3,1:2)= 0.0_dp
126 : ! gred(*,*) are gradients with respect to reduced coordinates
127 2 : gred_mxdev=5.0d-4
128 : strten_ref(1:6)=(/ 0.149D-04 , 0.560D-04 , 0.560D-04 ,&
129 2 : & 0.0_dp , 0.0_dp , 0.0_dp /)
130 2 : strten_mxdev=1.0d-5
131 :
132 : else if(builtintest==2)then
133 :
134 : ! This value of etot is accurate to about 1.0d-12
135 2 : etot_ref=-.70811958266295D+02
136 : ! Initialisation conditions might give fluctuations
137 2 : etot_mxdev=3.0d-7
138 8 : xred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
139 2 : xred_mxdev=1.0d-12
140 8 : gred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
141 2 : gred_mxdev=1.0d-12
142 : ! This value of strten is accurate to at least 1.0d-8
143 8 : strten_ref(1:3)= 5.09324870E-03
144 8 : strten_ref(4:6)= 0.0_dp
145 2 : strten_mxdev=1.0d-6
146 :
147 : else if(builtintest==3)then
148 :
149 2 : etot_ref=-.892746696311772D+01
150 2 : etot_mxdev=1.0d-8
151 8 : xred_ref(1:3,1)=(/ -0.125_dp , 0.0_dp , 0.0_dp /)
152 8 : xred_ref(1:3,2)=(/ 0.125_dp , 0.0_dp , 0.0_dp /)
153 2 : xred_mxdev=1.0d-12
154 8 : gred_ref(1:3,1)=(/ -.140263620278D+00 , 0.0_dp , 0.0_dp /)
155 8 : gred_ref(1:3,2)=(/ .140013483725D+00 , 0.0_dp , 0.0_dp /)
156 2 : gred_mxdev=1.0d-3
157 2 : strten_ref(1:6)=(/ 1.3949d-3 , 1.3643d-3 , 1.3643d-3 ,.0_dp , .0_dp , .0_dp /)
158 2 : strten_mxdev=1.0d-5
159 :
160 : ! Bigdft
161 : else if(builtintest==4)then
162 :
163 : ! This value of etot is accurate to about 1.0d-12
164 0 : etot_ref=-0.56231990141D+00
165 : ! Initialisation conditions might give fluctuations
166 0 : etot_mxdev=3.0d-7
167 0 : xred_ref(1:3,1)=(/ 0.5_dp , 0.5_dp , 0.5_dp /)
168 0 : xred_mxdev=1.0d-12
169 0 : gred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
170 0 : gred_mxdev=1.0d-12
171 0 : strten_ref(1)=-0.22537238382D-01
172 0 : strten_ref(2)=-0.22536232141D-01
173 0 : strten_ref(3)=-0.22529038043D-01
174 0 : strten_ref(4)= 0.39104928264D-06
175 0 : strten_ref(5)= 0.62823846408D-06
176 0 : strten_ref(6)= 0.38414125548E-09
177 0 : strten_mxdev=1.0d-7
178 :
179 : ! ETSF_IO
180 : else if(builtintest==5)then
181 :
182 : ! This value of etot is accurate to about 1.0d-12
183 2 : etot_ref=-0.33307825915795D+02
184 : ! Initialisation conditions might give fluctuations
185 2 : etot_mxdev=3.0d-7
186 8 : xred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
187 2 : xred_mxdev=1.0d-12
188 8 : gred_ref(1:3,1)=(/ 0.0_dp , -0.000000120877_dp , -0.000000164287_dp /)
189 2 : gred_mxdev=1.0d-7
190 : ! This value of strten is accurate to at least 1.0d-8
191 2 : strten_ref(1)= 0.13569940015175D-01
192 2 : strten_ref(2)= 0.33822108610352D-01
193 2 : strten_ref(3)= 0.37991262607028D-01
194 8 : strten_ref(4:6)= 0.0_dp
195 2 : strten_mxdev=1.0d-6
196 :
197 : ! LibXC
198 : else if(builtintest==6)then
199 :
200 : ! etot_ref=-0.55196688523897D+01
201 2 : etot_ref=-0.55198762022478D+01
202 2 : etot_mxdev=5.0d-7
203 8 : xred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
204 2 : xred_mxdev=1.0d-12
205 8 : gred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
206 2 : gred_mxdev=1.0d-12
207 : ! strten_ref(1:3)= 0.13246699375127D-04
208 8 : strten_ref(1:3)= 8.73600436E-06
209 8 : strten_ref(4:6)= 0.0_dp
210 2 : strten_mxdev=1.0d-8
211 :
212 : ! Wannier90
213 : else if(builtintest==7)then
214 :
215 : ! This value of etot is accurate to about 1.0d-12
216 2 : etot_ref=-0.10620085133544D+02
217 : ! Initialisation conditions might give fluctuations
218 2 : etot_mxdev=3.0d-7
219 8 : xred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
220 8 : xred_ref(1:3,2)=(/ 0.25_dp , 0.25_dp , 0.25_dp /)
221 2 : xred_mxdev=1.0d-12
222 8 : gred_ref(1:3,1)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
223 8 : gred_ref(1:3,2)=(/ 0.0_dp , 0.0_dp , 0.0_dp /)
224 2 : gred_mxdev=1.0d-12
225 : ! This value of strten is accurate to at least 1.0d-8
226 8 : strten_ref(1:3)=0.31413922197317D-03
227 8 : strten_ref(4:6)= 0.0_dp
228 2 : strten_mxdev=1.0d-6
229 :
230 : ! End of the reference value set up, for different tests
231 : end if
232 :
233 : ! Compare reference and actual values
234 :
235 12 : problem=0
236 :
237 : ! Take care of total energy
238 12 : if(abs(etot_ref-etotal)>etot_mxdev)then
239 0 : problem=1
240 0 : write(temp_unit,'(a)')' Error for total energy : '
241 0 : write(temp_unit,format01000)' expected ',etot_ref,' with maximum deviation',etot_mxdev
242 0 : write(temp_unit,format01000)' computed ',etotal,' with effective deviation',abs(etotal-etot_ref)
243 : end if
244 :
245 : ! Take care of nuclei positions
246 12 : tok=1
247 30 : do iatom=1,natom
248 84 : do ii=1,3
249 72 : if(abs(xred_ref(ii,iatom)-xred(ii,iatom))>xred_mxdev)then
250 0 : tok=0
251 0 : write(temp_unit, '(a,i1,a,i1,a)' )' Error for nuclei position xred(',ii,',',iatom,')'
252 0 : write(temp_unit,format01000)' expected ',xred_ref(ii,iatom),' with maximum deviation',xred_mxdev
253 0 : write(temp_unit,format01000)' computed ',xred(ii,iatom),' with effective deviation',&
254 0 : & abs( xred(ii,iatom)-xred_ref(ii,iatom) )
255 : end if
256 : end do
257 : end do
258 12 : if(tok==0)problem=1
259 :
260 : ! Take care of forces
261 12 : tok=1
262 30 : do iatom=1,natom
263 84 : do ii=1,3
264 54 : if(abs(gred_ref(ii,iatom)-gred(ii,iatom))&
265 18 : & >gred_mxdev)then
266 0 : tok=0
267 0 : write(temp_unit, '(a,i1,a,i1,a)' )' Error for gradients gred(',ii,',',iatom,')'
268 0 : write(temp_unit,format01000)' expected ',gred_ref(ii,iatom),' with maximum deviation',gred_mxdev
269 0 : write(temp_unit,format01000)' computed ',gred(ii,iatom),' with effective deviation',&
270 0 : & abs( gred(ii,iatom)-gred_ref(ii,iatom) )
271 : end if
272 : end do
273 : end do
274 12 : if(tok==0)problem=1
275 :
276 : ! Take care of stress
277 12 : tok=1
278 84 : do ii=1,6
279 84 : if(abs(strten_ref(ii)-strten(ii))>strten_mxdev)then
280 0 : tok=0
281 0 : write(temp_unit,'(a,i1,a)')' Error for stress strten(',ii,')'
282 0 : write(temp_unit,format01000)' expected ',strten_ref(ii),' with maximum deviation',strten_mxdev
283 0 : write(temp_unit,format01000)' computed ',strten(ii),' with effective deviation',&
284 0 : & abs( strten(ii)-strten_ref(ii) )
285 : end if
286 : end do
287 12 : if(tok==0)problem=1
288 :
289 12 : if(problem==0)then
290 12 : write(temp_unit,'(a)')' ==> The run finished cleanly.'
291 12 : write(temp_unit,'(a,a)')' Moreover, comparison of the total energy, and other (few) ',&
292 24 : & 'relevant quantities with reference values has been successful.'
293 12 : write(temp_unit,'(a)')' This does not mean that no problem is present, however. '
294 12 : write(temp_unit,'(a)')' Please run the complete set of ABINIT tests to gain a better confidence in your installation.'
295 : end if
296 :
297 12 : write(temp_unit,*)
298 :
299 12 : close(temp_unit)
300 :
301 : end if ! End of the choice between produce a report, and produce no report
302 :
303 12 : end subroutine testfi
304 : !!***
305 :
306 : end module m_builtin_tests
307 : !!***
|