14 integer,
parameter ::
dp = kind(1.0d0)
25 integer,
intent(in) :: imax
26 integer,
intent(in),
optional :: verbose
27 integer,
intent(in) :: pp(:)
28 real(
dp),
intent(in) :: vv(:)
29 real(
dp),
intent(in) :: mineval, maxeval
30 real(
dp),
intent(inout) :: ehomo, elumo, egap
33 real(
dp) :: precomp, x_a, x_b, y_a, y_b, hgamma
41 do while (vv(i) .le. 0.0)
45 hgamma = 6.0_dp - 4.0_dp * sqrt(2.0_dp)
46 hgamma = hgamma * (1.0_dp - hgamma)
48 if(
present(verbose))
then
49 if(verbose.ge.1)
write(*,*)
"In prg_homolumogap ..."
52 do while (vv(i) .lt. hgamma)
54 precomp = sqrt(1.0_dp - 4.0_dp * vv(i))
56 y_a = 0.5_dp * (1.0_dp + precomp)
57 y_b = 0.5_dp * (1.0_dp - precomp)
62 if (pp(j) .gt. 0)
then
66 y_a = 1.0_dp - sqrt(1.0_dp - y_a)
67 y_b = 1.0_dp - sqrt(1.0_dp - y_b)
74 if(
present(verbose))
then
75 if(verbose.ge.2)
write(*,*)
"x_a = ",x_a,
"x_b = ",x_b
80 write(*,*)
"prg_homolumogap error: i < 1, i = ", i
84 ehomo = maxeval - x_a * (maxeval - mineval)
85 elumo = maxeval - x_b * (maxeval - mineval)
97 subroutine prg_sp2sequence(pp, imax, mineval, maxeval, ehomo, elumo, errlimit, verbose)
99 integer,
intent(inout) :: imax
100 integer,
intent(inout) :: pp(:)
101 real(
dp),
intent(in) :: mineval, maxeval, ehomo, elumo
102 real(
dp),
intent(in) :: errlimit
103 integer,
intent(in),
optional :: verbose
106 real(
dp) :: eh, el, error, sgm
108 eh = (maxeval - ehomo) / (maxeval - mineval)
109 el = (maxeval - elumo) / (maxeval - mineval)
114 if(
present(verbose))
then
115 if(verbose.ge.1)
write(*,*)
"In prg_sp2sequence ..."
118 do while (error .gt. errlimit)
121 if(
present(verbose))
then
122 if(verbose.ge.2)
write(*,*)
"error = ",error
125 if ((abs(1.0_dp - eh * eh) + abs(el * el)) .lt. &
126 (abs(1.0_dp - (2.0_dp * eh - eh * eh) + &
127 abs(2.0_dp * el - el * el))))
then
133 sgm = 1.0_dp - 2.0_dp * pp(it)
134 eh = eh + sgm * (eh - eh * eh)
135 el = el + sgm * (el - el * el)
136 error = abs(1.0_dp - eh) + abs(el)
138 if (it .ge. 100)
then
140 write(*,*)
"prg_sp2sequence error: SP2 not converging"
subroutine, public prg_homolumogap(vv, imax, pp, mineval, maxeval, ehomo, elumo, egap, verbose)
subroutine, public prg_sp2sequence(pp, imax, mineval, maxeval, ehomo, elumo, errlimit, verbose)