00001 module m_rdinput
00002 implicit none
00003 private
00004 public::read_input
00005
00006
00007 integer,public::icell
00008 integer,public::n_occ
00009 integer,public::N_wannier
00010 integer,public::nigs
00011 integer,public::N_initial_guess
00012 real(8),public::EPS_SPILLAGE
00013 real(8),public::DAMP
00014 real(8),public::EPS_SPREAD
00015 real(8),public::MAX_STEP_LENGTH
00016 real(8),public::Lower_energy_window
00017 real(8),public::E_LOWER
00018 real(8),public::Upper_energy_window
00019 real(8),public::E_UPPER
00020 logical,public::set_inner_window
00021 real(8),public::Upper_inner_window
00022 real(8),public::E_UPPER_inner
00023 real(8),public::Lower_inner_window
00024 real(8),public::E_LOWER_inner
00025 integer,public::flg_BMAT
00026 integer,public::flg_initial_guess_direc
00027 real(8),public::electron_number_wannier_space
00028 real(8),public::elec_num
00029 integer,public::flg_fermisurface
00030 logical,public::CALC_FERMISURFACE
00031 integer,public::flg_global_dos
00032 logical,public::CALC_GLOBAL_DOS
00033 logical,public::flg_specify_energywindow
00034 logical,public::flg_specify_bandindices
00035 integer,public::bandindex_min
00036 integer,public::bandindex_max
00037
00038 integer,public::flg_vis_bloch
00039 logical,public::CALC_REAL_SPACE_BLOCH
00040 logical,public::CALC_BLOCH_VIS_RANGE
00041 real(8),public::calc_k(3)
00042 integer,public::reading_bmat_format
00043
00044
00045 integer,public::N_sym_points
00046 integer,public::Ndiv
00047 integer,public::reading_sk_format
00048
00049 integer,public::flg_vis_wannier
00050 logical,public::CALC_REAL_SPACE_WANNIER
00051 integer,public::N_write_wannier
00052 integer,public::ix_vis_min
00053 integer,public::ix_vis_max
00054 integer,public::iy_vis_min
00055 integer,public::iy_vis_max
00056 integer,public::iz_vis_min
00057 integer,public::iz_vis_max
00058 integer,public::xmin
00059 integer,public::xmax
00060 integer,public::ymin
00061 integer,public::ymax
00062 integer,public::zmin
00063 integer,public::zmax
00064 integer,public::dense(3)
00065
00066 type initial_guess
00067
00068 character(10)::orb
00069 real(8)::a,x,y,z
00070 real(8)::lx(3)
00071 real(8)::ly(3)
00072 real(8)::lz(3)
00073 complex(8)::s_up(2)
00074 complex(8)::s_dn(2)
00075 end type initial_guess
00076 type(initial_guess),public,allocatable::vec_ini(:)
00077
00078 real(8),public,allocatable::B_MAT(:,:)
00079
00080 real(8),public,allocatable::SK_sym_pts(:,:)
00081
00082 integer,public,allocatable::wrt_list(:)
00083
00084 namelist/param_wannier/icell,N_wannier,N_initial_guess,EPS_SPILLAGE,DAMP,EPS_SPREAD,MAX_STEP_LENGTH,&
00085 Lower_energy_window,Upper_energy_window,set_inner_window,Upper_inner_window,Lower_inner_window,flg_BMAT,&
00086 reading_bmat_format,flg_initial_guess_direc,flg_vis_bloch,calc_k,electron_number_wannier_space,&
00087 flg_fermisurface,flg_global_dos,&
00088 flg_specify_energywindow,flg_specify_bandindices,bandindex_min,bandindex_max
00089 namelist/param_interpolation/N_sym_points,Ndiv,reading_sk_format,dense
00090 namelist/param_visualization/flg_vis_wannier,N_write_wannier,&
00091 ix_vis_min,ix_vis_max,iy_vis_min,iy_vis_max,iz_vis_min,iz_vis_max
00092 contains
00093
00094 subroutine read_input
00095 integer::igs,ix,ik
00096
00097
00098
00099
00100 ICELL=0
00101 EPS_SPILLAGE=1.0d-4
00102 DAMP=0.1d0
00103 EPS_SPREAD=1.0d-4
00104 MAX_STEP_LENGTH=4.0d0
00105 SET_INNER_WINDOW=.FALSE.
00106 UPPER_INNER_WINDOW=0.0d0
00107 LOWER_INNER_WINDOW=0.0d0
00108 FLG_BMAT=0
00109 READING_BMAT_FORMAT=0
00110 FLG_INITIAL_GUESS_DIREC=0
00111 electron_number_wannier_space=0.0d0
00112 flg_fermisurface=0
00113 flg_global_dos=0
00114 flg_vis_bloch=0
00115 CALC_BLOCH_VIS_RANGE=.FALSE.
00116 calc_k(:)=0.0d0
00117 flg_specify_energywindow=.true.
00118 flg_specify_bandindices=.false.
00119 bandindex_min=0
00120 bandindex_max=0
00121
00122
00123
00124 read(5,nml=param_wannier)
00125
00126 n_occ=N_wannier
00127 nigs=N_initial_guess
00128 E_LOWER=Lower_energy_window
00129 E_UPPER=Upper_energy_window
00130 E_LOWER_inner=Lower_inner_window
00131 E_UPPER_inner=Upper_inner_window
00132 elec_num=electron_number_wannier_space
00133
00134
00135
00136 if((flg_specify_energywindow.and.flg_specify_bandindices).or.(.not.flg_specify_energywindow.and..not.flg_specify_bandindices))then
00137 write(6,'(2a)')"###ERROR : ","flg_specify_energywindow and flg_specify_bandindices have the same values. One should be .true., the other .false."
00138 stop
00139 endif
00140
00141
00142
00143
00144
00145
00146
00147
00148 if(flg_specify_energywindow.and.E_LOWER>=E_UPPER)then
00149 write(6,'(a)')'wrong input: energy windows; stop'
00150 write(6,'(a)')'Lower_energy_window >= Upper_energy_window: WRONG'
00151 write(6,'(a,2f20.9)')'Lower_energy_window, Upper_energy_window',Lower_energy_window,Upper_energy_window
00152 stop
00153 endif
00154
00155
00156
00157
00158 if(flg_specify_bandindices)then
00159 if(bandindex_min==0.or.bandindex_min==0.or.bandindex_min>bandindex_max)then
00160 write(6,'(2a)')"###ERROR : ","flg_specify_bandindices=true, but bandindex_min/bandindex_max not specified correctly"
00161 stop
00162 endif
00163 endif
00164
00165
00166
00167
00168 if(set_inner_window.and.E_UPPER_inner==0.0d0.and.E_LOWER_inner==0.0d0)then
00169 write(6,'(a)')'wrong input: inner energy windows; stop'
00170 write(6,'(a)')'Lower_inner_window = Upper_inner_window = 0.0d0: WRONG'
00171 write(6,'(a,2f20.9)')'Upper_inner_window,Lower_inner_window',Upper_inner_window,Lower_inner_window
00172 stop
00173 endif
00174
00175
00176 if(set_inner_window.and.flg_specify_energywindow)then
00177 if(E_LOWER_inner>=E_UPPER_inner)then
00178 write(6,'(a)')'wrong input: inner energy windows; stop'
00179 write(6,'(a)')'Lower_inner_window >= Upper_inner_window: WRONG'
00180 write(6,'(a,2f20.9)')'Lower_inner_window,Upper_inner_window',Lower_inner_window,Upper_inner_window
00181 stop
00182 endif
00183 if(E_UPPER<=E_UPPER_inner)then
00184 write(6,'(a)')'wrong input: inner energy windows; stop'
00185 write(6,'(a)')'Upper_energy_window <= Upper_inner_window: WRONG'
00186 write(6,'(a,2f20.9)')'Upper_energy_window,Upper_inner_window',Upper_energy_window,Upper_inner_window
00187 stop
00188 endif
00189 if(E_LOWER>=E_LOWER_inner)then
00190 write(6,'(a)')'wrong input: inner energy windows; stop'
00191 write(6,'(a)')'Lower_energy_window >= Lower_inner_window: WRONG'
00192 write(6,'(a,2f20.9)')'Lower_energy_window,Lower_inner_window',Lower_energy_window,Lower_inner_window
00193 stop
00194 endif
00195 endif
00196
00197
00198 allocate(vec_ini(nigs))
00199
00200 if(flg_initial_guess_direc==0)then
00201 write(6,*)'DIRECTION OF INITIAL GUESS IS REPRESENTED IN GLOBAL COORDINATE'
00202 do igs=1,nigs
00203
00204
00205 read(5,*)vec_ini(igs)%orb,vec_ini(igs)%a,vec_ini(igs)%x,vec_ini(igs)%y,vec_ini(igs)%z
00206 enddo
00207
00208
00209
00210 do igs=1,nigs
00211 vec_ini(igs)%lx(:)=0.0d0
00212 vec_ini(igs)%ly(:)=0.0d0
00213 vec_ini(igs)%lz(:)=0.0d0
00214 vec_ini(igs)%lx(1)=1.0d0
00215 vec_ini(igs)%ly(2)=1.0d0
00216 vec_ini(igs)%lz(3)=1.0d0
00217
00218 vec_ini(igs)%s_up(:)=0.0d0
00219 vec_ini(igs)%s_dn(:)=0.0d0
00220 vec_ini(igs)%s_up(1)=1.0d0
00221 vec_ini(igs)%s_dn(2)=1.0d0
00222 enddo
00223 endif
00224
00225 if(flg_initial_guess_direc==1)then
00226 write(6,'(a)')'DIRECTION OF INITIAL GUESS IS REPRESENTED IN LOCAL COORDINATE'
00227 do igs=1,nigs
00228
00229
00230 read(5,*)vec_ini(igs)%orb,vec_ini(igs)%a,vec_ini(igs)%x,vec_ini(igs)%y,vec_ini(igs)%z,&
00231 vec_ini(igs)%lx,vec_ini(igs)%ly,vec_ini(igs)%lz
00232 enddo
00233 do igs=1,nigs
00234 vec_ini(igs)%s_up(:)=0.0d0
00235 vec_ini(igs)%s_dn(:)=0.0d0
00236 vec_ini(igs)%s_up(1)=1.0d0
00237 vec_ini(igs)%s_dn(2)=1.0d0
00238 enddo
00239 endif
00240
00241 if(flg_initial_guess_direc==2)then
00242 write(6,'(a)')'DIRECTION OF INITIAL GUESS IS REPRESENTED IN LOCAL COORDINATE'
00243 write(6,'(a)')'ROTATION OF THE SPIN QUANTIZATION AXIS'
00244 do igs=1,nigs
00245
00246 read(5,*)vec_ini(igs)
00247 enddo
00248 endif
00249
00250
00251 allocate(B_MAT(nigs,n_occ));B_MAT(:,:)=0.0D0
00252
00253 if(flg_BMAT==0)then
00254 write(6,*)'BMAT is 0'
00255 if(nigs/=n_occ)then
00256 write(6,*)'wrong input: nigs/=n_occ'
00257 stop
00258 endif
00259 do igs=1,nigs
00260 B_MAT(igs,igs)=1.0d0
00261 enddo
00262 elseif(flg_BMAT==1)then
00263 write(6,*)'BMAT from input.in'
00264 if(reading_bmat_format==0)then
00265 write(6,*)'READING BMAT format=0: respack'
00266 do igs=1,nigs
00267
00268 read(5,*)(B_MAT(igs,ix),ix=1,n_occ)
00269 enddo
00270 endif
00271 if(reading_bmat_format==1)then
00272 write(6,*)'READING BMAT format=1: xtapp'
00273 do ix=1,n_occ
00274
00275 read(5,*)(B_MAT(igs,ix),igs=1,nigs)
00276 enddo
00277 endif
00278 endif
00279
00280 if(flg_vis_bloch==0) CALC_REAL_SPACE_BLOCH=.false.
00281 if(flg_vis_bloch==1) CALC_REAL_SPACE_BLOCH=.true.
00282
00283 if(flg_fermisurface==0) CALC_FERMISURFACE=.false.
00284 if(flg_fermisurface==1) CALC_FERMISURFACE=.true.
00285
00286 if(flg_global_dos==0) CALC_GLOBAL_DOS=.false.
00287 if(flg_global_dos==1) CALC_GLOBAL_DOS=.true.
00288
00289
00290
00291
00292
00293 write(6,param_wannier)
00294 do igs=1,nigs
00295 write(6,'(a3,x,4f8.4,9f8.4,8f8.4)') vec_ini(igs)
00296 enddo
00297 do igs=1,nigs
00298 write(6,'(100f10.5)')(B_MAT(igs,ix),ix=1,n_occ)
00299 enddo
00300 write(6,*)
00301
00302
00303
00304
00305 Ndiv=40
00306 dense(1:3) = 0
00307
00308
00309 read(5,nml=param_interpolation)
00310
00311 allocate(SK_sym_pts(3,N_sym_points))
00312 if(reading_sk_format==0)then
00313 write(6,*)'READING SK_sym_pts format=0: respack'
00314 do ik=1,N_sym_points
00315
00316 read(5,*)(SK_sym_pts(ix,ik),ix=1,3)
00317 enddo
00318 endif
00319 if(reading_sk_format==1)then
00320 write(6,*)'READING SK_sym_pts format=1: xtapp'
00321 do ix=1,3
00322
00323 read(5,*)(SK_sym_pts(ix,ik),ik=1,N_sym_points)
00324 enddo
00325 endif
00326
00327 write(6,param_interpolation)
00328 do ik=1,N_sym_points
00329 write(6,'(3f10.5)')(SK_sym_pts(ix,ik),ix=1,3)
00330 enddo
00331 write(6,*)
00332
00333
00334
00335
00336 ix_vis_min=-1
00337 ix_vis_max=1
00338 iy_vis_min=-1
00339 iy_vis_max=1
00340 iz_vis_min=-1
00341 iz_vis_max=1
00342
00343
00344 read(5,nml=param_visualization)
00345
00346 if(flg_vis_wannier==0) CALC_REAL_SPACE_WANNIER=.false.
00347 if(flg_vis_wannier==1) CALC_REAL_SPACE_WANNIER=.true.
00348
00349 if(N_write_wannier==0)then
00350 N_write_wannier=N_wannier
00351 allocate(wrt_list(N_write_wannier))
00352 do ix=1,N_write_wannier
00353 wrt_list(ix)=ix
00354 enddo
00355 elseif(N_write_wannier/=0)then
00356 allocate(wrt_list(N_write_wannier))
00357
00358 read(5,*)(wrt_list(ix),ix=1,N_write_wannier)
00359 endif
00360 xmin=ix_vis_min
00361 xmax=ix_vis_max
00362 ymin=iy_vis_min
00363 ymax=iy_vis_max
00364 zmin=iz_vis_min
00365 zmax=iz_vis_max
00366
00367 write(6,param_visualization)
00368 write(6,'(100i5)')(wrt_list(ix),ix=1,N_write_wannier)
00369 write(6,*)
00370
00371 end subroutine
00372 end module