Branch data Line data Source code
1 : : !!****m* ABINIT/m_band2eps_dataset
2 : : !! NAME
3 : : !! m_band2eps_dataset
4 : : !!
5 : : !! FUNCTION
6 : : !!
7 : : !! COPYRIGHT
8 : : !! Copyright (C) 2014-2026 ABINIT group (XG,JCC,CL,MVeithen,XW,MJV)
9 : : !! This file is distributed under the terms of the
10 : : !! GNU General Public License, see ~abinit/COPYING
11 : : !! or http://www.gnu.org/copyleft/gpl.txt .
12 : : !!
13 : : !! SOURCE
14 : :
15 : : #if defined HAVE_CONFIG_H
16 : : #include "config.h"
17 : : #endif
18 : :
19 : : #include "abi_common.h"
20 : :
21 : : module m_band2eps_dataset
22 : :
23 : : use defs_basis
24 : : use m_abicore
25 : : use m_errors
26 : :
27 : : use m_parser, only : intagm
28 : :
29 : : implicit none
30 : :
31 : : private
32 : :
33 : : public :: band2eps_dataset_type
34 : : public :: band2eps_dtset_free
35 : : public :: outvars_band2eps
36 : : public :: invars11
37 : : !!***
38 : :
39 : : !----------------------------------------------------------------------
40 : :
41 : : !!****t* m_band2eps_dataset/band2eps_dataset_type
42 : : !! NAME
43 : : !! band2eps_dataset_type
44 : : !!
45 : : !! FUNCTION
46 : : !! The band2eps_dataset_type structured datatype
47 : : !! gather all the input variables for the band2eps code.
48 : : !!
49 : : !! SOURCE
50 : :
51 : : type band2eps_dataset_type
52 : :
53 : : ! Variables should be declared on separated lines in order to reduce the occurence of git conflicts.
54 : : ! Since all these input variables are described in the band2eps_help.html
55 : : ! file, they are not described in length here ...
56 : : ! Integer
57 : : integer :: natom
58 : : integer :: cunit
59 : : integer :: nlines
60 : : integer :: ngrad
61 : : integer :: prtout
62 : : real(dp) :: min
63 : : real(dp) :: max
64 : :
65 : :
66 : : integer,allocatable :: nqline(:)
67 : : ! nqline(nlines)
68 : :
69 : : real(dp),allocatable :: scale(:)
70 : : ! scale(nlines)
71 : :
72 : : integer,allocatable :: red(:)
73 : : ! red(natom)
74 : :
75 : : integer,allocatable :: blue(:)
76 : : ! blue(natom)
77 : :
78 : : integer,allocatable :: green(:)
79 : : ! green(natom)
80 : :
81 : : character(len=6),allocatable :: qpoint_name(:)
82 : : ! qpoint_name(nlines+1)
83 : :
84 : :
85 : : end type band2eps_dataset_type
86 : : !!***
87 : :
88 : : contains
89 : : !!***
90 : :
91 : : !!****f* m_band2eps_dataset/band2eps_dtset_free
92 : : !!
93 : : !! NAME
94 : : !! band2eps_dtset_free
95 : : !!
96 : : !! FUNCTION
97 : : !! deallocate remaining arrays in the band2eps_dtset datastructure
98 : : !!
99 : : !! INPUTS
100 : : !! band2eps_dtset = band2eps datastructure
101 : : !!
102 : : !! NOTES
103 : : !!
104 : : !! SOURCE
105 : :
106 : 2 : subroutine band2eps_dtset_free(band2eps_dtset)
107 : :
108 : : !Arguments ------------------------------------
109 : : !scalars
110 : : type(band2eps_dataset_type), intent(inout) :: band2eps_dtset
111 : :
112 : : ! *************************************************************************
113 : :
114 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%nqline)
115 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%scale)
116 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%red)
117 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%blue)
118 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%green)
119 [ + - ]: 2 : ABI_SFREE(band2eps_dtset%qpoint_name)
120 : :
121 : 2 : end subroutine band2eps_dtset_free
122 : : !!***
123 : :
124 : : !----------------------------------------------------------------------
125 : :
126 : : !!****f* m_band2eps_dataset/invars11
127 : : !!
128 : : !! NAME
129 : : !! invars11
130 : : !!
131 : : !! FUNCTION
132 : : !! Open input file for the band2eps code, then reads or echoes the input information.
133 : : !!
134 : : !! INPUTS
135 : : !! lenstr=actual length of string
136 : : !! natom=number of atoms, needed for atifc
137 : : !! string*(*)=string of characters containing all input variables and data
138 : : !!
139 : : !! OUTPUT
140 : : !! band2eps_dtset= (derived datatype) contains all the input variables
141 : : !!
142 : : !! NOTES
143 : : !! Should be executed by one processor only.
144 : : !!
145 : : !!
146 : : !! SOURCE
147 : :
148 : 2 : subroutine invars11 (band2eps_dtset,lenstr,string)
149 : :
150 : : !Arguments -------------------------------
151 : : !scalars
152 : : integer,intent(in) :: lenstr
153 : : character(len=strlen),intent(in) :: string
154 : : type(band2eps_dataset_type),intent(inout) :: band2eps_dtset
155 : :
156 : : !Local variables -------------------------
157 : : !Dummy arguments for subroutine 'intagm' to parse input file
158 : : !Set routine version number here:
159 : : !scalars
160 : : integer :: ii,position,jdtset,marr,tread
161 : : character(len=500) :: message
162 : : character(len=fnlen) :: name_qpoint
163 : : !arrays
164 : 2 : integer,allocatable :: intarr(:)
165 : 2 : real(dp),allocatable :: dprarr(:)
166 : :
167 : : !*********************************************************************
168 : 2 : marr=3
169 [ - + ]: 2 : ABI_MALLOC(intarr,(marr))
170 [ - + ]: 2 : ABI_MALLOC(dprarr,(marr))
171 : :
172 : 2 : jdtset=1
173 : :
174 : : ! Need to get the number of atom
175 : 2 : band2eps_dtset%natom = 0
176 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'natom',tread,'INT')
177 [ + - ]: 2 : if(tread==1) band2eps_dtset%natom=intarr(1)
178 [ - + ]: 2 : if (band2eps_dtset%natom <= tol10) then
179 : : write(message,'(a,I5,3a)' )&
180 : 0 : & 'natom ',band2eps_dtset%natom,', is not allowed ',ch10,&
181 : 0 : & 'Action: correct natom in your input file.'
182 : 0 : ABI_ERROR(message)
183 : : end if
184 : :
185 : : ! Need to get the number of lines
186 : 2 : band2eps_dtset%nlines = 0
187 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nlines',tread,'INT')
188 [ + - ]: 2 : if(tread==1) band2eps_dtset%nlines=intarr(1)
189 [ - + ]: 2 : if (band2eps_dtset%nlines <= tol10) then
190 : : write(message,'(a,I5,3a)' )&
191 : 0 : & 'nlines ',band2eps_dtset%nlines,', is not allowed ',ch10,&
192 : 0 : & 'Action: correct nlines in your input file.'
193 : 0 : ABI_ERROR(message)
194 : : end if
195 : :
196 : : ! Need to get the number of lines
197 : 2 : band2eps_dtset%cunit = 0
198 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cunit',tread,'INT')
199 [ + - ]: 2 : if(tread==1) band2eps_dtset%cunit=intarr(1)
200 [ - + ]: 2 : if (band2eps_dtset%cunit < 1 .or. band2eps_dtset%cunit > 2) then
201 : : write(message,'(a,I5,3a)' )&
202 : 0 : & 'cunit ',band2eps_dtset%cunit,', is not allowed ',ch10,&
203 : 0 : & 'Action: correct cunit in your input file (1 or 2).'
204 : 0 : ABI_ERROR(message)
205 : : end if
206 : :
207 : : ! Need to get the number of lines
208 : 2 : band2eps_dtset%ngrad = 0
209 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ngrad',tread,'INT')
210 [ + - ]: 2 : if(tread==1) band2eps_dtset%ngrad=intarr(1)
211 [ - + ]: 2 : if (band2eps_dtset%ngrad < 0) then
212 : : write(message,'(a,I5,3a)' )&
213 : 0 : & 'ngrad ',band2eps_dtset%ngrad,', is not allowed ',ch10,&
214 : 0 : & 'Action: correct ngrad in your input file (positive value).'
215 : 0 : ABI_ERROR(message)
216 : : end if
217 : :
218 : : ! Need to get the number of lines
219 : 2 : band2eps_dtset%min = zero
220 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'min',tread,'DPR')
221 [ + - ]: 2 : if(tread==1) band2eps_dtset%min=dprarr(1)
222 : :
223 : : ! Need to get the number of lines
224 : 2 : band2eps_dtset%max = zero
225 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'max',tread,'DPR')
226 [ + - ]: 2 : if(tread==1) band2eps_dtset%max=dprarr(1)
227 : :
228 [ - + + - : 6 : ABI_MALLOC(band2eps_dtset%red,(band2eps_dtset%natom))
+ - + - -
+ - + -
+ ]
229 [ - + + - : 4 : ABI_MALLOC(band2eps_dtset%blue,(band2eps_dtset%natom))
- + - + -
+ ]
230 [ - + + - : 4 : ABI_MALLOC(band2eps_dtset%green,(band2eps_dtset%natom))
- + - + -
+ ]
231 [ + + ]: 9 : band2eps_dtset%red(:) = 0
232 [ + + ]: 9 : band2eps_dtset%blue(:) = 0
233 [ + + ]: 9 : band2eps_dtset%green(:) = 0
234 : :
235 : : ! Read prtout
236 : 2 : band2eps_dtset%prtout = 0
237 : 2 : call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtout',tread,'INT')
238 [ - + ]: 2 : if(tread==1) band2eps_dtset%prtout=intarr(1)
239 [ - + ]: 2 : if (band2eps_dtset%prtout < 0 .or. band2eps_dtset%prtout > 1) then
240 : : write(message,'(a,I5,3a)' )&
241 : 0 : & 'prtout ',band2eps_dtset%prtout,', is not allowed ',ch10,&
242 : 0 : & 'Action: correct prtout in your input file (0 or 1).'
243 : 0 : ABI_ERROR(message)
244 : : end if
245 : :
246 : : !natom dimension
247 [ + + ]: 2 : if(band2eps_dtset%natom > marr)then
248 : 1 : marr = band2eps_dtset%natom
249 [ - + ]: 1 : ABI_FREE(intarr)
250 [ - + ]: 1 : ABI_FREE(dprarr)
251 [ - + + - : 3 : ABI_MALLOC(intarr,(marr))
+ - + - -
+ - + ]
252 [ - + + - : 3 : ABI_MALLOC(dprarr,(marr))
+ - + - -
+ - + ]
253 : : end if
254 : 2 : call intagm(dprarr,intarr,jdtset,marr,band2eps_dtset%natom,string(1:lenstr),'red',tread,'INT')
255 [ + - + + ]: 9 : if(tread==1) band2eps_dtset%red(1:band2eps_dtset%natom) = intarr(1:band2eps_dtset%natom)
256 : :
257 : 2 : call intagm(dprarr,intarr,jdtset,marr,band2eps_dtset%natom,string(1:lenstr),'blue',tread,'INT')
258 [ + - + + ]: 9 : if(tread==1) band2eps_dtset%blue(1:band2eps_dtset%natom) = intarr(1:band2eps_dtset%natom)
259 : :
260 : 2 : call intagm(dprarr,intarr,jdtset,marr,band2eps_dtset%natom,string(1:lenstr),'green',tread,'INT')
261 [ + - + + ]: 9 : if(tread==1) band2eps_dtset%green(1:band2eps_dtset%natom) = intarr(1:band2eps_dtset%natom)
262 : :
263 : : !nlines dimenstion
264 [ - + + - : 6 : ABI_MALLOC(band2eps_dtset%nqline,(band2eps_dtset%nlines))
+ - + - -
+ - + -
+ ]
265 [ - + + - : 6 : ABI_MALLOC(band2eps_dtset%scale,(band2eps_dtset%nlines))
+ - + - -
+ - + -
+ ]
266 [ + + ]: 13 : band2eps_dtset%nqline(:) = 0
267 [ + + ]: 13 : band2eps_dtset%scale(:) = zero
268 : :
269 [ + + ]: 2 : if(band2eps_dtset%nlines > marr)then
270 : 1 : marr = band2eps_dtset%nlines
271 [ - + ]: 1 : ABI_FREE(intarr)
272 [ - + ]: 1 : ABI_FREE(dprarr)
273 [ - + + - : 2 : ABI_MALLOC(intarr,(marr))
- + - + ]
274 [ - + + - : 2 : ABI_MALLOC(dprarr,(marr))
- + - + ]
275 : : end if
276 : :
277 : 2 : call intagm(dprarr,intarr,jdtset,marr,band2eps_dtset%nlines,string(1:lenstr),'nqline',tread,'INT')
278 [ + - + + ]: 13 : if(tread==1) band2eps_dtset%nqline(1:band2eps_dtset%nlines) = intarr(1:band2eps_dtset%nlines)
279 : : !REMOVE THE LAST LINE OF NQLINE
280 : 2 : band2eps_dtset%nqline(band2eps_dtset%nlines) = band2eps_dtset%nqline(band2eps_dtset%nlines) - 1
281 : :
282 : 2 : call intagm(dprarr,intarr,jdtset,marr,band2eps_dtset%nlines,string(1:lenstr),'scale',tread,'DPR')
283 [ + - + + ]: 13 : if(tread==1) band2eps_dtset%scale(1:band2eps_dtset%nlines) = dprarr(1:band2eps_dtset%nlines)
284 : :
285 : : !nline+1 dimension
286 [ + - - + : 6 : ABI_MALLOC(band2eps_dtset%qpoint_name,(band2eps_dtset%nlines+1))
+ - + - +
- - + - +
- + ]
287 [ + + ]: 15 : band2eps_dtset%qpoint_name(:) = ""
288 : 2 : position = index(string(1:lenstr),trim("QPOINT_NAME")) + 11
289 : : name_qpoint = trim(string(position:(position + &
290 [ + - ]: 2 : & len(band2eps_dtset%qpoint_name(1))*band2eps_dtset%nlines+1)))
291 [ + - + + ]: 15 : read(name_qpoint,*) (band2eps_dtset%qpoint_name(ii),ii=1,band2eps_dtset%nlines+1)
292 : :
293 [ + - + - ]: 2 : end subroutine invars11
294 : : !!***
295 : :
296 : : !----------------------------------------------------------------------
297 : :
298 : : !!****f* m_band2eps_dataset/outvars_band2eps
299 : : !!
300 : : !! NAME
301 : : !! outvars_band2eps
302 : : !!
303 : : !! FUNCTION
304 : : !! Open input file for the band2eps code, then
305 : : !! echoes the input information.
306 : : !!
307 : : !! INPUTS
308 : : !! band2eps_dtset= (derived datatype) contains all the input variables
309 : : !! nunit=unit number for input or output
310 : : !!
311 : : !! OUTPUT
312 : : !! (only writing)
313 : : !!
314 : : !! NOTES
315 : : !! Should be executed by one processor only.
316 : : !!
317 : : !! SOURCE
318 : :
319 : 0 : subroutine outvars_band2eps (band2eps_dtset,nunit)
320 : :
321 : : !Arguments -------------------------------
322 : : !scalars
323 : : integer,intent(in) :: nunit
324 : : type(band2eps_dataset_type),intent(in) :: band2eps_dtset
325 : :
326 : : !Local variables -------------------------
327 : : !Set routine version number here:
328 : : !scalars
329 : : integer :: ii
330 : :
331 : : !*********************************************************************
332 : :
333 : : !Write the heading
334 [ # # # # ]: 0 : write(nunit,'(80a,a)') ('=',ii=1,80),ch10
335 : : write(nunit, '(a,a)' )&
336 : 0 : & ' -outvars_band2eps: echo values of input variables ----------------------',ch10
337 : :
338 : : !The flags
339 [ # # ]: 0 : if(band2eps_dtset%natom/=0 )then
340 : 0 : write(nunit,'(a)')' Informations :'
341 : 0 : if(band2eps_dtset%natom/=0)write(nunit,'(3x,a9,3i10)')' natom',band2eps_dtset%natom
342 [ # # ]: 0 : if(band2eps_dtset%cunit/=0)write(nunit,'(3x,a9,3i10)')' cunit',band2eps_dtset%cunit
343 [ # # ]: 0 : if(band2eps_dtset%nlines/=0)write(nunit,'(3x,a9,3i10)')' nlines',band2eps_dtset%nlines
344 [ # # ]: 0 : if(band2eps_dtset%min/=0)write(nunit,'(3x,a9,3f12.4)')' Min',band2eps_dtset%min
345 [ # # ]: 0 : if(band2eps_dtset%max/=0)write(nunit,'(3x,a9,3f12.4)')' Max',band2eps_dtset%max
346 [ # # ]: 0 : if(band2eps_dtset%ngrad/=0)write(nunit,'(3x,a9,3i10)')' ngrad',band2eps_dtset%ngrad
347 [ # # # # ]: 0 : write(nunit,'(3x,a9,6i10)')' red',(band2eps_dtset%red(ii),ii=1,band2eps_dtset%natom)
348 [ # # # # ]: 0 : write(nunit,'(3x,a9,6i10)')' blue',(band2eps_dtset%blue(ii),ii=1,band2eps_dtset%natom)
349 [ # # # # ]: 0 : write(nunit,'(3x,a9,6i10)')' green',(band2eps_dtset%green(ii),ii=1,band2eps_dtset%natom)
350 [ # # # # ]: 0 : write(nunit,'(3x,a9,8i10)')' nqline',(band2eps_dtset%nqline(ii),ii=1,band2eps_dtset%nlines)
351 [ # # # # ]: 0 : write(nunit,'(3x,a9,8a)')' point',(band2eps_dtset%qpoint_name(ii),ii=1,band2eps_dtset%nlines+1)
352 : : end if
353 : :
354 [ # # # # ]: 0 : write(nunit,'(a,80a,a)') ch10,('=',ii=1,80),ch10
355 : :
356 : 0 : end subroutine outvars_band2eps
357 : : !!***
358 : :
359 : : !----------------------------------------------------------------------
360 : :
361 [ # # # # : 0 : end module m_band2eps_dataset
# # # # #
# # # # #
# # # # #
# # # #
# ]
362 : : !!***
|