laserfields
Fortran95 library to describe time-dependent laser pulses
Loading...
Searching...
No Matches
laserfields_paramfilehandling.f90
Go to the documentation of this file.
1! Copyright (c) 2012, Johannes Feist
2! licensed under the MIT open source license, see LICENSE file
3
5 use nrtype
6 implicit none
7 private ! make everything private by default
9
10 !> read laserfield parameters and put into global all_laser_fields array
11
12 !> can read from either a file or a unit
14 module procedure read_parameters_from_file
15 module procedure read_parameters_from_unit
16 end interface
17 private :: read_parameters_from_file, read_parameters_from_unit
18
19 !> write parameters of all laserfields in global all_laser_fields array
20
21 !> can write to either a file or a unit
23 module procedure write_parameters_to_file
24 module procedure write_parameters_to_unit
25 end interface
26 private :: write_parameters_to_file, write_parameters_to_unit
27
28 interface write_param
29 module procedure write_int_param
30 module procedure write_double_param
31 module procedure write_logical_param
32 module procedure write_char_param
33 end interface
34 interface read_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
39 end interface
40
41contains
42 !---------------------------------------------------------------------------
43 subroutine write_parameters_to_file(filename)
45 character(len=*), intent(in) :: filename
46 integer :: unit
47 unit = get_unused_unit()
48 open(unit,file=filename,status='unknown',action='write')
49 call write_parameters_to_unit(unit)
50 close(unit)
51 end subroutine write_parameters_to_file
52 !---------------------------------------------------------------------------
53 subroutine write_parameters_to_unit(unit)
55 integer, intent(in) :: unit
56 type(laserfield) :: lf
57 integer :: ii
58 character(len=2) :: chii
59
60 do ii = 1, n_laserfields
61 write(unit,*) ''
62 write(chii,'(i2)') ii
63 call write_header(unit,'laser '//chii//' parameters')
64 lf = all_laserfields(ii)
65 call write_param(unit,'laserfield',lf%form)
66
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)
77 write(unit,*) ''
78
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)
86 end do
87 end subroutine write_parameters_to_unit
88 !---------------------------------------------------------------------------
89 subroutine read_parameters_from_file(filename)
91 character(len=*), intent(in) :: filename
92 integer :: unit
93 unit = get_unused_unit()
94 open(unit,file=filename,status='old',action='read')
95 call read_parameters_from_unit(unit)
96 close(unit)
97 end subroutine read_parameters_from_file
98 !---------------------------------------------------------------------------
99 subroutine read_parameters_from_unit(unit)
100 integer, intent(in) :: unit
101 integer :: status
102 character(len=200) :: name, valuestr
103 readparams : do
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)
108 else
109 write(0,'(4A)') 'ERROR: unknown parameter encountered, name = ', trim(adjustl(name)), &
110 & ' value = ', trim(adjustl(valuestr))
111 stop 14
112 end if
113 end do readparams
114 end subroutine read_parameters_from_unit
115 !---------------------------------------------------------------------------
116 subroutine read_laserfield_parameters(unit, form)
118 integer, intent(in) :: unit
119 character(len=*), intent(in) :: form
120 type(laserfield) :: lf
121 integer :: status
122 character(len=200) :: name, valuestr
123
124 if (len_trim(form) > len(lf%form)) then
125 write(0,*) 'laser field form too long in read_laserfield_parameters, form =', form
126 stop 951
127 end if
128
129 lf%form = form
130
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)
145 end do
146
148 if (lf%E0 /= 0.d0) call add_laserfield(lf)
149
150 end subroutine read_laserfield_parameters
151 !---------------------------------------------------------------------------
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)
160 if (inlen > 0) then
161 padl = (headerlen - inlen)/2
162 padr = headerlen - inlen - padl ! strlen = padl + inlen + padr
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)//' '
165 end if
166 write(unit,'(a)') header
167 end subroutine write_header
168 !---------------------------------------------------------------------------
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)
175 padl = 3
176 padr = strlen - inlen - padl ! strlen = padl + inlen + padr
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
181 !---------------------------------------------------------------------------
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
189 !---------------------------------------------------------------------------
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
198 !---------------------------------------------------------------------------
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
207 !---------------------------------------------------------------------------
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
213 !---------------------------------------------------------------------------
214 subroutine read_int_param(valstr,par)
215 character(len=*), intent(in) :: valstr
216 integer, intent(out) :: par
217 read(valstr,*) par
218 end subroutine read_int_param
219 !---------------------------------------------------------------------------
220 subroutine read_double_param(valstr,par)
221 character(len=*), intent(in) :: valstr
222 real(dp), intent(out) :: par
223 read(valstr,*) par
224 end subroutine read_double_param
225 !---------------------------------------------------------------------------
226 subroutine read_logical_param(valstr,par)
227 character(len=*), intent(in) :: valstr
228 logical, intent(out) :: par
229 read(valstr,*) par
230 end subroutine read_logical_param
231 !---------------------------------------------------------------------------
232 subroutine read_char_param(valstr,par)
233 character(len=*), intent(in) :: valstr
234 character(len=*), intent(out) :: par
235 par = valstr
236 end subroutine read_char_param
237 !---------------------------------------------------------------------------
238 subroutine get_paramstr(instr,name,valuestr)
239 character(len=*), intent(in) :: instr
240 character(len=*), intent(out) :: name, valuestr
241 integer :: ii
242
243 ii = 1
244 do while (instr(ii:ii) /= '=')
245 ii = ii + 1
246 if (ii > len(instr)) then
247 write(0,*) 'no equal sign (=) in parameter string!'
248 stop 531
249 end if
250 end do
251
252 name = trim(adjustl(instr(:ii-1)))
253 valuestr = trim(adjustl(instr(ii+1:)))
254
255 end subroutine get_paramstr
256 !---------------------------------------------------------------------------
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
262
263 get_next_param = 0
264
265 tmpstr(1:1) = '#'
266 do while (tmpstr(1:1) == '#' .or. len(trim(tmpstr))==0)
267 read(unit,'(a200)',iostat=get_next_param) tmpstr
268 ! if end of file occured
269 if (get_next_param < 0) return
270 ! if error occured
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
274 stop 19
275 end if
276 end do
277 call get_paramstr(tmpstr,name,valuestr)
278
279 end function get_next_param
280 !---------------------------------------------------------------------------
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.