further cleaning of eccd routines

This commit is contained in:
Lorenzo Figini 2015-06-19 09:11:33 +00:00
parent 2333f83914
commit 464af38310

View File

@ -5686,7 +5686,11 @@ c local constants
c local variables
integer :: lrm,ithn
real(wp_) :: amu,ratiovgr,rbn,rbx,zeff
integer :: npar
real(wp_) :: cst2
real(wp_), dimension(:), allocatable :: eccdpar
c common/external functions/variables
real(wp_), external :: fjch,fjncl,fjch0
integer :: nhmin,nhmax,iokhawa,ierr
real(wp_) :: xg,yg,anpl,anpr,vgm,derdnm,ak0,akinv,fhz,sox,
. anprre,anprim,alpha,effjcd,akim,tau,psinv,tekev,dens,ddens,
@ -5712,6 +5716,16 @@ c
common/btot/btot
common/bmxmn/bmax,bmin
common/fc/fc
c
interface
subroutine setcdcoeff(amu,zeff,rbn,rbx,fc,psinv,ieccd,
. cst2,eccdpar,npar)
use const_and_precisions, only : wp_
integer :: ieccd,npar
real(wp_) :: amu,Zeff,rbn,rbx,fc,psinv,cst2
real(wp_), dimension(:), allocatable :: eccdpar
end subroutine setcdcoeff
end interface
c
c absorption computation
c
@ -5746,52 +5760,56 @@ c
zeff=fzeff(psinv)
rbn=btot/bmin
rbx=btot/bmax
call eccd(yg,anpl,anprre,amu,zeff,rbn,rbx,fc,ex,ey,ez,
* dens,psinv,ieccd,nhmin,nhmax,ithn,effjcd,iokhawa,ierr)
end if
call setcdcoeff(amu,zeff,rbn,rbx,fc,psinv,ieccd,cst2,
. eccdpar,npar)
select case(ieccd)
case(1)
c cohen model
call eccdeff(yg,anpl,anprre,dens,amu,ex,ey,ez,nhmin,nhmax,
. ithn,cst2,fjch,eccdpar(1:npar),npar,effjcd,iokhawa,ierr)
case(2:9)
c no trapping
call eccdeff(yg,anpl,anprre,dens,amu,ex,ey,ez,nhmin,nhmax,
. ithn,cst2,fjch0,eccdpar(1:npar),npar,effjcd,iokhawa,ierr)
case(10:11)
c neoclassical model
call eccdeff(yg,anpl,anprre,dens,amu,ex,ey,ez,nhmin,nhmax,
. ithn,cst2,fjncl,eccdpar(1:npar),npar,effjcd,iokhawa,ierr)
CASE DEFAULT
effjcd=0.0_wp_
print*,'ieccd undefined'
ierr=89
return
end select
c
deallocate(eccdpar)
end if
c
return
end
c
c
c
subroutine eccd(yg,anpl,anprre,amu,zeff,rbn,rbx,fc,ex,ey,ez,
. dens,psinv,ieccd,nhmn,nhmx,ithn,effjcd,iokhawa,ierr)
use const_and_precisions, only : wp_,pi,qesi=>e_,mesi=>me_,
. vcsi=>c_,qe=>ecgs_,me=>mecgs_,vc=>ccgs_,mc2=>mc2_
subroutine setcdcoeff(amu,zeff,rbn,rbx,fc,psinv,ieccd,
. cst2,eccdpar,npar)
use const_and_precisions, only : wp_
use green_func_p, only: SpitzFuncCoeff
use conical, only : fconic
use magsurf_data, only : ch,tjp,tlm,njpt,nlmt
use dierckx, only : profil
implicit none
c local constants
real(wp_), parameter :: mc2m2=1.0_wp_/mc2**2,
. canucc=2.0e13_wp_*pi*qe**4/(me**2*vc**3),ceff=qesi/(mesi*vcsi)
real(wp_), parameter :: cst2min=1.0e-6_wp_
integer, parameter :: ksp=3
c arguments
integer :: ieccd,nhmn,nhmx,ithn,iokhawa,ierr
real(wp_) :: yg,anpl,anprre,amu,Zeff,rbn,rbx,
. fc,dens,psinv,effjcd
complex(wp_) :: ex,ey,ez
integer :: ieccd,npar
real(wp_) :: amu,Zeff,rbn,rbx,fc,psinv,cst2
real(wp_), dimension(:), allocatable :: eccdpar ! dimension(max(5,3+nlmt))
c local variables
integer :: nhn,njp,nlm,npar
real(wp_) :: anum,denom,resp,resj,coullog,anucc,alams,
. fp0s,pa,cst2
integer :: njp,nlm
real(wp_) :: alams,fp0s,pa
real(wp_) :: chlm(nlmt)
real(wp_), dimension(3+2*nlmt) :: eccdpar ! dimension(max(5,3+nlmt))
c common/external functions/variables
real(wp_), external :: fjch,fjncl,fjch0
c
anum=0.0_wp_
denom=0.0_wp_
effjcd=0.0_wp_
c
coullog=48.0_wp_-log(1.0e7_wp_*dens*mc2m2*amu**2)
anucc=canucc*dens*coullog
c
c nhmx=nhmn
c
eccdpar(1)=zeff
c
select case(ieccd)
c
@ -5802,114 +5820,115 @@ c rbx=B/B_max
c cst2=1.0_wp_-B/B_max
c alams=sqrt(1-B_min/B_max)
c Zeff < 31 !!!
c fp0s= P_a (alams)
c fp0s= P_a (alams)
cst2=1.0_wp_-rbx
if(cst2.lt.1.0e-6_wp_) cst2=0.0_wp_
if(cst2.lt.cst2min) cst2=0.0_wp_
alams=sqrt(1.0_wp_-rbx/rbn)
pa=sqrt(32.0_wp_/(Zeff+1.0_wp_)-1.0_wp_)/2.0_wp_
fp0s=fconic(alams,pa,0)
npar=5
allocate(eccdpar(npar))
eccdpar(1)=zeff
eccdpar(2)=rbn
eccdpar(3)=alams
eccdpar(4)=pa
eccdpar(5)=fp0s
do nhn=nhmn,nhmx
call curr_int(yg,anpl,anprre,amu,ex,ey,ez,nhn,ithn,cst2,
. fjch,eccdpar,5,resj,resp,iokhawa,ierr)
anum=anum+resj
denom=denom+resp
end do
c
case(2:9)
cst2=0.0_wp_
do nhn=nhmn,nhmx
call curr_int(yg,anpl,anprre,amu,ex,ey,ez,nhn,ithn,cst2,
. fjch0,eccdpar,1,resj,resp,iokhawa,ierr)
anum=anum+resj
denom=denom+resp
end do
npar=1
allocate(eccdpar(npar))
eccdpar(1)=zeff
c
case(10:11)
c neoclassical model:
c ft=1-fc trapped particle fraction
c rzfc=(1+Zeff)/fc
cst2=1.0_wp_-rbx
if(cst2.lt.1.0e-6_wp_) cst2=0.0_wp_
if(cst2.lt.cst2min) cst2=0.0_wp_
call SpitzFuncCoeff(amu,Zeff,fc)
eccdpar(2) = fc
eccdpar(3) = rbx
njp=njpt
nlm=nlmt
call profil(0,tjp,njp,tlm,nlm,ch,ksp,ksp,sqrt(psinv),nlm,chlm,
. ierr)
if(ierr.gt.0) print*,' Hlambda profil =',ierr
npar=3+2*nlm
allocate(eccdpar(npar))
eccdpar(1)=zeff
eccdpar(2) = fc
eccdpar(3) = rbx
eccdpar(4:3+nlm) = tlm
eccdpar(4+nlm:npar) = chlm
do nhn=nhmn,nhmx
call curr_int(yg,anpl,anprre,amu,ex,ey,ez,nhn,ithn,cst2,
. fjncl,eccdpar,npar,resj,resp,iokhawa,ierr)
anum=anum+resj
denom=denom+resp
end do
CASE DEFAULT
print*,'ieccd undefined'
c
end select
c
c effjpl = <J_parallel>/<p_d> /(B_min/<B>) [A m /W]
c
if(denom.gt.0.0_wp_) effjcd=-ceff*anum/(anucc*denom)
return
end
c
c
c
subroutine curr_int(yg,anpl,anprre,amu,ex,ey,ez,nhn,ithn,cst2,
* fcur,eccdpar,necp,resj,resp,iokhawa,ierr)
use const_and_precisions, only : wp_
subroutine eccdeff(yg,anpl,anprre,dens,amu,ex,ey,ez,nhmn,nhmx,
* ithn,cst2,fcur,eccdpar,necp,effjcd,iokhawa,ierr)
use const_and_precisions, only : wp_,pi,qesi=>e_,mesi=>me_,
. vcsi=>c_,qe=>ecgs_,me=>mecgs_,vc=>ccgs_,mc2=>mc2_
use quadpack, only : dqagsmv
implicit none
c local constants
real(wp_), parameter :: mc2m2=1.0_wp_/mc2**2,
. canucc=2.0e13_wp_*pi*qe**4/(me**2*vc**3),ceff=qesi/(mesi*vcsi)
real(wp_), parameter :: epsa=0.0_wp_,epsr=1.0e-2_wp_,xxcr=16.0_wp_
integer, parameter :: lw=5000,liw=lw/4,nfpp=15
real(wp_), parameter :: dumin=1.0e-6_wp_
integer, parameter :: lw=5000,liw=lw/4,nfpp=13
c arguments
integer :: i,nhn,ithn,necp,iokhawa,ierr
real(wp_) :: yg,anpl,anprre,amu,cst2,resj,resp
integer :: i,nhmn,nhmx,ithn,necp,iokhawa,ierr
real(wp_) :: yg,anpl,anprre,dens,amu,cst2,effjcd
real(wp_), dimension(necp) :: eccdpar
complex(wp_) :: ex,ey,ez
c local variables
integer :: neval,ier,last,npar
integer :: nhn,neval,ier,last,npar
integer, dimension(liw) :: iw
real(wp_) :: anpl2,dnl,ygn,ygn2,resj1,resj2,rdu2,upltp,upltm,
. rdu,rdut,rdu2t,duu,uu1,uu2,xx1,xx2,ej,ej1,ej2,epp,uplp,uplm,
. cst
real(wp_) :: anpl2,dnl,ygn,ygn2,resji,rdu2,upltp,upltm,uplp,uplm,
. rdu,rdu2t,duu,uu1,uu2,xx1,xx2,resj,resp,eji,epp,anum,denom,
. cstrdut,anucc
real(wp_), dimension(lw) :: w
real(wp_), dimension(nfpp+necp) :: apar
real(wp_), dimension(0:1) :: uleft,uright
c common/external functions/variables
real(wp_), external :: fcur,fpp
c
c EC power and current densities
c effjpl = <J_parallel>/<p_d> /(B_min/<B>) [A m /W]
c
apar(1) = yg
apar(2) = anpl
apar(3) = amu
apar(4) = anprre
apar(5) = dble(ex)
apar(6) = dimag(ex)
apar(7) = dble(ey)
apar(8) = dimag(ey)
apar(9) = dble(ez)
apar(10) = dimag(ez)
apar(11) = dble(ithn)
c
npar=nfpp+necp
apar(nfpp+1:npar) = eccdpar(1:necp)
c
anpl2=anpl*anpl
dnl=1.0_wp_-anpl2
ygn=nhn*yg
ygn2=ygn*ygn
resj=0.0_wp_
resj1=0.0_wp_
resj2=0.0_wp_
resp=0.0_wp_
c
rdu2=anpl2+ygn2-1.0_wp_
uplp=0.0_wp_
uplm=0.0_wp_
upltp=0.0_wp_
upltm=0.0_wp_
effjcd=0.0_wp_
anum=0.0_wp_
denom=0.0_wp_
iokhawa=0
ierr=0
do nhn=nhmn,nhmx
ygn=nhn*yg
ygn2=ygn*ygn
c
if (rdu2.ge.0.0_wp_) then
rdu2=anpl2+ygn2-1.0_wp_
c
if (rdu2.lt.0.0_wp_) cycle
rdu=sqrt(rdu2)
dnl=1.0_wp_-anpl2
uplp=(anpl*ygn+rdu)/dnl
uplm=(anpl*ygn-rdu)/dnl
c
@ -5922,92 +5941,72 @@ c
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0_wp_)/anpl
duu=abs(uu1-uu2)
c
apar(1) = yg
apar(2) = anpl
apar(3) = amu
apar(4) = anprre
apar(5) = dble(ex)
apar(6) = dimag(ex)
apar(7) = dble(ey)
apar(8) = dimag(ey)
apar(9) = dble(ez)
apar(10) = dimag(ez)
apar(11) = dble(ithn)
if(duu.le.dumin) cycle
c
apar(12) = dble(nhn)
apar(13) = uplp
apar(14) = uplm
apar(15) = ygn
apar(13) = ygn
c
npar=nfpp+necp
apar(nfpp+1:npar) = eccdpar(1:necp)
c
if(duu.gt.1.0e-6_wp_) then
call dqagsmv(fpp,uu1,uu2,apar(1:nfpp),nfpp,epsa,epsr,resp,
. epp,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) ierr=90
call dqagsmv(fpp,uu1,uu2,apar(1:nfpp),nfpp,epsa,epsr,resp,
. epp,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) then
ierr=90
return
end if
c
rdu2t=cst2*anpl2+ygn2-1.0_wp_
c
if (rdu2t.lt.0.0_wp_.or.cst2.eq.0.0_wp_) then
c
c resonance curve does not cross the trapping region
c
iokhawa=0
if(duu.gt.1.0e-4_wp_) then
call dqagsmv(fcur,uu1,uu2,apar,npar,epsa,epsr,
. resj,ej,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) ierr=91
end if
else
if (rdu2t.gt.0.0_wp_.and.cst2.gt.0.0_wp_) then
c
c resonance curve crosses the trapping region
c
iokhawa=1
rdut=sqrt(rdu2t)
cst=sqrt(cst2)
upltm=(cst2*anpl*ygn-cst*rdut)/(1.0_wp_-cst2*anpl2)
upltp=(cst2*anpl*ygn+cst*rdut)/(1.0_wp_-cst2*anpl2)
cstrdut=sqrt(cst2*rdu2t)
upltm=(cst2*anpl*ygn-cstrdut)/(1.0_wp_-cst2*anpl2)
upltp=(cst2*anpl*ygn+cstrdut)/(1.0_wp_-cst2*anpl2)
uleft(0)=uplm
uright(0)=upltm
uleft(1)=upltp
uright(1)=uplp
else
c
uu1=uplm
uu2=upltm
xx1=amu*(anpl*uu1+ygn-1.0_wp_)
xx2=amu*(anpl*uu2+ygn-1.0_wp_)
if(xx1.lt.xxcr.or.xx2.lt.xxcr) then
if(xx2.gt.xxcr) uu2=(xxcr/amu-ygn+1.0_wp_)/anpl
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0_wp_)/anpl
duu=abs(uu1-uu2)
if(duu.gt.1.0e-6_wp_) then
call dqagsmv(fcur,uu1,uu2,apar,npar,epsa,epsr,
. resj1,ej1,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) then
if (abs(resj1).lt.1.0e-10_wp_) then
resj1=0.0_wp_
else
ierr=92
end if
end if
end if
end if
c resonance curve does not cross the trapping region
c
uu1=upltp
uu2=uplp
xx1=amu*(anpl*uu1+ygn-1.0_wp_)
xx2=amu*(anpl*uu2+ygn-1.0_wp_)
if(xx1.lt.xxcr.or.xx2.lt.xxcr) then
if(xx2.gt.xxcr) uu2=(xxcr/amu-ygn+1.0_wp_)/anpl
if(xx1.gt.xxcr) uu1=(xxcr/amu-ygn+1.0_wp_)/anpl
duu=abs(uu1-uu2)
if(duu.gt.1.0e-6_wp_) then
call dqagsmv(fcur,uu1,uu2,apar,npar,epsa,epsr,
. resj2,ej2,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) then
if(ier.ne.2) ierr=93
end if
end if
end if
resj=resj1+resj2
iokhawa=0
uleft(0)=uplm
uright(0)=uplp
end if
c
resj=0.0_wp_
do i=0,1
xx1=amu*(anpl*uleft(i)+ygn-1.0_wp_)
xx2=amu*(anpl*uright(i)+ygn-1.0_wp_)
if(xx1.lt.xxcr.or.xx2.lt.xxcr) then
if(xx2.gt.xxcr) uright(i)=(xxcr/amu-ygn+1.0_wp_)/anpl
if(xx1.gt.xxcr) uleft(i)=(xxcr/amu-ygn+1.0_wp_)/anpl
duu=abs(uleft(i)-uright(i))
if(duu.gt.dumin) then
call dqagsmv(fcur,uleft(i),uright(i),apar,npar,epsa,epsr,
. resji,eji,neval,ier,liw,lw,last,iw,w)
if (ier.gt.0) then
if (abs(resji).lt.1.0e-10_wp_) then
resji=0.0_wp_
else
ierr=91+iokhawa+i
return
end if
end if
end if
end if
resj=resj+resji
if(iokhawa.eq.0) exit
end do
anum=anum+resj
denom=denom+resp
end do
c
if(denom.gt.0.0_wp_) then
anucc=canucc*dens*(48.0_wp_-log(1.0e7_wp_*dens*mc2m2*amu**2))
effjcd=-ceff*anum/(anucc*denom)
end if
return
@ -6035,9 +6034,7 @@ c extrapar(9) = Re(ez)
c extrapar(10) = Im(ez)
c extrapar(11) = double(ithn)
c extrapar(12) = double(nhn)
c extrapar(13) = uplp
c extrapar(14) = uplm
c extrapar(15) = ygn
c extrapar(13) = ygn
c
use const_and_precisions, only : wp_,ui=>im
use math, only : fact
@ -6048,7 +6045,7 @@ c arguments
real(wp_), dimension(npar) :: extrapar
c local variables
integer :: ithn,nhn,nm,np
real(wp_) :: yg,anpl,amu,anprre,uplp,uplm,ygn,upr,upr2,gam,ee,
real(wp_) :: yg,anpl,amu,anprre,ygn,upr,upr2,gam,ee,
. thn2,thn2u,bb,cth,ajbnm,ajbnp,ajbn
complex(wp_) :: ex,ey,ez,emxy,epxy
c
@ -6061,23 +6058,21 @@ c
ez=cmplx(extrapar(9),extrapar(10),wp_)
ithn=int(extrapar(11))
nhn=int(extrapar(12))
uplp=extrapar(13)
uplm=extrapar(14)
ygn=extrapar(15)
ygn=extrapar(13)
upr2=(1.0_wp_-anpl**2)*(uplp-upl)*(upl-uplm)
gam=anpl*upl+ygn
upr2=gam*gam-1.0_wp_-upl*upl
ee=exp(-amu*(gam-1))
thn2=1.0_wp_
thn2u=upr2*thn2
! thn2=1.0_wp_
thn2u=upr2 !*thn2
if(ithn.gt.0) then
emxy=ex-ui*ey
epxy=ex+ui*ey
if(upr2.gt.0.0_wp_) then
upr=sqrt(upr2)
bb=anprre*upr/yg
if(ithn.eq.1) then
if(ithn.eq.1) then
c Larmor radius expansion polarization term at lowest order
cth=1.0_wp_
if(nhn.gt.1) cth=(0.5_wp_*bb)**(nhn-1)*nhn/fact(nhn)
@ -6110,31 +6105,19 @@ c
function fjch(upl,extrapar,npar)
c integration variable upl passed explicitly. Other variables passed
c as array of extra parameters of length npar=size(extrapar).
c variables with index 1..15 must be passed to fpp
c variable with index 16 is zeff
c variables with index gt 16 are specific of the cd model
c variables with index 1..13 must be passed to fpp
c variable with index 14 is zeff
c variables with index gt 14 are specific of the cd model
c
c extrapar(1) = yg
c extrapar(2) = anpl
c extrapar(3) = amu
c extrapar(4) = Re(anprw)
c extrapar(5) = Re(ex)
c extrapar(6) = Im(ex)
c extrapar(7) = Re(ey)
c extrapar(8) = Im(ey)
c extrapar(9) = Re(ez)
c extrapar(10) = Im(ez)
c extrapar(11) = double(ithn)
c extrapar(12) = double(nhn)
c extrapar(13) = uplp
c extrapar(14) = uplm
c extrapar(15) = ygn
c extrapar(13) = ygn
c
c extrapar(16) = zeff
c extrapar(17) = rb
c extrapar(18) = alams
c extrapar(19) = pa
c extrapar(20) = fp0s
c extrapar(14) = zeff
c extrapar(15) = rb
c extrapar(16) = alams
c extrapar(17) = pa
c extrapar(18) = fp0s
c
use const_and_precisions, only : wp_
use conical, only : fconic
@ -6145,25 +6128,23 @@ c arguments
real(wp_), dimension(npar) :: extrapar
c local variables
integer :: nhn
real(wp_) :: anpl,anprre,uplp,uplm,ygn,zeff,rb,alams,pa,fp0s,
real(wp_) :: anpl,anprre,ygn,zeff,rb,alams,pa,fp0s,
. upr2,gam,u2,u,z5,xi,xib,xibi,fu2b,fu2,gu,gg,dgg,alam,fp0,
. dfp0,fh,dfhl,eta,fpp
complex(wp_) :: ex,ey,ez
c
anpl=extrapar(2)
anprre=extrapar(4)
uplp=extrapar(13)
uplm=extrapar(14)
ygn=extrapar(15)
zeff=extrapar(16)
rb=extrapar(17)
alams=extrapar(18)
pa=extrapar(19)
fp0s=extrapar(20)
ygn=extrapar(13)
zeff=extrapar(14)
rb=extrapar(15)
alams=extrapar(16)
pa=extrapar(17)
fp0s=extrapar(18)
upr2=(1.0_wp_-anpl**2)*(uplp-upl)*(upl-uplm)
gam=anpl*upl+ygn
u2=gam*gam-1.0_wp_
upr2=u2-upl*upl
u=sqrt(u2)
z5=Zeff+5.0_wp_
xi=1.0_wp_/z5**2
@ -6187,7 +6168,7 @@ c
eta=gam*fh*(gg/u+dgg)+upl*(anpl*u2-upl*gam)*gg*dfhl/(u2*u*rb*alam)
if(upl.lt.0.0_wp_) eta=-eta
fjch=eta*fpp(upl,extrapar,npar)
fjch=eta*fpp(upl,extrapar(1:13),13)
c
return
end
@ -6201,23 +6182,10 @@ c variables with index 1..15 must be passed to fpp
c variable with index 16 is zeff
c variables with index gt 16 are specific of the cd model
c
c extrapar(1) = yg
c extrapar(2) = anpl
c extrapar(3) = amu
c extrapar(4) = Re(anprw)
c extrapar(5) = Re(ex)
c extrapar(6) = Im(ex)
c extrapar(7) = Re(ey)
c extrapar(8) = Im(ey)
c extrapar(9) = Re(ez)
c extrapar(10) = Im(ez)
c extrapar(11) = double(ithn)
c extrapar(12) = double(nhn)
c extrapar(13) = uplp
c extrapar(14) = uplm
c extrapar(15) = ygn
c extrapar(13) = ygn
c
c extrapar(16) = zeff
c extrapar(14) = zeff
c
use const_and_precisions, only : wp_
implicit none
@ -6232,8 +6200,8 @@ c local variables
complex(wp_) :: ex,ey,ez
c
anpl=extrapar(2)
ygn=extrapar(15)
zeff=extrapar(16)
ygn=extrapar(13)
zeff=extrapar(14)
gam=anpl*upl+ygn
u2=gam*gam-1.0_wp_
@ -6248,7 +6216,7 @@ c
gg=u*gu/z5
dgg=(gu+u2*(2.0_wp_/fu2b**(1.0_wp_+xibi)/sqrt(fu2)-xi*gu/fu2))/z5
eta=anpl*gg+gam*upl*dgg/u
fjch0=eta*fpp(upl,extrapar,npar)
fjch0=eta*fpp(upl,extrapar(1:13),13)
c
return
end
@ -6258,31 +6226,19 @@ c
function fjncl(upl,extrapar,npar)
c integration variable upl passed explicitly. Other variables passed
c as array of extra parameters of length npar=size(extrapar).
c variables with index 1..15 must be passed to fpp
c variable with index 16 is zeff
c variables with index gt 16 are specific of the cd model
c variables with index 1..13 must be passed to fpp
c variable with index 14 is zeff
c variables with index gt 14 are specific of the cd model
c
c extrapar(1) = yg
c extrapar(2) = anpl
c extrapar(3) = amu
c extrapar(4) = Re(anprw)
c extrapar(5) = Re(ex)
c extrapar(6) = Im(ex)
c extrapar(7) = Re(ey)
c extrapar(8) = Im(ey)
c extrapar(9) = Re(ez)
c extrapar(10) = Im(ez)
c extrapar(11) = double(ithn)
c extrapar(12) = double(nhn)
c extrapar(13) = uplp
c extrapar(14) = uplm
c extrapar(15) = ygn
c extrapar(13) = ygn
c
c extrapar(16) = zeff
c extrapar(17) = fc
c extrapar(18) = rbx
c extrapar(19:18+(npar-18)/2) = tlm
c extrapar(19+(npar-18)/2:npar) = chlm
c extrapar(14) = zeff
c extrapar(15) = fc
c extrapar(16) = rbx
c extrapar(17:16+(npar-16)/2) = tlm
c extrapar(17+(npar-16)/2:npar) = chlm
c
use const_and_precisions, only : wp_
use green_func_p, only: GenSpitzFunc
@ -6300,15 +6256,15 @@ c local variables
. bth,uth,fk,dfk,alam,fu,dfu,eta,fpp
c local variables
integer :: ier
real(wp_), dimension((npar-18)/2) :: wrk
real(wp_), dimension((npar-16)/2) :: wrk
real(wp_), dimension(1) :: xs,ys
c
anpl=extrapar(2)
amu=extrapar(3)
ygn=extrapar(15)
zeff=extrapar(16)
fc=extrapar(17)
rbx=extrapar(18)
ygn=extrapar(13)
zeff=extrapar(14)
fc=extrapar(15)
rbx=extrapar(16)
gam=anpl*upl+ygn
u2=gam*gam-1.0_wp_
@ -6321,52 +6277,26 @@ c
dfk=dfk*(2.0_wp_/amu)*bth
alam=upr2/u2/rbx
nlm=(npar-18)/2
xs(1)=alam
nlm=(npar-16)/2
c
call splev(extrapar(19:18+nlm),nlm,extrapar(19+nlm:npar),3,
c extrapar(17:16+(npar-16)/2) = tlm
c extrapar(17+(npar-16)/2:npar) = chlm
c
call splev(extrapar(17:16+nlm),nlm,extrapar(17+nlm:npar),3,
. xs(1),ys(1),1,ier)
fu=ys(1)
call splder(extrapar(19:18+nlm),nlm,extrapar(19+nlm:npar),3,1,
call splder(extrapar(17:16+nlm),nlm,extrapar(17+nlm:npar),3,1,
. xs(1),ys(1),1,wrk,ier)
dfu=ys(1)
eta=gam*fu*dfk/u-2.0_wp_*(anpl-gam*upl/u2)*fk*dfu*upl/u2/rbx
if(upl.lt.0) eta=-eta
fjncl=eta*fpp(upl,extrapar,npar)
fjncl=eta*fpp(upl,extrapar(1:13),13)
return
end
c
c
c
C subroutine vlambda(alam,tlm,chlm,nlmt,fv,dfv)
C use const_and_precisions, only : wp_
C use dierckx, only : splev,splder
C implicit none
Cc local constants
C integer, parameter :: ksp=3
Cc arguments
C integer :: nlmt
C real(wp_) :: alam,fv,dfv
C real(wp_), dimension(nlmt) :: tlm,chlm
Cc local variables
C integer :: nlm,ier
C real(wp_), dimension(nlmt) :: wrk
C real(wp_), dimension(1) :: xxs,ffs
Cc
C nlm=nlmt
C xxs(1)=alam
Cc
C call splev(tlm,nlm,chlm,ksp,xxs(1),ffs(1),1,ier)
C fv=ffs(1)
Cc
C call splder(tlm,nlm,chlm,ksp,1,xxs(1),ffs(1),1,wrk,ier)
C dfv=ffs(1)
Cc
C return
C end
c
c
c
subroutine projxyzt(iproj,nfile)
use const_and_precisions, only : wp_