1!
2! Copyright (C) 2001-2009 Quantum ESPRESSO group
3! This file is distributed under the terms of the
4! GNU General Public License. See the file `License'
5! in the root directory of the present distribution,
6! or http://www.gnu.org/copyleft/gpl.txt .
7!
8!
9MODULE qes_init_module
10  !
11  ! Auto-generated code: don't edit or at least don't commit changes
12  !
13  ! Quantum Espresso XSD namespace: http://www.quantum-espresso.org/ns/qes/qes-1.0
14  !
15  USE kinds, only: DP
16  USE qes_types_module
17  !
18  IMPLICIT NONE
19  !
20  PRIVATE
21  !
22  PUBLIC :: qes_init
23  !
24  INTERFACE qes_init
25    !
26    MODULE PROCEDURE qes_init_espresso
27    MODULE PROCEDURE qes_init_general_info
28    MODULE PROCEDURE qes_init_parallel_info
29    MODULE PROCEDURE qes_init_input
30    MODULE PROCEDURE qes_init_step
31    MODULE PROCEDURE qes_init_output
32    MODULE PROCEDURE qes_init_timing
33    MODULE PROCEDURE qes_init_clock
34    MODULE PROCEDURE qes_init_control_variables
35    MODULE PROCEDURE qes_init_xml_format
36    MODULE PROCEDURE qes_init_creator
37    MODULE PROCEDURE qes_init_created
38    MODULE PROCEDURE qes_init_atomic_species
39    MODULE PROCEDURE qes_init_species
40    MODULE PROCEDURE qes_init_atomic_structure
41    MODULE PROCEDURE qes_init_atomic_positions
42    MODULE PROCEDURE qes_init_atom
43    MODULE PROCEDURE qes_init_wyckoff_positions
44    MODULE PROCEDURE qes_init_cell
45    MODULE PROCEDURE qes_init_dft
46    MODULE PROCEDURE qes_init_hybrid
47    MODULE PROCEDURE qes_init_qpoint_grid
48    MODULE PROCEDURE qes_init_dftU
49    MODULE PROCEDURE qes_init_HubbardCommon
50    MODULE PROCEDURE qes_init_HubbardJ
51    MODULE PROCEDURE qes_init_starting_ns
52    MODULE PROCEDURE qes_init_Hubbard_ns
53    MODULE PROCEDURE qes_init_HubbardBack
54    MODULE PROCEDURE qes_init_backL
55    MODULE PROCEDURE qes_init_vdW
56    MODULE PROCEDURE qes_init_spin
57    MODULE PROCEDURE qes_init_bands
58    MODULE PROCEDURE qes_init_smearing
59    MODULE PROCEDURE qes_init_occupations
60    MODULE PROCEDURE qes_init_basis
61    MODULE PROCEDURE qes_init_basis_set
62    MODULE PROCEDURE qes_init_basisSetItem
63    MODULE PROCEDURE qes_init_reciprocal_lattice
64    MODULE PROCEDURE qes_init_electron_control
65    MODULE PROCEDURE qes_init_k_points_IBZ
66    MODULE PROCEDURE qes_init_monkhorst_pack
67    MODULE PROCEDURE qes_init_k_point
68    MODULE PROCEDURE qes_init_ion_control
69    MODULE PROCEDURE qes_init_bfgs
70    MODULE PROCEDURE qes_init_md
71    MODULE PROCEDURE qes_init_cell_control
72    MODULE PROCEDURE qes_init_symmetry_flags
73    MODULE PROCEDURE qes_init_boundary_conditions
74    MODULE PROCEDURE qes_init_esm
75    MODULE PROCEDURE qes_init_ekin_functional
76    MODULE PROCEDURE qes_init_spin_constraints
77    MODULE PROCEDURE qes_init_electric_field
78    MODULE PROCEDURE qes_init_gate_settings
79    MODULE PROCEDURE qes_init_atomic_constraints
80    MODULE PROCEDURE qes_init_atomic_constraint
81    MODULE PROCEDURE qes_init_inputOccupations
82    MODULE PROCEDURE qes_init_outputElectricField
83    MODULE PROCEDURE qes_init_BerryPhaseOutput
84    MODULE PROCEDURE qes_init_dipoleOutput
85    MODULE PROCEDURE qes_init_finiteFieldOut
86    MODULE PROCEDURE qes_init_polarization
87    MODULE PROCEDURE qes_init_ionicPolarization
88    MODULE PROCEDURE qes_init_electronicPolarization
89    MODULE PROCEDURE qes_init_phase
90    MODULE PROCEDURE qes_init_gateInfo
91    MODULE PROCEDURE qes_init_convergence_info
92    MODULE PROCEDURE qes_init_scf_conv
93    MODULE PROCEDURE qes_init_opt_conv
94    MODULE PROCEDURE qes_init_algorithmic_info
95    MODULE PROCEDURE qes_init_symmetries
96    MODULE PROCEDURE qes_init_symmetry
97    MODULE PROCEDURE qes_init_equivalent_atoms
98    MODULE PROCEDURE qes_init_info
99    MODULE PROCEDURE qes_init_outputPBC
100    MODULE PROCEDURE qes_init_magnetization
101    MODULE PROCEDURE qes_init_total_energy
102    MODULE PROCEDURE qes_init_band_structure
103    MODULE PROCEDURE qes_init_ks_energies
104    MODULE PROCEDURE qes_init_closed
105    MODULE PROCEDURE qes_init_vector
106    MODULE PROCEDURE qes_init_integerVector
107    MODULE PROCEDURE qes_init_matrix_1, qes_init_matrix_2, qes_init_matrix_3
108    MODULE PROCEDURE qes_init_integerMatrix_1, qes_init_integerMatrix_2, qes_init_integerMatrix_3
109    MODULE PROCEDURE qes_init_scalarQuantity
110    !
111  END INTERFACE qes_init
112  !
113  CONTAINS
114  !
115  !
116  SUBROUTINE qes_init_espresso(obj, tagname, input, Units, general_info, parallel_info, step,&
117                              output, status, cputime, timing_info, closed)
118    !
119    IMPLICIT NONE
120    !
121    TYPE(espresso_type), INTENT(OUT) :: obj
122    CHARACTER(LEN=*), INTENT(IN) :: tagname
123    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: Units
124    TYPE(general_info_type),OPTIONAL,INTENT(IN) :: general_info
125    TYPE(parallel_info_type),OPTIONAL,INTENT(IN) :: parallel_info
126    TYPE(input_type),INTENT(IN) :: input
127    TYPE(step_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: step
128    TYPE(output_type),OPTIONAL,INTENT(IN) :: output
129    INTEGER,OPTIONAL,INTENT(IN) :: status
130    INTEGER,OPTIONAL,INTENT(IN) :: cputime
131    TYPE(timing_type),OPTIONAL,INTENT(IN) :: timing_info
132    TYPE(closed_type),OPTIONAL,INTENT(IN) :: closed
133    !
134    obj%tagname = TRIM(tagname)
135    obj%lwrite = .TRUE.
136    obj%lread = .TRUE.
137    IF (PRESENT(Units)) THEN
138      obj%Units_ispresent = .TRUE.
139      obj%Units = Units
140    ELSE
141      obj%Units_ispresent = .FALSE.
142    END IF
143    !
144    IF ( PRESENT(general_info)) THEN
145      obj%general_info_ispresent = .TRUE.
146      obj%general_info = general_info
147    ELSE
148      obj%general_info_ispresent = .FALSE.
149    END IF
150    IF ( PRESENT(parallel_info)) THEN
151      obj%parallel_info_ispresent = .TRUE.
152      obj%parallel_info = parallel_info
153    ELSE
154      obj%parallel_info_ispresent = .FALSE.
155    END IF
156    obj%input = input
157    IF ( PRESENT(step)) THEN
158      obj%step_ispresent = .TRUE.
159      ALLOCATE(obj%step(SIZE(step)))
160      obj%ndim_step = SIZE(step)
161      obj%step = step
162    ELSE
163      obj%step_ispresent = .FALSE.
164    END IF
165    IF ( PRESENT(output)) THEN
166      obj%output_ispresent = .TRUE.
167      obj%output = output
168    ELSE
169      obj%output_ispresent = .FALSE.
170    END IF
171    IF ( PRESENT(status)) THEN
172      obj%status_ispresent = .TRUE.
173      obj%status = status
174    ELSE
175      obj%status_ispresent = .FALSE.
176    END IF
177    IF ( PRESENT(cputime)) THEN
178      obj%cputime_ispresent = .TRUE.
179      obj%cputime = cputime
180    ELSE
181      obj%cputime_ispresent = .FALSE.
182    END IF
183    IF ( PRESENT(timing_info)) THEN
184      obj%timing_info_ispresent = .TRUE.
185      obj%timing_info = timing_info
186    ELSE
187      obj%timing_info_ispresent = .FALSE.
188    END IF
189    IF ( PRESENT(closed)) THEN
190      obj%closed_ispresent = .TRUE.
191      obj%closed = closed
192    ELSE
193      obj%closed_ispresent = .FALSE.
194    END IF
195    !
196  END SUBROUTINE qes_init_espresso
197  !
198  !
199  SUBROUTINE qes_init_general_info(obj, tagname, xml_format, creator, created, job)
200    !
201    IMPLICIT NONE
202    !
203    TYPE(general_info_type), INTENT(OUT) :: obj
204    CHARACTER(LEN=*), INTENT(IN) :: tagname
205    TYPE(xml_format_type),INTENT(IN) :: xml_format
206    TYPE(creator_type),INTENT(IN) :: creator
207    TYPE(created_type),INTENT(IN) :: created
208    CHARACTER(LEN=*),INTENT(IN) :: job
209    !
210    obj%tagname = TRIM(tagname)
211    obj%lwrite = .TRUE.
212    obj%lread = .TRUE.
213    !
214    obj%xml_format = xml_format
215    obj%creator = creator
216    obj%created = created
217    obj%job = job
218    !
219  END SUBROUTINE qes_init_general_info
220  !
221  !
222  SUBROUTINE qes_init_parallel_info(obj, tagname, nprocs, nthreads, ntasks, nbgrp, npool, ndiag)
223    !
224    IMPLICIT NONE
225    !
226    TYPE(parallel_info_type), INTENT(OUT) :: obj
227    CHARACTER(LEN=*), INTENT(IN) :: tagname
228    INTEGER,INTENT(IN) :: nprocs
229    INTEGER,INTENT(IN) :: nthreads
230    INTEGER,INTENT(IN) :: ntasks
231    INTEGER,INTENT(IN) :: nbgrp
232    INTEGER,INTENT(IN) :: npool
233    INTEGER,INTENT(IN) :: ndiag
234    !
235    obj%tagname = TRIM(tagname)
236    obj%lwrite = .TRUE.
237    obj%lread = .TRUE.
238    !
239    obj%nprocs = nprocs
240    obj%nthreads = nthreads
241    obj%ntasks = ntasks
242    obj%nbgrp = nbgrp
243    obj%npool = npool
244    obj%ndiag = ndiag
245    !
246  END SUBROUTINE qes_init_parallel_info
247  !
248  !
249  SUBROUTINE qes_init_input(obj, tagname, control_variables, atomic_species, atomic_structure,&
250                           dft, spin, bands, basis, electron_control, k_points_IBZ, ion_control,&
251                           cell_control, symmetry_flags, boundary_conditions, ekin_functional,&
252                           external_atomic_forces, free_positions, starting_atomic_velocities,&
253                           electric_field, atomic_constraints, spin_constraints)
254    !
255    IMPLICIT NONE
256    !
257    TYPE(input_type), INTENT(OUT) :: obj
258    CHARACTER(LEN=*), INTENT(IN) :: tagname
259    TYPE(control_variables_type),INTENT(IN) :: control_variables
260    TYPE(atomic_species_type),INTENT(IN) :: atomic_species
261    TYPE(atomic_structure_type),INTENT(IN) :: atomic_structure
262    TYPE(dft_type),INTENT(IN) :: dft
263    TYPE(spin_type),INTENT(IN) :: spin
264    TYPE(bands_type),INTENT(IN) :: bands
265    TYPE(basis_type),INTENT(IN) :: basis
266    TYPE(electron_control_type),INTENT(IN) :: electron_control
267    TYPE(k_points_IBZ_type),INTENT(IN) :: k_points_IBZ
268    TYPE(ion_control_type),INTENT(IN) :: ion_control
269    TYPE(cell_control_type),INTENT(IN) :: cell_control
270    TYPE(symmetry_flags_type),OPTIONAL,INTENT(IN) :: symmetry_flags
271    TYPE(boundary_conditions_type),OPTIONAL,INTENT(IN) :: boundary_conditions
272    TYPE(ekin_functional_type),OPTIONAL,INTENT(IN) :: ekin_functional
273    TYPE(matrix_type),OPTIONAL,INTENT(IN) :: external_atomic_forces
274    TYPE(integerMatrix_type),OPTIONAL,INTENT(IN) :: free_positions
275    TYPE(matrix_type),OPTIONAL,INTENT(IN) :: starting_atomic_velocities
276    TYPE(electric_field_type),OPTIONAL,INTENT(IN) :: electric_field
277    TYPE(atomic_constraints_type),OPTIONAL,INTENT(IN) :: atomic_constraints
278    TYPE(spin_constraints_type),OPTIONAL,INTENT(IN) :: spin_constraints
279    !
280    obj%tagname = TRIM(tagname)
281    obj%lwrite = .TRUE.
282    obj%lread = .TRUE.
283    !
284    obj%control_variables = control_variables
285    obj%atomic_species = atomic_species
286    obj%atomic_structure = atomic_structure
287    obj%dft = dft
288    obj%spin = spin
289    obj%bands = bands
290    obj%basis = basis
291    obj%electron_control = electron_control
292    obj%k_points_IBZ = k_points_IBZ
293    obj%ion_control = ion_control
294    obj%cell_control = cell_control
295    IF ( PRESENT(symmetry_flags)) THEN
296      obj%symmetry_flags_ispresent = .TRUE.
297      obj%symmetry_flags = symmetry_flags
298    ELSE
299      obj%symmetry_flags_ispresent = .FALSE.
300    END IF
301    IF ( PRESENT(boundary_conditions)) THEN
302      obj%boundary_conditions_ispresent = .TRUE.
303      obj%boundary_conditions = boundary_conditions
304    ELSE
305      obj%boundary_conditions_ispresent = .FALSE.
306    END IF
307    IF ( PRESENT(ekin_functional)) THEN
308      obj%ekin_functional_ispresent = .TRUE.
309      obj%ekin_functional = ekin_functional
310    ELSE
311      obj%ekin_functional_ispresent = .FALSE.
312    END IF
313    IF ( PRESENT(external_atomic_forces)) THEN
314      obj%external_atomic_forces_ispresent = .TRUE.
315      obj%external_atomic_forces = external_atomic_forces
316    ELSE
317      obj%external_atomic_forces_ispresent = .FALSE.
318    END IF
319    IF ( PRESENT(free_positions)) THEN
320      obj%free_positions_ispresent = .TRUE.
321      obj%free_positions = free_positions
322    ELSE
323      obj%free_positions_ispresent = .FALSE.
324    END IF
325    IF ( PRESENT(starting_atomic_velocities)) THEN
326      obj%starting_atomic_velocities_ispresent = .TRUE.
327      obj%starting_atomic_velocities = starting_atomic_velocities
328    ELSE
329      obj%starting_atomic_velocities_ispresent = .FALSE.
330    END IF
331    IF ( PRESENT(electric_field)) THEN
332      obj%electric_field_ispresent = .TRUE.
333      obj%electric_field = electric_field
334    ELSE
335      obj%electric_field_ispresent = .FALSE.
336    END IF
337    IF ( PRESENT(atomic_constraints)) THEN
338      obj%atomic_constraints_ispresent = .TRUE.
339      obj%atomic_constraints = atomic_constraints
340    ELSE
341      obj%atomic_constraints_ispresent = .FALSE.
342    END IF
343    IF ( PRESENT(spin_constraints)) THEN
344      obj%spin_constraints_ispresent = .TRUE.
345      obj%spin_constraints = spin_constraints
346    ELSE
347      obj%spin_constraints_ispresent = .FALSE.
348    END IF
349    !
350  END SUBROUTINE qes_init_input
351  !
352  !
353  SUBROUTINE qes_init_step(obj, tagname, n_step, scf_conv, atomic_structure, total_energy, forces,&
354                          stress, FCP_force, FCP_tot_charge)
355    !
356    IMPLICIT NONE
357    !
358    TYPE(step_type), INTENT(OUT) :: obj
359    CHARACTER(LEN=*), INTENT(IN) :: tagname
360    INTEGER, INTENT(IN) :: n_step
361    TYPE(scf_conv_type),INTENT(IN) :: scf_conv
362    TYPE(atomic_structure_type),INTENT(IN) :: atomic_structure
363    TYPE(total_energy_type),INTENT(IN) :: total_energy
364    TYPE(matrix_type),INTENT(IN) :: forces
365    TYPE(matrix_type),OPTIONAL,INTENT(IN) :: stress
366    REAL(DP),OPTIONAL,INTENT(IN) :: FCP_force
367    REAL(DP),OPTIONAL,INTENT(IN) :: FCP_tot_charge
368    !
369    obj%tagname = TRIM(tagname)
370    obj%lwrite = .TRUE.
371    obj%lread = .TRUE.
372    obj%n_step = n_step
373    !
374    obj%scf_conv = scf_conv
375    obj%atomic_structure = atomic_structure
376    obj%total_energy = total_energy
377    obj%forces = forces
378    IF ( PRESENT(stress)) THEN
379      obj%stress_ispresent = .TRUE.
380      obj%stress = stress
381    ELSE
382      obj%stress_ispresent = .FALSE.
383    END IF
384    IF ( PRESENT(FCP_force)) THEN
385      obj%FCP_force_ispresent = .TRUE.
386      obj%FCP_force = FCP_force
387    ELSE
388      obj%FCP_force_ispresent = .FALSE.
389    END IF
390    IF ( PRESENT(FCP_tot_charge)) THEN
391      obj%FCP_tot_charge_ispresent = .TRUE.
392      obj%FCP_tot_charge = FCP_tot_charge
393    ELSE
394      obj%FCP_tot_charge_ispresent = .FALSE.
395    END IF
396    !
397  END SUBROUTINE qes_init_step
398  !
399  !
400  SUBROUTINE qes_init_output(obj, tagname, algorithmic_info, atomic_species, atomic_structure,&
401                            basis_set, dft, magnetization, total_energy, band_structure, convergence_info,&
402                            symmetries, boundary_conditions, forces, stress, electric_field,&
403                            FCP_force, FCP_tot_charge)
404    !
405    IMPLICIT NONE
406    !
407    TYPE(output_type), INTENT(OUT) :: obj
408    CHARACTER(LEN=*), INTENT(IN) :: tagname
409    TYPE(convergence_info_type),OPTIONAL,INTENT(IN) :: convergence_info
410    TYPE(algorithmic_info_type),INTENT(IN) :: algorithmic_info
411    TYPE(atomic_species_type),INTENT(IN) :: atomic_species
412    TYPE(atomic_structure_type),INTENT(IN) :: atomic_structure
413    TYPE(symmetries_type),OPTIONAL,INTENT(IN) :: symmetries
414    TYPE(basis_set_type),INTENT(IN) :: basis_set
415    TYPE(dft_type),INTENT(IN) :: dft
416    TYPE(outputPBC_type),OPTIONAL,INTENT(IN) :: boundary_conditions
417    TYPE(magnetization_type),INTENT(IN) :: magnetization
418    TYPE(total_energy_type),INTENT(IN) :: total_energy
419    TYPE(band_structure_type),INTENT(IN) :: band_structure
420    TYPE(matrix_type),OPTIONAL,INTENT(IN) :: forces
421    TYPE(matrix_type),OPTIONAL,INTENT(IN) :: stress
422    TYPE(outputElectricField_type),OPTIONAL,INTENT(IN) :: electric_field
423    REAL(DP),OPTIONAL,INTENT(IN) :: FCP_force
424    REAL(DP),OPTIONAL,INTENT(IN) :: FCP_tot_charge
425    !
426    obj%tagname = TRIM(tagname)
427    obj%lwrite = .TRUE.
428    obj%lread = .TRUE.
429    !
430    IF ( PRESENT(convergence_info)) THEN
431      obj%convergence_info_ispresent = .TRUE.
432      obj%convergence_info = convergence_info
433    ELSE
434      obj%convergence_info_ispresent = .FALSE.
435    END IF
436    obj%algorithmic_info = algorithmic_info
437    obj%atomic_species = atomic_species
438    obj%atomic_structure = atomic_structure
439    IF ( PRESENT(symmetries)) THEN
440      obj%symmetries_ispresent = .TRUE.
441      obj%symmetries = symmetries
442    ELSE
443      obj%symmetries_ispresent = .FALSE.
444    END IF
445    obj%basis_set = basis_set
446    obj%dft = dft
447    IF ( PRESENT(boundary_conditions)) THEN
448      obj%boundary_conditions_ispresent = .TRUE.
449      obj%boundary_conditions = boundary_conditions
450    ELSE
451      obj%boundary_conditions_ispresent = .FALSE.
452    END IF
453    obj%magnetization = magnetization
454    obj%total_energy = total_energy
455    obj%band_structure = band_structure
456    IF ( PRESENT(forces)) THEN
457      obj%forces_ispresent = .TRUE.
458      obj%forces = forces
459    ELSE
460      obj%forces_ispresent = .FALSE.
461    END IF
462    IF ( PRESENT(stress)) THEN
463      obj%stress_ispresent = .TRUE.
464      obj%stress = stress
465    ELSE
466      obj%stress_ispresent = .FALSE.
467    END IF
468    IF ( PRESENT(electric_field)) THEN
469      obj%electric_field_ispresent = .TRUE.
470      obj%electric_field = electric_field
471    ELSE
472      obj%electric_field_ispresent = .FALSE.
473    END IF
474    IF ( PRESENT(FCP_force)) THEN
475      obj%FCP_force_ispresent = .TRUE.
476      obj%FCP_force = FCP_force
477    ELSE
478      obj%FCP_force_ispresent = .FALSE.
479    END IF
480    IF ( PRESENT(FCP_tot_charge)) THEN
481      obj%FCP_tot_charge_ispresent = .TRUE.
482      obj%FCP_tot_charge = FCP_tot_charge
483    ELSE
484      obj%FCP_tot_charge_ispresent = .FALSE.
485    END IF
486    !
487  END SUBROUTINE qes_init_output
488  !
489  !
490  SUBROUTINE qes_init_timing(obj, tagname, total, partial)
491    !
492    IMPLICIT NONE
493    !
494    TYPE(timing_type), INTENT(OUT) :: obj
495    CHARACTER(LEN=*), INTENT(IN) :: tagname
496    TYPE(clock_type),INTENT(IN) :: total
497    TYPE(clock_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: partial
498    !
499    obj%tagname = TRIM(tagname)
500    obj%lwrite = .TRUE.
501    obj%lread = .TRUE.
502    !
503    obj%total = total
504    IF ( PRESENT(partial)) THEN
505      obj%partial_ispresent = .TRUE.
506      ALLOCATE(obj%partial(SIZE(partial)))
507      obj%ndim_partial = SIZE(partial)
508      obj%partial = partial
509    ELSE
510      obj%partial_ispresent = .FALSE.
511    END IF
512    !
513  END SUBROUTINE qes_init_timing
514  !
515  !
516  SUBROUTINE qes_init_clock(obj, tagname, label, cpu, wall, calls)
517    !
518    IMPLICIT NONE
519    !
520    TYPE(clock_type), INTENT(OUT) :: obj
521    CHARACTER(LEN=*), INTENT(IN) :: tagname
522    CHARACTER(LEN=*), INTENT(IN) :: label
523    INTEGER, OPTIONAL, INTENT(IN) :: calls
524    REAL(DP),INTENT(IN) :: cpu
525    REAL(DP),INTENT(IN) :: wall
526    !
527    obj%tagname = TRIM(tagname)
528    obj%lwrite = .TRUE.
529    obj%lread = .TRUE.
530    obj%label = label
531    IF (PRESENT(calls)) THEN
532      obj%calls_ispresent = .TRUE.
533      obj%calls = calls
534    ELSE
535      obj%calls_ispresent = .FALSE.
536    END IF
537    !
538    obj%cpu = cpu
539    obj%wall = wall
540    !
541  END SUBROUTINE qes_init_clock
542  !
543  !
544  SUBROUTINE qes_init_control_variables(obj, tagname, title, calculation, restart_mode, prefix,&
545                                       pseudo_dir, outdir, stress, forces, wf_collect, disk_io,&
546                                       max_seconds, etot_conv_thr, forc_conv_thr, press_conv_thr,&
547                                       verbosity, print_every, nstep)
548    !
549    IMPLICIT NONE
550    !
551    TYPE(control_variables_type), INTENT(OUT) :: obj
552    CHARACTER(LEN=*), INTENT(IN) :: tagname
553    CHARACTER(LEN=*),INTENT(IN) :: title
554    CHARACTER(LEN=*),INTENT(IN) :: calculation
555    CHARACTER(LEN=*),INTENT(IN) :: restart_mode
556    CHARACTER(LEN=*),INTENT(IN) :: prefix
557    CHARACTER(LEN=*),INTENT(IN) :: pseudo_dir
558    CHARACTER(LEN=*),INTENT(IN) :: outdir
559    LOGICAL,INTENT(IN) :: stress
560    LOGICAL,INTENT(IN) :: forces
561    LOGICAL,INTENT(IN) :: wf_collect
562    CHARACTER(LEN=*),INTENT(IN) :: disk_io
563    INTEGER,INTENT(IN) :: max_seconds
564    INTEGER,OPTIONAL,INTENT(IN) :: nstep
565    REAL(DP),INTENT(IN) :: etot_conv_thr
566    REAL(DP),INTENT(IN) :: forc_conv_thr
567    REAL(DP),INTENT(IN) :: press_conv_thr
568    CHARACTER(LEN=*),INTENT(IN) :: verbosity
569    INTEGER,INTENT(IN) :: print_every
570    !
571    obj%tagname = TRIM(tagname)
572    obj%lwrite = .TRUE.
573    obj%lread = .TRUE.
574    !
575    obj%title = title
576    obj%calculation = calculation
577    obj%restart_mode = restart_mode
578    obj%prefix = prefix
579    obj%pseudo_dir = pseudo_dir
580    obj%outdir = outdir
581    obj%stress = stress
582    obj%forces = forces
583    obj%wf_collect = wf_collect
584    obj%disk_io = disk_io
585    obj%max_seconds = max_seconds
586    IF ( PRESENT(nstep)) THEN
587      obj%nstep_ispresent = .TRUE.
588      obj%nstep = nstep
589    ELSE
590      obj%nstep_ispresent = .FALSE.
591    END IF
592    obj%etot_conv_thr = etot_conv_thr
593    obj%forc_conv_thr = forc_conv_thr
594    obj%press_conv_thr = press_conv_thr
595    obj%verbosity = verbosity
596    obj%print_every = print_every
597    !
598  END SUBROUTINE qes_init_control_variables
599  !
600  !
601  SUBROUTINE qes_init_xml_format(obj, tagname, NAME, VERSION, xml_format)
602    !
603    IMPLICIT NONE
604    !
605    TYPE(xml_format_type), INTENT(OUT) :: obj
606    CHARACTER(LEN=*), INTENT(IN) :: tagname
607    CHARACTER(LEN=*), INTENT(IN) :: NAME
608    CHARACTER(LEN=*), INTENT(IN) :: VERSION
609    CHARACTER(LEN=*), INTENT(IN) :: xml_format
610    !
611    obj%tagname = TRIM(tagname)
612    obj%lwrite = .TRUE.
613    obj%lread = .TRUE.
614    obj%NAME = NAME
615    obj%VERSION = VERSION
616    !
617    obj%xml_format = xml_format
618    !
619  END SUBROUTINE qes_init_xml_format
620  !
621  !
622  SUBROUTINE qes_init_creator(obj, tagname, NAME, VERSION, creator)
623    !
624    IMPLICIT NONE
625    !
626    TYPE(creator_type), INTENT(OUT) :: obj
627    CHARACTER(LEN=*), INTENT(IN) :: tagname
628    CHARACTER(LEN=*), INTENT(IN) :: NAME
629    CHARACTER(LEN=*), INTENT(IN) :: VERSION
630    CHARACTER(LEN=*), INTENT(IN) :: creator
631    !
632    obj%tagname = TRIM(tagname)
633    obj%lwrite = .TRUE.
634    obj%lread = .TRUE.
635    obj%NAME = NAME
636    obj%VERSION = VERSION
637    !
638    obj%creator = creator
639    !
640  END SUBROUTINE qes_init_creator
641  !
642  !
643  SUBROUTINE qes_init_created(obj, tagname, DATE, TIME, created)
644    !
645    IMPLICIT NONE
646    !
647    TYPE(created_type), INTENT(OUT) :: obj
648    CHARACTER(LEN=*), INTENT(IN) :: tagname
649    CHARACTER(LEN=*), INTENT(IN) :: DATE
650    CHARACTER(LEN=*), INTENT(IN) :: TIME
651    CHARACTER(LEN=*), INTENT(IN) :: created
652    !
653    obj%tagname = TRIM(tagname)
654    obj%lwrite = .TRUE.
655    obj%lread = .TRUE.
656    obj%DATE = DATE
657    obj%TIME = TIME
658    !
659    obj%created = created
660    !
661  END SUBROUTINE qes_init_created
662  !
663  !
664  SUBROUTINE qes_init_atomic_species(obj, tagname, ntyp, species, pseudo_dir)
665    !
666    IMPLICIT NONE
667    !
668    TYPE(atomic_species_type), INTENT(OUT) :: obj
669    CHARACTER(LEN=*), INTENT(IN) :: tagname
670    INTEGER, INTENT(IN) :: ntyp
671    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: pseudo_dir
672    TYPE(species_type),DIMENSION(:),INTENT(IN) :: species
673    !
674    obj%tagname = TRIM(tagname)
675    obj%lwrite = .TRUE.
676    obj%lread = .TRUE.
677    obj%ntyp = ntyp
678    IF (PRESENT(pseudo_dir)) THEN
679      obj%pseudo_dir_ispresent = .TRUE.
680      obj%pseudo_dir = pseudo_dir
681    ELSE
682      obj%pseudo_dir_ispresent = .FALSE.
683    END IF
684    !
685    ALLOCATE( obj%species(SIZE(species)))
686    obj%ndim_species = SIZE(species)
687    obj%species = species
688    !
689  END SUBROUTINE qes_init_atomic_species
690  !
691  !
692  SUBROUTINE qes_init_species(obj, tagname, name, pseudo_file, mass, starting_magnetization, spin_teta, spin_phi)
693    !
694    IMPLICIT NONE
695    !
696    TYPE(species_type), INTENT(OUT) :: obj
697    CHARACTER(LEN=*), INTENT(IN) :: tagname
698    CHARACTER(LEN=*), INTENT(IN) :: name
699    REAL(DP),OPTIONAL,INTENT(IN) :: mass
700    CHARACTER(LEN=*),INTENT(IN) :: pseudo_file
701    REAL(DP),OPTIONAL,INTENT(IN) :: starting_magnetization
702    REAL(DP),OPTIONAL,INTENT(IN) :: spin_teta
703    REAL(DP),OPTIONAL,INTENT(IN) :: spin_phi
704    !
705    obj%tagname = TRIM(tagname)
706    obj%lwrite = .TRUE.
707    obj%lread = .TRUE.
708    obj%name = name
709    !
710    IF ( PRESENT(mass)) THEN
711      obj%mass_ispresent = .TRUE.
712      obj%mass = mass
713    ELSE
714      obj%mass_ispresent = .FALSE.
715    END IF
716    obj%pseudo_file = pseudo_file
717    IF ( PRESENT(starting_magnetization)) THEN
718      obj%starting_magnetization_ispresent = .TRUE.
719      obj%starting_magnetization = starting_magnetization
720    ELSE
721      obj%starting_magnetization_ispresent = .FALSE.
722    END IF
723    IF ( PRESENT(spin_teta)) THEN
724      obj%spin_teta_ispresent = .TRUE.
725      obj%spin_teta = spin_teta
726    ELSE
727      obj%spin_teta_ispresent = .FALSE.
728    END IF
729    IF ( PRESENT(spin_phi)) THEN
730      obj%spin_phi_ispresent = .TRUE.
731      obj%spin_phi = spin_phi
732    ELSE
733      obj%spin_phi_ispresent = .FALSE.
734    END IF
735    !
736  END SUBROUTINE qes_init_species
737  !
738  !
739  SUBROUTINE qes_init_atomic_structure(obj, tagname, nat, cell, alat, bravais_index, alternative_axes,&
740                                      atomic_positions, wyckoff_positions, crystal_positions)
741    !
742    IMPLICIT NONE
743    !
744    TYPE(atomic_structure_type), INTENT(OUT) :: obj
745    CHARACTER(LEN=*), INTENT(IN) :: tagname
746    INTEGER, INTENT(IN) :: nat
747    REAL(DP), OPTIONAL, INTENT(IN) :: alat
748    INTEGER, OPTIONAL, INTENT(IN) :: bravais_index
749    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: alternative_axes
750    TYPE(atomic_positions_type),OPTIONAL,INTENT(IN) :: atomic_positions
751    TYPE(wyckoff_positions_type),OPTIONAL,INTENT(IN) :: wyckoff_positions
752    TYPE(atomic_positions_type),OPTIONAL,INTENT(IN) :: crystal_positions
753    TYPE(cell_type),INTENT(IN) :: cell
754    !
755    obj%tagname = TRIM(tagname)
756    obj%lwrite = .TRUE.
757    obj%lread = .TRUE.
758    obj%nat = nat
759    IF (PRESENT(alat)) THEN
760      obj%alat_ispresent = .TRUE.
761      obj%alat = alat
762    ELSE
763      obj%alat_ispresent = .FALSE.
764    END IF
765    IF (PRESENT(bravais_index)) THEN
766      obj%bravais_index_ispresent = .TRUE.
767      obj%bravais_index = bravais_index
768    ELSE
769      obj%bravais_index_ispresent = .FALSE.
770    END IF
771    IF (PRESENT(alternative_axes)) THEN
772      obj%alternative_axes_ispresent = .TRUE.
773      obj%alternative_axes = alternative_axes
774    ELSE
775      obj%alternative_axes_ispresent = .FALSE.
776    END IF
777    !
778    IF ( PRESENT(atomic_positions)) THEN
779      obj%atomic_positions_ispresent = .TRUE.
780      obj%atomic_positions = atomic_positions
781    ELSE
782      obj%atomic_positions_ispresent = .FALSE.
783    END IF
784    IF ( PRESENT(wyckoff_positions)) THEN
785      obj%wyckoff_positions_ispresent = .TRUE.
786      obj%wyckoff_positions = wyckoff_positions
787    ELSE
788      obj%wyckoff_positions_ispresent = .FALSE.
789    END IF
790    IF ( PRESENT(crystal_positions)) THEN
791      obj%crystal_positions_ispresent = .TRUE.
792      obj%crystal_positions = crystal_positions
793    ELSE
794      obj%crystal_positions_ispresent = .FALSE.
795    END IF
796    obj%cell = cell
797    !
798  END SUBROUTINE qes_init_atomic_structure
799  !
800  !
801  SUBROUTINE qes_init_atomic_positions(obj, tagname, atom)
802    !
803    IMPLICIT NONE
804    !
805    TYPE(atomic_positions_type), INTENT(OUT) :: obj
806    CHARACTER(LEN=*), INTENT(IN) :: tagname
807    TYPE(atom_type),DIMENSION(:),INTENT(IN) :: atom
808    !
809    obj%tagname = TRIM(tagname)
810    obj%lwrite = .TRUE.
811    obj%lread = .TRUE.
812    !
813    ALLOCATE( obj%atom(SIZE(atom)))
814    obj%ndim_atom = SIZE(atom)
815    obj%atom = atom
816    !
817  END SUBROUTINE qes_init_atomic_positions
818  !
819  !
820  SUBROUTINE qes_init_atom(obj, tagname, name, atom, position, index)
821    !
822    IMPLICIT NONE
823    !
824    TYPE(atom_type), INTENT(OUT) :: obj
825    CHARACTER(LEN=*), INTENT(IN) :: tagname
826    CHARACTER(LEN=*), INTENT(IN) :: name
827    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: position
828    INTEGER, OPTIONAL, INTENT(IN) :: index
829    REAL(DP), DIMENSION(3), INTENT(IN) :: atom
830    !
831    obj%tagname = TRIM(tagname)
832    obj%lwrite = .TRUE.
833    obj%lread = .TRUE.
834    obj%name = name
835    IF (PRESENT(position)) THEN
836      obj%position_ispresent = .TRUE.
837      obj%position = position
838    ELSE
839      obj%position_ispresent = .FALSE.
840    END IF
841    IF (PRESENT(index)) THEN
842      obj%index_ispresent = .TRUE.
843      obj%index = index
844    ELSE
845      obj%index_ispresent = .FALSE.
846    END IF
847    !
848    obj%atom = atom
849    !
850  END SUBROUTINE qes_init_atom
851  !
852  !
853  SUBROUTINE qes_init_wyckoff_positions(obj, tagname, space_group, atom, more_options)
854    !
855    IMPLICIT NONE
856    !
857    TYPE(wyckoff_positions_type), INTENT(OUT) :: obj
858    CHARACTER(LEN=*), INTENT(IN) :: tagname
859    INTEGER, INTENT(IN) :: space_group
860    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: more_options
861    TYPE(atom_type),DIMENSION(:),INTENT(IN) :: atom
862    !
863    obj%tagname = TRIM(tagname)
864    obj%lwrite = .TRUE.
865    obj%lread = .TRUE.
866    obj%space_group = space_group
867    IF (PRESENT(more_options)) THEN
868      obj%more_options_ispresent = .TRUE.
869      obj%more_options = more_options
870    ELSE
871      obj%more_options_ispresent = .FALSE.
872    END IF
873    !
874    ALLOCATE( obj%atom(SIZE(atom)))
875    obj%ndim_atom = SIZE(atom)
876    obj%atom = atom
877    !
878  END SUBROUTINE qes_init_wyckoff_positions
879  !
880  !
881  SUBROUTINE qes_init_cell(obj, tagname, a1, a2, a3)
882    !
883    IMPLICIT NONE
884    !
885    TYPE(cell_type), INTENT(OUT) :: obj
886    CHARACTER(LEN=*), INTENT(IN) :: tagname
887    REAL(DP), DIMENSION(3),INTENT(IN) :: a1
888    REAL(DP), DIMENSION(3),INTENT(IN) :: a2
889    REAL(DP), DIMENSION(3),INTENT(IN) :: a3
890    !
891    obj%tagname = TRIM(tagname)
892    obj%lwrite = .TRUE.
893    obj%lread = .TRUE.
894    !
895    obj%a1 = a1
896    obj%a2 = a2
897    obj%a3 = a3
898    !
899  END SUBROUTINE qes_init_cell
900  !
901  !
902  SUBROUTINE qes_init_dft(obj, tagname, functional, hybrid, dftU, vdW)
903    !
904    IMPLICIT NONE
905    !
906    TYPE(dft_type), INTENT(OUT) :: obj
907    CHARACTER(LEN=*), INTENT(IN) :: tagname
908    CHARACTER(LEN=*),INTENT(IN) :: functional
909    TYPE(hybrid_type),OPTIONAL,INTENT(IN) :: hybrid
910    TYPE(dftU_type),OPTIONAL,INTENT(IN) :: dftU
911    TYPE(vdW_type),OPTIONAL,INTENT(IN) :: vdW
912    !
913    obj%tagname = TRIM(tagname)
914    obj%lwrite = .TRUE.
915    obj%lread = .TRUE.
916    !
917    obj%functional = functional
918    IF ( PRESENT(hybrid)) THEN
919      obj%hybrid_ispresent = .TRUE.
920      obj%hybrid = hybrid
921    ELSE
922      obj%hybrid_ispresent = .FALSE.
923    END IF
924    IF ( PRESENT(dftU)) THEN
925      obj%dftU_ispresent = .TRUE.
926      obj%dftU = dftU
927    ELSE
928      obj%dftU_ispresent = .FALSE.
929    END IF
930    IF ( PRESENT(vdW)) THEN
931      obj%vdW_ispresent = .TRUE.
932      obj%vdW = vdW
933    ELSE
934      obj%vdW_ispresent = .FALSE.
935    END IF
936    !
937  END SUBROUTINE qes_init_dft
938  !
939  !
940  SUBROUTINE qes_init_hybrid(obj, tagname, qpoint_grid, ecutfock, exx_fraction, screening_parameter,&
941                            exxdiv_treatment, x_gamma_extrapolation, ecutvcut, localization_threshold &
942                            )
943    !
944    IMPLICIT NONE
945    !
946    TYPE(hybrid_type), INTENT(OUT) :: obj
947    CHARACTER(LEN=*), INTENT(IN) :: tagname
948    TYPE(qpoint_grid_type),OPTIONAL,INTENT(IN) :: qpoint_grid
949    REAL(DP),OPTIONAL,INTENT(IN) :: ecutfock
950    REAL(DP),OPTIONAL,INTENT(IN) :: exx_fraction
951    REAL(DP),OPTIONAL,INTENT(IN) :: screening_parameter
952    CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: exxdiv_treatment
953    LOGICAL,OPTIONAL,INTENT(IN) :: x_gamma_extrapolation
954    REAL(DP),OPTIONAL,INTENT(IN) :: ecutvcut
955    REAL(DP),OPTIONAL,INTENT(IN) :: localization_threshold
956    !
957    obj%tagname = TRIM(tagname)
958    obj%lwrite = .TRUE.
959    obj%lread = .TRUE.
960    !
961    IF ( PRESENT(qpoint_grid)) THEN
962      obj%qpoint_grid_ispresent = .TRUE.
963      obj%qpoint_grid = qpoint_grid
964    ELSE
965      obj%qpoint_grid_ispresent = .FALSE.
966    END IF
967    IF ( PRESENT(ecutfock)) THEN
968      obj%ecutfock_ispresent = .TRUE.
969      obj%ecutfock = ecutfock
970    ELSE
971      obj%ecutfock_ispresent = .FALSE.
972    END IF
973    IF ( PRESENT(exx_fraction)) THEN
974      obj%exx_fraction_ispresent = .TRUE.
975      obj%exx_fraction = exx_fraction
976    ELSE
977      obj%exx_fraction_ispresent = .FALSE.
978    END IF
979    IF ( PRESENT(screening_parameter)) THEN
980      obj%screening_parameter_ispresent = .TRUE.
981      obj%screening_parameter = screening_parameter
982    ELSE
983      obj%screening_parameter_ispresent = .FALSE.
984    END IF
985    IF ( PRESENT(exxdiv_treatment)) THEN
986      obj%exxdiv_treatment_ispresent = .TRUE.
987      obj%exxdiv_treatment = exxdiv_treatment
988    ELSE
989      obj%exxdiv_treatment_ispresent = .FALSE.
990    END IF
991    IF ( PRESENT(x_gamma_extrapolation)) THEN
992      obj%x_gamma_extrapolation_ispresent = .TRUE.
993      obj%x_gamma_extrapolation = x_gamma_extrapolation
994    ELSE
995      obj%x_gamma_extrapolation_ispresent = .FALSE.
996    END IF
997    IF ( PRESENT(ecutvcut)) THEN
998      obj%ecutvcut_ispresent = .TRUE.
999      obj%ecutvcut = ecutvcut
1000    ELSE
1001      obj%ecutvcut_ispresent = .FALSE.
1002    END IF
1003    IF ( PRESENT(localization_threshold)) THEN
1004      obj%localization_threshold_ispresent = .TRUE.
1005      obj%localization_threshold = localization_threshold
1006    ELSE
1007      obj%localization_threshold_ispresent = .FALSE.
1008    END IF
1009    !
1010  END SUBROUTINE qes_init_hybrid
1011  !
1012  !
1013  SUBROUTINE qes_init_qpoint_grid(obj, tagname, nqx1, nqx2, nqx3, qpoint_grid)
1014    !
1015    IMPLICIT NONE
1016    !
1017    TYPE(qpoint_grid_type), INTENT(OUT) :: obj
1018    CHARACTER(LEN=*), INTENT(IN) :: tagname
1019    INTEGER, INTENT(IN) :: nqx1
1020    INTEGER, INTENT(IN) :: nqx2
1021    INTEGER, INTENT(IN) :: nqx3
1022    CHARACTER(LEN=*), INTENT(IN) :: qpoint_grid
1023    !
1024    obj%tagname = TRIM(tagname)
1025    obj%lwrite = .TRUE.
1026    obj%lread = .TRUE.
1027    obj%nqx1 = nqx1
1028    obj%nqx2 = nqx2
1029    obj%nqx3 = nqx3
1030    !
1031    obj%qpoint_grid = qpoint_grid
1032    !
1033  END SUBROUTINE qes_init_qpoint_grid
1034  !
1035  !
1036  SUBROUTINE qes_init_dftU(obj, tagname, lda_plus_u_kind, Hubbard_U, Hubbard_J0, Hubbard_alpha,&
1037                          Hubbard_beta, Hubbard_J, starting_ns, Hubbard_ns, U_projection_type,&
1038                          Hubbard_back, Hubbard_U_back, Hubbard_alpha_back, Hubbard_ns_nc)
1039    !
1040    IMPLICIT NONE
1041    !
1042    TYPE(dftU_type), INTENT(OUT) :: obj
1043    CHARACTER(LEN=*), INTENT(IN) :: tagname
1044    INTEGER,OPTIONAL,INTENT(IN) :: lda_plus_u_kind
1045    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_U
1046    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_J0
1047    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_alpha
1048    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_beta
1049    TYPE(HubbardJ_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_J
1050    TYPE(starting_ns_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: starting_ns
1051    TYPE(Hubbard_ns_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_ns
1052    CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: U_projection_type
1053    TYPE(HubbardBack_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_back
1054    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_U_back
1055    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_alpha_back
1056    TYPE(Hubbard_ns_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: Hubbard_ns_nc
1057    !
1058    obj%tagname = TRIM(tagname)
1059    obj%lwrite = .TRUE.
1060    obj%lread = .TRUE.
1061    !
1062    IF ( PRESENT(lda_plus_u_kind)) THEN
1063      obj%lda_plus_u_kind_ispresent = .TRUE.
1064      obj%lda_plus_u_kind = lda_plus_u_kind
1065    ELSE
1066      obj%lda_plus_u_kind_ispresent = .FALSE.
1067    END IF
1068    IF ( PRESENT(Hubbard_U)) THEN
1069      obj%Hubbard_U_ispresent = .TRUE.
1070      ALLOCATE(obj%Hubbard_U(SIZE(Hubbard_U)))
1071      obj%ndim_Hubbard_U = SIZE(Hubbard_U)
1072      obj%Hubbard_U = Hubbard_U
1073    ELSE
1074      obj%Hubbard_U_ispresent = .FALSE.
1075    END IF
1076    IF ( PRESENT(Hubbard_J0)) THEN
1077      obj%Hubbard_J0_ispresent = .TRUE.
1078      ALLOCATE(obj%Hubbard_J0(SIZE(Hubbard_J0)))
1079      obj%ndim_Hubbard_J0 = SIZE(Hubbard_J0)
1080      obj%Hubbard_J0 = Hubbard_J0
1081    ELSE
1082      obj%Hubbard_J0_ispresent = .FALSE.
1083    END IF
1084    IF ( PRESENT(Hubbard_alpha)) THEN
1085      obj%Hubbard_alpha_ispresent = .TRUE.
1086      ALLOCATE(obj%Hubbard_alpha(SIZE(Hubbard_alpha)))
1087      obj%ndim_Hubbard_alpha = SIZE(Hubbard_alpha)
1088      obj%Hubbard_alpha = Hubbard_alpha
1089    ELSE
1090      obj%Hubbard_alpha_ispresent = .FALSE.
1091    END IF
1092    IF ( PRESENT(Hubbard_beta)) THEN
1093      obj%Hubbard_beta_ispresent = .TRUE.
1094      ALLOCATE(obj%Hubbard_beta(SIZE(Hubbard_beta)))
1095      obj%ndim_Hubbard_beta = SIZE(Hubbard_beta)
1096      obj%Hubbard_beta = Hubbard_beta
1097    ELSE
1098      obj%Hubbard_beta_ispresent = .FALSE.
1099    END IF
1100    IF ( PRESENT(Hubbard_J)) THEN
1101      obj%Hubbard_J_ispresent = .TRUE.
1102      ALLOCATE(obj%Hubbard_J(SIZE(Hubbard_J)))
1103      obj%ndim_Hubbard_J = SIZE(Hubbard_J)
1104      obj%Hubbard_J = Hubbard_J
1105    ELSE
1106      obj%Hubbard_J_ispresent = .FALSE.
1107    END IF
1108    IF ( PRESENT(starting_ns)) THEN
1109      obj%starting_ns_ispresent = .TRUE.
1110      ALLOCATE(obj%starting_ns(SIZE(starting_ns)))
1111      obj%ndim_starting_ns = SIZE(starting_ns)
1112      obj%starting_ns = starting_ns
1113    ELSE
1114      obj%starting_ns_ispresent = .FALSE.
1115    END IF
1116    IF ( PRESENT(Hubbard_ns)) THEN
1117      obj%Hubbard_ns_ispresent = .TRUE.
1118      ALLOCATE(obj%Hubbard_ns(SIZE(Hubbard_ns)))
1119      obj%ndim_Hubbard_ns = SIZE(Hubbard_ns)
1120      obj%Hubbard_ns = Hubbard_ns
1121    ELSE
1122      obj%Hubbard_ns_ispresent = .FALSE.
1123    END IF
1124    IF ( PRESENT(U_projection_type)) THEN
1125      obj%U_projection_type_ispresent = .TRUE.
1126      obj%U_projection_type = U_projection_type
1127    ELSE
1128      obj%U_projection_type_ispresent = .FALSE.
1129    END IF
1130    IF ( PRESENT(Hubbard_back)) THEN
1131      obj%Hubbard_back_ispresent = .TRUE.
1132      ALLOCATE(obj%Hubbard_back(SIZE(Hubbard_back)))
1133      obj%ndim_Hubbard_back = SIZE(Hubbard_back)
1134      obj%Hubbard_back = Hubbard_back
1135    ELSE
1136      obj%Hubbard_back_ispresent = .FALSE.
1137    END IF
1138    IF ( PRESENT(Hubbard_U_back)) THEN
1139      obj%Hubbard_U_back_ispresent = .TRUE.
1140      ALLOCATE(obj%Hubbard_U_back(SIZE(Hubbard_U_back)))
1141      obj%ndim_Hubbard_U_back = SIZE(Hubbard_U_back)
1142      obj%Hubbard_U_back = Hubbard_U_back
1143    ELSE
1144      obj%Hubbard_U_back_ispresent = .FALSE.
1145    END IF
1146    IF ( PRESENT(Hubbard_alpha_back)) THEN
1147      obj%Hubbard_alpha_back_ispresent = .TRUE.
1148      ALLOCATE(obj%Hubbard_alpha_back(SIZE(Hubbard_alpha_back)))
1149      obj%ndim_Hubbard_alpha_back = SIZE(Hubbard_alpha_back)
1150      obj%Hubbard_alpha_back = Hubbard_alpha_back
1151    ELSE
1152      obj%Hubbard_alpha_back_ispresent = .FALSE.
1153    END IF
1154    IF ( PRESENT(Hubbard_ns_nc)) THEN
1155      obj%Hubbard_ns_nc_ispresent = .TRUE.
1156      ALLOCATE(obj%Hubbard_ns_nc(SIZE(Hubbard_ns_nc)))
1157      obj%ndim_Hubbard_ns_nc = SIZE(Hubbard_ns_nc)
1158      obj%Hubbard_ns_nc = Hubbard_ns_nc
1159    ELSE
1160      obj%Hubbard_ns_nc_ispresent = .FALSE.
1161    END IF
1162    !
1163  END SUBROUTINE qes_init_dftU
1164  !
1165  !
1166  SUBROUTINE qes_init_HubbardCommon(obj, tagname, specie, HubbardCommon, label)
1167    !
1168    IMPLICIT NONE
1169    !
1170    TYPE(HubbardCommon_type), INTENT(OUT) :: obj
1171    CHARACTER(LEN=*), INTENT(IN) :: tagname
1172    CHARACTER(LEN=*), INTENT(IN) :: specie
1173    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: label
1174    REAL(DP), INTENT(IN) :: HubbardCommon
1175    !
1176    obj%tagname = TRIM(tagname)
1177    obj%lwrite = .TRUE.
1178    obj%lread = .TRUE.
1179    obj%specie = specie
1180    IF (PRESENT(label)) THEN
1181      obj%label_ispresent = .TRUE.
1182      obj%label = label
1183    ELSE
1184      obj%label_ispresent = .FALSE.
1185    END IF
1186    !
1187    obj%HubbardCommon = HubbardCommon
1188    !
1189  END SUBROUTINE qes_init_HubbardCommon
1190  !
1191  !
1192  SUBROUTINE qes_init_HubbardJ(obj, tagname, specie, label, HubbardJ)
1193    !
1194    IMPLICIT NONE
1195    !
1196    TYPE(HubbardJ_type), INTENT(OUT) :: obj
1197    CHARACTER(LEN=*), INTENT(IN) :: tagname
1198    CHARACTER(LEN=*), INTENT(IN) :: specie
1199    CHARACTER(LEN=*), INTENT(IN) :: label
1200    REAL(DP), DIMENSION(3), INTENT(IN) :: HubbardJ
1201    !
1202    obj%tagname = TRIM(tagname)
1203    obj%lwrite = .TRUE.
1204    obj%lread = .TRUE.
1205    obj%specie = specie
1206    obj%label = label
1207    !
1208    obj%HubbardJ = HubbardJ
1209    !
1210  END SUBROUTINE qes_init_HubbardJ
1211  !
1212  !
1213  SUBROUTINE qes_init_starting_ns(obj, tagname, specie, label, spin, starting_ns)
1214    !
1215    IMPLICIT NONE
1216    !
1217    TYPE(starting_ns_type), INTENT(OUT) :: obj
1218    CHARACTER(LEN=*), INTENT(IN) :: tagname
1219    REAL(DP), DIMENSION(:), INTENT(IN) :: starting_ns
1220    CHARACTER(LEN=*), INTENT(IN) :: specie
1221    CHARACTER(LEN=*), INTENT(IN) :: label
1222    INTEGER, INTENT(IN) :: spin
1223    !
1224    obj%tagname = TRIM(tagname)
1225    obj%lwrite = .TRUE.
1226    obj%lread = .TRUE.
1227    !
1228    obj%specie = specie
1229    obj%label = label
1230    obj%spin = spin
1231    obj%size = size(starting_ns)
1232    ALLOCATE(obj%starting_ns(obj%size))
1233    obj%starting_ns = starting_ns
1234    !
1235  END SUBROUTINE qes_init_starting_ns
1236  !
1237  !
1238  SUBROUTINE qes_init_Hubbard_ns(obj, tagname, specie, label, spin, index, order, Hubbard_ns)
1239    !
1240    IMPLICIT NONE
1241    !
1242    TYPE(Hubbard_ns_type), INTENT(OUT) :: obj
1243    CHARACTER(LEN=*), INTENT(IN) :: tagname
1244    CHARACTER(LEN=*), INTENT(IN) :: specie
1245    CHARACTER(LEN=*), INTENT(IN) :: label
1246    INTEGER, INTENT(IN) :: spin
1247    INTEGER, INTENT(IN) :: index
1248    REAL(DP), DIMENSION(:,:), INTENT(IN) :: Hubbard_ns
1249    CHARACTER(LEN=*),INTENT(IN) :: order
1250    INTEGER :: length, i
1251    !
1252    obj%tagname = TRIM(tagname)
1253    obj%lwrite = .TRUE.
1254    obj%lread = .TRUE.
1255    obj%specie = specie
1256    obj%label = label
1257    obj%spin = spin
1258    obj%index = index
1259    !
1260
1261
1262
1263    obj%order = order
1264
1265    length = 1
1266    obj%rank = SIZE(shape(Hubbard_ns))
1267    ALLOCATE ( obj%dims(obj%rank))
1268    obj%dims = shape(Hubbard_ns)
1269    DO i = 1, obj%rank
1270      length = length * obj%dims(i)
1271    END DO
1272    ALLOCATE(obj%Hubbard_ns(length))
1273    obj%Hubbard_ns(1:length) = reshape(Hubbard_ns, [length])
1274    !
1275  END SUBROUTINE qes_init_Hubbard_ns
1276  !
1277  !
1278  SUBROUTINE qes_init_HubbardBack(obj, tagname, species, background, l_number)
1279    !
1280    IMPLICIT NONE
1281    !
1282    TYPE(HubbardBack_type), INTENT(OUT) :: obj
1283    CHARACTER(LEN=*), INTENT(IN) :: tagname
1284    CHARACTER(LEN=*), INTENT(IN) :: species
1285    CHARACTER(LEN=*),INTENT(IN) :: background
1286    TYPE(backL_type),DIMENSION(:),INTENT(IN) :: l_number
1287    !
1288    obj%tagname = TRIM(tagname)
1289    obj%lwrite = .TRUE.
1290    obj%lread = .TRUE.
1291    obj%species = species
1292    !
1293    obj%background = background
1294    ALLOCATE( obj%l_number(SIZE(l_number)))
1295    obj%ndim_l_number = SIZE(l_number)
1296    obj%l_number = l_number
1297    !
1298  END SUBROUTINE qes_init_HubbardBack
1299  !
1300  !
1301  SUBROUTINE qes_init_backL(obj, tagname, l_index, backL)
1302    !
1303    IMPLICIT NONE
1304    !
1305    TYPE(backL_type), INTENT(OUT) :: obj
1306    CHARACTER(LEN=*), INTENT(IN) :: tagname
1307    INTEGER, INTENT(IN) :: l_index
1308    INTEGER, INTENT(IN) :: backL
1309    !
1310    obj%tagname = TRIM(tagname)
1311    obj%lwrite = .TRUE.
1312    obj%lread = .TRUE.
1313    obj%l_index = l_index
1314    !
1315    obj%backL = backL
1316    !
1317  END SUBROUTINE qes_init_backL
1318  !
1319  !
1320  SUBROUTINE qes_init_vdW(obj, tagname, vdw_corr, dftd3_version, dftd3_threebody, non_local_term,&
1321                         functional, total_energy_term, london_s6, ts_vdw_econv_thr, ts_vdw_isolated,&
1322                         london_rcut, xdm_a1, xdm_a2, london_c6)
1323    !
1324    IMPLICIT NONE
1325    !
1326    TYPE(vdW_type), INTENT(OUT) :: obj
1327    CHARACTER(LEN=*), INTENT(IN) :: tagname
1328    CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: vdw_corr
1329    INTEGER,OPTIONAL,INTENT(IN) :: dftd3_version
1330    LOGICAL,OPTIONAL,INTENT(IN) :: dftd3_threebody
1331    CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: non_local_term
1332    CHARACTER(LEN=*),OPTIONAL,INTENT(IN) :: functional
1333    REAL(DP),OPTIONAL,INTENT(IN) :: total_energy_term
1334    REAL(DP),OPTIONAL,INTENT(IN) :: london_s6
1335    REAL(DP),OPTIONAL,INTENT(IN) :: ts_vdw_econv_thr
1336    LOGICAL,OPTIONAL,INTENT(IN) :: ts_vdw_isolated
1337    REAL(DP),OPTIONAL,INTENT(IN) :: london_rcut
1338    REAL(DP),OPTIONAL,INTENT(IN) :: xdm_a1
1339    REAL(DP),OPTIONAL,INTENT(IN) :: xdm_a2
1340    TYPE(HubbardCommon_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: london_c6
1341    !
1342    obj%tagname = TRIM(tagname)
1343    obj%lwrite = .TRUE.
1344    obj%lread = .TRUE.
1345    !
1346    IF ( PRESENT(vdw_corr)) THEN
1347      obj%vdw_corr_ispresent = .TRUE.
1348      obj%vdw_corr = vdw_corr
1349    ELSE
1350      obj%vdw_corr_ispresent = .FALSE.
1351    END IF
1352    IF ( PRESENT(dftd3_version)) THEN
1353      obj%dftd3_version_ispresent = .TRUE.
1354      obj%dftd3_version = dftd3_version
1355    ELSE
1356      obj%dftd3_version_ispresent = .FALSE.
1357    END IF
1358    IF ( PRESENT(dftd3_threebody)) THEN
1359      obj%dftd3_threebody_ispresent = .TRUE.
1360      obj%dftd3_threebody = dftd3_threebody
1361    ELSE
1362      obj%dftd3_threebody_ispresent = .FALSE.
1363    END IF
1364    IF ( PRESENT(non_local_term)) THEN
1365      obj%non_local_term_ispresent = .TRUE.
1366      obj%non_local_term = non_local_term
1367    ELSE
1368      obj%non_local_term_ispresent = .FALSE.
1369    END IF
1370    IF ( PRESENT(functional)) THEN
1371      obj%functional_ispresent = .TRUE.
1372      obj%functional = functional
1373    ELSE
1374      obj%functional_ispresent = .FALSE.
1375    END IF
1376    IF ( PRESENT(total_energy_term)) THEN
1377      obj%total_energy_term_ispresent = .TRUE.
1378      obj%total_energy_term = total_energy_term
1379    ELSE
1380      obj%total_energy_term_ispresent = .FALSE.
1381    END IF
1382    IF ( PRESENT(london_s6)) THEN
1383      obj%london_s6_ispresent = .TRUE.
1384      obj%london_s6 = london_s6
1385    ELSE
1386      obj%london_s6_ispresent = .FALSE.
1387    END IF
1388    IF ( PRESENT(ts_vdw_econv_thr)) THEN
1389      obj%ts_vdw_econv_thr_ispresent = .TRUE.
1390      obj%ts_vdw_econv_thr = ts_vdw_econv_thr
1391    ELSE
1392      obj%ts_vdw_econv_thr_ispresent = .FALSE.
1393    END IF
1394    IF ( PRESENT(ts_vdw_isolated)) THEN
1395      obj%ts_vdw_isolated_ispresent = .TRUE.
1396      obj%ts_vdw_isolated = ts_vdw_isolated
1397    ELSE
1398      obj%ts_vdw_isolated_ispresent = .FALSE.
1399    END IF
1400    IF ( PRESENT(london_rcut)) THEN
1401      obj%london_rcut_ispresent = .TRUE.
1402      obj%london_rcut = london_rcut
1403    ELSE
1404      obj%london_rcut_ispresent = .FALSE.
1405    END IF
1406    IF ( PRESENT(xdm_a1)) THEN
1407      obj%xdm_a1_ispresent = .TRUE.
1408      obj%xdm_a1 = xdm_a1
1409    ELSE
1410      obj%xdm_a1_ispresent = .FALSE.
1411    END IF
1412    IF ( PRESENT(xdm_a2)) THEN
1413      obj%xdm_a2_ispresent = .TRUE.
1414      obj%xdm_a2 = xdm_a2
1415    ELSE
1416      obj%xdm_a2_ispresent = .FALSE.
1417    END IF
1418    IF ( PRESENT(london_c6)) THEN
1419      obj%london_c6_ispresent = .TRUE.
1420      ALLOCATE(obj%london_c6(SIZE(london_c6)))
1421      obj%ndim_london_c6 = SIZE(london_c6)
1422      obj%london_c6 = london_c6
1423    ELSE
1424      obj%london_c6_ispresent = .FALSE.
1425    END IF
1426    !
1427  END SUBROUTINE qes_init_vdW
1428  !
1429  !
1430  SUBROUTINE qes_init_spin(obj, tagname, lsda, noncolin, spinorbit)
1431    !
1432    IMPLICIT NONE
1433    !
1434    TYPE(spin_type), INTENT(OUT) :: obj
1435    CHARACTER(LEN=*), INTENT(IN) :: tagname
1436    LOGICAL,INTENT(IN) :: lsda
1437    LOGICAL,INTENT(IN) :: noncolin
1438    LOGICAL,INTENT(IN) :: spinorbit
1439    !
1440    obj%tagname = TRIM(tagname)
1441    obj%lwrite = .TRUE.
1442    obj%lread = .TRUE.
1443    !
1444    obj%lsda = lsda
1445    obj%noncolin = noncolin
1446    obj%spinorbit = spinorbit
1447    !
1448  END SUBROUTINE qes_init_spin
1449  !
1450  !
1451  SUBROUTINE qes_init_bands(obj, tagname, occupations, nbnd, smearing, tot_charge, tot_magnetization, inputOccupations)
1452    !
1453    IMPLICIT NONE
1454    !
1455    TYPE(bands_type), INTENT(OUT) :: obj
1456    CHARACTER(LEN=*), INTENT(IN) :: tagname
1457    INTEGER,OPTIONAL,INTENT(IN) :: nbnd
1458    TYPE(smearing_type),OPTIONAL,INTENT(IN) :: smearing
1459    REAL(DP),OPTIONAL,INTENT(IN) :: tot_charge
1460    REAL(DP),OPTIONAL,INTENT(IN) :: tot_magnetization
1461    TYPE(occupations_type),INTENT(IN) :: occupations
1462    TYPE(inputOccupations_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: inputOccupations
1463    !
1464    obj%tagname = TRIM(tagname)
1465    obj%lwrite = .TRUE.
1466    obj%lread = .TRUE.
1467    !
1468    IF ( PRESENT(nbnd)) THEN
1469      obj%nbnd_ispresent = .TRUE.
1470      obj%nbnd = nbnd
1471    ELSE
1472      obj%nbnd_ispresent = .FALSE.
1473    END IF
1474    IF ( PRESENT(smearing)) THEN
1475      obj%smearing_ispresent = .TRUE.
1476      obj%smearing = smearing
1477    ELSE
1478      obj%smearing_ispresent = .FALSE.
1479    END IF
1480    IF ( PRESENT(tot_charge)) THEN
1481      obj%tot_charge_ispresent = .TRUE.
1482      obj%tot_charge = tot_charge
1483    ELSE
1484      obj%tot_charge_ispresent = .FALSE.
1485    END IF
1486    IF ( PRESENT(tot_magnetization)) THEN
1487      obj%tot_magnetization_ispresent = .TRUE.
1488      obj%tot_magnetization = tot_magnetization
1489    ELSE
1490      obj%tot_magnetization_ispresent = .FALSE.
1491    END IF
1492    obj%occupations = occupations
1493    IF ( PRESENT(inputOccupations)) THEN
1494      obj%inputOccupations_ispresent = .TRUE.
1495      ALLOCATE(obj%inputOccupations(SIZE(inputOccupations)))
1496      obj%ndim_inputOccupations = SIZE(inputOccupations)
1497      obj%inputOccupations = inputOccupations
1498    ELSE
1499      obj%inputOccupations_ispresent = .FALSE.
1500    END IF
1501    !
1502  END SUBROUTINE qes_init_bands
1503  !
1504  !
1505  SUBROUTINE qes_init_smearing(obj, tagname, degauss, smearing)
1506    !
1507    IMPLICIT NONE
1508    !
1509    TYPE(smearing_type), INTENT(OUT) :: obj
1510    CHARACTER(LEN=*), INTENT(IN) :: tagname
1511    REAL(DP), INTENT(IN) :: degauss
1512    CHARACTER(LEN=*), INTENT(IN) :: smearing
1513    !
1514    obj%tagname = TRIM(tagname)
1515    obj%lwrite = .TRUE.
1516    obj%lread = .TRUE.
1517    obj%degauss = degauss
1518    !
1519    obj%smearing = smearing
1520    !
1521  END SUBROUTINE qes_init_smearing
1522  !
1523  !
1524  SUBROUTINE qes_init_occupations(obj, tagname, occupations, spin)
1525    !
1526    IMPLICIT NONE
1527    !
1528    TYPE(occupations_type), INTENT(OUT) :: obj
1529    CHARACTER(LEN=*), INTENT(IN) :: tagname
1530    INTEGER, OPTIONAL, INTENT(IN) :: spin
1531    CHARACTER(LEN=*), INTENT(IN) :: occupations
1532    !
1533    obj%tagname = TRIM(tagname)
1534    obj%lwrite = .TRUE.
1535    obj%lread = .TRUE.
1536    IF (PRESENT(spin)) THEN
1537      obj%spin_ispresent = .TRUE.
1538      obj%spin = spin
1539    ELSE
1540      obj%spin_ispresent = .FALSE.
1541    END IF
1542    !
1543    obj%occupations = occupations
1544    !
1545  END SUBROUTINE qes_init_occupations
1546  !
1547  !
1548  SUBROUTINE qes_init_basis(obj, tagname, ecutwfc, gamma_only, ecutrho, fft_grid, fft_smooth, fft_box)
1549    !
1550    IMPLICIT NONE
1551    !
1552    TYPE(basis_type), INTENT(OUT) :: obj
1553    CHARACTER(LEN=*), INTENT(IN) :: tagname
1554    LOGICAL,OPTIONAL,INTENT(IN) :: gamma_only
1555    REAL(DP),INTENT(IN) :: ecutwfc
1556    REAL(DP),OPTIONAL,INTENT(IN) :: ecutrho
1557    TYPE(basisSetItem_type),OPTIONAL,INTENT(IN) :: fft_grid
1558    TYPE(basisSetItem_type),OPTIONAL,INTENT(IN) :: fft_smooth
1559    TYPE(basisSetItem_type),OPTIONAL,INTENT(IN) :: fft_box
1560    !
1561    obj%tagname = TRIM(tagname)
1562    obj%lwrite = .TRUE.
1563    obj%lread = .TRUE.
1564    !
1565    IF ( PRESENT(gamma_only)) THEN
1566      obj%gamma_only_ispresent = .TRUE.
1567      obj%gamma_only = gamma_only
1568    ELSE
1569      obj%gamma_only_ispresent = .FALSE.
1570    END IF
1571    obj%ecutwfc = ecutwfc
1572    IF ( PRESENT(ecutrho)) THEN
1573      obj%ecutrho_ispresent = .TRUE.
1574      obj%ecutrho = ecutrho
1575    ELSE
1576      obj%ecutrho_ispresent = .FALSE.
1577    END IF
1578    IF ( PRESENT(fft_grid)) THEN
1579      obj%fft_grid_ispresent = .TRUE.
1580      obj%fft_grid = fft_grid
1581    ELSE
1582      obj%fft_grid_ispresent = .FALSE.
1583    END IF
1584    IF ( PRESENT(fft_smooth)) THEN
1585      obj%fft_smooth_ispresent = .TRUE.
1586      obj%fft_smooth = fft_smooth
1587    ELSE
1588      obj%fft_smooth_ispresent = .FALSE.
1589    END IF
1590    IF ( PRESENT(fft_box)) THEN
1591      obj%fft_box_ispresent = .TRUE.
1592      obj%fft_box = fft_box
1593    ELSE
1594      obj%fft_box_ispresent = .FALSE.
1595    END IF
1596    !
1597  END SUBROUTINE qes_init_basis
1598  !
1599  !
1600  SUBROUTINE qes_init_basis_set(obj, tagname, ecutwfc, fft_grid, ngm, npwx, reciprocal_lattice,&
1601                               gamma_only, ecutrho, fft_smooth, fft_box, ngms)
1602    !
1603    IMPLICIT NONE
1604    !
1605    TYPE(basis_set_type), INTENT(OUT) :: obj
1606    CHARACTER(LEN=*), INTENT(IN) :: tagname
1607    LOGICAL,OPTIONAL,INTENT(IN) :: gamma_only
1608    REAL(DP),INTENT(IN) :: ecutwfc
1609    REAL(DP),OPTIONAL,INTENT(IN) :: ecutrho
1610    TYPE(basisSetItem_type),INTENT(IN) :: fft_grid
1611    TYPE(basisSetItem_type),OPTIONAL,INTENT(IN) :: fft_smooth
1612    TYPE(basisSetItem_type),OPTIONAL,INTENT(IN) :: fft_box
1613    INTEGER,INTENT(IN) :: ngm
1614    INTEGER,OPTIONAL,INTENT(IN) :: ngms
1615    INTEGER,INTENT(IN) :: npwx
1616    TYPE(reciprocal_lattice_type),INTENT(IN) :: reciprocal_lattice
1617    !
1618    obj%tagname = TRIM(tagname)
1619    obj%lwrite = .TRUE.
1620    obj%lread = .TRUE.
1621    !
1622    IF ( PRESENT(gamma_only)) THEN
1623      obj%gamma_only_ispresent = .TRUE.
1624      obj%gamma_only = gamma_only
1625    ELSE
1626      obj%gamma_only_ispresent = .FALSE.
1627    END IF
1628    obj%ecutwfc = ecutwfc
1629    IF ( PRESENT(ecutrho)) THEN
1630      obj%ecutrho_ispresent = .TRUE.
1631      obj%ecutrho = ecutrho
1632    ELSE
1633      obj%ecutrho_ispresent = .FALSE.
1634    END IF
1635    obj%fft_grid = fft_grid
1636    IF ( PRESENT(fft_smooth)) THEN
1637      obj%fft_smooth_ispresent = .TRUE.
1638      obj%fft_smooth = fft_smooth
1639    ELSE
1640      obj%fft_smooth_ispresent = .FALSE.
1641    END IF
1642    IF ( PRESENT(fft_box)) THEN
1643      obj%fft_box_ispresent = .TRUE.
1644      obj%fft_box = fft_box
1645    ELSE
1646      obj%fft_box_ispresent = .FALSE.
1647    END IF
1648    obj%ngm = ngm
1649    IF ( PRESENT(ngms)) THEN
1650      obj%ngms_ispresent = .TRUE.
1651      obj%ngms = ngms
1652    ELSE
1653      obj%ngms_ispresent = .FALSE.
1654    END IF
1655    obj%npwx = npwx
1656    obj%reciprocal_lattice = reciprocal_lattice
1657    !
1658  END SUBROUTINE qes_init_basis_set
1659  !
1660  !
1661  SUBROUTINE qes_init_basisSetItem(obj, tagname, nr1, nr2, nr3, basisSetItem)
1662    !
1663    IMPLICIT NONE
1664    !
1665    TYPE(basisSetItem_type), INTENT(OUT) :: obj
1666    CHARACTER(LEN=*), INTENT(IN) :: tagname
1667    INTEGER, INTENT(IN) :: nr1
1668    INTEGER, INTENT(IN) :: nr2
1669    INTEGER, INTENT(IN) :: nr3
1670    CHARACTER(LEN=*), INTENT(IN) :: basisSetItem
1671    !
1672    obj%tagname = TRIM(tagname)
1673    obj%lwrite = .TRUE.
1674    obj%lread = .TRUE.
1675    obj%nr1 = nr1
1676    obj%nr2 = nr2
1677    obj%nr3 = nr3
1678    !
1679    obj%basisSetItem = basisSetItem
1680    !
1681  END SUBROUTINE qes_init_basisSetItem
1682  !
1683  !
1684  SUBROUTINE qes_init_reciprocal_lattice(obj, tagname, b1, b2, b3)
1685    !
1686    IMPLICIT NONE
1687    !
1688    TYPE(reciprocal_lattice_type), INTENT(OUT) :: obj
1689    CHARACTER(LEN=*), INTENT(IN) :: tagname
1690    REAL(DP), DIMENSION(3),INTENT(IN) :: b1
1691    REAL(DP), DIMENSION(3),INTENT(IN) :: b2
1692    REAL(DP), DIMENSION(3),INTENT(IN) :: b3
1693    !
1694    obj%tagname = TRIM(tagname)
1695    obj%lwrite = .TRUE.
1696    obj%lread = .TRUE.
1697    !
1698    obj%b1 = b1
1699    obj%b2 = b2
1700    obj%b3 = b3
1701    !
1702  END SUBROUTINE qes_init_reciprocal_lattice
1703  !
1704  !
1705  SUBROUTINE qes_init_electron_control(obj, tagname, diagonalization, mixing_mode, mixing_beta,&
1706                                      conv_thr, mixing_ndim, max_nstep, tq_smoothing, tbeta_smoothing,&
1707                                      diago_thr_init, diago_full_acc, real_space_q, real_space_beta,&
1708                                      diago_cg_maxiter, diago_ppcg_maxiter, diago_david_ndim)
1709    !
1710    IMPLICIT NONE
1711    !
1712    TYPE(electron_control_type), INTENT(OUT) :: obj
1713    CHARACTER(LEN=*), INTENT(IN) :: tagname
1714    CHARACTER(LEN=*),INTENT(IN) :: diagonalization
1715    CHARACTER(LEN=*),INTENT(IN) :: mixing_mode
1716    REAL(DP),INTENT(IN) :: mixing_beta
1717    REAL(DP),INTENT(IN) :: conv_thr
1718    INTEGER,INTENT(IN) :: mixing_ndim
1719    INTEGER,INTENT(IN) :: max_nstep
1720    LOGICAL,OPTIONAL,INTENT(IN) :: real_space_q
1721    LOGICAL,OPTIONAL,INTENT(IN) :: real_space_beta
1722    LOGICAL,INTENT(IN) :: tq_smoothing
1723    LOGICAL,INTENT(IN) :: tbeta_smoothing
1724    REAL(DP),INTENT(IN) :: diago_thr_init
1725    LOGICAL,INTENT(IN) :: diago_full_acc
1726    INTEGER,OPTIONAL,INTENT(IN) :: diago_cg_maxiter
1727    INTEGER,OPTIONAL,INTENT(IN) :: diago_ppcg_maxiter
1728    INTEGER,OPTIONAL,INTENT(IN) :: diago_david_ndim
1729    !
1730    obj%tagname = TRIM(tagname)
1731    obj%lwrite = .TRUE.
1732    obj%lread = .TRUE.
1733    !
1734    obj%diagonalization = diagonalization
1735    obj%mixing_mode = mixing_mode
1736    obj%mixing_beta = mixing_beta
1737    obj%conv_thr = conv_thr
1738    obj%mixing_ndim = mixing_ndim
1739    obj%max_nstep = max_nstep
1740    IF ( PRESENT(real_space_q)) THEN
1741      obj%real_space_q_ispresent = .TRUE.
1742      obj%real_space_q = real_space_q
1743    ELSE
1744      obj%real_space_q_ispresent = .FALSE.
1745    END IF
1746    IF ( PRESENT(real_space_beta)) THEN
1747      obj%real_space_beta_ispresent = .TRUE.
1748      obj%real_space_beta = real_space_beta
1749    ELSE
1750      obj%real_space_beta_ispresent = .FALSE.
1751    END IF
1752    obj%tq_smoothing = tq_smoothing
1753    obj%tbeta_smoothing = tbeta_smoothing
1754    obj%diago_thr_init = diago_thr_init
1755    obj%diago_full_acc = diago_full_acc
1756    IF ( PRESENT(diago_cg_maxiter)) THEN
1757      obj%diago_cg_maxiter_ispresent = .TRUE.
1758      obj%diago_cg_maxiter = diago_cg_maxiter
1759    ELSE
1760      obj%diago_cg_maxiter_ispresent = .FALSE.
1761    END IF
1762    IF ( PRESENT(diago_ppcg_maxiter)) THEN
1763      obj%diago_ppcg_maxiter_ispresent = .TRUE.
1764      obj%diago_ppcg_maxiter = diago_ppcg_maxiter
1765    ELSE
1766      obj%diago_ppcg_maxiter_ispresent = .FALSE.
1767    END IF
1768    IF ( PRESENT(diago_david_ndim)) THEN
1769      obj%diago_david_ndim_ispresent = .TRUE.
1770      obj%diago_david_ndim = diago_david_ndim
1771    ELSE
1772      obj%diago_david_ndim_ispresent = .FALSE.
1773    END IF
1774    !
1775  END SUBROUTINE qes_init_electron_control
1776  !
1777  !
1778  SUBROUTINE qes_init_k_points_IBZ(obj, tagname, monkhorst_pack, nk, k_point)
1779    !
1780    IMPLICIT NONE
1781    !
1782    TYPE(k_points_IBZ_type), INTENT(OUT) :: obj
1783    CHARACTER(LEN=*), INTENT(IN) :: tagname
1784    TYPE(monkhorst_pack_type),OPTIONAL,INTENT(IN) :: monkhorst_pack
1785    INTEGER,OPTIONAL,INTENT(IN) :: nk
1786    TYPE(k_point_type),OPTIONAL,DIMENSION(:),INTENT(IN) :: k_point
1787    !
1788    obj%tagname = TRIM(tagname)
1789    obj%lwrite = .TRUE.
1790    obj%lread = .TRUE.
1791    !
1792    IF ( PRESENT(monkhorst_pack)) THEN
1793      obj%monkhorst_pack_ispresent = .TRUE.
1794      obj%monkhorst_pack = monkhorst_pack
1795    ELSE
1796      obj%monkhorst_pack_ispresent = .FALSE.
1797    END IF
1798    IF ( PRESENT(nk)) THEN
1799      obj%nk_ispresent = .TRUE.
1800      obj%nk = nk
1801    ELSE
1802      obj%nk_ispresent = .FALSE.
1803    END IF
1804    IF ( PRESENT(k_point)) THEN
1805      obj%k_point_ispresent = .TRUE.
1806      ALLOCATE(obj%k_point(SIZE(k_point)))
1807      obj%ndim_k_point = SIZE(k_point)
1808      obj%k_point = k_point
1809    ELSE
1810      obj%k_point_ispresent = .FALSE.
1811    END IF
1812    !
1813  END SUBROUTINE qes_init_k_points_IBZ
1814  !
1815  !
1816  SUBROUTINE qes_init_monkhorst_pack(obj, tagname, nk1, nk2, nk3, k1, k2, k3, monkhorst_pack)
1817    !
1818    IMPLICIT NONE
1819    !
1820    TYPE(monkhorst_pack_type), INTENT(OUT) :: obj
1821    CHARACTER(LEN=*), INTENT(IN) :: tagname
1822    INTEGER, INTENT(IN) :: nk1
1823    INTEGER, INTENT(IN) :: nk2
1824    INTEGER, INTENT(IN) :: nk3
1825    INTEGER, INTENT(IN) :: k1
1826    INTEGER, INTENT(IN) :: k2
1827    INTEGER, INTENT(IN) :: k3
1828    CHARACTER(LEN=*), INTENT(IN) :: monkhorst_pack
1829    !
1830    obj%tagname = TRIM(tagname)
1831    obj%lwrite = .TRUE.
1832    obj%lread = .TRUE.
1833    obj%nk1 = nk1
1834    obj%nk2 = nk2
1835    obj%nk3 = nk3
1836    obj%k1 = k1
1837    obj%k2 = k2
1838    obj%k3 = k3
1839    !
1840    obj%monkhorst_pack = monkhorst_pack
1841    !
1842  END SUBROUTINE qes_init_monkhorst_pack
1843  !
1844  !
1845  SUBROUTINE qes_init_k_point(obj, tagname, k_point, weight, label)
1846    !
1847    IMPLICIT NONE
1848    !
1849    TYPE(k_point_type), INTENT(OUT) :: obj
1850    CHARACTER(LEN=*), INTENT(IN) :: tagname
1851    REAL(DP), OPTIONAL, INTENT(IN) :: weight
1852    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: label
1853    REAL(DP), DIMENSION(3), INTENT(IN) :: k_point
1854    !
1855    obj%tagname = TRIM(tagname)
1856    obj%lwrite = .TRUE.
1857    obj%lread = .TRUE.
1858    IF (PRESENT(weight)) THEN
1859      obj%weight_ispresent = .TRUE.
1860      obj%weight = weight
1861    ELSE
1862      obj%weight_ispresent = .FALSE.
1863    END IF
1864    IF (PRESENT(label)) THEN
1865      obj%label_ispresent = .TRUE.
1866      obj%label = label
1867    ELSE
1868      obj%label_ispresent = .FALSE.
1869    END IF
1870    !
1871    obj%k_point = k_point
1872    !
1873  END SUBROUTINE qes_init_k_point
1874  !
1875  !
1876  SUBROUTINE qes_init_ion_control(obj, tagname, ion_dynamics, upscale, remove_rigid_rot, refold_pos,&
1877                                 bfgs, md)
1878    !
1879    IMPLICIT NONE
1880    !
1881    TYPE(ion_control_type), INTENT(OUT) :: obj
1882    CHARACTER(LEN=*), INTENT(IN) :: tagname
1883    CHARACTER(LEN=*),INTENT(IN) :: ion_dynamics
1884    REAL(DP),OPTIONAL,INTENT(IN) :: upscale
1885    LOGICAL,OPTIONAL,INTENT(IN) :: remove_rigid_rot
1886    LOGICAL,OPTIONAL,INTENT(IN) :: refold_pos
1887    TYPE(bfgs_type),OPTIONAL,INTENT(IN) :: bfgs
1888    TYPE(md_type),OPTIONAL,INTENT(IN) :: md
1889    !
1890    obj%tagname = TRIM(tagname)
1891    obj%lwrite = .TRUE.
1892    obj%lread = .TRUE.
1893    !
1894    obj%ion_dynamics = ion_dynamics
1895    IF ( PRESENT(upscale)) THEN
1896      obj%upscale_ispresent = .TRUE.
1897      obj%upscale = upscale
1898    ELSE
1899      obj%upscale_ispresent = .FALSE.
1900    END IF
1901    IF ( PRESENT(remove_rigid_rot)) THEN
1902      obj%remove_rigid_rot_ispresent = .TRUE.
1903      obj%remove_rigid_rot = remove_rigid_rot
1904    ELSE
1905      obj%remove_rigid_rot_ispresent = .FALSE.
1906    END IF
1907    IF ( PRESENT(refold_pos)) THEN
1908      obj%refold_pos_ispresent = .TRUE.
1909      obj%refold_pos = refold_pos
1910    ELSE
1911      obj%refold_pos_ispresent = .FALSE.
1912    END IF
1913    IF ( PRESENT(bfgs)) THEN
1914      obj%bfgs_ispresent = .TRUE.
1915      obj%bfgs = bfgs
1916    ELSE
1917      obj%bfgs_ispresent = .FALSE.
1918    END IF
1919    IF ( PRESENT(md)) THEN
1920      obj%md_ispresent = .TRUE.
1921      obj%md = md
1922    ELSE
1923      obj%md_ispresent = .FALSE.
1924    END IF
1925    !
1926  END SUBROUTINE qes_init_ion_control
1927  !
1928  !
1929  SUBROUTINE qes_init_bfgs(obj, tagname, ndim, trust_radius_min, trust_radius_max, trust_radius_init,&
1930                          w1, w2)
1931    !
1932    IMPLICIT NONE
1933    !
1934    TYPE(bfgs_type), INTENT(OUT) :: obj
1935    CHARACTER(LEN=*), INTENT(IN) :: tagname
1936    INTEGER,INTENT(IN) :: ndim
1937    REAL(DP),INTENT(IN) :: trust_radius_min
1938    REAL(DP),INTENT(IN) :: trust_radius_max
1939    REAL(DP),INTENT(IN) :: trust_radius_init
1940    REAL(DP),INTENT(IN) :: w1
1941    REAL(DP),INTENT(IN) :: w2
1942    !
1943    obj%tagname = TRIM(tagname)
1944    obj%lwrite = .TRUE.
1945    obj%lread = .TRUE.
1946    !
1947    obj%ndim = ndim
1948    obj%trust_radius_min = trust_radius_min
1949    obj%trust_radius_max = trust_radius_max
1950    obj%trust_radius_init = trust_radius_init
1951    obj%w1 = w1
1952    obj%w2 = w2
1953    !
1954  END SUBROUTINE qes_init_bfgs
1955  !
1956  !
1957  SUBROUTINE qes_init_md(obj, tagname, pot_extrapolation, wfc_extrapolation, ion_temperature,&
1958                        timestep, tempw, tolp, deltaT, nraise)
1959    !
1960    IMPLICIT NONE
1961    !
1962    TYPE(md_type), INTENT(OUT) :: obj
1963    CHARACTER(LEN=*), INTENT(IN) :: tagname
1964    CHARACTER(LEN=*),INTENT(IN) :: pot_extrapolation
1965    CHARACTER(LEN=*),INTENT(IN) :: wfc_extrapolation
1966    CHARACTER(LEN=*),INTENT(IN) :: ion_temperature
1967    REAL(DP),INTENT(IN) :: timestep
1968    REAL(DP),INTENT(IN) :: tempw
1969    REAL(DP),INTENT(IN) :: tolp
1970    REAL(DP),INTENT(IN) :: deltaT
1971    INTEGER,INTENT(IN) :: nraise
1972    !
1973    obj%tagname = TRIM(tagname)
1974    obj%lwrite = .TRUE.
1975    obj%lread = .TRUE.
1976    !
1977    obj%pot_extrapolation = pot_extrapolation
1978    obj%wfc_extrapolation = wfc_extrapolation
1979    obj%ion_temperature = ion_temperature
1980    obj%timestep = timestep
1981    obj%tempw = tempw
1982    obj%tolp = tolp
1983    obj%deltaT = deltaT
1984    obj%nraise = nraise
1985    !
1986  END SUBROUTINE qes_init_md
1987  !
1988  !
1989  SUBROUTINE qes_init_cell_control(obj, tagname, cell_dynamics, pressure, wmass, cell_factor,&
1990                                  fix_volume, fix_area, isotropic, free_cell)
1991    !
1992    IMPLICIT NONE
1993    !
1994    TYPE(cell_control_type), INTENT(OUT) :: obj
1995    CHARACTER(LEN=*), INTENT(IN) :: tagname
1996    CHARACTER(LEN=*),INTENT(IN) :: cell_dynamics
1997    REAL(DP),INTENT(IN) :: pressure
1998    REAL(DP),OPTIONAL,INTENT(IN) :: wmass
1999    REAL(DP),OPTIONAL,INTENT(IN) :: cell_factor
2000    LOGICAL,OPTIONAL,INTENT(IN) :: fix_volume
2001    LOGICAL,OPTIONAL,INTENT(IN) :: fix_area
2002    LOGICAL,OPTIONAL,INTENT(IN) :: isotropic
2003    TYPE(integerMatrix_type),OPTIONAL,INTENT(IN) :: free_cell
2004    !
2005    obj%tagname = TRIM(tagname)
2006    obj%lwrite = .TRUE.
2007    obj%lread = .TRUE.
2008    !
2009    obj%cell_dynamics = cell_dynamics
2010    obj%pressure = pressure
2011    IF ( PRESENT(wmass)) THEN
2012      obj%wmass_ispresent = .TRUE.
2013      obj%wmass = wmass
2014    ELSE
2015      obj%wmass_ispresent = .FALSE.
2016    END IF
2017    IF ( PRESENT(cell_factor)) THEN
2018      obj%cell_factor_ispresent = .TRUE.
2019      obj%cell_factor = cell_factor
2020    ELSE
2021      obj%cell_factor_ispresent = .FALSE.
2022    END IF
2023    IF ( PRESENT(fix_volume)) THEN
2024      obj%fix_volume_ispresent = .TRUE.
2025      obj%fix_volume = fix_volume
2026    ELSE
2027      obj%fix_volume_ispresent = .FALSE.
2028    END IF
2029    IF ( PRESENT(fix_area)) THEN
2030      obj%fix_area_ispresent = .TRUE.
2031      obj%fix_area = fix_area
2032    ELSE
2033      obj%fix_area_ispresent = .FALSE.
2034    END IF
2035    IF ( PRESENT(isotropic)) THEN
2036      obj%isotropic_ispresent = .TRUE.
2037      obj%isotropic = isotropic
2038    ELSE
2039      obj%isotropic_ispresent = .FALSE.
2040    END IF
2041    IF ( PRESENT(free_cell)) THEN
2042      obj%free_cell_ispresent = .TRUE.
2043      obj%free_cell = free_cell
2044    ELSE
2045      obj%free_cell_ispresent = .FALSE.
2046    END IF
2047    !
2048  END SUBROUTINE qes_init_cell_control
2049  !
2050  !
2051  SUBROUTINE qes_init_symmetry_flags(obj, tagname, nosym, nosym_evc, noinv, no_t_rev, force_symmorphic, use_all_frac)
2052    !
2053    IMPLICIT NONE
2054    !
2055    TYPE(symmetry_flags_type), INTENT(OUT) :: obj
2056    CHARACTER(LEN=*), INTENT(IN) :: tagname
2057    LOGICAL,INTENT(IN) :: nosym
2058    LOGICAL,INTENT(IN) :: nosym_evc
2059    LOGICAL,INTENT(IN) :: noinv
2060    LOGICAL,INTENT(IN) :: no_t_rev
2061    LOGICAL,INTENT(IN) :: force_symmorphic
2062    LOGICAL,INTENT(IN) :: use_all_frac
2063    !
2064    obj%tagname = TRIM(tagname)
2065    obj%lwrite = .TRUE.
2066    obj%lread = .TRUE.
2067    !
2068    obj%nosym = nosym
2069    obj%nosym_evc = nosym_evc
2070    obj%noinv = noinv
2071    obj%no_t_rev = no_t_rev
2072    obj%force_symmorphic = force_symmorphic
2073    obj%use_all_frac = use_all_frac
2074    !
2075  END SUBROUTINE qes_init_symmetry_flags
2076  !
2077  !
2078  SUBROUTINE qes_init_boundary_conditions(obj, tagname, assume_isolated, esm, fcp_opt, fcp_mu)
2079    !
2080    IMPLICIT NONE
2081    !
2082    TYPE(boundary_conditions_type), INTENT(OUT) :: obj
2083    CHARACTER(LEN=*), INTENT(IN) :: tagname
2084    CHARACTER(LEN=*),INTENT(IN) :: assume_isolated
2085    TYPE(esm_type),OPTIONAL,INTENT(IN) :: esm
2086    LOGICAL,OPTIONAL,INTENT(IN) :: fcp_opt
2087    REAL(DP),OPTIONAL,INTENT(IN) :: fcp_mu
2088    !
2089    obj%tagname = TRIM(tagname)
2090    obj%lwrite = .TRUE.
2091    obj%lread = .TRUE.
2092    !
2093    obj%assume_isolated = assume_isolated
2094    IF ( PRESENT(esm)) THEN
2095      obj%esm_ispresent = .TRUE.
2096      obj%esm = esm
2097    ELSE
2098      obj%esm_ispresent = .FALSE.
2099    END IF
2100    IF ( PRESENT(fcp_opt)) THEN
2101      obj%fcp_opt_ispresent = .TRUE.
2102      obj%fcp_opt = fcp_opt
2103    ELSE
2104      obj%fcp_opt_ispresent = .FALSE.
2105    END IF
2106    IF ( PRESENT(fcp_mu)) THEN
2107      obj%fcp_mu_ispresent = .TRUE.
2108      obj%fcp_mu = fcp_mu
2109    ELSE
2110      obj%fcp_mu_ispresent = .FALSE.
2111    END IF
2112    !
2113  END SUBROUTINE qes_init_boundary_conditions
2114  !
2115  !
2116  SUBROUTINE qes_init_esm(obj, tagname, bc, nfit, w, efield)
2117    !
2118    IMPLICIT NONE
2119    !
2120    TYPE(esm_type), INTENT(OUT) :: obj
2121    CHARACTER(LEN=*), INTENT(IN) :: tagname
2122    CHARACTER(LEN=*),INTENT(IN) :: bc
2123    INTEGER,INTENT(IN) :: nfit
2124    REAL(DP),INTENT(IN) :: w
2125    REAL(DP),INTENT(IN) :: efield
2126    !
2127    obj%tagname = TRIM(tagname)
2128    obj%lwrite = .TRUE.
2129    obj%lread = .TRUE.
2130    !
2131    obj%bc = bc
2132    obj%nfit = nfit
2133    obj%w = w
2134    obj%efield = efield
2135    !
2136  END SUBROUTINE qes_init_esm
2137  !
2138  !
2139  SUBROUTINE qes_init_ekin_functional(obj, tagname, ecfixed, qcutz, q2sigma)
2140    !
2141    IMPLICIT NONE
2142    !
2143    TYPE(ekin_functional_type), INTENT(OUT) :: obj
2144    CHARACTER(LEN=*), INTENT(IN) :: tagname
2145    REAL(DP),INTENT(IN) :: ecfixed
2146    REAL(DP),INTENT(IN) :: qcutz
2147    REAL(DP),INTENT(IN) :: q2sigma
2148    !
2149    obj%tagname = TRIM(tagname)
2150    obj%lwrite = .TRUE.
2151    obj%lread = .TRUE.
2152    !
2153    obj%ecfixed = ecfixed
2154    obj%qcutz = qcutz
2155    obj%q2sigma = q2sigma
2156    !
2157  END SUBROUTINE qes_init_ekin_functional
2158  !
2159  !
2160  SUBROUTINE qes_init_spin_constraints(obj, tagname, spin_constraints, lagrange_multiplier, target_magnetization)
2161    !
2162    IMPLICIT NONE
2163    !
2164    TYPE(spin_constraints_type), INTENT(OUT) :: obj
2165    CHARACTER(LEN=*), INTENT(IN) :: tagname
2166    CHARACTER(LEN=*),INTENT(IN) :: spin_constraints
2167    REAL(DP),INTENT(IN) :: lagrange_multiplier
2168    REAL(DP), DIMENSION(3),OPTIONAL,INTENT(IN) :: target_magnetization
2169    !
2170    obj%tagname = TRIM(tagname)
2171    obj%lwrite = .TRUE.
2172    obj%lread = .TRUE.
2173    !
2174    obj%spin_constraints = spin_constraints
2175    obj%lagrange_multiplier = lagrange_multiplier
2176    IF ( PRESENT(target_magnetization)) THEN
2177      obj%target_magnetization_ispresent = .TRUE.
2178      obj%target_magnetization = target_magnetization
2179    ELSE
2180      obj%target_magnetization_ispresent = .FALSE.
2181    END IF
2182    !
2183  END SUBROUTINE qes_init_spin_constraints
2184  !
2185  !
2186  SUBROUTINE qes_init_electric_field(obj, tagname, electric_potential, dipole_correction, gate_settings,&
2187                                    electric_field_direction, potential_max_position, potential_decrease_width,&
2188                                    electric_field_amplitude, electric_field_vector, nk_per_string, n_berry_cycles &
2189                                    )
2190    !
2191    IMPLICIT NONE
2192    !
2193    TYPE(electric_field_type), INTENT(OUT) :: obj
2194    CHARACTER(LEN=*), INTENT(IN) :: tagname
2195    CHARACTER(LEN=*),INTENT(IN) :: electric_potential
2196    LOGICAL,OPTIONAL,INTENT(IN) :: dipole_correction
2197    TYPE(gate_settings_type),OPTIONAL,INTENT(IN) :: gate_settings
2198    INTEGER,OPTIONAL,INTENT(IN) :: electric_field_direction
2199    REAL(DP),OPTIONAL,INTENT(IN) :: potential_max_position
2200    REAL(DP),OPTIONAL,INTENT(IN) :: potential_decrease_width
2201    REAL(DP),OPTIONAL,INTENT(IN) :: electric_field_amplitude
2202    REAL(DP), DIMENSION(3),OPTIONAL,INTENT(IN) :: electric_field_vector
2203    INTEGER,OPTIONAL,INTENT(IN) :: nk_per_string
2204    INTEGER,OPTIONAL,INTENT(IN) :: n_berry_cycles
2205    !
2206    obj%tagname = TRIM(tagname)
2207    obj%lwrite = .TRUE.
2208    obj%lread = .TRUE.
2209    !
2210    obj%electric_potential = electric_potential
2211    IF ( PRESENT(dipole_correction)) THEN
2212      obj%dipole_correction_ispresent = .TRUE.
2213      obj%dipole_correction = dipole_correction
2214    ELSE
2215      obj%dipole_correction_ispresent = .FALSE.
2216    END IF
2217    IF ( PRESENT(gate_settings)) THEN
2218      obj%gate_settings_ispresent = .TRUE.
2219      obj%gate_settings = gate_settings
2220    ELSE
2221      obj%gate_settings_ispresent = .FALSE.
2222    END IF
2223    IF ( PRESENT(electric_field_direction)) THEN
2224      obj%electric_field_direction_ispresent = .TRUE.
2225      obj%electric_field_direction = electric_field_direction
2226    ELSE
2227      obj%electric_field_direction_ispresent = .FALSE.
2228    END IF
2229    IF ( PRESENT(potential_max_position)) THEN
2230      obj%potential_max_position_ispresent = .TRUE.
2231      obj%potential_max_position = potential_max_position
2232    ELSE
2233      obj%potential_max_position_ispresent = .FALSE.
2234    END IF
2235    IF ( PRESENT(potential_decrease_width)) THEN
2236      obj%potential_decrease_width_ispresent = .TRUE.
2237      obj%potential_decrease_width = potential_decrease_width
2238    ELSE
2239      obj%potential_decrease_width_ispresent = .FALSE.
2240    END IF
2241    IF ( PRESENT(electric_field_amplitude)) THEN
2242      obj%electric_field_amplitude_ispresent = .TRUE.
2243      obj%electric_field_amplitude = electric_field_amplitude
2244    ELSE
2245      obj%electric_field_amplitude_ispresent = .FALSE.
2246    END IF
2247    IF ( PRESENT(electric_field_vector)) THEN
2248      obj%electric_field_vector_ispresent = .TRUE.
2249      obj%electric_field_vector = electric_field_vector
2250    ELSE
2251      obj%electric_field_vector_ispresent = .FALSE.
2252    END IF
2253    IF ( PRESENT(nk_per_string)) THEN
2254      obj%nk_per_string_ispresent = .TRUE.
2255      obj%nk_per_string = nk_per_string
2256    ELSE
2257      obj%nk_per_string_ispresent = .FALSE.
2258    END IF
2259    IF ( PRESENT(n_berry_cycles)) THEN
2260      obj%n_berry_cycles_ispresent = .TRUE.
2261      obj%n_berry_cycles = n_berry_cycles
2262    ELSE
2263      obj%n_berry_cycles_ispresent = .FALSE.
2264    END IF
2265    !
2266  END SUBROUTINE qes_init_electric_field
2267  !
2268  !
2269  SUBROUTINE qes_init_gate_settings(obj, tagname, use_gate, zgate, relaxz, block, block_1, block_2, block_height)
2270    !
2271    IMPLICIT NONE
2272    !
2273    TYPE(gate_settings_type), INTENT(OUT) :: obj
2274    CHARACTER(LEN=*), INTENT(IN) :: tagname
2275    LOGICAL,INTENT(IN) :: use_gate
2276    REAL(DP),OPTIONAL,INTENT(IN) :: zgate
2277    LOGICAL,OPTIONAL,INTENT(IN) :: relaxz
2278    LOGICAL,OPTIONAL,INTENT(IN) :: block
2279    REAL(DP),OPTIONAL,INTENT(IN) :: block_1
2280    REAL(DP),OPTIONAL,INTENT(IN) :: block_2
2281    REAL(DP),OPTIONAL,INTENT(IN) :: block_height
2282    !
2283    obj%tagname = TRIM(tagname)
2284    obj%lwrite = .TRUE.
2285    obj%lread = .TRUE.
2286    !
2287    obj%use_gate = use_gate
2288    IF ( PRESENT(zgate)) THEN
2289      obj%zgate_ispresent = .TRUE.
2290      obj%zgate = zgate
2291    ELSE
2292      obj%zgate_ispresent = .FALSE.
2293    END IF
2294    IF ( PRESENT(relaxz)) THEN
2295      obj%relaxz_ispresent = .TRUE.
2296      obj%relaxz = relaxz
2297    ELSE
2298      obj%relaxz_ispresent = .FALSE.
2299    END IF
2300    IF ( PRESENT(block)) THEN
2301      obj%block_ispresent = .TRUE.
2302      obj%block = block
2303    ELSE
2304      obj%block_ispresent = .FALSE.
2305    END IF
2306    IF ( PRESENT(block_1)) THEN
2307      obj%block_1_ispresent = .TRUE.
2308      obj%block_1 = block_1
2309    ELSE
2310      obj%block_1_ispresent = .FALSE.
2311    END IF
2312    IF ( PRESENT(block_2)) THEN
2313      obj%block_2_ispresent = .TRUE.
2314      obj%block_2 = block_2
2315    ELSE
2316      obj%block_2_ispresent = .FALSE.
2317    END IF
2318    IF ( PRESENT(block_height)) THEN
2319      obj%block_height_ispresent = .TRUE.
2320      obj%block_height = block_height
2321    ELSE
2322      obj%block_height_ispresent = .FALSE.
2323    END IF
2324    !
2325  END SUBROUTINE qes_init_gate_settings
2326  !
2327  !
2328  SUBROUTINE qes_init_atomic_constraints(obj, tagname, num_of_constraints, tolerance, atomic_constraint)
2329    !
2330    IMPLICIT NONE
2331    !
2332    TYPE(atomic_constraints_type), INTENT(OUT) :: obj
2333    CHARACTER(LEN=*), INTENT(IN) :: tagname
2334    INTEGER,INTENT(IN) :: num_of_constraints
2335    REAL(DP),INTENT(IN) :: tolerance
2336    TYPE(atomic_constraint_type),DIMENSION(:),INTENT(IN) :: atomic_constraint
2337    !
2338    obj%tagname = TRIM(tagname)
2339    obj%lwrite = .TRUE.
2340    obj%lread = .TRUE.
2341    !
2342    obj%num_of_constraints = num_of_constraints
2343    obj%tolerance = tolerance
2344    ALLOCATE( obj%atomic_constraint(SIZE(atomic_constraint)))
2345    obj%ndim_atomic_constraint = SIZE(atomic_constraint)
2346    obj%atomic_constraint = atomic_constraint
2347    !
2348  END SUBROUTINE qes_init_atomic_constraints
2349  !
2350  !
2351  SUBROUTINE qes_init_atomic_constraint(obj, tagname, constr_parms, constr_type, constr_target)
2352    !
2353    IMPLICIT NONE
2354    !
2355    TYPE(atomic_constraint_type), INTENT(OUT) :: obj
2356    CHARACTER(LEN=*), INTENT(IN) :: tagname
2357    REAL(DP), DIMENSION(4),INTENT(IN) :: constr_parms
2358    CHARACTER(LEN=*),INTENT(IN) :: constr_type
2359    REAL(DP),INTENT(IN) :: constr_target
2360    !
2361    obj%tagname = TRIM(tagname)
2362    obj%lwrite = .TRUE.
2363    obj%lread = .TRUE.
2364    !
2365    obj%constr_parms = constr_parms
2366    obj%constr_type = constr_type
2367    obj%constr_target = constr_target
2368    !
2369  END SUBROUTINE qes_init_atomic_constraint
2370  !
2371  !
2372  SUBROUTINE qes_init_inputOccupations(obj, tagname, ispin, spin_factor, inputOccupations)
2373    !
2374    IMPLICIT NONE
2375    !
2376    TYPE(inputOccupations_type), INTENT(OUT) :: obj
2377    CHARACTER(LEN=*), INTENT(IN) :: tagname
2378    REAL(DP), DIMENSION(:), INTENT(IN) :: inputOccupations
2379    INTEGER, INTENT(IN) :: ispin
2380    REAL(DP), INTENT(IN) :: spin_factor
2381    !
2382    obj%tagname = TRIM(tagname)
2383    obj%lwrite = .TRUE.
2384    obj%lread = .TRUE.
2385    !
2386    obj%ispin = ispin
2387    obj%spin_factor = spin_factor
2388    obj%size = size(inputOccupations)
2389    ALLOCATE(obj%inputOccupations(obj%size))
2390    obj%inputOccupations = inputOccupations
2391    !
2392  END SUBROUTINE qes_init_inputOccupations
2393  !
2394  !
2395  SUBROUTINE qes_init_outputElectricField(obj, tagname, BerryPhase, finiteElectricFieldInfo, dipoleInfo, gateInfo)
2396    !
2397    IMPLICIT NONE
2398    !
2399    TYPE(outputElectricField_type), INTENT(OUT) :: obj
2400    CHARACTER(LEN=*), INTENT(IN) :: tagname
2401    TYPE(BerryPhaseOutput_type),OPTIONAL,INTENT(IN) :: BerryPhase
2402    TYPE(finiteFieldOut_type),OPTIONAL,INTENT(IN) :: finiteElectricFieldInfo
2403    TYPE(dipoleOutput_type),OPTIONAL,INTENT(IN) :: dipoleInfo
2404    TYPE(gateInfo_type),OPTIONAL,INTENT(IN) :: gateInfo
2405    !
2406    obj%tagname = TRIM(tagname)
2407    obj%lwrite = .TRUE.
2408    obj%lread = .TRUE.
2409    !
2410    IF ( PRESENT(BerryPhase)) THEN
2411      obj%BerryPhase_ispresent = .TRUE.
2412      obj%BerryPhase = BerryPhase
2413    ELSE
2414      obj%BerryPhase_ispresent = .FALSE.
2415    END IF
2416    IF ( PRESENT(finiteElectricFieldInfo)) THEN
2417      obj%finiteElectricFieldInfo_ispresent = .TRUE.
2418      obj%finiteElectricFieldInfo = finiteElectricFieldInfo
2419    ELSE
2420      obj%finiteElectricFieldInfo_ispresent = .FALSE.
2421    END IF
2422    IF ( PRESENT(dipoleInfo)) THEN
2423      obj%dipoleInfo_ispresent = .TRUE.
2424      obj%dipoleInfo = dipoleInfo
2425    ELSE
2426      obj%dipoleInfo_ispresent = .FALSE.
2427    END IF
2428    IF ( PRESENT(gateInfo)) THEN
2429      obj%gateInfo_ispresent = .TRUE.
2430      obj%gateInfo = gateInfo
2431    ELSE
2432      obj%gateInfo_ispresent = .FALSE.
2433    END IF
2434    !
2435  END SUBROUTINE qes_init_outputElectricField
2436  !
2437  !
2438  SUBROUTINE qes_init_BerryPhaseOutput(obj, tagname, totalPolarization, totalPhase, ionicPolarization, electronicPolarization)
2439    !
2440    IMPLICIT NONE
2441    !
2442    TYPE(BerryPhaseOutput_type), INTENT(OUT) :: obj
2443    CHARACTER(LEN=*), INTENT(IN) :: tagname
2444    TYPE(polarization_type),INTENT(IN) :: totalPolarization
2445    TYPE(phase_type),INTENT(IN) :: totalPhase
2446    TYPE(ionicPolarization_type),DIMENSION(:),INTENT(IN) :: ionicPolarization
2447    TYPE(electronicPolarization_type),DIMENSION(:),INTENT(IN) :: electronicPolarization
2448    !
2449    obj%tagname = TRIM(tagname)
2450    obj%lwrite = .TRUE.
2451    obj%lread = .TRUE.
2452    !
2453    obj%totalPolarization = totalPolarization
2454    obj%totalPhase = totalPhase
2455    ALLOCATE( obj%ionicPolarization(SIZE(ionicPolarization)))
2456    obj%ndim_ionicPolarization = SIZE(ionicPolarization)
2457    obj%ionicPolarization = ionicPolarization
2458    ALLOCATE( obj%electronicPolarization(SIZE(electronicPolarization)))
2459    obj%ndim_electronicPolarization = SIZE(electronicPolarization)
2460    obj%electronicPolarization = electronicPolarization
2461    !
2462  END SUBROUTINE qes_init_BerryPhaseOutput
2463  !
2464  !
2465  SUBROUTINE qes_init_dipoleOutput(obj, tagname, idir, dipole, ion_dipole, elec_dipole, dipoleField,&
2466                                  potentialAmp, totalLength)
2467    !
2468    IMPLICIT NONE
2469    !
2470    TYPE(dipoleOutput_type), INTENT(OUT) :: obj
2471    CHARACTER(LEN=*), INTENT(IN) :: tagname
2472    INTEGER,INTENT(IN) :: idir
2473    TYPE(scalarQuantity_type),INTENT(IN) :: dipole
2474    TYPE(scalarQuantity_type),INTENT(IN) :: ion_dipole
2475    TYPE(scalarQuantity_type),INTENT(IN) :: elec_dipole
2476    TYPE(scalarQuantity_type),INTENT(IN) :: dipoleField
2477    TYPE(scalarQuantity_type),INTENT(IN) :: potentialAmp
2478    TYPE(scalarQuantity_type),INTENT(IN) :: totalLength
2479    !
2480    obj%tagname = TRIM(tagname)
2481    obj%lwrite = .TRUE.
2482    obj%lread = .TRUE.
2483    !
2484    obj%idir = idir
2485    obj%dipole = dipole
2486    obj%ion_dipole = ion_dipole
2487    obj%elec_dipole = elec_dipole
2488    obj%dipoleField = dipoleField
2489    obj%potentialAmp = potentialAmp
2490    obj%totalLength = totalLength
2491    !
2492  END SUBROUTINE qes_init_dipoleOutput
2493  !
2494  !
2495  SUBROUTINE qes_init_finiteFieldOut(obj, tagname, electronicDipole, ionicDipole)
2496    !
2497    IMPLICIT NONE
2498    !
2499    TYPE(finiteFieldOut_type), INTENT(OUT) :: obj
2500    CHARACTER(LEN=*), INTENT(IN) :: tagname
2501    REAL(DP), DIMENSION(3),INTENT(IN) :: electronicDipole
2502    REAL(DP), DIMENSION(3),INTENT(IN) :: ionicDipole
2503    !
2504    obj%tagname = TRIM(tagname)
2505    obj%lwrite = .TRUE.
2506    obj%lread = .TRUE.
2507    !
2508    obj%electronicDipole = electronicDipole
2509    obj%ionicDipole = ionicDipole
2510    !
2511  END SUBROUTINE qes_init_finiteFieldOut
2512  !
2513  !
2514  SUBROUTINE qes_init_polarization(obj, tagname, polarization, modulus, direction)
2515    !
2516    IMPLICIT NONE
2517    !
2518    TYPE(polarization_type), INTENT(OUT) :: obj
2519    CHARACTER(LEN=*), INTENT(IN) :: tagname
2520    TYPE(scalarQuantity_type),INTENT(IN) :: polarization
2521    REAL(DP),INTENT(IN) :: modulus
2522    REAL(DP), DIMENSION(3),INTENT(IN) :: direction
2523    !
2524    obj%tagname = TRIM(tagname)
2525    obj%lwrite = .TRUE.
2526    obj%lread = .TRUE.
2527    !
2528    obj%polarization = polarization
2529    obj%modulus = modulus
2530    obj%direction = direction
2531    !
2532  END SUBROUTINE qes_init_polarization
2533  !
2534  !
2535  SUBROUTINE qes_init_ionicPolarization(obj, tagname, ion, charge, phase)
2536    !
2537    IMPLICIT NONE
2538    !
2539    TYPE(ionicPolarization_type), INTENT(OUT) :: obj
2540    CHARACTER(LEN=*), INTENT(IN) :: tagname
2541    TYPE(atom_type),INTENT(IN) :: ion
2542    REAL(DP),INTENT(IN) :: charge
2543    TYPE(phase_type),INTENT(IN) :: phase
2544    !
2545    obj%tagname = TRIM(tagname)
2546    obj%lwrite = .TRUE.
2547    obj%lread = .TRUE.
2548    !
2549    obj%ion = ion
2550    obj%charge = charge
2551    obj%phase = phase
2552    !
2553  END SUBROUTINE qes_init_ionicPolarization
2554  !
2555  !
2556  SUBROUTINE qes_init_electronicPolarization(obj, tagname, firstKeyPoint, phase, spin)
2557    !
2558    IMPLICIT NONE
2559    !
2560    TYPE(electronicPolarization_type), INTENT(OUT) :: obj
2561    CHARACTER(LEN=*), INTENT(IN) :: tagname
2562    TYPE(k_point_type),INTENT(IN) :: firstKeyPoint
2563    INTEGER,OPTIONAL,INTENT(IN) :: spin
2564    TYPE(phase_type),INTENT(IN) :: phase
2565    !
2566    obj%tagname = TRIM(tagname)
2567    obj%lwrite = .TRUE.
2568    obj%lread = .TRUE.
2569    !
2570    obj%firstKeyPoint = firstKeyPoint
2571    IF ( PRESENT(spin)) THEN
2572      obj%spin_ispresent = .TRUE.
2573      obj%spin = spin
2574    ELSE
2575      obj%spin_ispresent = .FALSE.
2576    END IF
2577    obj%phase = phase
2578    !
2579  END SUBROUTINE qes_init_electronicPolarization
2580  !
2581  !
2582  SUBROUTINE qes_init_phase(obj, tagname, phase, ionic, electronic, modulus)
2583    !
2584    IMPLICIT NONE
2585    !
2586    TYPE(phase_type), INTENT(OUT) :: obj
2587    CHARACTER(LEN=*), INTENT(IN) :: tagname
2588    REAL(DP), OPTIONAL, INTENT(IN) :: ionic
2589    REAL(DP), OPTIONAL, INTENT(IN) :: electronic
2590    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: modulus
2591    REAL(DP), INTENT(IN) :: phase
2592    !
2593    obj%tagname = TRIM(tagname)
2594    obj%lwrite = .TRUE.
2595    obj%lread = .TRUE.
2596    IF (PRESENT(ionic)) THEN
2597      obj%ionic_ispresent = .TRUE.
2598      obj%ionic = ionic
2599    ELSE
2600      obj%ionic_ispresent = .FALSE.
2601    END IF
2602    IF (PRESENT(electronic)) THEN
2603      obj%electronic_ispresent = .TRUE.
2604      obj%electronic = electronic
2605    ELSE
2606      obj%electronic_ispresent = .FALSE.
2607    END IF
2608    IF (PRESENT(modulus)) THEN
2609      obj%modulus_ispresent = .TRUE.
2610      obj%modulus = modulus
2611    ELSE
2612      obj%modulus_ispresent = .FALSE.
2613    END IF
2614    !
2615    obj%phase = phase
2616    !
2617  END SUBROUTINE qes_init_phase
2618  !
2619  !
2620  SUBROUTINE qes_init_gateInfo(obj, tagname, pot_prefactor, gate_zpos, gate_gate_term, gatefieldEnergy)
2621    !
2622    IMPLICIT NONE
2623    !
2624    TYPE(gateInfo_type), INTENT(OUT) :: obj
2625    CHARACTER(LEN=*), INTENT(IN) :: tagname
2626    REAL(DP),INTENT(IN) :: pot_prefactor
2627    REAL(DP),INTENT(IN) :: gate_zpos
2628    REAL(DP),INTENT(IN) :: gate_gate_term
2629    REAL(DP),INTENT(IN) :: gatefieldEnergy
2630    !
2631    obj%tagname = TRIM(tagname)
2632    obj%lwrite = .TRUE.
2633    obj%lread = .TRUE.
2634    !
2635    obj%pot_prefactor = pot_prefactor
2636    obj%gate_zpos = gate_zpos
2637    obj%gate_gate_term = gate_gate_term
2638    obj%gatefieldEnergy = gatefieldEnergy
2639    !
2640  END SUBROUTINE qes_init_gateInfo
2641  !
2642  !
2643  SUBROUTINE qes_init_convergence_info(obj, tagname, scf_conv, opt_conv)
2644    !
2645    IMPLICIT NONE
2646    !
2647    TYPE(convergence_info_type), INTENT(OUT) :: obj
2648    CHARACTER(LEN=*), INTENT(IN) :: tagname
2649    TYPE(scf_conv_type),INTENT(IN) :: scf_conv
2650    TYPE(opt_conv_type),OPTIONAL,INTENT(IN) :: opt_conv
2651    !
2652    obj%tagname = TRIM(tagname)
2653    obj%lwrite = .TRUE.
2654    obj%lread = .TRUE.
2655    !
2656    obj%scf_conv = scf_conv
2657    IF ( PRESENT(opt_conv)) THEN
2658      obj%opt_conv_ispresent = .TRUE.
2659      obj%opt_conv = opt_conv
2660    ELSE
2661      obj%opt_conv_ispresent = .FALSE.
2662    END IF
2663    !
2664  END SUBROUTINE qes_init_convergence_info
2665  !
2666  !
2667  SUBROUTINE qes_init_scf_conv(obj, tagname, convergence_achieved, n_scf_steps, scf_error)
2668    !
2669    IMPLICIT NONE
2670    !
2671    TYPE(scf_conv_type), INTENT(OUT) :: obj
2672    CHARACTER(LEN=*), INTENT(IN) :: tagname
2673    LOGICAL,INTENT(IN) :: convergence_achieved
2674    INTEGER,INTENT(IN) :: n_scf_steps
2675    REAL(DP),INTENT(IN) :: scf_error
2676    !
2677    obj%tagname = TRIM(tagname)
2678    obj%lwrite = .TRUE.
2679    obj%lread = .TRUE.
2680    !
2681    obj%convergence_achieved = convergence_achieved
2682    obj%n_scf_steps = n_scf_steps
2683    obj%scf_error = scf_error
2684    !
2685  END SUBROUTINE qes_init_scf_conv
2686  !
2687  !
2688  SUBROUTINE qes_init_opt_conv(obj, tagname, convergence_achieved, n_opt_steps, grad_norm)
2689    !
2690    IMPLICIT NONE
2691    !
2692    TYPE(opt_conv_type), INTENT(OUT) :: obj
2693    CHARACTER(LEN=*), INTENT(IN) :: tagname
2694    LOGICAL,INTENT(IN) :: convergence_achieved
2695    INTEGER,INTENT(IN) :: n_opt_steps
2696    REAL(DP),INTENT(IN) :: grad_norm
2697    !
2698    obj%tagname = TRIM(tagname)
2699    obj%lwrite = .TRUE.
2700    obj%lread = .TRUE.
2701    !
2702    obj%convergence_achieved = convergence_achieved
2703    obj%n_opt_steps = n_opt_steps
2704    obj%grad_norm = grad_norm
2705    !
2706  END SUBROUTINE qes_init_opt_conv
2707  !
2708  !
2709  SUBROUTINE qes_init_algorithmic_info(obj, tagname, real_space_q, uspp, paw, real_space_beta)
2710    !
2711    IMPLICIT NONE
2712    !
2713    TYPE(algorithmic_info_type), INTENT(OUT) :: obj
2714    CHARACTER(LEN=*), INTENT(IN) :: tagname
2715    LOGICAL,INTENT(IN) :: real_space_q
2716    LOGICAL,OPTIONAL,INTENT(IN) :: real_space_beta
2717    LOGICAL,INTENT(IN) :: uspp
2718    LOGICAL,INTENT(IN) :: paw
2719    !
2720    obj%tagname = TRIM(tagname)
2721    obj%lwrite = .TRUE.
2722    obj%lread = .TRUE.
2723    !
2724    obj%real_space_q = real_space_q
2725    IF ( PRESENT(real_space_beta)) THEN
2726      obj%real_space_beta_ispresent = .TRUE.
2727      obj%real_space_beta = real_space_beta
2728    ELSE
2729      obj%real_space_beta_ispresent = .FALSE.
2730    END IF
2731    obj%uspp = uspp
2732    obj%paw = paw
2733    !
2734  END SUBROUTINE qes_init_algorithmic_info
2735  !
2736  !
2737  SUBROUTINE qes_init_symmetries(obj, tagname, nsym, nrot, space_group, symmetry)
2738    !
2739    IMPLICIT NONE
2740    !
2741    TYPE(symmetries_type), INTENT(OUT) :: obj
2742    CHARACTER(LEN=*), INTENT(IN) :: tagname
2743    INTEGER,INTENT(IN) :: nsym
2744    INTEGER,INTENT(IN) :: nrot
2745    INTEGER,INTENT(IN) :: space_group
2746    TYPE(symmetry_type),DIMENSION(:),INTENT(IN) :: symmetry
2747    !
2748    obj%tagname = TRIM(tagname)
2749    obj%lwrite = .TRUE.
2750    obj%lread = .TRUE.
2751    !
2752    obj%nsym = nsym
2753    obj%nrot = nrot
2754    obj%space_group = space_group
2755    ALLOCATE( obj%symmetry(SIZE(symmetry)))
2756    obj%ndim_symmetry = SIZE(symmetry)
2757    obj%symmetry = symmetry
2758    !
2759  END SUBROUTINE qes_init_symmetries
2760  !
2761  !
2762  SUBROUTINE qes_init_symmetry(obj, tagname, info, rotation, fractional_translation, equivalent_atoms)
2763    !
2764    IMPLICIT NONE
2765    !
2766    TYPE(symmetry_type), INTENT(OUT) :: obj
2767    CHARACTER(LEN=*), INTENT(IN) :: tagname
2768    TYPE(info_type),INTENT(IN) :: info
2769    TYPE(matrix_type),INTENT(IN) :: rotation
2770    REAL(DP), DIMENSION(3),OPTIONAL,INTENT(IN) :: fractional_translation
2771    TYPE(equivalent_atoms_type),OPTIONAL,INTENT(IN) :: equivalent_atoms
2772    !
2773    obj%tagname = TRIM(tagname)
2774    obj%lwrite = .TRUE.
2775    obj%lread = .TRUE.
2776    !
2777    obj%info = info
2778    obj%rotation = rotation
2779    IF ( PRESENT(fractional_translation)) THEN
2780      obj%fractional_translation_ispresent = .TRUE.
2781      obj%fractional_translation = fractional_translation
2782    ELSE
2783      obj%fractional_translation_ispresent = .FALSE.
2784    END IF
2785    IF ( PRESENT(equivalent_atoms)) THEN
2786      obj%equivalent_atoms_ispresent = .TRUE.
2787      obj%equivalent_atoms = equivalent_atoms
2788    ELSE
2789      obj%equivalent_atoms_ispresent = .FALSE.
2790    END IF
2791    !
2792  END SUBROUTINE qes_init_symmetry
2793  !
2794  !
2795  SUBROUTINE qes_init_equivalent_atoms(obj, tagname, nat, equivalent_atoms)
2796    !
2797    IMPLICIT NONE
2798    !
2799    TYPE(equivalent_atoms_type), INTENT(OUT) :: obj
2800    CHARACTER(LEN=*), INTENT(IN) :: tagname
2801    INTEGER, DIMENSION(:), INTENT(IN) :: equivalent_atoms
2802    INTEGER, INTENT(IN) :: nat
2803    !
2804    obj%tagname = TRIM(tagname)
2805    obj%lwrite = .TRUE.
2806    obj%lread = .TRUE.
2807    !
2808    obj%nat = nat
2809    obj%size = size(equivalent_atoms)
2810    ALLOCATE(obj%equivalent_atoms(obj%size))
2811    obj%equivalent_atoms = equivalent_atoms
2812    !
2813  END SUBROUTINE qes_init_equivalent_atoms
2814  !
2815  !
2816  SUBROUTINE qes_init_info(obj, tagname, info, name, class, time_reversal)
2817    !
2818    IMPLICIT NONE
2819    !
2820    TYPE(info_type), INTENT(OUT) :: obj
2821    CHARACTER(LEN=*), INTENT(IN) :: tagname
2822    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: name
2823    CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: class
2824    LOGICAL, OPTIONAL, INTENT(IN) :: time_reversal
2825    CHARACTER(LEN=*), INTENT(IN) :: info
2826    !
2827    obj%tagname = TRIM(tagname)
2828    obj%lwrite = .TRUE.
2829    obj%lread = .TRUE.
2830    IF (PRESENT(name)) THEN
2831      obj%name_ispresent = .TRUE.
2832      obj%name = name
2833    ELSE
2834      obj%name_ispresent = .FALSE.
2835    END IF
2836    IF (PRESENT(class)) THEN
2837      obj%class_ispresent = .TRUE.
2838      obj%class = class
2839    ELSE
2840      obj%class_ispresent = .FALSE.
2841    END IF
2842    IF (PRESENT(time_reversal)) THEN
2843      obj%time_reversal_ispresent = .TRUE.
2844      obj%time_reversal = time_reversal
2845    ELSE
2846      obj%time_reversal_ispresent = .FALSE.
2847    END IF
2848    !
2849    obj%info = info
2850    !
2851  END SUBROUTINE qes_init_info
2852  !
2853  !
2854  SUBROUTINE qes_init_outputPBC(obj, tagname, assume_isolated)
2855    !
2856    IMPLICIT NONE
2857    !
2858    TYPE(outputPBC_type), INTENT(OUT) :: obj
2859    CHARACTER(LEN=*), INTENT(IN) :: tagname
2860    CHARACTER(LEN=*),INTENT(IN) :: assume_isolated
2861    !
2862    obj%tagname = TRIM(tagname)
2863    obj%lwrite = .TRUE.
2864    obj%lread = .TRUE.
2865    !
2866    obj%assume_isolated = assume_isolated
2867    !
2868  END SUBROUTINE qes_init_outputPBC
2869  !
2870  !
2871  SUBROUTINE qes_init_magnetization(obj, tagname, lsda, noncolin, spinorbit, total, absolute, do_magnetization)
2872    !
2873    IMPLICIT NONE
2874    !
2875    TYPE(magnetization_type), INTENT(OUT) :: obj
2876    CHARACTER(LEN=*), INTENT(IN) :: tagname
2877    LOGICAL,INTENT(IN) :: lsda
2878    LOGICAL,INTENT(IN) :: noncolin
2879    LOGICAL,INTENT(IN) :: spinorbit
2880    REAL(DP),INTENT(IN) :: total
2881    REAL(DP),INTENT(IN) :: absolute
2882    LOGICAL,OPTIONAL,INTENT(IN) :: do_magnetization
2883    !
2884    obj%tagname = TRIM(tagname)
2885    obj%lwrite = .TRUE.
2886    obj%lread = .TRUE.
2887    !
2888    obj%lsda = lsda
2889    obj%noncolin = noncolin
2890    obj%spinorbit = spinorbit
2891    obj%total = total
2892    obj%absolute = absolute
2893    IF ( PRESENT(do_magnetization)) THEN
2894      obj%do_magnetization_ispresent = .TRUE.
2895      obj%do_magnetization = do_magnetization
2896    ELSE
2897      obj%do_magnetization_ispresent = .FALSE.
2898    END IF
2899    !
2900  END SUBROUTINE qes_init_magnetization
2901  !
2902  !
2903  SUBROUTINE qes_init_total_energy(obj, tagname, etot, eband, ehart, vtxc, etxc, ewald, demet,&
2904                                  efieldcorr, potentiostat_contr, gatefield_contr, vdW_term)
2905    !
2906    IMPLICIT NONE
2907    !
2908    TYPE(total_energy_type), INTENT(OUT) :: obj
2909    CHARACTER(LEN=*), INTENT(IN) :: tagname
2910    REAL(DP),INTENT(IN) :: etot
2911    REAL(DP),OPTIONAL,INTENT(IN) :: eband
2912    REAL(DP),OPTIONAL,INTENT(IN) :: ehart
2913    REAL(DP),OPTIONAL,INTENT(IN) :: vtxc
2914    REAL(DP),OPTIONAL,INTENT(IN) :: etxc
2915    REAL(DP),OPTIONAL,INTENT(IN) :: ewald
2916    REAL(DP),OPTIONAL,INTENT(IN) :: demet
2917    REAL(DP),OPTIONAL,INTENT(IN) :: efieldcorr
2918    REAL(DP),OPTIONAL,INTENT(IN) :: potentiostat_contr
2919    REAL(DP),OPTIONAL,INTENT(IN) :: gatefield_contr
2920    REAL(DP),OPTIONAL,INTENT(IN) :: vdW_term
2921    !
2922    obj%tagname = TRIM(tagname)
2923    obj%lwrite = .TRUE.
2924    obj%lread = .TRUE.
2925    !
2926    obj%etot = etot
2927    IF ( PRESENT(eband)) THEN
2928      obj%eband_ispresent = .TRUE.
2929      obj%eband = eband
2930    ELSE
2931      obj%eband_ispresent = .FALSE.
2932    END IF
2933    IF ( PRESENT(ehart)) THEN
2934      obj%ehart_ispresent = .TRUE.
2935      obj%ehart = ehart
2936    ELSE
2937      obj%ehart_ispresent = .FALSE.
2938    END IF
2939    IF ( PRESENT(vtxc)) THEN
2940      obj%vtxc_ispresent = .TRUE.
2941      obj%vtxc = vtxc
2942    ELSE
2943      obj%vtxc_ispresent = .FALSE.
2944    END IF
2945    IF ( PRESENT(etxc)) THEN
2946      obj%etxc_ispresent = .TRUE.
2947      obj%etxc = etxc
2948    ELSE
2949      obj%etxc_ispresent = .FALSE.
2950    END IF
2951    IF ( PRESENT(ewald)) THEN
2952      obj%ewald_ispresent = .TRUE.
2953      obj%ewald = ewald
2954    ELSE
2955      obj%ewald_ispresent = .FALSE.
2956    END IF
2957    IF ( PRESENT(demet)) THEN
2958      obj%demet_ispresent = .TRUE.
2959      obj%demet = demet
2960    ELSE
2961      obj%demet_ispresent = .FALSE.
2962    END IF
2963    IF ( PRESENT(efieldcorr)) THEN
2964      obj%efieldcorr_ispresent = .TRUE.
2965      obj%efieldcorr = efieldcorr
2966    ELSE
2967      obj%efieldcorr_ispresent = .FALSE.
2968    END IF
2969    IF ( PRESENT(potentiostat_contr)) THEN
2970      obj%potentiostat_contr_ispresent = .TRUE.
2971      obj%potentiostat_contr = potentiostat_contr
2972    ELSE
2973      obj%potentiostat_contr_ispresent = .FALSE.
2974    END IF
2975    IF ( PRESENT(gatefield_contr)) THEN
2976      obj%gatefield_contr_ispresent = .TRUE.
2977      obj%gatefield_contr = gatefield_contr
2978    ELSE
2979      obj%gatefield_contr_ispresent = .FALSE.
2980    END IF
2981    IF ( PRESENT(vdW_term)) THEN
2982      obj%vdW_term_ispresent = .TRUE.
2983      obj%vdW_term = vdW_term
2984    ELSE
2985      obj%vdW_term_ispresent = .FALSE.
2986    END IF
2987    !
2988  END SUBROUTINE qes_init_total_energy
2989  !
2990  !
2991  SUBROUTINE qes_init_band_structure(obj, tagname, lsda, noncolin, spinorbit, nelec, wf_collected,&
2992                                    starting_k_points, nks, occupations_kind, ks_energies, nbnd,&
2993                                    nbnd_up, nbnd_dw, num_of_atomic_wfc, fermi_energy, highestOccupiedLevel,&
2994                                    lowestUnoccupiedLevel, two_fermi_energies, smearing)
2995    !
2996    IMPLICIT NONE
2997    !
2998    TYPE(band_structure_type), INTENT(OUT) :: obj
2999    CHARACTER(LEN=*), INTENT(IN) :: tagname
3000    LOGICAL,INTENT(IN) :: lsda
3001    LOGICAL,INTENT(IN) :: noncolin
3002    LOGICAL,INTENT(IN) :: spinorbit
3003    INTEGER,OPTIONAL,INTENT(IN) :: nbnd
3004    INTEGER,OPTIONAL,INTENT(IN) :: nbnd_up
3005    INTEGER,OPTIONAL,INTENT(IN) :: nbnd_dw
3006    REAL(DP),INTENT(IN) :: nelec
3007    INTEGER,OPTIONAL,INTENT(IN) :: num_of_atomic_wfc
3008    LOGICAL,INTENT(IN) :: wf_collected
3009    REAL(DP),OPTIONAL,INTENT(IN) :: fermi_energy
3010    REAL(DP),OPTIONAL,INTENT(IN) :: highestOccupiedLevel
3011    REAL(DP),OPTIONAL,INTENT(IN) :: lowestUnoccupiedLevel
3012    REAL(DP), DIMENSION(2),OPTIONAL,INTENT(IN) :: two_fermi_energies
3013    TYPE(k_points_IBZ_type),INTENT(IN) :: starting_k_points
3014    INTEGER,INTENT(IN) :: nks
3015    TYPE(occupations_type),INTENT(IN) :: occupations_kind
3016    TYPE(smearing_type),OPTIONAL,INTENT(IN) :: smearing
3017    TYPE(ks_energies_type),DIMENSION(:),INTENT(IN) :: ks_energies
3018    !
3019    obj%tagname = TRIM(tagname)
3020    obj%lwrite = .TRUE.
3021    obj%lread = .TRUE.
3022    !
3023    obj%lsda = lsda
3024    obj%noncolin = noncolin
3025    obj%spinorbit = spinorbit
3026    IF ( PRESENT(nbnd)) THEN
3027      obj%nbnd_ispresent = .TRUE.
3028      obj%nbnd = nbnd
3029    ELSE
3030      obj%nbnd_ispresent = .FALSE.
3031    END IF
3032    IF ( PRESENT(nbnd_up)) THEN
3033      obj%nbnd_up_ispresent = .TRUE.
3034      obj%nbnd_up = nbnd_up
3035    ELSE
3036      obj%nbnd_up_ispresent = .FALSE.
3037    END IF
3038    IF ( PRESENT(nbnd_dw)) THEN
3039      obj%nbnd_dw_ispresent = .TRUE.
3040      obj%nbnd_dw = nbnd_dw
3041    ELSE
3042      obj%nbnd_dw_ispresent = .FALSE.
3043    END IF
3044    obj%nelec = nelec
3045    IF ( PRESENT(num_of_atomic_wfc)) THEN
3046      obj%num_of_atomic_wfc_ispresent = .TRUE.
3047      obj%num_of_atomic_wfc = num_of_atomic_wfc
3048    ELSE
3049      obj%num_of_atomic_wfc_ispresent = .FALSE.
3050    END IF
3051    obj%wf_collected = wf_collected
3052    IF ( PRESENT(fermi_energy)) THEN
3053      obj%fermi_energy_ispresent = .TRUE.
3054      obj%fermi_energy = fermi_energy
3055    ELSE
3056      obj%fermi_energy_ispresent = .FALSE.
3057    END IF
3058    IF ( PRESENT(highestOccupiedLevel)) THEN
3059      obj%highestOccupiedLevel_ispresent = .TRUE.
3060      obj%highestOccupiedLevel = highestOccupiedLevel
3061    ELSE
3062      obj%highestOccupiedLevel_ispresent = .FALSE.
3063    END IF
3064    IF ( PRESENT(lowestUnoccupiedLevel)) THEN
3065      obj%lowestUnoccupiedLevel_ispresent = .TRUE.
3066      obj%lowestUnoccupiedLevel = lowestUnoccupiedLevel
3067    ELSE
3068      obj%lowestUnoccupiedLevel_ispresent = .FALSE.
3069    END IF
3070    IF ( PRESENT(two_fermi_energies)) THEN
3071      obj%two_fermi_energies_ispresent = .TRUE.
3072      obj%two_fermi_energies = two_fermi_energies
3073    ELSE
3074      obj%two_fermi_energies_ispresent = .FALSE.
3075    END IF
3076    obj%starting_k_points = starting_k_points
3077    obj%nks = nks
3078    obj%occupations_kind = occupations_kind
3079    IF ( PRESENT(smearing)) THEN
3080      obj%smearing_ispresent = .TRUE.
3081      obj%smearing = smearing
3082    ELSE
3083      obj%smearing_ispresent = .FALSE.
3084    END IF
3085    ALLOCATE( obj%ks_energies(SIZE(ks_energies)))
3086    obj%ndim_ks_energies = SIZE(ks_energies)
3087    obj%ks_energies = ks_energies
3088    !
3089  END SUBROUTINE qes_init_band_structure
3090  !
3091  !
3092  SUBROUTINE qes_init_ks_energies(obj, tagname, k_point, npw, eigenvalues, occupations)
3093    !
3094    IMPLICIT NONE
3095    !
3096    TYPE(ks_energies_type), INTENT(OUT) :: obj
3097    CHARACTER(LEN=*), INTENT(IN) :: tagname
3098    TYPE(k_point_type),INTENT(IN) :: k_point
3099    INTEGER,INTENT(IN) :: npw
3100    TYPE(vector_type),INTENT(IN) :: eigenvalues
3101    TYPE(vector_type),INTENT(IN) :: occupations
3102    !
3103    obj%tagname = TRIM(tagname)
3104    obj%lwrite = .TRUE.
3105    obj%lread = .TRUE.
3106    !
3107    obj%k_point = k_point
3108    obj%npw = npw
3109    obj%eigenvalues = eigenvalues
3110    obj%occupations = occupations
3111    !
3112  END SUBROUTINE qes_init_ks_energies
3113  !
3114  !
3115  SUBROUTINE qes_init_closed(obj, tagname, DATE, TIME, closed)
3116    !
3117    IMPLICIT NONE
3118    !
3119    TYPE(closed_type), INTENT(OUT) :: obj
3120    CHARACTER(LEN=*), INTENT(IN) :: tagname
3121    CHARACTER(LEN=*), INTENT(IN) :: DATE
3122    CHARACTER(LEN=*), INTENT(IN) :: TIME
3123    CHARACTER(LEN=*), INTENT(IN) :: closed
3124    !
3125    obj%tagname = TRIM(tagname)
3126    obj%lwrite = .TRUE.
3127    obj%lread = .TRUE.
3128    obj%DATE = DATE
3129    obj%TIME = TIME
3130    !
3131    obj%closed = closed
3132    !
3133  END SUBROUTINE qes_init_closed
3134  !
3135  !
3136  SUBROUTINE qes_init_vector(obj, tagname, vector)
3137    !
3138    IMPLICIT NONE
3139    !
3140    TYPE(vector_type), INTENT(OUT) :: obj
3141    CHARACTER(LEN=*), INTENT(IN) :: tagname
3142    REAL(DP), DIMENSION(:), INTENT(IN) :: vector
3143    !
3144    obj%tagname = TRIM(tagname)
3145    obj%lwrite = .TRUE.
3146    obj%lread = .TRUE.
3147    !
3148    obj%size = size(vector)
3149    ALLOCATE(obj%vector(obj%size))
3150    obj%vector = vector
3151    !
3152  END SUBROUTINE qes_init_vector
3153  !
3154  !
3155  SUBROUTINE qes_init_integerVector(obj, tagname, integerVector)
3156    !
3157    IMPLICIT NONE
3158    !
3159    TYPE(integerVector_type), INTENT(OUT) :: obj
3160    CHARACTER(LEN=*), INTENT(IN) :: tagname
3161    INTEGER, DIMENSION(:), INTENT(IN) :: integerVector
3162    !
3163    obj%tagname = TRIM(tagname)
3164    obj%lwrite = .TRUE.
3165    obj%lread = .TRUE.
3166    !
3167    obj%size = size(integerVector)
3168    ALLOCATE(obj%integerVector(obj%size))
3169    obj%integerVector = integerVector
3170    !
3171  END SUBROUTINE qes_init_integerVector
3172  !
3173
3174  !
3175  SUBROUTINE qes_init_matrix_1(obj, tagname, dims, mat, order)
3176    !
3177    IMPLICIT NONE
3178    !
3179    TYPE(matrix_type), INTENT(OUT) :: obj
3180    CHARACTER(LEN=*), INTENT(IN) :: tagname
3181    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3182    REAL(DP), INTENT(IN) :: mat(:)
3183    CHARACTER(LEN=*),OPTIONAL :: order
3184    INTEGER :: rank, length, i
3185    !
3186    obj%tagname = TRIM(tagname)
3187    obj%lwrite = .TRUE.
3188    obj%lread = .TRUE.
3189    length = 1
3190    rank = SIZE(dims)
3191    DO i = 1, rank
3192      length = length * dims(i)
3193    END DO
3194    obj%rank = rank
3195    ALLOCATE(obj%matrix(length), obj%dims(rank) )
3196    obj%matrix(1:length) = mat(1:length)
3197    obj%dims = dims
3198    IF (PRESENT(order)) THEN
3199      obj%order = TRIM(order)
3200    ELSE
3201      obj%order = 'F'
3202    END IF
3203    !
3204  END SUBROUTINE qes_init_matrix_1
3205  !
3206  !
3207  SUBROUTINE qes_init_matrix_2(obj, tagname, dims, mat, order)
3208    !
3209    IMPLICIT NONE
3210    !
3211    TYPE(matrix_type), INTENT(OUT) :: obj
3212    CHARACTER(LEN=*), INTENT(IN) :: tagname
3213    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3214    REAL(DP), INTENT(IN) :: mat(:,:)
3215    CHARACTER(LEN=*),OPTIONAL :: order
3216    INTEGER :: rank, length, i
3217    !
3218    obj%tagname = TRIM(tagname)
3219    obj%lwrite = .TRUE.
3220    obj%lread = .TRUE.
3221    length = 1
3222    rank = SIZE(dims)
3223    DO i = 1, rank
3224      length = length * dims(i)
3225    END DO
3226    obj%rank = rank
3227    ALLOCATE(obj%matrix(length), obj%dims(rank) )
3228    obj%matrix(1:length) = reshape(mat, [length])
3229    obj%dims = dims
3230    IF (PRESENT(order)) THEN
3231      obj%order = TRIM(order)
3232    ELSE
3233      obj%order = 'F'
3234    END IF
3235    !
3236  END SUBROUTINE qes_init_matrix_2
3237  !
3238  !
3239  SUBROUTINE qes_init_matrix_3(obj, tagname, dims, mat, order)
3240    !
3241    IMPLICIT NONE
3242    !
3243    TYPE(matrix_type), INTENT(OUT) :: obj
3244    CHARACTER(LEN=*), INTENT(IN) :: tagname
3245    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3246    REAL(DP), INTENT(IN) :: mat(:,:,:)
3247    CHARACTER(LEN=*),OPTIONAL :: order
3248    INTEGER :: rank, length, i
3249    !
3250    obj%tagname = TRIM(tagname)
3251    obj%lwrite = .TRUE.
3252    obj%lread = .TRUE.
3253    length = 1
3254    rank = SIZE(dims)
3255    DO i = 1, rank
3256      length = length * dims(i)
3257    END DO
3258    obj%rank = rank
3259    ALLOCATE(obj%matrix(length), obj%dims(rank) )
3260    obj%matrix(1:length) = reshape(mat, [length])
3261    obj%dims = dims
3262    IF (PRESENT(order)) THEN
3263      obj%order = TRIM(order)
3264    ELSE
3265      obj%order = 'F'
3266    END IF
3267    !
3268  END SUBROUTINE qes_init_matrix_3
3269  !
3270
3271  !
3272  SUBROUTINE qes_init_integerMatrix_1(obj, tagname, dims, mat, order)
3273    !
3274    IMPLICIT NONE
3275    !
3276    TYPE(integerMatrix_type), INTENT(OUT) :: obj
3277    CHARACTER(LEN=*), INTENT(IN) :: tagname
3278    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3279    INTEGER, INTENT(IN) :: mat(:)
3280    CHARACTER(LEN=*),OPTIONAL :: order
3281    INTEGER :: rank, length, i
3282    !
3283    obj%tagname = TRIM(tagname)
3284    obj%lwrite = .TRUE.
3285    obj%lread = .TRUE.
3286    length = 1
3287    rank = SIZE(dims)
3288    DO i = 1, rank
3289      length = length * dims(i)
3290    END DO
3291    obj%rank = rank
3292    ALLOCATE(obj%integerMatrix(length), obj%dims(rank) )
3293    obj%integerMatrix(1:length) = mat(1:length)
3294    obj%dims = dims
3295    IF (PRESENT(order)) THEN
3296      obj%order = TRIM(order)
3297    ELSE
3298      obj%order = 'F'
3299    END IF
3300    !
3301  END SUBROUTINE qes_init_integerMatrix_1
3302  !
3303  !
3304  SUBROUTINE qes_init_integerMatrix_2(obj, tagname, dims, mat, order)
3305    !
3306    IMPLICIT NONE
3307    !
3308    TYPE(integerMatrix_type), INTENT(OUT) :: obj
3309    CHARACTER(LEN=*), INTENT(IN) :: tagname
3310    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3311    INTEGER, INTENT(IN) :: mat(:,:)
3312    CHARACTER(LEN=*),OPTIONAL :: order
3313    INTEGER :: rank, length, i
3314    !
3315    obj%tagname = TRIM(tagname)
3316    obj%lwrite = .TRUE.
3317    obj%lread = .TRUE.
3318    length = 1
3319    rank = SIZE(dims)
3320    DO i = 1, rank
3321      length = length * dims(i)
3322    END DO
3323    obj%rank = rank
3324    ALLOCATE(obj%integerMatrix(length), obj%dims(rank) )
3325    obj%integerMatrix(1:length) = reshape(mat, [length])
3326    obj%dims = dims
3327    IF (PRESENT(order)) THEN
3328      obj%order = TRIM(order)
3329    ELSE
3330      obj%order = 'F'
3331    END IF
3332    !
3333  END SUBROUTINE qes_init_integerMatrix_2
3334  !
3335  !
3336  SUBROUTINE qes_init_integerMatrix_3(obj, tagname, dims, mat, order)
3337    !
3338    IMPLICIT NONE
3339    !
3340    TYPE(integerMatrix_type), INTENT(OUT) :: obj
3341    CHARACTER(LEN=*), INTENT(IN) :: tagname
3342    INTEGER,DIMENSION(:),INTENT(IN) :: dims
3343    INTEGER, INTENT(IN) :: mat(:,:,:)
3344    CHARACTER(LEN=*),OPTIONAL :: order
3345    INTEGER :: rank, length, i
3346    !
3347    obj%tagname = TRIM(tagname)
3348    obj%lwrite = .TRUE.
3349    obj%lread = .TRUE.
3350    length = 1
3351    rank = SIZE(dims)
3352    DO i = 1, rank
3353      length = length * dims(i)
3354    END DO
3355    obj%rank = rank
3356    ALLOCATE(obj%integerMatrix(length), obj%dims(rank) )
3357    obj%integerMatrix(1:length) = reshape(mat, [length])
3358    obj%dims = dims
3359    IF (PRESENT(order)) THEN
3360      obj%order = TRIM(order)
3361    ELSE
3362      obj%order = 'F'
3363    END IF
3364    !
3365  END SUBROUTINE qes_init_integerMatrix_3
3366  !
3367  !
3368  SUBROUTINE qes_init_scalarQuantity(obj, tagname, Units, scalarQuantity)
3369    !
3370    IMPLICIT NONE
3371    !
3372    TYPE(scalarQuantity_type), INTENT(OUT) :: obj
3373    CHARACTER(LEN=*), INTENT(IN) :: tagname
3374    CHARACTER(LEN=*), INTENT(IN) :: Units
3375    REAL(DP), INTENT(IN) :: scalarQuantity
3376    !
3377    obj%tagname = TRIM(tagname)
3378    obj%lwrite = .TRUE.
3379    obj%lread = .TRUE.
3380    obj%Units = Units
3381    !
3382    obj%scalarQuantity = scalarQuantity
3383    !
3384  END SUBROUTINE qes_init_scalarQuantity
3385  !
3386  !
3387END MODULE qes_init_module