14 module procedure read_parameters_from_file
15 module procedure read_parameters_from_unit
17 private :: read_parameters_from_file, read_parameters_from_unit
23 module procedure write_parameters_to_file
24 module procedure write_parameters_to_unit
26 private :: write_parameters_to_file, write_parameters_to_unit
29 module procedure write_int_param
30 module procedure write_double_param
31 module procedure write_logical_param
32 module procedure write_char_param
35 module procedure read_int_param
36 module procedure read_double_param
37 module procedure read_logical_param
38 module procedure read_char_param
43 subroutine write_parameters_to_file(filename)
45 character(len=*),
intent(in) :: filename
48 open(unit,file=filename,status=
'unknown',action=
'write')
49 call write_parameters_to_unit(unit)
51 end subroutine write_parameters_to_file
53 subroutine write_parameters_to_unit(unit)
55 integer,
intent(in) :: unit
58 character(len=2) :: chii
63 call write_header(unit,
'laser '//chii//
' parameters')
65 call write_param(unit,
'laserfield',lf%form)
67 call write_param(unit,
"datafile",lf%datafile)
68 call write_param(unit,
"is_vecpot",lf%is_vecpot)
69 call write_param(unit,
"intensity_Wcm2",lf%intensity_Wcm2)
70 call write_param(unit,
"lambda_nm",lf%lambda_nm)
71 call write_param(unit,
"peak_time_as",lf%peak_time_as)
72 call write_param(unit,
"duration_as",lf%duration_as)
73 call write_param(unit,
"rampon_as",lf%rampon_as)
74 call write_param(unit,
"phase_pi",lf%phase_pi)
75 call write_param(unit,
"form_exponent",lf%form_exponent)
76 call write_param(unit,
"linear_chirp_rate_w0as",lf%linear_chirp_rate_w0as)
79 call write_param(unit,
"E0",lf%E0)
80 call write_param(unit,
"omega",lf%omega)
81 call write_param(unit,
"TX",lf%TX)
82 call write_param(unit,
"peak_time",lf%peak_time)
83 call write_param(unit,
"duration",lf%duration)
84 call write_param(unit,
"rampon",lf%rampon)
85 call write_param(unit,
'laserfield_end',1)
87 end subroutine write_parameters_to_unit
89 subroutine read_parameters_from_file(filename)
91 character(len=*),
intent(in) :: filename
94 open(unit,file=filename,status=
'old',action=
'read')
95 call read_parameters_from_unit(unit)
97 end subroutine read_parameters_from_file
99 subroutine read_parameters_from_unit(unit)
100 integer,
intent(in) :: unit
102 character(len=200) :: name, valuestr
104 status = get_next_param(unit,name,valuestr)
105 if (status /= 0)
exit readparams
106 if (name ==
'laserfield')
then
107 call read_laserfield_parameters(unit,valuestr)
109 write(0,
'(4A)')
'ERROR: unknown parameter encountered, name = ', trim(adjustl(name)), &
110 &
' value = ', trim(adjustl(valuestr))
114 end subroutine read_parameters_from_unit
116 subroutine read_laserfield_parameters(unit, form)
118 integer,
intent(in) :: unit
119 character(len=*),
intent(in) :: form
122 character(len=200) :: name, valuestr
124 if (len_trim(form) > len(lf%form))
then
125 write(0,*)
'laser field form too long in read_laserfield_parameters, form =', form
131 status = get_next_param(unit,name,valuestr)
132 do while (name /=
'laserfield_end')
133 if (name ==
"form")
read(valuestr,*) lf%form
134 if (name ==
"datafile")
read(valuestr,*) lf%datafile
135 if (name ==
"is_vecpot")
read(valuestr,*) lf%is_vecpot
136 if (name ==
"intensity_Wcm2")
read(valuestr,*) lf%intensity_Wcm2
137 if (name ==
"lambda_nm")
read(valuestr,*) lf%lambda_nm
138 if (name ==
"peak_time_as")
read(valuestr,*) lf%peak_time_as
139 if (name ==
"duration_as")
read(valuestr,*) lf%duration_as
140 if (name ==
"rampon_as")
read(valuestr,*) lf%rampon_as
141 if (name ==
"phase_pi")
read(valuestr,*) lf%phase_pi
142 if (name ==
"form_exponent")
read(valuestr,*) lf%form_exponent
143 if (name ==
"linear_chirp_rate_w0as")
read(valuestr,*) lf%linear_chirp_rate_w0as
144 status = get_next_param(unit,name,valuestr)
150 end subroutine read_laserfield_parameters
152 subroutine write_header(unit,name)
153 integer,
parameter :: headerlen = 60
154 integer,
intent(in) :: unit
155 character(len=*),
intent(in) :: name
156 character(len=headerlen) :: header
157 integer :: inlen, padl, padr
158 inlen = len_trim(name)
159 header(1:headerlen) = repeat(
'#',headerlen)
161 padl = (headerlen - inlen)/2
162 padr = headerlen - inlen - padl
163 if (padr < 0)
write(0,
'(a,a)')
'len(name) too large in write_header, name =',name
164 header(padl:padl+inlen+1) =
' '//trim(name)//
' '
166 write(unit,
'(a)') header
167 end subroutine write_header
169 function param_name_string(name)
170 integer,
parameter :: strlen = 30
171 character(len=strlen) :: param_name_string
172 character(len=*),
intent(in) :: name
173 integer :: inlen, padl, padr
174 inlen = len_trim(name)
176 padr = strlen - inlen - padl
177 if (padr < 0)
write(0,
'(a,a)')
'len(name) too large in param_name_string, name =',name
178 param_name_string(1:strlen) = repeat(
' ',strlen)
179 param_name_string(padl+1:padl+inlen) = trim(name)
180 end function param_name_string
182 subroutine write_int_param(unit,name,value)
183 integer,
intent(in) :: unit, value
184 character(len=*),
intent(in) :: name
185 character(len=30) :: tmpch
186 write(tmpch,
'(i30)')
value
187 write(unit,
'(3a)') param_name_string(name),
' = ', trim(adjustl(tmpch))
188 end subroutine write_int_param
190 subroutine write_double_param(unit,name,value)
191 integer,
intent(in) :: unit
192 character(len=*),
intent(in) :: name
193 real(dp),
intent(in) :: value
194 character(len=30) :: tmpch
195 write(tmpch,
'(g30.18e3)')
value
196 write(unit,
'(3a)') param_name_string(name),
' = ', trim(adjustl(tmpch))
197 end subroutine write_double_param
199 subroutine write_logical_param(unit,name,value)
200 integer,
intent(in) :: unit
201 character(len=*),
intent(in) :: name
202 logical,
intent(in) :: value
203 character(len=30) :: tmpch
204 write(tmpch,
'(l1)')
value
205 write(unit,
'(3a)') param_name_string(name),
' = ', trim(adjustl(tmpch))
206 end subroutine write_logical_param
208 subroutine write_char_param(unit,name,value)
209 integer,
intent(in) :: unit
210 character(len=*),
intent(in) :: name, value
211 write(unit,
'(3a)') param_name_string(name),
' = ', trim(adjustl(
value))
212 end subroutine write_char_param
214 subroutine read_int_param(valstr,par)
215 character(len=*),
intent(in) :: valstr
216 integer,
intent(out) :: par
218 end subroutine read_int_param
220 subroutine read_double_param(valstr,par)
221 character(len=*),
intent(in) :: valstr
222 real(dp),
intent(out) :: par
224 end subroutine read_double_param
226 subroutine read_logical_param(valstr,par)
227 character(len=*),
intent(in) :: valstr
228 logical,
intent(out) :: par
230 end subroutine read_logical_param
232 subroutine read_char_param(valstr,par)
233 character(len=*),
intent(in) :: valstr
234 character(len=*),
intent(out) :: par
236 end subroutine read_char_param
238 subroutine get_paramstr(instr,name,valuestr)
239 character(len=*),
intent(in) :: instr
240 character(len=*),
intent(out) :: name, valuestr
244 do while (instr(ii:ii) /=
'=')
246 if (ii > len(instr))
then
247 write(0,*)
'no equal sign (=) in parameter string!'
252 name = trim(adjustl(instr(:ii-1)))
253 valuestr = trim(adjustl(instr(ii+1:)))
255 end subroutine get_paramstr
257 function get_next_param(unit,name,valuestr)
258 integer :: get_next_param
259 integer,
intent(in) :: unit
260 character(len=*),
intent(out) :: name, valuestr
261 character(len=200) :: tmpstr
266 do while (tmpstr(1:1) ==
'#' .or. len(trim(tmpstr))==0)
267 read(unit,
'(a200)',iostat=get_next_param) tmpstr
269 if (get_next_param < 0)
return
271 if (get_next_param > 0)
then
272 inquire(unit=unit, name=tmpstr)
273 write(0,
'(a,i5,2a)')
'error in get_next_param while reading from unit ', unit,
' = file ',tmpstr
277 call get_paramstr(tmpstr,name,valuestr)
279 end function get_next_param
read laserfield parameters and put into global all_laser_fields array
write parameters of all laserfields in global all_laser_fields array
integer function get_unused_unit()
integer n_laserfields
Number of laserfields in the global array all_laserfields.
subroutine add_laserfield(lf)
add a type(laserfield) to the global list all_laserfields
type(laserfield), dimension(100) all_laserfields
Global array saving the laserfields read from parameter files and added with add_laserfield.
subroutine laserfield_set_dependent(lf)
Datatype describing a single laserfield, should usually be created through make_laserfield routine.