! ! Copyright (C) 2002-2005 FPMD-CPV groups ! This file is distributed under the terms of the ! GNU General Public License. See the file `License' ! in the root directory of the present distribution, ! or http://www.gnu.org/copyleft/gpl.txt . ! ! ---------------------------------------------------------------- MODULE input ! ---------------------------------------------------------------- USE kinds, ONLY: dbl USE io_global, ONLY: ionode, stdout IMPLICIT NONE SAVE PRIVATE ! Input Subroutines ! should be called in the following order ! PUBLIC :: read_input_file ! a) This sub. should be called first PUBLIC :: iosys_pseudo ! b) then read pseudo files PUBLIC :: iosys ! c) finally copy variables to modules LOGICAL :: has_been_read = .FALSE. ! ---------------------------------------------------------------- CONTAINS ! ---------------------------------------------------------------- SUBROUTINE read_input_file( lneb, lsmd, lwf ) ! USE read_namelists_module, ONLY: read_namelists USE read_cards_module, ONLY: read_cards USE input_parameters, ONLY: calculation, title USE control_flags, ONLY: program_name USE printout_base, ONLY: title_ => title ! IMPLICIT NONE LOGICAL, OPTIONAL, INTENT(OUT) :: lneb, lsmd, lwf CHARACTER(LEN=2) :: prog IF( program_name == 'FPMD' ) prog = 'FP' IF( program_name == 'CP90' ) prog = 'CP' IF( ionode ) THEN CALL input_from_file() END IF ! . Read NAMELISTS ..................................................! CALL read_namelists( prog ) ! . Read CARDS ......................................................! CALL read_cards( prog ) IF( PRESENT(lneb) ) THEN lneb = ( TRIM( calculation ) == 'neb' ) END IF IF( PRESENT(lsmd) ) THEN lsmd = ( TRIM( calculation ) == 'smd' ) IF( lsmd .AND. ( program_name == 'FPMD' ) ) THEN CALL errore(" read_input_file ", " SMD Dynamics not implemented in FPMD ", 1 ) END IF END IF IF( PRESENT(lwf) ) THEN lwf = ( TRIM( calculation ) == 'cp-wf' ) END IF ! ! Set job title and print it on standard output ! title_ = title WRITE( stdout, 400 ) TRIM( title_ ) 400 FORMAT(/ 3X, 'Job Title: ', A ) has_been_read = .TRUE. RETURN END SUBROUTINE read_input_file ! ! ! ---------------------------------------------- ! ! SUBROUTINE iosys_pseudo( ) use input_parameters, only: atom_pfile, pseudo_dir, ntyp, nat, prefix, scradir, xc_type use control_flags, only: program_name use parameters, only: nsx use read_pseudo_module_fpmd, only: readpp USE io_files, ONLY: & psfile_ => psfile , & pseudo_dir_ => pseudo_dir, & scradir_ => scradir, & prefix_ => prefix USE ions_base, ONLY: nsp_ => nsp, nat_ => nat implicit none IF( .NOT. has_been_read ) & CALL errore( ' iosys_pseudo ', ' input file has not been read yet! ', 1 ) prefix_ = TRIM( prefix ) scradir_ = TRIM( scradir ) ! ! Set internal variables for the number of species and number of atoms ! nsp_ = ntyp nat_ = nat psfile_= ' ' psfile_ ( 1:nsp_ ) = atom_pfile( 1:nsp_ ) pseudo_dir_ = TRIM( pseudo_dir ) ! ! read in pseudopotentials and wavefunctions files ! call readpp( xc_type ) ! return END SUBROUTINE iosys_pseudo ! ! ! ---------------------------------------------- ! ! SUBROUTINE iosys USE control_flags, ONLY: fix_dependencies, program_name IMPLICIT NONE IF( ionode ) THEN WRITE( stdout, fmt = & "(//,3X,'Main Simulation Parameters (from input)',/ & & ,3X,'---------------------------------------')" ) END IF ! . Set internal flags according to the input .......................! CALL set_control_flags( ) ! ! . Write to stdout basic simulation parameters .....................! ! CALL input_info() ! . CALL the Module specific setup routine ..........................! CALL modules_setup() ! . Initialize SMD variables and path CALL smd_initvar() ! . Fix values for dependencies .....................................! IF( program_name == 'FPMD' ) THEN CALL fix_dependencies() END IF ! ! . Write to stdout input module information ........................! ! CALL modules_info() ! RETURN END SUBROUTINE iosys ! ! ! ---------------------------------------------- ! ! SUBROUTINE set_control_flags( ) ! USE control_flags, ONLY: program_name USE control_flags, ONLY: & ndw_ => ndw, & ndr_ => ndr, & iprint_ => iprint, & isave_ => isave, & tstress_ => tstress, & tprnfor_ => tprnfor, & tprnsfac_ => tprnsfac, & toptical_ => toptical, & ampre_ => ampre, & trane_ => trane, & newnfi_ => newnfi, & tnewnfi_ => tnewnfi, & rhoout_ => rhoout, & tdipole_ => tdipole, & nomore_ => nomore, & memchk_ => memchk, & tpre_ => tpre, & timing_ => timing, & iprsta_ => iprsta, & taurdr_ => taurdr, & nbeg_ => nbeg, & gamma_only_ => gamma_only, & tchi2_ => tchi2, & tatomicwfc_ => tatomicwfc, & printwfc_ => printwfc, & tortho_ => tortho USE control_flags, ONLY: & t_diis_simple_ => t_diis_simple, & t_diis_ => t_diis, & tsde_ => tsde, & t_diis_rot_ => t_diis_rot, & tconjgrad_ => tconjgrad, & tsteepdesc_ => tsteepdesc, & tzeroe_ => tzeroe, & tdamp_ => tdamp, & trhor_ => trhor, & trhow_ => trhow, & tvlocw_ => tvlocw, & ortho_eps_ => ortho_eps, & ortho_max_ => ortho_max, & tnosee_ => tnosee USE control_flags, ONLY: & tdampions_ => tdampions, & tfor_ => tfor, & tsdp_ => tsdp, & tconvthrs, tconjgrad_ion USE control_flags, ONLY: & tnosep_ => tnosep, & tcap_ => tcap, & tcp_ => tcp, & tolp_ => tolp, & tzerop_ => tzerop, & tv0rd_ => tv0rd, & tranp_ => tranp, & amprp_ => amprp USE control_flags, ONLY: & tionstep_ => tionstep, & nstepe_ => nstepe USE control_flags, ONLY: & tzeroc_ => tzeroc, & tnoseh_ => tnoseh, & thdyn_ => thdyn, & tsdc_ => tsdc, & tbeg_ => tbeg USE control_flags, ONLY: & ekin_conv_thr_ => ekin_conv_thr, & etot_conv_thr_ => etot_conv_thr, & forc_conv_thr_ => forc_conv_thr, & ekin_maxiter_ => ekin_maxiter, & etot_maxiter_ => etot_maxiter, & forc_maxiter_ => forc_maxiter USE control_flags, ONLY: & force_pairing_ => force_pairing ! Other module USE wave_base, ONLY: frice_ => frice USE ions_base, ONLY: fricp_ => fricp USE cell_base, ONLY: frich_ => frich USE time_step, ONLY: set_time_step USE cp_electronic_mass, only: & emass_ => emass, & emaec_ => emass_cutoff USE input_parameters, ONLY: & electron_dynamics, electron_damping, diis_rot, electron_temperature, & ion_dynamics, ekin_conv_thr, etot_conv_thr, forc_conv_thr, ion_maxstep, & electron_maxstep, ion_damping, ion_temperature, ion_velocities, tranp, & amprp, ion_nstepe, cell_nstepe, cell_dynamics, cell_damping, & cell_parameters, cell_velocities, cell_temperature, force_pairing, & tapos, tavel, ecutwfc, emass, emass_cutoff, taspc, trd_ht, ibrav, ortho_eps, & ortho_max, ntyp, tolp, tchi2_inp, calculation, disk_io, dt USE input_parameters, ONLY: ndr, ndw, iprint, isave, tstress, k_points, & tprnfor, verbosity, tprnrho, tdipole_card, toptical_card, & tnewnfi_card, newnfi_card, ampre, nstep, restart_mode, ion_positions, & startingwfc, printwfc, orthogonalization, electron_velocities ! IMPLICIT NONE ! IF( .NOT. has_been_read ) & CALL errore( ' iosys ', ' input file has not been read yet! ', 1 ) ndr_ = ndr ndw_ = ndw iprint_ = iprint isave_ = isave tstress_ = tstress tpre_ = tstress gamma_only_ = ( TRIM( k_points ) == 'gamma' ) tprnfor_ = tprnfor printwfc_ = printwfc tchi2_ = tchi2_inp ekin_conv_thr_ = ekin_conv_thr etot_conv_thr_ = etot_conv_thr forc_conv_thr_ = forc_conv_thr ekin_maxiter_ = electron_maxstep ! etot_maxiter_ = etot_maxiter, & ! forc_maxiter_ = forc_maxiter ! ... Set internal time step variables ( delt, twodelt, dt2 ... ) CALL set_time_step( dt ) ! ... Set electronic fictitius mass and its cut-off for fourier ! acceleration emass_ = emass emaec_ = emass_cutoff ! ! set the level of output, the code verbosity ! iprsta_ = 1 timing_ = .FALSE. ! The code write to files fort.8 fort.41 fort.42 fort.43 ! a detailed report of subroutines timing rhoout_ = .false. ! save charge density to file CHARGEDENSITY if nspin = 1, and ! CHARGEDENSITY.UP CHARGEDENSITY.DOWN if nspin = 2 memchk_ = .FALSE. ! The code performs a memory check, write on standard ! output the allocated memory at each step. ! Architecture Dependent tprnsfac_ = .FALSE. ! Print on file STRUCTURE_FACTOR the structure factor ! gvectors and charge density, in reciprocal space. trhor_ = ( TRIM( calculation ) == 'nscf' ) trhow_ = ( TRIM( disk_io ) == 'high' ) tvlocw_ = .false. ! temporaneo SELECT CASE ( TRIM(verbosity) ) CASE ('minimal') iprsta_ = 0 CASE ('low', 'default') iprsta_ = 1 timing_ = .TRUE. CASE ('medium') iprsta_ = 2 timing_ = .TRUE. rhoout_ = .TRUE. tprnsfac_ = .TRUE. CASE ('high') iprsta_ = 3 memchk_ = .TRUE. timing_ = .TRUE. rhoout_ = .TRUE. tprnsfac_ = .TRUE. CASE DEFAULT CALL errore(' control_flags ',' unknown verbosity '//TRIM(verbosity), 1 ) END SELECT ! ... If explicitly requested force the charge density to be printed IF( tprnrho ) rhoout_ = .TRUE. tdipole_ = tdipole_card toptical_ = toptical_card newnfi_ = newnfi_card tnewnfi_ = tnewnfi_card ! ! set the restart flags ! trane_ = .FALSE. ampre_ = ampre SELECT CASE ( TRIM( restart_mode ) ) CASE ('from_scratch') nbeg_ = -2 if ( ion_positions == 'from_input' ) nbeg_ = -1 nomore_ = nstep trane_ = ( startingwfc == 'random' ) if ( ampre_ == 0.d0 ) ampre_ = 0.02 CASE ('reset_counters') nbeg_ = 0 nomore_ = nstep CASE ('restart') nbeg_ = 1 nomore_ = nstep if ( ion_positions == 'from_input' ) then taurdr_ = .TRUE. nbeg_ = -1 end if CASE DEFAULT CALL errore(' iosys ',' unknown restart_mode '//trim(restart_mode), 1 ) END SELECT ! ... Starting/Restarting Atomic positions taurdr_ = .FALSE. SELECT CASE ( TRIM(ion_positions) ) CASE ( 'from_input' ) taurdr_ = .TRUE. ! Positions read from standard input CASE ( 'default' ) taurdr_ = .FALSE. CASE DEFAULT CALL errore(' control_flags ',' unknown ion_positions '//TRIM(ion_positions), 1 ) END SELECT ! ... Electronic randomization tatomicwfc_ = .FALSE. SELECT CASE ( TRIM(startingwfc) ) CASE ('default','none') trane_ = .FALSE. CASE ('random') trane_ = .TRUE. CASE ('atomic') tatomicwfc_ = .TRUE. CASE DEFAULT CALL errore(' control_flags ',' unknown startingwfc '//TRIM(startingwfc), 1 ) END SELECT IF( ampre_ == 0 ) trane_ = .FALSE. ! ... TORTHO SELECT CASE ( orthogonalization ) CASE ('Gram-Schmidt') tortho_ = .FALSE. CASE ('ortho') tortho_ = .TRUE. CASE DEFAULT CALL errore(' iosys ',' unknown orthogonalization '//& trim(orthogonalization), 1 ) END SELECT ortho_max_ = ortho_max ortho_eps_ = ortho_eps ! ... Electrons initial velocity SELECT CASE ( TRIM(electron_velocities) ) CASE ('default') tzeroe_ = .FALSE. CASE ('zero') tzeroe_ = .TRUE. IF( program_name == 'CP90' ) & print '("Warning: electron_velocities keyword has no effect")' CASE DEFAULT CALL errore(' control_flags ',' unknown electron_velocities '//TRIM(electron_velocities), 1 ) END SELECT ! ... Electron dynamics tdamp_ = .FALSE. tconjgrad_ = .FALSE. tsteepdesc_ = .FALSE. t_diis_ = .FALSE. t_diis_simple_ = .FALSE. t_diis_rot_ = .FALSE. frice_ = 0.d0 SELECT CASE ( TRIM(electron_dynamics) ) CASE ('sd', 'default') tsde_ = .TRUE. CASE ('verlet') tsde_ = .FALSE. CASE ('cg') tsde_ = .FALSE. tconjgrad_ = .TRUE. IF( program_name == 'CP90' ) & CALL errore( "iosys ", " electron_dynamics keyword not yet implemented ", 1 ) CASE ('damp') tsde_ = .FALSE. tdamp_ = .TRUE. frice_ = electron_damping CASE ('diis') IF( program_name == 'CP90' ) & CALL errore( "iosys ", " electron_dynamics keyword not yet implemented ", 1 ) tsde_ = .FALSE. t_diis_ = .TRUE. IF( diis_rot ) THEN t_diis_rot_ = .TRUE. ELSE t_diis_simple_ = .TRUE. END IF CASE ('none') tsde_ = .FALSE. CASE DEFAULT CALL errore(' control_flags ',' unknown electron_dynamics '//TRIM(electron_dynamics), 1 ) END SELECT ! ... Electronic Temperature tnosee_ = .FALSE. SELECT CASE ( TRIM(electron_temperature) ) ! temperature control of electrons via Nose' thermostat CASE ('nose') tnosee_ = .TRUE. CASE ('not_controlled', 'default') tnosee_ = .FALSE. CASE DEFAULT CALL errore(' control_flags ',' unknown electron_temperature '//TRIM(electron_temperature), 1 ) END SELECT ! ... Ions dynamics tdampions_ = .FALSE. tconvthrs%active = .FALSE. tconvthrs%nstep = 1 tconvthrs%ekin = 0.0d0 tconvthrs%derho = 0.0d0 tconvthrs%force = 0.0d0 tconjgrad_ion%active = .FALSE. tconjgrad_ion%nstepix = 1 tconjgrad_ion%nstepex = 1 tconjgrad_ion%ionthr = 1.0d+10 tconjgrad_ion%elethr = 1.0d+10 SELECT CASE ( TRIM(ion_dynamics) ) CASE ('sd') tsdp_ = .TRUE. tfor_ = .TRUE. fricp_ = 0.d0 tconvthrs%ekin = ekin_conv_thr tconvthrs%derho = etot_conv_thr tconvthrs%force = forc_conv_thr tconvthrs%active = .TRUE. tconvthrs%nstep = 1 CASE ('verlet') tsdp_ = .FALSE. tfor_ = .TRUE. fricp_ = 0.d0 CASE ('cg') ! Conjugate Gradient minimization for ions tsdp_ = .FALSE. tfor_ = .TRUE. tconjgrad_ion%active = .TRUE. tconjgrad_ion%nstepix = ion_maxstep ! maximum number of iteration tconjgrad_ion%nstepex = electron_maxstep ! maximum number of iteration for the electronic minimization tconjgrad_ion%ionthr = etot_conv_thr ! energy threshold for convergence tconjgrad_ion%elethr = ekin_conv_thr ! energy threshold for convergence in the electrons minimization tconvthrs%ekin = ekin_conv_thr tconvthrs%derho = etot_conv_thr tconvthrs%force = forc_conv_thr tconvthrs%active = .TRUE. tconvthrs%nstep = 1 IF( program_name == 'CP90' ) & CALL errore( "iosys ", " ion_dynamics = '//TRIM(ion_dynamics)//' not yet implemented ", 1 ) CASE ('damp') tsdp_ = .FALSE. tfor_ = .TRUE. tdampions_ = .TRUE. fricp_ = ion_damping tconvthrs%ekin = ekin_conv_thr tconvthrs%derho = etot_conv_thr tconvthrs%force = forc_conv_thr tconvthrs%active = .TRUE. tconvthrs%nstep = 1 CASE ('none', 'default') tsdp_ = .FALSE. tfor_ = .FALSE. fricp_ = 0.d0 CASE DEFAULT CALL errore(' control_flags ',' unknown ion_dynamics '//TRIM(ion_dynamics), 1 ) END SELECT ! ... Ionic Temperature tcp_ = .FALSE. tnosep_ = .FALSE. tolp_ = tolp SELECT CASE ( TRIM(ion_temperature) ) ! temperature control of ions via Nose' thermostat CASE ('nose') tnosep_ = .TRUE. tcp_ = .false. CASE ('not_controlled', 'default') tnosep_ = .FALSE. tcp_ = .false. CASE ('rescaling' ) tnosep_ = .FALSE. tcp_ = .true. CASE DEFAULT CALL errore(' control_flags ',' unknown ion_temperature '//TRIM(ion_temperature), 1 ) END SELECT ! ... Starting/Restarting ionic velocities tcap_ = .FALSE. SELECT CASE ( TRIM(ion_velocities) ) CASE ('default') tzerop_ = .FALSE. tv0rd_ = .FALSE. tcap_ = .false. CASE ('zero') tzerop_ = .TRUE. tv0rd_ = .FALSE. CASE ('from_input') tzerop_ = .TRUE. tv0rd_ = .TRUE. CASE ('random') tcap_ = .true. IF( program_name == 'FPMD' ) & WRITE(stdout) " ion_velocities = '//TRIM(ion_velocities)//' has no effects " CASE DEFAULT CALL errore(' control_flags ',' unknown ion_velocities '//TRIM(ion_velocities), 1 ) END SELECT ! ... Ionic randomization tranp_ ( 1 : ntyp ) = tranp ( 1 : ntyp ) amprp_ ( 1 : ntyp ) = amprp ( 1 : ntyp ) ! ... Ionic/electronic step ratio tionstep_ = .FALSE. nstepe_ = 1 IF( ( ion_nstepe > 1 ) .OR. ( cell_nstepe > 1 ) ) THEN ! This card is used to control the ionic step, when active ionic step are ! allowed only when the two criteria are met, i.e. the ions are allowed ! to move if MOD( NFI, NSTEP ) == 0 and EKIN < EKIN_THR . tionstep_ = .TRUE. nstepe_ = MAX( ion_nstepe, cell_nstepe ) IF( program_name == 'CP90' ) & WRITE(stdout) " ion_nstepe or cell_nstepe have no effects " END IF ! Cell dynamics SELECT CASE ( TRIM(cell_dynamics) ) CASE ('sd') tpre_ = .TRUE. thdyn_ = .TRUE. tsdc_ = .TRUE. frich_= 0.d0 CASE ( 'damp', 'damp-pr' ) thdyn_ = .TRUE. tsdc_ = .FALSE. frich_ = cell_damping tpre_ = .TRUE. CASE ('pr') thdyn_ = .TRUE. tsdc_ = .FALSE. tpre_ = .TRUE. frich_= 0.d0 CASE ('none', 'default') thdyn_ = .FALSE. tsdc_ = .FALSE. frich_= 0.d0 CASE DEFAULT CALL errore(' control_flags ',' unknown cell_dynamics '//TRIM(cell_dynamics), 1 ) END SELECT ! ... Starting/Restarting Cell parameters SELECT CASE ( TRIM(cell_parameters) ) CASE ('default') tbeg_ = .FALSE. CASE ('from_input') tbeg_ = .TRUE. IF( program_name == 'CP90' .AND. force_pairing_) & WRITE(stdout) " cell_parameters have no effects " CASE DEFAULT CALL errore(' control_flags ',' unknown cell_parameters '//TRIM(cell_parameters), 1 ) END SELECT ! ... Cell initial velocities SELECT CASE ( TRIM(cell_velocities) ) CASE ('default') tzeroc_ = .FALSE. CASE ('zero') tzeroc_ = .TRUE. CASE DEFAULT CALL errore(' control_flags ',' unknown cell_velocities '//TRIM(cell_velocities), 1 ) END SELECT ! ... Cell Temperature SELECT CASE ( TRIM(cell_temperature) ) ! cell temperature control of ions via Nose' thermostat CASE ('nose') tnoseh_ = .TRUE. CASE ('not_controlled', 'default') tnoseh_ = .FALSE. CASE DEFAULT CALL errore(' control_flags ',' unknown cell_temperature '//TRIM(cell_temperature), 1 ) END SELECT ! .. If only electron are allowed to move ! .. check for SCF convergence on the ground state IF( ion_dynamics == 'none' .AND. cell_dynamics == 'none' ) THEN tconvthrs%ekin = ekin_conv_thr tconvthrs%derho = etot_conv_thr tconvthrs%force = 10d+10 tconvthrs%active = .TRUE. tconvthrs%nstep = 1 END IF ! force pairing force_pairing_ = force_pairing IF( program_name == 'CP90' .AND. force_pairing_) & WRITE(stdout) " force_pairing have no effects " ! . Set internal flags according to the input .......................! ! ... the 'ATOMIC_SPECIES' card must be present, check it IF( .NOT. taspc ) & CALL errore(' iosys ',' ATOMIC_SPECIES not found in stdin ',1) ! ... the 'ATOMIC_POSITIONS' card must be present, check it IF( .NOT. tapos ) & CALL errore(' iosys ',' ATOMIC_POSITIONS not found in stdin ',1) IF( .NOT. trd_ht .AND. TRIM(cell_parameters)=='from_input' ) & CALL errore(' iosys ',' CELL_PARAMETERS not present in stdin ', 1 ) IF( .NOT. trd_ht .AND. ibrav == 0 ) & CALL errore(' iosys ',' ibrav = 0 but CELL_PARAMETERS not present in stdin ', 1 ) IF( .NOT. tavel .AND. TRIM(ion_velocities)=='from_input' ) & CALL errore(' iosys ',' ION_VELOCITIES not present in stdin ', 1 ) IF( TRIM(electron_dynamics) /= 'diis' .AND. TRIM(orthogonalization) /= 'ortho' ) THEN IF( emass_cutoff < ecutwfc ) & CALL errore(' IOSYS ', ' FOURIER ACCELERATION WITHOUT ORTHO',0) END IF IF( ( TRIM( calculation ) == 'smd' ) .AND. ( TRIM( cell_dynamics ) /= 'none' ) ) THEN CALL errore(' smiosys ',' cell_dynamics not implemented : '//trim(cell_dynamics), 1 ) END IF RETURN END SUBROUTINE set_control_flags ! ! ! ---------------------------------------------- ! ! ! ! modules setup ( copy-in variables ) ! ! ! ! ---------------------------------------------- ! ! SUBROUTINE modules_setup( ) ! USE control_flags, ONLY: lneb, program_name, lconstrain USE constants, ONLY: UMA_AU, pi USE input_parameters, ONLY: max_seconds, ibrav , celldm , trd_ht, dt, & cell_symmetry, rd_ht, a, b, c, cosab, cosac, cosbc, ntyp , nat , & na_inp , sp_pos , rd_pos , rd_vel, atom_mass, atom_label, if_pos, & atomic_positions, id_loc, sic, sic_epsilon, sic_rloc, ecutwfc, & ecutrho, ecfixed, qcutz, q2sigma, tk_inp, wmass, & ion_radius, emass, emass_cutoff, temph, fnoseh, nr1b, nr2b, nr3b, & tempw, fnosep, nr1, nr2, nr3, nr1s, nr2s, nr3s, ekincw, fnosee, & tturbo_inp, nturbo_inp, outdir, prefix, woptical, & noptical, boptical, k_points, nkstot, nk1, nk2, nk3, k1, k2, k3, & xk, wk, occupations, n_inner, fermi_energy, rotmass, occmass, & rotation_damping, occupation_damping, occupation_dynamics, & rotation_dynamics, degauss, smearing, nhpcl, ndega USE input_parameters, ONLY: diis_achmix, diis_ethr, diis_wthr, diis_delt, & diis_nreset, diis_temp, diis_nrot, diis_maxstep, diis_fthr, & diis_size, diis_hcut, diis_rothr, diis_chguess, diis_g0chmix, & diis_nchmix, diis_g1chmix, empty_states_maxstep, empty_states_delt, & empty_states_emass, empty_states_ethr, empty_states_nbnd, & tprnks_empty, vhrmax_inp, vhnr_inp, vhiunit_inp, vhrmin_inp, & tvhmean_inp, vhasse_inp, constr_target, constr_target_set, & constr_inp, nconstr_inp, constr_tol_inp, constr_type_inp, iesr_inp, & etot_conv_thr, ekin_conv_thr, nspin, f_inp, nelup, neldw, nbnd, & nelec, tprnks, ks_path, press, & cell_damping, cell_dofree, tf_inp, tpstab_inp, pstab_size_inp, & greash, grease, greasp, epol, efield, tcg, maxiter, etresh, passop USE input_parameters, ONLY : nconstr_inp ! USE check_stop, ONLY: check_stop_init ! ! USE ions_base, ONLY: tau, ityp USE cell_base, ONLY: cell_base_init, a1, a2, a3, cell_alat USE cell_nose, ONLY: cell_nose_init USE ions_base, ONLY: ions_base_init, greasp_ => greasp USE sic_module, ONLY: sic_initval USE ions_nose, ONLY: ions_nose_init USE wave_base, ONLY: grease_ => grease USE electrons_nose, ONLY: electrons_nose_init USE printout_base, ONLY: printout_base_init USE turbo, ONLY: turbo_init USE efield_module, ONLY: efield_init USE cg_module, ONLY: cg_init ! USE reciprocal_space_mesh, ONLY: recvecs_units ! USE smallbox_grid_dimensions, ONLY: & nnrbx, & ! variable is used to workaround internal compiler error (IBM xlf) nr1b_ => nr1b, & nr2b_ => nr2b, & nr3b_ => nr3b USE grid_dimensions, ONLY: & nnrx, & ! variable is used to workaround internal compiler error (IBM xlf) nr1_ => nr1, & nr2_ => nr2, & nr3_ => nr3 USE smooth_grid_dimensions, ONLY: & nnrsx, & ! variable is used to workaround internal compiler error (IBM xlf) nr1s_ => nr1s, & nr2s_ => nr2s, & nr3s_ => nr3s ! USE brillouin, ONLY: kpoint_setup USE optical_properties, ONLY: optical_setup USE pseudopotential, ONLY: pseudopotential_setup USE guess, ONLY: guess_setup USE empty_states, ONLY: empty_init USE diis, ONLY: diis_setup USE charge_mix, ONLY: charge_mix_setup USE potentials, ONLY: potential_init USE kohn_sham_states, ONLY: ks_states_init USE electrons_module, ONLY: electrons_setup USE electrons_base, ONLY: electrons_base_initval USE ensemble_dft, ONLY: ensemble_initval ! USE constraints_module, ONLY : init_constraint USE basic_algebra_routines, ONLY : norm ! ! IMPLICIT NONE REAL(dbl) :: alat_ , massa_totale REAL(dbl) :: delt_emp_inp, emass_emp_inp, ethr_emp_inp ! ... DIIS REAL(dbl) :: tol_diis_inp, delt_diis_inp, tolene_inp LOGICAL :: o_diis_inp, oqnr_diis_inp INTEGER :: ia LOGICAL :: ltest ! ! Subroutine Body ! IF( .NOT. has_been_read ) & CALL errore( ' modules_setup ', ' input file has not been read yet! ', 1 ) ! ! IF( .NOT. lneb ) THEN CALL check_stop_init( max_seconds ) END IF ! ... Set cell base module IF( .not. lneb ) THEN massa_totale = SUM( atom_mass(1:ntyp)*na_inp(1:ntyp) ) CALL cell_base_init( ibrav , celldm , trd_ht, cell_symmetry, rd_ht, & a, b, c, cosab, cosac, cosbc , wmass , massa_totale , press , & cell_damping, greash , cell_dofree ) END IF alat_ = cell_alat() ! ... Set ions base module if( .not. lneb ) then CALL ions_base_init( ntyp , nat , na_inp , sp_pos , rd_pos , rd_vel, atom_mass, & atom_label, if_pos, atomic_positions , alat_ , a1, a2, a3, ion_radius ) end if ! ... Set units for Reciprocal vectors ( 2PI/alat by convention ) CALL recvecs_units( alat_ ) ! ... Set Values for the cutoff CALL ecutoffs_setup( ecutwfc, ecutrho, ecfixed, qcutz, q2sigma ) CALL gcutoffs_setup( alat_ , tk_inp, nkstot, xk ) ! ... grease_ = grease greasp_ = greasp ! set thermostat parameter for cell, ions and electrons CALL cell_nose_init( temph, fnoseh ) CALL ions_nose_init( tempw, fnosep, nhpcl, ndega, nat ) CALL electrons_nose_init( ekincw , fnosee ) ! set box grid module variables nr1b_ = nr1b nr2b_ = nr2b nr3b_ = nr3b ! set size for potentials and charge density ! (re-calculated automatically) nr1_ = nr1 nr2_ = nr2 nr3_ = nr3 ! set size for wavefunctions ! (re-calculated automatically) nr1s_ = nr1s nr2s_ = nr2s nr3s_ = nr3s CALL turbo_init( tturbo_inp, nturbo_inp ) CALL printout_base_init( outdir, prefix ) IF( noptical > 0 ) then CALL optical_setup( woptical, noptical, boptical ) END IF CALL kpoint_setup( k_points, nkstot, nk1, nk2, nk3, k1, k2, k3, xk, wk ) CALL efield_init( epol, efield ) CALL cg_init( tcg , maxiter , etresh , passop ) ! CALL sic_initval( nat, id_loc, sic, sic_epsilon, sic_rloc ) ! ! empty states ! delt_emp_inp = dt ethr_emp_inp = ekin_conv_thr IF( empty_states_delt > 0.d0 ) delt_emp_inp = empty_states_delt IF( empty_states_ethr > 0.d0 ) ethr_emp_inp = empty_states_ethr CALL empty_init( empty_states_maxstep, delt_emp_inp, ethr_emp_inp ) ! CALL potential_init( tvhmean_inp,vhnr_inp, vhiunit_inp, & vhrmin_inp, vhrmax_inp, vhasse_inp, iesr_inp) CALL ks_states_init( nspin, tprnks, tprnks_empty ) CALL electrons_base_initval( nelec, nelup, neldw, nbnd, nspin, occupations, f_inp ) CALL electrons_setup( empty_states_nbnd, emass, emass_cutoff, nkstot ) CALL ensemble_initval & ( occupations, n_inner, fermi_energy, rotmass, occmass, rotation_damping, & occupation_damping, occupation_dynamics, rotation_dynamics, degauss, smearing ) ! ! ... variables for constrained dynamics are set here ! lconstrain = ( nconstr_inp > 0 ) ! IF ( lconstrain ) CALL init_constraint( nat, tau, 1.D0, ityp, if_pos ) ! IF( program_name == 'FPMD' ) THEN CALL pseudopotential_setup( ntyp, tpstab_inp, pstab_size_inp ) ! o_diis_inp = .TRUE. oqnr_diis_inp = .TRUE. tolene_inp = etot_conv_thr tol_diis_inp = ekin_conv_thr delt_diis_inp = dt IF( diis_ethr > 0.0d0 ) tolene_inp = diis_ethr IF( diis_wthr > 0.0d0 ) tol_diis_inp = diis_wthr IF( diis_delt > 0.0d0 ) delt_diis_inp = diis_delt CALL diis_setup( diis_fthr, oqnr_diis_inp, o_diis_inp, & diis_size, diis_hcut, tol_diis_inp, diis_maxstep, diis_nreset, delt_diis_inp, & diis_temp, diis_nrot(1), diis_nrot(2), diis_nrot(3), & diis_rothr(1), diis_rothr(2), diis_rothr(3), tolene_inp) CALL guess_setup( diis_chguess ) CALL charge_mix_setup(diis_achmix, diis_g0chmix, diis_nchmix, diis_g1chmix) END IF ! RETURN ! END SUBROUTINE modules_setup ! ! ! ! ------------------------------------------------------------------- ! ! SUBROUTINE smd_initvar( ) ! this subroutine copies SMD variables from input module to path_variables ! ------------------------------------------------------------------- USE input_parameters, only: calculation, & smd_polm, smd_kwnp, smd_linr, smd_stcd, smd_stcd1, smd_stcd2, smd_stcd3, smd_codf, & smd_forf, smd_smwf, smd_lmfreq, smd_tol, smd_maxlm, smd_smcp, smd_smopt, smd_smlm, & num_of_images, smd_ene_ini, smd_ene_fin USE path_variables, ONLY: & sm_p_ => smd_p, & smcp_ => smd_cp, & smlm_ => smd_lm, & smopt_ => smd_opt, & linr_ => smd_linr, & polm_ => smd_polm, & kwnp_ => smd_kwnp, & codfreq_ => smd_codfreq, & forfreq_ => smd_forfreq, & smwfreq_ => smd_wfreq, & tol_ => smd_tol, & lmfreq_ => smd_lmfreq, & maxlm_ => smd_maxlm, & ene_ini_ => smd_ene_ini, & ene_fin_ => smd_ene_fin USE ions_base, ONLY: nat, nsp, tions_base_init USE control_flags, ONLY: nbeg USE cell_base, ONLY: cell_alat ! implicit none ! real(dbl) :: alat_ ! IF( .NOT. tions_base_init ) & CALL errore( " smd_initvar ", " ions_base_init should be called first ", 1 ) ! alat_ = cell_alat() ! ! ... SM_P ! sm_p_ = num_of_images -1 ! ! ... what to do ! smcp_ = smd_smcp smopt_ = smd_smopt smlm_ = smd_smlm ! ! ... initial path info ! linr_ = smd_linr polm_ = smd_polm kwnp_ = smd_kwnp ! ! ... Frequencey of wiriting ! codfreq_ = smd_codf forfreq_ = smd_forf smwfreq_ = smd_smwf ! ! ... Lagrange multiplier info. ! lmfreq_ = smd_lmfreq tol_ = smd_tol maxlm_ = smd_maxlm ! ! ... if smlm ! IF( smd_smlm .AND. ( smd_ene_ini >= 0.d0 .OR. smd_ene_fin >= 0.d0 ) ) THEN CALL errore(' start : ',' Check : ene_ini & ene_fin ', 1 ) END IF ! ene_ini_ = smd_ene_ini ene_fin_ = smd_ene_fin ! ! IF( TRIM( calculation ) == 'smd' ) THEN ! ! How to obtain the initial trial path. ! IF(smd_smopt) THEN CALL init_path(sm_p_,kwnp_,smd_stcd,nsp,nat,alat_,nbeg,1) ELSEIF(smd_linr) THEN CALL init_path(sm_p_,kwnp_,smd_stcd,nsp,nat,alat_,nbeg,2) ELSEIF(smd_polm .AND. (smd_kwnp < num_of_images) ) THEN CALL init_path(sm_p_,kwnp_,smd_stcd,nsp,nat,alat_,nbeg,3) ELSEIF(smd_kwnp == num_of_images ) THEN CALL init_path(sm_p_,kwnp_,smd_stcd,nsp,nat,alat_,nbeg,4) ENDIF END IF ! RETURN END SUBROUTINE smd_initvar ! ! ! -------------------------------------------------------- ! ! print out heading ! ! ! SUBROUTINE input_info() ! this subroutine print to standard output some parameters read from input ! ---------------------------------------------- USE input_parameters, ONLY: restart_mode USE control_flags, ONLY: nbeg, iprint, ndr, ndw, nomore USE time_step, ONLY: delt USE cp_electronic_mass, ONLY: emass, emass_cutoff IMPLICIT NONE IF( .NOT. has_been_read ) & CALL errore( ' iosys ', ' input file has not been read yet! ', 1 ) IF( ionode ) THEN WRITE( stdout, 500) nbeg, restart_mode, nomore, iprint, ndr, ndw WRITE( stdout, 505) delt WRITE( stdout, 510) emass WRITE( stdout, 511) emass_cutoff END IF 500 FORMAT( 3X,'Restart Mode = ',I7, 3X, A15, /, & 3X,'Number of MD Steps = ',I7, /, & 3X,'Print out every ',I7, ' MD Steps',/ & 3X,'Reads from unit = ',I7, /, & 3X,'Writes to unit = ',I7) 505 FORMAT( 3X,'MD Simulation time step = ',F10.2) 510 FORMAT( 3X,'Electronic fictitious mass (emass) = ',F10.2) 511 FORMAT( 3X,'emass cut-off = ',F10.2) 509 FORMAT( 3X,'Verlet algorithm for electron dynamics') 502 FORMAT( 3X,'An initial quench is performed') RETURN END SUBROUTINE input_info ! ! ! ---------------------------------------------------------------- ! ! SUBROUTINE modules_info() USE input_parameters, ONLY: electron_dynamics, electron_temperature, & orthogonalization USE control_flags, ONLY: program_name, tortho, tnosee, trane, ampre, & trhor, trhow, tvlocw, tfor, tnosep, iprsta, & thdyn, tnoseh ! USE electrons_nose, ONLY: electrons_nose_info USE empty_states, ONLY: empty_print_info USE diis, ONLY: diis_print_info USE potentials, ONLY: potential_print_info USE brillouin, ONLY: kpoint_info USE runcg_module, ONLY: runcg_info USE sic_module, ONLY: sic_info USE wave_base, ONLY: frice, grease USE ions_base, ONLY: fricp USE ions_nose, ONLY: ions_nose_info USE cell_nose, ONLY: cell_nose_info USE cell_base, ONLY: frich ! IMPLICIT NONE INTEGER :: is IF( .NOT. has_been_read ) & CALL errore( ' iosys ', ' input file has not been read yet! ', 1 ) IF( ionode ) THEN ! CALL cutoffs_print_info( ) ! IF( tortho ) THEN CALL orthogonalize_info( ) ELSE WRITE( stdout,512) END IF ! IF( TRIM(electron_dynamics) == 'diis' ) THEN CALL diis_print_info( stdout ) ELSE IF( TRIM(electron_dynamics) == 'cg' ) THEN CALL runcg_info( stdout ) ELSE IF( TRIM(electron_dynamics) == 'sd' ) THEN WRITE( stdout,513) ELSE IF( TRIM(electron_dynamics) == 'verlet' ) THEN WRITE( stdout,510) frice = 0. ELSE IF( TRIM(electron_dynamics) == 'damp' ) THEN tnosee = .false. WRITE( stdout,509) WRITE( stdout,514) frice, grease ELSE CALL errore(' input_info ', ' unknown electron dynamics ', 1 ) END IF ! IF( tnosee ) THEN WRITE( stdout,590) CALL electrons_nose_info() ELSE WRITE( stdout,535) END IF ! if( trane ) then WRITE( stdout,515) ampre endif ! CALL electrons_print_info( ) ! CALL exch_corr_print_info( ) if ( trhor ) then WRITE( stdout,720) endif if( .not. trhor .and. trhow )then WRITE( stdout,721) endif if( tvlocw )then WRITE( stdout,722) endif ! IF( program_name == 'FPMD' ) THEN CALL empty_print_info( stdout ) CALL kpoint_info( stdout ) END IF ! if( tfor .AND. tnosep ) fricp = 0.0d0 ! CALL ions_print_info( ) ! if( tfor .AND. tnosep ) CALL ions_nose_info() ! if( thdyn .AND. tnoseh ) frich = 0.0d0 ! CALL cell_print_info( ) ! if( thdyn .AND. tnoseh ) CALL cell_nose_info() ! IF( program_name == 'FPMD' ) THEN CALL potential_print_info( stdout ) CALL sic_info( ) END IF ! WRITE( stdout,700) iprsta END IF RETURN 509 FORMAT( 3X,'verlet algorithm for electron dynamics') 510 FORMAT( 3X,'Electron dynamics with newton equations') 512 FORMAT( 3X,'Orthog. with Gram-Schmidt') 513 FORMAT( 3X,'Electron dynamics with steepest descent') 514 format( 3X,'with friction frice = ',f7.4,' , grease = ',f7.4) 515 format( 3X,'initial random displacement of el. coordinates with ', & & ' amplitude=',f10.6,/, & & 3X,'trane not to be used with mass preconditioning') 535 FORMAT( 3X,'Electron dynamics : the temperature is not controlled') 540 FORMAT( 3X,'Electron dynamics with rescaling of velocities :',/ & ,3X,'Average kinetic energy required = ',F11.6,'(A.U.)' & ,'Tolerance = ',F11.6) 545 FORMAT( 3X,'Electron dynamics with canonical temp. control : ',/ & ,3X,'Average kinetic energy required = ',F11.6,'(A.U.)' & ,'Tolerance = ',F11.6) 550 format(' ion dynamics: the temperature is not controlled'//) 555 format(' ion dynamics with rescaling of velocities:'/ & & ' temperature required=',f10.5,'(kelvin)',' tolerance=', & & f10.5//) 560 format(' ion dynamics with canonical temp. control:'/ & & ' temperature required=',f10.5,'(kelvin)',' tolerance=', & & f10.5//) 562 format(' ion dynamics with nose` temp. control:'/ & & ' temperature required=',f10.5,'(kelvin)',' nose` mass = ',& & f10.3//) 563 format(' ion dynamics with nose` temp. control:'/ & & ' temperature required=',f10.5,'(kelvin)'/ & & ' NH chain length= ',i3,' active degrees of freedom=',i3,/ & & ' nose` mass(es) =',20(1X,f10.3)//) 566 format(' electronic dynamics with nose` temp. control:'/ & & ' elec. kin. en. required=',f10.5,'(hartree)', & & ' nose` mass = ',f10.3//) 580 FORMAT( 3X,'Nstepe = ',I3 & ,' purely electronic steepest descent steps',/ & ,3X,'are performed for every ionic step in the program') 590 FORMAT( 3X,'Electron temperature control via nose thermostat') ! 700 format( /,3X, 'Verbosity: iprsta = ',i2,/) 720 format( 3X, 'charge density is read from unit 47') 721 format( 3X, 'charge density is written in unit 47') 722 format( 3X, 'local potential is written in unit 46') END SUBROUTINE modules_info ! ---------------------------------------------------------------- END MODULE input ! ----------------------------------------------------------------