[go: up one dir, main page]

File: chipth.f

package info (click to toggle)
ifeffit 2%3A1.2.11d-9.1
  • links: PTS
  • area: contrib
  • in suites: jessie, jessie-kfreebsd
  • size: 12,444 kB
  • ctags: 6,492
  • sloc: fortran: 35,441; ansic: 8,454; makefile: 4,815; python: 3,274; perl: 3,146; sh: 2,721; ada: 1,003; tcl: 95
file content (185 lines) | stat: -rw-r--r-- 8,244 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
       subroutine chipth(ampfef, phafef, qfeff, xlamb, realp, nfxpts,
     $      reffin,  nkpar, akpts, aamp,apha, mchiq,chiqr,chiqi)
c
c//////////////////////////////////////////////////////////////////////
c Copyright (c) 1997--2000 Matthew Newville, The University of Chicago
c Copyright (c) 1992--1996 Matthew Newville, University of Washington
c
c Permission to use and redistribute the source code or binary forms of
c this software and its documentation, with or without modification is
c hereby granted provided that the above notice of copyright, these
c terms of use, and the disclaimer of warranty below appear in the
c source code and documentation, and that none of the names of The
c University of Chicago, The University of Washington, or the authors
c appear in advertising or endorsement of works derived from this
c software without specific prior written permission from all parties.
c
c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
c EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
c IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
c CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
c TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
c SOFTWARE OR THE USE OR OTHER DEALINGS IN THIS SOFTWARE.
c//////////////////////////////////////////////////////////////////////
c
c  evaluate the theoretical chi(k) for a scattering path given 
c  information from feff arrays  (ampfef .. degen) and xafs path 
c  parameters  (s02 .. apha) 
c
c input:
c    ampfef   amplitude from feff for the path
c    phafef   phase shift from feff (w/o 2*k*r term) for the path
c    qfeff    k-values from feff for the other feff arrays
c    xlamb    mean-free-path from feff
c    realp    real part of p (momentum) from feff
c    nfxpts   number of data points in the feff arrays
c    reff     half path length for the path
c    nkpar    # of k-points for k, phase, and array path parameters
c    akpts    array of k-points for array path parameters
c    aamp     array of amplitude-points for array path parameters
c    apha     array of phase-points for array path parameters
c    mchiq    array dimension for chiqr and chiqi
c output:
c    chiqr    real  \   part of complex chi(k) for this path
c    chiqi    imag  /   with all path parameters applied
c **note measured chi(k) data corresponds to  chiqi **
c
c in param() (from pthpar.h):
c    degen    path degeneracy (# of equivalent paths)
c    s02      constant multiplicitive amplitude factor for the path
c    e0shft   e0 shift to use for the path
c    e0imag   imaginary e0 shift / broadening for the path
c    delpha   constant phase shift (delta phase )
c    deltar   delta r to add to reff for the path
c    sigma2   debye-waller factor for the path
c    third    third cumulant for the path
c    fourth   fourth cumulant for the path
c
c------------------------------------------------------------------
       implicit none
       include 'consts.h'
       include 'pthpar.h'
       integer     izero, ipos, i, nfxpts, nqdata, mchiq, nqffmx
       integer     nkpar, nkpos
       complex*16        coni, cp, cp2, cphshf, cdwf, cargu, cchi, ciei
       double precision  akpts(*), aamp(*), apha(*), tmpa, tmpp
       double precision  pparams(10)
       double precision  chiqr(mchiq), chiqi(mchiq)
       double precision  e0eff, s02r2n, degen, reffin, reff
       double precision  s02, e0shft, e0imag, delpha, deltar, sigma2
       double precision  first, fourth, r2m2,  energy, q, third
       double precision  small,  half, expmax, expmin
       double precision  rep, xlam, cxlam, pha, amp, car, x3rd, x4th
       double precision  ampfef(nfxpts), phafef(nfxpts), qpos
       double precision  qfeff(nfxpts), xlamb(nfxpts),  realp(nfxpts)
       logical  le0big, iskpar
       parameter (coni = (0.d0, 1.d0) )
       parameter (small=1.d-6, half =0.5d0)
       parameter (expmax= 85.d0, expmin = -expmax)
c------------------------------------------------------------------
       degen  = param(jfpdeg)
       s02    = param(jfps02)
       e0shft = param(jfpe0)
       e0imag = param(jfpei)
       delpha = param(jfppha)
       deltar = param(jfpdr)
       sigma2 = param(jfpss2)
       third  = param(jfp3rd)
       fourth = param(jfp4th)

c  combine path parameters and feff data to get theory chi
c  note: feff writes out the feffnnnn.dat files such that
c    phase = 2*q*r + phase_shifts. additional phase shifts and
c    all amplitude reduction terms use p, the complex momentum.
c    q is used only to reproduce chi(k) from feff
       nqffmx = int((qfeff(nfxpts) + 1.d0) / qgrid) + 1
       nqdata = min(nqffmx, mchiq)
c       print*, 'chipth: nqffmx, nqdata, nqvals, mchiq'
c       print*,  nqffmx, mchiq, nqdata

c tranquada correction
       reff   = max(small, reffin)
       first  = deltar - 2 * sigma2 / reff
       r2m2   =  1 / (reff + deltar)**2
       le0big = (abs(e0shft).ge.small)
       iskpar = nkpar.gt.0
cc       print*, ' CHIPTH ', nkpar, iskpar
c ipos is a place holder for the routine lintrp
c izero stores the index of the q = 0. location.
       ipos   = 1
       nkpos  = 1
       izero  = 0
c store some multiplications/divisions before the main loopa
       e0eff  = e0shft * etok
       ciei   = coni * e0imag * etok
       s02r2n = degen * s02 * r2m2
       x4th   = fourth / 3
       x3rd   = 2 * (third / 3)

c the official xafs calculation loop:
       do 500 i = 1, nqdata
c  e0-shift the value of q
          q   = (i - 1) * qgrid
          if (le0big) then
             energy = q*q - e0eff
             q      = sign(one,energy) * sqrt(abs(energy))
          end if
c  q = zero is special, and will be dealt with below
          if (abs(q).le.small) then
             izero = i
          else
c  cubic spline interpolatation of 
c  amplitude, phase, realp and xlamb of feff chi
             call hunt(qfeff,nfxpts,q,ipos)
             qpos = 0
             if (abs(qfeff(ipos+1) - qfeff(ipos)).gt.small) then
                qpos = (q-qfeff(ipos))/(qfeff(ipos+1)-qfeff(ipos))
             endif
             pha = phafef(ipos) + qpos*(phafef(ipos+1) -phafef(ipos))
             amp = ampfef(ipos) + qpos*(ampfef(ipos+1) -ampfef(ipos))
             rep = realp(ipos)  + qpos*( realp(ipos+1) - realp(ipos))
             xlam= xlamb(ipos)  + qpos*( xlamb(ipos+1) - xlamb(ipos))
c  k-dependent path parameters
             if (iskpar) then
                call hunt(akpts,nkpar,q,nkpos)
                nkpos = min(nkpar-1,max(1,nkpos))
                qpos = 0
                if (abs(akpts(nkpos+1) - akpts(nkpos)).gt.small) then
                   qpos = (q - akpts(nkpos))/
     $                  (akpts(nkpos+1)-akpts(nkpos))
                endif
                tmpa = aamp(nkpos) + qpos*(aamp(nkpos+1) -aamp(nkpos))
                tmpp = apha(nkpos) + qpos*(apha(nkpos+1) -apha(nkpos))
                amp  = amp * tmpa
                pha  = pha + tmpp
             endif
c  evaluate complex momemtum
             cp2    =  (rep + coni/xlam)**2 + ciei
             cp     =  sqrt(cp2)
c  mean free path, complex debye-waller factor and phase shift
             cxlam  =  -2*reff* dimag(cp)
             cdwf   =  -2*cp2 * (sigma2 -  cp2 * x4th)
             cphshf =   2*cp  * (first  -  cp2 * x3rd) + delpha
c  create complex chi, first checking that the exponential won't crash
             cargu  =  cxlam + cdwf + coni*(2*q*reff + pha + cphshf)
             car    =  max(expmin, min(expmax, dble(cargu)))
             cchi   =  (amp * s02r2n / abs(q)) *
     $                     exp(dcmplx(car, dimag(cargu)))
c  save real and imag chi for this value of q
             chiqi(i) = dimag(cchi)
             chiqr(i) = -dble(cchi)
          end if
 500   continue
c  fill in guess for data at q = zero if needed
       if (izero.eq.1)  then
          chiqr(1) = 2*chiqr(2) - chiqr(3)
          chiqi(1) = 2*chiqi(2) - chiqi(3)
       elseif (izero.ge.2) then
          chiqr(izero) = (chiqr(izero-1) + chiqr(izero+1)) * half
          chiqi(izero) = (chiqi(izero-1) + chiqi(izero+1)) * half
       end if
       return
c end subroutine chipth
       end