! ! Copyright (C) 2002-2005 Quantum-ESPRESSO group ! 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: DP ! 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 PUBLIC :: modules_setup, set_control_flags ! LOGICAL :: has_been_read = .FALSE. ! CONTAINS ! !------------------------------------------------------------------------- SUBROUTINE read_input_file() !------------------------------------------------------------------------- ! USE read_namelists_module, ONLY : read_namelists USE read_cards_module, ONLY : read_cards USE input_parameters, ONLY : calculation, title USE control_flags, ONLY : lneb, lsmd, lpath, lwf, lmetadyn, & program_name USE printout_base, ONLY : title_ => title USE io_global, ONLY : meta_ionode, stdout ! IMPLICIT NONE ! CHARACTER(LEN=2) :: prog ! ! prog = 'CP' ! IF ( meta_ionode ) CALL input_from_file() ! ! ... Read NAMELISTS ! CALL read_namelists( prog ) ! ! ... Read CARDS ! CALL read_cards( prog ) ! IF( TRIM( calculation ) == 'fpmd' ) program_name = 'FPMD' ! IF( TRIM( calculation ) == 'fpmd-neb' ) THEN ! program_name = 'FPMD' lneb = .TRUE. ! ELSE ! lneb = ( TRIM( calculation ) == 'neb' ) ! END IF ! lsmd = ( TRIM( calculation ) == 'smd' ) ! lpath = ( lneb .OR. lsmd ) ! lmetadyn = ( TRIM( calculation ) == 'metadyn' ) ! lwf = ( TRIM( calculation ) == 'cp-wf' ) ! ! ... Set job title and print it on standard output ! title_ = title ! WRITE( stdout, '(/,3X,"Job Title: ",A )' ) TRIM( title_ ) ! 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, outdir, 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, & outdir_ => outdir, & 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 ) outdir_ = TRIM( outdir ) ! ! ... 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, & lsmd, lconstrain, lmetadyn USE io_global, ONLY : meta_ionode, stdout USE ions_base, ONLY : nat, tau, ityp USE constraints_module, ONLY : init_constraint USE metadyn_vars, ONLY : init_metadyn_vars ! IMPLICIT NONE ! ! IF ( meta_ionode ) THEN ! WRITE( UNIT = 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() ! IF ( lconstrain ) CALL init_constraint( nat, tau, ityp, 1.D0 ) ! IF ( lmetadyn ) CALL init_metadyn_vars() ! ! ... initialize SMD variables and path ! IF ( lsmd ) CALL smd_initvar() ! ! ... fix values for dependencies ! IF ( program_name == 'FPMD' ) CALL fix_dependencies() ! ! ... write to stdout input module information ! CALL modules_info() ! RETURN ! END SUBROUTINE iosys ! !------------------------------------------------------------------------- SUBROUTINE set_control_flags() !------------------------------------------------------------------------- ! USE io_global, ONLY : stdout USE autopilot, ONLY : auto_check USE autopilot, ONLY : restart_p USE control_flags, ONLY : lcoarsegrained, ldamped, lmetadyn 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, & 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, & nstep_ => nstep, & reduce_io_ => reduce_io 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, & lfixatom, tconvthrs, tconjgrad_ion USE control_flags, ONLY : tnosep_ => tnosep, & tcap_ => tcap, & tcp_ => tcp, & tolp_ => tolp, & tzerop_ => tzerop, & tv0rd_ => tv0rd, & tranp_ => tranp, & amprp_ => amprp, & dt_old_ => dt_old 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 USE control_flags, ONLY : remove_rigid_rot_ => remove_rigid_rot USE control_flags, ONLY : iesr, tvhmean, vhrmin, vhrmax, vhasse USE control_flags, ONLY : tprojwfc ! ! ... Other modules ! USE cp_main_variables, ONLY : nprint_nfi 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 efield_module, ONLY: tefield_ => tefield, & epol_ => epol, & efield_ => efield, & tefield2_ => tefield2, & epol2_ => epol2, & efield2_ => efield2 ! USE cvan, ONLY: nvb ! 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, & tcg, ndr, ndw, iprint, isave, tstress, k_points, tprnfor, verbosity, & tdipole_card, toptical_card, tnewnfi_card, newnfi_card, & ampre, nstep, restart_mode, ion_positions, startingwfc, printwfc, & orthogonalization, electron_velocities, nat, if_pos, phase_space, & tefield, epol, efield, tefield2, epol2, efield2, remove_rigid_rot, & iesr_inp, vhrmax_inp, vhrmin_inp, tvhmean_inp, vhasse_inp, saverho ! 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 iesr = iesr_inp ! tvhmean = tvhmean_inp vhrmin = vhrmin_inp vhrmax = vhrmax_inp vhasse = vhasse_inp ! remove_rigid_rot_ = remove_rigid_rot ! tefield_ = tefield epol_ = epol efield_ = efield tefield2_ = tefield2 epol2_ = epol2 efield2_ = efield2 ! ! ... 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 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' ) tvlocw_ = ( TRIM( disk_io ) == 'high' ) ! warning this is not working ! for now use reduce_io in CP to specify if the charge density is saved ! reduce_io_ = .NOT.( TRIM( disk_io ) == 'high' ) trhow_ = .NOT. reduce_io_ ! ! saverho overwrites disk_io ! IF( saverho ) trhow_ = .TRUE. ! SELECT CASE( TRIM( verbosity ) ) CASE( 'minimal' ) ! iprsta_ = 0 ! CASE( 'low', 'default' ) ! iprsta_ = 1 timing_ = .TRUE. ! CASE( 'default+projwfc' ) ! iprsta_ = 1 timing_ = .TRUE. tprojwfc = .TRUE. ! CASE( 'medium' ) ! iprsta_ = 2 timing_ = .TRUE. tprnsfac_ = .TRUE. ! CASE( 'high' ) ! iprsta_ = 3 memchk_ = .TRUE. timing_ = .TRUE. tprnsfac_ = .TRUE. tprojwfc = .TRUE. ! CASE DEFAULT ! CALL errore( 'control_flags ', & 'unknown verbosity ' // TRIM( verbosity ), 1 ) ! END SELECT ! tdipole_ = tdipole_card toptical_ = toptical_card newnfi_ = newnfi_card tnewnfi_ = tnewnfi_card ! ! ... set the restart flags ! trane_ = .FALSE. ampre_ = ampre taurdr_ = .FALSE. ! SELECT CASE ( TRIM( restart_mode ) ) ! CASE( 'from_scratch' ) ! nbeg_ = -1 nomore_ = nstep nstep_ = nstep trane_ = ( startingwfc == 'random' ) ! IF ( ampre_ == 0.D0 ) ampre_ = 0.02D0 ! CASE( 'reset_counters' ) ! nbeg_ = 0 nomore_ = nstep nstep_ = nstep ! CASE( 'restart' ) ! nbeg_ = 1 nomore_ = nstep nstep_ = nstep nprint_nfi = -2 ! CASE( 'auto' ) ! IF ( auto_check( ndr, ' ' ) ) THEN ! WRITE( stdout, '("autopilot: Auto Check detects restart.xml")' ) WRITE( stdout, '(" adjusting restart_mode to restart")' ) ! restart_mode = 'restart' ! nbeg_ = 1 ! ! ... Also handle NSTEPS adjustment so that ! ... nomore does not include past nfi in cpr.f90 ! restart_p = .TRUE. nomore_ = nstep nstep_ = nstep nprint_nfi = -2 ! IF ( ion_positions == 'from_input' ) THEN ! taurdr_ = .TRUE. nbeg_ = -1 ! END IF ! ELSE ! WRITE( stdout, & '("autopilot: Auto Check did not detect restart.xml")' ) ! WRITE( stdout, & '(" adjusting restart_mode to from_scratch")' ) ! restart_mode = 'from_scratch' ! nbeg_ = -2 ! IF ( ion_positions == 'from_input' ) nbeg_ = -1 ! nomore_ = nstep nstep_ = nstep ! trane_ = ( startingwfc == 'random' ) ! IF ( ampre_ == 0.d0 ) ampre_ = 0.02D0 ! END IF ! CASE DEFAULT ! CALL errore( 'iosys ', & 'unknown restart_mode ' // TRIM( restart_mode ), 1 ) ! END SELECT ! ! ... Starting/Restarting Atomic positions ! 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' ) & WRITE( stdout, & '("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. IF( program_name == 'CP90' ) THEN tcg = .TRUE. ELSE tconjgrad_ = .TRUE. ENDIF 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 SELECT CASE( TRIM( phase_space ) ) CASE( 'full' ) ! lcoarsegrained = .FALSE. ! CASE ( 'coarse-grained' ) ! lcoarsegrained = .TRUE. ! END SELECT ! IF ( lmetadyn ) lcoarsegrained = .TRUE. ! ... 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') ldamped = .TRUE. 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 IF ( ANY( if_pos(:,1:nat) == 0 ) ) lfixatom = .TRUE. ! ... 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 ('change_step') tzerop_ = .FALSE. tv0rd_ = .FALSE. tcap_ = .FALSE. dt_old_ = tolp 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 = 1.D+10 tconvthrs%active = .TRUE. tconvthrs%nstep = 1 END IF ! force pairing force_pairing_ = force_pairing ! IF( ( nvb > 0 ) .and. ( program_name == 'FPMD' ) ) & CALL errore(' iosys ',' USPP not yet implemented in FPMD ',1) ! ... 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 IF( toptical_ ) & CALL errore(' iosys ',' Optical properties not implemented yet ',1) RETURN END SUBROUTINE set_control_flags ! !------------------------------------------------------------------------- SUBROUTINE modules_setup() !------------------------------------------------------------------------- ! USE control_flags, ONLY : program_name, lconstrain, lneb, lmetadyn, & tpre, thdyn USE constants, ONLY : amu_au, pi ! USE input_parameters, ONLY: 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, nhptyp, ndega, & nhgrp, cell_units, restart_mode, sic_alpha 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_ethr, empty_states_nbnd, & iprnks_empty, nconstr_inp, iprnks, nprnks, & etot_conv_thr, ekin_conv_thr, nspin, f_inp, nelup, neldw, nbnd, & nelec, press, cell_damping, cell_dofree, tf_inp, nprnks_empty, & refg, greash, grease, greasp, epol, efield, tcg, maxiter, conv_thr, & passop, tot_charge, multiplicity, tot_magnetization, ncolvar_inp ! USE input_parameters, ONLY : wf_efield, wf_switch, sw_len, efx0, efy0, & efz0, efx1, efy1, efz1, wfsd, wfdt, maxwfdt, & wf_q, wf_friction, nit, nsd, nsteps, tolw, & adapt, calwf, nwf, wffort, writev, & wannier_index ! USE ions_base, ONLY : tau, ityp, zv 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 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 guess, ONLY : guess_setup USE diis, ONLY : diis_setup USE charge_mix, ONLY : charge_mix_setup USE kohn_sham_states, ONLY : ks_states_init USE electrons_module, ONLY : electrons_setup, empty_init USE electrons_base, ONLY : electrons_base_initval USE ensemble_dft, ONLY : ensemble_initval,tens USE wannier_base, ONLY : wannier_init USE efield_module, ONLY : tefield ! IMPLICIT NONE ! REAL(DP) :: alat_ , massa_totale REAL(DP) :: ethr_emp_inp ! ... DIIS REAL(DP) :: 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 ) ! ! ... Set cell base module ! massa_totale = SUM( atom_mass(1:ntyp)*na_inp(1:ntyp) ) ! CALL cell_base_init( ibrav , celldm , trd_ht, cell_symmetry, rd_ht, & cell_units, a, b, c, cosab, cosac, cosbc , wmass, & massa_totale, press, cell_damping, greash, & cell_dofree ) ! alat_ = cell_alat() ! ... Set ions base module 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 ) ! ... Set Values for the cutoff CALL ecutoffs_setup( ecutwfc, ecutrho, ecfixed, qcutz, q2sigma, refg ) 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, nhptyp, ndega, nhgrp) ! 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 ) IF ( .NOT. lneb ) & CALL printout_base_init( outdir, prefix ) CALL efield_init( epol, efield ) CALL cg_init( tcg , maxiter , conv_thr , passop ) ! IF( ( TRIM( sic ) /= 'none' ) .and. ( tpre .or. thdyn ) ) & CALL errore( ' module setup ', ' Stress is not yet implemented with SIC ', 1 ) ! CALL sic_initval( nat, id_loc, sic, sic_epsilon, sic_alpha, sic_rloc ) ! ! empty states ! ethr_emp_inp = ekin_conv_thr IF( empty_states_ethr > 0.d0 ) ethr_emp_inp = empty_states_ethr CALL empty_init( empty_states_maxstep, ethr_emp_inp ) ! CALL ks_states_init( nspin, nprnks, iprnks, nprnks_empty, iprnks_empty ) CALL electrons_base_initval( zv, na_inp, ntyp, nelec, nelup, & neldw, nbnd, nspin, occupations, f_inp, & tot_charge, multiplicity, tot_magnetization ) CALL electrons_setup( empty_states_nbnd, emass, emass_cutoff ) CALL ensemble_initval( occupations, n_inner, fermi_energy, rotmass, & occmass, rotation_damping, occupation_damping, & occupation_dynamics, rotation_dynamics, degauss, & smearing ) IF( ( program_name == 'CP90' ) .AND. .NOT.tcg .AND. tens ) & CALL errore(' modules_setup ', 'Ensemble DFT implemented only with CG ', 1 ) ! ! ... variables for constrained dynamics are set here ! lconstrain = ( ncolvar_inp + nconstr_inp > 0 ) ! ! IF( program_name == 'FPMD' ) THEN ! 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.D0 ) tolene_inp = diis_ethr IF ( diis_wthr > 0.D0 ) tol_diis_inp = diis_wthr IF ( diis_delt > 0.D0 ) 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 ! CALL wannier_init( wf_efield, wf_switch, sw_len, efx0, efy0, efz0, & efx1, efy1, efz1, wfsd, wfdt, maxwfdt, wf_q, & wf_friction, nit, nsd, nsteps, tolw, adapt, & calwf, nwf, wffort, writev, wannier_index, & restart_mode ) ! 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(DP) :: 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 USE io_global, ONLY: meta_ionode, stdout IMPLICIT NONE IF( .NOT. has_been_read ) & CALL errore( ' iosys ', ' input file has not been read yet! ', 1 ) IF( meta_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, tvlocw, tfor, tnosep, iprsta, & thdyn, tnoseh ! USE electrons_nose, ONLY: electrons_nose_info USE electrons_module, ONLY: empty_print_info USE diis, ONLY: diis_print_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 USE efield_module, ONLY: tefield, efield_info, tefield2, efield_info2 USE io_global, ONLY: meta_ionode, stdout ! ! IMPLICIT NONE INTEGER :: is IF( .NOT. has_been_read ) & CALL errore( ' iosys ', ' input file has not been read yet! ', 1 ) IF( meta_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( tvlocw )THEN WRITE( stdout,722) ENDIF ! IF( program_name == 'FPMD' ) THEN CALL empty_print_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 ! IF(tefield) call efield_info( ) IF(tefield2) call efield_info2( ) 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) 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,'(HARTREE A.U.)', & 'Tolerance = ',F11.6) 545 FORMAT( 3X,'Electron dynamics with canonical temp. control : ',/, & 3X,'Average kinetic energy required = ',F11.6,'(HARTREE A.U.)', & 'Tolerance = ',F11.6) 550 FORMAT( 3X,'ion dynamics: the temperature is not controlled'//) 555 FORMAT( 3X,'ion dynamics with rescaling of velocities:'/ & ' temperature required=',f10.5,'(kelvin)',' tolerance=',F10.5//) 560 FORMAT( 3X,'ion dynamics with canonical temp. control:'/ & ' temperature required=',f10.5,'(kelvin)',' tolerance=',f10.5//) 562 FORMAT( 3X,'ion dynamics with nose` temp. control:'/ & ' temperature required=',f10.5,'(kelvin)',' nose` mass = ',& F10.3//) 563 FORMAT( 3X,'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( 3X,' 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 file') 722 FORMAT( 3X, 'warning tvlocw has no effect vloc is not written to file') ! END SUBROUTINE modules_info ! END MODULE input