Line data Source code
1 : !!****m* ABINIT/m_init10
2 : !! NAME
3 : !! m_init10
4 : !!
5 : !! FUNCTION
6 : !! It should be "contained" in multibinit but abilint does not accept "contains" in programs.
7 : !!
8 : !! COPYRIGHT
9 : !! Copyright (C) 2008-2026 ABINIT group ()
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_init10
23 :
24 : use defs_basis
25 : use m_errors
26 : use m_abicore
27 : use m_fstrings, only : int2char4, rmquotes, sjoin, strcat, basename
28 : use m_multibinit_dataset, only: multibinit_dtset_type
29 :
30 : implicit none
31 :
32 : private
33 : !!***
34 :
35 : public :: init10
36 : public :: postfix_fnames
37 : !!***
38 :
39 : contains
40 : !!***
41 :
42 :
43 : !!****f* ABINIT/init10
44 : !!
45 : !! NAME
46 : !! init10
47 : !!
48 : !! FUNCTION
49 : !! Initialize the code multibinit: write heading and make the first i/os
50 : !!
51 : !! INPUTS
52 : !! character(len=fnlen) input_path: gives the name of the input file.
53 : !! If not given, the files file are then used with a deprecation message.
54 : !! OUTPUT
55 : !! character(len=fnlen) filnam(18)=character strings giving file names
56 : !!
57 : !! NOTES
58 : !! 1. Should be executed by one processor only.
59 : !! 2. File names refer to following files, in order:
60 : !! (1) Formatted input file
61 : !! (2) Formatted output file
62 : !! (3) Input for reference structure and harmonic part (DDB file or XML)
63 : !! (4) Input for XML with polynomial coefficients (DDB file)
64 : !! (5) Input for HIST Training-Set file (netcdf .nc format)
65 : !! (6) Input for HIST Test-Set file (netcdf .nc format)
66 : !! (7-18) Input Derivative Database (XML format)
67 : !!
68 : !! SOURCE
69 :
70 73 : subroutine init10(input_path, filnam,comm)
71 :
72 : use defs_basis
73 : use m_xmpi
74 : use m_errors
75 :
76 : use m_fstrings, only : int2char4
77 : use m_io_tools, only : open_file
78 :
79 : !Arguments -------------------------------
80 : !scalars
81 : integer,intent(in) :: comm
82 : character(len=fnlen), intent(in) :: input_path
83 : !arrays
84 : character(len=fnlen),intent(out) :: filnam(18)
85 :
86 : !Local variables--------------------------
87 : !scalars
88 : integer,parameter :: master=0
89 : integer :: me,nproc,ierr
90 : integer :: ii,io, i1, i2
91 :
92 : character(len=fnlen) :: fname
93 : ! *********************************************************************
94 :
95 : !Determine who I am in comm
96 73 : me = xmpi_comm_rank(comm)
97 73 : nproc = xmpi_comm_size(comm)
98 :
99 1387 : filnam(:) = ""
100 :
101 73 : if (me==master)then
102 49 : if (len_trim(input_path) == 0) then
103 : ! Legacy Files file mode.
104 0 : write(std_out, "(2a)")" DeprecationWarning: ",ch10
105 0 : write(std_out, "(a)") " The files file has been deprecated in Abinit9 and will be removed in Abinit10."
106 0 : write(std_out, "(a)")" Use the syntax `multibinit t01.abi` where t01.abi is an input."
107 : !Read the file names
108 0 : write(std_out,*)' Give name for formatted input file : '
109 0 : read(std_in, '(a)',IOSTAT=io) filnam(1)
110 0 : write(std_out,'(a,a)' )'- ',trim(filnam(1))
111 0 : write(std_out,*)' Give name for formatted output file : '
112 0 : read(std_in, '(a)',IOSTAT=io) filnam(2)
113 0 : write(std_out,'(a,a)' )'- ',trim(filnam(2))
114 0 : write(std_out,*)' Give name for input derivative database of reference structure',&
115 0 : & ' (DDB or XML file): '
116 0 : read(std_in, '(a)',IOSTAT=io) filnam(3)
117 0 : write(std_out,'(a,a)' )'- ',trim(filnam(3))
118 0 : write(std_out,*)' Give name for input coefficients from fitted polynomial',&
119 0 : & ' (XML file or enter no): '
120 0 : read(std_in, '(a)',IOSTAT=io) filnam(4)
121 0 : write(std_out,'(a,a)' )'- ',trim(filnam(4))
122 0 : write(std_out,*)' Give name for training-set file',&
123 0 : & ' (netcdf file or enter no): '
124 0 : read(std_in, '(a)',IOSTAT=io) filnam(5)
125 0 : write(std_out,'(a,a)' )'- ',trim(filnam(5))
126 0 : write(std_out,*)' Give name for test-set file',&
127 0 : & ' (netcdf file or enter no): '
128 0 : read(std_in, '(a)',IOSTAT=io) filnam(6)
129 0 : write(std_out,'(a,a)' )'- ',trim(filnam(6))
130 0 : ii = 7
131 0 : do while (io>=0 .and. ii<19)
132 0 : write(std_out,*)' Give name for input derivative database (DDB or XML file): '
133 0 : read(std_in, '(a)',IOSTAT=io) filnam(ii)
134 0 : write(std_out,'(a,a)' )'- ',trim(filnam(ii))
135 0 : if(trim(filnam(ii))==" ") exit
136 0 : ii = ii + 1
137 : end do
138 : else
139 49 : filnam(1)=input_path
140 49 : filnam(2) = trim(input_path)//".abo"
141 :
142 49 : fname = basename(input_path)
143 49 : i1 = index(fname, ".")
144 49 : if (i1 > 1) then
145 49 : i2 = index(input_path, ".", back=.True.)
146 49 : filnam(2) = input_path(:i2) // "abo"
147 : ! The rest filnam(3:) are set after reading from input file.
148 : ! as in postfix_filenames subroutine
149 : end if
150 : end if
151 : end if
152 :
153 :
154 : !Communicate filenames to all processors
155 73 : call xmpi_bcast (filnam, master, comm, ierr)
156 :
157 73 : end subroutine init10
158 : !!***
159 :
160 :
161 :
162 : !===============================================================
163 : ! Change the extension of a filename. e.g. run.abo -> run_hist.nc
164 : !> @ fname: the old fname
165 : !> @ new_ext: the new extension. e.g. .nc or _hist.nc
166 : !===============================================================
167 : function change_extension(fname, new_ext) result (ret)
168 : character(len=fnlen), intent(in) :: fname, new_ext
169 : character(len=fnlen) :: tmp_fname
170 : character(len=fnlen) :: ret
171 : integer :: i1, i2
172 : tmp_fname=basename(fname)
173 : i1 = index(tmp_fname, ".")
174 : if (i1 > 1) then
175 : i2 = index(fname, ".", back=.True.)
176 : ret = fname(:i2) // trim(new_ext)
177 : end if
178 : end function change_extension
179 :
180 : !===============================================================
181 : ! Sync the filename info from files file and from input file
182 : !> @ input_path: input file
183 : !> @ filnam : the filenames from files file
184 : !> @ params: data read from inputfile
185 : !===============================================================
186 73 : subroutine postfix_fnames(input_path, filnam, params)
187 : ! TODO: hexu: Once the files file is to be fully removed, remove the filnam variable.
188 : character(len=fnlen), intent(inout) :: input_path, filnam(18)
189 : type(multibinit_dtset_type), intent(inout) :: params
190 : ! if using files file, set the params%*_fname according to filnam
191 : integer :: i
192 73 : if (len_trim(input_path)==0) then
193 0 : if (len_trim(params%spin_pot_fname)==0) params%spin_pot_fname=filnam(3)
194 0 : if (len_trim(params%latt_pot_fname)==0) params%latt_pot_fname=filnam(3)
195 0 : if (len_trim(params%slc_pot_fname)==0) params%slc_pot_fname=filnam(3)
196 : ! TODO lattice model
197 0 : if (len_trim(params%latt_harm_pot_fname)==0) params%latt_harm_pot_fname=filnam(3)
198 0 : if (len_trim(params%latt_anharm_pot_fname)==0) params%latt_anharm_pot_fname=filnam(4)
199 0 : if (len_trim(params%latt_training_set_fname)==0) params%latt_training_set_fname=filnam(5)
200 0 : if (len_trim(params%latt_test_set_fname)==0) params%latt_test_set_fname=filnam(6)
201 0 : do i=1, 12
202 0 : if (len_trim(params%latt_ddb_fnames(i))==0) params%latt_ddb_fnames(i)=filnam(6+i)
203 : end do
204 : else
205 73 : filnam(2)=params%outdata_prefix
206 73 : if(len_trim(params%latt_pot_fname) > 0) then
207 5 : filnam(3)=params%latt_pot_fname
208 68 : else if(len_trim(params%latt_harm_pot_fname) > 0) then
209 67 : filnam(3)=params%latt_harm_pot_fname
210 : else
211 1 : filnam(3)=''
212 : endif
213 73 : filnam(4)=params%latt_anharm_pot_fname
214 73 : filnam(5)=params%latt_training_set_fname
215 73 : filnam(6)=params%latt_test_set_fname
216 949 : do i=1, 12
217 949 : filnam(i+6)=params%latt_ddb_fnames(i)
218 : end do
219 : end if
220 :
221 73 : end subroutine postfix_fnames
222 :
223 :
224 :
225 : end module m_init10
226 : !!***
|