Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Methods for storing MD parameters type
10 : !> \author CJM
11 : !> \author Teodoro Laino [tlaino] - University of Zurich - 10.2008
12 : !> reorganization of the original routines/modules
13 : ! **************************************************************************************************
14 : MODULE simpar_methods
15 : USE bibliography, ONLY: Evans1983,&
16 : Kuhne2007,&
17 : Minary2003,&
18 : Rengaraj2020,&
19 : Ricci2003,&
20 : cite_reference
21 : USE cp_log_handling, ONLY: cp_get_default_logger,&
22 : cp_logger_type
23 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
24 : cp_print_key_generate_filename,&
25 : cp_print_key_unit_nr
26 : USE cp_units, ONLY: cp_unit_from_cp2k
27 : USE input_constants, ONLY: &
28 : isokin_ensemble, langevin_ensemble, npe_f_ensemble, npe_i_ensemble, &
29 : nph_uniaxial_damped_ensemble, nph_uniaxial_ensemble, npt_f_ensemble, npt_i_ensemble, &
30 : npt_ia_ensemble, nvt_ensemble, reftraj_ensemble
31 : USE input_cp2k_md, ONLY: create_md_section
32 : USE input_enumeration_types, ONLY: enum_i2c,&
33 : enumeration_type
34 : USE input_keyword_types, ONLY: keyword_get,&
35 : keyword_type
36 : USE input_section_types, ONLY: section_get_keyword,&
37 : section_release,&
38 : section_type,&
39 : section_vals_get,&
40 : section_vals_get_subs_vals,&
41 : section_vals_type,&
42 : section_vals_val_get
43 : USE kinds, ONLY: default_path_length,&
44 : dp
45 : USE simpar_types, ONLY: simpar_type
46 : #include "../base/base_uses.f90"
47 :
48 : IMPLICIT NONE
49 :
50 : PRIVATE
51 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'simpar_methods'
52 : PUBLIC :: read_md_section
53 :
54 : CONTAINS
55 :
56 : ! **************************************************************************************************
57 : !> \brief Reads the MD section and setup the simulation parameters type
58 : !> \param simpar ...
59 : !> \param motion_section ...
60 : !> \param md_section ...
61 : !> \author Teodoro Laino
62 : ! **************************************************************************************************
63 1786 : SUBROUTINE read_md_section(simpar, motion_section, md_section)
64 : TYPE(simpar_type), POINTER :: simpar
65 : TYPE(section_vals_type), POINTER :: motion_section, md_section
66 :
67 : CHARACTER(LEN=default_path_length) :: filename
68 : INTEGER :: iprint, iw
69 : REAL(kind=dp) :: tmp_r1, tmp_r2, tmp_r3
70 : TYPE(cp_logger_type), POINTER :: logger
71 : TYPE(enumeration_type), POINTER :: enum
72 : TYPE(keyword_type), POINTER :: keyword
73 : TYPE(section_type), POINTER :: section
74 : TYPE(section_vals_type), POINTER :: print_key
75 :
76 1786 : NULLIFY (logger, print_key, enum, keyword, section)
77 1786 : logger => cp_get_default_logger()
78 1786 : iw = cp_print_key_unit_nr(logger, md_section, "PRINT%PROGRAM_RUN_INFO", extension=".log")
79 :
80 1786 : CALL read_md_low(simpar, motion_section, md_section)
81 1786 : IF (iw > 0) WRITE (UNIT=iw, FMT="(A)") ""
82 :
83 : ! Begin setup Langevin dynamics
84 1786 : IF (simpar%ensemble == langevin_ensemble) THEN
85 42 : CALL cite_reference(Ricci2003)
86 42 : IF (simpar%noisy_gamma > 0.0_dp) CALL cite_reference(Kuhne2007)
87 42 : IF (simpar%shadow_gamma > 0.0_dp) CALL cite_reference(Rengaraj2020)
88 : ! Normalization factor using a normal Gaussian random number distribution
89 42 : simpar%var_w = 2.0_dp*simpar%temp_ext*simpar%dt*(simpar%gamma + simpar%noisy_gamma)
90 42 : IF (iw > 0) THEN
91 : WRITE (UNIT=iw, FMT="(T2,A)") &
92 21 : "LD| Parameters for Langevin dynamics"
93 21 : tmp_r1 = cp_unit_from_cp2k(simpar%gamma, "fs^-1")
94 21 : tmp_r2 = cp_unit_from_cp2k(simpar%noisy_gamma, "fs^-1")
95 21 : tmp_r3 = cp_unit_from_cp2k(simpar%shadow_gamma, "fs^-1")
96 : WRITE (UNIT=iw, FMT="(T2,A,T71,ES10.3)") &
97 21 : "LD| Gamma [1/fs] ", tmp_r1, &
98 21 : "LD| Noisy Gamma [1/fs]", tmp_r2, &
99 21 : "LD| Shadow Gamma [1/fs]", tmp_r3, &
100 21 : "LD| Variance [a.u.]", simpar%var_w, &
101 42 : ""
102 : END IF
103 : END IF
104 :
105 : ! Create section for output enumeration infos
106 1786 : CALL create_md_section(section)
107 1786 : keyword => section_get_keyword(section, "ENSEMBLE")
108 1786 : CALL keyword_get(keyword, enum=enum)
109 :
110 : ! Write MD setup information to output
111 1786 : IF (iw > 0) THEN
112 : WRITE (iw, '(T2,A)') &
113 812 : 'MD_PAR| Molecular dynamics protocol (MD input parameters)'
114 : WRITE (iw, '(T2,A,T61,A20)') &
115 812 : 'MD_PAR| Ensemble type', ADJUSTR(TRIM(enum_i2c(enum, simpar%ensemble)))
116 : WRITE (iw, '(T2,A,T61,I20)') &
117 812 : 'MD_PAR| Number of time steps', simpar%nsteps
118 812 : IF (simpar%variable_dt) THEN
119 : WRITE (iw, '(T2,A)') &
120 6 : 'MD_PAR| Variable time step is activated'
121 6 : tmp_r1 = cp_unit_from_cp2k(simpar%dt, "fs")
122 : WRITE (iw, '(T2,A,T61,F20.6)') &
123 6 : 'MD_PAR| Maximum time step [fs]', tmp_r1
124 6 : tmp_r1 = cp_unit_from_cp2k(simpar%dr_tol, "angstrom")
125 : WRITE (iw, '(T2,A,T61,F20.6)') &
126 6 : 'MD_PAR| Maximum atomic displacement permitted [A]', tmp_r1
127 : ELSE
128 806 : tmp_r1 = cp_unit_from_cp2k(simpar%dt, "fs")
129 : WRITE (iw, '(T2,A,T61,F20.6)') &
130 806 : 'MD_PAR| Time step [fs]', tmp_r1
131 : END IF
132 812 : tmp_r1 = cp_unit_from_cp2k(simpar%temp_ext, "K")
133 : WRITE (iw, '(T2,A,T61,F20.6)') &
134 812 : 'MD_PAR| Temperature [K]', tmp_r1
135 812 : tmp_r1 = cp_unit_from_cp2k(simpar%temp_tol, "K")
136 : WRITE (iw, '(T2,A,T61,F20.6)') &
137 812 : 'MD_PAR| Temperature tolerance [K]', tmp_r1
138 :
139 812 : IF (simpar%annealing) THEN
140 : WRITE (iw, '(T2,A,T61,F20.6)') &
141 2 : 'MD_PAR| Annealing ion factor', simpar%f_annealing
142 : END IF
143 : IF ((simpar%ensemble == npe_f_ensemble .OR. &
144 812 : simpar%ensemble == npe_i_ensemble) .AND. &
145 : simpar%annealing_cell) THEN
146 : WRITE (iw, '(T2,A,T61,F20.6)') &
147 1 : 'MD_PAR| Annealing cell factor', simpar%f_annealing_cell
148 : END IF
149 : IF (simpar%ensemble == npt_i_ensemble .OR. &
150 : simpar%ensemble == npt_ia_ensemble .OR. &
151 : simpar%ensemble == npt_f_ensemble .OR. &
152 812 : simpar%ensemble == npe_i_ensemble .OR. &
153 : simpar%ensemble == npe_f_ensemble) THEN
154 82 : tmp_r1 = cp_unit_from_cp2k(simpar%p_ext, "bar")
155 : WRITE (iw, '(T2,A,T61,F20.6)') &
156 82 : 'MD_PAR| Pressure [bar]', tmp_r1
157 82 : tmp_r1 = cp_unit_from_cp2k(simpar%tau_cell, "fs")
158 : WRITE (iw, '(T2,A,T61,F20.6)') &
159 82 : 'MD_PAR| Barostat time constant [fs]', tmp_r1
160 : END IF
161 812 : IF (simpar%ensemble == isokin_ensemble) THEN
162 1 : CALL cite_reference(Evans1983)
163 1 : CALL cite_reference(Minary2003)
164 : WRITE (iw, '(T2,A)') &
165 1 : 'MD_PAR| Simulation using the isokinetic ensemble'
166 : END IF
167 812 : IF (simpar%constraint) THEN
168 : WRITE (iw, '(T2,A)') &
169 155 : 'MD_PAR| Constraints activated'
170 : WRITE (iw, '(T2,A,T61,F20.6)') &
171 155 : 'MD_PAR| Tolerance for shake', simpar%shake_tol
172 : END IF
173 :
174 812 : print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%PROGRAM_RUN_INFO")
175 812 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
176 : WRITE (iw, '(T2,A,T63,I10,A)') &
177 812 : 'MD_PAR| Print MD information every', iprint, ' step(s)'
178 : WRITE (iw, '(T2,A,T22,A,T71,A10)') &
179 812 : 'MD_PAR| File type', 'Print frequency [steps]', 'File names'
180 :
181 812 : print_key => section_vals_get_subs_vals(motion_section, "PRINT%TRAJECTORY")
182 812 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
183 : filename = cp_print_key_generate_filename(logger, print_key, &
184 812 : extension=".xyz", middle_name="pos", my_local=.FALSE.)
185 : WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
186 812 : 'MD_PAR| Coordinates', iprint, ADJUSTR(TRIM(filename))
187 :
188 : IF ((simpar%ensemble == nph_uniaxial_ensemble) .OR. &
189 : (simpar%ensemble == nph_uniaxial_damped_ensemble) .OR. &
190 : (simpar%ensemble == npt_i_ensemble) .OR. &
191 : (simpar%ensemble == npt_ia_ensemble) .OR. &
192 : (simpar%ensemble == npt_f_ensemble) .OR. &
193 812 : (simpar%ensemble == npe_i_ensemble) .OR. &
194 : (simpar%ensemble == npe_f_ensemble)) THEN
195 :
196 85 : print_key => section_vals_get_subs_vals(motion_section, "PRINT%CELL")
197 85 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
198 : filename = cp_print_key_generate_filename(logger, print_key, &
199 85 : extension=".cell", my_local=.FALSE.)
200 : WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
201 85 : 'MD_PAR| Cell', iprint, ADJUSTR(TRIM(filename))
202 : END IF
203 :
204 812 : print_key => section_vals_get_subs_vals(motion_section, "PRINT%VELOCITIES")
205 812 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
206 : filename = cp_print_key_generate_filename(logger, print_key, &
207 812 : extension=".xyz", middle_name="vel", my_local=.FALSE.)
208 : WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
209 812 : 'MD_PAR| Velocities', iprint, ADJUSTR(TRIM(filename))
210 :
211 812 : print_key => section_vals_get_subs_vals(motion_section, "MD%PRINT%ENERGY")
212 812 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
213 : filename = cp_print_key_generate_filename(logger, print_key, &
214 812 : extension=".ener", my_local=.FALSE.)
215 : WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
216 812 : 'MD_PAR| Energies', iprint, ADJUSTR(TRIM(filename))
217 :
218 812 : print_key => section_vals_get_subs_vals(motion_section, "PRINT%RESTART")
219 812 : CALL section_vals_val_get(print_key, "EACH%MD", i_val=iprint)
220 : filename = cp_print_key_generate_filename(logger, print_key, &
221 812 : extension=".restart", my_local=.FALSE.)
222 : WRITE (iw, '(T2,A,T22,I10,T33,A48)') &
223 812 : 'MD_PAR| Dump', iprint, ADJUSTR(TRIM(filename))
224 :
225 812 : IF ((simpar%ensemble == nph_uniaxial_ensemble) .OR. &
226 : (simpar%ensemble == nph_uniaxial_damped_ensemble)) THEN
227 3 : WRITE (iw, '(T2,A)') 'SHOCK| Uniaxial shock parameters: '
228 3 : tmp_r1 = cp_unit_from_cp2k(simpar%v_shock, "m*s^-1")
229 : WRITE (iw, '(T2,A,T61,F20.6)') &
230 3 : 'SHOCK| Shock velocity [m/s]', tmp_r1
231 3 : tmp_r1 = cp_unit_from_cp2k(simpar%gamma_nph, "fs^-1")
232 : WRITE (iw, '(T2,A,T61,F20.6)') &
233 3 : 'SHOCK| Damping coefficient [1/fs]', tmp_r1
234 3 : tmp_r1 = cp_unit_from_cp2k(simpar%p0, "bar")
235 : WRITE (iw, '(T2,A,T61,F20.6)') &
236 3 : 'SHOCK| Pressure [bar]', tmp_r1
237 : WRITE (iw, '(T2,A,T61,F20.6)') &
238 3 : 'SHOCK| Barostat mass [a.u.]', simpar%cmass
239 : END IF
240 : ! Print warning for temp_tol
241 812 : IF (simpar%temp_tol > 0.0_dp) THEN
242 : CALL cp_warn(__LOCATION__, &
243 : "A temperature tolerance (TEMP_TOL) is used during the MD. "// &
244 44 : "Due to the velocity rescaling algorithm jumps may appear in the conserved quantity.")
245 : END IF
246 : ! Print warning for annealing
247 812 : IF (simpar%annealing) THEN
248 : IF ((simpar%ensemble == nvt_ensemble) .OR. &
249 : (simpar%ensemble == npt_i_ensemble) .OR. &
250 2 : (simpar%ensemble == npt_ia_ensemble) .OR. &
251 : (simpar%ensemble == npt_f_ensemble)) THEN
252 : CALL cp_abort(__LOCATION__, &
253 : "Annealing of the ions has been required "// &
254 : "even if the thermostat is active (nvt or npt_i or npt_ia or npt_f) "// &
255 0 : "These two methods to control the temperature act one against the other.")
256 : END IF
257 : END IF
258 : ! Print warning for variable time step
259 812 : IF (simpar%variable_dt) THEN
260 : IF ((simpar%ensemble == langevin_ensemble) .OR. &
261 6 : (simpar%ensemble == reftraj_ensemble) .OR. &
262 : simpar%do_respa) THEN
263 : CALL cp_warn( &
264 : __LOCATION__, &
265 : "The variable timestep has been required, however "// &
266 : "this option is not available either with the Langevin ensemble or with the multiple timestep schme. "// &
267 0 : "The run will proceed with constant timestep, as read from input.")
268 : END IF
269 : END IF
270 : END IF
271 1786 : CALL section_release(section)
272 : CALL cp_print_key_finished_output(iw, logger, md_section, &
273 1786 : "PRINT%PROGRAM_RUN_INFO")
274 :
275 1786 : END SUBROUTINE read_md_section
276 :
277 : ! **************************************************************************************************
278 : !> \brief Low Level: Parses the MD input section
279 : !> \param simpar ...
280 : !> \param motion_section ...
281 : !> \param md_section ...
282 : !> \author teo
283 : ! **************************************************************************************************
284 3572 : SUBROUTINE read_md_low(simpar, motion_section, md_section)
285 : TYPE(simpar_type), POINTER :: simpar
286 : TYPE(section_vals_type), POINTER :: motion_section, md_section
287 :
288 : LOGICAL :: explicit
289 : TYPE(section_vals_type), POINTER :: tmp_section
290 :
291 1786 : NULLIFY (tmp_section)
292 1786 : CALL section_vals_val_get(md_section, "ENSEMBLE", i_val=simpar%ensemble)
293 1786 : CALL section_vals_val_get(md_section, "STEPS", i_val=simpar%nsteps)
294 1786 : CALL section_vals_val_get(md_section, "MAX_STEPS", i_val=simpar%max_steps)
295 1786 : CALL section_vals_val_get(md_section, "TEMPERATURE", r_val=simpar%temp_ext)
296 1786 : CALL section_vals_val_get(md_section, "TEMP_TOL", r_val=simpar%temp_tol)
297 1786 : CALL section_vals_val_get(md_section, "ANGVEL_ZERO", l_val=simpar%angvel_zero)
298 1786 : CALL section_vals_val_get(md_section, "TEMP_KIND", l_val=simpar%temperature_per_kind)
299 1786 : CALL section_vals_val_get(md_section, "SCALE_TEMP_KIND", l_val=simpar%scale_temperature_per_kind)
300 1786 : CALL section_vals_val_get(md_section, "ANNEALING", r_val=simpar%f_annealing, explicit=simpar%annealing)
301 : CALL section_vals_val_get(md_section, "ANNEALING_CELL", r_val=simpar%f_annealing_cell, &
302 1786 : explicit=simpar%annealing_cell)
303 : CALL section_vals_val_get(md_section, "TEMPERATURE_ANNEALING", r_val=simpar%f_temperature_annealing, &
304 1786 : explicit=simpar%temperature_annealing)
305 : CALL section_vals_val_get(md_section, "DISPLACEMENT_TOL", r_val=simpar%dr_tol, &
306 1786 : explicit=simpar%variable_dt)
307 1786 : CALL section_vals_val_get(md_section, "TIMESTEP", r_val=simpar%dt)
308 : CALL section_vals_val_get(md_section, "INITIALIZATION_METHOD", &
309 1786 : i_val=simpar%initialization_method)
310 : ! Initialize dt_fact to 1.0
311 1786 : simpar%dt_fact = 1.0_dp
312 :
313 1786 : IF (simpar%ensemble == langevin_ensemble) THEN
314 42 : CALL section_vals_val_get(md_section, "LANGEVIN%GAMMA", r_val=simpar%gamma)
315 42 : CALL section_vals_val_get(md_section, "LANGEVIN%NOISY_GAMMA", r_val=simpar%noisy_gamma)
316 42 : CALL section_vals_val_get(md_section, "LANGEVIN%SHADOW_GAMMA", r_val=simpar%shadow_gamma)
317 : END IF
318 :
319 1786 : tmp_section => section_vals_get_subs_vals(motion_section, "CONSTRAINT")
320 1786 : CALL section_vals_get(tmp_section, explicit=simpar%constraint)
321 1786 : IF (simpar%constraint) THEN
322 310 : CALL section_vals_val_get(tmp_section, "SHAKE_TOLERANCE", r_val=simpar%shake_tol)
323 310 : IF (simpar%shake_tol <= EPSILON(0.0_dp)*1000.0_dp) &
324 : CALL cp_warn(__LOCATION__, &
325 : "Shake tolerance lower than 1000*EPSILON, where EPSILON is the machine precision. "// &
326 0 : "This may lead to numerical problems. Setting up shake_tol to 1000*EPSILON!")
327 310 : simpar%shake_tol = MAX(EPSILON(0.0_dp)*1000.0_dp, simpar%shake_tol)
328 :
329 310 : CALL section_vals_val_get(tmp_section, "ROLL_TOLERANCE", r_val=simpar%roll_tol)
330 310 : IF (simpar%roll_tol <= EPSILON(0.0_dp)*1000.0_dp) &
331 : CALL cp_warn(__LOCATION__, &
332 : "Roll tolerance lower than 1000*EPSILON, where EPSILON is the machine precision. "// &
333 0 : "This may lead to numerical problems. Setting up roll_tol to 1000*EPSILON!")
334 310 : simpar%roll_tol = MAX(EPSILON(0.0_dp)*1000.0_dp, simpar%roll_tol)
335 : END IF
336 :
337 1786 : IF (simpar%ensemble == nph_uniaxial_ensemble .OR. simpar%ensemble == nph_uniaxial_damped_ensemble) THEN
338 6 : tmp_section => section_vals_get_subs_vals(md_section, "MSST")
339 6 : CALL section_vals_val_get(tmp_section, "PRESSURE", r_val=simpar%p0)
340 6 : CALL section_vals_val_get(tmp_section, "ENERGY", r_val=simpar%e0)
341 6 : CALL section_vals_val_get(tmp_section, "VOLUME", r_val=simpar%v0)
342 6 : CALL section_vals_val_get(tmp_section, "GAMMA", r_val=simpar%gamma_nph)
343 6 : IF (simpar%gamma_nph /= 0.0_dp) simpar%ensemble = nph_uniaxial_damped_ensemble
344 6 : CALL section_vals_val_get(tmp_section, "CMASS", r_val=simpar%cmass)
345 6 : CALL section_vals_val_get(tmp_section, "VSHOCK", r_val=simpar%v_shock)
346 : END IF
347 :
348 1958 : SELECT CASE (simpar%ensemble)
349 : CASE (nph_uniaxial_damped_ensemble, nph_uniaxial_ensemble, &
350 : npt_f_ensemble, npt_i_ensemble, npt_ia_ensemble, npe_f_ensemble, npe_i_ensemble)
351 172 : tmp_section => section_vals_get_subs_vals(md_section, "BAROSTAT")
352 172 : CALL section_vals_val_get(tmp_section, "PRESSURE", r_val=simpar%p_ext)
353 1958 : CALL section_vals_val_get(tmp_section, "TIMECON", r_val=simpar%tau_cell)
354 : END SELECT
355 :
356 : ! RESPA
357 1786 : tmp_section => section_vals_get_subs_vals(md_section, "RESPA")
358 1786 : CALL section_vals_get(tmp_section, explicit=simpar%do_respa)
359 1786 : CALL section_vals_val_get(tmp_section, "FREQUENCY", i_val=simpar%n_time_steps)
360 1786 : simpar%multi_time_switch = simpar%do_respa
361 :
362 : ! CORE-SHELL MODEL
363 1786 : tmp_section => section_vals_get_subs_vals(md_section, "SHELL")
364 1786 : CALL section_vals_val_get(tmp_section, "TEMPERATURE", r_val=simpar%temp_sh_ext)
365 1786 : CALL section_vals_val_get(tmp_section, "TEMP_TOL", r_val=simpar%temp_sh_tol)
366 :
367 : CALL section_vals_val_get(tmp_section, "DISPLACEMENT_SHELL_TOL", r_val=simpar%dsc_tol, &
368 1786 : explicit=explicit)
369 1786 : simpar%variable_dt = simpar%variable_dt .OR. explicit
370 : ! ADIABATIC DYNAMICS
371 1786 : tmp_section => section_vals_get_subs_vals(md_section, "ADIABATIC_DYNAMICS")
372 1786 : CALL section_vals_val_get(tmp_section, "TEMP_FAST", r_val=simpar%temp_fast)
373 1786 : CALL section_vals_val_get(tmp_section, "TEMP_SLOW", r_val=simpar%temp_slow)
374 1786 : CALL section_vals_val_get(tmp_section, "TEMP_TOL_FAST", r_val=simpar%temp_tol_fast)
375 1786 : CALL section_vals_val_get(tmp_section, "TEMP_TOL_SLOW", r_val=simpar%temp_tol_slow)
376 1786 : CALL section_vals_val_get(tmp_section, "N_RESP_FAST", i_val=simpar%n_resp_fast)
377 :
378 : ! VELOCITY SOFTENING
379 1786 : tmp_section => section_vals_get_subs_vals(md_section, "VELOCITY_SOFTENING")
380 1786 : CALL section_vals_val_get(tmp_section, "STEPS", i_val=simpar%soften_nsteps)
381 1786 : CALL section_vals_val_get(tmp_section, "ALPHA", r_val=simpar%soften_alpha)
382 1786 : CALL section_vals_val_get(tmp_section, "DELTA", r_val=simpar%soften_delta)
383 1786 : END SUBROUTINE read_md_low
384 :
385 : END MODULE simpar_methods
|